@geraldmaron/construct 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/.env.example +69 -0
  2. package/LICENSE +21 -0
  3. package/README.md +344 -0
  4. package/agents/prompts/cx-accessibility.md +29 -0
  5. package/agents/prompts/cx-ai-engineer.md +31 -0
  6. package/agents/prompts/cx-architect.md +40 -0
  7. package/agents/prompts/cx-business-strategist.md +25 -0
  8. package/agents/prompts/cx-data-analyst.md +30 -0
  9. package/agents/prompts/cx-data-engineer.md +32 -0
  10. package/agents/prompts/cx-debugger.md +27 -0
  11. package/agents/prompts/cx-designer.md +33 -0
  12. package/agents/prompts/cx-devil-advocate.md +36 -0
  13. package/agents/prompts/cx-docs-keeper.md +50 -0
  14. package/agents/prompts/cx-engineer.md +36 -0
  15. package/agents/prompts/cx-evaluator.md +26 -0
  16. package/agents/prompts/cx-explorer.md +38 -0
  17. package/agents/prompts/cx-legal-compliance.md +25 -0
  18. package/agents/prompts/cx-operations.md +28 -0
  19. package/agents/prompts/cx-orchestrator.md +30 -0
  20. package/agents/prompts/cx-platform-engineer.md +25 -0
  21. package/agents/prompts/cx-product-manager.md +30 -0
  22. package/agents/prompts/cx-qa.md +42 -0
  23. package/agents/prompts/cx-rd-lead.md +25 -0
  24. package/agents/prompts/cx-release-manager.md +31 -0
  25. package/agents/prompts/cx-researcher.md +31 -0
  26. package/agents/prompts/cx-reviewer.md +36 -0
  27. package/agents/prompts/cx-security.md +37 -0
  28. package/agents/prompts/cx-sre.md +26 -0
  29. package/agents/prompts/cx-test-automation.md +35 -0
  30. package/agents/prompts/cx-trace-reviewer.md +76 -0
  31. package/agents/prompts/cx-ux-researcher.md +30 -0
  32. package/agents/registry.json +879 -0
  33. package/agents/teams.json +94 -0
  34. package/bin/construct +613 -0
  35. package/commands/build/feature.md +21 -0
  36. package/commands/build/fix.md +20 -0
  37. package/commands/design/access.md +19 -0
  38. package/commands/design/flow.md +16 -0
  39. package/commands/design/ui.md +18 -0
  40. package/commands/measure/experiment.md +18 -0
  41. package/commands/measure/metrics.md +18 -0
  42. package/commands/measure/results.md +18 -0
  43. package/commands/plan/api.md +19 -0
  44. package/commands/plan/challenge.md +18 -0
  45. package/commands/plan/decide.md +20 -0
  46. package/commands/plan/feature.md +49 -0
  47. package/commands/plan/requirements.md +24 -0
  48. package/commands/remember/context.md +26 -0
  49. package/commands/remember/handoff.md +19 -0
  50. package/commands/remember/runbook.md +20 -0
  51. package/commands/review/code.md +21 -0
  52. package/commands/review/quality.md +19 -0
  53. package/commands/review/security.md +16 -0
  54. package/commands/ship/ready.md +19 -0
  55. package/commands/ship/release.md +19 -0
  56. package/commands/ship/status.md +18 -0
  57. package/commands/understand/docs.md +22 -0
  58. package/commands/understand/research.md +22 -0
  59. package/commands/understand/this.md +23 -0
  60. package/commands/understand/why.md +18 -0
  61. package/commands/work/clean.md +32 -0
  62. package/commands/work/drive.md +69 -0
  63. package/commands/work/optimize-prompts.md +46 -0
  64. package/commands/work/parallel-review.md +40 -0
  65. package/db/migrations/001_init.sql +38 -0
  66. package/langfuse/docker-compose.yml +82 -0
  67. package/lib/audit-skills.mjs +118 -0
  68. package/lib/auto-docs.mjs +293 -0
  69. package/lib/cli-commands.mjs +409 -0
  70. package/lib/codex-config.mjs +114 -0
  71. package/lib/comment-lint.mjs +191 -0
  72. package/lib/completions.mjs +170 -0
  73. package/lib/context-state.mjs +99 -0
  74. package/lib/cost.mjs +213 -0
  75. package/lib/distill.mjs +403 -0
  76. package/lib/efficiency.mjs +139 -0
  77. package/lib/env-config.mjs +53 -0
  78. package/lib/eval-harness.mjs +59 -0
  79. package/lib/features.mjs +209 -0
  80. package/lib/headhunt.mjs +597 -0
  81. package/lib/hooks/adaptive-lint.mjs +112 -0
  82. package/lib/hooks/agent-tracker.mjs +50 -0
  83. package/lib/hooks/bootstrap-guard.mjs +90 -0
  84. package/lib/hooks/comment-lint.mjs +26 -0
  85. package/lib/hooks/config-protection.mjs +52 -0
  86. package/lib/hooks/console-warn.mjs +43 -0
  87. package/lib/hooks/context-window-recovery.mjs +90 -0
  88. package/lib/hooks/continuation-enforcer.mjs +72 -0
  89. package/lib/hooks/dep-audit.mjs +155 -0
  90. package/lib/hooks/drive-guard.mjs +89 -0
  91. package/lib/hooks/edit-accumulator.mjs +36 -0
  92. package/lib/hooks/edit-error-recovery.mjs +46 -0
  93. package/lib/hooks/edit-guard.mjs +109 -0
  94. package/lib/hooks/env-check.mjs +80 -0
  95. package/lib/hooks/guard-bash.mjs +83 -0
  96. package/lib/hooks/mcp-audit.mjs +57 -0
  97. package/lib/hooks/mcp-health-check.mjs +51 -0
  98. package/lib/hooks/mcp-task-scope.mjs +47 -0
  99. package/lib/hooks/model-fallback.mjs +105 -0
  100. package/lib/hooks/pre-compact.mjs +212 -0
  101. package/lib/hooks/pre-push-gate.mjs +129 -0
  102. package/lib/hooks/read-tracker.mjs +129 -0
  103. package/lib/hooks/registry-sync.mjs +23 -0
  104. package/lib/hooks/scan-secrets.mjs +76 -0
  105. package/lib/hooks/session-start.mjs +95 -0
  106. package/lib/hooks/stop-notify.mjs +191 -0
  107. package/lib/hooks/stop-typecheck.mjs +83 -0
  108. package/lib/hooks/task-completed-guard.mjs +43 -0
  109. package/lib/hooks/teammate-idle-guard.mjs +54 -0
  110. package/lib/hooks/workflow-guard.mjs +62 -0
  111. package/lib/host-capabilities.mjs +123 -0
  112. package/lib/init-docs.mjs +382 -0
  113. package/lib/mcp/server.mjs +1123 -0
  114. package/lib/mcp-catalog.json +243 -0
  115. package/lib/mcp-manager.mjs +433 -0
  116. package/lib/mcp-platform-config.mjs +104 -0
  117. package/lib/model-router.mjs +810 -0
  118. package/lib/opencode-config.mjs +44 -0
  119. package/lib/opencode-runtime-plugin.mjs +909 -0
  120. package/lib/opencode-telemetry.mjs +433 -0
  121. package/lib/orchestration-policy.mjs +258 -0
  122. package/lib/prompt-composer.mjs +196 -0
  123. package/lib/prompt-metadata.mjs +68 -0
  124. package/lib/review.mjs +429 -0
  125. package/lib/role-preload.mjs +52 -0
  126. package/lib/schemas/decision.json +50 -0
  127. package/lib/schemas/implementation.json +51 -0
  128. package/lib/schemas/review-report.json +32 -0
  129. package/lib/schemas/test-report.json +43 -0
  130. package/lib/server/index.mjs +334 -0
  131. package/lib/server/static/app.js +841 -0
  132. package/lib/server/static/index.html +820 -0
  133. package/lib/service-manager.mjs +225 -0
  134. package/lib/setup.mjs +319 -0
  135. package/lib/status.mjs +707 -0
  136. package/lib/storage/backend.mjs +44 -0
  137. package/lib/storage/embeddings.mjs +70 -0
  138. package/lib/storage/hybrid-query.mjs +184 -0
  139. package/lib/storage/sql-store.mjs +55 -0
  140. package/lib/storage/state-source.mjs +101 -0
  141. package/lib/storage/sync.mjs +164 -0
  142. package/lib/storage/vector-store.mjs +59 -0
  143. package/lib/telemetry/backends/langfuse.mjs +58 -0
  144. package/lib/telemetry/backends/noop.mjs +16 -0
  145. package/lib/telemetry/langfuse-ingest.mjs +108 -0
  146. package/lib/telemetry/langfuse-model-sync.mjs +270 -0
  147. package/lib/telemetry/team-rollup.mjs +143 -0
  148. package/lib/toolkit-env.mjs +30 -0
  149. package/lib/validator.mjs +181 -0
  150. package/lib/workflow-state.mjs +794 -0
  151. package/package.json +53 -0
  152. package/personas/construct.md +94 -0
  153. package/platforms/claude/CLAUDE.md +30 -0
  154. package/platforms/claude/settings.template.json +472 -0
  155. package/platforms/opencode/config.template.json +65 -0
  156. package/platforms/opencode/plugins/construct-fallback.js +5 -0
  157. package/platforms/opencode/sync-config.mjs +69 -0
  158. package/rules/common/agents.md +55 -0
  159. package/rules/common/code-review.md +129 -0
  160. package/rules/common/coding-style.md +95 -0
  161. package/rules/common/comments.md +139 -0
  162. package/rules/common/cx-agent-routing.md +61 -0
  163. package/rules/common/cx-skill-routing.md +11 -0
  164. package/rules/common/development-workflow.md +49 -0
  165. package/rules/common/git-workflow.md +29 -0
  166. package/rules/common/hooks.md +35 -0
  167. package/rules/common/patterns.md +36 -0
  168. package/rules/common/performance.md +71 -0
  169. package/rules/common/security.md +34 -0
  170. package/rules/common/testing.md +62 -0
  171. package/rules/golang/coding-style.md +37 -0
  172. package/rules/golang/hooks.md +22 -0
  173. package/rules/golang/patterns.md +50 -0
  174. package/rules/golang/security.md +39 -0
  175. package/rules/golang/testing.md +36 -0
  176. package/rules/python/coding-style.md +47 -0
  177. package/rules/python/hooks.md +24 -0
  178. package/rules/python/patterns.md +44 -0
  179. package/rules/python/security.md +35 -0
  180. package/rules/python/testing.md +43 -0
  181. package/rules/swift/coding-style.md +52 -0
  182. package/rules/swift/hooks.md +25 -0
  183. package/rules/swift/patterns.md +71 -0
  184. package/rules/swift/security.md +38 -0
  185. package/rules/swift/testing.md +50 -0
  186. package/rules/typescript/coding-style.md +204 -0
  187. package/rules/typescript/hooks.md +27 -0
  188. package/rules/typescript/patterns.md +57 -0
  189. package/rules/typescript/security.md +33 -0
  190. package/rules/typescript/testing.md +23 -0
  191. package/rules/web/coding-style.md +101 -0
  192. package/rules/web/design-quality.md +68 -0
  193. package/rules/web/hooks.md +125 -0
  194. package/rules/web/patterns.md +84 -0
  195. package/rules/web/performance.md +69 -0
  196. package/rules/web/security.md +62 -0
  197. package/rules/web/testing.md +60 -0
  198. package/rules/zh/README.md +113 -0
  199. package/rules/zh/agents.md +55 -0
  200. package/rules/zh/code-review.md +129 -0
  201. package/rules/zh/coding-style.md +53 -0
  202. package/rules/zh/development-workflow.md +49 -0
  203. package/rules/zh/git-workflow.md +29 -0
  204. package/rules/zh/hooks.md +35 -0
  205. package/rules/zh/patterns.md +36 -0
  206. package/rules/zh/performance.md +60 -0
  207. package/rules/zh/security.md +34 -0
  208. package/rules/zh/testing.md +34 -0
  209. package/skills/ai/agent-dev.md +102 -0
  210. package/skills/ai/llm-security.md +105 -0
  211. package/skills/ai/ml-ops.md +169 -0
  212. package/skills/ai/orchestration-workflow.md +87 -0
  213. package/skills/ai/prompt-and-eval.md +114 -0
  214. package/skills/ai/prompt-optimizer.md +114 -0
  215. package/skills/ai/rag-system.md +104 -0
  216. package/skills/architecture/api-design.md +100 -0
  217. package/skills/architecture/caching.md +101 -0
  218. package/skills/architecture/cloud-native.md +97 -0
  219. package/skills/architecture/message-queue.md +100 -0
  220. package/skills/architecture/security-arch.md +105 -0
  221. package/skills/development/cpp.md +127 -0
  222. package/skills/development/go.md +129 -0
  223. package/skills/development/java.md +134 -0
  224. package/skills/development/kotlin.md +140 -0
  225. package/skills/development/mobile-crossplatform.md +144 -0
  226. package/skills/development/python.md +109 -0
  227. package/skills/development/rust.md +127 -0
  228. package/skills/development/shell.md +127 -0
  229. package/skills/development/swift.md +129 -0
  230. package/skills/development/typescript.md +129 -0
  231. package/skills/devops/ci-cd.md +108 -0
  232. package/skills/devops/containerization.md +106 -0
  233. package/skills/devops/cost-optimization.md +105 -0
  234. package/skills/devops/data-engineering.md +181 -0
  235. package/skills/devops/database.md +95 -0
  236. package/skills/devops/dependency-management.md +91 -0
  237. package/skills/devops/devsecops.md +96 -0
  238. package/skills/devops/git-workflow.md +100 -0
  239. package/skills/devops/incident-response.md +167 -0
  240. package/skills/devops/monorepo.md +87 -0
  241. package/skills/devops/observability.md +103 -0
  242. package/skills/devops/performance.md +104 -0
  243. package/skills/devops/testing.md +104 -0
  244. package/skills/docs/adr-workflow.md +32 -0
  245. package/skills/docs/backlog-proposal-workflow.md +19 -0
  246. package/skills/docs/customer-profile-workflow.md +22 -0
  247. package/skills/docs/evidence-ingest-workflow.md +23 -0
  248. package/skills/docs/init-docs.md +160 -0
  249. package/skills/docs/init-project.md +50 -0
  250. package/skills/docs/prd-workflow.md +57 -0
  251. package/skills/docs/prfaq-workflow.md +25 -0
  252. package/skills/docs/product-intelligence-review.md +22 -0
  253. package/skills/docs/product-intelligence-workflow.md +62 -0
  254. package/skills/docs/product-signal-workflow.md +27 -0
  255. package/skills/docs/research-workflow.md +28 -0
  256. package/skills/docs/runbook-workflow.md +24 -0
  257. package/skills/exploration/repo-map.md +297 -0
  258. package/skills/frameworks/django.md +159 -0
  259. package/skills/frameworks/nextjs.md +148 -0
  260. package/skills/frameworks/react.md +132 -0
  261. package/skills/frameworks/spring-boot.md +165 -0
  262. package/skills/frontend-design/accessibility.md +153 -0
  263. package/skills/frontend-design/component-patterns.md +111 -0
  264. package/skills/frontend-design/engineering.md +122 -0
  265. package/skills/frontend-design/state-management.md +118 -0
  266. package/skills/frontend-design/ui-aesthetics.md +102 -0
  267. package/skills/frontend-design/ux-principles.md +126 -0
  268. package/skills/quality-gates/review-work.md +90 -0
  269. package/skills/quality-gates/verify-change.md +94 -0
  270. package/skills/quality-gates/verify-module.md +96 -0
  271. package/skills/quality-gates/verify-quality.md +93 -0
  272. package/skills/quality-gates/verify-security.md +95 -0
  273. package/skills/roles/architect.ai-systems.md +37 -0
  274. package/skills/roles/architect.data.md +37 -0
  275. package/skills/roles/architect.enterprise.md +37 -0
  276. package/skills/roles/architect.integration.md +37 -0
  277. package/skills/roles/architect.md +68 -0
  278. package/skills/roles/architect.platform.md +37 -0
  279. package/skills/roles/data-analyst.experiment.md +37 -0
  280. package/skills/roles/data-analyst.md +68 -0
  281. package/skills/roles/data-analyst.product-intelligence.md +37 -0
  282. package/skills/roles/data-analyst.product.md +37 -0
  283. package/skills/roles/data-analyst.telemetry.md +37 -0
  284. package/skills/roles/data-engineer.pipeline.md +37 -0
  285. package/skills/roles/data-engineer.vector-retrieval.md +37 -0
  286. package/skills/roles/data-engineer.warehouse.md +37 -0
  287. package/skills/roles/debugger.md +68 -0
  288. package/skills/roles/designer.accessibility.md +43 -0
  289. package/skills/roles/designer.md +68 -0
  290. package/skills/roles/engineer.ai.md +49 -0
  291. package/skills/roles/engineer.data.md +49 -0
  292. package/skills/roles/engineer.md +85 -0
  293. package/skills/roles/engineer.platform.md +49 -0
  294. package/skills/roles/operator.docs.md +43 -0
  295. package/skills/roles/operator.md +68 -0
  296. package/skills/roles/operator.release.md +43 -0
  297. package/skills/roles/operator.sre.md +43 -0
  298. package/skills/roles/orchestrator.md +66 -0
  299. package/skills/roles/product-manager.ai-product.md +37 -0
  300. package/skills/roles/product-manager.business-strategy.md +43 -0
  301. package/skills/roles/product-manager.enterprise.md +37 -0
  302. package/skills/roles/product-manager.growth.md +37 -0
  303. package/skills/roles/product-manager.md +67 -0
  304. package/skills/roles/product-manager.platform.md +37 -0
  305. package/skills/roles/product-manager.product.md +37 -0
  306. package/skills/roles/qa.ai-eval.md +37 -0
  307. package/skills/roles/qa.api-contract.md +37 -0
  308. package/skills/roles/qa.data-pipeline.md +37 -0
  309. package/skills/roles/qa.md +68 -0
  310. package/skills/roles/qa.test-automation.md +49 -0
  311. package/skills/roles/qa.web-ui.md +37 -0
  312. package/skills/roles/researcher.explorer.md +43 -0
  313. package/skills/roles/researcher.md +68 -0
  314. package/skills/roles/researcher.ux.md +43 -0
  315. package/skills/roles/reviewer.devil-advocate.md +43 -0
  316. package/skills/roles/reviewer.evaluator.md +43 -0
  317. package/skills/roles/reviewer.md +68 -0
  318. package/skills/roles/reviewer.trace.md +43 -0
  319. package/skills/roles/security.ai.md +37 -0
  320. package/skills/roles/security.appsec.md +37 -0
  321. package/skills/roles/security.cloud.md +37 -0
  322. package/skills/roles/security.legal-compliance.md +49 -0
  323. package/skills/roles/security.md +68 -0
  324. package/skills/roles/security.privacy.md +37 -0
  325. package/skills/roles/security.supply-chain.md +37 -0
  326. package/skills/routing.md +139 -0
  327. package/skills/security/blue-team.md +83 -0
  328. package/skills/security/code-audit.md +94 -0
  329. package/skills/security/pentest.md +84 -0
  330. package/skills/security/red-team.md +81 -0
  331. package/skills/security/threat-intel.md +89 -0
  332. package/skills/security/vuln-research.md +87 -0
  333. package/skills/utility/clean-code.md +165 -0
  334. package/sync-agents.mjs +899 -0
  335. package/templates/docs/adr.md +27 -0
  336. package/templates/docs/backlog-proposal.md +26 -0
  337. package/templates/docs/customer-profile.md +34 -0
  338. package/templates/docs/evidence-brief.md +37 -0
  339. package/templates/docs/incident-report.md +46 -0
  340. package/templates/docs/memo.md +27 -0
  341. package/templates/docs/meta-prd.md +56 -0
  342. package/templates/docs/one-pager.md +24 -0
  343. package/templates/docs/prd-business.md +61 -0
  344. package/templates/docs/prd-platform.md +62 -0
  345. package/templates/docs/prd.md +47 -0
  346. package/templates/docs/prfaq.md +31 -0
  347. package/templates/docs/product-intelligence-report.md +31 -0
  348. package/templates/docs/research-brief.md +29 -0
  349. package/templates/docs/rfc-platform.md +60 -0
  350. package/templates/docs/rfc.md +46 -0
  351. package/templates/docs/runbook.md +33 -0
  352. package/templates/docs/signal-brief.md +25 -0
