@geraldmaron/construct 1.0.0 โ†’ 1.0.1

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 (471) hide show
  1. package/.env.example +10 -7
  2. package/LICENSE +201 -21
  3. package/README.md +132 -257
  4. package/agents/contracts.json +387 -0
  5. package/agents/prompts/cx-accessibility.md +8 -0
  6. package/agents/prompts/cx-ai-engineer.md +92 -0
  7. package/agents/prompts/cx-architect.md +10 -2
  8. package/agents/prompts/cx-business-strategist.md +13 -0
  9. package/agents/prompts/cx-data-analyst.md +80 -0
  10. package/agents/prompts/cx-data-engineer.md +4 -0
  11. package/agents/prompts/cx-debugger.md +8 -0
  12. package/agents/prompts/cx-designer.md +19 -0
  13. package/agents/prompts/cx-devil-advocate.md +4 -0
  14. package/agents/prompts/cx-docs-keeper.md +128 -0
  15. package/agents/prompts/cx-engineer.md +13 -0
  16. package/agents/prompts/cx-evaluator.md +4 -0
  17. package/agents/prompts/cx-explorer.md +12 -0
  18. package/agents/prompts/cx-legal-compliance.md +13 -0
  19. package/agents/prompts/cx-operations.md +13 -0
  20. package/agents/prompts/cx-orchestrator.md +107 -4
  21. package/agents/prompts/cx-platform-engineer.md +75 -0
  22. package/agents/prompts/cx-product-manager.md +8 -0
  23. package/agents/prompts/cx-qa.md +100 -0
  24. package/agents/prompts/cx-rd-lead.md +13 -0
  25. package/agents/prompts/cx-release-manager.md +8 -0
  26. package/agents/prompts/cx-researcher.md +21 -1
  27. package/agents/prompts/cx-reviewer.md +8 -0
  28. package/agents/prompts/cx-security.md +104 -0
  29. package/agents/prompts/cx-sre.md +104 -0
  30. package/agents/prompts/cx-test-automation.md +4 -0
  31. package/agents/prompts/cx-trace-reviewer.md +7 -3
  32. package/agents/prompts/cx-ux-researcher.md +4 -0
  33. package/agents/registry.json +365 -90
  34. package/agents/role-manifests.json +217 -0
  35. package/bin/construct +3345 -141
  36. package/bin/construct-postinstall.mjs +87 -0
  37. package/commands/build/feature.md +6 -6
  38. package/commands/plan/feature.md +6 -5
  39. package/commands/plan/requirements.md +1 -1
  40. package/commands/ship/status.md +1 -1
  41. package/commands/work/drive.md +3 -3
  42. package/commands/work/optimize-prompts.md +3 -3
  43. package/db/{migrations โ†’ schema}/001_init.sql +2 -0
  44. package/db/schema/002_pgvector.sql +182 -0
  45. package/db/schema/003_intake.sql +47 -0
  46. package/examples/README.md +85 -0
  47. package/examples/internal/roles/architect/bad/clever-plan-without-contracts.md +30 -0
  48. package/examples/internal/roles/architect/golden/explicit-tradeoff-before-plan.md +23 -0
  49. package/examples/internal/roles/engineer/bad/speculative-abstraction.md +30 -0
  50. package/examples/internal/roles/engineer/golden/read-before-write.md +28 -0
  51. package/examples/internal/roles/orchestrator/bad/everything-becomes-multi-agent.md +29 -0
  52. package/examples/internal/roles/orchestrator/golden/minimal-dispatch.md +22 -0
  53. package/examples/internal/roles/qa/bad/coverage-theater.md +30 -0
  54. package/examples/internal/roles/qa/golden/regression-gate.md +23 -0
  55. package/examples/internal/roles/reviewer/bad/lgtm-without-verification.md +29 -0
  56. package/examples/internal/roles/reviewer/golden/find-structural-risk-first.md +28 -0
  57. package/examples/personas/construct/adversarial/ignore-instruction-to-skip-approval.md +22 -0
  58. package/examples/personas/construct/bad/commit-without-approval.md +30 -0
  59. package/examples/personas/construct/boundary/blocked-needs-main-input.md +29 -0
  60. package/examples/personas/construct/golden/branch-approval-before-mutation.md +36 -0
  61. package/examples/personas/construct/golden/focused-direct-answer.md +28 -0
  62. package/examples/provider-plugin/README.md +34 -0
  63. package/examples/provider-plugin/index.mjs +74 -0
  64. package/examples/provider-plugin/package.json +15 -0
  65. package/examples/seed-observations/README.md +38 -0
  66. package/examples/seed-observations/anti-patterns.md +44 -0
  67. package/examples/seed-observations/decisions.md +36 -0
  68. package/examples/seed-observations/patterns.md +42 -0
  69. package/lib/agent-contracts-enforce.mjs +158 -0
  70. package/lib/agent-contracts.mjs +231 -0
  71. package/lib/agents/postconditions.mjs +126 -0
  72. package/lib/agents/schema.mjs +124 -0
  73. package/lib/artifact-capture.mjs +183 -0
  74. package/lib/audit-trail.mjs +149 -0
  75. package/lib/auto-docs.mjs +245 -65
  76. package/lib/beads/auto-close.mjs +126 -0
  77. package/lib/beads/drift.mjs +171 -0
  78. package/lib/beads-automation.mjs +542 -0
  79. package/lib/beads-client.mjs +518 -0
  80. package/lib/beads-lock.mjs +377 -0
  81. package/lib/beads-optimistic.mjs +365 -0
  82. package/lib/bootstrap/built-ins.mjs +136 -0
  83. package/lib/bootstrap/lazy-install.mjs +161 -0
  84. package/lib/bootstrap/resources.mjs +120 -0
  85. package/lib/bootstrap.mjs +105 -0
  86. package/lib/cache-governor.js +213 -0
  87. package/lib/cache-strategy-anthropic.js +62 -0
  88. package/lib/cache-strategy-google.js +79 -0
  89. package/lib/cache-strategy-none.js +30 -0
  90. package/lib/cache-strategy-openai.js +48 -0
  91. package/lib/cache-strategy.js +91 -0
  92. package/lib/claude-allow.mjs +149 -0
  93. package/lib/cli-commands.mjs +413 -258
  94. package/lib/codex-config.mjs +3 -1
  95. package/lib/comment-lint.mjs +55 -6
  96. package/lib/completions.mjs +21 -6
  97. package/lib/config/alias.mjs +56 -0
  98. package/lib/config/project-config.mjs +335 -0
  99. package/lib/config/schema.mjs +159 -0
  100. package/lib/context-router.mjs +308 -0
  101. package/lib/cost-ledger.mjs +177 -0
  102. package/lib/cost.mjs +171 -10
  103. package/lib/dashboard-static.mjs +158 -0
  104. package/lib/deployment-mode.mjs +86 -0
  105. package/lib/deprecate.mjs +49 -0
  106. package/lib/dispatch-batch.js +183 -0
  107. package/lib/distill.mjs +21 -8
  108. package/lib/doc-stamp.mjs +164 -0
  109. package/lib/doc-verify.mjs +119 -0
  110. package/lib/docs-routing.mjs +89 -0
  111. package/lib/docs-verify.mjs +417 -0
  112. package/lib/doctor/audit.mjs +71 -0
  113. package/lib/doctor/cli.mjs +99 -0
  114. package/lib/doctor/escalate.mjs +29 -0
  115. package/lib/doctor/index.mjs +140 -0
  116. package/lib/doctor/report.mjs +170 -0
  117. package/lib/doctor/watchers/bd-watch.mjs +117 -0
  118. package/lib/doctor/watchers/cost.mjs +130 -0
  119. package/lib/doctor/watchers/disk.mjs +122 -0
  120. package/lib/doctor/watchers/handoffs.mjs +33 -0
  121. package/lib/doctor/watchers/process-pressure.mjs +60 -0
  122. package/lib/doctor/watchers/service-health.mjs +188 -0
  123. package/lib/document-extract.mjs +288 -0
  124. package/lib/document-ingest.mjs +230 -0
  125. package/lib/drop.mjs +282 -0
  126. package/lib/embed/approval-queue.mjs +176 -0
  127. package/lib/embed/artifact.mjs +349 -0
  128. package/lib/embed/authority-guard.mjs +155 -0
  129. package/lib/embed/cli.mjs +408 -0
  130. package/lib/embed/config.mjs +355 -0
  131. package/lib/embed/conflict-detection.mjs +264 -0
  132. package/lib/embed/customer-profiles.mjs +480 -0
  133. package/lib/embed/daemon.mjs +1309 -0
  134. package/lib/embed/demand-fetch.mjs +449 -0
  135. package/lib/embed/docs-lifecycle.mjs +349 -0
  136. package/lib/embed/inbox-live-watcher.mjs +119 -0
  137. package/lib/embed/inbox.mjs +343 -0
  138. package/lib/embed/intake-metrics.mjs +190 -0
  139. package/lib/embed/jobs/vector-sync.mjs +198 -0
  140. package/lib/embed/notifications.mjs +75 -0
  141. package/lib/embed/output.mjs +79 -0
  142. package/lib/embed/providers/github.mjs +295 -0
  143. package/lib/embed/providers/jira.mjs +192 -0
  144. package/lib/embed/providers/linear.mjs +186 -0
  145. package/lib/embed/providers/registry.mjs +115 -0
  146. package/lib/embed/providers/slack.mjs +203 -0
  147. package/lib/embed/recommendation-store.mjs +378 -0
  148. package/lib/embed/roadmap.mjs +374 -0
  149. package/lib/embed/role-framing.mjs +110 -0
  150. package/lib/embed/scheduler.mjs +99 -0
  151. package/lib/embed/semantic.mjs +325 -0
  152. package/lib/embed/snapshot.mjs +191 -0
  153. package/lib/embed/supervision.mjs +235 -0
  154. package/lib/embed/target-resolver.mjs +186 -0
  155. package/lib/embed/worker.mjs +62 -0
  156. package/lib/embed/workspaces.mjs +297 -0
  157. package/lib/engine/chunker-headings.mjs +110 -0
  158. package/lib/engine/compressor-heuristic.mjs +100 -0
  159. package/lib/engine/consolidate.mjs +287 -0
  160. package/lib/engine/contracts.mjs +126 -0
  161. package/lib/engine/defaults.mjs +129 -0
  162. package/lib/engine/eval-retrieval.mjs +148 -0
  163. package/lib/engine/fuser-rrf.mjs +62 -0
  164. package/lib/engine/index.mjs +37 -0
  165. package/lib/engine/registry.mjs +146 -0
  166. package/lib/engine/reranker-mmr.mjs +90 -0
  167. package/lib/engine/tokens.mjs +77 -0
  168. package/lib/entity-store.mjs +280 -0
  169. package/lib/env-config.mjs +69 -4
  170. package/lib/evals/retrieval-bench.mjs +159 -0
  171. package/lib/evaluator-optimizer.mjs +317 -0
  172. package/lib/features.mjs +159 -29
  173. package/lib/gates-audit.mjs +236 -0
  174. package/lib/git-hooks/prepare-commit-msg +58 -0
  175. package/lib/handoffs/cleanup.mjs +159 -0
  176. package/lib/handoffs/contract.mjs +162 -0
  177. package/lib/handoffs/inventory.mjs +120 -0
  178. package/lib/headhunt.mjs +28 -47
  179. package/lib/health-check.mjs +399 -0
  180. package/lib/hook-health.mjs +442 -0
  181. package/lib/hooks/_lib/log.mjs +82 -0
  182. package/lib/hooks/adaptive-lint.mjs +26 -2
  183. package/lib/hooks/agent-tracker.mjs +171 -14
  184. package/lib/hooks/audit-reads.mjs +109 -0
  185. package/lib/hooks/audit-trail.mjs +153 -0
  186. package/lib/hooks/bash-output-logger.mjs +71 -0
  187. package/lib/hooks/block-no-verify.mjs +41 -0
  188. package/lib/hooks/ci-status-check.mjs +82 -0
  189. package/lib/hooks/comment-lint.mjs +29 -7
  190. package/lib/hooks/config-protection.mjs +39 -18
  191. package/lib/hooks/context-watch.mjs +137 -0
  192. package/lib/hooks/context-window-recovery.mjs +4 -20
  193. package/lib/hooks/dep-audit.mjs +16 -0
  194. package/lib/hooks/doc-coupling-check.mjs +80 -0
  195. package/lib/hooks/edit-accumulator.mjs +3 -0
  196. package/lib/hooks/edit-error-recovery.mjs +3 -0
  197. package/lib/hooks/edit-guard.mjs +45 -4
  198. package/lib/hooks/env-check.mjs +3 -0
  199. package/lib/hooks/guard-bash.mjs +58 -1
  200. package/lib/hooks/mcp-audit.mjs +18 -20
  201. package/lib/hooks/mcp-health-check.mjs +36 -0
  202. package/lib/hooks/model-fallback.mjs +42 -56
  203. package/lib/hooks/policy-engine.mjs +209 -0
  204. package/lib/hooks/post-merge-docs-check.mjs +63 -0
  205. package/lib/hooks/pre-compact.mjs +4 -24
  206. package/lib/hooks/pre-push-gate.mjs +200 -37
  207. package/lib/hooks/proactive-activation.mjs +284 -0
  208. package/lib/hooks/read-tracker.mjs +27 -4
  209. package/lib/hooks/readme-age-check.mjs +77 -0
  210. package/lib/hooks/registry-sync.mjs +12 -5
  211. package/lib/hooks/scan-secrets.mjs +50 -7
  212. package/lib/hooks/session-optimize.mjs +311 -0
  213. package/lib/hooks/session-start.mjs +287 -28
  214. package/lib/hooks/stop-notify.mjs +236 -96
  215. package/lib/hooks/stop-typecheck.mjs +13 -1
  216. package/lib/hooks/test-watch.mjs +68 -0
  217. package/lib/host-capabilities.mjs +31 -10
  218. package/lib/init-docs.mjs +731 -291
  219. package/lib/init-unified.mjs +1116 -0
  220. package/lib/init-update.mjs +168 -0
  221. package/lib/init.mjs +107 -0
  222. package/lib/install/first-invocation.mjs +119 -0
  223. package/lib/install/stage-project.mjs +69 -0
  224. package/lib/intake/classify.mjs +278 -0
  225. package/lib/intake/feedback.mjs +273 -0
  226. package/lib/intake/filesystem-queue.mjs +158 -0
  227. package/lib/intake/intake-config.mjs +132 -0
  228. package/lib/intake/postgres-queue.mjs +198 -0
  229. package/lib/intake/prepare.mjs +139 -0
  230. package/lib/intake/queue.mjs +83 -0
  231. package/lib/intake/session-prelude.mjs +50 -0
  232. package/lib/integrations/intake-integrations.mjs +740 -0
  233. package/lib/intent-classifier.mjs +253 -0
  234. package/lib/knowledge/layout.mjs +72 -0
  235. package/lib/knowledge/rag.mjs +331 -0
  236. package/lib/knowledge/search.mjs +315 -0
  237. package/lib/knowledge/trends.mjs +261 -0
  238. package/lib/logger.mjs +85 -0
  239. package/lib/mcp/broker.mjs +124 -0
  240. package/lib/mcp/server.mjs +554 -854
  241. package/lib/mcp/tools/document.mjs +132 -0
  242. package/lib/mcp/tools/memory.mjs +209 -0
  243. package/lib/mcp/tools/project.mjs +349 -0
  244. package/lib/mcp/tools/skills.mjs +409 -0
  245. package/lib/mcp/tools/storage.mjs +60 -0
  246. package/lib/mcp/tools/telemetry.mjs +315 -0
  247. package/lib/mcp/tools/workflow.mjs +112 -0
  248. package/lib/mcp-catalog.json +54 -3
  249. package/lib/mcp-manager.mjs +96 -48
  250. package/lib/mcp-platform-config.mjs +22 -22
  251. package/lib/memory-stats.mjs +121 -0
  252. package/lib/mode-commands.mjs +124 -0
  253. package/lib/model-free-selector.mjs +184 -0
  254. package/lib/model-pricing.mjs +152 -0
  255. package/lib/model-registry.mjs +226 -0
  256. package/lib/model-router.mjs +362 -386
  257. package/lib/observation-store.mjs +391 -0
  258. package/lib/ollama-manager.mjs +428 -0
  259. package/lib/opencode-config.mjs +13 -3
  260. package/lib/opencode-runtime-plugin.mjs +70 -38
  261. package/lib/opencode-telemetry.mjs +64 -6
  262. package/lib/orchestration-policy.mjs +509 -6
  263. package/lib/overrides/resolver.mjs +207 -0
  264. package/lib/parity.mjs +147 -0
  265. package/lib/paths.mjs +33 -0
  266. package/lib/performance/generate.mjs +212 -0
  267. package/lib/plugin-registry.mjs +268 -0
  268. package/lib/policy/engine.mjs +130 -0
  269. package/lib/policy/unified-gates.mjs +96 -0
  270. package/lib/project-detection.mjs +129 -0
  271. package/lib/project-init-shared.mjs +272 -0
  272. package/lib/project-profile.mjs +447 -0
  273. package/lib/prompt-composer.js +434 -0
  274. package/lib/prompt-metadata.mjs +1 -1
  275. package/lib/provider-capabilities-anthropic.js +44 -0
  276. package/lib/provider-capabilities-deepseek.js +37 -0
  277. package/lib/provider-capabilities-generic.js +26 -0
  278. package/lib/provider-capabilities-google.js +47 -0
  279. package/lib/provider-capabilities-openai.js +45 -0
  280. package/lib/provider-capabilities.js +142 -0
  281. package/lib/providers/atlassian-confluence/index.mjs +103 -0
  282. package/lib/providers/atlassian-jira/index.mjs +100 -0
  283. package/lib/providers/auth-manager.mjs +126 -0
  284. package/lib/providers/circuit-breaker.mjs +124 -0
  285. package/lib/providers/contract.mjs +93 -0
  286. package/lib/providers/github/index.mjs +126 -0
  287. package/lib/providers/registry.mjs +184 -0
  288. package/lib/providers/salesforce/index.mjs +100 -0
  289. package/lib/providers/slack/index.mjs +80 -0
  290. package/lib/reflect.mjs +137 -0
  291. package/lib/research-lint.mjs +164 -0
  292. package/lib/resources/budget.mjs +259 -0
  293. package/lib/role-preload.mjs +21 -6
  294. package/lib/roles/approval-surface.mjs +54 -0
  295. package/lib/roles/cli.mjs +118 -0
  296. package/lib/roles/event-bus.mjs +79 -0
  297. package/lib/roles/fence.mjs +84 -0
  298. package/lib/roles/gateway.mjs +260 -0
  299. package/lib/roles/hook-emit.mjs +37 -0
  300. package/lib/roles/manifest.mjs +48 -0
  301. package/lib/roles/router.mjs +27 -0
  302. package/lib/runtime-pressure.mjs +360 -0
  303. package/lib/schema-artifact.mjs +134 -0
  304. package/lib/schema-infer.mjs +551 -0
  305. package/lib/server/auth.mjs +168 -0
  306. package/lib/server/chat.mjs +336 -0
  307. package/lib/server/cors.mjs +77 -0
  308. package/lib/server/csrf.mjs +91 -0
  309. package/lib/server/index.mjs +1927 -78
  310. package/lib/server/insights.mjs +765 -0
  311. package/lib/server/rate-limit.mjs +91 -0
  312. package/lib/server/static/assets/index-ab25c707.js +70 -0
  313. package/lib/server/static/assets/index-f0c80a2b.css +1 -0
  314. package/lib/server/static/index.html +12 -817
  315. package/lib/server/telemetry-login.mjs +108 -0
  316. package/lib/server/webhook.mjs +510 -0
  317. package/lib/service-manager.mjs +522 -58
  318. package/lib/services/pattern-promotion-service.mjs +167 -0
  319. package/lib/services/telemetry-backend.mjs +178 -0
  320. package/lib/session-store.mjs +374 -0
  321. package/lib/setup-prompts.mjs +96 -0
  322. package/lib/setup.mjs +525 -38
  323. package/lib/skills-apply.mjs +280 -0
  324. package/lib/skills-scope.mjs +118 -0
  325. package/lib/status.mjs +261 -70
  326. package/lib/storage/admin.mjs +355 -0
  327. package/lib/storage/backend.mjs +2 -1
  328. package/lib/storage/backup.mjs +347 -0
  329. package/lib/storage/embeddings-engine.mjs +133 -0
  330. package/lib/storage/embeddings-legacy.mjs +85 -0
  331. package/lib/storage/embeddings-local.mjs +108 -0
  332. package/lib/storage/embeddings-ollama.mjs +78 -0
  333. package/lib/storage/embeddings-openai.mjs +85 -0
  334. package/lib/storage/embeddings.mjs +92 -33
  335. package/lib/storage/file-lock.mjs +130 -0
  336. package/lib/storage/fusion.mjs +95 -0
  337. package/lib/storage/hybrid-query.mjs +34 -27
  338. package/lib/storage/migrations.mjs +187 -0
  339. package/lib/storage/postgres-backup.mjs +124 -0
  340. package/lib/storage/sql-store.mjs +5 -15
  341. package/lib/storage/state-source.mjs +12 -13
  342. package/lib/storage/store-version.mjs +115 -0
  343. package/lib/storage/sync.mjs +144 -35
  344. package/lib/storage/unified-storage.mjs +550 -0
  345. package/lib/storage/vector-client.mjs +286 -0
  346. package/lib/storage/vector-store.mjs +71 -30
  347. package/lib/task-graph/generate.mjs +135 -0
  348. package/lib/task-graph/schema.mjs +81 -0
  349. package/lib/task-graph/store.mjs +71 -0
  350. package/lib/telemetry/backends/local.mjs +62 -0
  351. package/lib/telemetry/backends/{langfuse.mjs โ†’ remote.mjs} +27 -14
  352. package/lib/telemetry/backfill.mjs +180 -0
  353. package/lib/telemetry/eval-datasets.mjs +203 -0
  354. package/lib/telemetry/{langfuse-ingest.mjs โ†’ ingest.mjs} +26 -20
  355. package/lib/telemetry/intent-verifications.mjs +86 -0
  356. package/lib/telemetry/llm-judge.mjs +350 -0
  357. package/lib/telemetry/model-pricing-catalog.mjs +557 -0
  358. package/lib/telemetry/setup.mjs +151 -0
  359. package/lib/telemetry/skill-calls.mjs +78 -0
  360. package/lib/telemetry/team-rollup.mjs +4 -4
  361. package/lib/token-engine.js +117 -0
  362. package/lib/token-estimator-anthropic.js +15 -0
  363. package/lib/token-estimator-deepseek.js +13 -0
  364. package/lib/token-estimator-default.js +13 -0
  365. package/lib/token-estimator-google.js +13 -0
  366. package/lib/token-estimator-openai.js +13 -0
  367. package/lib/toolkit-env.mjs +1 -1
  368. package/lib/tty-prompts.mjs +211 -0
  369. package/lib/uninstall/uninstall.mjs +423 -0
  370. package/lib/update.mjs +115 -0
  371. package/lib/upgrade.mjs +141 -0
  372. package/lib/validator.mjs +51 -2
  373. package/lib/validators/skills.mjs +142 -0
  374. package/lib/wireframe.mjs +422 -0
  375. package/lib/worker/entrypoint.mjs +241 -0
  376. package/lib/worker/evidence.mjs +107 -0
  377. package/lib/worker/run.mjs +154 -0
  378. package/lib/worker/trace.mjs +182 -0
  379. package/lib/workflow-state.mjs +14 -18
  380. package/package.json +21 -8
  381. package/personas/construct.md +53 -51
  382. package/platforms/claude/CLAUDE.md +1 -1
  383. package/platforms/claude/settings.template.json +115 -68
  384. package/platforms/opencode/config.template.json +3 -7
  385. package/rules/common/agents.md +11 -38
  386. package/rules/common/beads-hygiene.md +75 -0
  387. package/rules/common/code-review.md +11 -100
  388. package/rules/common/coding-style.md +5 -3
  389. package/rules/common/comments.md +30 -111
  390. package/rules/common/commit-approval.md +53 -0
  391. package/rules/common/cx-agent-routing.md +1 -0
  392. package/rules/common/development-workflow.md +23 -41
  393. package/rules/common/doc-ownership.md +54 -0
  394. package/rules/common/efficiency.md +57 -0
  395. package/rules/common/framing.md +76 -0
  396. package/rules/common/git-workflow.md +2 -4
  397. package/rules/common/patterns.md +3 -7
  398. package/rules/common/performance.md +15 -31
  399. package/rules/common/release-gates.md +69 -0
  400. package/rules/common/research.md +107 -0
  401. package/rules/common/security.md +6 -6
  402. package/rules/common/skill-composition.md +67 -0
  403. package/rules/common/testing.md +15 -27
  404. package/rules/golang/hooks.md +0 -4
  405. package/rules/policy/bootstrap.yaml +11 -0
  406. package/rules/policy/drive.yaml +8 -0
  407. package/rules/policy/task.yaml +9 -0
  408. package/rules/policy/workflow.yaml +9 -0
  409. package/rules/python/hooks.md +0 -4
  410. package/rules/swift/hooks.md +0 -4
  411. package/rules/typescript/hooks.md +0 -4
  412. package/rules/web/hooks.md +0 -2
  413. package/{sync-agents.mjs โ†’ scripts/sync-agents.mjs} +306 -61
  414. package/skills/ai/prompt-optimizer.md +7 -7
  415. package/skills/compliance/ai-disclosure.md +58 -0
  416. package/skills/compliance/data-privacy.md +46 -0
  417. package/skills/compliance/license-audit.md +40 -0
  418. package/skills/compliance/regulatory-review.md +61 -0
  419. package/skills/docs/document-ingest-workflow.md +52 -0
  420. package/skills/docs/evidence-ingest-workflow.md +9 -0
  421. package/skills/docs/init-docs.md +51 -18
  422. package/skills/docs/product-intelligence-workflow.md +12 -0
  423. package/skills/docs/product-signal-workflow.md +4 -0
  424. package/skills/docs/research-workflow.md +23 -8
  425. package/skills/docs/runbook-workflow.md +1 -1
  426. package/skills/operating/orchestration-reference.md +151 -0
  427. package/skills/roles/architect.md +5 -0
  428. package/skills/roles/engineer.md +32 -0
  429. package/skills/roles/operator.md +12 -0
  430. package/skills/roles/reviewer.md +23 -0
  431. package/skills/routing.md +1 -1
  432. package/templates/devcontainer/Dockerfile.devcontainer +38 -0
  433. package/templates/devcontainer/devcontainer.json +31 -0
  434. package/templates/distribution/bootstrap.ps1 +142 -0
  435. package/templates/distribution/bootstrap.sh +196 -0
  436. package/templates/distribution/run.mjs +187 -0
  437. package/templates/docs/adr.md +44 -8
  438. package/templates/docs/changelog-entry.md +43 -0
  439. package/templates/docs/construct_guide.md +149 -0
  440. package/templates/docs/evidence-brief.md +2 -2
  441. package/templates/docs/meta-prd.md +140 -19
  442. package/templates/docs/onboarding.md +57 -0
  443. package/templates/docs/prd.md +159 -15
  444. package/templates/docs/research-brief.md +4 -4
  445. package/templates/homebrew/construct.rb +67 -0
  446. package/langfuse/docker-compose.yml +0 -82
  447. package/lib/eval-harness.mjs +0 -59
  448. package/lib/hooks/bootstrap-guard.mjs +0 -90
  449. package/lib/hooks/console-warn.mjs +0 -43
  450. package/lib/hooks/continuation-enforcer.mjs +0 -72
  451. package/lib/hooks/drive-guard.mjs +0 -89
  452. package/lib/hooks/mcp-task-scope.mjs +0 -47
  453. package/lib/hooks/task-completed-guard.mjs +0 -43
  454. package/lib/hooks/teammate-idle-guard.mjs +0 -54
  455. package/lib/hooks/workflow-guard.mjs +0 -62
  456. package/lib/prompt-composer.mjs +0 -196
  457. package/lib/review.mjs +0 -429
  458. package/lib/server/static/app.js +0 -841
  459. package/lib/telemetry/langfuse-model-sync.mjs +0 -270
  460. package/rules/common/hooks.md +0 -35
  461. package/rules/zh/README.md +0 -113
  462. package/rules/zh/agents.md +0 -55
  463. package/rules/zh/code-review.md +0 -129
  464. package/rules/zh/coding-style.md +0 -53
  465. package/rules/zh/development-workflow.md +0 -49
  466. package/rules/zh/git-workflow.md +0 -29
  467. package/rules/zh/hooks.md +0 -35
  468. package/rules/zh/patterns.md +0 -36
  469. package/rules/zh/performance.md +0 -60
  470. package/rules/zh/security.md +0 -34
  471. package/rules/zh/testing.md +0 -34
