@geraldmaron/construct 1.0.0 → 1.0.2

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 +9 -6
  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 +1000 -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 +523 -36
  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
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * lib/workflow-state.mjs — <one-line purpose>
3
+ * lib/workflow-state.mjs — Read, write, and validate Construct workflow state.
4
4
  *
5
- * <2–6 line summary.>
5
+ * Manages the canonical workflow.json lifecycle: loading, phase transitions,
6
+ * task status updates, validation, and executive-gate enforcement. Also builds
7
+ * task packets for agent dispatch and derives plan.md summaries. Backs the
8
+ * MCP workflow tools, CLI commands, and the concierge routing layer.
6
9
  */
7
10
  import fs from "node:fs";
8
11
  import path from "node:path";
@@ -10,16 +13,6 @@ import { execSync } from "node:child_process";
10
13
  import { routeRequest } from "./orchestration-policy.mjs";
11
14
 
12
15
  const PHASES = ["research", "plan", "implement", "validate", "operate"];
13
- // Back-compat stub: pre-overhaul workflow.json files used Matrix-themed phase
14
- // names. Kept solely to migrate existing state on load. Do not use these names
15
- // in new code — write only the canonical PHASES values above.
16
- const LEGACY_PHASE_ALIASES = {
17
- oracle: "research",
18
- morpheus: "plan",
19
- neo: "implement",
20
- trinity: "validate",
21
- operator: "operate"
22
- };
23
16
  const VALID_STATUS = new Set(["todo", "in-progress", "blocked", "blocked_needs_user", "blocked_needs_executive", "done", "skipped"]);
24
17
 
25
18
  /**
@@ -32,8 +25,7 @@ export const EXECUTIVE_GATES = {
32
25
  };
33
26
 
34
27
  function normalizePhase(value, fallback = null) {
35
- const normalized = LEGACY_PHASE_ALIASES[value] || value;
36
- return PHASES.includes(normalized) ? normalized : fallback;
28
+ return PHASES.includes(value) ? value : fallback;
37
29
  }
38
30
 
39
31
  function normalizeWorkflow(workflow) {
@@ -78,9 +70,7 @@ function projectName(root) {
78
70
  .trim();
79
71
  const match = remote.match(/[:/]([^/]+\/[^/.]+)(?:\.git)?$/);
80
72
  if (match) return match[1];
81
- } catch {
82
- // best effort
83
- }
73
+ } catch { /* remote origin read is non-critical */ }
84
74
  return path.basename(root);
85
75
  }
86
76
 
@@ -217,7 +207,13 @@ export function addTask(root, options) {
217
207
  }
218
208
 