@@ -0,0 +1,820 @@
1
+ <!--
2
+ lib/server/static/index.html — Construct dashboard single-page app.
3
+
4
+ Served statically by lib/server/index.mjs at http://127.0.0.1:4242. Loads app.js
5
+ for data fetching and rendering. Inline styles only — no build step required.
6
+ -->
7
+ <!DOCTYPE html>
8
+ <html lang="en">
9
+ <head>
10
+ <meta charset="UTF-8">
11
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
12
+ <title>Construct Dashboard</title>
13
+ <style>
14
+ :root {
15
+ --bg: #0a0c10;
16
+ --surface: #111318;
17
+ --surface-2: #181c24;
18
+ --surface-3: #1e2330;
19
+ --border: #252c3a;
20
+ --border-hover: #3a4460;
21
+ --text: #c8d0e0;
22
+ --text-muted: #5a6480;
23
+ --text-dim: #8896b0;
24
+ --accent: #00e5a0;
25
+ --accent-dim: #00b87a;
26
+ --accent-glow: rgba(0, 229, 160, 0.12);
27
+ --warn: #f5a623;
28
+ --danger: #e05252;
29
+ --info: #5b9cf6;
30
+ --healthy: #00e5a0;
31
+ --degraded: #f5a623;
32
+ --unavailable: #e05252;
33
+ --disabled: #3a4460;
34
+ --font: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
35
+ --font-ui: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
36
+ --radius: 8px;
37
+ --radius-sm: 4px;
38
+ }
39
+
40
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
41
+
42
+ body {
43
+ background: var(--bg);
44
+ color: var(--text);
45
+ font-family: var(--font-ui);
46
+ font-size: 14px;
47
+ line-height: 1.5;
48
+ min-height: 100vh;
49
+ display: grid;
50
+ grid-template-rows: 56px 1fr;
51
+ grid-template-columns: 200px 1fr;
52
+ grid-template-areas:
53
+ "topbar topbar"
54
+ "nav main";
55
+ }
56
+
57
+ /* ── Topbar ─────────────────────────────────────────────── */
58
+ #topbar {
59
+ grid-area: topbar;
60
+ background: var(--surface);
61
+ border-bottom: 1px solid var(--border);
62
+ display: flex;
63
+ align-items: center;
64
+ padding: 0 20px;
65
+ gap: 16px;
66
+ position: sticky;
67
+ top: 0;
68
+ z-index: 10;
69
+ }
70
+
71
+ #topbar .brand {
72
+ font-family: var(--font);
73
+ font-size: 16px;
74
+ font-weight: 700;
75
+ color: var(--accent);
76
+ letter-spacing: 0.04em;
77
+ }
78
+
79
+ #topbar .sep { color: var(--border); }
80
+
81
+ #topbar .meta {
82
+ font-size: 12px;
83
+ color: var(--text-muted);
84
+ font-family: var(--font);
85
+ }
86
+
87
+ #topbar .status-summary {
88
+ font-size: 12px;
89
+ color: var(--text-dim);
90
+ min-width: 220px;
91
+ text-align: right;
92
+ }
93
+
94
+ #topbar .health-dot {
95
+ width: 8px;
96
+ height: 8px;
97
+ border-radius: 50%;
98
+ background: var(--text-muted);
99
+ transition: background 0.3s;
100
+ flex-shrink: 0;
101
+ }
102
+ #topbar .health-dot.healthy { background: var(--healthy); box-shadow: 0 0 6px var(--accent); }
103
+ #topbar .health-dot.degraded { background: var(--degraded); }
104
+ #topbar .health-dot.bad { background: var(--danger); }
105
+
106
+ #topbar .spacer { flex: 1; }
107
+
108
+ /* ── Nav ────────────────────────────────────────────────── */
109
+ #nav {
110
+ grid-area: nav;
111
+ background: var(--surface);
112
+ border-right: 1px solid var(--border);
113
+ padding: 16px 0;
114
+ position: sticky;
115
+ top: 56px;
116
+ height: calc(100vh - 56px);
117
+ overflow-y: auto;
118
+ }
119
+
120
+ #nav a {
121
+ display: flex;
122
+ align-items: center;
123
+ gap: 8px;
124
+ padding: 9px 20px;
125
+ color: var(--text-dim);
126
+ text-decoration: none;
127
+ font-size: 13px;
128
+ font-weight: 500;
129
+ border-left: 2px solid transparent;
130
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
131
+ }
132
+
133
+ #nav a:hover {
134
+ color: var(--text);
135
+ background: var(--accent-glow);
136
+ }
137
+
138
+ #nav a.active {
139
+ color: var(--accent);
140
+ border-left-color: var(--accent);
141
+ background: var(--accent-glow);
142
+ }
143
+
144
+ #nav .nav-icon { font-size: 16px; width: 20px; text-align: center; }
145
+
146
+ /* ── Main ───────────────────────────────────────────────── */
147
+ #main {
148
+ grid-area: main;
149
+ padding: 28px 32px;
150
+ overflow-y: auto;
151
+ min-width: 0;
152
+ }
153
+
154
+ .section { display: none; }
155
+ .section.active { display: block; }
156
+
157
+ .section-title {
158
+ font-size: 11px;
159
+ font-weight: 700;
160
+ letter-spacing: 0.1em;
161
+ text-transform: uppercase;
162
+ color: var(--text-muted);
163
+ margin-bottom: 20px;
164
+ }
165
+
166
+ /* ── Cards ──────────────────────────────────────────────── */
167
+ .cards {
168
+ display: grid;
169
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
170
+ gap: 16px;
171
+ margin-bottom: 32px;
172
+ }
173
+
174
+ .card {
175
+ background: var(--surface);
176
+ border: 1px solid var(--border);
177
+ border-radius: var(--radius);
178
+ padding: 18px 20px;
179
+ transition: border-color 0.2s;
180
+ }
181
+
182
+ .card:hover { border-color: var(--border-hover); }
183
+
184
+ .card-header {
185
+ display: flex;
186
+ align-items: flex-start;
187
+ justify-content: space-between;
188
+ gap: 12px;
189
+ margin-bottom: 8px;
190
+ }
191
+
192
+ .card-name {
193
+ font-size: 14px;
194
+ font-weight: 600;
195
+ color: var(--text);
196
+ }
197
+
198
+ .card-desc {
199
+ font-size: 12px;
200
+ color: var(--text-dim);
201
+ line-height: 1.6;
202
+ margin-bottom: 10px;
203
+ }
204
+
205
+ .card-footer {
206
+ font-size: 11px;
207
+ color: var(--text-muted);
208
+ font-family: var(--font);
209
+ margin-top: 8px;
210
+ padding-top: 8px;
211
+ border-top: 1px solid var(--border);
212
+ }
213
+
214
+ /* ── Badges ─────────────────────────────────────────────── */
215
+ .badge {
216
+ font-size: 10px;
217
+ font-weight: 700;
218
+ letter-spacing: 0.06em;
219
+ text-transform: uppercase;
220
+ padding: 2px 7px;
221
+ border-radius: var(--radius-sm);
222
+ white-space: nowrap;
223
+ flex-shrink: 0;
224
+ }
225
+
226
+ .badge-healthy { background: rgba(0,229,160,0.15); color: var(--healthy); }
227
+ .badge-configured { background: rgba(91,156,246,0.15); color: var(--info); }
228
+ .badge-degraded { background: rgba(245,166,35,0.15); color: var(--degraded); }
229
+ .badge-unavailable { background: rgba(224,82,82,0.15); color: var(--unavailable); }
230
+ .badge-disabled { background: rgba(58,68,96,0.4); color: var(--disabled); }
231
+ .badge-standard { background: rgba(91,156,246,0.15); color: var(--info); }
232
+ .badge-reasoning { background: rgba(91,156,246,0.25); color: #a0c0ff; }
233
+ .badge-fast { background: rgba(0,229,160,0.1); color: var(--accent-dim); }
234
+
235
+ /* ── Agents section ─────────────────────────────────────── */
236
+ .agent-group { margin-bottom: 32px; }
237
+
238
+ .agent-group-title {
239
+ font-size: 11px;
240
+ font-weight: 700;
241
+ letter-spacing: 0.1em;
242
+ text-transform: uppercase;
243
+ color: var(--text-muted);
244
+ margin-bottom: 14px;
245
+ }
246
+
247
+ .persona-cards {
248
+ display: grid;
249
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
250
+ gap: 14px;
251
+ }
252
+
253
+ .persona-card {
254
+ background: var(--surface-2);
255
+ border: 1px solid var(--border);
256
+ border-radius: var(--radius);
257
+ padding: 18px 20px;
258
+ transition: border-color 0.2s, background 0.2s;
259
+ }
260
+
261
+ .persona-card:hover {
262
+ border-color: var(--accent-dim);
263
+ background: var(--surface-3);
264
+ }
265
+
266
+ .persona-name {
267
+ font-family: var(--font);
268
+ font-size: 15px;
269
+ font-weight: 700;
270
+ color: var(--accent);
271
+ margin-bottom: 3px;
272
+ }
273
+
274
+ .persona-role {
275
+ font-size: 11px;
276
+ color: var(--text-muted);
277
+ text-transform: uppercase;
278
+ letter-spacing: 0.08em;
279
+ margin-bottom: 10px;
280
+ }
281
+
282
+ .persona-desc {
283
+ font-size: 12px;
284
+ color: var(--text-dim);
285
+ line-height: 1.6;
286
+ }
287
+
288
+ /* Specialist list */
289
+ .specialist-list {
290
+ display: flex;
291
+ flex-direction: column;
292
+ gap: 4px;
293
+ }
294
+
295
+ .specialist-row {
296
+ display: flex;
297
+ align-items: baseline;
298
+ gap: 12px;
299
+ padding: 8px 14px;
300
+ border-radius: var(--radius-sm);
301
+ background: var(--surface);
302
+ border: 1px solid var(--border);
303
+ transition: border-color 0.15s;
304
+ }
305
+
306
+ .specialist-row:hover { border-color: var(--border-hover); }
307
+
308
+ .specialist-name {
309
+ font-family: var(--font);
310
+ font-size: 12px;
311
+ color: var(--text);
312
+ min-width: 200px;
313
+ flex-shrink: 0;
314
+ }
315
+
316
+ .specialist-desc {
317
+ font-size: 12px;
318
+ color: var(--text-dim);
319
+ flex: 1;
320
+ min-width: 0;
321
+ overflow: hidden;
322
+ text-overflow: ellipsis;
323
+ white-space: nowrap;
324
+ }
325
+
326
+ /* ── Skills section ─────────────────────────────────────── */
327
+ .skill-category {
328
+ margin-bottom: 18px;
329
+ border: 1px solid var(--border);
330
+ border-radius: var(--radius);
331
+ overflow: hidden;
332
+ }
333
+
334
+ .skill-category-header {
335
+ display: flex;
336
+ align-items: center;
337
+ justify-content: space-between;
338
+ padding: 10px 16px;
339
+ background: var(--surface);
340
+ cursor: pointer;
341
+ user-select: none;
342
+ transition: background 0.15s;
343
+ }
344
+
345
+ .skill-category-header:hover { background: var(--surface-2); }
346
+
347
+ .skill-category-name {
348
+ font-size: 13px;
349
+ font-weight: 600;
350
+ color: var(--text);
351
+ text-transform: capitalize;
352
+ }
353
+
354
+ .skill-category-count {
355
+ font-size: 11px;
356
+ color: var(--text-muted);
357
+ font-family: var(--font);
358
+ }
359
+
360
+ .skill-toggle {
361
+ color: var(--text-muted);
362
+ font-size: 12px;
363
+ transition: transform 0.2s;
364
+ }
365
+
366
+ .skill-category.open .skill-toggle { transform: rotate(180deg); }
367
+
368
+ .skill-files {
369
+ display: none;
370
+ padding: 10px 16px;
371
+ background: var(--bg);
372
+ display: none;
373
+ flex-wrap: wrap;
374
+ gap: 6px;
375
+ }
376
+
377
+ .skill-category.open .skill-files { display: flex; }
378
+
379
+ .skill-tag {
380
+ font-size: 11px;
381
+ padding: 3px 9px;
382
+ border-radius: 20px;
383
+ background: var(--surface-2);
384
+ border: 1px solid var(--border);
385
+ color: var(--text-dim);
386
+ }
387
+
388
+ /* ── Hooks section ──────────────────────────────────────── */
389
+ .hook-phase { margin-bottom: 28px; }
390
+
391
+ .hook-phase-title {
392
+ font-size: 11px;
393
+ font-weight: 700;
394
+ letter-spacing: 0.1em;
395
+ text-transform: uppercase;
396
+ color: var(--text-muted);
397
+ margin-bottom: 10px;
398
+ }
399
+
400
+ .hook-row {
401
+ display: flex;
402
+ align-items: flex-start;
403
+ gap: 12px;
404
+ padding: 10px 14px;
405
+ border-radius: var(--radius-sm);
406
+ background: var(--surface);
407
+ border: 1px solid var(--border);
408
+ margin-bottom: 6px;
409
+ }
410
+
411
+ .hook-bullet {
412
+ width: 6px;
413
+ height: 6px;
414
+ border-radius: 50%;
415
+ background: var(--border-hover);
416
+ margin-top: 6px;
417
+ flex-shrink: 0;
418
+ }
419
+
420
+ .hook-bullet.blocking { background: var(--warn); }
421
+
422
+ .hook-desc {
423
+ font-size: 12px;
424
+ color: var(--text-dim);
425
+ flex: 1;
426
+ }
427
+
428
+ .hook-phase-badge {
429
+ font-size: 10px;
430
+ font-family: var(--font);
431
+ color: var(--text-muted);
432
+ white-space: nowrap;
433
+ }
434
+
435
+ /* ── Loading / empty states ─────────────────────────────── */
436
+ .loading {
437
+ color: var(--text-muted);
438
+ font-size: 13px;
439
+ padding: 40px 0;
440
+ text-align: center;
441
+ }
442
+
443
+ .empty {
444
+ color: var(--text-muted);
445
+ font-size: 12px;
446
+ padding: 16px;
447
+ text-align: center;
448
+ }
449
+
450
+ /* ── Tabs ───────────────────────────────────────────────── */
451
+ .tabs {
452
+ display: flex;
453
+ gap: 4px;
454
+ margin-bottom: 20px;
455
+ border-bottom: 1px solid var(--border);
456
+ padding-bottom: 0;
457
+ }
458
+
459
+ .tab-btn {
460
+ font-size: 12px;
461
+ font-weight: 600;
462
+ color: var(--text-muted);
463
+ background: none;
464
+ border: none;
465
+ border-bottom: 2px solid transparent;
466
+ padding: 8px 14px;
467
+ cursor: pointer;
468
+ margin-bottom: -1px;
469
+ transition: color 0.15s, border-color 0.15s;
470
+ font-family: var(--font-ui);
471
+ }
472
+
473
+ .tab-btn:hover { color: var(--text); }
474
+ .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); }
475
+
476
+ .tab-panel { display: none; }
477
+ .tab-panel.active { display: block; }
478
+
479
+ /* ── CLI Commands ───────────────────────────────────────── */
480
+ .cli-cmd-group { margin-bottom: 28px; }
481
+
482
+ .cli-cmd-group-title {
483
+ font-size: 10px;
484
+ font-weight: 700;
485
+ letter-spacing: 0.1em;
486
+ text-transform: uppercase;
487
+ color: var(--text-muted);
488
+ padding: 0 4px 8px;
489
+ border-bottom: 1px solid var(--border);
490
+ margin-bottom: 8px;
491
+ }
492
+
493
+ .cli-commands-list {
494
+ display: flex;
495
+ flex-direction: column;
496
+ gap: 4px;
497
+ }
498
+
499
+ .cli-cmd-row {
500
+ display: grid;
501
+ grid-template-columns: 36px 160px 1fr;
502
+ align-items: baseline;
503
+ gap: 12px;
504
+ padding: 10px 14px;
505
+ border-radius: var(--radius-sm);
506
+ background: var(--surface);
507
+ border: 1px solid var(--border);
508
+ transition: border-color 0.15s, background 0.15s;
509
+ }
510
+
511
+ .cli-cmd-row:hover { border-color: var(--border-hover); background: var(--surface-2); }
512
+
513
+ .cli-cmd-emoji { font-size: 15px; text-align: center; }
514
+
515
+ .cli-cmd-name {
516
+ font-family: var(--font);
517
+ font-size: 12px;
518
+ font-weight: 700;
519
+ color: var(--accent);
520
+ }
521
+
522
+ .cli-cmd-desc {
523
+ font-size: 12px;
524
+ color: var(--text-dim);
525
+ }
526
+
527
+ /* ── Commands section ───────────────────────────────────────── */
528
+ .commands-grid {
529
+ display: grid;
530
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
531
+ gap: 16px;
532
+ margin-bottom: 32px;
533
+ }
534
+
535
+ .command-domain {
536
+ background: var(--surface);
537
+ border: 1px solid var(--border);
538
+ border-radius: var(--radius);
539
+ overflow: hidden;
540
+ }
541
+
542
+ .command-domain-header {
543
+ padding: 10px 16px;
544
+ background: var(--surface-2);
545
+ border-bottom: 1px solid var(--border);
546
+ font-size: 11px;
547
+ font-weight: 700;
548
+ letter-spacing: 0.1em;
549
+ text-transform: uppercase;
550
+ color: var(--accent-dim);
551
+ font-family: var(--font);
552
+ }
553
+
554
+ .command-list { padding: 6px 0; }
555
+
556
+ .command-item {
557
+ display: flex;
558
+ flex-direction: column;
559
+ padding: 8px 16px;
560
+ gap: 2px;
561
+ transition: background 0.15s;
562
+ }
563
+
564
+ .command-item:hover { background: var(--accent-glow); }
565
+
566
+ .command-slash {
567
+ font-family: var(--font);
568
+ font-size: 12px;
569
+ color: var(--text);
570
+ font-weight: 600;
571
+ }
572
+
573
+ .command-desc {
574
+ font-size: 11px;
575
+ color: var(--text-muted);
576
+ line-height: 1.4;
577
+ }
578
+
579
+ /* ── Edit forms ─────────────────────────────────────────── */
580
+ .edit-row {
581
+ background: var(--surface-2);
582
+ border: 1px solid var(--border);
583
+ border-radius: var(--radius);
584
+ padding: 16px 18px;
585
+ margin-bottom: 8px;
586
+ }
587
+ .edit-row.expanded { border-color: var(--accent-dim); }
588
+ .edit-row-header {
589
+ display: flex;
590
+ align-items: center;
591
+ gap: 12px;
592
+ cursor: pointer;
593
+ user-select: none;
594
+ }
595
+ .edit-row-header:hover .edit-row-name { color: var(--accent); }
596
+ .edit-row-name {
597
+ font-family: var(--font);
598
+ font-size: 13px;
599
+ font-weight: 700;
600
+ color: var(--text);
601
+ flex: 1;
602
+ }
603
+ .edit-row-desc {
604
+ font-size: 12px;
605
+ color: var(--text-dim);
606
+ flex: 2;
607
+ overflow: hidden;
608
+ text-overflow: ellipsis;
609
+ white-space: nowrap;
610
+ }
611
+ .edit-form {
612
+ display: none;
613
+ flex-direction: column;
614
+ gap: 10px;
615
+ margin-top: 14px;
616
+ padding-top: 14px;
617
+ border-top: 1px solid var(--border);
618
+ }
619
+ .edit-row.expanded .edit-form { display: flex; }
620
+ .field-row { display: flex; flex-direction: column; gap: 4px; }
621
+ .field-label {
622
+ font-size: 10px;
623
+ font-weight: 700;
624
+ letter-spacing: 0.08em;
625
+ text-transform: uppercase;
626
+ color: var(--text-muted);
627
+ }
628
+ .field-input {
629
+ background: var(--bg);
630
+ border: 1px solid var(--border);
631
+ border-radius: var(--radius-sm);
632
+ color: var(--text);
633
+ font-family: var(--font);
634
+ font-size: 12px;
635
+ padding: 7px 10px;
636
+ width: 100%;
637
+ outline: none;
638
+ transition: border-color 0.15s;
639
+ }
640
+ .field-input:focus { border-color: var(--accent-dim); }
641
+ .form-actions { display: flex; gap: 8px; margin-top: 4px; }
642
+ .btn {
643
+ font-size: 11px;
644
+ font-weight: 700;
645
+ letter-spacing: 0.04em;
646
+ padding: 6px 14px;
647
+ border-radius: var(--radius-sm);
648
+ border: 1px solid transparent;
649
+ cursor: pointer;
650
+ font-family: var(--font-ui);
651
+ transition: opacity 0.15s;
652
+ }
653
+ .btn:hover { opacity: 0.85; }
654
+ .btn:disabled { opacity: 0.4; cursor: default; }
655
+ .btn-primary { background: var(--accent); color: var(--bg); border-color: var(--accent); }
656
+ .btn-danger { background: transparent; color: var(--danger); border-color: var(--danger); }
657
+ .btn-ghost { background: transparent; color: var(--text-dim); border-color: var(--border); }
658
+ .add-server-row { margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--border); }
659
+ .status-msg { font-size: 11px; font-family: var(--font); padding: 4px 0; }
660
+ .status-msg.ok { color: var(--accent); }
661
+ .status-msg.err { color: var(--danger); }
662
+ .model-tier-card {
663
+ background: var(--surface);
664
+ border: 1px solid var(--border);
665
+ border-radius: var(--radius);
666
+ padding: 20px 22px;
667
+ margin-bottom: 16px;
668
+ }
669
+ .model-tier-title {
670
+ font-size: 11px;
671
+ font-weight: 700;
672
+ letter-spacing: 0.1em;
673
+ text-transform: uppercase;
674
+ color: var(--text-muted);
675
+ margin-bottom: 14px;
676
+ display: flex;
677
+ align-items: center;
678
+ gap: 10px;
679
+ }
680
+
681
+ /* ── Dispatch pipeline timeline ────────────────────────── */
682
+ .dispatch-pipeline {
683
+ display: flex;
684
+ align-items: center;
685
+ gap: 0;
686
+ flex-wrap: wrap;
687
+ gap: 4px;
688
+ }
689
+
690
+ .pipeline-phase {
691
+ font-family: var(--font);
692
+ font-size: 11px;
693
+ padding: 3px 10px;
694
+ border-radius: 20px;
695
+ border: 1px solid var(--border);
696
+ white-space: nowrap;
697
+ }
698
+
699
+ .pipeline-phase--todo { color: var(--text-muted); background: transparent; }
700
+ .pipeline-phase--active { color: var(--accent); background: var(--accent-glow); border-color: var(--accent-dim); }
701
+ .pipeline-phase--done { color: var(--accent-dim); background: rgba(0,229,160,0.07); }
702
+ .pipeline-phase--blocked { color: var(--danger); background: rgba(224,82,82,0.1); border-color: var(--danger); }
703
+
704
+ .pipeline-connector {
705
+ color: var(--border-hover);
706
+ font-size: 11px;
707
+ padding: 0 2px;
708
+ }
709
+
710
+ /* ── Scrollbars ─────────────────────────────────────────── */
711
+ ::-webkit-scrollbar { width: 6px; }
712
+ ::-webkit-scrollbar-track { background: transparent; }
713
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
714
+ ::-webkit-scrollbar-thumb:hover { background: var(--border-hover); }
715
+ </style>
716
+ </head>
717
+ <body>
718
+
719
+ <header id="topbar">
720
+ <span class="brand">construct</span>
721
+ <span class="sep">/</span>
722
+ <span class="meta" id="version">v—</span>
723
+ <span class="sep">/</span>
724
+ <span class="meta" id="lastsync">synced —</span>
725
+ <span class="spacer"></span>
726
+ <span class="status-summary" id="system-status">status —</span>
727
+ <span class="health-dot" id="healthdot" title="Overall system health"></span>
728
+ </header>
729
+
730
+ <nav id="nav">
731
+ <a href="#" data-section="agents">
732
+ <span class="nav-icon">◈</span> Agents
733
+ </a>
734
+ <a href="#" data-section="commands">
735
+ <span class="nav-icon">⌘</span> Commands
736
+ </a>
737
+ <a href="#" data-section="hooks">
738
+ <span class="nav-icon">◎</span> Hooks
739
+ </a>
740
+ <a href="#" data-section="mcp">
741
+ <span class="nav-icon">⚙</span> MCP
742
+ </a>
743
+ <a href="#" data-section="models">
744
+ <span class="nav-icon">⊞</span> Models
745
+ </a>
746
+ <a href="#" class="active" data-section="resources">
747
+ <span class="nav-icon">⬡</span> Resources
748
+ </a>
749
+ <a href="#" data-section="skills">
750
+ <span class="nav-icon">◇</span> Skills
751
+ </a>
752
+ <a href="#" data-section="workflow">
753
+ <span class="nav-icon">▣</span> Workflow
754
+ </a>
755
+ </nav>
756
+
757
+ <main id="main">
758
+ <section id="section-resources" class="section active">
759
+ <div class="section-title">Resources</div>
760
+ <div class="cards" id="resources-cards">
761
+ <div class="loading">Loading...</div>
762
+ </div>
763
+ </section>
764
+
765
+ <section id="section-agents" class="section">
766
+ <div class="section-title">Agents</div>
767
+ <div id="agents-content">
768
+ <div class="loading">Loading...</div>
769
+ </div>
770
+ </section>
771
+
772
+ <section id="section-workflow" class="section">
773
+ <div class="section-title">Workflow</div>
774
+ <div id="workflow-content">
775
+ <div class="loading">Loading...</div>
776
+ </div>
777
+ </section>
778
+
779
+ <section id="section-skills" class="section">
780
+ <div class="section-title">Skills</div>
781
+ <div id="skills-content">
782
+ <div class="loading">Loading...</div>
783
+ </div>
784
+ </section>
785
+
786
+ <section id="section-commands" class="section">
787
+ <div class="section-title">Commands</div>
788
+ <div class="tabs" id="commands-tabs">
789
+ <button class="tab-btn active" data-tab="cli">CLI</button>
790
+ <button class="tab-btn" data-tab="slash">Slash</button>
791
+ </div>
792
+ <div id="commands-tab-cli" class="tab-panel active">
793
+ <div id="cli-commands-content"><div class="loading">Loading...</div></div>
794
+ </div>
795
+ <div id="commands-tab-slash" class="tab-panel">
796
+ <div id="commands-content"><div class="loading">Loading...</div></div>
797
+ </div>
798
+ </section>
799
+
800
+ <section id="section-hooks" class="section">
801
+ <div class="section-title">Hooks</div>
802
+ <div id="hooks-content">
803
+ <div class="loading">Loading...</div>
804
+ </div>
805
+ </section>
806
+
807
+ <section id="section-mcp" class="section">
808
+ <div class="section-title">MCP Servers</div>
809
+ <div id="mcp-content"><div class="loading">Loading...</div></div>
810
+ </section>
811
+
812
+ <section id="section-models" class="section">
813
+ <div class="section-title">Model Tiers</div>
814
+ <div id="models-content"><div class="loading">Loading...</div></div>
815
+ </section>
816
+ </main>
817
+
818
+ <script src="app.js"></script>
819
+ </body>
820
+ </html>