@geraldmaron/construct 1.4.1 → 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 (556) hide show
  1. package/.env.example +36 -0
  2. package/README.md +41 -7
  3. package/bin/construct +1029 -65
  4. package/bin/construct-postinstall.mjs +27 -2
  5. package/config/tag-vocabulary.json +264 -0
  6. package/examples/distribution/sources/deck-one-pager.md +1 -1
  7. package/lib/acp/server.mjs +21 -7
  8. package/lib/adapters-sync.mjs +2 -1
  9. package/lib/audit-trail.mjs +185 -2
  10. package/lib/beads/auto-close.mjs +2 -1
  11. package/lib/beads/drift.mjs +2 -1
  12. package/lib/bridges/copilot-proxy.mjs +20 -5
  13. package/lib/certification/skill-inventory.mjs +10 -1
  14. package/lib/cli/approvals.mjs +147 -0
  15. package/lib/cli-commands.mjs +105 -14
  16. package/lib/comment-lint.mjs +127 -8
  17. package/lib/config/schema.mjs +7 -30
  18. package/lib/config/source-target-registry.mjs +70 -0
  19. package/lib/config/source-targets.mjs +179 -205
  20. package/lib/contracts/coverage.mjs +77 -0
  21. package/lib/contracts/validate.mjs +102 -13
  22. package/lib/contracts/violation-log.mjs +50 -4
  23. package/lib/db/migrate.mjs +69 -0
  24. package/lib/db/migrations/001_orchestration_runs.sql +9 -0
  25. package/lib/db/migrations/002_queue_provider.sql +50 -0
  26. package/lib/db/migrations/003_worker_registry.sql +17 -0
  27. package/lib/db/migrations/004_trace_events.sql +16 -0
  28. package/lib/db/migrations/005_shared_memory.sql +15 -0
  29. package/lib/db/migrations/006_orchestration_runs_tenant.sql +5 -0
  30. package/lib/decisions/enforced-baseline.json +0 -2
  31. package/lib/decisions/registry.mjs +3 -2
  32. package/lib/deployment/parity-contract.mjs +1 -1
  33. package/lib/deployment-mode.mjs +78 -2
  34. package/lib/diagram-export.mjs +10 -1
  35. package/lib/distill.mjs +5 -2
  36. package/lib/docs-verify.mjs +2 -1
  37. package/lib/doctor/cli.mjs +1 -0
  38. package/lib/doctor/command-on-path.mjs +24 -0
  39. package/lib/doctor/diagnosis.mjs +109 -0
  40. package/lib/doctor/embedding-health.mjs +50 -0
  41. package/lib/doctor/engine-health.mjs +93 -0
  42. package/lib/doctor/graph-validate.mjs +47 -0
  43. package/lib/doctor/index.mjs +23 -4
  44. package/lib/doctor/sidecar-providers.mjs +56 -0
  45. package/lib/doctor/watchers/consistency.mjs +93 -1
  46. package/lib/doctor/watchers/cx-budget.mjs +1 -1
  47. package/lib/doctor/watchers/graph-staleness.mjs +1 -1
  48. package/lib/doctor/watchers/mcp-protocol.mjs +17 -0
  49. package/lib/doctor/watchers/oracle-liveness.mjs +92 -0
  50. package/lib/doctor/watchers/orchestration-runs.mjs +108 -0
  51. package/lib/doctor/watchers/provider-breaker.mjs +78 -0
  52. package/lib/document-export.mjs +52 -27
  53. package/lib/document-extract/docling-client.mjs +9 -5
  54. package/lib/document-extract/docling-sidecar.py +30 -0
  55. package/lib/document-extract.mjs +1 -1
  56. package/lib/document-ingest.mjs +9 -0
  57. package/lib/embed/approval-queue.mjs +184 -88
  58. package/lib/embed/authority-guard.mjs +65 -2
  59. package/lib/embed/capability-jobs.mjs +365 -0
  60. package/lib/embed/capability-lifecycle.mjs +219 -0
  61. package/lib/embed/capability-loader.mjs +303 -0
  62. package/lib/embed/capability-runtime.mjs +58 -0
  63. package/lib/embed/cli.mjs +185 -8
  64. package/lib/embed/config.mjs +4 -0
  65. package/lib/embed/daemon.mjs +125 -6
  66. package/lib/embed/demand-fetch.mjs +190 -54
  67. package/lib/embed/inbox.mjs +12 -10
  68. package/lib/embed/presets/ops-triage.mjs +236 -0
  69. package/lib/embed/presets/pm-feedback.mjs +341 -0
  70. package/lib/embed/presets/tpm.mjs +401 -0
  71. package/lib/embed/providers/jira.mjs +72 -1
  72. package/lib/embed/providers/registry.mjs +140 -33
  73. package/lib/embed/worker.mjs +5 -0
  74. package/lib/embedded-contract/capability.mjs +4 -0
  75. package/lib/embedded-contract/execution.mjs +1 -1
  76. package/lib/embedded-contract/model-resolve.mjs +53 -3
  77. package/lib/embedded-contract/workflow-defs.mjs +48 -73
  78. package/lib/embedded-contract/workflow-invoke.mjs +144 -4
  79. package/lib/embedded-contract/workflows/architecture-review.manifest.json +15 -0
  80. package/lib/embedded-contract/workflows/data-structure.manifest.json +14 -0
  81. package/lib/embedded-contract/workflows/evidence-ingest.manifest.json +14 -0
  82. package/lib/embedded-contract/workflows/memo-draft.manifest.json +14 -0
  83. package/lib/embedded-contract/workflows/operations-triage.manifest.json +18 -0
  84. package/lib/embedded-contract/workflows/operations.manifest.json +18 -0
  85. package/lib/embedded-contract/workflows/pm-feedback.manifest.json +18 -0
  86. package/lib/embedded-contract/workflows/prd-draft.manifest.json +15 -0
  87. package/lib/embedded-contract/workflows/proposal-review.manifest.json +15 -0
  88. package/lib/embedded-contract/workflows/research-synthesis.manifest.json +14 -0
  89. package/lib/embedded-contract/workflows/risk-review.manifest.json +15 -0
  90. package/lib/embedded-contract/workflows/structure-notes.manifest.json +14 -0
  91. package/lib/embedded-contract/workflows/transcript-process.manifest.json +14 -0
  92. package/lib/embedded-contract/workflows/triage.manifest.json +14 -0
  93. package/lib/env-config.mjs +60 -11
  94. package/lib/export-validate.mjs +34 -2
  95. package/lib/extensions/index.mjs +27 -0
  96. package/lib/extensions/loader.mjs +120 -0
  97. package/lib/extensions/manifest-schema.mjs +141 -0
  98. package/lib/extensions/manifests/anthropic.manifest.json +12 -0
  99. package/lib/extensions/manifests/atlassian-confluence.manifest.json +12 -0
  100. package/lib/extensions/manifests/atlassian-jira.manifest.json +53 -0
  101. package/lib/extensions/manifests/directory.manifest.json +12 -0
  102. package/lib/extensions/manifests/docling.manifest.json +37 -0
  103. package/lib/extensions/manifests/echo.manifest.json +8 -0
  104. package/lib/extensions/manifests/feedback.manifest.json +12 -0
  105. package/lib/extensions/manifests/github-copilot.manifest.json +12 -0
  106. package/lib/extensions/manifests/github.manifest.json +52 -0
  107. package/lib/extensions/manifests/linear.manifest.json +50 -0
  108. package/lib/extensions/manifests/local.manifest.json +12 -0
  109. package/lib/extensions/manifests/ollama.manifest.json +12 -0
  110. package/lib/extensions/manifests/openai.manifest.json +12 -0
  111. package/lib/extensions/manifests/openrouter-anthropic.manifest.json +12 -0
  112. package/lib/extensions/manifests/openrouter-deepseek.manifest.json +12 -0
  113. package/lib/extensions/manifests/openrouter-google.manifest.json +12 -0
  114. package/lib/extensions/manifests/openrouter-llama.manifest.json +12 -0
  115. package/lib/extensions/manifests/openrouter-qwen.manifest.json +12 -0
  116. package/lib/extensions/manifests/openrouter.manifest.json +12 -0
  117. package/lib/extensions/manifests/postgres.manifest.json +12 -0
  118. package/lib/extensions/manifests/salesforce.manifest.json +12 -0
  119. package/lib/extensions/manifests/slack.manifest.json +58 -0
  120. package/lib/extensions/manifests/whisper.manifest.json +36 -0
  121. package/lib/extensions/validate.mjs +175 -0
  122. package/lib/features.mjs +13 -9
  123. package/lib/flows/checkpoint.mjs +184 -0
  124. package/lib/flows/constants.mjs +27 -0
  125. package/lib/flows/define.mjs +146 -0
  126. package/lib/flows/engine.mjs +249 -0
  127. package/lib/flows/errors.mjs +19 -0
  128. package/lib/flows/index.mjs +27 -0
  129. package/lib/flows/joins.mjs +18 -0
  130. package/lib/flows/schema.mjs +90 -0
  131. package/lib/flows/state.mjs +31 -0
  132. package/lib/frameworks/loader.mjs +99 -0
  133. package/lib/frameworks/schema.mjs +157 -0
  134. package/lib/graph/build-from-corpus.mjs +67 -0
  135. package/lib/graph/build-from-embed.mjs +82 -0
  136. package/lib/graph/build-from-registry.mjs +164 -3
  137. package/lib/graph/cli.mjs +456 -12
  138. package/lib/graph/gap-queries.mjs +156 -0
  139. package/lib/graph/gaps.mjs +41 -0
  140. package/lib/graph/impacted.mjs +129 -0
  141. package/lib/graph/runtime-evidence.mjs +177 -0
  142. package/lib/graph/security-coverage.mjs +113 -0
  143. package/lib/graph/staleness.mjs +241 -10
  144. package/lib/graph/store.mjs +24 -7
  145. package/lib/graph/validate.mjs +161 -0
  146. package/lib/headhunt.mjs +9 -8
  147. package/lib/health-check.mjs +15 -7
  148. package/lib/hook-health.mjs +1 -1
  149. package/lib/hooks/agent-tracker.mjs +10 -4
  150. package/lib/hooks/edit-guard.mjs +3 -3
  151. package/lib/hooks/graph-impact-advisory.mjs +2 -2
  152. package/lib/hooks/guard-bash.mjs +41 -15
  153. package/lib/hooks/mcp-health-check.mjs +11 -4
  154. package/lib/hooks/model-fallback.mjs +50 -6
  155. package/lib/hooks/orchestration-dispatch-guard.mjs +14 -3
  156. package/lib/hooks/pre-compact.mjs +181 -173
  157. package/lib/hooks/rule-verifier.mjs +2 -1
  158. package/lib/hooks/session-reflect.mjs +2 -1
  159. package/lib/hooks/session-start.mjs +3 -3
  160. package/lib/host/readiness.mjs +109 -0
  161. package/lib/host-capabilities.mjs +13 -2
  162. package/lib/host-disposition.mjs +29 -8
  163. package/lib/identity.mjs +92 -0
  164. package/lib/ingest/degraded-extract.mjs +96 -0
  165. package/lib/ingest/docling-remote.mjs +2 -1
  166. package/lib/ingest/provider-extract.mjs +7 -19
  167. package/lib/ingest/sidecar-providers.mjs +196 -0
  168. package/lib/ingest-tooling.mjs +11 -5
  169. package/lib/init-unified.mjs +55 -38
  170. package/lib/init-update.mjs +2 -1
  171. package/lib/install/legacy-global-cleanup.mjs +25 -0
  172. package/lib/install/stage-project.mjs +41 -4
  173. package/lib/intake/daemon.mjs +99 -8
  174. package/lib/intake/git-queue.mjs +110 -38
  175. package/lib/intake/prepare.mjs +2 -0
  176. package/lib/intake/queue-registry.mjs +50 -0
  177. package/lib/intake/queue.mjs +133 -17
  178. package/lib/intake/session-prelude.mjs +57 -8
  179. package/lib/integrations/intake-integrations.mjs +61 -111
  180. package/lib/intent-classifier.mjs +43 -5
  181. package/lib/libreoffice-export.mjs +8 -8
  182. package/lib/logging/rotate.mjs +5 -4
  183. package/lib/mcp/broker.mjs +332 -17
  184. package/lib/mcp/denied-store.mjs +95 -0
  185. package/lib/mcp/destructive-approval.mjs +57 -0
  186. package/lib/mcp/destructive-gate.mjs +30 -0
  187. package/lib/mcp/dispatch-envelope.mjs +199 -0
  188. package/lib/mcp/memory-bridge.mjs +2 -1
  189. package/lib/mcp/server.mjs +185 -1268
  190. package/lib/mcp/tool-definitions-memory.mjs +376 -0
  191. package/lib/mcp/tool-definitions-project.mjs +271 -0
  192. package/lib/mcp/tool-definitions-skills.mjs +311 -0
  193. package/lib/mcp/tool-definitions-workflow.mjs +398 -0
  194. package/lib/mcp/tool-definitions.mjs +25 -0
  195. package/lib/mcp/tool-rate-limit.mjs +47 -0
  196. package/lib/mcp/tool-registry.mjs +107 -0
  197. package/lib/mcp/tool-safety.mjs +95 -0
  198. package/lib/mcp/tool-surface-parity.mjs +60 -0
  199. package/lib/mcp/tools/orchestration-delegation-next.tool.mjs +68 -0
  200. package/lib/mcp/tools/orchestration-run.mjs +197 -19
  201. package/lib/mcp/tools/orchestration-task-result.tool.mjs +77 -0
  202. package/lib/mcp/tools/project.mjs +25 -8
  203. package/lib/mcp/tools/provider-write.mjs +187 -0
  204. package/lib/mcp/tools/scope.mjs +0 -3
  205. package/lib/mcp/tools/skills.mjs +1 -1
  206. package/lib/mcp/tools/storage.mjs +2 -2
  207. package/lib/mcp/tools/web-search-governance.mjs +96 -0
  208. package/lib/mcp/tools/web-search.mjs +5 -76
  209. package/lib/mcp/transport/auth.mjs +238 -0
  210. package/lib/mcp/transport/http.mjs +136 -0
  211. package/lib/mcp/transport/mode.mjs +31 -0
  212. package/lib/mcp/transport/stdio.mjs +22 -0
  213. package/lib/mcp-catalog.json +4 -4
  214. package/lib/mcp-manager.mjs +34 -23
  215. package/lib/mcp-platform-config.mjs +53 -20
  216. package/lib/mode-capabilities.mjs +109 -0
  217. package/lib/model-router.mjs +42 -9
  218. package/lib/models/catalog.mjs +40 -1
  219. package/lib/net-guard.mjs +247 -0
  220. package/lib/observation-store.mjs +6 -2
  221. package/lib/ollama/provision-context.mjs +2 -1
  222. package/lib/opencode-config.mjs +22 -3
  223. package/lib/opencode-runtime-plugin.mjs +120 -2
  224. package/lib/oracle/actions.mjs +204 -10
  225. package/lib/oracle/cli.mjs +24 -3
  226. package/lib/oracle/daemon-entry.mjs +6 -0
  227. package/lib/oracle/dispatch.mjs +2 -1
  228. package/lib/oracle/execute.mjs +2 -2
  229. package/lib/oracle/gaps.mjs +3 -3
  230. package/lib/oracle/heartbeat.mjs +53 -0
  231. package/lib/oracle/read-model.mjs +69 -13
  232. package/lib/oracle/reconcile.mjs +3 -46
  233. package/lib/oracle/routing.mjs +37 -31
  234. package/lib/oracle/synthesize.mjs +1 -1
  235. package/lib/orchestration/classification.mjs +434 -0
  236. package/lib/orchestration/delegation-flow.mjs +132 -0
  237. package/lib/orchestration/flow-selection.mjs +418 -0
  238. package/lib/orchestration/gates.mjs +244 -0
  239. package/lib/orchestration/host-sampling.mjs +121 -0
  240. package/lib/orchestration/policy-constants.mjs +48 -0
  241. package/lib/orchestration/provider-outcome.mjs +197 -0
  242. package/lib/orchestration/readiness.mjs +114 -13
  243. package/lib/orchestration/run-store-postgres.mjs +32 -26
  244. package/lib/orchestration/run-store-sqlite.mjs +8 -14
  245. package/lib/orchestration/run-store.mjs +25 -12
  246. package/lib/orchestration/runtime.mjs +508 -62
  247. package/lib/orchestration/store.mjs +87 -12
  248. package/lib/orchestration/trace-store.mjs +125 -0
  249. package/lib/orchestration/web-capability.mjs +60 -0
  250. package/lib/orchestration/worker-runtime.mjs +162 -0
  251. package/lib/orchestration/worker.mjs +763 -80
  252. package/lib/orchestration-policy.mjs +67 -1111
  253. package/lib/output-quality.mjs +61 -2
  254. package/lib/packs/cli.mjs +144 -0
  255. package/lib/packs/core-pack.mjs +112 -0
  256. package/lib/packs/enablement.mjs +187 -0
  257. package/lib/packs/index.mjs +23 -0
  258. package/lib/packs/loader.mjs +176 -0
  259. package/lib/packs/manifest-schema.mjs +58 -0
  260. package/lib/packs/prompts.mjs +120 -0
  261. package/lib/packs/validate.mjs +208 -0
  262. package/lib/path-policy.mjs +56 -0
  263. package/lib/plugin-registry.mjs +4 -5
  264. package/lib/policy/audit-gate.mjs +42 -0
  265. package/lib/policy/consumption-budget.mjs +149 -0
  266. package/lib/policy/engine.mjs +81 -6
  267. package/lib/policy/role-authority.mjs +89 -0
  268. package/lib/prompt-composer.js +19 -3
  269. package/lib/providers/contract/adapters/confluence/governed-write.mjs +215 -0
  270. package/lib/providers/contract/adapters/confluence/manifest.json +17 -0
  271. package/lib/providers/contract/adapters/confluence/transport.mjs +135 -0
  272. package/lib/providers/contract/adapters/github/governed-write.mjs +121 -0
  273. package/lib/providers/contract/adapters/github/index.mjs +38 -3
  274. package/lib/providers/contract/adapters/jira/adf.mjs +151 -0
  275. package/lib/providers/contract/adapters/jira/createmeta.mjs +143 -0
  276. package/lib/providers/contract/adapters/jira/governed-write.mjs +182 -0
  277. package/lib/providers/contract/adapters/jira/manifest.json +17 -0
  278. package/lib/providers/contract/adapters/jira/transport.mjs +119 -0
  279. package/lib/providers/contract.mjs +207 -0
  280. package/lib/providers/credential-bootstrap.mjs +7 -4
  281. package/lib/providers/credential-sources.mjs +14 -2
  282. package/lib/providers/directory/index.mjs +261 -0
  283. package/lib/providers/feedback/index.mjs +392 -0
  284. package/lib/providers/filter-audit.mjs +68 -0
  285. package/lib/providers/filter-schema.mjs +54 -0
  286. package/lib/providers/github/index.mjs +31 -0
  287. package/lib/providers/instance-config.mjs +215 -0
  288. package/lib/providers/op-locate.mjs +96 -0
  289. package/lib/providers/op-run.mjs +64 -9
  290. package/lib/providers/registry.mjs +26 -3
  291. package/lib/providers/secret-audit-wiring.mjs +41 -18
  292. package/lib/providers/secret-resolver.mjs +263 -31
  293. package/lib/publish-template.mjs +6 -3
  294. package/lib/publish-tooling.mjs +4 -0
  295. package/lib/publish.mjs +32 -4
  296. package/lib/queue/pg-queue.mjs +395 -0
  297. package/lib/reflect.mjs +2 -1
  298. package/lib/registry/assemble.mjs +28 -2
  299. package/lib/registry/catalog.mjs +6 -0
  300. package/lib/registry/consolidation.mjs +8 -1
  301. package/lib/registry/custom-scaffold.mjs +200 -0
  302. package/lib/registry/custom-schema.mjs +137 -0
  303. package/lib/registry/loader.mjs +15 -4
  304. package/lib/registry/manifests/format-engines.default.json +15 -0
  305. package/lib/registry/manifests/surface-map.default.json +46 -0
  306. package/lib/registry/retired-paths.mjs +1 -0
  307. package/lib/registry/surface-map.mjs +100 -50
  308. package/lib/registry/validate.mjs +3 -3
  309. package/lib/render-visual-check.mjs +240 -0
  310. package/lib/resources/budget.mjs +40 -17
  311. package/lib/roles/flavor-bindings.mjs +36 -14
  312. package/lib/roles/gateway.mjs +15 -8
  313. package/lib/roots.mjs +107 -0
  314. package/lib/runtime/uv-bootstrap.mjs +32 -6
  315. package/lib/runtime/whisper-bootstrap.mjs +11 -3
  316. package/lib/runtime-env.mjs +5 -2
  317. package/lib/sandbox.mjs +1 -1
  318. package/lib/scheduler/index.mjs +8 -20
  319. package/lib/schema-infer.mjs +31 -2
  320. package/lib/scopes/lifecycle.mjs +29 -25
  321. package/lib/scopes/loader.mjs +49 -12
  322. package/lib/scopes/teams.mjs +1 -1
  323. package/lib/security/ingest-boundary.mjs +80 -0
  324. package/lib/security/recall-wrapper.mjs +99 -0
  325. package/lib/security/trust.mjs +132 -0
  326. package/lib/service-manager.mjs +93 -24
  327. package/lib/setup.mjs +41 -23
  328. package/lib/skills-apply.mjs +4 -2
  329. package/lib/specialists/postconditions.mjs +2 -2
  330. package/lib/state-root.mjs +147 -0
  331. package/lib/status.mjs +597 -6
  332. package/lib/storage/admin.mjs +84 -7
  333. package/lib/storage/backend-registry.mjs +73 -0
  334. package/lib/storage/backend.mjs +63 -9
  335. package/lib/storage/embeddings-openai.mjs +12 -2
  336. package/lib/storage/hybrid-query.mjs +11 -3
  337. package/lib/storage/retrieval-hardening.mjs +384 -0
  338. package/lib/storage/shared-memory.mjs +158 -0
  339. package/lib/storage/vector-client.mjs +69 -2
  340. package/lib/team/health.mjs +72 -0
  341. package/lib/telemetry/backends/local.mjs +9 -3
  342. package/lib/telemetry/client.mjs +3 -7
  343. package/lib/template-registry.mjs +10 -12
  344. package/lib/tenant/context.mjs +82 -0
  345. package/lib/tenant/isolation.mjs +129 -0
  346. package/lib/test-corpus-inventory.mjs +103 -2
  347. package/lib/uninstall/uninstall.mjs +78 -12
  348. package/lib/validator.mjs +4 -6
  349. package/lib/worker/entrypoint.mjs +2 -1
  350. package/lib/worker/run.mjs +2 -2
  351. package/lib/worker/trace.mjs +5 -11
  352. package/lib/workflow-state.mjs +52 -8
  353. package/lib/workflows/liveness.mjs +203 -0
  354. package/lib/workflows/loader.mjs +177 -0
  355. package/lib/workflows/manifest-schema.mjs +71 -0
  356. package/lib/workflows/surface-parity.mjs +118 -0
  357. package/lib/workflows/validate.mjs +127 -0
  358. package/lib/writes/control-plane.mjs +140 -0
  359. package/lib/writes/envelope.mjs +206 -0
  360. package/lib/writes/sent-log.mjs +86 -0
  361. package/lib/writes/write-intent.mjs +109 -0
  362. package/package.json +20 -7
  363. package/personas/construct.md +12 -3
  364. package/registry/agent-manifest.json +117 -0
  365. package/registry/capabilities.json +1987 -0
  366. package/rules/common/comments.md +1 -0
  367. package/schemas/brand-voice.schema.json +24 -0
  368. package/schemas/capability-registry.schema.json +72 -0
  369. package/schemas/certification-run.schema.json +130 -0
  370. package/schemas/demo-recording.schema.json +46 -0
  371. package/schemas/eval-dataset.schema.json +79 -0
  372. package/schemas/execution-capability-profile.schema.json +46 -0
  373. package/schemas/execution-policy.schema.json +114 -0
  374. package/schemas/improvement-proposal.schema.json +65 -0
  375. package/schemas/mcp-tool-output.schema.json +61 -0
  376. package/schemas/platform-capabilities.schema.json +83 -0
  377. package/schemas/project-config.schema.json +215 -0
  378. package/schemas/project-demo.schema.json +60 -0
  379. package/schemas/provider-behavior-matrix.schema.json +91 -0
  380. package/schemas/scope.schema.json +197 -0
  381. package/schemas/specialist-trace.schema.json +107 -0
  382. package/schemas/team.schema.json +99 -0
  383. package/schemas/unified-registry.schema.json +546 -0
  384. package/scripts/sync-specialists.mjs +336 -106
  385. package/skills/docs/adr-workflow.md +1 -1
  386. package/skills/docs/codebase-research-workflow.md +3 -3
  387. package/skills/docs/prd-workflow.md +5 -6
  388. package/skills/docs/runbook-workflow.md +2 -2
  389. package/skills/docs/user-research-workflow.md +3 -3
  390. package/skills/operating/fleet-health-routing.md +77 -0
  391. package/skills/roles/ai-engineer.md +1 -1
  392. package/skills/roles/architect.md +0 -1
  393. package/skills/roles/business-strategist.md +1 -1
  394. package/skills/roles/data-analyst.telemetry.md +1 -1
  395. package/skills/roles/data-engineer.md +1 -1
  396. package/skills/roles/data-engineer.pipeline.md +1 -1
  397. package/skills/roles/data-engineer.vector-retrieval.md +1 -2
  398. package/skills/roles/data-engineer.warehouse.md +1 -1
  399. package/skills/roles/designer.accessibility.md +1 -1
  400. package/skills/roles/designer.md +0 -1
  401. package/skills/roles/devil-advocate.md +1 -1
  402. package/skills/roles/docs-keeper.md +1 -1
  403. package/skills/roles/evaluator.md +1 -1
  404. package/skills/roles/explorer.md +1 -1
  405. package/skills/roles/platform-engineer.md +1 -1
  406. package/skills/roles/qa.ai-eval.md +1 -2
  407. package/skills/roles/qa.api-contract.md +0 -1
  408. package/skills/roles/qa.data-pipeline.md +0 -1
  409. package/skills/roles/qa.md +0 -1
  410. package/skills/roles/qa.web-ui.md +0 -1
  411. package/skills/roles/release-manager.md +1 -1
  412. package/skills/roles/researcher.md +0 -2
  413. package/skills/roles/reviewer.md +0 -3
  414. package/skills/roles/security.ai.md +1 -1
  415. package/skills/roles/security.legal-compliance.md +1 -1
  416. package/skills/roles/security.md +0 -1
  417. package/skills/roles/security.privacy.md +0 -1
  418. package/skills/roles/security.supply-chain.md +1 -1
  419. package/skills/roles/sre.md +1 -1
  420. package/skills/roles/test-automation.md +1 -1
  421. package/skills/roles/trace-reviewer.md +1 -1
  422. package/skills/roles/ux-researcher.md +1 -1
  423. package/specialists/artifact-manifest.json +36 -36
  424. package/specialists/org/contracts/accessibility-to-qa.json +11 -3
  425. package/specialists/org/contracts/any-to-business-strategist.json +19 -7
  426. package/specialists/org/contracts/any-to-debugger.json +7 -1
  427. package/specialists/org/contracts/any-to-designer.json +7 -1
  428. package/specialists/org/contracts/any-to-docs-keeper.json +18 -4
  429. package/specialists/org/contracts/any-to-explorer.json +13 -4
  430. package/specialists/org/contracts/any-to-sre-incident.json +6 -2
  431. package/specialists/org/contracts/any-to-trace-reviewer.json +16 -4
  432. package/specialists/org/contracts/architect-to-ai-engineer.json +6 -2
  433. package/specialists/org/contracts/architect-to-data-engineer.json +17 -5
  434. package/specialists/org/contracts/architect-to-devil-advocate.json +11 -3
  435. package/specialists/org/contracts/architect-to-engineer.json +20 -4
  436. package/specialists/org/contracts/architect-to-evaluator.json +15 -5
  437. package/specialists/org/contracts/architect-to-legal-compliance.json +15 -5
  438. package/specialists/org/contracts/architect-to-operations.json +17 -4
  439. package/specialists/org/contracts/architect-to-platform-engineer.json +20 -4
  440. package/specialists/org/contracts/construct-to-orchestrator.json +10 -2
  441. package/specialists/org/contracts/data-analyst-to-product-manager.json +11 -2
  442. package/specialists/org/contracts/engineer-to-qa.json +20 -4
  443. package/specialists/org/contracts/engineer-to-reviewer.json +29 -5
  444. package/specialists/org/contracts/explorer-to-engineer.json +11 -3
  445. package/specialists/org/contracts/legal-compliance-to-release-manager.json +12 -4
  446. package/specialists/org/contracts/operations-to-user.json +53 -0
  447. package/specialists/org/contracts/operations-triage-output.json +53 -0
  448. package/specialists/org/contracts/pm-requirements-candidates.json +53 -0
  449. package/specialists/org/contracts/product-manager-to-architect.json +30 -10
  450. package/specialists/org/contracts/product-manager-to-data-analyst.json +13 -3
  451. package/specialists/org/contracts/product-manager-to-ux-researcher.json +15 -5
  452. package/specialists/org/contracts/qa-to-release-manager.json +11 -3
  453. package/specialists/org/contracts/researcher-to-architect.json +10 -2
  454. package/specialists/org/contracts/researcher-to-product-manager.json +16 -5
  455. package/specialists/org/contracts/reviewer-to-security.json +17 -3
  456. package/specialists/org/contracts/test-automation-to-engineer.json +11 -3
  457. package/specialists/org/contracts/trace-reviewer-to-sre.json +12 -4
  458. package/specialists/org/contracts/user-to-construct.json +11 -4
  459. package/specialists/org/frameworks/cx-architect-constraint-option-failure.md +66 -0
  460. package/specialists/org/frameworks/cx-engineer-feasibility-blast-radius.md +66 -0
  461. package/specialists/org/frameworks/cx-ops-dependency-sequencing.md +74 -0
  462. package/specialists/org/frameworks/cx-pm-value-tradeoff.md +66 -0
  463. package/specialists/org/frameworks/cx-qa-risk-based-coverage.md +69 -0
  464. package/specialists/org/groups/engineering-group.json +2 -6
  465. package/specialists/org/groups/governance-group.json +2 -3
  466. package/specialists/org/groups/operations-group.json +5 -8
  467. package/specialists/org/groups/product-group.json +4 -8
  468. package/specialists/org/groups/quality-group.json +3 -7
  469. package/specialists/org/groups/strategy-group.json +6 -9
  470. package/specialists/org/models.json.example +8 -0
  471. package/specialists/org/scopes/creative.json +6 -1
  472. package/specialists/org/scopes/operations.json +7 -1
  473. package/specialists/org/scopes/research.json +6 -1
  474. package/specialists/org/scopes/rnd.json +7 -1
  475. package/specialists/org/specialists/cx-architect.json +27 -8
  476. package/specialists/org/specialists/cx-designer.json +22 -8
  477. package/specialists/org/specialists/cx-engineer.json +71 -7
  478. package/specialists/org/specialists/cx-operations.json +89 -15
  479. package/specialists/org/specialists/cx-orchestrator.json +16 -4
  480. package/specialists/org/specialists/cx-product-manager.json +28 -9
  481. package/specialists/org/specialists/cx-qa.json +16 -6
  482. package/specialists/org/specialists/cx-researcher.json +41 -7
  483. package/specialists/org/specialists/cx-reviewer.json +61 -11
  484. package/specialists/org/specialists/cx-security.json +30 -10
  485. package/specialists/org/teams/design-team.json +3 -4
  486. package/specialists/org/teams/engineering-team.json +3 -10
  487. package/specialists/org/teams/governance-team.json +3 -5
  488. package/specialists/org/teams/operations-team.json +6 -12
  489. package/specialists/org/teams/product-management-team.json +2 -3
  490. package/specialists/org/teams/quality-team.json +4 -12
  491. package/specialists/org/teams/research-team.json +3 -3
  492. package/specialists/org/teams/strategy-team.json +7 -14
  493. package/specialists/prompts/cx-architect.md +20 -1
  494. package/specialists/prompts/cx-data-analyst.md +1 -1
  495. package/specialists/prompts/cx-designer.md +12 -4
  496. package/specialists/prompts/cx-engineer.md +15 -1
  497. package/specialists/prompts/cx-operations.md +14 -2
  498. package/specialists/prompts/cx-orchestrator.md +9 -5
  499. package/specialists/prompts/cx-product-manager.md +5 -1
  500. package/specialists/prompts/cx-qa.md +6 -2
  501. package/specialists/prompts/cx-researcher.md +27 -31
  502. package/specialists/prompts/cx-reviewer.md +19 -1
  503. package/specialists/prompts/cx-security.md +5 -1
  504. package/templates/distribution/construct-brand.typ +123 -59
  505. package/templates/distribution/construct-decision.typ +6 -3
  506. package/templates/distribution/construct-pdf.typ +11 -4
  507. package/templates/distribution/construct-prd.typ +6 -3
  508. package/templates/distribution/construct-research.typ +7 -4
  509. package/vendor/pandoc-ext/README.md +3 -0
  510. package/vendor/pandoc-ext/diagram.lua +687 -0
  511. package/lib/providers/contract/adapters/git/index.mjs +0 -115
  512. package/lib/providers/contract/adapters/slack/index.mjs +0 -175
  513. package/specialists/org/contracts/business-strategist-to-product-manager.json +0 -39
  514. package/specialists/org/contracts/construct-to-rd-lead.json +0 -53
  515. package/specialists/org/contracts/data-engineer-to-platform-engineer.json +0 -36
  516. package/specialists/org/contracts/designer-to-accessibility.json +0 -36
  517. package/specialists/org/contracts/platform-engineer-to-engineer.json +0 -31
  518. package/specialists/org/contracts/qa-to-test-automation.json +0 -42
  519. package/specialists/org/contracts/rd-lead-to-architect.json +0 -38
  520. package/specialists/org/contracts/sre-to-release-manager.json +0 -36
  521. package/specialists/org/specialists/cx-accessibility.json +0 -69
  522. package/specialists/org/specialists/cx-ai-engineer.json +0 -75
  523. package/specialists/org/specialists/cx-business-strategist.json +0 -72
  524. package/specialists/org/specialists/cx-data-engineer.json +0 -71
  525. package/specialists/org/specialists/cx-devil-advocate.json +0 -71
  526. package/specialists/org/specialists/cx-docs-keeper.json +0 -82
  527. package/specialists/org/specialists/cx-evaluator.json +0 -69
  528. package/specialists/org/specialists/cx-explorer.json +0 -69
  529. package/specialists/org/specialists/cx-legal-compliance.json +0 -74
  530. package/specialists/org/specialists/cx-oracle.json +0 -46
  531. package/specialists/org/specialists/cx-platform-engineer.json +0 -80
  532. package/specialists/org/specialists/cx-rd-lead.json +0 -73
  533. package/specialists/org/specialists/cx-release-manager.json +0 -77
  534. package/specialists/org/specialists/cx-sre.json +0 -94
  535. package/specialists/org/specialists/cx-test-automation.json +0 -69
  536. package/specialists/org/specialists/cx-trace-reviewer.json +0 -69
  537. package/specialists/org/specialists/cx-ux-researcher.json +0 -68
  538. package/specialists/org/teams/accessibility-team.json +0 -39
  539. package/specialists/org/teams/ux-research-team.json +0 -39
  540. package/specialists/prompts/cx-accessibility.md +0 -55
  541. package/specialists/prompts/cx-ai-engineer.md +0 -124
  542. package/specialists/prompts/cx-business-strategist.md +0 -58
  543. package/specialists/prompts/cx-data-engineer.md +0 -55
  544. package/specialists/prompts/cx-devil-advocate.md +0 -59
  545. package/specialists/prompts/cx-docs-keeper.md +0 -164
  546. package/specialists/prompts/cx-evaluator.md +0 -49
  547. package/specialists/prompts/cx-explorer.md +0 -71
  548. package/specialists/prompts/cx-legal-compliance.md +0 -58
  549. package/specialists/prompts/cx-oracle.md +0 -98
  550. package/specialists/prompts/cx-platform-engineer.md +0 -97
  551. package/specialists/prompts/cx-rd-lead.md +0 -59
  552. package/specialists/prompts/cx-release-manager.md +0 -54
  553. package/specialists/prompts/cx-sre.md +0 -111
  554. package/specialists/prompts/cx-test-automation.md +0 -55
  555. package/specialists/prompts/cx-trace-reviewer.md +0 -101
  556. package/specialists/prompts/cx-ux-researcher.md +0 -53
