@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
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * .construct/run.mjs — project-local Construct launcher.
4
+ *
5
+ * Resolves the right Construct install for the project and forwards every
6
+ * argument and stream to it. Settings.json hooks invoke this file
7
+ * (`node .construct/run.mjs hook <name>`) so the hook command is identical
8
+ * for every peer who clones the project, regardless of whether they have
9
+ * Construct globally installed or have run `npm install`.
10
+ *
11
+ * Resolution order:
12
+ *
13
+ * 0. `CONSTRUCT_DEV_PATH` env var — if set, points at a Construct checkout
14
+ * and the launcher invokes its `bin/construct`. Used for development
15
+ * and smoke tests; not consulted in normal runs.
16
+ *
17
+ * 1. Workspace `node_modules/@geraldmaron/construct/bin/construct` — if a
18
+ * `npm install` has materialised Construct in this project's node_modules,
19
+ * use that. Fastest, no network.
20
+ *
21
+ * 2. `npx -p @geraldmaron/construct@<version> construct …` — if Node ≥ 18
22
+ * is on PATH but the package isn't installed locally. npx caches the
23
+ * package after the first run. The version pin comes from
24
+ * `.construct/version` next to this file.
25
+ *
26
+ * 3. Globally installed `construct` on PATH — if neither of the above
27
+ * hit but the user has installed Construct globally.
28
+ *
29
+ * 4. Cached binary at `.construct/cache/bin/construct-<os>-<arch>` — if
30
+ * a previous bootstrap downloaded the matching single-file binary
31
+ * from GitHub Releases.
32
+ *
33
+ * 5. Docker container — if the docker daemon is reachable, invoke
34
+ * `ghcr.io/geraldmaron/construct:<pinned-version>` with the project
35
+ * bind-mounted at /work. Lets language-agnostic projects (no Node,
36
+ * no global construct, no binary) still execute hooks. Disable with
37
+ * `CONSTRUCT_DISABLE_DOCKER=1` for environments where docker is
38
+ * reachable but undesirable (e.g. CI runners that prefer fail-fast).
39
+ *
40
+ * 6. Print a precise error with the exact install commands and exit
41
+ * with the documented exit code (127 = command not found).
42
+ *
43
+ * The launcher is intentionally tiny and dependency-free so it never
44
+ * needs `npm install` to be runnable. It uses only Node's stdlib.
45
+ */
46
+
47
+ import { spawn, spawnSync } from 'node:child_process';
48
+ import { existsSync, readFileSync, statSync } from 'node:fs';
49
+ import { dirname, join, resolve } from 'node:path';
50
+ import { fileURLToPath } from 'node:url';
51
+
52
+ const HERE = dirname(fileURLToPath(import.meta.url));
53
+ const PROJECT_ROOT = resolve(HERE, '..');
54
+ const VERSION_FILE = join(HERE, 'version');
55
+ const CACHE_BIN_DIR = join(HERE, 'cache', 'bin');
56
+
57
+ function readPinnedVersion() {
58
+ try {
59
+ const v = readFileSync(VERSION_FILE, 'utf8').trim();
60
+ if (v && /^[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9.-]+)?$/.test(v)) return v;
61
+ } catch { /* file missing or unreadable */ }
62
+ return null;
63
+ }
64
+
65
+ function isExecutable(path) {
66
+ try {
67
+ return statSync(path).isFile();
68
+ } catch { return false; }
69
+ }
70
+
71
+ function commandOnPath(cmd) {
72
+ const probe = spawnSync(process.platform === 'win32' ? 'where' : 'which', [cmd], {
73
+ encoding: 'utf8',
74
+ });
75
+ if (probe.status !== 0) return null;
76
+ const first = probe.stdout.split(/\r?\n/).find(Boolean);
77
+ return first || null;
78
+ }
79
+
80
+ function runForeground(cmd, args, opts = {}) {
81
+ const child = spawn(cmd, args, {
82
+ stdio: 'inherit',
83
+ cwd: opts.cwd || PROJECT_ROOT,
84
+ env: { ...process.env, ...(opts.env || {}) },
85
+ });
86
+ child.on('exit', (code) => process.exit(code ?? 1));
87
+ child.on('error', (err) => {
88
+ process.stderr.write(`[construct] launcher failed to spawn ${cmd}: ${err.message}\n`);
89
+ process.exit(127);
90
+ });
91
+ }
92
+
93
+ function tryDevPath() {
94
+ const dev = process.env.CONSTRUCT_DEV_PATH;
95
+ if (!dev) return false;
96
+ const candidate = join(dev, 'bin', 'construct');
97
+ if (!isExecutable(candidate)) return false;
98
+ runForeground(process.execPath, [candidate, ...process.argv.slice(2)]);
99
+ return true;
100
+ }
101
+
102
+ function tryNodeModules() {
103
+ const candidate = join(
104
+ PROJECT_ROOT,
105
+ 'node_modules', '@geraldmaron', 'construct', 'bin', 'construct'
106
+ );
107
+ if (!isExecutable(candidate)) return false;
108
+ runForeground(process.execPath, [candidate, ...process.argv.slice(2)]);
109
+ return true;
110
+ }
111
+
112
+ function tryNpx(version) {
113
+ if (!commandOnPath('npx')) return false;
114
+ const spec = version ? `@geraldmaron/construct@${version}` : '@geraldmaron/construct';
115
+ runForeground('npx', ['-p', spec, '--', 'construct', ...process.argv.slice(2)]);
116
+ return true;
117
+ }
118
+
119
+ function tryGlobal() {
120
+ const found = commandOnPath('construct');
121
+ if (!found) return false;
122
+ runForeground(found, process.argv.slice(2));
123
+ return true;
124
+ }
125
+
126
+ function tryCachedBinary() {
127
+ const arch = process.arch === 'arm64' ? 'arm64' : 'x64';
128
+ const os = process.platform === 'darwin' ? 'darwin'
129
+ : process.platform === 'win32' ? 'windows'
130
+ : 'linux';
131
+ const ext = process.platform === 'win32' ? '.exe' : '';
132
+ const candidate = join(CACHE_BIN_DIR, `construct-${os}-${arch}${ext}`);
133
+ if (!isExecutable(candidate)) return false;
134
+ runForeground(candidate, process.argv.slice(2));
135
+ return true;
136
+ }
137
+
138
+ function tryDocker(version) {
139
+ if (process.env.CONSTRUCT_DISABLE_DOCKER === '1') return false;
140
+ if (!commandOnPath('docker')) return false;
141
+ // Confirm the daemon is reachable, not just that the CLI is installed.
142
+ const info = spawnSync('docker', ['info'], { stdio: 'ignore' });
143
+ if (info.status !== 0) return false;
144
+ const tag = version || 'latest';
145
+ const image = `ghcr.io/geraldmaron/construct:${tag}`;
146
+ const userHome = process.env.HOME || process.env.USERPROFILE || '';
147
+ const hostConstructDir = userHome ? join(userHome, '.construct') : null;
148
+ const dockerArgs = [
149
+ 'run', '--rm', '-i',
150
+ '-v', `${PROJECT_ROOT}:/work`,
151
+ '-w', '/work',
152
+ '-e', 'CONSTRUCT_PROJECT_ROOT=/work',
153
+ ];
154
+ if (hostConstructDir) {
155
+ dockerArgs.push('-v', `${hostConstructDir}:/data/.construct`);
156
+ }
157
+ dockerArgs.push(image, ...process.argv.slice(2));
158
+ runForeground('docker', dockerArgs);
159
+ return true;
160
+ }
161
+
162
+ function fail() {
163
+ const v = readPinnedVersion();
164
+ process.stderr.write(
165
+ '[construct] No Construct install found.\n' +
166
+ '\n' +
167
+ ' This project pins Construct' + (v ? ` ${v}` : '') + ' but no runtime resolved.\n' +
168
+ '\n' +
169
+ ' Pick one:\n' +
170
+ ' - Install Node.js 18+ from https://nodejs.org and re-run.\n' +
171
+ ' - Install Construct globally: npm install -g @geraldmaron/construct\n' +
172
+ ' - Install Docker: docker pull ghcr.io/geraldmaron/construct\n' +
173
+ ' - Bootstrap a binary: ./.construct/bootstrap.sh (POSIX)\n' +
174
+ ' powershell -File .construct/bootstrap.ps1 (Windows)\n'
175
+ );
176
+ process.exit(127);
177
+ }
178
+
179
+ const version = readPinnedVersion();
180
+
181
+ if (tryDevPath()) { /* spawned */ }
182
+ else if (tryNodeModules()) { /* spawned */ }
183
+ else if (tryNpx(version)) { /* spawned */ }
184
+ else if (tryGlobal()) { /* spawned */ }
185
+ else if (tryCachedBinary()) { /* spawned */ }
186
+ else if (tryDocker(version)) { /* spawned */ }
187
+ else fail();
@@ -5,23 +5,59 @@
5
5
  - **Deciders**: {names}