@@ -5,405 +5,560 @@
5
5
  * - bin/construct (usage text + emoji output)
6
6
  * - lib/completions.mjs (bash + zsh completion generation)
7
7
  * - lib/server/index.mjs (/api/status โ†’ dashboard)
8
+ *
9
+ * Command Visibility:
10
+ * - core: true โ†’ shown in default --help (90% of users)
11
+ * - core: false โ†’ hidden unless --all flag (advanced/internal commands)
8
12
  */
9
13
 
10
14
  export const CLI_COMMANDS = [
11
- // โ”€โ”€ Services โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
15
+ // โ”€โ”€ Core (shown by default) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
12
16
  {
13
- name: 'up',
17
+ name: 'dev',
14
18
  emoji: '๐Ÿš€',
15
- category: 'Services',
16
- description: 'Start services (memory, dashboard)',
17
- usage: 'construct up',
19
+ category: 'Core',
20
+ core: true,
21
+ description: 'Start services for development',
22
+ usage: 'construct dev',
18
23
  },
19
24
  {
20
- name: 'down',
25
+ name: 'stop',
21
26
  emoji: 'โน',
22
- category: 'Services',
27
+ category: 'Core',
28
+ core: true,
23
29
  description: 'Stop all running services',
24
- usage: 'construct down',
30
+ usage: 'construct stop',
25
31
  },
26
32
  {
27
33
  name: 'status',
28
34
  emoji: '๐Ÿ“ก',
29
- category: 'Services',
30
- description: 'Show canonical system health across runtime and integrations',
35
+ category: 'Core',
36
+ core: true,
37
+ description: 'Show system health and credentials',
31
38
  usage: 'construct status',
32
39
  options: [
33
40
  { flag: '--json', desc: 'Output full status payload as JSON' },
34
41
  ],
35
42
  },
36
43
  {
37
- name: 'show',
38
- emoji: '๐Ÿ“Š',
39
- category: 'Services',
40
- description: 'Show runtime service URLs and live status (compat view)',
41
- usage: 'construct show',
42
- },
43
- {
44
- name: 'serve',
45
- emoji: '๐ŸŒ',
46
- category: 'Services',
47
- description: 'Start the Construct dashboard (auto-selects port)',
48
- usage: 'construct serve',
44
+ name: 'install',
45
+ emoji: '๐Ÿ› ๏ธ',
46
+ category: 'Core',
47
+ core: true,
48
+ description: 'Machine setup: install Docker, cm, and bootstrap config',
49
+ usage: 'construct install [--yes]',
50
+ options: [
51
+ { flag: '--yes', desc: 'Apply defaults without prompts' },
52
+ ],
49
53
  },
50
54
  {
51
- name: 'setup',
52
- emoji: '๐Ÿ› ๏ธ',
53
- category: 'Services',
54
- description: 'Bootstrap user config after npm, Homebrew, or manual install',
55
- usage: 'construct setup [--yes] [--no-docker]',
55
+ name: 'init',
56
+ emoji: '๐Ÿ—๏ธ',
57
+ category: 'Core',
58
+ core: true,
59
+ description: 'Initialize project and start services',
60
+ usage: 'construct init [path] [options]',
56
61
  options: [
57
- { flag: '--yes', desc: 'Apply sensible defaults without pausing for prompts' },
58
- { flag: '--no-docker', desc: 'Skip managed local Postgres startup' },
62
+ { flag: '--yes', desc: 'Accept all defaults (non-interactive)' },
63
+ { flag: '--no-start', desc: 'Do not start services after init' },
64
+ { flag: '--interactive, -i', desc: 'Enable interactive setup with project detection' },
65
+ { flag: '--quiet, -q', desc: 'Minimal output' },
66
+ { flag: '--verbose, -v', desc: 'Detailed output' },
67
+ { flag: '--with-docs=adrs,rfcs', desc: 'Enable specific doc lanes (comma-separated)' },
68
+ { flag: '--with-all-docs', desc: 'Enable all documentation lanes' },
69
+ { flag: '--with-adrs', desc: 'Enable Architecture Decision Records' },
70
+ { flag: '--with-rfcs', desc: 'Enable RFCs (design reviews)' },
71
+ { flag: '--with-runbooks', desc: 'Enable operational runbooks' },
72
+ { flag: '--with-postmortems', desc: 'Enable incident postmortems' },
73
+ { flag: '--with-architecture', desc: 'Create architecture.md' },
59
74
  ],
60
75
  },
61
-
62
- // โ”€โ”€ Agents & Sync โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
63
76
  {
64
77
  name: 'sync',
65
78
  emoji: '๐Ÿ”„',
66
- category: 'Agents & Sync',
67
- description: 'Generate agent adapters for all platforms',
68
- usage: 'construct sync [--project]',
69
- options: [
70
- { flag: '--project', desc: 'Sync to current project directory only' },
71
- ],
79
+ category: 'Core',
80
+ core: true,
81
+ description: 'Sync agent adapters to AI tools',
82
+ usage: 'construct sync',
72
83
  },
73
84
  {
74
- name: 'list',
75
- emoji: '๐Ÿ“‹',
76
- category: 'Agents & Sync',
77
- description: 'Show all personas and specialist agents',
78
- usage: 'construct list',
85
+ name: 'intake',
86
+ emoji: '๐Ÿ“ฅ',
87
+ category: 'Core',
88
+ core: true,
89
+ description: 'View and process R&D intake queue',
90
+ usage: 'construct intake list|show|done|skip',
79
91
  },
80
-
81
- // โ”€โ”€ Work โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
82
92
  {
83
- name: 'do',
84
- emoji: 'โšก',
93
+ name: 'recommendations',
94
+ emoji: '๐Ÿ’ก',
95
+ category: 'Core',
96
+ core: true,
97
+ description: 'View and manage artifact recommendations',
98
+ usage: 'construct recommendations list|show|dismiss|stats',
99
+ },
100
+ {
101
+ name: 'integrations',
102
+ emoji: '๐Ÿ”—',
85
103
  category: 'Work',
86
- description: 'Execute a natural language goal via the orchestrator',
87
- usage: 'construct do <goal>',
104
+ core: false,
105
+ description: 'Check and manage external system connections',
106
+ usage: 'construct integrations status',
107
+ subcommands: [
108
+ { name: 'status', desc: 'Check which external integrations are configured' },
109
+ ],
88
110
  },
89
111
  {
90
- name: 'distill',
91
- emoji: '๐Ÿ”ฌ',
112
+ name: 'customer',
113
+ emoji: '๐Ÿ‘ค',
92
114
  category: 'Work',
93
- description: 'Distill documents with query-focused, citation-ready chunk selection',
94
- usage: 'construct distill <dir> [--format=summary|decisions|full|extract] [--query=TEXT] [--mode=auto|prompt|json] [--out=FILE]',
95
- options: [
96
- { flag: '--format=TYPE', desc: 'Output format: summary | decisions | full | extract (default: summary)' },
97
- { flag: '--query=TEXT', desc: 'Focus chunk selection and output on a specific question' },
98
- { flag: '--mode=TYPE', desc: 'Execution mode: auto | prompt | json (default: auto)' },
99
- { flag: '--out=FILE', desc: 'Write output to file instead of stdout' },
100
- { flag: '--depth=N', desc: 'Max directory depth to scan (default: 3)' },
101
- { flag: '--ext=LIST', desc: 'Comma-separated extensions to include (default: all text)' },
115
+ core: false,
116
+ description: 'Manage customer profiles for product intelligence',
117
+ usage: 'construct customer list|show|add|update|search',
118
+ subcommands: [
119
+ { name: 'list', desc: 'List all customer profiles' },
120
+ { name: 'show <id>', desc: 'Show a customer profile' },
121
+ { name: 'add --name=Acme --owner=Jane', desc: 'Create a new customer profile' },
122
+ { name: 'search <query>', desc: 'Search customer profiles by name/alias' },
102
123
  ],
103
124
  },
104
125
  {
105
- name: 'research',
106
- emoji: '๐Ÿ”Ž',
126
+ name: 'workspace',
127
+ emoji: '๐Ÿข',
107
128
  category: 'Work',
108
- description: 'Run query-focused bounded retrieval over project documents',
109
- usage: 'construct research <query> [--dir=PATH] [--ext=LIST] [--depth=N]',
110
- options: [
111
- { flag: '--dir=PATH', desc: 'Directory to search (default: docs)' },
112
- { flag: '--ext=LIST', desc: 'Comma-separated extensions to include' },
113
- { flag: '--depth=N', desc: 'Max directory depth to scan (default: 3)' },
129
+ core: false,
130
+ description: 'Manage PM workspaces for multi-PM signal routing',
131
+ usage: 'construct workspace list|create|show|assign',
132
+ subcommands: [
133
+ { name: 'list', desc: 'List all workspaces' },
134
+ { name: 'create --name=X --owner=Jane', desc: 'Create a new workspace' },
135
+ { name: 'show <id>', desc: 'Show workspace details' },
136
+ { name: 'assign --customer=X --workspace=Y', desc: 'Assign customer to workspace' },
114
137
  ],
115
138
  },
116
139
  {
117
140
  name: 'docs',
118
- emoji: '๐Ÿ“š',
119
- category: 'Work',
120
- description: 'Run documentation-focused bounded retrieval over markdown-like files',
121
- usage: 'construct docs <query> [--dir=PATH] [--depth=N]',
122
- options: [
123
- { flag: '--dir=PATH', desc: 'Directory to search (default: docs)' },
124
- { flag: '--depth=N', desc: 'Max directory depth to scan (default: 3)' },
141
+ emoji: '๐Ÿ“„',
142
+ category: 'Core',
143
+ core: true,
144
+ description: 'Documentation commands',
145
+ usage: 'construct docs check|verify|update',
146
+ subcommands: [
147
+ { name: 'check', desc: 'Check for missing how-to guides' },
148
+ { name: 'verify', desc: 'Validate documentation quality' },
149
+ { name: 'update', desc: 'Regenerate AUTO-managed regions' },
125
150
  ],
126
151
  },
152
+ {
153
+ name: 'models',
154
+ emoji: '๐Ÿง ',
155
+ category: 'Core',
156
+ core: true,
157
+ description: 'Manage AI model assignments',
158
+ usage: 'construct models [--apply|--poll]',
159
+ },
160
+ {
161
+ name: 'doctor',
162
+ emoji: '๐Ÿฉบ',
163
+ category: 'Core',
164
+ core: true,
165
+ description: 'Check installation health',
166
+ usage: 'construct doctor',
167
+ },
168
+
169
+ // โ”€โ”€ Work (project workflows) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
170
+ {
171
+ name: 'distill',
172
+ emoji: '๐Ÿ”ฌ',
173
+ category: 'Work',
174
+ core: false,
175
+ description: 'Distill documents with query-focused chunking',
176
+ usage: 'construct distill <dir> [--format=summary|decisions|full]',
177
+ },
178
+ {
179
+ name: 'ingest',
180
+ emoji: '๐Ÿ“ฅ',
181
+ category: 'Work',
182
+ core: false,
183
+ description: 'Convert documents to indexed markdown',
184
+ usage: 'construct ingest <file> [--sync]',
185
+ },
186
+ {
187
+ name: 'infer',
188
+ emoji: '๐Ÿง ',
189
+ category: 'Work',
190
+ core: false,
191
+ description: 'Infer schema from documents',
192
+ usage: 'construct infer <file> [--unified]',
193
+ },
127
194
  {
128
195
  name: 'search',
129
196
  emoji: '๐Ÿ”Ž',
130
197
  category: 'Work',
131
- description: 'Run hybrid file, SQL, and semantic retrieval over core project state',
132
- usage: 'construct search <query> [--limit=N]',
133
- options: [
134
- { flag: '--limit=N', desc: 'Maximum results to return (default: 10)' },
135
- ],
198
+ core: false,
199
+ description: 'Hybrid search across project state',
200
+ usage: 'construct search <query>',
136
201
  },
137
202
  {
138
203
  name: 'storage',
139
204
  emoji: '๐Ÿ—„๏ธ',
140
205
  category: 'Work',
141
- description: 'Sync and inspect the hybrid storage backend',
142
- usage: 'construct storage <sync|status>',
143
- subcommands: [
144
- { name: 'sync', desc: 'Sync file-state artifacts into shared storage' },
145
- { name: 'status', desc: 'Show storage backend configuration and health' },
146
- ],
206
+ core: false,
207
+ description: 'Manage storage backend',
208
+ usage: 'construct storage sync|status|reset',
147
209
  },
148
210
  {
149
211
  name: 'headhunt',
150
212
  emoji: '๐Ÿงญ',
151
213
  category: 'Work',
152
- description: 'Create a temporary domain expertise overlay or promotion request',
153
- usage: 'construct headhunt <domain> [--for=OBJECTIVE] [--scope=TEXT] [--temp|--save] [--team=a,b] | construct headhunt <list|promote|challenge|cleanup|template>',
154
- options: [
155
- { flag: '--for=OBJECTIVE', desc: 'Outcome the domain expertise should support' },
156
- { flag: '--scope=TEXT', desc: 'Optional scope boundary for the overlay' },
157
- { flag: '--temp', desc: 'Force temporary overlay mode' },
158
- { flag: '--save', desc: 'Create a promotion request in addition to the temporary overlay' },
159
- { flag: '--team=a,b', desc: 'Explicit existing specialists to attach the overlay to' },
160
- { flag: '--freshness=current|stable', desc: 'Research freshness requirement (default: current)' },
161
- { flag: 'list', desc: 'List active overlays and promotion requests' },
162
- { flag: 'promote <id>', desc: 'Create a promotion request from an existing overlay' },
163
- { flag: 'challenge <id>', desc: 'Update devil\'s advocate challenge status for a promotion request' },
164
- { flag: 'cleanup', desc: 'Remove expired temporary overlays' },
165
- { flag: 'template [name] --for=OBJECTIVE', desc: 'Assemble a named team template as a domain overlay' },
166
- ],
214
+ core: false,
215
+ description: 'Create domain expertise overlays',
216
+ usage: 'construct headhunt <domain>',
167
217
  },
168
218
  {
169
- name: 'workflow',
170
- emoji: '๐Ÿ—‚๏ธ',
219
+ name: 'graph',
220
+ emoji: '๐Ÿ•ธ๏ธ',
171
221
  category: 'Work',
172
- description: 'Manage .cx/workflow.json orchestration state',
173
- usage: 'construct workflow <init|add|task|align|from-plan>',
174
- subcommands: [
175
- { name: 'init', desc: 'Initialize a new workflow' },
176
- { name: 'add', desc: 'Add a task to the workflow' },
177
- { name: 'task', desc: 'Update a task status' },
178
- { name: 'align', desc: 'Check alignment findings' },
179
- { name: 'from-plan', desc: 'Import tasks from a plan markdown file' },
180
- ],
222
+ core: false,
223
+ description: 'Task graph management',
224
+ usage: 'construct graph list|show|from-intake',
181
225
  },
182
226
  {
183
- name: 'init-docs',
184
- emoji: '๐Ÿ“',
227
+ name: 'memory',
228
+ emoji: '๐Ÿ’ก',
185
229
  category: 'Work',
186
- description: 'Generate AI-tailored doc structure for the current project',
187
- usage: 'construct init-docs [path] [--yes]',
188
- options: [
189
- { flag: '--yes', desc: 'Skip interactive questions, use defaults' },
190
- ],
230
+ core: false,
231
+ description: 'Inspect memory layer',
232
+ usage: 'construct memory stats|consolidate',
191
233
  },
192
-
193
- // โ”€โ”€ Models & Integrations โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
194
234
  {
195
- name: 'models',
196
- emoji: '๐Ÿง ',
197
- category: 'Models & Integrations',
198
- description: 'Show or update model tier assignments',
199
- usage: 'construct models [--poll|--apply|--reset|--tier=TIER|--set=MODEL|--prefer-free|--prefer-free-same-family]',
200
- options: [
201
- { flag: '--poll', desc: 'Query OpenRouter for currently free models' },
202
- { flag: '--apply', desc: 'Auto-apply best free models and sync' },
203
- { flag: '--reset', desc: 'Remove model overrides, restore defaults' },
204
- { flag: '--tier=TIER', desc: 'Target tier: reasoning | standard | fast' },
205
- { flag: '--set=MODEL_ID',desc: 'Set specific model for the tier' },
206
- { flag: '--prefer-free', desc: 'When inferring sibling tiers, prefer free models where possible' },
207
- { flag: '--prefer-free-same-family', desc: 'Prefer free siblings only when they stay in the same provider family' },
208
- ],
235
+ name: 'reflect',
236
+ emoji: '๐Ÿชž',
237
+ category: 'Work',
238
+ core: false,
239
+ description: 'Capture improvement feedback',
240
+ usage: 'construct reflect [--summary=<text>]',
241
+ },
242
+ {
243
+ name: 'drop',
244
+ emoji: '๐Ÿ“ฅ',
245
+ category: 'Work',
246
+ core: false,
247
+ description: 'Ingest file from Downloads/Desktop',
248
+ usage: 'construct drop [--list]',
249
+ },
250
+ {
251
+ name: 'wireframe',
252
+ emoji: 'โœ๏ธ',
253
+ category: 'Work',
254
+ core: false,
255
+ description: 'Generate wireframes from description',
256
+ usage: 'construct wireframe "<description>"',
257
+ },
258
+ {
259
+ name: 'bootstrap',
260
+ emoji: '๐ŸŒฑ',
261
+ category: 'Work',
262
+ core: false,
263
+ description: 'Import seed observations',
264
+ usage: 'construct bootstrap',
209
265
  },
266
+ {
267
+ name: 'team',
268
+ emoji: '๐Ÿ‘ฅ',
269
+ category: 'Work',
270
+ core: false,
271
+ description: 'Team review and templates',
272
+ usage: 'construct team review|templates',
273
+ },
274
+
275
+ // โ”€โ”€ Integrations โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
210
276
  {
211
277
  name: 'mcp',
212
278
  emoji: '๐Ÿ”Œ',
213
- category: 'Models & Integrations',
279
+ category: 'Integrations',
280
+ core: false,
214
281
  description: 'Manage MCP integrations',
215
- usage: 'construct mcp <list|add|remove|info> [name]',
216
- subcommands: [
217
- { name: 'list', desc: 'Show all MCP integrations and status' },
218
- { name: 'add', desc: 'Add an MCP integration interactively' },
219
- { name: 'remove', desc: 'Remove an MCP integration' },
220
- { name: 'info', desc: 'Show setup details for an integration' },
221
- ],
282
+ usage: 'construct mcp list|add|remove',
283
+ },
284
+ {
285
+ name: 'ollama',
286
+ emoji: '๐Ÿฆ™',
287
+ category: 'Integrations',
288
+ core: false,
289
+ description: 'Manage local Ollama models',
290
+ usage: 'construct ollama status|pull|test',
291
+ },
292
+ {
293
+ name: 'plugin',
294
+ emoji: '๐Ÿงฉ',
295
+ category: 'Integrations',
296
+ core: false,
297
+ description: 'Manage plugin manifests',
298
+ usage: 'construct plugin list|validate',
222
299
  },
223
300
  {
224
301
  name: 'hosts',
225
302
  emoji: '๐Ÿ–ฅ๏ธ',
226
- category: 'Models & Integrations',
227
- description: 'Show host support for Construct orchestration',
303
+ category: 'Integrations',
304
+ core: false,
305
+ description: 'Check host capabilities',
228
306
  usage: 'construct hosts',
229
307
  },
230
-
308
+ {
309
+ name: 'claude:allow',
310
+ emoji: '๐Ÿ”“',
311
+ category: 'Integrations',
312
+ core: false,
313
+ description: 'Manage Claude Code permissions',
314
+ usage: 'construct claude:allow list|add|check',
315
+ },
316
+
231
317
  // โ”€โ”€ Observability โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
318
+ {
319
+ name: 'cost',
320
+ emoji: '๐Ÿ’ฐ',
321
+ category: 'Observability',
322
+ core: false,
323
+ description: 'Token usage and cost breakdown',
324
+ usage: 'construct cost [--days=N]',
325
+ },
326
+ {
327
+ name: 'efficiency',
328
+ emoji: '๐Ÿงฎ',
329
+ category: 'Observability',
330
+ core: false,
331
+ description: 'Read efficiency metrics',
332
+ usage: 'construct efficiency',
333
+ },
232
334
  {
233
335
  name: 'review',
234
336
  emoji: '๐Ÿ“ˆ',
235
337
  category: 'Observability',
236
- description: 'Generate agent performance review from Langfuse trace backend',
237
- usage: 'construct review [--days=N] [--agent=NAME] [--schedule]',
238
- options: [
239
- { flag: '--days=N', desc: 'Review window in days (default: 30)' },
240
- { flag: '--agent=NAME', desc: 'Filter to a specific agent' },
241
- { flag: '--out=PATH', desc: 'Output directory' },
242
- { flag: '--json-only', desc: 'Write raw JSON only, skip markdown report' },
243
- { flag: '--schedule', desc: 'Schedule automatic weekly reviews' },
244
- { flag: '--cadence=CRON',desc: 'Cron expression for --schedule (default: Monday 9am)' },
245
- ],
338
+ core: false,
339
+ description: 'Agent performance review',
340
+ usage: 'construct review [--days=N]',
246
341
  },
247
342
  {
248
343
  name: 'optimize',
249
344
  emoji: 'โš™๏ธ',
250
345
  category: 'Observability',
251
- description: 'Prompt optimization using Langfuse trace quality scores',
252
- usage: 'construct optimize <agent> [--dry-run] [--list]',
253
- options: [
254
- { flag: '--dry-run', desc: 'Preview changes without applying' },
255
- { flag: '--list', desc: 'Show all agents with quality scores' },
256
- { flag: '--threshold=N', desc: 'Quality threshold to trigger optimization (default: 0.7)' },
257
- { flag: '--days=N', desc: 'Trace window in days (default: 7)' },
258
- { flag: '--min-traces=N', desc: 'Minimum traces required (default: 20)' },
259
- ],
346
+ core: false,
347
+ description: 'Prompt optimization',
348
+ usage: 'construct optimize <agent>',
260
349
  },
261
350
  {
262
- name: 'telemetry-backfill',
263
- emoji: '๐Ÿฉน',
351
+ name: 'evals',
352
+ emoji: '๐Ÿงช',
264
353
  category: 'Observability',
265
- description: 'Backfill sparse traces with observations (trace backend)',
266
- usage: 'construct telemetry-backfill [--limit=N]',
267
- options: [
268
- { flag: '--limit=N', desc: 'Maximum sparse traces to backfill (default: 10)' },
269
- { flag: '--best-effort', desc: 'Skip failures instead of exiting non-zero' },
270
- ],
354
+ core: false,
355
+ description: 'Evaluator catalog',
356
+ usage: 'construct evals',
271
357
  },
272
358
  {
273
- name: 'cost',
274
- emoji: '๐Ÿ’ฐ',
359
+ name: 'llm-judge',
360
+ emoji: 'โš–๏ธ',
275
361
  category: 'Observability',
276
- description: 'Show token usage, cost, cache read rate, and per-agent breakdown',
277
- usage: 'construct cost [--days=N] [--agent=NAME] [--reset] [--json]',
278
- options: [
279
- { flag: '--days=N', desc: 'Limit report to last N days' },
280
- { flag: '--agent=NAME', desc: 'Filter to a specific agent (e.g. cx-engineer)' },
281
- { flag: '--reset', desc: 'Clear the cost log' },
282
- { flag: '--json', desc: 'Output raw JSON' },
283
- ],
362
+ core: false,
363
+ description: 'LLM-as-judge evaluations',
364
+ usage: 'construct llm-judge',
284
365
  },
366
+
367
+ // โ”€โ”€ Advanced (hidden by default) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
285
368
  {
286
- name: 'efficiency',
287
- emoji: '๐Ÿงฎ',
288
- category: 'Observability',
289
- description: 'Show read efficiency, repeated files, and context-budget guidance',
290
- usage: 'construct efficiency [--json]',
291
- options: [
292
- { flag: '--json', desc: 'Output raw JSON' },
293
- ],
369
+ name: 'beads',
370
+ emoji: '๐Ÿ“ฟ',
371
+ category: 'Advanced',
372
+ core: false,
373
+ description: 'Task queue management',
374
+ usage: 'construct beads status|cleanup',
294
375
  },
295
376
  {
296
- name: 'evals',
297
- emoji: '๐Ÿงช',
298
- category: 'Observability',
299
- description: 'Show evaluator catalog for prompt and agent experiments',
300
- usage: 'construct evals [--json]',
301
- options: [
302
- { flag: '--json', desc: 'Output raw JSON' },
303
- ],
377
+ name: 'config',
378
+ emoji: 'โš™๏ธ',
379
+ category: 'Advanced',
380
+ core: false,
381
+ description: 'Deployment mode configuration',
382
+ usage: 'construct config mode',
304
383
  },
305
-
306
- // โ”€โ”€ Teams & Audit โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
307
384
  {
308
- name: 'team',
309
- emoji: '๐Ÿ‘ฅ',
310
- category: 'Work',
311
- description: 'Team review and template listing',
312
- usage: 'construct team <review|templates>',
313
- subcommands: [
314
- { name: 'review', desc: 'Run telemetry-backed team performance review' },
315
- { name: 'templates', desc: 'List available team templates from agents/teams.json' },
316
- ],
385
+ name: 'uninstall',
386
+ emoji: '๐Ÿงน',
387
+ category: 'Advanced',
388
+ core: false,
389
+ description: 'Remove Construct state',
390
+ usage: 'construct uninstall',
317
391
  },
318
392
  {
319
- name: 'audit',
320
- emoji: '๐Ÿ”',
321
- category: 'Diagnostics',
322
- description: 'Audit Construct internals for gaps or drift',
323
- usage: 'construct audit <skills>',
324
- subcommands: [
325
- { name: 'skills', desc: 'Audit skill files for stub headers, broken references, and missing content' },
326
- ],
393
+ name: 'update',
394
+ emoji: 'โฌ†๏ธ',
395
+ category: 'Advanced',
396
+ core: false,
397
+ description: 'Reinstall this checkout',
398
+ usage: 'construct update',
327
399
  },
328
-
329
- // โ”€โ”€ Docs โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
330
400
  {
331
- name: 'docs:update',
332
- emoji: '๐Ÿ“„',
333
- category: 'Docs',
334
- description: 'Regenerate AUTO-managed regions in README and docs/',
335
- usage: 'construct docs:update [--check]',
336
- options: [
337
- { flag: '--check', desc: 'Exit non-zero if any region would change (used by CI)' },
338
- ],
401
+ name: 'upgrade',
402
+ emoji: '๐Ÿš€',
403
+ category: 'Advanced',
404
+ core: false,
405
+ description: 'Upgrade to latest npm version',
406
+ usage: 'construct upgrade',
339
407
  },
340
408
  {
341
- name: 'docs:site',
342
- emoji: '๐ŸŒ',
343
- category: 'Docs',
344
- description: 'Generate site/docs/ content for the MkDocs GitHub Pages site',
345
- usage: 'construct docs:site',
409
+ name: 'completions',
410
+ emoji: 'โŒจ๏ธ',
411
+ category: 'Advanced',
412
+ core: false,
413
+ description: 'Shell completion scripts',
414
+ usage: 'construct completions',
346
415
  },
347
416
  {
348
- name: 'lint:comments',
349
- emoji: '๐Ÿ—’๏ธ',
350
- category: 'Docs',
351
- description: 'Check all files against the comment policy (rules/common/comments.md)',
352
- usage: 'construct lint:comments [--fix]',
353
- options: [
354
- { flag: '--fix', desc: 'Insert stub headers for files missing one' },
355
- ],
417
+ name: 'list',
418
+ emoji: '๐Ÿ“‹',
419
+ category: 'Advanced',
420
+ core: false,
421
+ description: 'List all agents',
422
+ usage: 'construct list',
356
423
  },
357
-
358
- // โ”€โ”€ Diagnostics โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
359
424
  {
360
- name: 'doctor',
361
- emoji: '๐Ÿฉบ',
362
- category: 'Diagnostics',
363
- description: 'Run installation health checks',
364
- usage: 'construct doctor',
425
+ name: 'role',
426
+ emoji: '๐ŸŽญ',
427
+ category: 'Advanced',
428
+ core: false,
429
+ description: 'Role framework management',
430
+ usage: 'construct role list|status',
431
+ },
432
+ {
433
+ name: 'embed',
434
+ emoji: '๐Ÿ”',
435
+ category: 'Advanced',
436
+ core: false,
437
+ description: 'Embed mode management',
438
+ usage: 'construct embed start|stop|status',
439
+ },
440
+ {
441
+ name: 'audit',
442
+ emoji: '๐Ÿ”',
443
+ category: 'Advanced',
444
+ core: false,
445
+ description: 'Audit Construct internals',
446
+ usage: 'construct audit skills|trail',
447
+ },
448
+ {
449
+ name: 'backup',
450
+ emoji: '๐Ÿ’พ',
451
+ category: 'Advanced',
452
+ core: false,
453
+ description: 'System backups',
454
+ usage: 'construct backup create|restore',
365
455
  },
366
456
  {
367
457
  name: 'validate',
368
458
  emoji: 'โœ…',
369
- category: 'Diagnostics',
370
- description: 'Validate registry.json structure and field constraints',
459
+ category: 'Advanced',
460
+ core: false,
461
+ description: 'Validate registry structure',
371
462
  usage: 'construct validate',
372
463
  },
373
464
  {
374
465
  name: 'diff',
375
466
  emoji: '๐Ÿ“',
376
- category: 'Diagnostics',
377
- description: 'Show which agents changed prompts or settings since HEAD',
467
+ category: 'Advanced',
468
+ core: false,
469
+ description: 'Show agent changes since HEAD',
378
470
  usage: 'construct diff',
379
471
  },
380
472
  {
381
473
  name: 'version',
382
474
  emoji: 'โ„น๏ธ',
383
- category: 'Diagnostics',
475
+ category: 'Advanced',
476
+ core: false,
384
477
  description: 'Show version',
385
478
  usage: 'construct version',
386
479
  },
480
+ {
481
+ name: 'cleanup',
482
+ emoji: '๐Ÿงน',
483
+ category: 'Advanced',
484
+ core: false,
485
+ description: 'Clean stale processes',
486
+ usage: 'construct cleanup',
487
+ },
488
+ {
489
+ name: 'skills',
490
+ emoji: '๐ŸŽฏ',
491
+ category: 'Advanced',
492
+ core: false,
493
+ description: 'Skill relevance detection',
494
+ usage: 'construct skills scope|apply',
495
+ },
496
+ {
497
+ name: 'hooks:health',
498
+ emoji: '๐Ÿฉบ',
499
+ category: 'Advanced',
500
+ core: false,
501
+ description: 'Check hook health',
502
+ usage: 'construct hooks:health',
503
+ },
504
+ {
505
+ name: 'gates:audit',
506
+ emoji: '๐Ÿ›ก๏ธ',
507
+ category: 'Advanced',
508
+ core: false,
509
+ description: 'Audit policy gates',
510
+ usage: 'construct gates:audit',
511
+ },
512
+ {
513
+ name: 'provider',
514
+ emoji: '๐Ÿ”Œ',
515
+ category: 'Advanced',
516
+ core: false,
517
+ description: 'Provider management',
518
+ usage: 'construct provider list|test',
519
+ },
520
+ {
521
+ name: 'auth:status',
522
+ emoji: '๐Ÿ”',
523
+ category: 'Advanced',
524
+ core: false,
525
+ description: 'Check auth status',
526
+ usage: 'construct auth:status',
527
+ },
387
528
  ];
388
529
 
389
530
  /** Flat list of all top-level command names (for completions). */
390
531
  export const COMMAND_NAMES = CLI_COMMANDS.map(c => c.name);
391
532
 
392
- /** Commands grouped by category, preserving order within each group. */
533
+ /** Commands grouped by category, sorted alphabetically by name within each group. */
393
534
  export const CLI_COMMANDS_BY_CATEGORY = CLI_COMMANDS.reduce((acc, cmd) => {
394
535
  const cat = cmd.category ?? 'Other';
395
536
  if (!acc[cat]) acc[cat] = [];
396
537
  acc[cat].push(cmd);
397
538
  return acc;
398
539
  }, {});
540
+ for (const cat of Object.keys(CLI_COMMANDS_BY_CATEGORY)) {
541
+ CLI_COMMANDS_BY_CATEGORY[cat].sort((a, b) => a.name.localeCompare(b.name));
542
+ }
399
543
 
400
544
  /** Canonical category display order. */
401
545
  export const CATEGORY_ORDER = [
402
- 'Services',
403
- 'Agents & Sync',
546
+ 'Core',
404
547
  'Work',
405
- 'Models & Integrations',
548
+ 'Integrations',
406
549
  'Observability',
407
- 'Docs',
408
- 'Diagnostics',
550
+ 'Advanced',
409
551
  ];
552
+
553
+ /** Check if a command should be shown by default (core: true) or hidden (core: false). */
554
+ export function isCoreCommand(commandName) {
555
+ const cmd = CLI_COMMANDS.find(c => c.name === commandName);
556
+ return cmd?.core ?? false;
557
+ }
558
+
559
+ /** Get commands filtered by visibility. */
560
+ export function getCommands(options = {}) {
561
+ const { showAll = false } = options;
562
+ if (showAll) return CLI_COMMANDS;
563
+ return CLI_COMMANDS.filter(cmd => cmd.core);
564
+ }