219
209
  export function buildTaskPacketFromIntent(request, options = {}) {
220
- const route = routeRequest({ request: String(request || "") });
210
+ const route = routeRequest({
211
+ request: String(request || ""),
212
+ fileCount: options.fileCount ?? 0,
213
+ moduleCount: options.moduleCount ?? 0,
214
+ introducesContract: options.introducesContract ?? false,
215
+ explicitDrive: options.explicitDrive ?? false,
216
+ });
221
217
  if (!route) return null;
222
218
  if (route.track === "immediate") return null;
223
219
 
package/package.json CHANGED
@@ -1,31 +1,33 @@
1
1
  {
2
2
  "name": "@geraldmaron/construct",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "type": "module",
5
- "description": "Construct — AI orchestration CLI with package-manager-first setup",
5
+ "description": "Construct — agent orchestration layer for OpenCode, Claude Code, and other coding surfaces",
6
6
  "bin": {
7
7
  "construct": "bin/construct"
8
8
  },
9
9
  "files": [
10
10
  "bin/construct",
11
+ "bin/construct-postinstall.mjs",
11
12
  "lib/**",
12
13
  "agents/**",
14
+ "examples/**",
13
15
  "personas/**",
14
16
  "commands/**",
15
17
  "skills/**",
16
18
  "rules/**",
17
19
  "platforms/**",
18
20
  "templates/**",
19
- "langfuse/**",
21
+ "templates/distribution/**",
20
22
  "db/**",
21
- "sync-agents.mjs",
23
+ "scripts/sync-agents.mjs",
22
24
  "README.md",
23
25
  ".env.example"
24
26
  ],
25
27
  "engines": {
26
- "node": ">=18"
28
+ "node": ">=20"
27
29
  },
28
- "license": "MIT",
30
+ "license": "Apache-2.0",
29
31
  "publishConfig": {
30
32
  "access": "public"
31
33
  },
@@ -39,15 +41,26 @@
39
41
  },
40
42
  "scripts": {
41
43
  "mcp": "node lib/mcp/server.mjs",
42
- "test": "node --test tests/*.test.mjs",
44
+ "test": "node scripts/run-tests.mjs",
43
45
  "docs:init": "node lib/init-docs.mjs --yes",
44
46
  "docs:update": "node ./bin/construct docs:update",
45
47
  "docs:site": "node ./bin/construct docs:site",
48
+ "docs:dev": "npm --prefix apps/docs run dev",
49
+ "docs:build": "npm --prefix apps/docs run build",
46
50
  "lint:comments": "node ./bin/construct lint:comments",
47
- "release:check": "node ./bin/construct doctor && npm test && node ./bin/construct docs:update --check && node ./bin/construct lint:comments"
51
+ "lint:templates": "node scripts/lint-commits-pr.mjs",
52
+ "eval:routing": "node scripts/eval/score-intent-classifier.mjs",
53
+ "release:check": "node ./bin/construct doctor && npm test && node ./bin/construct docs:update --check && node ./bin/construct dashboard:sync --check && node ./bin/construct lint:comments && node scripts/lint-commits-pr.mjs",
54
+ "npm:publish": "npm run release:check && npm publish --access public",
55
+ "postinstall": "node ./bin/construct-postinstall.mjs"
48
56
  },
49
57
  "dependencies": {
58
+ "@huggingface/transformers": "^4.2.0",
50
59
  "@modelcontextprotocol/sdk": "^1.12.0",
60
+ "@xenova/transformers": "^2.0.1",
51
61
  "postgres": "^3.4.9"
62
+ },
63
+ "overrides": {
64
+ "express-rate-limit": "8.5.1"
52
65
  }
53
66
  }
@@ -1,94 +1,96 @@
1
1
  <!--
2
- personas/construct.md — primary persona; first-contact routing and action discipline.
2
+ personas/construct.md — Construct persona prompt.
3
3
 
4
- Construct is the only persona the user talks to. This file defines how a request becomes
5
- action: session bootstrap, complexity classification, dispatch rules, deliberation caps,
6
- and quality gates. Changes here propagate to every platform via sync-agents.mjs.
4
+ Defines the single user-facing AI interface and its session-start behavior,
5
+ routing rules, approval boundaries, and output contract. Loaded by sync-agents
6
+ and emitted to every supported platform.
7
7
  -->
8
- You are Construct — a single, unified AI that handles everything from a quick question to a full software lifecycle. The user interacts only with you. Internal routing and specialist dispatch are your implementation detail, never theirs.
9
-
10
- Dispatching a specialist is not delegation — it is forcing the same problem through a different cognitive lens. An architect's suspicion of unwritten contracts and a reviewer's attention to edge cases are structurally different views, not redundant passes.
8
+ You are Construct — the single AI interface for everything from a quick question to a full software lifecycle. The user talks only to you; internal routing and specialist dispatch are implementation detail.
11
9
 
12
10
  ## Start of every session
13
11
 
14
12
  Before responding, run in parallel — do not narrate:
15
- 1. `workflow_status` — active work and blockers from `.cx/workflow.json`
16
- 2. `project_context` — state from `.cx/context.md`
17
- 3. `memory_search` with the basename of CWD prior session context and user preferences
13
+ 1. `project_context` — state from `.cx/context.md`
14
+ 2. `memory_search` with the basename of CWD prior session context and user preferences
15
+ 3. Read `AGENTS.md`, `plan.md`, and the relevant docs for the current task when present
16
+ 4. Check `.cx/handoffs/` for the most recent handoff — if another session was active, read it to understand what was in progress and what NOT to touch
18
17
 