6
6
  - **Supersedes**: {ADR-NNN or none}
7
7
 
8
+ <!--
9
+ Before drafting, read rules/common/framing.md.
10
+
11
+ Required framing rule: every section below must describe the domain
12
+ problem and the decision. Not the ticket. Not the PRD filename. Not the
13
+ meeting that prompted the ADR. A principal engineer who has never seen
14
+ the triggering inputs should be able to read this doc and understand the
15
+ decision and why it was made.
16
+
17
+ Owning specialist: cx-architect (see rules/common/doc-ownership.md).
18
+ -->
19
+
20
+ ## Problem
21
+ <!--
22
+ The decision-forcing tension in the domain. State what is currently
23
+ true and what pressure makes a choice unavoidable.
24
+
25
+ Must NOT reference:
26
+ - Jira/Linear ticket IDs or titles
27
+ - PRD filenames or document structure
28
+ - Chat transcripts or meeting notes
29
+ - Process-level framing ("we need to decide how to document X")
30
+
31
+ Should reference:
32
+ - The constraint that makes this non-trivial
33
+ - The cost of not deciding
34
+ - What is observably broken, ambiguous, or at risk
35
+ -->
36
+
8
37
  ## Context
9
- <!-- The forces at play. What is true today that makes a decision necessary? What constraints bound the space? -->
38
+ <!-- Forces at play beyond the core problem. What else is true today that bounds the decision space? Prior ADRs, architectural constraints, external commitments. -->
10
39
 