@@ -0,0 +1,27 @@
1
+ /**
2
+ * lib/extensions/index.mjs — public API for the extension manifest system.
3
+ *
4
+ * Re-exports all symbols from the three extension sub-modules so consumers
5
+ * can import from a single entry point:
6
+ *
7
+ * import { validateManifest, loadManifestsFromDir, MANIFEST_KINDS } from './extensions/index.mjs';
8
+ */
9
+
10
+ export {
11
+ MANIFEST_KINDS,
12
+ REQUIRED_FIELDS,
13
+ OPTIONAL_FIELDS,
14
+ COMPAT_VERSION,
15
+ ALLOWED_SECRET_ENV_PREFIXES,
16
+ ESCALATION_SENSITIVE_KINDS,
17
+ KNOWN_REQUESTABLE_TOOL_GRANTS,
18
+ BUILTIN_SPECIALIST_IDS,
19
+ } from './manifest-schema.mjs';
20
+
21
+ export { validateManifest } from './validate.mjs';
22
+
23
+ export {
24
+ loadManifestsFromDir,
25
+ mergeManifests,
26
+ resolveManifestDirs,
27
+ } from './loader.mjs';
@@ -0,0 +1,120 @@
1
+ /**
2
+ * lib/extensions/loader.mjs — extension manifest directory loader and merger.
3
+ *
4
+ * Three manifest tiers exist: builtin (shipped with Construct), user (in
5
+ * ~/.config/construct/providers/), and project (in .cx/providers/). Project
6
+ * manifests take highest precedence; user manifests override builtin.
7
+ *
8
+ * `loadManifestsFromDir` reads every *.manifest.json in a directory and
9
+ * validates each one. Errors are collected without throwing. `mergeManifests`
10
+ * merges the three tiers by id. `resolveManifestDirs` returns the canonical
11
+ * paths for each tier.
12
+ */
13
+
14
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
15
+ import { dirname, join, resolve } from 'node:path';
16
+ import { fileURLToPath } from 'node:url';
17
+
18
+ import { validateManifest } from './validate.mjs';
19
+
20
+ const __dirname = dirname(fileURLToPath(import.meta.url));
21
+
22
+ /** Root of the Construct package (parent of lib/). */
23
+ const PACKAGE_ROOT = resolve(__dirname, '..', '..');
24
+
25
+ /**
26
+ * loadManifestsFromDir(dirPath, { strict } = {})
27
+ *
28
+ * Reads all `*.manifest.json` files in dirPath, validates each one, and
29
+ * returns a result object. Files that fail JSON parsing or validation are
30
+ * collected in `errors`; valid manifests are collected in `manifests`.
31
+ *
32
+ * When `strict` is true, manifests are validated with the strict-mode
33
+ * hardening checks (unknown field rejection, env key allowlist, etc.).
34
+ *
35
+ * @param {string} dirPath - Absolute path to search.
36
+ * @param {{ strict?: boolean }} [opts]
37
+ * @returns {{ manifests: object[], errors: string[] }}
38
+ */
39
+ export function loadManifestsFromDir(dirPath, { strict = false } = {}) {
40
+ const manifests = [];
41
+ const errors = [];
42
+
43
+ if (!existsSync(dirPath)) {
44
+ return { manifests, errors };
45
+ }
46
+
47
+ let entries;
48
+ try {
49
+ entries = readdirSync(dirPath, { withFileTypes: true });
50
+ } catch (err) {
51
+ errors.push(`${dirPath}: failed to read directory (${err.message})`);
52
+ return { manifests, errors };
53
+ }
54
+
55
+ const manifestFiles = entries
56
+ .filter((e) => e.isFile() && e.name.endsWith('.manifest.json'))
57
+ .map((e) => join(dirPath, e.name))
58
+ .sort();
59
+
60
+ for (const filePath of manifestFiles) {
61
+ let parsed;
62
+ try {
63
+ parsed = JSON.parse(readFileSync(filePath, 'utf8'));
64
+ } catch (err) {
65
+ errors.push(`${filePath}: failed to parse JSON (${err.message})`);
66
+ continue;
67
+ }
68
+
69
+ const result = validateManifest(parsed, { filePath, strict });
70
+ if (!result.valid) {
71
+ errors.push(...result.errors);
72
+ continue;
73
+ }
74
+
75
+ manifests.push({ ...parsed, _filePath: filePath });
76
+ }
77
+
78
+ return { manifests, errors };
79
+ }
80
+
81
+ /**
82
+ * mergeManifests(builtin, user, project)
83
+ *
84
+ * Merges three manifest arrays by `id`. Precedence (highest wins): project >
85
+ * user > builtin. When multiple tiers declare the same id, only the
86
+ * highest-precedence entry is kept.
87
+ *
88
+ * @param {object[]} builtin
89
+ * @param {object[]} user
90
+ * @param {object[]} project
91
+ * @returns {object[]}
92
+ */
93
+ export function mergeManifests(builtin = [], user = [], project = []) {
94
+ const map = new Map();
95
+
96
+ // Load lowest priority first so higher priority layers overwrite.
97
+ for (const m of builtin) map.set(m.id, m);
98
+ for (const m of user) map.set(m.id, m);
99
+ for (const m of project) map.set(m.id, m);
100
+
101
+ return [...map.values()];
102
+ }
103
+
104
+ /**
105
+ * resolveManifestDirs({ rootDir, homeDir })
106
+ *
107
+ * Returns the canonical directory paths for each manifest tier.
108
+ *
109
+ * @param {{ rootDir?: string, homeDir?: string }} opts
110
+ * @returns {{ builtin: string, user: string, project: string }}
111
+ */
112
+ export function resolveManifestDirs({ rootDir = process.cwd(), homeDir } = {}) {
113
+ const home = homeDir ?? (process.env.HOME || process.env.USERPROFILE || '');
114
+
115
+ return {
116
+ builtin: join(PACKAGE_ROOT, 'lib', 'extensions', 'manifests'),
117
+ user: join(home, '.config', 'construct', 'providers'),
118
+ project: join(rootDir, '.cx', 'providers'),
119
+ };
120
+ }
@@ -0,0 +1,141 @@
1
+ /**
2
+ * lib/extensions/manifest-schema.mjs — canonical extension manifest schema descriptor.
3
+ *
4
+ * Defines the vocabulary for extension manifests as per ADR-0052 (A2 architecture).
5
+ * A plain JS descriptor, not JSON Schema — the validator in validate.mjs
6
+ * consumes it directly. The schema is intentionally additive: new optional fields
7
+ * may be added in a minor version bump; new required fields or kind removals are
8
+ * breaking and require a COMPAT_VERSION increment.
9
+ */
10
+
11
+ /**
12
+ * All valid extension kind values. A manifest must declare exactly one.
13
+ *
14
+ * Taxonomy:
15
+ * model — LLM or embedding model provider
16
+ * data-source — read-only external data integration (GitHub, Jira, etc.)
17
+ * external-write — write-capable integration (creates issues, PRs, etc.)
18
+ * embed-index — vector index / retrieval surface
19
+ * mcp-tool — MCP-protocol tool or server
20
+ * storage — durable state backend (DB, blob store)
21
+ * queue — async message bus or task queue
22
+ * telemetry — observability sink (metrics, traces, logs)
23
+ * artifact-renderer — renders Construct artifact types to output formats
24
+ * specialist-pack — bundle of specialist persona definitions
25
+ * team-pack — pre-wired team configuration
26
+ * profile-pack — scope/profile bundle
27
+ * host-adapter — IDE or host-surface integration
28
+ * ingestion-provider — local document/audio ingestion sidecar (docling, whisper)
29
+ * provisioned outside npm; declares an install probe, a
30
+ * health check, and a degradation chain (LMCP-K2).
31
+ */
32
+ export const MANIFEST_KINDS = [
33
+ 'model',
34
+ 'data-source',
35
+ 'external-write',
36
+ 'embed-index',
37
+ 'mcp-tool',
38
+ 'storage',
39
+ 'queue',
40
+ 'telemetry',
41
+ 'artifact-renderer',
42
+ 'specialist-pack',
43
+ 'team-pack',
44
+ 'profile-pack',
45
+ 'host-adapter',
46
+ 'ingestion-provider',
47
+ ];
48
+
49
+ /**
50
+ * Fields every manifest must carry. Absence of any required field is a hard
51
+ * validation error and the manifest is rejected.
52
+ */
53
+ export const REQUIRED_FIELDS = ['id', 'version', 'kind'];
54
+
55
+ /**
56
+ * Fields a manifest may carry. These are not validated for shape — the
57
+ * validator checks only presence of required fields and semantic constraints.
58
+ * Extensions that add fields outside this list are accepted but their extra
59
+ * fields are ignored by core consumers.
60
+ */
61
+ export const OPTIONAL_FIELDS = [
62
+ 'capabilities',
63
+ 'configSchema',
64
+ 'secretEnvKeys',
65
+ 'modes',
66
+ 'surfaces',
67
+ 'operations',
68
+ 'healthCheck',
69
+ 'dryRun',
70
+ 'idempotency',
71
+ 'rateLimit',
72
+ 'retry',
73
+ 'degradation',
74
+ 'securityClassification',
75
+ 'approvalRequirements',
76
+ 'tests',
77
+ 'docs',
78
+ 'owner',
79
+ 'compatVersion',
80
+ 'installSource',
81
+ 'installDependencies',
82
+ 'installProbe',
83
+ 'removalStatus',
84
+ 'prompts',
85
+ 'toolGrantsRequested',
86
+ 'sourceTarget',
87
+ ];
88
+
89
+ /**
90
+ * Current schema version. A manifest with compatVersion > COMPAT_VERSION was
91
+ * written for a newer schema than this runtime understands — load is refused
92
+ * to prevent silent misinterpretation. Forward compatibility is not guaranteed.
93
+ */
94
+ export const COMPAT_VERSION = 1;
95
+
96
+ /**
97
+ * Environment variable prefixes that extension manifests are allowed to
98
+ * request via `secretEnvKeys`. Any env key that does not start with one of
99
+ * these prefixes is rejected in strict mode to prevent credential exfiltration
100
+ * via extension manifests.
101
+ */
102
+ export const ALLOWED_SECRET_ENV_PREFIXES = [
103
+ 'GITHUB_', 'GH_', 'JIRA_', 'CONFLUENCE_', 'SLACK_', 'SALESFORCE_',
104
+ 'ANTHROPIC_', 'OPENAI_', 'GOOGLE_', 'DEEPSEEK_', 'CONSTRUCT_',
105
+ 'AWS_', 'AZURE_', 'DATADOG_', 'SENTRY_', 'LINEAR_', 'NOTION_',
106
+ 'OPENROUTER_', 'OPEN_ROUTER_',
107
+ ];
108
+
109
+ /**
110
+ * Manifest kinds that are considered capability-escalation-sensitive.
111
+ * Manifests of these kinds are subject to additional checks in strict mode
112
+ * (e.g., tool grant allowlisting, builtin prompt shadowing).
113
+ */
114
+ export const ESCALATION_SENSITIVE_KINDS = [
115
+ 'specialist-pack', 'team-pack', 'data-source', 'mcp-tool', 'external-write',
116
+ ];
117
+
118
+ /**
119
+ * Known tool grant identifiers that manifests may request. These correspond
120
+ * to the A6 policy model capability grants. Any grant requested outside this
121
+ * set is rejected in strict mode.
122
+ */
123
+ export const KNOWN_REQUESTABLE_TOOL_GRANTS = [
124
+ 'shell', 'exec', 'network', 'filesystem', 'webhook', 'admin', 'config',
125
+ ];
126
+
127
+ /**
128
+ * Built-in specialist persona ids shipped with Construct. Manifests that
129
+ * declare prompts targeting these ids without `override: true` are rejected
130
+ * in strict mode to prevent accidental or malicious prompt shadowing.
131
+ *
132
+ * Reflects the 12-role roster (11 workers + orchestrator) from
133
+ * construct-rf26.11's specialist consolidation. The pre-consolidation list
134
+ * was already stale (missing several real ids, and listed a non-existent
135
+ * 'cx-operator') — this is a full replacement, not an incremental edit.
136
+ */
137
+ export const BUILTIN_SPECIALIST_IDS = [
138
+ 'cx-orchestrator', 'cx-architect', 'cx-reviewer', 'cx-engineer',
139
+ 'cx-debugger', 'cx-qa', 'cx-security', 'cx-operations',
140
+ 'cx-product-manager', 'cx-data-analyst', 'cx-designer', 'cx-researcher',
141
+ ];
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "anthropic",
3
+ "version": "1.0.0",
4
+ "kind": "model",
5
+ "capabilities": ["chat"],
6
+ "secretEnvKeys": ["ANTHROPIC_API_KEY"],
7
+ "docs": "Anthropic (direct)",
8
+ "owner": "construct-core",
9
+ "compatVersion": 1,
10
+ "installSource": "builtin",
11
+ "securityClassification": "trusted"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "atlassian-confluence",
3
+ "version": "1.0.0",
4
+ "kind": "data-source",
5
+ "capabilities": ["read", "search"],
6
+ "secretEnvKeys": ["CONFLUENCE_BASE_URL", "CONFLUENCE_EMAIL", "CONFLUENCE_API_TOKEN"],
7
+ "operations": ["read", "search"],
8
+ "securityClassification": "trusted",
9
+ "owner": "construct-core",
10
+ "compatVersion": 1,
11
+ "installSource": "builtin"
12
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "id": "atlassian-jira",
3
+ "version": "1.0.0",
4
+ "kind": "data-source",
5
+ "capabilities": ["read", "search"],
6
+ "secretEnvKeys": ["JIRA_BASE_URL", "JIRA_EMAIL", "JIRA_API_TOKEN"],
7
+ "operations": ["read", "search"],
8
+ "securityClassification": "trusted",
9
+ "owner": "construct-core",
10
+ "compatVersion": 1,
11
+ "installSource": "builtin",
12
+ "sourceTarget": {
13
+ "provider": "jira",
14
+ "selector": {
15
+ "field": "project",
16
+ "pattern": "^[A-Z][A-Z0-9]{1,9}$",
17
+ "patternTransform": "trimUpper",
18
+ "hint": "required Jira project key (2–10 uppercase letters/digits)",
19
+ "normalize": "trimUpper"
20
+ },
21
+ "signature": { "template": "jira:project:{value}", "valueMode": "upperOrEmpty" },
22
+ "legacyEnv": { "vars": ["JIRA_PROJECTS"], "parse": "csv", "valueTransform": "upper" },
23
+ "aliases": { "strategy": "simple", "displayPrefix": "Jira", "catchAll": true },
24
+ "embed": {
25
+ "mode": "perTarget",
26
+ "valueField": "project",
27
+ "valueKind": "scalar",
28
+ "refs": ["issues"],
29
+ "limit": 50
30
+ },
31
+ "embedFilters": {
32
+ "valueField": "project",
33
+ "valueKind": "scalar",
34
+ "defaultRefs": ["issues"],
35
+ "extraFilterKeys": ["jql"],
36
+ "defaultLimit": 50
37
+ },
38
+ "demandFetch": {
39
+ "targetRefs": ["issues"],
40
+ "targetJqlTemplate": "project = \"{value}\" AND statusCategory != Done ORDER BY updated DESC",
41
+ "targetJqlFilterKey": "jql",
42
+ "targetDefaultLimit": 50,
43
+ "queryDynamicJql": {
44
+ "singleTemplate": "project = \"{value}\" AND statusCategory != Done ORDER BY updated DESC",
45
+ "broadTemplate": "project IN ({values}) AND updated >= -{recencyDays}d ORDER BY updated DESC",
46
+ "recencyEnvVar": "JIRA_FETCH_RECENCY_DAYS",
47
+ "recencyDefaultDays": 30,
48
+ "legacyProjectsEnvVar": "JIRA_PROJECTS"
49
+ },
50
+ "queryDefaultLimit": 50
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "directory",
3
+ "version": "1.0.0",
4
+ "kind": "data-source",
5
+ "capabilities": ["read", "search"],
6
+ "secretEnvKeys": [],
7
+ "operations": ["read", "search"],
8
+ "securityClassification": "trusted",
9
+ "owner": "construct-core",
10
+ "compatVersion": 1,
11
+ "installSource": "builtin"
12
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "id": "docling",
3
+ "version": "1.0.0",
4
+ "kind": "ingestion-provider",
5
+ "capabilities": ["document-extraction"],
6
+ "docs": "Layout-aware document ingestion (PDF, DOCX/XLSX/PPTX/ODT/ODS, rich-text, Spotlight-indexable formats) via a Python sidecar provisioned through uv. Governed provider: install/health are probed, not assumed, and failure follows a declared degradation chain rather than crashing ingest.",
7
+ "owner": "construct-core",
8
+ "compatVersion": 1,
9
+ "installSource": "uv-venv",
10
+ "installDependencies": ["uv"],
11
+ "installProbe": {
12
+ "kind": "venv-marker",
13
+ "runtimeDirEnv": "CONSTRUCT_DOCLING_RUNTIME_DIR",
14
+ "defaultRuntimeDir": ".cx/runtime/docling",
15
+ "markerFile": ".install-marker.json",
16
+ "versionField": "doclingVersion",
17
+ "description": "Presence of <runtimeDir>/.venv/bin/python plus a .install-marker.json recording the installed docling version. Absence of either is treated as not-installed."
18
+ },
19
+ "healthCheck": {
20
+ "kind": "subprocess-version",
21
+ "command": "<runtimeDir>/.venv/bin/docling",
22
+ "args": ["--version"],
23
+ "timeoutMs": 15000,
24
+ "description": "Runs the venv-installed `docling` console script directly (not `uv run`, which expects a pyproject-based project rather than a bare venv). A non-zero exit, timeout, or missing venv is unhealthy; stdout carries the docling/docling-core/docling-parse version lines."
25
+ },
26
+ "degradation": {
27
+ "chain": [
28
+ { "id": "docling", "mode": "sidecar", "description": "Layout-aware extraction (tables, OCR, all formats) via the local Python sidecar." },
29
+ { "id": "node-native", "mode": "adapter", "description": "unpdf (PDF) or mammoth (DOCX) — pure-JS, lower fidelity, no OCR, no XLSX/PPTX/ODT/ODS support." },
30
+ { "id": "refuse", "mode": "error", "description": "No extractor available for this format; ingest fails loud with an actionable install hint." }
31
+ ],
32
+ "terminal": "refuse",
33
+ "resultMarking": "degraded"
34
+ },
35
+ "removalStatus": "active",
36
+ "securityClassification": "trusted"
37
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "echo",
3
+ "version": "1.0.0",
4
+ "kind": "mcp-tool",
5
+ "compatVersion": 1,
6
+ "docs": "Built-in echo tool for testing the extension manifest system.",
7
+ "owner": "construct-core"
8
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "feedback",
3
+ "version": "1.0.0",
4
+ "kind": "data-source",
5
+ "capabilities": ["read", "search"],
6
+ "secretEnvKeys": [],
7
+ "operations": ["read", "search"],
8
+ "securityClassification": "external-unauthenticated",
9
+ "owner": "construct-core",
10
+ "compatVersion": 1,
11
+ "installSource": "builtin"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "github-copilot",
3
+ "version": "1.0.0",
4
+ "kind": "model",
5
+ "capabilities": ["chat"],
6
+ "secretEnvKeys": ["GITHUB_TOKEN", "GH_TOKEN"],
7
+ "docs": "GitHub Copilot",
8
+ "owner": "construct-core",
9
+ "compatVersion": 1,
10
+ "installSource": "builtin",
11
+ "securityClassification": "trusted"
12
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "id": "github",
3
+ "version": "1.0.0",
4
+ "kind": "data-source",
5
+ "capabilities": ["read", "search", "webhook"],
6
+ "secretEnvKeys": ["GITHUB_TOKEN", "GH_TOKEN"],
7
+ "operations": ["read", "search", "webhook"],
8
+ "securityClassification": "trusted",
9
+ "owner": "construct-core",
10
+ "compatVersion": 1,
11
+ "installSource": "builtin",
12
+ "sourceTarget": {
13
+ "provider": "github",
14
+ "selector": {
15
+ "field": "repo",
16
+ "pattern": "^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$",
17
+ "patternTransform": "trim",
18
+ "hint": "required owner/repo slug",
19
+ "normalize": "trim"
20
+ },
21
+ "signature": { "template": "github:repo:{value}", "valueMode": "optionalLower" },
22
+ "legacyEnv": { "vars": ["GITHUB_REPOS", "GITHUB_REPO"], "parse": "csv" },
23
+ "aliases": { "strategy": "repoWords", "displayPrefix": null, "catchAll": false },
24
+ "embed": {
25
+ "mode": "aggregate",
26
+ "valueField": "repos",
27
+ "valueKind": "array",
28
+ "groups": [
29
+ { "refs": ["prs", "issues", "commits"], "limit": 25 },
30
+ { "refs": ["meta", "readme", "docs"], "limit": 25 }
31
+ ]
32
+ },
33
+ "embedFilters": {
34
+ "valueField": "repos",
35
+ "valueKind": "array",
36
+ "defaultRefs": ["prs", "issues", "commits"],
37
+ "refsFilterKey": "refs",
38
+ "defaultLimit": 25
39
+ },
40
+ "demandFetch": {
41
+ "targetRefs": ["meta", "readme", "docs", "prs", "issues", "commits"],
42
+ "targetRefsFilterKey": "refs",
43
+ "targetOptsField": "repos",
44
+ "targetOptsKind": "array",
45
+ "targetDefaultLimit": 25,
46
+ "queryRefs": ["meta", "readme", "docs", "prs", "issues", "commits"],
47
+ "queryOptsField": "repos",
48
+ "queryOptsKind": "array",
49
+ "queryDefaultLimit": 25
50
+ }
51
+ }
52
+ }
@@ -0,0 +1,50 @@
1
+ {
2
+ "id": "linear",
3
+ "version": "1.0.0",
4
+ "kind": "data-source",
5
+ "capabilities": ["read"],
6
+ "secretEnvKeys": ["LINEAR_API_KEY"],
7
+ "operations": ["read"],
8
+ "securityClassification": "trusted",
9
+ "owner": "construct-core",
10
+ "compatVersion": 1,
11
+ "installSource": "builtin",
12
+ "sourceTarget": {
13
+ "provider": "linear",
14
+ "selector": {
15
+ "field": "team",
16
+ "pattern": null,
17
+ "patternTransform": "trim",
18
+ "hint": "required Linear team key or name",
19
+ "normalize": "trim"
20
+ },
21
+ "signature": { "template": "linear:team:{value}", "valueMode": "lowerOrEmpty" },
22
+ "legacyEnv": { "vars": ["LINEAR_TEAMS"], "parse": "csv" },
23
+ "aliases": { "strategy": "simple", "displayPrefix": "Linear", "catchAll": true },
24
+ "embed": {
25
+ "mode": "perTarget",
26
+ "valueField": "team",
27
+ "valueKind": "scalar",
28
+ "refs": ["issues"],
29
+ "limit": 50
30
+ },
31
+ "embedFilters": {
32
+ "valueField": "team",
33
+ "valueKind": "scalar",
34
+ "defaultRefs": ["issues"],
35
+ "extraFilterKeys": ["states"],
36
+ "defaultLimit": 50
37
+ },
38
+ "demandFetch": {
39
+ "targetRefs": ["issues"],
40
+ "targetOptsField": "team",
41
+ "targetOptsKind": "scalar",
42
+ "targetDefaultLimit": 50,
43
+ "queryRefs": ["issues"],
44
+ "queryOptsField": "team",
45
+ "queryOptsKind": "scalar",
46
+ "queryOptsNullable": true,
47
+ "queryDefaultLimit": 50
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "local",
3
+ "version": "1.0.0",
4
+ "kind": "model",
5
+ "capabilities": ["chat"],
6
+ "secretEnvKeys": [],
7
+ "docs": "Local OpenAI-compatible server",
8
+ "owner": "construct-core",
9
+ "compatVersion": 1,
10
+ "installSource": "builtin",
11
+ "securityClassification": "trusted"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "ollama",
3
+ "version": "1.0.0",
4
+ "kind": "model",
5
+ "capabilities": ["chat"],
6
+ "secretEnvKeys": [],
7
+ "docs": "Ollama (local)",
8
+ "owner": "construct-core",
9
+ "compatVersion": 1,
10
+ "installSource": "builtin",
11
+ "securityClassification": "trusted"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "openai",
3
+ "version": "1.0.0",
4
+ "kind": "model",
5
+ "capabilities": ["chat"],
6
+ "secretEnvKeys": ["OPENAI_API_KEY"],
7
+ "docs": "OpenAI",
8
+ "owner": "construct-core",
9
+ "compatVersion": 1,
10
+ "installSource": "builtin",
11
+ "securityClassification": "trusted"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "openrouter-anthropic",
3
+ "version": "1.0.0",
4
+ "kind": "model",
5
+ "capabilities": ["chat"],
6
+ "secretEnvKeys": ["OPENROUTER_API_KEY"],
7
+ "docs": "Anthropic via OpenRouter",
8
+ "owner": "construct-core",
9
+ "compatVersion": 1,
10
+ "installSource": "builtin",
11
+ "securityClassification": "trusted"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "openrouter-deepseek",
3
+ "version": "1.0.0",
4
+ "kind": "model",
5
+ "capabilities": ["chat"],
6
+ "secretEnvKeys": ["OPENROUTER_API_KEY"],
7
+ "docs": "DeepSeek via OpenRouter",
8
+ "owner": "construct-core",
9
+ "compatVersion": 1,
10
+ "installSource": "builtin",
11
+ "securityClassification": "trusted"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "openrouter-google",
3
+ "version": "1.0.0",
4
+ "kind": "model",
5
+ "capabilities": ["chat"],
6
+ "secretEnvKeys": ["OPENROUTER_API_KEY"],
7
+ "docs": "Google via OpenRouter",
8
+ "owner": "construct-core",
9
+ "compatVersion": 1,
10
+ "installSource": "builtin",
11
+ "securityClassification": "trusted"
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "openrouter-llama",
3
+ "version": "1.0.0",
4
+ "kind": "model",
5
+ "capabilities": ["chat"],
6
+ "secretEnvKeys": ["OPENROUTER_API_KEY"],
7
+ "docs": "Meta Llama via OpenRouter",
8
+ "owner": "construct-core",
9
+ "compatVersion": 1,
10
+ "installSource": "builtin",
11
+ "securityClassification": "trusted"
12
+ }