19
18
  Apply results silently. If memory returns preferences or past decisions, honor them without asking the user to repeat.
20
19
 
20
+ Honor the project operating hierarchy:
21
+ - Beads (`bd`) is the durable source of truth for tasks; hygiene contract — claim, close, supersede, prune — lives in `rules/common/beads-hygiene.md`. `bd ready` for unblocked work, `bd show <id>` for the active issue.
22
+ - `plan.md` is the human-readable implementation plan
23
+ - cass-memory via MCP `memory` is for cross-tool/session recall, not task tracking
24
+
25
+ Use the single-writer rule whenever multiple sessions are active: if two sessions would touch the same file, one session owns the edit and the other reviews, researches, or waits for handoff.
26
+
21
27
  ## Classify before acting
22
28
 
23
- Use the code-backed orchestration policy as the source of truth for:
24
- - intent classification
25
- - execution track (`immediate`, `focused`, `orchestrated`)
26
- - specialist selection
27
- - escalation and approval boundaries
29
+ Use the code-backed orchestration policy for intent, execution track, specialist selection, escalation, and approval boundaries. Visual deliverables (wireframes, diagrams, decks) are first-class — use real visual tools, not bullet prose.
28
30
 
29
- Prompt text should explain the public contract, not recreate the routing control plane.
31
+ Execution model:
32
+ - **Immediate** — answer or act directly when no hidden worker is needed.
33
+ - **Focused** — dispatch one bounded specialist path; return in Construct's voice.
34
+ - **Orchestrated** — plan → challenge → build → validate, with tracker-backed slices and explicit file ownership.
30
35
 
31
- Default execution model:
32
- - **Immediate** — answer or act directly when the policy says no hidden worker is needed.
33
- - **Focused** — dispatch one bounded specialist path and return in Construct's voice.
34
- - **Orchestrated** — run plan → challenge → build → validate using workflow-backed task packets.
36
+ Devil's advocate is mandatory for new architectural directions, AI/agent workflow changes, security or data-integrity changes, and promoting a temporary capability to persistent.
35
37
 
36
- State the dispatch plan in one sentence before starting: *"Plan: [phases and specialists]."*
38
+ ## Gates and contracts (org-in-a-box)
37
39
 
38
- Devil's advocate is mandatory for: new architectural directions, AI/agent workflow changes, security or data-integrity changes, and any promotion of a temporary capability to persistent.
40
+ `routeRequest` returns three artifacts; honor all three:
39
41
 
40
- ## Action discipline (hard rules)
42
+ 1. **Gates** `framingChallenge`, `externalResearch`, `docAuthoring`
43
+ 2. **Contract chain** — typed handoffs from `agents/contracts.json`. Call `agent_contract` MCP tool at handoff.
44
+ 3. **Specialist sequence** — dispatch plan with ordering/parallel markers.
41
45
 
42
- The failure mode of this system is **ruminating in-persona instead of dispatching**. Break any of these and you are burning context for no output.
46
+ Before DONE: postconditions met · sources cited · framing logged · ADRs have Rejected alternatives.
43
47
 
44
- - **Dispatch, don't solo-plan.** Work touching 3+ files, 2+ modules, or introducing a new contract/dependency/SDK → cx-architect owns the plan. You don't.
45
- - **Ask or look up — don't speculate.** Choosing between named options (SDK A vs B, pattern X vs Y) that aren't already in your context: call `context7_query-docs` / `WebFetch`, ask the user one question, or commit to a default and note the assumption. Never a fourth round of internal debate.
46
- - **Deliberation cap: two passes.** Reasoning about the same decision twice consecutively without a new read, tool call, or user input means you skipped a dispatch or a lookup. Hand off, query, or ask — never think a third time.
47
- - **Probe before bulk read.** Before `Read` with `limit > 200` or unset, check size via `Glob`, `Bash wc -l`, or a `limit: 50` probe. Reading 220 lines of a 74-line file is the tell.
48
- - **Start-of-task contract is binding.** First action on any non-trivial request is the parallel bootstrap above, plus `cx_trace` once the goal is clear. A first-action `Read` or thinking turn means you skipped it.
48
+ ## Branch + commit approval
49
49
 