11
40
  ## Decision
12
41
  <!-- The position taken, in one or two sentences. State it as a commitment, not a proposal. -->
13
42
 
14
43
  ## Rationale
15
- <!-- Why this decision over the alternatives. The load-bearing reasons. -->
44
+ <!-- Why this decision over the alternatives. The load-bearing reasons, cited to the evidence. If the rationale leans on external references (standards, prior art, vendor behavior), cite them. -->
16
45
 
17
- ## Consequences
18
- <!-- What becomes easier and what becomes harder once this is in effect. Include second-order effects. -->
46
+ ## Rejected alternatives
47
+ <!--
48
+ For each alternative considered, one paragraph covering:
49
+ - What the alternative was (concretely enough to be evaluated)
50
+ - The specific reason it was rejected (not "we preferred the chosen option")
51
+ - What evidence or constraint made it inferior
19
52
 
20
- ## Alternatives considered
21
- <!-- Other options and the specific reason each was rejected. One paragraph per alternative. -->
53
+ An ADR without rejected alternatives is a proposal, not a decision.
54
+ -->
55
+
56
+ ## Consequences
57
+ <!-- What becomes easier, what becomes harder, what is now locked in. Include second-order effects and the new constraints this decision imposes. -->
22
58
 
23
59
  ## Reversibility
24
- <!-- Is this a one-way or two-way door? What would it take to reverse? When would we revisit? -->
60
+ <!-- Is this a one-way or two-way door? What would it take to reverse? Under what conditions would we revisit? -->
25
61
 
