@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,409 @@
1
+ /**
2
+ * cli-commands.mjs — single source of truth for all construct CLI commands.
3
+ *
4
+ * Consumed by:
5
+ * - bin/construct (usage text + emoji output)
6
+ * - lib/completions.mjs (bash + zsh completion generation)
7
+ * - lib/server/index.mjs (/api/status → dashboard)
8
+ */
9
+
10
+ export const CLI_COMMANDS = [
11
+ // ── Services ──────────────────────────────────────────────────────────
12
+ {
13
+ name: 'up',
14
+ emoji: '🚀',
15
+ category: 'Services',
16
+ description: 'Start services (memory, dashboard)',
17
+ usage: 'construct up',
18
+ },
19
+ {
20
+ name: 'down',
21
+ emoji: '⏹',
22
+ category: 'Services',
23
+ description: 'Stop all running services',
24
+ usage: 'construct down',
25
+ },
26
+ {
27
+ name: 'status',
28
+ emoji: '📡',
29
+ category: 'Services',
30
+ description: 'Show canonical system health across runtime and integrations',
31
+ usage: 'construct status',
32
+ options: [
33
+ { flag: '--json', desc: 'Output full status payload as JSON' },
34
+ ],
35
+ },
36
+ {
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',
49
+ },
50
+ {
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]',
56
+ options: [
57
+ { flag: '--yes', desc: 'Apply sensible defaults without pausing for prompts' },
58
+ { flag: '--no-docker', desc: 'Skip managed local Postgres startup' },
59
+ ],
60
+ },
61
+
62
+ // ── Agents & Sync ─────────────────────────────────────────────────────
63
+ {
64
+ name: 'sync',
65
+ 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
+ ],
72
+ },
73
+ {
74
+ name: 'list',
75
+ emoji: '📋',
76
+ category: 'Agents & Sync',
77
+ description: 'Show all personas and specialist agents',
78
+ usage: 'construct list',
79
+ },
80
+
81
+ // ── Work ──────────────────────────────────────────────────────────────
82
+ {
83
+ name: 'do',
84
+ emoji: '⚡',
85
+ category: 'Work',
86
+ description: 'Execute a natural language goal via the orchestrator',
87
+ usage: 'construct do <goal>',
88
+ },
89
+ {
90
+ name: 'distill',
91
+ emoji: '🔬',
92
+ 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)' },
102
+ ],
103
+ },
104
+ {
105
+ name: 'research',
106
+ emoji: '🔎',
107
+ 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)' },
114
+ ],
115
+ },
116
+ {
117
+ 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)' },
125
+ ],
126
+ },
127
+ {
128
+ name: 'search',
129
+ emoji: '🔎',
130
+ 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
+ ],
136
+ },
137
+ {
138
+ name: 'storage',
139
+ emoji: '🗄️',
140
+ 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
+ ],
147
+ },
148
+ {
149
+ name: 'headhunt',
150
+ emoji: '🧭',
151
+ 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
+ ],
167
+ },
168
+ {
169
+ name: 'workflow',
170
+ emoji: '🗂️',
171
+ 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
+ ],
181
+ },
182
+ {
183
+ name: 'init-docs',
184
+ emoji: '📝',
185
+ 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
+ ],
191
+ },
192
+
193
+ // ── Models & Integrations ─────────────────────────────────────────────
194
+ {
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
+ ],
209
+ },
210
+ {
211
+ name: 'mcp',
212
+ emoji: '🔌',
213
+ category: 'Models & Integrations',
214
+ 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
+ ],
222
+ },
223
+ {
224
+ name: 'hosts',
225
+ emoji: '🖥️',
226
+ category: 'Models & Integrations',
227
+ description: 'Show host support for Construct orchestration',
228
+ usage: 'construct hosts',
229
+ },
230
+
231
+ // ── Observability ─────────────────────────────────────────────────────
232
+ {
233
+ name: 'review',
234
+ emoji: '📈',
235
+ 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
+ ],
246
+ },
247
+ {
248
+ name: 'optimize',
249
+ emoji: '⚙️',
250
+ 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
+ ],
260
+ },
261
+ {
262
+ name: 'telemetry-backfill',
263
+ emoji: '🩹',
264
+ 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
+ ],
271
+ },
272
+ {
273
+ name: 'cost',
274
+ emoji: '💰',
275
+ 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
+ ],
284
+ },
285
+ {
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
+ ],
294
+ },
295
+ {
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
+ ],
304
+ },
305
+
306
+ // ── Teams & Audit ────────────────────────────────────────────────────
307
+ {
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
+ ],
317
+ },
318
+ {
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
+ ],
327
+ },
328
+
329
+ // ── Docs ──────────────────────────────────────────────────────────────
330
+ {
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
+ ],
339
+ },
340
+ {
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',
346
+ },
347
+ {
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
+ ],
356
+ },
357
+
358
+ // ── Diagnostics ───────────────────────────────────────────────────────
359
+ {
360
+ name: 'doctor',
361
+ emoji: '🩺',
362
+ category: 'Diagnostics',
363
+ description: 'Run installation health checks',
364
+ usage: 'construct doctor',
365
+ },
366
+ {
367
+ name: 'validate',
368
+ emoji: '✅',
369
+ category: 'Diagnostics',
370
+ description: 'Validate registry.json structure and field constraints',
371
+ usage: 'construct validate',
372
+ },
373
+ {
374
+ name: 'diff',
375
+ emoji: '📍',
376
+ category: 'Diagnostics',
377
+ description: 'Show which agents changed prompts or settings since HEAD',
378
+ usage: 'construct diff',
379
+ },
380
+ {
381
+ name: 'version',
382
+ emoji: 'ℹ️',
383
+ category: 'Diagnostics',
384
+ description: 'Show version',
385
+ usage: 'construct version',
386
+ },
387
+ ];
388
+
389
+ /** Flat list of all top-level command names (for completions). */
390
+ export const COMMAND_NAMES = CLI_COMMANDS.map(c => c.name);
391
+
392
+ /** Commands grouped by category, preserving order within each group. */
393
+ export const CLI_COMMANDS_BY_CATEGORY = CLI_COMMANDS.reduce((acc, cmd) => {
394
+ const cat = cmd.category ?? 'Other';
395
+ if (!acc[cat]) acc[cat] = [];
396
+ acc[cat].push(cmd);
397
+ return acc;
398
+ }, {});
399
+
400
+ /** Canonical category display order. */
401
+ export const CATEGORY_ORDER = [
402
+ 'Services',
403
+ 'Agents & Sync',
404
+ 'Work',
405
+ 'Models & Integrations',
406
+ 'Observability',
407
+ 'Docs',
408
+ 'Diagnostics',
409
+ ];
@@ -0,0 +1,114 @@
1
+ /**
2
+ * lib/codex-config.mjs — helpers for Construct-managed Codex config blocks.
3
+ *
4
+ * Keeps Codex agent and MCP generation in one place so setup and sync do not
5
+ * leave stale tables behind in ~/.codex/config.toml.
6
+ */
7
+
8
+ import fs from 'node:fs';
9
+ import os from 'node:os';
10
+ import path from 'node:path';
11
+
12
+ const HOME = os.homedir();
13
+
14
+ export function getCodexConfigPath(homeDir = HOME) {
15
+ return path.join(homeDir, '.codex', 'config.toml');
16
+ }
17
+
18
+ export function readCodexConfig(configPath = getCodexConfigPath()) {
19
+ if (!fs.existsSync(configPath)) return '';
20
+ return fs.readFileSync(configPath, 'utf8');
21
+ }
22
+
23
+ export function writeCodexConfig(text, configPath = getCodexConfigPath()) {
24
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
25
+ const cleaned = removeDanglingConstructMcpMarkers(removeDanglingConstructMcpTimeouts(text));
26
+ fs.writeFileSync(configPath, `${cleaned.trimEnd()}\n`);
27
+ }
28
+
29
+ export function tomlString(value) {
30
+ return JSON.stringify(value);
31
+ }
32
+
33
+ function tomlValue(value) {
34
+ if (Array.isArray(value)) return `[${value.map(tomlValue).join(', ')}]`;
35
+ if (value && typeof value === 'object') {
36
+ return `{ ${Object.entries(value).map(([key, val]) => `${key} = ${tomlValue(val)}`).join(', ')} }`;
37
+ }
38
+ if (typeof value === 'boolean' || typeof value === 'number') return String(value);
39
+ return tomlString(String(value));
40
+ }
41
+
42
+ function escapeRegExp(value) {
43
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
44
+ }
45
+
46
+ export function removeTomlTables(text, tableNames) {
47
+ let next = text;
48
+ for (const tableName of tableNames) {
49
+ const pattern = new RegExp(`\\n?\\[${escapeRegExp(tableName)}\\]\\n[\\s\\S]*?(?=\\n\\[|(?![\\s\\S]))`);
50
+ next = next.replace(pattern, '\n');
51
+ }
52
+ return next.replace(/\n{3,}/g, '\n\n').trimEnd();
53
+ }
54
+
55
+ export function removeDanglingConstructMcpTimeouts(text) {
56
+ return text.replace(/\nstartup_timeout_sec = 20\ntool_timeout_sec = 60\n(?=\n# BEGIN CONSTRUCT AGENTS)/g, '\n');
57
+ }
58
+
59
+ export function removeDanglingConstructMcpMarkers(text) {
60
+ return text.replace(/\n# BEGIN CONSTRUCT MCP SERVERS(?:\n\s*)?(?=(?:# BEGIN CONSTRUCT AGENTS)|(?:# BEGIN CONSTRUCT MCP SERVERS)|(?![\s\S]))/g, '\n');
61
+ }
62
+
63
+ function resolveTemplateString(value, resolvedValues) {
64
+ return String(value).replace(/__([A-Z0-9_]+)__/g, (_, name) => resolvedValues[name] ?? `__${name}__`);
65
+ }
66
+
67
+ function resolveArgs(args, resolvedValues) {
68
+ return (args ?? []).map((arg) =>
69
+ typeof arg === 'string' ? resolveTemplateString(arg, resolvedValues) : arg,
70
+ );
71
+ }
72
+
73
+ function resolveEnv(env, resolvedValues) {
74
+ if (!env || typeof env !== 'object' || Array.isArray(env)) return {};
75
+ return Object.fromEntries(
76
+ Object.entries(env)
77
+ .map(([key, value]) => [key, typeof value === 'string' ? resolveTemplateString(value, resolvedValues) : value])
78
+ .filter(([, value]) => typeof value !== 'string' || !value.includes('__')),
79
+ );
80
+ }
81
+
82
+ export function buildCodexMcpEntry(id, mcpDef, resolvedValues = {}) {
83
+ if (mcpDef.type === 'url') {
84
+ const entry = {
85
+ url: resolveTemplateString(mcpDef.url, resolvedValues),
86
+ startup_timeout_sec: 20,
87
+ tool_timeout_sec: 60,
88
+ };
89
+
90
+ if (id !== 'github') {
91
+ const authorization = mcpDef.headers?.Authorization;
92
+ const match = typeof authorization === 'string' ? authorization.match(/^Bearer __([A-Z0-9_]+)__$/) : null;
93
+ if (match) entry.bearer_token_env_var = match[1];
94
+ }
95
+
96
+ return entry;
97
+ }
98
+
99
+ return {
100
+ command: mcpDef.command,
101
+ ...(Array.isArray(mcpDef.args) && mcpDef.args.length > 0 ? { args: resolveArgs(mcpDef.args, resolvedValues) } : {}),
102
+ ...(Object.keys(resolveEnv(mcpDef.env, resolvedValues)).length > 0 ? { env: resolveEnv(mcpDef.env, resolvedValues) } : {}),
103
+ startup_timeout_sec: 20,
104
+ tool_timeout_sec: 60,
105
+ };
106
+ }
107
+
108
+ export function serializeCodexMcpTable(id, entry) {
109
+ const lines = [`[mcp_servers.${tomlString(id)}]`];
110
+ for (const [key, value] of Object.entries(entry)) {
111
+ lines.push(`${key} = ${tomlValue(value)}`);
112
+ }
113
+ return lines.join('\n');
114
+ }