50
- Signs you are burning context: >3 thinking turns before any tool call · context >40% with no edits or plan saved · re-reading a file at different offsets · internal debate over a library choice a 10-second docs lookup would resolve.
50
+ - **Working branch is surfaced every session** at the top of session-start. Restate it before any mutating operation.
51
+ - **Never commit, push, or merge without asking first.** Before `git commit`, `git push`, or `gh pr merge`: state branch, show the proposed message / refspec / PR number verbatim, wait for explicit yes. A batch go-ahead covers a defined sequence; new commits later are their own gate. See `rules/common/commit-approval.md`.
51
52
 
52
- ## How to communicate
53
+ ## R&D intake surface
53
54
 
54
- - First person as Construct, never as a named specialist
55
- - Lead with the answer or action, not the reasoning
56
- - One clear question when blocked — not a list
57
- - Confirm what changed and what's next when done — nothing more
55
+ Session-start surfaces pending intake at `.cx/intake/pending/<id>.json`. Read with `construct intake show <id>`; the triage block names the primary owner, recommended chain, and next action. For non-trivial signals, plan with `construct graph from-intake <id>` and update node status with evidence (`construct graph status … done --evidence=…`). A node cannot reach `done` without an evidence record. Team / enterprise mode wraps tool calls in the MCP broker — when it returns `ApprovalRequired`, surface the question; never bypass.
58
56
 
59
- ## Workflow state
57
+ ## Action discipline
60
58
 
61
- For non-trivial work: create/update `.cx/workflow.json` with task, phase, owner, acceptance criteria. Mark complete as you go. If a specialist returns NEEDS_MAIN_INPUT, surface it in your voice and resume after the answer. End significant sessions by asking cx-docs-keeper to update `.cx/context.md`.
59
+ - Dispatch, don't solo-plan: 3+ files, 2+ modules, or a new contract cx-architect owns the plan.
60
+ - Ask or look up, don't speculate: call `context7_query-docs` / `WebFetch`, ask, or commit to a default. Never a fourth round of internal debate.
61
+ - Deliberation cap: two passes. Same decision twice without a new read, tool call, or user input = hand off, query, or ask.
62
+ - Probe before bulk read: check size via `Glob` / `wc -l` or a `limit: 50` probe before `Read` with `limit > 200`.
63
+ - Start-of-task: parallel bootstrap (above) + `cx_trace` before anything mutating.
62
64
 
63
- ## Core documents are project state
65
+ ## Communication + state
64
66
 
65
- Treat these as required, load-bearing project state for every repo Construct initializes or operates in:
67
+ Lead with the answer. One question when blocked. Confirm what changed when done.
66
68
 
67
- - `.cx/context.md`
68
- - `.cx/context.json`
69
- - `.cx/workflow.json`
70
- - `docs/README.md`
71
- - `docs/architecture.md`
69
+ Non-trivial work: update Beads (`bd note <id>`), `plan.md`, docs with owner / acceptance / verification. Preserve tracker ids in handoffs. Surface NEEDS_MAIN_INPUT in your voice; resume after the answer. End every session with a handoff at `.cx/handoffs/{date}-{slug}.md` and updates to `.cx/context.md`.
72
70
 
73
- All LLMs working in the repo, including Construct, must read them at session start and keep them current when work changes project reality. If decisions, workflow state, architecture assumptions, boundaries, or core documentation expectations change, update the affected document before marking work done.
71
+ Load-bearing state: `AGENTS.md`, `.cx/context.md`/`.json`, `docs/README.md`, `docs/architecture.md` (read at session start, update before DONE, prune stale sections). `plan.md` is local-only.
74
72
 
75
73
  ## Quality gates
76
74
 
77
- After any implementation, dispatch validation before marking done — the user should never have to ask:
75
+ After any implementation, dispatch validation before marking done:
78
76
  1. cx-reviewer — correctness, regression, coverage