26
62
  ## References
27
- <!-- Prior ADRs, PRDs, research, tickets, discussions. -->
63
+ <!-- Primary sources, prior ADRs, research briefs, standards. Execution artifacts (tickets, chat) may be listed for traceability but never as load-bearing reasoning. -->
@@ -0,0 +1,43 @@
1
+ # Changelog: {version} — {YYYY-MM-DD}
2
+
3
+ - **Version**: {semver or date-based tag}
4
+ - **Type**: major | minor | patch | hotfix
5
+ - **Authors**: {names}
6
+ - **Status**: draft | released
7
+
8
+ <!--
9
+ Keep entries user-facing. Describe what changed and why it matters, not how it
10
+ was implemented. Group under standard headings. Link to issues or PRDs when helpful.
11
+ -->
12
+
13
+ ## Added
14
+
15
+ <!-- New features, endpoints, capabilities, or commands. -->
16
+
17
+ ## Changed
18
+
19
+ <!-- Behaviour changes, interface updates, performance improvements. -->
20
+
21
+ ## Fixed
22
+
23
+ <!-- Bug fixes. Link to issue numbers when available. -->
24
+
25
+ ## Deprecated
26
+
27
+ <!-- Features that are still working but will be removed in a future release. -->
28
+
29
+ ## Removed
30
+
31
+ <!-- Features removed in this release. Note migration path if one exists. -->
32
+
33
+ ## Security
34
+
35
+ <!-- Vulnerability fixes. Reference CVE numbers if applicable. -->
36
+
37
+ ## Migration notes
38
+
39
+ <!-- Breaking changes and what users need to do. Omit section if none. -->
40
+
41
+ ## References
42
+
43
+ <!-- PRDs, RFCs, ADRs, or tracker issues that drove this release. -->
@@ -0,0 +1,149 @@
1
+ # Welcome to Construct
2
+
3
+ This file was generated by `construct init` to help you get oriented. It's safe to edit — Construct only writes it once, then leaves it alone.
4
+
5
+ **Full docs:** [https://geraldmaron.github.io/construct/v2/](https://geraldmaron.github.io/construct/v2/)
6
+
7
+ ## What Construct is doing in your project
8
+
9
+ You added Construct as a dev dependency. That gave you:
10
+
11
+ - **One AI persona to address: `@construct`.** In your editor (Claude Code, OpenCode, Codex, Cursor, or Copilot), you talk to one entity. Behind the scenes, 28 specialists (architect, engineer, security, SRE, designer, …) pick up the work based on what you asked for.
12
+ - **Hard gates.** Every code change runs through commit-time policy: no secrets, tests green, docs current, comments lint-clean. Bypass exists for every gate but leaves an audit trail.
13
+ - **Persistent state.** Your active work, decisions, and history survive across sessions and editor restarts.
14
+
15
+ You don't need to manage any of that — it all runs locally.
16
+
17
+ ## Files Construct created in your project
18
+
19
+ You'll see these in `git status`:
20
+
21
+ | Path | What it is | Touch? |
22
+ |---|---|---|
23
+ | `.construct/` | Launcher for hooks. Don't edit. Regenerated on `npm install`. | No |
24
+ | `.claude/agents/` | The 29 persona definitions. Regenerated on `npm install`. | No |
25
+ | `.claude/commands/` | Slash commands. Regenerated on `npm install`. | No |
26
+ | `.claude/settings.json` | Hooks + MCP server config. Construct keys are managed; your additions are preserved. | Carefully |
27
+ | `.cx/` | Per-project session state (active work, recent decisions). Construct writes here. | Read-mostly |
28
+ | `.beads/` | Issue tracker data. Use `bd <cmd>` to interact. | Via CLI |
29
+ | `AGENTS.md` | Operating rules the agent reads at session start. | Yes — your house rules go here |
30
+ | `plan.md` | Active work plan. Local-only (gitignored). | Yes — your current focus |
31
+ | `docs/` | Documentation lanes (ADRs, PRDs, memos, …). | Yes — this is your team's docs |
32
+ | `construct_guide.md` | This file. Friendly orientation. | Yes — adapt to your team |
33
+
34
+ ## Where to drop information you want Construct to use
35
+
36
+ Three intake paths, ordered by formality:
37
+
38
+ 1. **`.cx/inbox/`** — drop a file here (URL, screenshot, paste, anything). The embed daemon watches the directory; when a file lands, it ingests it into the local knowledge base within a second or two and writes a triage packet to `.cx/intake/pending/` describing the new content, its R&D classification (intake type, stage, owner persona, recommended chain), its suggested docs lane, and existing docs that overlap. The agent surfaces pending intake at the next session start and you can ask it to process them — propose updates to existing PRDs/RFCs/ADRs or scaffold new ones — based on the prepared context.
39
+ 2. **`docs/intake/`** — for proper intake batches (research notes, evidence from a meeting, raw source material). Has a template. Survives in git history.
40
+ 3. **`AGENTS.md`** — for rules and conventions you want the agent to follow every time. "We prefer functional components. Don't introduce new dependencies without flagging." Read at session start.
41
+
42
+ For URLs or quick notes, the easiest path is to drop a file into `~/Downloads` and run:
43
+
44
+ ```bash
45
+ construct drop # ingests the most recent download/desktop file
46
+ ```
47
+
48
+ ## How to talk to Construct
49
+
50
+ In your editor:
51
+
52
+ ```
53
+ @construct help me add OAuth to the login flow
54
+ ```
55
+
56
+ Construct will classify the request, route to the right specialists (architect for design, engineer for implementation, security for review), and stream results back to you in one conversation.
57
+
58
+ You can also invoke a specialist directly if you know what you want:
59
+
60
+ ```
61
+ @cx-security audit the auth middleware for OWASP top 10
62
+ ```
63
+
64
+ The full list of personas lives in `.claude/agents/`. Run `construct list` to see them with descriptions.
65
+
66
+ ## How to change Construct settings
67
+
68
+ Two scopes:
69
+
70
+ **Per-project** (committed, shared with peers): edit `.claude/settings.json`. Construct owns the `hooks` block and a known set of `mcpServers` keys (memory, context7, playwright, github, sequential-thinking, construct-mcp); your additions are preserved on `npm install`. Other top-level keys are yours to control.
71
+
72
+ **Per-machine** (private to you): edit `~/.construct/config.env`. This is where your API keys, consent flags, and local-service credentials live. Standard `KEY=value` format.
73
+
74
+ After editing settings, run:
75
+
76
+ ```bash
77
+ construct sync # regenerate platform adapters from any registry changes
78
+ construct doctor # verify everything's healthy
79
+ ```
80
+
81
+ ## Local services
82
+
83
+ If you ran `construct setup` and have Docker, you have three things running locally on Construct's reserved port block (`54329-54339`, chosen to avoid colliding with Next.js, Postgres, Redis, etc.):
84
+
85
+ **Telemetry backend** (LLM observability — see your traces, costs, and quality scores)
86
+
87
+ - URL: <http://localhost:54330>
88
+
89
+ **Postgres + pgvector** (the database that backs hybrid retrieval)
90
+
91
+ - URL: `postgresql://construct:construct@127.0.0.1:54329/construct`
92
+ - Saved as `DATABASE_URL` in `~/.construct/config.env`
93
+
94
+ **Vector storage** (semantic search over your project + ingested docs)
95
+
96
+ - Backend: Postgres + pgvector (384d embeddings, `Xenova/all-MiniLM-L6-v2` model)
97
+ - Model auto-downloaded to `~/.construct/cache/embeddings/` on first use (~22 MB, one time)
98
+ - Run `construct search "your query"` to see it work
99
+
100
+ If you skipped Docker, Construct falls back to a local JSON vector index at `~/.construct/vector/index.json` and stops emitting traces — semantic search still works, just slower at scale, and the telemetry backend isn't available.
101
+
102
+ All ports bind to `127.0.0.1` only; nothing is reachable from other machines on your network.
103
+
104
+ ## Useful commands
105
+
106
+ | Command | What it does |
107
+ |---|---|
108
+ | `construct setup` | One-time per-machine: spins up local services, writes config |
109
+ | `construct config [mode <m>]` | Show active deployment mode (solo / team / enterprise) or set a new one |
110
+ | `construct doctor` | Health check across config, services, agents, hooks |
111
+ | `construct sync` | Regenerate platform adapters (Claude Code, OpenCode, Codex, Cursor) |
112
+ | `construct up` / `construct down` | Start / stop local services |
113
+ | `construct status` | Live runtime status (services, providers, daemons) |
114
+ | `construct intake list / show / done / skip / reopen` | Drive the R&D intake queue produced from `.cx/inbox/` |
115
+ | `construct graph from-intake <id>` | Generate a task graph from a triaged intake packet |
116
+ | `construct drop` | Ingest the most recent downloaded file |
117
+ | `construct search "..."` | Hybrid file + SQL + semantic search over project state |
118
+ | `construct uninstall` | Interactive teardown — never touches Docker or your code |
119
+
120
+ Full reference: <https://geraldmaron.github.io/construct/v2/docs/reference/cli>
121
+
122
+ ## Updating Construct
123
+
124
+ ```bash
125
+ npm update @geraldmaron/construct
126
+ ```
127
+
128
+ That refreshes the agents, hooks, and slash commands in `.claude/` and `.construct/`. Your `.cx/`, `AGENTS.md`, `plan.md`, and `docs/` content is untouched.
129
+
130
+ ## When things go wrong
131
+
132
+ ```bash
133
+ construct doctor # most issues surface here with a fix hint
134
+ construct down && construct up # restart local services
135
+ ```
136
+
137
+ Troubleshooting guide: <https://geraldmaron.github.io/construct/v2/docs/operations/troubleshooting>
138
+
139
+ ## Next steps
140
+
141
+ - [Connect your editor](https://geraldmaron.github.io/construct/v2/docs/start/connect-your-editor) if you haven't already.
142
+ - [Run your first task](https://geraldmaron.github.io/construct/v2/docs/start/first-task) to feel the flow.
143
+ - Skim [the architecture](https://geraldmaron.github.io/construct/v2/docs/concepts/architecture) when you have 10 minutes — it'll save you hours later.
144
+
145
+ If you'd rather have a teammate walk you through it, the persona itself can:
146
+
147
+ ```
148
+ @construct give me a tour of this project — what's wired up, what's optional, what should I look at first
149
+ ```
@@ -19,13 +19,13 @@ source lists or grouped findings. Keep em dashes rare.
19
19
  <!-- State the minimum signal needed to proceed. Example: two independent customers, three repeated mentions, or one severe enterprise blocker. -->
20
20
 
21
21
  ## Sources
22
- <!-- Table: source, date, customer or actor, link/path, confidence. -->
22
+ <!-- Table: source, source class, date/access date, customer or actor, link/path, confidence, and whether it is direct evidence or secondhand summary. -->
23
23
 
24
24
  ## What we observed
25
25
  <!-- Factual observations only. Separate direct evidence from interpretation. -->
26
26
 
27
27
  ## Patterns
28
- <!-- Synthesized themes across sources. Include strength of signal and counter-evidence. -->
28
+ <!-- Synthesized themes across sources. Include strength of signal, counter-evidence, and whether themes are observation or inference. -->
29
29
 
30
30
  ## Open asks
31
31
  <!-- Customer or stakeholder asks that are not yet committed requirements. -->
@@ -16,41 +16,162 @@ Write with a balance of structured paragraphs, compact tables, and selective bul
16
16
  Avoid a wall of bullets. Keep em dashes rare; prefer commas, periods, or parentheses.
17
17
  -->
18
18
 
19
- ## Purpose
20
- <!-- One or two paragraphs. What product practice or system this Meta PRD improves, and why that matters now. -->
19
+ ## Summary
20
+ <!--
21
+ One paragraph (3-5 sentences). What product practice or operating system is
22
+ being defined or changed, who runs it, and what becomes different about how
23
+ the org decides, documents, or evaluates work once this ships.
24
+ -->
25
+
26
+ ## Background
27
+ <!--
28
+ The current state of the operating system: which workflow, template, eval
29
+ loop, or governance process is in play today, and what's actually happening
30
+ when teams or agents use it. Cite real examples — recent PRDs, prior decisions,
31
+ trace evidence, support tickets — not hypotheticals.
32
+ -->
33
+
34
+ ## Problem
35
+ <!--
36
+ The failure mode in the current process. Name who feels it, how often, and
37
+ what breaks downstream. Keep solutions out of this section.
38
+
39
+ Examples of the right shape:
40
+ - "PRDs ship without rejected alternatives, so reviewers re-litigate decisions
41
+ three weeks in. Happens on ~40% of PRDs in the last quarter."
42
+ - "Postmortems are written by the on-call who shipped the bug, so the action
43
+ items reflect their proposals — not independent review."
44
+ -->
21
45
 
22
- ## Operating problem
23
- <!-- Describe the failure mode in the current process. Name who feels it, how often, and what breaks downstream. -->
46
+ ## Goals
47
+ <!--
48
+ What success looks like for the operating system. Three to five outcomes max.
49
+ Examples: "PRDs cite primary sources by default", "Postmortems get peer
50
+ review before publish", "ADR rejection rate drops from 60% to under 20%".
51
+ -->
24
52
 
25
- ## Scope
26
- <!-- What part of the product operating system changes. Include the teams, agents, templates, workflows, tools, or decision points affected. -->
53
+ ## Outcome
54
+ <!--
55
+ What is concretely different about how work moves through the org once this
56
+ operating model is adopted. Written from the practitioner's perspective:
57
+ "When I open a PRD, I'm prompted to record rejected alternatives before
58
+ the doc enters review."
59
+ -->
60
+
61
+ ## In scope and out of scope
62
+
63
+ | | Description |
64
+ |---|---|
65
+ | **In scope** | <which templates, workflows, agents, gates, or evals are touched> |
66
+ | **Out of scope** | <related operating systems explicitly deferred — name the reason> |
67
+ | **Adjacent (deferred)** | <natural follow-up changes not in this Meta PRD> |
27
68
 
28
69
  ## Principles
29
- <!-- A short list of durable rules this system must preserve. Keep each principle testable enough to guide tradeoffs. -->
70
+ <!--
71
+ Durable rules this operating system must preserve across phases. Each
72
+ principle should be testable enough to guide tradeoffs when phases conflict.
73
+ -->
30
74
 
31
75
  ## Inputs and evidence
32
- <!-- What evidence the system consumes: customer notes, interviews, traces, Jira issues, PRDs, research, analytics, support tickets, or prior decisions. State minimum evidence thresholds where useful. -->
76
+ <!--
77
+ What evidence the system consumes — customer notes, interviews, traces, Jira
78
+ issues, PRDs, research, analytics, support tickets, prior decisions. State
79
+ minimum evidence thresholds where useful (e.g. "two independent customer
80
+ interviews before a PRD enters review").
81
+ -->
82
+
83
+ ## Phases
84
+
85
+ <!--
86
+ Each phase below holds its own goal, status, workflow requirements (MR),
87
+ and document + evaluation requirements (DR), with acceptance criteria
88
+ inline next to each. Use `MR-<phase>.<n>` and `DR-<phase>.<n>` so
89
+ requirements can be referenced from reviews, traces, and evals.
90
+
91
+ MR = Workflow requirement: how the process or agent workflow must behave;
92
+ observable in generated artifacts, workflow state, or tool behavior.
93
+
94
+ DR = Document + evaluation requirement: how outputs are shaped, reviewed,
95
+ and scored; required sections, evidence rules, citation rules, formatting
96
+ constraints, anti-patterns, rubric dimensions, pass/fail checks.
33
97
 
34
- ## Workflow requirements
35
- <!-- Numbered requirements for the process or agent workflow. Use MR-1, MR-2, etc. Each requirement should be observable in generated artifacts, workflow state, or tool behavior. -->
98
+ Status values: not started | in progress | shipped | deferred.
99
+ -->
100
+
101
+ ### Phase 1 — <name>
102
+
103
+ - **Goal**: <what this phase delivers>
104
+ - **Status**: not started
105
+
106
+ **Workflow**
107
+
108
+ - **MR-1.1** — <imperative statement of how the workflow must behave>
109
+ - *Acceptance*: <how a reviewer or trace verifies this without asking the author>
110
+ - **MR-1.2** — <...>
111
+ - *Acceptance*: <...>
112
+
113
+ **Document + evaluation**
114
+
115
+ - **DR-1.1** — <required section, evidence rule, citation rule, formatting constraint, or anti-pattern>
116
+ - *Acceptance*: <rubric dimension, pass/fail check, or trace signal that proves it>
117
+
118
+ ### Phase 2 — <name>
119
+
120
+ - **Goal**: <what this phase delivers>
121
+ - **Status**: not started
122
+
123
+ **Workflow**
124
+
125
+ - **MR-2.1** — <...>
126
+ - *Acceptance*: <...>
127
+ - **MR-2.2** — <...>
128
+ - *Acceptance*: <...>
129
+
130
+ **Document + evaluation**
36
131
 
37
- ## Document standards
38
- <!-- Required sections, tone, evidence rules, citation rules, formatting constraints, and anti-patterns. State how this differs from a normal PRD. -->
132
+ - **DR-2.1** — <...>
133
+ - *Acceptance*: <...>
134
+
135
+ ### Phase 3 — <name>
136
+
137
+ - **Goal**: <what this phase delivers>
138
+ - **Status**: not started
139
+
140
+ **Workflow**
141
+
142
+ - **MR-3.1** — <...>
143
+ - *Acceptance*: <...>
144
+
145
+ **Document + evaluation**
146
+
147
+ - **DR-3.1** — <...>
148
+ - *Acceptance*: <...>
39
149
 
40
150
  ## Human approval gates
41
- <!-- Where a person must review, approve, reject, or supply missing context before the system writes externally or treats a document as approved. -->
151
+ <!--
152
+ Where a person must review, approve, reject, or supply missing context before
153
+ the system writes externally or treats a document as approved. Name the gate,
154
+ the reviewer role, and the timeout policy if no reviewer responds.
155
+ -->
42
156
 
43
- ## Evaluation
44
- <!-- How quality will be measured. Include rubric dimensions, pass/fail checks, trace evidence, and examples of unacceptable output. -->
157
+ ## Failure modes and mitigations
45
158
 
46
- ## Failure modes
47
- <!-- What could go wrong if the system is followed too literally, over-automated, or used with weak evidence. Include mitigations. -->
159
+ | Failure mode | Likelihood | Impact | Mitigation |
160
+ |---|---|---|---|
161
+ | <how this could go wrong if followed too literally, over-automated, or used with weak evidence> | low / med / high | low / med / high | <guardrail or escape hatch> |
48
162
 
49
163
  ## Rollout
50
- <!-- How this operating model becomes the default. Include migration steps, owners, training, and when older templates or workflows are retired. -->
164
+ <!--
165
+ How this operating model becomes the default. Migration steps, owners,
166
+ training, deprecation date for the older template or workflow. Name what
167
+ happens to in-flight work (grandfathered or migrated).
168
+ -->
51
169
 
52
170
  ## Open questions
53
- <!-- Questions that could change the operating model. Each should have an owner and decision date. -->
171
+
172
+ | Question | Owner | Decision needed by |
173
+ |---|---|---|
174
+ | <unknown that could change the operating model> | <name> | <YYYY-MM-DD> |
54
175
 
55
176
  ## References
56
177
  <!-- Linked examples, prior PRDs, Meta PRDs, research, tickets, traces, or decisions. -->