@geraldmaron/construct 1.4.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/.env.example +36 -0
  2. package/README.md +41 -7
  3. package/bin/construct +1027 -64
  4. package/examples/distribution/sources/deck-one-pager.md +1 -1
  5. package/lib/acp/server.mjs +21 -7
  6. package/lib/adapters-sync.mjs +2 -1
  7. package/lib/audit-trail.mjs +185 -2
  8. package/lib/beads/auto-close.mjs +2 -1
  9. package/lib/beads/drift.mjs +2 -1
  10. package/lib/bridges/copilot-proxy.mjs +20 -5
  11. package/lib/certification/skill-inventory.mjs +10 -1
  12. package/lib/cli/approvals.mjs +147 -0
  13. package/lib/cli-commands.mjs +105 -14
  14. package/lib/comment-lint.mjs +127 -8
  15. package/lib/config/schema.mjs +6 -29
  16. package/lib/config/source-target-registry.mjs +70 -0
  17. package/lib/config/source-targets.mjs +179 -205
  18. package/lib/contracts/coverage.mjs +77 -0
  19. package/lib/contracts/validate.mjs +102 -13
  20. package/lib/contracts/violation-log.mjs +50 -4
  21. package/lib/db/migrate.mjs +69 -0
  22. package/lib/db/migrations/001_orchestration_runs.sql +9 -0
  23. package/lib/db/migrations/002_queue_provider.sql +50 -0
  24. package/lib/db/migrations/003_worker_registry.sql +17 -0
  25. package/lib/db/migrations/004_trace_events.sql +16 -0
  26. package/lib/db/migrations/005_shared_memory.sql +15 -0
  27. package/lib/db/migrations/006_orchestration_runs_tenant.sql +5 -0
  28. package/lib/decisions/enforced-baseline.json +0 -2
  29. package/lib/decisions/registry.mjs +3 -2
  30. package/lib/deployment/parity-contract.mjs +1 -1
  31. package/lib/deployment-mode.mjs +78 -2
  32. package/lib/diagram-export.mjs +10 -1
  33. package/lib/distill.mjs +5 -2
  34. package/lib/docs-verify.mjs +2 -1
  35. package/lib/doctor/cli.mjs +1 -0
  36. package/lib/doctor/command-on-path.mjs +24 -0
  37. package/lib/doctor/diagnosis.mjs +89 -0
  38. package/lib/doctor/embedding-health.mjs +50 -0
  39. package/lib/doctor/engine-health.mjs +93 -0
  40. package/lib/doctor/graph-validate.mjs +47 -0
  41. package/lib/doctor/index.mjs +18 -4
  42. package/lib/doctor/sidecar-providers.mjs +56 -0
  43. package/lib/doctor/watchers/consistency.mjs +93 -1
  44. package/lib/doctor/watchers/cx-budget.mjs +1 -1
  45. package/lib/doctor/watchers/graph-staleness.mjs +1 -1
  46. package/lib/doctor/watchers/mcp-protocol.mjs +17 -0
  47. package/lib/doctor/watchers/oracle-liveness.mjs +92 -0
  48. package/lib/doctor/watchers/orchestration-runs.mjs +108 -0
  49. package/lib/doctor/watchers/provider-breaker.mjs +78 -0
  50. package/lib/document-export.mjs +52 -27
  51. package/lib/document-extract/docling-client.mjs +9 -5
  52. package/lib/document-extract/docling-sidecar.py +30 -0
  53. package/lib/document-extract.mjs +1 -1
  54. package/lib/document-ingest.mjs +9 -0
  55. package/lib/embed/approval-queue.mjs +184 -88
  56. package/lib/embed/authority-guard.mjs +65 -2
  57. package/lib/embed/capability-jobs.mjs +365 -0
  58. package/lib/embed/capability-lifecycle.mjs +219 -0
  59. package/lib/embed/capability-loader.mjs +303 -0
  60. package/lib/embed/capability-runtime.mjs +58 -0
  61. package/lib/embed/cli.mjs +185 -8
  62. package/lib/embed/config.mjs +4 -0
  63. package/lib/embed/daemon.mjs +125 -6
  64. package/lib/embed/demand-fetch.mjs +190 -54
  65. package/lib/embed/inbox.mjs +12 -10
  66. package/lib/embed/presets/ops-triage.mjs +236 -0
  67. package/lib/embed/presets/pm-feedback.mjs +341 -0
  68. package/lib/embed/presets/tpm.mjs +401 -0
  69. package/lib/embed/providers/jira.mjs +72 -1
  70. package/lib/embed/providers/registry.mjs +140 -33
  71. package/lib/embedded-contract/capability.mjs +4 -0
  72. package/lib/embedded-contract/execution.mjs +1 -1
  73. package/lib/embedded-contract/model-resolve.mjs +53 -3
  74. package/lib/embedded-contract/workflow-defs.mjs +48 -73
  75. package/lib/embedded-contract/workflow-invoke.mjs +144 -4
  76. package/lib/embedded-contract/workflows/architecture-review.manifest.json +15 -0
  77. package/lib/embedded-contract/workflows/data-structure.manifest.json +14 -0
  78. package/lib/embedded-contract/workflows/evidence-ingest.manifest.json +14 -0
  79. package/lib/embedded-contract/workflows/memo-draft.manifest.json +14 -0
  80. package/lib/embedded-contract/workflows/operations-triage.manifest.json +18 -0
  81. package/lib/embedded-contract/workflows/operations.manifest.json +18 -0
  82. package/lib/embedded-contract/workflows/pm-feedback.manifest.json +18 -0
  83. package/lib/embedded-contract/workflows/prd-draft.manifest.json +15 -0
  84. package/lib/embedded-contract/workflows/proposal-review.manifest.json +15 -0
  85. package/lib/embedded-contract/workflows/research-synthesis.manifest.json +14 -0
  86. package/lib/embedded-contract/workflows/risk-review.manifest.json +15 -0
  87. package/lib/embedded-contract/workflows/structure-notes.manifest.json +14 -0
  88. package/lib/embedded-contract/workflows/transcript-process.manifest.json +14 -0
  89. package/lib/embedded-contract/workflows/triage.manifest.json +14 -0
  90. package/lib/env-config.mjs +50 -9
  91. package/lib/extensions/index.mjs +27 -0
  92. package/lib/extensions/loader.mjs +120 -0
  93. package/lib/extensions/manifest-schema.mjs +141 -0
  94. package/lib/extensions/manifests/anthropic.manifest.json +12 -0
  95. package/lib/extensions/manifests/atlassian-confluence.manifest.json +12 -0
  96. package/lib/extensions/manifests/atlassian-jira.manifest.json +53 -0
  97. package/lib/extensions/manifests/directory.manifest.json +12 -0
  98. package/lib/extensions/manifests/docling.manifest.json +37 -0
  99. package/lib/extensions/manifests/echo.manifest.json +8 -0
  100. package/lib/extensions/manifests/feedback.manifest.json +12 -0
  101. package/lib/extensions/manifests/github-copilot.manifest.json +12 -0
  102. package/lib/extensions/manifests/github.manifest.json +52 -0
  103. package/lib/extensions/manifests/linear.manifest.json +50 -0
  104. package/lib/extensions/manifests/local.manifest.json +12 -0
  105. package/lib/extensions/manifests/ollama.manifest.json +12 -0
  106. package/lib/extensions/manifests/openai.manifest.json +12 -0
  107. package/lib/extensions/manifests/openrouter-anthropic.manifest.json +12 -0
  108. package/lib/extensions/manifests/openrouter-deepseek.manifest.json +12 -0
  109. package/lib/extensions/manifests/openrouter-google.manifest.json +12 -0
  110. package/lib/extensions/manifests/openrouter-llama.manifest.json +12 -0
  111. package/lib/extensions/manifests/openrouter-qwen.manifest.json +12 -0
  112. package/lib/extensions/manifests/openrouter.manifest.json +12 -0
  113. package/lib/extensions/manifests/postgres.manifest.json +12 -0
  114. package/lib/extensions/manifests/salesforce.manifest.json +12 -0
  115. package/lib/extensions/manifests/slack.manifest.json +58 -0
  116. package/lib/extensions/manifests/whisper.manifest.json +36 -0
  117. package/lib/extensions/validate.mjs +175 -0
  118. package/lib/features.mjs +13 -9
  119. package/lib/flows/checkpoint.mjs +184 -0
  120. package/lib/flows/constants.mjs +27 -0
  121. package/lib/flows/define.mjs +146 -0
  122. package/lib/flows/engine.mjs +249 -0
  123. package/lib/flows/errors.mjs +19 -0
  124. package/lib/flows/index.mjs +27 -0
  125. package/lib/flows/joins.mjs +18 -0
  126. package/lib/flows/schema.mjs +90 -0
  127. package/lib/flows/state.mjs +31 -0
  128. package/lib/frameworks/loader.mjs +99 -0
  129. package/lib/frameworks/schema.mjs +157 -0
  130. package/lib/graph/build-from-corpus.mjs +67 -0
  131. package/lib/graph/build-from-embed.mjs +82 -0
  132. package/lib/graph/build-from-registry.mjs +164 -3
  133. package/lib/graph/cli.mjs +456 -12
  134. package/lib/graph/gap-queries.mjs +156 -0
  135. package/lib/graph/gaps.mjs +41 -0
  136. package/lib/graph/impacted.mjs +129 -0
  137. package/lib/graph/runtime-evidence.mjs +177 -0
  138. package/lib/graph/security-coverage.mjs +113 -0
  139. package/lib/graph/staleness.mjs +241 -10
  140. package/lib/graph/store.mjs +24 -7
  141. package/lib/graph/validate.mjs +161 -0
  142. package/lib/headhunt.mjs +9 -8
  143. package/lib/health-check.mjs +15 -7
  144. package/lib/hook-health.mjs +1 -1
  145. package/lib/hooks/agent-tracker.mjs +10 -4
  146. package/lib/hooks/edit-guard.mjs +3 -3
  147. package/lib/hooks/graph-impact-advisory.mjs +2 -2
  148. package/lib/hooks/guard-bash.mjs +41 -15
  149. package/lib/hooks/mcp-health-check.mjs +11 -4
  150. package/lib/hooks/model-fallback.mjs +50 -6
  151. package/lib/hooks/orchestration-dispatch-guard.mjs +14 -3
  152. package/lib/hooks/pre-compact.mjs +181 -173
  153. package/lib/hooks/rule-verifier.mjs +2 -1
  154. package/lib/hooks/session-reflect.mjs +2 -1
  155. package/lib/hooks/session-start.mjs +3 -3
  156. package/lib/host-capabilities.mjs +13 -2
  157. package/lib/host-disposition.mjs +19 -7
  158. package/lib/identity.mjs +92 -0
  159. package/lib/ingest/degraded-extract.mjs +96 -0
  160. package/lib/ingest/docling-remote.mjs +2 -1
  161. package/lib/ingest/provider-extract.mjs +7 -19
  162. package/lib/ingest/sidecar-providers.mjs +196 -0
  163. package/lib/ingest-tooling.mjs +11 -5
  164. package/lib/init-unified.mjs +55 -38
  165. package/lib/init-update.mjs +2 -1
  166. package/lib/install/legacy-global-cleanup.mjs +25 -0
  167. package/lib/intake/daemon.mjs +99 -8
  168. package/lib/intake/git-queue.mjs +110 -38
  169. package/lib/intake/queue-registry.mjs +50 -0
  170. package/lib/intake/queue.mjs +133 -17
  171. package/lib/intake/session-prelude.mjs +57 -8
  172. package/lib/integrations/intake-integrations.mjs +61 -111
  173. package/lib/intent-classifier.mjs +43 -5
  174. package/lib/libreoffice-export.mjs +8 -8
  175. package/lib/logging/rotate.mjs +5 -4
  176. package/lib/mcp/broker.mjs +332 -17
  177. package/lib/mcp/denied-store.mjs +95 -0
  178. package/lib/mcp/destructive-gate.mjs +30 -0
  179. package/lib/mcp/dispatch-envelope.mjs +199 -0
  180. package/lib/mcp/memory-bridge.mjs +2 -1
  181. package/lib/mcp/server.mjs +154 -1411
  182. package/lib/mcp/tool-definitions-memory.mjs +376 -0
  183. package/lib/mcp/tool-definitions-project.mjs +271 -0
  184. package/lib/mcp/tool-definitions-skills.mjs +311 -0
  185. package/lib/mcp/tool-definitions-workflow.mjs +398 -0
  186. package/lib/mcp/tool-definitions.mjs +25 -0
  187. package/lib/mcp/tool-registry.mjs +107 -0
  188. package/lib/mcp/tool-safety.mjs +1 -0
  189. package/lib/mcp/tools/orchestration-delegation-next.tool.mjs +68 -0
  190. package/lib/mcp/tools/orchestration-run.mjs +165 -25
  191. package/lib/mcp/tools/orchestration-task-result.tool.mjs +77 -0
  192. package/lib/mcp/tools/provider-write.mjs +187 -0
  193. package/lib/mcp/tools/scope.mjs +0 -3
  194. package/lib/mcp/tools/skills.mjs +1 -1
  195. package/lib/mcp/tools/storage.mjs +0 -8
  196. package/lib/mcp/transport/auth.mjs +238 -0
  197. package/lib/mcp/transport/http.mjs +136 -0
  198. package/lib/mcp/transport/mode.mjs +31 -0
  199. package/lib/mcp/transport/stdio.mjs +22 -0
  200. package/lib/mcp-catalog.json +4 -4
  201. package/lib/mcp-manager.mjs +34 -23
  202. package/lib/mcp-platform-config.mjs +31 -7
  203. package/lib/mode-capabilities.mjs +109 -0
  204. package/lib/model-router.mjs +42 -9
  205. package/lib/models/catalog.mjs +40 -1
  206. package/lib/net-guard.mjs +247 -0
  207. package/lib/observation-store.mjs +6 -2
  208. package/lib/ollama/provision-context.mjs +2 -1
  209. package/lib/opencode-config.mjs +22 -3
  210. package/lib/opencode-runtime-plugin.mjs +120 -2
  211. package/lib/oracle/actions.mjs +204 -10
  212. package/lib/oracle/cli.mjs +24 -3
  213. package/lib/oracle/dispatch.mjs +2 -1
  214. package/lib/oracle/execute.mjs +2 -2
  215. package/lib/oracle/gaps.mjs +3 -3
  216. package/lib/oracle/heartbeat.mjs +53 -0
  217. package/lib/oracle/read-model.mjs +69 -13
  218. package/lib/oracle/reconcile.mjs +3 -46
  219. package/lib/oracle/routing.mjs +37 -31
  220. package/lib/oracle/synthesize.mjs +1 -1
  221. package/lib/orchestration/classification.mjs +434 -0
  222. package/lib/orchestration/delegation-flow.mjs +132 -0
  223. package/lib/orchestration/flow-selection.mjs +418 -0
  224. package/lib/orchestration/gates.mjs +244 -0
  225. package/lib/orchestration/host-sampling.mjs +121 -0
  226. package/lib/orchestration/policy-constants.mjs +48 -0
  227. package/lib/orchestration/provider-outcome.mjs +197 -0
  228. package/lib/orchestration/readiness.mjs +114 -13
  229. package/lib/orchestration/run-store-postgres.mjs +32 -26
  230. package/lib/orchestration/run-store-sqlite.mjs +8 -14
  231. package/lib/orchestration/run-store.mjs +25 -12
  232. package/lib/orchestration/runtime.mjs +446 -39
  233. package/lib/orchestration/store.mjs +87 -12
  234. package/lib/orchestration/trace-store.mjs +125 -0
  235. package/lib/orchestration/web-capability.mjs +3 -2
  236. package/lib/orchestration/worker-runtime.mjs +162 -0
  237. package/lib/orchestration/worker.mjs +528 -89
  238. package/lib/orchestration-policy.mjs +67 -1111
  239. package/lib/packs/cli.mjs +144 -0
  240. package/lib/packs/core-pack.mjs +112 -0
  241. package/lib/packs/enablement.mjs +187 -0
  242. package/lib/packs/index.mjs +23 -0
  243. package/lib/packs/loader.mjs +176 -0
  244. package/lib/packs/manifest-schema.mjs +58 -0
  245. package/lib/packs/prompts.mjs +120 -0
  246. package/lib/packs/validate.mjs +208 -0
  247. package/lib/plugin-registry.mjs +4 -5
  248. package/lib/policy/audit-gate.mjs +42 -0
  249. package/lib/policy/consumption-budget.mjs +149 -0
  250. package/lib/policy/engine.mjs +81 -6
  251. package/lib/policy/role-authority.mjs +89 -0
  252. package/lib/prompt-composer.js +19 -3
  253. package/lib/providers/contract/adapters/confluence/governed-write.mjs +215 -0
  254. package/lib/providers/contract/adapters/confluence/manifest.json +17 -0
  255. package/lib/providers/contract/adapters/confluence/transport.mjs +135 -0
  256. package/lib/providers/contract/adapters/github/governed-write.mjs +121 -0
  257. package/lib/providers/contract/adapters/github/index.mjs +38 -3
  258. package/lib/providers/contract/adapters/jira/adf.mjs +151 -0
  259. package/lib/providers/contract/adapters/jira/createmeta.mjs +143 -0
  260. package/lib/providers/contract/adapters/jira/governed-write.mjs +182 -0
  261. package/lib/providers/contract/adapters/jira/manifest.json +17 -0
  262. package/lib/providers/contract/adapters/jira/transport.mjs +119 -0
  263. package/lib/providers/contract.mjs +207 -0
  264. package/lib/providers/credential-bootstrap.mjs +7 -4
  265. package/lib/providers/credential-sources.mjs +14 -2
  266. package/lib/providers/directory/index.mjs +261 -0
  267. package/lib/providers/feedback/index.mjs +392 -0
  268. package/lib/providers/filter-audit.mjs +68 -0
  269. package/lib/providers/filter-schema.mjs +54 -0
  270. package/lib/providers/github/index.mjs +31 -0
  271. package/lib/providers/instance-config.mjs +215 -0
  272. package/lib/providers/op-locate.mjs +96 -0
  273. package/lib/providers/op-run.mjs +64 -9
  274. package/lib/providers/registry.mjs +26 -3
  275. package/lib/providers/secret-audit-wiring.mjs +6 -0
  276. package/lib/providers/secret-resolver.mjs +240 -23
  277. package/lib/publish-template.mjs +6 -3
  278. package/lib/publish-tooling.mjs +4 -0
  279. package/lib/publish.mjs +32 -4
  280. package/lib/queue/pg-queue.mjs +395 -0
  281. package/lib/reflect.mjs +2 -1
  282. package/lib/registry/assemble.mjs +28 -2
  283. package/lib/registry/consolidation.mjs +8 -1
  284. package/lib/registry/custom-scaffold.mjs +200 -0
  285. package/lib/registry/custom-schema.mjs +137 -0
  286. package/lib/registry/loader.mjs +8 -3
  287. package/lib/registry/manifests/format-engines.default.json +15 -0
  288. package/lib/registry/manifests/surface-map.default.json +46 -0
  289. package/lib/registry/retired-paths.mjs +1 -0
  290. package/lib/registry/surface-map.mjs +100 -50
  291. package/lib/render-visual-check.mjs +240 -0
  292. package/lib/resources/budget.mjs +40 -17
  293. package/lib/roles/flavor-bindings.mjs +36 -14
  294. package/lib/roles/gateway.mjs +15 -8
  295. package/lib/roots.mjs +107 -0
  296. package/lib/runtime/uv-bootstrap.mjs +32 -6
  297. package/lib/runtime/whisper-bootstrap.mjs +11 -3
  298. package/lib/runtime-env.mjs +5 -2
  299. package/lib/scheduler/index.mjs +8 -20
  300. package/lib/schema-infer.mjs +31 -2
  301. package/lib/scopes/lifecycle.mjs +29 -25
  302. package/lib/scopes/loader.mjs +49 -12
  303. package/lib/scopes/teams.mjs +1 -1
  304. package/lib/security/ingest-boundary.mjs +80 -0
  305. package/lib/security/recall-wrapper.mjs +99 -0
  306. package/lib/security/trust.mjs +132 -0
  307. package/lib/service-manager.mjs +38 -19
  308. package/lib/setup.mjs +41 -23
  309. package/lib/skills-apply.mjs +4 -2
  310. package/lib/specialists/postconditions.mjs +2 -2
  311. package/lib/state-root.mjs +147 -0
  312. package/lib/status.mjs +597 -6
  313. package/lib/storage/admin.mjs +77 -5
  314. package/lib/storage/backend-registry.mjs +73 -0
  315. package/lib/storage/backend.mjs +63 -9
  316. package/lib/storage/embeddings-openai.mjs +12 -2
  317. package/lib/storage/hybrid-query.mjs +11 -3
  318. package/lib/storage/retrieval-hardening.mjs +384 -0
  319. package/lib/storage/shared-memory.mjs +158 -0
  320. package/lib/storage/vector-client.mjs +69 -2
  321. package/lib/team/health.mjs +72 -0
  322. package/lib/telemetry/backends/local.mjs +9 -3
  323. package/lib/telemetry/client.mjs +3 -7
  324. package/lib/template-registry.mjs +10 -12
  325. package/lib/tenant/context.mjs +82 -0
  326. package/lib/tenant/isolation.mjs +129 -0
  327. package/lib/test-corpus-inventory.mjs +103 -2
  328. package/lib/uninstall/uninstall.mjs +78 -12
  329. package/lib/validator.mjs +4 -6
  330. package/lib/worker/entrypoint.mjs +2 -1
  331. package/lib/worker/run.mjs +2 -2
  332. package/lib/worker/trace.mjs +5 -11
  333. package/lib/workflow-state.mjs +52 -8
  334. package/lib/workflows/liveness.mjs +203 -0
  335. package/lib/workflows/loader.mjs +177 -0
  336. package/lib/workflows/manifest-schema.mjs +71 -0
  337. package/lib/workflows/surface-parity.mjs +118 -0
  338. package/lib/workflows/validate.mjs +127 -0
  339. package/lib/writes/control-plane.mjs +140 -0
  340. package/lib/writes/envelope.mjs +206 -0
  341. package/lib/writes/sent-log.mjs +86 -0
  342. package/lib/writes/write-intent.mjs +109 -0
  343. package/package.json +16 -8
  344. package/personas/construct.md +12 -3
  345. package/registry/capabilities.json +143 -36
  346. package/rules/common/comments.md +1 -0
  347. package/schemas/project-config.schema.json +0 -12
  348. package/schemas/unified-registry.schema.json +2 -4
  349. package/scripts/sync-specialists.mjs +284 -81
  350. package/skills/docs/adr-workflow.md +1 -1
  351. package/skills/docs/codebase-research-workflow.md +3 -3
  352. package/skills/docs/prd-workflow.md +5 -6
  353. package/skills/docs/runbook-workflow.md +2 -2
  354. package/skills/docs/user-research-workflow.md +3 -3
  355. package/skills/operating/fleet-health-routing.md +77 -0
  356. package/skills/roles/ai-engineer.md +1 -1
  357. package/skills/roles/architect.md +0 -1
  358. package/skills/roles/business-strategist.md +1 -1
  359. package/skills/roles/data-analyst.telemetry.md +1 -1
  360. package/skills/roles/data-engineer.md +1 -1
  361. package/skills/roles/data-engineer.pipeline.md +1 -1
  362. package/skills/roles/data-engineer.vector-retrieval.md +1 -2
  363. package/skills/roles/data-engineer.warehouse.md +1 -1
  364. package/skills/roles/designer.accessibility.md +1 -1
  365. package/skills/roles/designer.md +0 -1
  366. package/skills/roles/devil-advocate.md +1 -1
  367. package/skills/roles/docs-keeper.md +1 -1
  368. package/skills/roles/evaluator.md +1 -1
  369. package/skills/roles/explorer.md +1 -1
  370. package/skills/roles/platform-engineer.md +1 -1
  371. package/skills/roles/qa.ai-eval.md +1 -2
  372. package/skills/roles/qa.api-contract.md +0 -1
  373. package/skills/roles/qa.data-pipeline.md +0 -1
  374. package/skills/roles/qa.md +0 -1
  375. package/skills/roles/qa.web-ui.md +0 -1
  376. package/skills/roles/release-manager.md +1 -1
  377. package/skills/roles/researcher.md +0 -2
  378. package/skills/roles/reviewer.md +0 -3
  379. package/skills/roles/security.ai.md +1 -1
  380. package/skills/roles/security.legal-compliance.md +1 -1
  381. package/skills/roles/security.md +0 -1
  382. package/skills/roles/security.privacy.md +0 -1
  383. package/skills/roles/security.supply-chain.md +1 -1
  384. package/skills/roles/sre.md +1 -1
  385. package/skills/roles/test-automation.md +1 -1
  386. package/skills/roles/trace-reviewer.md +1 -1
  387. package/skills/roles/ux-researcher.md +1 -1
  388. package/specialists/artifact-manifest.json +36 -36
  389. package/specialists/org/contracts/accessibility-to-qa.json +11 -3
  390. package/specialists/org/contracts/any-to-business-strategist.json +19 -7
  391. package/specialists/org/contracts/any-to-debugger.json +7 -1
  392. package/specialists/org/contracts/any-to-designer.json +7 -1
  393. package/specialists/org/contracts/any-to-docs-keeper.json +18 -4
  394. package/specialists/org/contracts/any-to-explorer.json +13 -4
  395. package/specialists/org/contracts/any-to-sre-incident.json +6 -2
  396. package/specialists/org/contracts/any-to-trace-reviewer.json +16 -4
  397. package/specialists/org/contracts/architect-to-ai-engineer.json +6 -2
  398. package/specialists/org/contracts/architect-to-data-engineer.json +17 -5
  399. package/specialists/org/contracts/architect-to-devil-advocate.json +11 -3
  400. package/specialists/org/contracts/architect-to-engineer.json +20 -4
  401. package/specialists/org/contracts/architect-to-evaluator.json +15 -5
  402. package/specialists/org/contracts/architect-to-legal-compliance.json +15 -5
  403. package/specialists/org/contracts/architect-to-operations.json +17 -4
  404. package/specialists/org/contracts/architect-to-platform-engineer.json +20 -4
  405. package/specialists/org/contracts/construct-to-orchestrator.json +10 -2
  406. package/specialists/org/contracts/data-analyst-to-product-manager.json +11 -2
  407. package/specialists/org/contracts/engineer-to-qa.json +20 -4
  408. package/specialists/org/contracts/engineer-to-reviewer.json +29 -5
  409. package/specialists/org/contracts/explorer-to-engineer.json +11 -3
  410. package/specialists/org/contracts/legal-compliance-to-release-manager.json +12 -4
  411. package/specialists/org/contracts/operations-to-user.json +53 -0
  412. package/specialists/org/contracts/operations-triage-output.json +53 -0
  413. package/specialists/org/contracts/pm-requirements-candidates.json +53 -0
  414. package/specialists/org/contracts/product-manager-to-architect.json +30 -10
  415. package/specialists/org/contracts/product-manager-to-data-analyst.json +13 -3
  416. package/specialists/org/contracts/product-manager-to-ux-researcher.json +15 -5
  417. package/specialists/org/contracts/qa-to-release-manager.json +11 -3
  418. package/specialists/org/contracts/researcher-to-architect.json +10 -2
  419. package/specialists/org/contracts/researcher-to-product-manager.json +16 -5
  420. package/specialists/org/contracts/reviewer-to-security.json +17 -3
  421. package/specialists/org/contracts/test-automation-to-engineer.json +11 -3
  422. package/specialists/org/contracts/trace-reviewer-to-sre.json +12 -4
  423. package/specialists/org/contracts/user-to-construct.json +11 -4
  424. package/specialists/org/frameworks/cx-architect-constraint-option-failure.md +66 -0
  425. package/specialists/org/frameworks/cx-engineer-feasibility-blast-radius.md +66 -0
  426. package/specialists/org/frameworks/cx-ops-dependency-sequencing.md +74 -0
  427. package/specialists/org/frameworks/cx-pm-value-tradeoff.md +66 -0
  428. package/specialists/org/frameworks/cx-qa-risk-based-coverage.md +69 -0
  429. package/specialists/org/groups/engineering-group.json +2 -6
  430. package/specialists/org/groups/governance-group.json +2 -3
  431. package/specialists/org/groups/operations-group.json +5 -8
  432. package/specialists/org/groups/product-group.json +4 -8
  433. package/specialists/org/groups/quality-group.json +3 -7
  434. package/specialists/org/groups/strategy-group.json +6 -9
  435. package/specialists/org/models.json.example +8 -0
  436. package/specialists/org/scopes/creative.json +6 -1
  437. package/specialists/org/scopes/operations.json +7 -1
  438. package/specialists/org/scopes/research.json +6 -1
  439. package/specialists/org/scopes/rnd.json +7 -1
  440. package/specialists/org/specialists/cx-architect.json +27 -8
  441. package/specialists/org/specialists/cx-designer.json +22 -8
  442. package/specialists/org/specialists/cx-engineer.json +71 -7
  443. package/specialists/org/specialists/cx-operations.json +89 -15
  444. package/specialists/org/specialists/cx-orchestrator.json +16 -4
  445. package/specialists/org/specialists/cx-product-manager.json +28 -9
  446. package/specialists/org/specialists/cx-qa.json +16 -6
  447. package/specialists/org/specialists/cx-researcher.json +40 -7
  448. package/specialists/org/specialists/cx-reviewer.json +61 -11
  449. package/specialists/org/specialists/cx-security.json +30 -10
  450. package/specialists/org/teams/design-team.json +3 -4
  451. package/specialists/org/teams/engineering-team.json +3 -10
  452. package/specialists/org/teams/governance-team.json +3 -5
  453. package/specialists/org/teams/operations-team.json +6 -12
  454. package/specialists/org/teams/product-management-team.json +2 -3
  455. package/specialists/org/teams/quality-team.json +4 -12
  456. package/specialists/org/teams/research-team.json +3 -3
  457. package/specialists/org/teams/strategy-team.json +7 -14
  458. package/specialists/prompts/cx-architect.md +20 -1
  459. package/specialists/prompts/cx-data-analyst.md +1 -1
  460. package/specialists/prompts/cx-designer.md +12 -4
  461. package/specialists/prompts/cx-engineer.md +15 -1
  462. package/specialists/prompts/cx-operations.md +14 -2
  463. package/specialists/prompts/cx-orchestrator.md +9 -5
  464. package/specialists/prompts/cx-product-manager.md +5 -1
  465. package/specialists/prompts/cx-qa.md +6 -2
  466. package/specialists/prompts/cx-researcher.md +25 -30
  467. package/specialists/prompts/cx-reviewer.md +19 -1
  468. package/specialists/prompts/cx-security.md +5 -1
  469. package/templates/distribution/construct-brand.typ +123 -59
  470. package/templates/distribution/construct-decision.typ +6 -3
  471. package/templates/distribution/construct-pdf.typ +11 -4
  472. package/templates/distribution/construct-prd.typ +6 -3
  473. package/templates/distribution/construct-research.typ +7 -4
  474. package/lib/providers/contract/adapters/git/index.mjs +0 -115
  475. package/lib/providers/contract/adapters/slack/index.mjs +0 -175
  476. package/specialists/org/contracts/business-strategist-to-product-manager.json +0 -39
  477. package/specialists/org/contracts/construct-to-rd-lead.json +0 -53
  478. package/specialists/org/contracts/data-engineer-to-platform-engineer.json +0 -36
  479. package/specialists/org/contracts/designer-to-accessibility.json +0 -36
  480. package/specialists/org/contracts/platform-engineer-to-engineer.json +0 -31
  481. package/specialists/org/contracts/qa-to-test-automation.json +0 -42
  482. package/specialists/org/contracts/rd-lead-to-architect.json +0 -38
  483. package/specialists/org/contracts/sre-to-release-manager.json +0 -36
  484. package/specialists/org/specialists/cx-accessibility.json +0 -69
  485. package/specialists/org/specialists/cx-ai-engineer.json +0 -75
  486. package/specialists/org/specialists/cx-business-strategist.json +0 -72
  487. package/specialists/org/specialists/cx-data-engineer.json +0 -71
  488. package/specialists/org/specialists/cx-devil-advocate.json +0 -71
  489. package/specialists/org/specialists/cx-docs-keeper.json +0 -82
  490. package/specialists/org/specialists/cx-evaluator.json +0 -69
  491. package/specialists/org/specialists/cx-explorer.json +0 -69
  492. package/specialists/org/specialists/cx-legal-compliance.json +0 -74
  493. package/specialists/org/specialists/cx-oracle.json +0 -46
  494. package/specialists/org/specialists/cx-platform-engineer.json +0 -80
  495. package/specialists/org/specialists/cx-rd-lead.json +0 -73
  496. package/specialists/org/specialists/cx-release-manager.json +0 -77
  497. package/specialists/org/specialists/cx-sre.json +0 -94
  498. package/specialists/org/specialists/cx-test-automation.json +0 -69
  499. package/specialists/org/specialists/cx-trace-reviewer.json +0 -69
  500. package/specialists/org/specialists/cx-ux-researcher.json +0 -68
  501. package/specialists/org/teams/accessibility-team.json +0 -39
  502. package/specialists/org/teams/ux-research-team.json +0 -39
  503. package/specialists/prompts/cx-accessibility.md +0 -55
  504. package/specialists/prompts/cx-ai-engineer.md +0 -124
  505. package/specialists/prompts/cx-business-strategist.md +0 -58
  506. package/specialists/prompts/cx-data-engineer.md +0 -55
  507. package/specialists/prompts/cx-devil-advocate.md +0 -59
  508. package/specialists/prompts/cx-docs-keeper.md +0 -164
  509. package/specialists/prompts/cx-evaluator.md +0 -49
  510. package/specialists/prompts/cx-explorer.md +0 -71
  511. package/specialists/prompts/cx-legal-compliance.md +0 -58
  512. package/specialists/prompts/cx-oracle.md +0 -98
  513. package/specialists/prompts/cx-platform-engineer.md +0 -97
  514. package/specialists/prompts/cx-rd-lead.md +0 -59
  515. package/specialists/prompts/cx-release-manager.md +0 -54
  516. package/specialists/prompts/cx-sre.md +0 -111
  517. package/specialists/prompts/cx-test-automation.md +0 -55
  518. package/specialists/prompts/cx-trace-reviewer.md +0 -101
  519. package/specialists/prompts/cx-ux-researcher.md +0 -53