79
77
  2. cx-qa — tests pass, coverage meets threshold
80
78
  3. cx-security if auth/secrets/user data touched
81
79
 
82
- Do not mark `done` in `.cx/workflow.json` until cx-reviewer and cx-qa return verdicts. If cx-reviewer returns BLOCKED, surface CRITICAL findings and stop. Any CRITICAL issue blocks shipping.
80
+ Do not mark `done` until cx-reviewer and cx-qa return verdicts. BLOCKED or any CRITICAL finding stops shipping.
81
+
82
+ ## Hard release gates
83
+
84
+ Run `npm run release:check` before any commit or push — never wait for CI. Commits follow `.gitmessage`; PRs follow `.github/pull_request_template.md`. Full policy: `rules/common/release-gates.md`.
83
85
 
84
86
  ## Loop guard
85
87
 
86
88
  Same action 3+ times with no state change → stop. Report what was tried, what blocked progress, what decision is needed.
87
89
 
88
- ## Drive mode
90
+ Before stopping: surface incomplete tracker-linked plan slices and unmet acceptance criteria. Do not stop silently with work in-flight.
89
91
 
90
- Activates only on explicit word-boundary triggers: **`/work:drive`**, a standalone word **`drive`** (not "driver", "hard drive", "overdrive"), or **`full send`**. Match with `\b(drive|full send)\b` — substring matches do not activate drive mode.
92
+ ## Drive mode
91
93
 
92
- When the trigger fires, execute under the orchestrated track with the code-backed policy, skip planning confirmation, and continue until verification is complete or a real blocker requires executive input.
94
+ Activates on word-boundary triggers `/work:drive`, standalone `drive`, or `full send`. Substring matches do not count.
93
95
 
94
- State the dispatch plan upfront, then brief status at phase transitions. The user sees the plan and outcomes, not the deliberation.
96
+ On trigger: orchestrated track, skip planning confirmation, continue until verification or a real blocker. State the dispatch plan upfront; brief status at phase transitions. User sees plan and outcomes, not deliberation.
@@ -27,4 +27,4 @@ When using Bash, always provide both `command` and `description` string fields.
27
27
 
28
28
  ## Cross-Tool Memory
29
29
 
30
- Cass MCP provides session memory across tools. Use `memory_search` to find prior context.
30
+ Construct uses cass-memory for cross-tool memory. Start the local HTTP server with `cm serve`, then use `memory_search` to find prior context.
@@ -31,28 +31,28 @@
31
31
  ],
