feat(den): add teams and skill hub management (#1289)

* feat(den): add teams and skill hub management

* feat(den-web): add UnderlineTabs component and apply to members + skill hubs screens

* feat(den-web): add DashboardPageTemplate and apply to all 6 dashboard pages

* feat(den-web): add DenButton component and apply across all dashboard pages

* feat(den-web): add DenInput component and apply across all dashboard inputs

* feat(den-web): UI polish pass — shared component system and skill hub redesign

- Add UnderlineTabs, DashboardPageTemplate, DenButton, DenInput, DenTextarea shared components
- Apply DashboardPageTemplate with PaperMeshGradient headers to all 6 dashboard pages
- Apply DenButton (primary/secondary/destructive + loading/disabled) across all dashboard pages
- Apply DenInput and DenTextarea replacing all raw inputs and textareas
- Redesign skill hub list cards: PaperMeshGradient seeded by hub ID, clean layout
- Redesign skill list cards: PaperMeshGradient seeded by skill ID, matching hub card design
- Rewrite skill hub detail page: lighter type scale, moved last-updated inline, clean sidebar
- Rewrite skill detail page: gradient header, visibility pill inline with title, removed sidebar
- Rewrite skill editor: remove category field (not persisted), clean form layout
- Clean up all 4 member tables: tighter rows, items-center alignment, lighter type
- Fix ActionButton icon stacking bug (Tailwind Preflight svg display:block via icon prop)
- Move member tab toolbar buttons inline with description text per tab
- Add destructive button variant; fix button disabled/loading states
- Clean up manage-members, billing, templates, background-agents screen designs

---------

Co-authored-by: src-opn <src-opn@users.noreply.github.com>
Co-authored-by: OmarMcAdam <gh@mcadam.io>
This commit is contained in:
Source Open
2026-04-02 10:28:47 -07:00
committed by GitHub
parent c4737e0236
commit ec33bae663
36 changed files with 3790 additions and 737 deletions

View File

@@ -10,7 +10,7 @@ const rootDir = path.resolve(__dirname, "..")
const composeFile = path.join(rootDir, "packaging", "docker", "docker-compose.web-local.yml")
const composeProject = "openwork-den-local"
const controllerPort = process.env.DEN_CONTROLLER_PORT?.trim() || "8788"
const apiPort = process.env.DEN_API_PORT?.trim() || process.env.DEN_CONTROLLER_PORT?.trim() || "8788"
const workerProxyPort = process.env.DEN_WORKER_PROXY_PORT?.trim() || "8789"
const webPort = process.env.DEN_WEB_PORT?.trim() || "3005"
const databaseUrl = process.env.DATABASE_URL?.trim() || "mysql://root:password@127.0.0.1:3306/openwork_den"
@@ -143,7 +143,7 @@ for (const signal of ["SIGINT", "SIGTERM"]) {
}
async function main() {
for (const [name, port] of [["den-web", webPort], ["den-controller", controllerPort], ["den-worker-proxy", workerProxyPort]]) {
for (const [name, port] of [["den-web", webPort], ["den-api", apiPort], ["den-worker-proxy", workerProxyPort]]) {
const available = await canListenOnPort(Number(port))
if (!available) {
throw new Error(`${name} local port ${port} is already in use. Stop the existing process or rerun with a different port env override.`)
@@ -184,9 +184,9 @@ async function main() {
"run",
"dev:local",
"--output-logs=full",
"--filter=@openwork-ee/den-controller",
"--filter=@openwork-ee/den-worker-proxy",
"--filter=@openwork-ee/den-web",
"--filter=@openwork-ee/den-api",
"--filter=@openwork-ee/den-worker-proxy",
"--filter=@openwork-ee/den-web",
],
{
cwd: rootDir,
@@ -200,12 +200,13 @@ async function main() {
BETTER_AUTH_URL: process.env.BETTER_AUTH_URL?.trim() || `http://localhost:${webPort}`,
DEN_BETTER_AUTH_TRUSTED_ORIGINS: process.env.DEN_BETTER_AUTH_TRUSTED_ORIGINS?.trim() || webOrigins,
CORS_ORIGINS: process.env.CORS_ORIGINS?.trim() || webOrigins,
DEN_CONTROLLER_PORT: controllerPort,
DEN_API_PORT: apiPort,
DEN_CONTROLLER_PORT: apiPort,
DEN_WORKER_PROXY_PORT: workerProxyPort,
DEN_WEB_PORT: webPort,
DEN_API_BASE: process.env.DEN_API_BASE?.trim() || `http://127.0.0.1:${controllerPort}`,
DEN_API_BASE: process.env.DEN_API_BASE?.trim() || `http://127.0.0.1:${apiPort}`,
DEN_AUTH_ORIGIN: process.env.DEN_AUTH_ORIGIN?.trim() || `http://localhost:${webPort}`,
DEN_AUTH_FALLBACK_BASE: process.env.DEN_AUTH_FALLBACK_BASE?.trim() || `http://127.0.0.1:${controllerPort}`,
DEN_AUTH_FALLBACK_BASE: process.env.DEN_AUTH_FALLBACK_BASE?.trim() || `http://127.0.0.1:${apiPort}`,
PROVISIONER_MODE: process.env.PROVISIONER_MODE?.trim() || "stub",
},
},