@@ -24,14 +24,14 @@ export const CLI_COMMANDS = [
24
24
  category: 'Core',
25
25
  core: true,
26
26
  description: 'Start services for development',
27
- usage: 'construct dev [--select] [--only=postgres,...]',
27
+ usage: 'construct dev [--select] [--only=memory,opencode,...]',
28
28
  examples: [
29
29
  { cmd: 'construct dev', desc: 'Start the default service set' },
30
- { cmd: 'construct dev --only=postgres', desc: 'Start just Postgres' },
30
+ { cmd: 'construct dev --only=memory', desc: 'Start just the memory (cm) service' },
31
31
  ],
32
32
  options: [
33
33
  { flag: '--select', desc: 'Pick which services to start from an interactive checklist' },
34
- { flag: '--only=<a,b,c>', desc: 'Start only the named services (postgres, telemetry, memory, opencode)' },
34
+ { flag: '--only=<a,b,c>', desc: 'Start only the named services (telemetry, memory, opencode, copilot-bridge)' },
35
35
  ],
36
36
  },
37
37
  {
@@ -61,22 +61,37 @@ export const CLI_COMMANDS = [
61
61
  { flag: '--json', desc: 'Output full status payload as JSON' },
62
62
  ],
63
63
  },
64
+ {
65
+ name: 'workers',
66
+ emoji: '🫀',
67
+ category: 'Core',
68
+ core: true,
69
+ description: 'List registered team workers and heartbeat freshness',
70
+ usage: 'construct workers <list> [--json]',
71
+ strictFlags: true,
72
+ examples: [
73
+ { cmd: 'construct workers list', desc: 'Show live/stale registered workers' },
74
+ { cmd: 'construct workers list --json', desc: 'Machine-readable worker status' },
75
+ ],
76
+ options: [
77
+ { flag: '--json', desc: 'Output worker list as JSON' },
78
+ ],
79
+ },
64
80
  {
65
81
  name: 'install',
66
82
  emoji: '🛠️',
67
83
  category: 'Core',
68
84
  core: true,
69
85
  description: 'Machine setup (scoped per ADR-0029): --scope=project|user|both, default project',
70
- usage: 'construct install [--scope=project|user|both] [--yes] [--dry-run] [--no-docker] [--no-launch-agent] [--reconfigure] [--with-docling]',
86
+ usage: 'construct install [--scope=project|user|both] [--yes] [--dry-run] [--no-launch-agent] [--reconfigure] [--with-docling]',
71
87
  examples: [
72
88
  { cmd: 'construct install --dry-run', desc: 'Preview the plan before writing anything' },
73
89
  { cmd: 'construct install --scope=user --yes', desc: 'Non-interactive user-scope install' },
74
90
  ],
75
91
  options: [
76
- { flag: '--scope=<s>', desc: 'project (default, no-op + guidance) | user (writes ~/.construct/, MCP, ~/.claude/* via consent) | both' },
92
+ { flag: '--scope=<s>', desc: 'project (default, no-op + guidance) | user (writes ~/.config/construct/, MCP, ~/.claude/* via consent) | both' },
77
93
  { flag: '--yes', desc: 'Apply defaults without prompts (only meaningful with --scope=user|both)' },
78
94
  { flag: '--dry-run', desc: 'Preview the install plan (scopes, files, services) without writing anything' },
79
- { flag: '--no-docker', desc: 'Skip Docker-based service setup (local Postgres)' },
80
95
  { flag: '--no-launch-agent', desc: 'Skip background macOS LaunchAgent registration' },
81
96
  { flag: '--reconfigure', desc: 'Re-prompt for service consent, ignoring cached answers' },
82
97
  { flag: '--with-docling', desc: 'Eagerly provision the docling document-extraction venv now (heavy, ~10 min; else lazy on first ingest)' },
@@ -407,9 +422,25 @@ export const CLI_COMMANDS = [
407
422
  category: 'Work',
408
423
  core: false,
409
424
  description: 'Task graph management',
410
- usage: 'construct graph <list|show|from-intake|recommend>',
425
+ usage: 'construct graph <list|show|from-intake|recommend|build|stat|query|validate|explain|owasp>',
411
426
  subcommands: [
412
427
  { name: 'recommend --json [--text|--file|<stdin>]', desc: 'Return a role-aware plan for an artifact without enqueuing (embedded contract; alias of intake classify)' },
428
+ { name: 'build|stat|query|validate|explain', desc: 'Living dependency graph — build/inspect/validate the typed file↔capability↔workflow↔test↔embed graph (replaces `construct matrix`)' },
429
+ { name: 'owasp | missing-tests --security', desc: 'OWASP GenAI Top-10 coverage matrix and the workflow/preset security-coverage gap list (LMCP-N8)' },
430
+ ],
431
+ },
432
+ {
433
+ name: 'pack',
434
+ emoji: '📦',
435
+ category: 'Work',
436
+ core: false,
437
+ description: 'Specialist/team/profile pack enable/disable lifecycle (LMCP-E3)',
438
+ usage: 'construct pack <list|enable|disable|info> [--json]',
439
+ subcommands: [
440
+ { name: 'list', desc: 'Every pack discovered across builtin/user/project tiers with its durable enabled state' },
441
+ { name: 'enable <pack-id>[@version]', desc: 'Validate the pack manifest and record it enabled in .cx/packs.json; refuses on an incompatible compatVersion or other validation failure' },
442
+ { name: 'disable <pack-id>', desc: 'Remove the pack\'s enabled entry (idempotent; the core pack cannot be disabled)' },
443
+ { name: 'info <pack-id>', desc: 'Full manifest plus enabled state for one pack' },
413
444
  ],
414
445
  },
415
446
  {
@@ -462,6 +493,30 @@ export const CLI_COMMANDS = [
462
493
  { name: 'preflight [--host H] [--json] [--no-probe]', desc: 'Verify orchestration tool attachment/readiness and return a typed reason plus recovery step' },
463
494
  ],
464
495
  },
496
+ {
497
+ name: 'flow',
498
+ emoji: '🧵',
499
+ category: 'Models & Integrations',
500
+ core: false,
501
+ description: 'Deterministic flow-engine runs: start or resume a checkpointed flow, or inspect its status',
502
+ usage: 'construct flow <resume|status> <run-id> [--flow=<path>] [--state=<json>]',
503
+ subcommands: [
504
+ { name: 'resume <run-id> --flow=<path> [--state=<json>]', desc: 'Start (new run-id) or resume a checkpointed flow and drive it to completion' },
505
+ { name: 'status <run-id>', desc: 'Read a flow checkpoint without driving it' },
506
+ ],
507
+ },
508
+ {
509
+ name: 'db',
510
+ emoji: '🗄️',
511
+ category: 'Models & Integrations',
512
+ core: false,
513
+ description: 'Inspect and migrate the optional Postgres backend',
514
+ usage: 'construct db <status|migrate> [--json]',
515
+ subcommands: [
516
+ { name: 'status [--json]', desc: 'Check Postgres reachability and migration state' },
517
+ { name: 'migrate [--json]', desc: 'Apply pending Postgres migrations idempotently' },
518
+ ],
519
+ },
465
520
  {
466
521
  name: 'acp',
467
522
  emoji: '🔗',
@@ -601,11 +656,12 @@ export const CLI_COMMANDS = [
601
656
  emoji: '👥',
602
657
  category: 'Work',
603
658
  core: false,
604
- description: 'Team review and template listing (`team:add` / `team:remove` are internal registry editors)',
605
- usage: 'construct team <list|show|review|templates>',
659
+ description: 'Team review, template listing, and custom team authoring (`team:add` / `team:remove` are internal registry editors)',
660
+ usage: 'construct team <list|show|create|review|templates>',
606
661
  subcommands: [
607
662
  { name: 'list', desc: 'List macro groups and squads (--kind group|squad)' },
608
663
  { name: 'show', desc: 'Show one group or squad by id' },
664
+ { name: 'create', desc: 'Scaffold a custom team into .cx/org/ (or ~/.construct/org/ with --user) — see docs/guides/cookbook/custom-specialists-and-teams.md' },
609
665
  { name: 'review', desc: 'Team review workflow' },
610
666
  { name: 'templates', desc: 'List team doc templates' },
611
667
  ],
@@ -785,7 +841,7 @@ export const CLI_COMMANDS = [
785
841
  { flag: '--dry-run', desc: 'Print the plan and exit; change nothing' },
786
842
  { flag: '--yes', desc: 'Remove auto-risk (✓) categories without prompting' },
787
843
  { flag: '--all', desc: 'Combined with --yes: also remove ask-risk (◐) categories (project data, machine config)' },
788
- { flag: '--keep-state', desc: 'Only remove the launcher + adapters; preserve .cx/, ~/.construct, Postgres' },
844
+ { flag: '--keep-state', desc: 'Only remove the launcher + adapters; preserve .cx/, ~/.config/construct, Postgres' },
789
845
  { flag: '--scope=<...>', desc: 'Limit to project | machine | all (default: all)' },
790
846
  ],
791
847
  },
@@ -835,7 +891,16 @@ export const CLI_COMMANDS = [
835
891
  category: 'Advanced',
836
892
  core: false,
837
893
  description: 'Embed mode management',
838
- usage: 'construct embed start|stop|status',
894
+ usage: 'construct embed start|stop|status|list|enable|disable|dry-run',
895
+ subcommands: [
896
+ { name: 'start', desc: 'Fork the detached embed daemon' },
897
+ { name: 'stop', desc: 'Stop the running embed daemon' },
898
+ { name: 'status [<id>] [--json]', desc: 'Daemon status, or per-capability bindings/filter/runtime/last-tick with an id' },
899
+ { name: 'list [--json]', desc: 'Available embed capabilities and per-project enabled state (ADR-0061)' },
900
+ { name: 'enable <id>', desc: 'Enable an embed capability: validate and write .cx/embed/<id>.manifest.json' },
901
+ { name: 'disable <id>', desc: 'Disable an embed capability (idempotent)' },
902
+ { name: 'dry-run <id> [--json]', desc: 'Resolve the specialist→providers→filter→framework→authority→runtime chain; no side effects' },
903
+ ],
839
904
  },
840
905
  {
841
906
  name: 'backup',
@@ -957,7 +1022,19 @@ export const CLI_COMMANDS = [
957
1022
  category: 'Advanced',
958
1023
  core: false,
959
1024
  description: 'Provider management',
960
- usage: 'construct provider list|test',
1025
+ usage: 'construct provider list|status|health|validate|test|add|configure',
1026
+ subcommands: [
1027
+ { name: 'list', desc: 'List all resolved providers with capabilities and health' },
1028
+ { name: 'status [--json]', desc: 'Alias of list with breaker state, degradation, and active filter columns' },
1029
+ { name: 'health [id] [--json]', desc: 'Run health probes; exits non-zero if any probe fails' },
1030
+ { name: 'validate <path|id> [--strict] [--json]', desc: 'Validate a manifest file or provider id against the B1 schema' },
1031
+ { name: 'info <id>', desc: 'Show a single provider\'s metadata and config schema' },
1032
+ { name: 'test <id>', desc: 'Run one provider\'s health probe; exits non-zero on failure' },
1033
+ { name: 'add <id> [--json]', desc: 'Scaffold instance config from the provider\'s configSchema defaults, persisted to .cx/providers/<id>.json' },
1034
+ { name: 'configure <id> [--key.path value ...] [--json]', desc: 'Merge + validate instance config (incl. ADR-0060 filter block) against configSchema; rejects with the schema path on failure' },
1035
+ { name: 'plugins <add|remove> <id> [<package>] [--global]', desc: 'Register or remove a plugin provider override' },
1036
+ { name: 'new <name> [--capabilities=...]', desc: 'Scaffold a new provider module' },
1037
+ ],
961
1038
  },
962
1039
  {
963
1040
  name: 'auth:status',
@@ -967,6 +1044,20 @@ export const CLI_COMMANDS = [
967
1044
  description: 'Check auth status',
968
1045
  usage: 'construct auth:status',
969
1046
  },
1047
+ {
1048
+ name: 'approvals',
1049
+ emoji: '✅',
1050
+ category: 'Core',
1051
+ core: true,
1052
+ description: 'Manage pending MCP tool approvals',
1053
+ usage: 'construct approvals list|approve|deny|status',
1054
+ subcommands: [
1055
+ { name: 'list', desc: 'List pending approvals with tool name, requestedAt, requestedBy' },
1056
+ { name: 'approve <id>', desc: 'Approve a pending approval by id' },
1057
+ { name: 'deny <id> [--reason=...]', desc: 'Deny a pending approval by id' },
1058
+ { name: 'status <id>', desc: 'Show the full status of a specific approval' },
1059
+ ],
1060
+ },
970
1061
  {
971
1062
  name: 'tags',
972
1063
  emoji: '🏷',
@@ -1133,7 +1224,7 @@ export const CLI_COMMANDS = [
1133
1224
  { name: 'lint:research', category: 'Internal', core: false, internal: true, description: 'Internal lint: research artifacts', usage: 'construct lint:research' },
1134
1225
  { name: 'lint:templates', category: 'Internal', core: false, internal: true, description: 'Internal lint: shipped templates', usage: 'construct lint:templates' },
1135
1226
  { name: 'lint:prompts', category: 'Internal', core: false, internal: true, description: 'Internal lint: specialist prompt frontmatter + sections', usage: 'construct lint:prompts' },
1136
- { name: 'specialist', category: 'Internal', core: false, internal: true, description: 'Maintainer tool: scaffold, edit, and lint specialist prompts', usage: 'construct specialist <create|edit|lint>' },
1227
+ { name: 'specialist', category: 'Internal', core: false, internal: true, description: 'Maintainer tool: scaffold/edit/lint built-in specialist prompts; `create --custom` scaffolds a user-authored specialist into .cx/org/ or ~/.construct/org/', usage: 'construct specialist <create|edit|lint> [--custom]' },
1137
1228
  { name: 'registry:status', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Dev: capability registry inspector', usage: 'construct registry:status [--json]' },
1138
1229
  { name: 'registry:validate', category: 'Internal', core: false, internal: true, surface: 'internal', strictFlags: true, description: 'Validate registry/capabilities.json against repo reality; --unified validates specialists/org (+ .cx overlay) invariants', usage: 'construct registry:validate [--json] [--unified]', options: [
1139
1230
  { flag: '--json', desc: 'Emit the validation report as JSON' },
@@ -1147,7 +1238,7 @@ export const CLI_COMMANDS = [
1147
1238
  { name: 'specialist:add', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Add a new specialist to a team', usage: 'construct specialist:add <specialist-id> --team <team-id>' },
1148
1239
  { name: 'specialist:remove', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Remove a specialist from the unified registry', usage: 'construct specialist:remove <specialist-id> [--force]' },
1149
1240
  { name: 'oracle', emoji: '🔮', category: 'Core', core: true, description: 'Oracle meta-controller — fleet health review and bounded-auto maintenance', usage: 'construct oracle start|status|review|pending|approve|gaps|reconcile' },
1150
- { name: 'matrix', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Living dependency matrix build/inspect the typed file↔capability↔workflow↔test graph', usage: 'construct matrix build|stat|query <node-id> [--json]' },
1241
+ { name: 'matrix', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Deprecated alias of `construct graph` living dependency graph', usage: 'construct matrix build|stat|query|validate <node-id> [--json]' },
1151
1242
  { name: 'impact', category: 'Diagnostics', core: false, internal: false, surface: 'thin-cli', description: 'Change-impact analysis — map changed files to affected tests, capabilities, and workflows', usage: 'construct impact [files…] [--stdin] [--run] [--json]' },
1152
1243
  { name: 'rules', category: 'Diagnostics', core: false, internal: false, surface: 'thin-cli', description: 'Rule and hook reference telemetry rollup', usage: 'construct rules usage [--since=30d]' },
1153
1244
  { name: 'evaluator:rubrics', category: 'Internal', core: false, internal: true, description: 'Internal: list registered evaluator rubrics', usage: 'construct evaluator:rubrics' },
@@ -4,6 +4,12 @@
4
4
  * lintFile(path) checks a single file. lintRepo({ rootDir, fix }) checks all
5
5
  * scoped paths and optionally inserts stub headers for files missing one.
6
6
  * Used by `construct lint:comments`, the comment-lint PostToolUse hook, and CI.
7
+ * Also enforces the future-state doc marker convention (construct-9oi4.15.3 /
8
+ * LMCP-O3): a guide/operations doc claiming a capability is "staged/
9
+ * experimental" or "not yet {implemented,active,shipped,supported}" must cite
10
+ * a construct-* bead id within two lines. And bans naming another project by
11
+ * name in a code comment (BANNED_EXTERNAL_PROJECTS) outside docs/decisions/**
12
+ * and docs/notes/**, where a prior-art comparison can carry a citation.
7
13
  */
8
14
 
9
15
  import fs from 'node:fs';
@@ -202,11 +208,125 @@ const BANNED_ARTIFACT = [
202
208
  },
203
209
  ];
204
210
 
211
+ // Future-state doc markers (construct-9oi4.15.3 / LMCP-O3): a guide or
212
+ // operations doc that tells the reader a capability is "staged/experimental"
213
+ // or "not yet {implemented,active,shipped,supported}" must cite a tracked
214
+ // construct-* bead within two lines, or the claim is unfalsifiable — nobody
215
+ // can check whether the gap is still open. Scope is guides/operations/README,
216
+ // matching where the M3 sweep (construct-9oi4.13.3) found and fixed its
217
+ // contradictions. ADRs/RFCs carry their own Status/Tracking header convention
218
+ // and docs/notes/research/** are working notes, not shipped-behavior claims —
219
+ // both excluded. hooks-deprecated.md is excluded: it is a self-governing
220
+ // ledger of removed hooks (checked separately by `construct doctor`), not a
221
+ // forward-looking capability claim.
222
+
223
+ const FUTURE_STATE_DOC_INCLUDE = [
224
+ /^docs\/guides\//,
225
+ /^docs\/operations\//,
226
+ /^docs\/README\.md$/,
227
+ ];
228
+
229
+ const FUTURE_STATE_DOC_EXCLUDE = [
230
+ /^docs\/guides\/reference\/hooks-deprecated\.md$/,
231
+ ];
232
+
233
+ function isFutureStateDocPath(rel) {
234
+ return FUTURE_STATE_DOC_INCLUDE.some((r) => r.test(rel)) && !FUTURE_STATE_DOC_EXCLUDE.some((r) => r.test(rel));
235
+ }
236
+
237
+ const FUTURE_STATE_MARKERS = [
238
+ /\bstaged\/experimental\b/i,
239
+ /\bnot\s+yet\s+(?:implemented|active|shipped|supported)\b/i,
240
+ /\bplanned[;:—-]+\s*not\s+(?:yet\s+)?implemented\b/i,
241
+ ];
242
+
243
+ const BEAD_ID_RE = /\bconstruct-[a-z0-9]+(?:\.[a-z0-9]+)*\b/i;
244
+
245
+ function hasBeadIdNearby(lines, idx) {
246
+ const lo = Math.max(0, idx - 2);
247
+ const hi = Math.min(lines.length, idx + 3);
248
+ for (let i = lo; i < hi; i++) {
249
+ if (BEAD_ID_RE.test(lines[i])) return true;
250
+ }
251
+ return false;
252
+ }
253
+
254
+ function checkFutureStateMarkers(content, rel) {
255
+ if (!isFutureStateDocPath(rel)) return [];
256
+ const lines = content.split('\n');
257
+ const skip = buildSkipMap(lines);
258
+ const violations = [];
259
+ for (let i = 0; i < lines.length; i++) {
260
+ if (skip[i]) continue;
261
+ if (lines[i].includes('construct-lint-ignore')) continue;
262
+ for (const pattern of FUTURE_STATE_MARKERS) {
263
+ if (pattern.test(lines[i]) && !hasBeadIdNearby(lines, i)) {
264
+ violations.push({
265
+ line: i + 1,
266
+ label: 'future-state doc marker ("staged/experimental" / "not yet implemented" / "planned — not implemented") has no construct-* bead id within 2 lines (rules/common/no-fabrication.md)',
267
+ kind: 'artifact',
268
+ });
269
+ }
270
+ }
271
+ }
272
+ return violations;
273
+ }
274
+
205
275
  function isBannedCheckSkipped(filePath) {
206
276
  if (!filePath) return false;
207
277
  return BANNED_CHECK_SKIP.some((suffix) => filePath.endsWith(suffix));
208
278
  }
209
279
 
280
+ // External project names named in a code comment read as an unverifiable
281
+ // comparison — no-fabrication requires prior-art comparisons carry a citation,
282
+ // and only a decision document carries one. docs/decisions/** and docs/notes/**
283
+ // are that citation-bearing exception; every other comment in the repo
284
+ // describes this codebase's own behavior. A variant of CMT excludes the `//`
285
+ // in a URL scheme (`https://…`) so a cited reference link doesn't misread as
286
+ // a comment marker — this check runs on markdown prose too, unlike the other
287
+ // BANNED entries above, so citation URLs are common in its input.
288
+
289
+ const BANNED_EXTERNAL_PROJECTS = ['CrewAI', 'LangGraph', 'AutoGen', 'LangChain', 'MetaGPT', 'Aider', 'Devin'];
290
+
291
+ const EXTERNAL_PROJECT_CMT = '(?:(?<!:)\\/\\/|^\\s*\\*(?!\\/))';
292
+
293
+ const EXTERNAL_PROJECT_NAME_RE = new RegExp(
294
+ `${EXTERNAL_PROJECT_CMT}.*\\b(?:${BANNED_EXTERNAL_PROJECTS.join('|')})\\b`,
295
+ 'i',
296
+ );
297
+
298
+ const EXTERNAL_PROJECT_EXEMPT_GLOBS = [
299
+ /^docs\/decisions\//,
300
+ /^docs\/notes\//,
301
+ ];
302
+
303
+ function isExternalProjectExempt(rel) {
304
+ return EXTERNAL_PROJECT_EXEMPT_GLOBS.some((r) => r.test(rel));
305
+ }
306
+
307
+ function checkExternalProjectNames(content, filePath, rel) {
308
+ if (isBannedCheckSkipped(filePath)) return [];
309
+ if (isExternalProjectExempt(rel)) return [];
310
+
311
+ // Same JS/TS comment-convention scope as checkBanned: the "// " / " * "
312
+ // detection matches markdown's own "**bold**"/"* bullet" syntax as a
313
+ // false positive, so markdown/MDX prose is out of scope for this check.
314
+ if (filePath && ['.md', '.mdx'].includes(path.extname(filePath))) return [];
315
+ const lines = content.split('\n');
316
+ const violations = [];
317
+ for (let i = 0; i < lines.length; i++) {
318
+ if (lines[i].includes('construct-lint-ignore')) continue;
319
+ if (EXTERNAL_PROJECT_NAME_RE.test(lines[i])) {
320
+ violations.push({
321
+ line: i + 1,
322
+ label: 'external project name in a code comment — prior-art comparisons belong in docs/decisions or docs/notes with citations (rules/common/comments.md)',
323
+ kind: 'artifact',
324
+ });
325
+ }
326
+ }
327
+ return violations;
328
+ }
329
+
210
330
  // Track fenced code blocks ( ``` … ``` ) and YAML frontmatter ( --- … --- )
211
331
  // so artifact-prose patterns inside code or metadata are not flagged.
212
332
  function buildSkipMap(lines) {
@@ -327,11 +447,8 @@ function checkArtifactBanned(content, rel) {
327
447
  // path and must never throw on a missing or malformed registry file.
328
448
 
329
449
  export const KNOWN_CX_ROLE_IDS = [
330
- 'accessibility', 'ai-engineer', 'architect', 'business-strategist', 'data-analyst',
331
- 'data-engineer', 'debugger', 'designer', 'devil-advocate', 'docs-keeper', 'engineer',
332
- 'evaluator', 'explorer', 'legal-compliance', 'operations', 'oracle', 'orchestrator',
333
- 'platform-engineer', 'product-manager', 'qa', 'rd-lead', 'release-manager', 'researcher',
334
- 'reviewer', 'security', 'sre', 'test-automation', 'trace-reviewer', 'ux-researcher',
450
+ 'architect', 'data-analyst', 'debugger', 'designer', 'engineer', 'operations',
451
+ 'orchestrator', 'product-manager', 'qa', 'researcher', 'reviewer', 'security',
335
452
  ];
336
453
 
337
454
  const CX_ROLE_LEAK = new RegExp(
@@ -392,8 +509,8 @@ function findToolIdentityLeaks(content) {
392
509
  function checkBanned(content, filePath) {
393
510
  if (isBannedCheckSkipped(filePath)) return [];
394
511
 
395
- // Banned patterns are JS/TS comment conventions — they don't apply to markdown prose.
396
- if (filePath && path.extname(filePath) === '.md') return [];
512
+ // Banned patterns are JS/TS comment conventions — they don't apply to markdown/MDX prose.
513
+ if (filePath && ['.md', '.mdx'].includes(path.extname(filePath))) return [];
397
514
 
398
515
  const warnings = [];
399
516
  const lines = content.split('\n');
@@ -465,6 +582,8 @@ export function lintFile(filePath, { rootDir = process.cwd(), fix = false } = {}
465
582
  // the finding.
466
583
  const artifactHits = checkArtifactBanned(content, rel);
467
584
  if (isArtifactPath(rel)) artifactHits.push(...findDanglingCitations(content, { rootDir }));
585
+ artifactHits.push(...checkFutureStateMarkers(content, rel));
586
+ artifactHits.push(...checkExternalProjectNames(content, filePath, rel));
468
587
  if (artifactHits.length > 0) {
469
588
  const mode = process.env.CONSTRUCT_ARTIFACT_LINT_MODE || 'warn';
470
589
  const bucket = mode === 'block' ? errors : warnings;
@@ -514,7 +633,7 @@ export function lintRepo({ rootDir = process.cwd(), fix = false } = {}) {
514
633
  const rel = relPath(rootDir, f);
515
634
  const { required } = requiresHeader(rel);
516
635
  const ext = path.extname(f);
517
- if (!required && !['.mjs', '.md', '.sh'].includes(ext)) continue;
636
+ if (!required && !['.mjs', '.md', '.mdx', '.sh'].includes(ext)) continue;
518
637
  const result = lintFile(f, { rootDir, fix });
519
638
  if (result.errors.length || result.warnings.length) results.push(result);
520
639
  }
@@ -23,15 +23,14 @@ export const DEPLOYMENT_MODES = ['solo', 'team', 'enterprise'];
23
23
  export const MCP_BROKER_VALUES = ['auto', 'on', 'off'];
24
24
  export const DEFAULT_SCOPE_ID = 'rnd';
25
25
 
26
- export const SURFACES = ['claude', 'opencode', 'codex', 'copilot', 'vscode', 'cursor'];
27
-
28
26
  export const INGEST_STRATEGIES = ['adapter', 'provider', 'docling-remote'];
29
27
  export const INGEST_FALLBACKS = ['none', 'provider', 'adapter'];
30
28
  export const INGEST_ORCHESTRATIONS = ['prompt-only', 'orchestrated'];
31
29
 
32
- export const ORCHESTRATION_WORKER_BACKENDS = ['inline', 'provider'];
30
+ export const ORCHESTRATION_WORKER_BACKENDS = ['inline', 'provider', 'host'];
33
31
  export const ORCHESTRATION_STORES = ['filesystem', 'sqlite', 'postgres'];
34
32
  export const CHAIN_OF_THOUGHT_MODES = ['hidden', 'surface', 'telemetry_only'];
33
+ export const ORCHESTRATION_HOST_EXECUTION_MODES = ['auto', 'pickup', 'sampling'];
35
34
 
36
35
  // SessionStart context routing. `auto` keeps the rich payload on stdout for
37
36
  // interactive sessions and suppresses it (to a debug log) for non-interactive /
@@ -70,6 +69,7 @@ export const DEFAULT_PROJECT_CONFIG = Object.freeze({
70
69
  workerBackend: 'inline',
71
70
  store: 'filesystem',
72
71
  chainOfThought: 'hidden',
72
+ hostExecution: 'auto',
73
73
  }),
74
74
  telemetry: Object.freeze({
75
75
  enabled: true,
@@ -89,12 +89,6 @@ export const DEFAULT_PROJECT_CONFIG = Object.freeze({
89
89
  maxLiveFree: 24,
90
90
  }),
91
91
  }),
92
- roleSelection: Object.freeze({
93
- primary: null,
94
- secondary: null,
95
- perConversationOverride: true,
96
- }),
97
- hosts: Object.freeze(Object.fromEntries(SURFACES.map((s) => [s, Object.freeze({ enabled: true })]))),
98
92
  resources: Object.freeze({
99
93
  disk: Object.freeze({
100
94
  tracesMaxDays: 30,
@@ -109,6 +103,8 @@ export const DEFAULT_PROJECT_CONFIG = Object.freeze({
109
103
  handoffsMaxDays: 30,
110
104
  handoffsMaxItems: 50,
111
105
  totalCxMaxMb: 2000,
106
+ observationsMaxDays: 90,
107
+ observationsMaxRows: 5000,
112
108
  }),
113
109
  process: Object.freeze({
114
110
  embedDaemonMaxRssMb: 800,
@@ -174,6 +170,7 @@ export const FIELD_RULES = {
174
170
  workerBackend: { type: 'string', enum: ORCHESTRATION_WORKER_BACKENDS },
175
171
  store: { type: 'string', enum: ORCHESTRATION_STORES },
176
172
  chainOfThought: { type: 'string', enum: CHAIN_OF_THOUGHT_MODES },
173
+ hostExecution: { type: 'string', enum: ORCHESTRATION_HOST_EXECUTION_MODES },
177
174
  },
178
175
  },
179
176
  telemetry: {
@@ -190,27 +187,7 @@ export const FIELD_RULES = {
190
187
  outputMode: { type: 'string', enum: HOOK_OUTPUT_MODES },
191
188
  },
192
189
  },
193
- roleSelection: {
194
- type: 'object',
195
- required: false,
196
- fields: {
197
- primary: { type: ['string', 'null'], maxLength: 50 },
198
- secondary: { type: ['string', 'null'], maxLength: 50 },
199
- perConversationOverride: { type: 'boolean' },
200
- },
201
- },
202
190
  resources: { type: 'object', required: false },
203
- hosts: {
204
- type: 'object',
205
- required: false,
206
- fields: Object.fromEntries(SURFACES.map((s) => [s, {
207
- type: 'object',
208
- required: false,
209
- fields: {
210
- enabled: { type: 'boolean', required: false },
211
- },
212
- }])),
213
- },
214
191
  costs: {
215
192
  type: 'object',
216
193
  required: false,
@@ -0,0 +1,70 @@
1
+ /**
2
+ * lib/config/source-target-registry.mjs — manifest-derived source-target descriptors.
3
+ *
4
+ * Loads the merged (builtin/user/project) extension manifests and collects each
5
+ * manifest's optional `sourceTarget` block into a descriptor keyed by the block's
6
+ * own `provider` field — the string used in construct.config.json's
7
+ * `sources.targets[].provider`, in legacy env-derived targets, and in embed
8
+ * source records. That key is distinct from the manifest `id` for providers
9
+ * whose manifest id differs from their config-facing provider name (the Jira
10
+ * manifest id is `atlassian-jira`; its sourceTarget.provider is `jira`).
11
+ *
12
+ * lib/config/source-targets.mjs and lib/embed/demand-fetch.mjs iterate these
13
+ * descriptors instead of naming providers directly, so adding a fifth
14
+ * source-target-eligible provider requires only a manifest with a
15
+ * `sourceTarget` block — no edits to either file. See each descriptor field
16
+ * for its consumer:
17
+ * selector / secondaryField — validateSourceTarget, normalizeConfigTarget
18
+ * signature — targetSignature
19
+ * legacyEnv — legacyEnvSourceTargets
20
+ * aliases — resolveKnownSourcesFromTargets
21
+ * embed — targetsToEmbedSources
22
+ * embedFilters — targetsToEmbedSourcesWithFilters
23
+ * demandFetch.target* — lib/embed/demand-fetch.mjs buildReadCallsForTarget
24
+ * demandFetch.query* — lib/embed/demand-fetch.mjs buildReadCalls
25
+ *
26
+ * Computed once at module load (mirrors the BUILT_INS pattern in
27
+ * lib/providers/registry.mjs) using the default rootDir (process.cwd()).
28
+ * Callers that need a project-tier-aware view for a different rootDir should
29
+ * call loadSourceTargetDescriptors(rootDir) directly.
30
+ */
31
+
32
+ import { loadManifestsFromDir, mergeManifests, resolveManifestDirs } from '../extensions/loader.mjs';
33
+
34
+ export function loadSourceTargetDescriptors(rootDir = process.cwd()) {
35
+ const { builtin, user, project } = resolveManifestDirs({ rootDir });
36
+ const { manifests: builtinManifests } = loadManifestsFromDir(builtin);
37
+ const { manifests: userManifests } = loadManifestsFromDir(user);
38
+ const { manifests: projectManifests } = loadManifestsFromDir(project);
39
+ const merged = mergeManifests(builtinManifests, userManifests, projectManifests);
40
+
41
+ const byProvider = new Map();
42
+ for (const manifest of merged) {
43
+ const descriptor = manifest.sourceTarget;
44
+ if (!descriptor || typeof descriptor !== 'object' || !descriptor.provider) continue;
45
+ byProvider.set(descriptor.provider, descriptor);
46
+ }
47
+ return byProvider;
48
+ }
49
+
50
+ const DESCRIPTORS = loadSourceTargetDescriptors();
51
+
52
+ export const SOURCE_TARGET_PROVIDERS = Object.freeze([...DESCRIPTORS.keys()]);
53
+
54
+ export function getSourceTargetDescriptor(provider) {
55
+ return DESCRIPTORS.get(provider) ?? null;
56
+ }
57
+
58
+ export function listSourceTargetDescriptors() {
59
+ return [...DESCRIPTORS.values()];
60
+ }
61
+
62
+ /**
63
+ * Fill a descriptor string template's `{name}` placeholders from `vars`.
64
+ * Shared by lib/config/source-targets.mjs (signatures) and
65
+ * lib/embed/demand-fetch.mjs (JQL construction) so both consume the same
66
+ * placeholder syntax the manifests declare.
67
+ */
68
+ export function renderTemplate(template, vars) {
69
+ return template.replace(/\{(\w+)\}/g, (_, key) => (key in vars ? String(vars[key]) : ''));
70
+ }