32
32
  "PreToolUse": [
33
33
  {
34
- "matcher": "*",
34
+ "matcher": "Write|Edit|MultiEdit|NotebookEdit|TodoWrite|Read|Grep|Glob|LS|NotebookRead",
35
35
  "hooks": [
36
36
  {
37
37
  "type": "command",
38
- "command": "node \"$HOME/.construct/lib/hooks/bootstrap-guard.mjs\"",
39
- "timeout": 5
38
+ "command": "node \"$HOME/.construct/lib/hooks/policy-engine.mjs\" PreToolUse",
39
+ "timeout": 10
40
40
  }
41
41
  ],
42
- "id": "pre:bootstrap-guard",
43
- "description": "Block mutations until session bootstrap (workflow_status + project_context + memory_search) has run"
42
+ "id": "pre:policy-engine",
43
+ "description": "Consolidated policy gating (bootstrap rule): block mutations until session is grounded via project_context+memory_search or 3+ exploratory reads"
44
44
  },
45
45
  {
46
46
  "matcher": "Bash",
47
47
  "hooks": [
48
48
  {
49
49
  "type": "command",
50
- "command": "npx block-no-verify@1.1.2",
50
+ "command": "node \"$HOME/.construct/lib/hooks/block-no-verify.mjs\"",
51
51
  "timeout": 5
52
52
  }
53
53
  ],
54
54
  "id": "pre:bash:block-no-verify",
55
- "description": "Block git --no-verify to prevent pre-commit hook bypass"
55
+ "description": "Block git --no-verify / -n to prevent pre-commit/pre-push hook bypass (vendored)"
56
56
  },
57
57
  {
58
58
  "matcher": "Bash",
@@ -91,7 +91,7 @@
91
91
  "description": "Prevent weakening eslint/tsconfig/prettier/biome configs"
92
92
  },
93
93
  {
94
- "matcher": "*",
94
+ "matcher": "mcp__.*",
95
95
  "hooks": [
96
96
  {
97
97
  "type": "command",
@@ -113,18 +113,6 @@
113
113
  ],
114
114
  "id": "pre:edit-guard",
115
115
  "description": "Hash-anchored edit verification — blocks Edit when old_string not found verbatim"
116
- },
117
- {
118
- "matcher": "mcp__.*",
119
- "hooks": [
120
- {
121
- "type": "command",
122
- "command": "node \"$HOME/.construct/lib/hooks/mcp-task-scope.mjs\"",
123
- "timeout": 3
124
- }
125
- ],
126
- "id": "pre:mcp-task-scope",
127
- "description": "Warn when calling an MCP not declared in the active task mcpScope"
128
116
  }
129
117
  ],
130
118
  "PostToolUse": [
@@ -166,29 +154,28 @@
166
154
  "description": "Auto-run project linter/formatter after every file edit"
167
155
  },
168
156
  {
169
- "matcher": "Write|Edit",
157
+ "matcher": "Write|Edit|MultiEdit",
170
158
  "hooks": [
171
159
  {
172
160
  "type": "command",
173
- "command": "node \"$HOME/.construct/lib/hooks/console-warn.mjs\"",
174
- "timeout": 5
161
+ "command": "node \"$HOME/.construct/lib/hooks/comment-lint.mjs\"",
162
+ "timeout": 15
175
163
  }
176
164
  ],
177
- "id": "post:edit:console-warn",
178
- "description": "Flag console.log/debugger left in edited source files"
165
+ "id": "post:edit:comment-lint",
166
+ "description": "Block edits that violate comment policy (banned patterns, missing required header). Bypass: CONSTRUCT_SKIP_COMMENT_LINT=1"
179
167
  },
180
168
  {
181
- "matcher": "Write|Edit",
169
+ "matcher": "Write|Edit|MultiEdit",
182
170
  "hooks": [
183
171
  {
184
172
  "type": "command",
185
- "command": "node \"$HOME/.construct/lib/hooks/comment-lint.mjs\"",
186
- "timeout": 10,
187
- "async": true
173
+ "command": "node \"$HOME/.construct/lib/hooks/doc-coupling-check.mjs\"",
174
+ "timeout": 5
188
175
  }
189
176
  ],
190
- "id": "post:edit:comment-lint",
191
- "description": "Warn on missing file headers or banned comment patterns after edits"
177
+ "id": "post:edit:doc-coupling",
178
+ "description": "Advisory: nudge when code edits accumulate without CHANGELOG/docs updates (pre-commit gate will block at commit time)"
192
179
  },
193
180
  {
194
181
  "matcher": "Write|Edit|MultiEdit",
@@ -229,29 +216,30 @@
229
216
  "description": "Audit dependencies for vulnerabilities after manifest changes"
230
217
  },
231
218
  {
232
- "matcher": "TodoWrite",
219
+ "matcher": "Read",
233
220
  "hooks": [
234
221
  {
235
222
  "type": "command",
236
- "command": "node \"$HOME/.construct/lib/hooks/continuation-enforcer.mjs\"",
237
- "timeout": 5
223
+ "command": "node \"$HOME/.construct/lib/hooks/read-tracker.mjs\"",
224
+ "timeout": 3,
225
+ "async": true
238
226
  }
239
227
  ],
240
- "id": "post:continuation-enforcer",
241
- "description": "After TodoWrite, remind agent of remaining tasks to prevent premature stopping"
228
+ "id": "post:read-tracker",
229
+ "description": "Record file content hash after Read for staleness detection in edit-guard"
242
230
  },
243
231
  {
244
232
  "matcher": "Read",
245
233
  "hooks": [
246
234
  {
247
235
  "type": "command",
248
- "command": "node \"$HOME/.construct/lib/hooks/read-tracker.mjs\"",
236
+ "command": "node \"$HOME/.construct/lib/hooks/audit-reads.mjs\"",
249
237
  "timeout": 3,
250
238
  "async": true
251
239
  }
252
240
  ],
253
- "id": "post:read-tracker",
254
- "description": "Record file content hash after Read for staleness detection in edit-guard"
241
+ "id": "post:audit-reads",
242
+ "description": "Tamper-evident chain log of every Read tool call. Off by default — enable with CONSTRUCT_AUDIT_READS=1."
255
243
  },
256
244
  {
257
245
  "matcher": "mcp__.*",
@@ -278,6 +266,56 @@
278
266
  ],
279
267
  "id": "post:agent-tracker",
280
268
  "description": "Record dispatched cx-* agent name for per-agent cost attribution"
269
+ },
270
+ {
271
+ "matcher": "Bash",
272
+ "hooks": [
273
+ {
274
+ "type": "command",
275
+ "command": "node \"$HOME/.construct/lib/hooks/bash-output-logger.mjs\"",
276
+ "timeout": 5
277
+ }
278
+ ],
279
+ "id": "post:bash:output-logger",
280
+ "description": "Persist long Bash outputs to ~/.cx/bash-logs/ and nudge toward referencing the log"
281
+ },
282
+ {
283
+ "matcher": "Bash",
284
+ "hooks": [
285
+ {
286
+ "type": "command",
287
+ "command": "node \"$HOME/.construct/lib/hooks/test-watch.mjs\"",
288
+ "timeout": 5,
289
+ "async": true
290
+ }
291
+ ],
292
+ "id": "post:bash:test-watch",
293
+ "description": "Emit role events when a test command exits non-zero or repeats a flake"
294
+ },
295
+ {
296
+ "matcher": "Bash",
297
+ "hooks": [
298
+ {
299
+ "type": "command",
300
+ "command": "node \"$HOME/.construct/lib/hooks/post-merge-docs-check.mjs\"",
301
+ "timeout": 5,
302
+ "async": true
303
+ }
304
+ ],
305
+ "id": "post:bash:post-merge-docs-check",
306
+ "description": "Emit doc-drift events when a merge lands without matching docs/CHANGELOG updates"
307
+ },
308
+ {
309
+ "matcher": "Edit|Write|MultiEdit|NotebookEdit|Bash",
310
+ "hooks": [
311
+ {
312
+ "type": "command",
313
+ "command": "node \"$HOME/.construct/lib/hooks/audit-trail.mjs\"",
314
+ "timeout": 5
315
+ }
316
+ ],
317
+ "id": "post:audit-trail",
318
+ "description": "Append-only audit log of every mutation — attribution (agent/task) and tamper-evidence chain"
281
319
  }
282
320
  ],
283
321
  "PostToolUseFailure": [
@@ -353,12 +391,12 @@
353
391
  "hooks": [
354
392
  {
355
393
  "type": "command",
356
- "command": "node \"$HOME/.construct/lib/hooks/workflow-guard.mjs\"",
357
- "timeout": 10
394
+ "command": "node \"$HOME/.construct/lib/hooks/policy-engine.mjs\" Stop",
395
+ "timeout": 15
358
396
  }
359
397
  ],
360
- "id": "stop:workflow-guard",
361
- "description": "Prevent accidental session stop while Construct workflow tasks or alignment blockers remain"
398
+ "id": "stop:policy-engine",
399
+ "description": "Consolidated stop policy: block on red CI (CONSTRUCT_STOP_OK_RED_CI=1 to ack), block on in_progress beads (CONSTRUCT_STOP_OK_OPEN_BD=1 to ack), enforce drive-mode criteria, advise on open drive-session"
362
400
  },
363
401
  {
364
402
  "matcher": "*",
@@ -377,25 +415,26 @@
377
415
  "hooks": [
378
416
  {
379
417
  "type": "command",
380
- "command": "node \"$HOME/.construct/lib/hooks/stop-notify.mjs\"",
381
- "timeout": 10,
418
+ "command": "node \"$HOME/.construct/lib/hooks/readme-age-check.mjs\"",
419
+ "timeout": 5,
382
420
  "async": true
383
421
  }
384
422
  ],
385
- "id": "stop:notify",
386
- "description": "Desktop notification: files changed, TS status, session cost"
423
+ "id": "stop:readme-age-check",
424
+ "description": "Emit readme.stale role events for tracked READMEs older than 90 days"
387
425
  },
388
426
  {
389
427
  "matcher": "*",
390
428
  "hooks": [
391
429
  {
392
430
  "type": "command",
393
- "command": "node \"$HOME/.construct/lib/hooks/drive-guard.mjs\"",
394
- "timeout": 10
431
+ "command": "node \"$HOME/.construct/lib/hooks/stop-notify.mjs\"",
432
+ "timeout": 10,
433
+ "async": true
395
434
  }
396
435
  ],
397
- "id": "stop:drive-guard",
398
- "description": "Block stop when drive mode active and acceptance criteria lack evidence"
436
+ "id": "stop:notify",
437
+ "description": "Desktop notification: files changed, TS status, session cost"
399
438
  },
400
439
  {
401
440
  "matcher": "*",
@@ -408,34 +447,45 @@
408
447
  ],
409
448
  "id": "stop:snapshot",
410
449
  "description": "Snapshot .cx/context.md at session end so resume has real progress"
411
- }
412
- ],
413
- "TeammateIdle": [
450
+ },
414
451
  {
415
452
  "matcher": "*",
416
453
  "hooks": [
417
454
  {
418
455
  "type": "command",
419
- "command": "node \"$HOME/.construct/lib/hooks/teammate-idle-guard.mjs\"",
420
- "timeout": 10
456
+ "command": "node \"$HOME/.construct/lib/hooks/session-optimize.mjs\"",
457
+ "timeout": 600,
458
+ "async": true
421
459
  }
422
460
  ],
423
- "id": "team:teammate-idle-guard",
424
- "description": "Keep worker sessions aligned with .cx/workflow.json before they go idle"
461
+ "id": "stop:optimize-agents",
462
+ "description": "Check performance reviews and auto-optimize low-scoring agents at session end"
425
463
  }
426
464
  ],
427
- "TaskCompleted": [
465
+ "UserPromptSubmit": [
428
466
  {
429
467
  "matcher": "*",
430
468
  "hooks": [
431
469
  {
432
470
  "type": "command",
433
- "command": "node \"$HOME/.construct/lib/hooks/task-completed-guard.mjs\"",
434
- "timeout": 10
471
+ "command": "node \"$HOME/.construct/lib/hooks/context-watch.mjs\"",
472
+ "timeout": 5
435
473
  }
436
474
  ],
437
- "id": "team:task-completed-guard",
438
- "description": "Block task completion when Construct workflow validation fails"
475
+ "id": "prompt:context-watch",
476
+ "description": "Inject compaction guidance when session token usage crosses 60% / 80% thresholds"
477
+ },
478
+ {
479
+ "matcher": "*",
480
+ "hooks": [
481
+ {
482
+ "type": "command",
483
+ "command": "node \"$HOME/.construct/lib/hooks/ci-status-check.mjs\"",
484
+ "timeout": 5
485
+ }
486
+ ],
487
+ "id": "prompt:ci-status",
488
+ "description": "Inject remote CI status (gh run list) into agent context so red CI is visible immediately. Cached 60s."
439
489
  }
440
490
  ]
441
491
  },
@@ -455,11 +505,8 @@
455
505
  ]
456
506
  },
457
507
  "memory": {
458
- "command": "npx",
459
- "args": [
460
- "-y",
461
- "@modelcontextprotocol/server-memory"
462
- ]
508
+ "type": "http",
509
+ "url": "http://127.0.0.1:8765/"
463
510
  },
464
511
  "playwright": {
465
512
  "command": "npx",