@geraldmaron/construct 1.1.1 → 1.2.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 (408) hide show
  1. package/README.md +29 -19
  2. package/bin/construct +311 -81
  3. package/bin/construct-postinstall.mjs +30 -2
  4. package/examples/distribution/README.md +42 -0
  5. package/examples/distribution/manifest.json +53 -0
  6. package/examples/distribution/sources/adr.md +84 -0
  7. package/examples/distribution/sources/deck-one-pager.md +65 -0
  8. package/examples/distribution/sources/prd-platform.md +161 -0
  9. package/examples/distribution/sources/research-brief.md +80 -0
  10. package/examples/distribution/sources/rfc-platform.md +82 -0
  11. package/examples/distribution/sources/runbook.md +103 -0
  12. package/examples/distribution/sources/strategy.md +88 -0
  13. package/lib/adapters-sync.mjs +67 -0
  14. package/lib/artifact-gate-notice.mjs +38 -0
  15. package/lib/artifact-manifest.mjs +112 -0
  16. package/lib/artifact-release-gate.mjs +171 -0
  17. package/lib/artifact-reviewers.mjs +68 -0
  18. package/lib/artifact-type-from-path.mjs +79 -0
  19. package/lib/audit-skills.mjs +4 -0
  20. package/lib/audit-specialists.mjs +285 -0
  21. package/lib/audit-trail.mjs +1 -1
  22. package/lib/auto-docs.mjs +87 -18
  23. package/lib/beads/drift.mjs +27 -6
  24. package/lib/beads-client.mjs +49 -121
  25. package/lib/beads-optimistic.mjs +5 -12
  26. package/lib/brand-fonts.mjs +93 -0
  27. package/lib/brand-prose.mjs +214 -0
  28. package/lib/brand-tokens.mjs +92 -0
  29. package/lib/bridges/copilot-proxy.mjs +13 -26
  30. package/lib/capability-ledger.mjs +156 -0
  31. package/lib/certification/artifact-fixtures.mjs +132 -0
  32. package/lib/certification/artifact-gates.mjs +63 -0
  33. package/lib/certification/artifact-provenance.mjs +97 -0
  34. package/lib/certification/canonical-scenarios.mjs +78 -0
  35. package/lib/certification/cli.mjs +191 -0
  36. package/lib/certification/dashboard-api.mjs +71 -0
  37. package/lib/certification/demo-parity.mjs +116 -0
  38. package/lib/certification/document-io-fixtures.mjs +246 -0
  39. package/lib/certification/document-workflow.mjs +97 -0
  40. package/lib/certification/eval-bridge.mjs +77 -0
  41. package/lib/certification/model-routing.mjs +149 -0
  42. package/lib/certification/prompt-budget.mjs +119 -0
  43. package/lib/certification/rc-gate.mjs +206 -0
  44. package/lib/certification/real-llm-scenarios.mjs +303 -0
  45. package/lib/certification/role-cards.mjs +113 -0
  46. package/lib/certification/role-overlays.mjs +117 -0
  47. package/lib/certification/run.mjs +122 -0
  48. package/lib/certification/runner.mjs +323 -0
  49. package/lib/certification/scenarios.mjs +51 -0
  50. package/lib/certification/skill-inventory.mjs +289 -0
  51. package/lib/certification/skill-scenarios.mjs +147 -0
  52. package/lib/certification/specialist-contracts.mjs +85 -0
  53. package/lib/certification/specialist-scenarios.mjs +175 -0
  54. package/lib/certification/stale-impact.mjs +146 -0
  55. package/lib/certification/status.mjs +252 -0
  56. package/lib/certification/store.mjs +77 -0
  57. package/lib/chat/cli.mjs +333 -0
  58. package/lib/chat/command-suggest.mjs +161 -0
  59. package/lib/chat/commands.mjs +215 -0
  60. package/lib/chat/config.mjs +142 -0
  61. package/lib/chat/context-compactor.mjs +250 -0
  62. package/lib/chat/context-continuation.mjs +253 -0
  63. package/lib/chat/continuation-source.mjs +58 -0
  64. package/lib/chat/demo-guide.mjs +61 -0
  65. package/lib/chat/design-tokens.mjs +91 -0
  66. package/lib/chat/desktop-binary.mjs +79 -0
  67. package/lib/chat/desktop-build.mjs +130 -0
  68. package/lib/chat/desktop-launcher.mjs +133 -0
  69. package/lib/chat/evidence.mjs +145 -0
  70. package/lib/chat/export.mjs +74 -0
  71. package/lib/chat/harness/driver.mjs +91 -0
  72. package/lib/chat/list-picker.mjs +112 -0
  73. package/lib/chat/model-picker.mjs +356 -0
  74. package/lib/chat/openrouter-fallback.mjs +151 -0
  75. package/lib/chat/permission-prompt.mjs +33 -0
  76. package/lib/chat/picker-catalog.mjs +45 -0
  77. package/lib/chat/policy-telemetry.mjs +34 -0
  78. package/lib/chat/present.mjs +245 -0
  79. package/lib/chat/session-context.mjs +39 -0
  80. package/lib/chat/session-persist.mjs +73 -0
  81. package/lib/chat/session-restore.mjs +71 -0
  82. package/lib/chat/session-settings.mjs +53 -0
  83. package/lib/chat/system-prompt.mjs +52 -0
  84. package/lib/chat/transparency.mjs +93 -0
  85. package/lib/chat/tui/color-scheme.mjs +42 -0
  86. package/lib/chat/tui/markdown.mjs +123 -0
  87. package/lib/chat/tui/presentation.mjs +100 -0
  88. package/lib/chat/tui/render.mjs +500 -0
  89. package/lib/chat/tui/turn-block.mjs +284 -0
  90. package/lib/chat/tui/turn-present.mjs +18 -0
  91. package/lib/chat/tui/turn-state.mjs +88 -0
  92. package/lib/chat/tui/usage.mjs +122 -0
  93. package/lib/chat/web-commands.mjs +146 -0
  94. package/lib/chat/web-launcher.mjs +63 -0
  95. package/lib/chat/web-picker-keys.mjs +46 -0
  96. package/lib/chat/web-session.mjs +159 -0
  97. package/lib/cli-commands.mjs +129 -15
  98. package/lib/comment-lint.mjs +6 -4
  99. package/lib/config/schema.mjs +36 -5
  100. package/lib/contract-schemas/decision.json +50 -0
  101. package/lib/contract-schemas/implementation.json +51 -0
  102. package/lib/contract-schemas/review-report.json +32 -0
  103. package/lib/contract-schemas/test-report.json +43 -0
  104. package/lib/contracts/construct-handoff.mjs +60 -0
  105. package/lib/contracts/validate.mjs +32 -3
  106. package/lib/contracts/violation-log.mjs +58 -5
  107. package/lib/dashboard-demo.mjs +71 -0
  108. package/lib/dashboard-static.mjs +19 -5
  109. package/lib/decisions/registry.mjs +5 -3
  110. package/lib/deck-export-pptx.mjs +1152 -0
  111. package/lib/demo-recording.mjs +142 -0
  112. package/lib/demo-script.mjs +114 -0
  113. package/lib/demo-surface.mjs +249 -0
  114. package/lib/demo.mjs +598 -140
  115. package/lib/diagram-export.mjs +192 -0
  116. package/lib/diagram.mjs +13 -11
  117. package/lib/docs-verify.mjs +25 -7
  118. package/lib/doctor/index.mjs +3 -1
  119. package/lib/doctor/project-adapters.mjs +44 -0
  120. package/lib/doctor/watchers/cx-budget.mjs +98 -0
  121. package/lib/doctor/watchers/graph-staleness.mjs +52 -0
  122. package/lib/doctor/watchers/process-pressure.mjs +4 -3
  123. package/lib/document-export.mjs +360 -36
  124. package/lib/document-extract.mjs +44 -4
  125. package/lib/document-ingest.mjs +29 -20
  126. package/lib/embed/cli.mjs +2 -2
  127. package/lib/embed/daemon.mjs +18 -46
  128. package/lib/embed/worker.mjs +2 -2
  129. package/lib/embedded-contract/model-resolve.mjs +10 -9
  130. package/lib/env-config.mjs +26 -0
  131. package/lib/evals/dataset.mjs +137 -0
  132. package/lib/evals/gates.mjs +175 -0
  133. package/lib/graph/build-co-change.mjs +54 -0
  134. package/lib/graph/build-from-registry.mjs +136 -0
  135. package/lib/graph/build-import-graph.mjs +153 -0
  136. package/lib/graph/cli.mjs +110 -0
  137. package/lib/graph/impact-cli.mjs +89 -0
  138. package/lib/graph/impact.mjs +108 -0
  139. package/lib/graph/staleness.mjs +44 -0
  140. package/lib/graph/store.mjs +172 -0
  141. package/lib/health-check.mjs +90 -76
  142. package/lib/hooks/artifact-release-gate.mjs +43 -0
  143. package/lib/hooks/brand-prose-lint.mjs +38 -0
  144. package/lib/hooks/graph-impact-advisory.mjs +62 -0
  145. package/lib/hooks/session-optimize.mjs +84 -207
  146. package/lib/hooks/session-start.mjs +4 -5
  147. package/lib/host-disposition.mjs +7 -0
  148. package/lib/improvement/cli.mjs +189 -0
  149. package/lib/improvement/controller.mjs +137 -0
  150. package/lib/improvement/proposal.mjs +120 -0
  151. package/lib/improvement/specialist-loop.mjs +192 -0
  152. package/lib/improvement/store.mjs +89 -0
  153. package/lib/improvement/surface.mjs +219 -0
  154. package/lib/ingest-tooling.mjs +97 -0
  155. package/lib/init/doc-lanes.mjs +165 -0
  156. package/lib/init-docs.mjs +31 -178
  157. package/lib/init-unified.mjs +27 -97
  158. package/lib/init-update-guide.mjs +102 -0
  159. package/lib/init-update.mjs +32 -1
  160. package/lib/init.mjs +8 -0
  161. package/lib/install/desktop-binary-download.mjs +85 -0
  162. package/lib/install/legacy-global-cleanup.mjs +189 -0
  163. package/lib/intake/daemon.mjs +2 -0
  164. package/lib/intake/git-queue.mjs +9 -8
  165. package/lib/intake/queue.mjs +2 -1
  166. package/lib/intake/session-prelude.mjs +90 -1
  167. package/lib/libreoffice-export.mjs +97 -0
  168. package/lib/logging/rotate.mjs +9 -0
  169. package/lib/maintenance/docker-reclaim.mjs +206 -0
  170. package/lib/mcp/external-schema-cost.mjs +74 -0
  171. package/lib/mcp/server.mjs +84 -9
  172. package/lib/mcp/stdio-mcp-probe.mjs +188 -0
  173. package/lib/mcp/tool-budget.mjs +55 -4
  174. package/lib/mcp/tools/document.mjs +18 -4
  175. package/lib/mcp/tools/skills.mjs +32 -3
  176. package/lib/mcp/tools/workflow.mjs +13 -1
  177. package/lib/model-free-selector.mjs +18 -0
  178. package/lib/model-registry.mjs +13 -229
  179. package/lib/model-router.mjs +373 -92
  180. package/lib/models/behavior-matrix.mjs +289 -0
  181. package/lib/models/catalog.mjs +209 -0
  182. package/lib/models/execution-capability-profile.mjs +196 -0
  183. package/lib/models/execution-policy.mjs +307 -0
  184. package/lib/models/provider-poll.mjs +383 -0
  185. package/lib/npm-spawn-env.mjs +17 -0
  186. package/lib/ollama/installed-models.mjs +129 -0
  187. package/lib/oracle/actions.mjs +187 -0
  188. package/lib/oracle/artifact-gate.mjs +99 -0
  189. package/lib/oracle/cli.mjs +204 -0
  190. package/lib/oracle/daemon-entry.mjs +14 -0
  191. package/lib/oracle/dispatch.mjs +81 -0
  192. package/lib/oracle/execute.mjs +143 -0
  193. package/lib/oracle/gaps.mjs +76 -0
  194. package/lib/oracle/index.mjs +84 -0
  195. package/lib/oracle/issues.mjs +164 -0
  196. package/lib/oracle/org-graph.mjs +170 -0
  197. package/lib/oracle/policy.mjs +80 -0
  198. package/lib/oracle/read-model.mjs +398 -0
  199. package/lib/oracle/reconcile.mjs +191 -0
  200. package/lib/oracle/routing.mjs +89 -0
  201. package/lib/oracle/synthesize.mjs +384 -0
  202. package/lib/oracle/verdicts.mjs +51 -0
  203. package/lib/orchestration/worker.mjs +88 -27
  204. package/lib/orchestration-policy.mjs +50 -0
  205. package/lib/parity.mjs +96 -2
  206. package/lib/playwright-demo.mjs +252 -0
  207. package/lib/project-init-shared.mjs +4 -1
  208. package/lib/prompt-composer.js +7 -3
  209. package/lib/prompt-validation-contract.mjs +24 -0
  210. package/lib/provider-capabilities.js +57 -11
  211. package/lib/providers/contract/adapters/confluence/index.mjs +181 -0
  212. package/lib/providers/contract/adapters/git/index.mjs +115 -0
  213. package/lib/providers/contract/adapters/github/index.mjs +166 -0
  214. package/lib/providers/contract/adapters/jira/index.mjs +187 -0
  215. package/lib/providers/contract/adapters/slack/index.mjs +175 -0
  216. package/lib/providers/contract/contract-tests.mjs +57 -0
  217. package/lib/providers/contract/errors.mjs +48 -0
  218. package/lib/providers/contract/interface.mjs +50 -0
  219. package/lib/providers/contract/registry.mjs +102 -0
  220. package/lib/providers/copilot-auth.mjs +297 -0
  221. package/lib/providers/credential-bootstrap.mjs +178 -0
  222. package/lib/providers/credential-catalog.mjs +46 -0
  223. package/lib/providers/credential-sources.mjs +63 -0
  224. package/lib/providers/creds.mjs +5 -2
  225. package/lib/providers/op-run.mjs +59 -0
  226. package/lib/providers/secret-resolver.mjs +159 -0
  227. package/lib/publish-template.mjs +163 -0
  228. package/lib/publish-tooling.mjs +119 -0
  229. package/lib/publish.mjs +305 -0
  230. package/lib/registry/cli.mjs +82 -0
  231. package/lib/registry/consolidation.mjs +147 -0
  232. package/lib/registry/generate-docs.mjs +75 -0
  233. package/lib/registry/skill-verification.mjs +57 -0
  234. package/lib/registry/surface-map.mjs +76 -0
  235. package/lib/registry/validate.mjs +135 -0
  236. package/lib/resources/budget.mjs +82 -0
  237. package/lib/resources/process-budget.mjs +45 -0
  238. package/lib/rules-delivery.mjs +9 -2
  239. package/lib/rules-read.mjs +26 -0
  240. package/lib/runtime-env.mjs +23 -0
  241. package/lib/runtime-pressure.mjs +51 -7
  242. package/lib/schema-infer.mjs +13 -2
  243. package/lib/server/chat-loop.mjs +622 -0
  244. package/lib/server/demo-preview.mjs +63 -0
  245. package/lib/server/index.mjs +228 -7
  246. package/lib/service-manager.mjs +60 -8
  247. package/lib/setup.mjs +70 -7
  248. package/lib/specialists/prompt-schema.mjs +19 -10
  249. package/lib/specialists/roster.mjs +43 -0
  250. package/lib/specialists/scaffold.mjs +56 -0
  251. package/lib/storage/backend.mjs +6 -6
  252. package/lib/storage/hybrid-query.mjs +7 -4
  253. package/lib/storage/state-source.mjs +5 -5
  254. package/lib/storage/sync.mjs +2 -3
  255. package/lib/telemetry/rule-calls.mjs +52 -0
  256. package/lib/template-registry.mjs +2 -2
  257. package/lib/templates/visual-requirements.mjs +27 -51
  258. package/lib/test-corpus-inventory.mjs +313 -0
  259. package/lib/uninstall/uninstall.mjs +19 -7
  260. package/lib/update.mjs +12 -0
  261. package/lib/upgrade.mjs +14 -0
  262. package/lib/wireframe.mjs +20 -14
  263. package/lib/worker/run.mjs +17 -4
  264. package/lib/worker/trace.mjs +11 -3
  265. package/package.json +28 -14
  266. package/personas/construct.md +2 -2
  267. package/platforms/claude/settings.template.json +36 -0
  268. package/rules/common/patterns.md +1 -1
  269. package/rules/common/release-gates.md +4 -3
  270. package/scripts/sync-specialists.mjs +41 -28
  271. package/skills/devops/data-engineering.md +1 -1
  272. package/skills/docs/adr-workflow.md +1 -0
  273. package/skills/docs/backlog-proposal-workflow.md +1 -0
  274. package/skills/docs/codebase-research-workflow.md +40 -0
  275. package/skills/docs/customer-profile-workflow.md +1 -0
  276. package/skills/docs/document-ingest-workflow.md +1 -0
  277. package/skills/docs/evidence-ingest-workflow.md +1 -0
  278. package/skills/docs/init-docs.md +2 -2
  279. package/skills/docs/init-project.md +7 -2
  280. package/skills/docs/prd-workflow.md +24 -1
  281. package/skills/docs/prfaq-workflow.md +1 -0
  282. package/skills/docs/product-intelligence-workflow.md +1 -0
  283. package/skills/docs/product-signal-workflow.md +1 -0
  284. package/skills/docs/research-workflow.md +54 -37
  285. package/skills/docs/runbook-workflow.md +1 -0
  286. package/skills/docs/strategy-workflow.md +1 -0
  287. package/skills/docs/user-research-workflow.md +40 -0
  288. package/skills/operating/orchestration-reference.md +1 -1
  289. package/skills/roles/architect.md +5 -0
  290. package/skills/roles/operator.docs.md +4 -0
  291. package/skills/routing.md +4 -2
  292. package/specialists/artifact-manifest.json +480 -0
  293. package/specialists/artifact-manifest.schema.json +53 -0
  294. package/specialists/audit-enrichments.json +454 -0
  295. package/specialists/contracts.json +37 -25
  296. package/specialists/prompts/_shared/validation-contract.md +26 -0
  297. package/specialists/prompts/cx-accessibility.md +21 -2
  298. package/specialists/prompts/cx-ai-engineer.md +24 -1
  299. package/specialists/prompts/cx-architect.md +4 -1
  300. package/specialists/prompts/cx-business-strategist.md +23 -2
  301. package/specialists/prompts/cx-data-analyst.md +22 -1
  302. package/specialists/prompts/cx-data-engineer.md +23 -2
  303. package/specialists/prompts/cx-debugger.md +21 -2
  304. package/specialists/prompts/cx-designer.md +26 -3
  305. package/specialists/prompts/cx-devil-advocate.md +19 -2
  306. package/specialists/prompts/cx-docs-keeper.md +28 -1
  307. package/specialists/prompts/cx-engineer.md +22 -1
  308. package/specialists/prompts/cx-evaluator.md +18 -1
  309. package/specialists/prompts/cx-explorer.md +21 -2
  310. package/specialists/prompts/cx-legal-compliance.md +21 -2
  311. package/specialists/prompts/cx-operations.md +21 -2
  312. package/specialists/prompts/cx-oracle.md +94 -0
  313. package/specialists/prompts/cx-orchestrator.md +20 -1
  314. package/specialists/prompts/cx-platform-engineer.md +25 -2
  315. package/specialists/prompts/cx-product-manager.md +32 -1
  316. package/specialists/prompts/cx-qa.md +24 -2
  317. package/specialists/prompts/cx-rd-lead.md +23 -2
  318. package/specialists/prompts/cx-release-manager.md +23 -2
  319. package/specialists/prompts/cx-researcher.md +22 -2
  320. package/specialists/prompts/cx-reviewer.md +18 -1
  321. package/specialists/prompts/cx-security.md +22 -2
  322. package/specialists/prompts/cx-sre.md +30 -3
  323. package/specialists/prompts/cx-test-automation.md +7 -1
  324. package/specialists/prompts/cx-trace-reviewer.md +22 -3
  325. package/specialists/prompts/cx-ux-researcher.md +21 -2
  326. package/specialists/registry.json +52 -173
  327. package/specialists/tone-profiles.json +42 -0
  328. package/templates/demos/playwright/demo-recording.config.mjs +47 -0
  329. package/templates/demos/recordings/agentic-platforms-prd.json +19 -0
  330. package/templates/demos/scripts/agentic-platforms-prd.json +44 -0
  331. package/templates/demos/specs/_helpers/scroll-artifact.ts +89 -0
  332. package/templates/demos/tapes/agentic-platforms-prd.tape +49 -0
  333. package/templates/demos/tapes/resource-guard-rails.tape +49 -0
  334. package/templates/demos/vhs/construct-cockpit.json +24 -0
  335. package/templates/distribution/construct-brand.typ +446 -0
  336. package/templates/distribution/construct-decision.typ +38 -0
  337. package/templates/distribution/construct-deck.html +95 -0
  338. package/templates/distribution/construct-pdf.typ +38 -0
  339. package/templates/distribution/construct-prd.typ +38 -0
  340. package/templates/distribution/construct-research.typ +38 -0
  341. package/templates/distribution/construct-web.html +92 -0
  342. package/templates/distribution/fonts/Geist-Bold.ttf +0 -0
  343. package/templates/distribution/fonts/Geist-Medium.ttf +0 -0
  344. package/templates/distribution/fonts/Geist-Regular.ttf +0 -0
  345. package/templates/distribution/fonts/Geist-SemiBold.ttf +0 -0
  346. package/templates/distribution/fonts/GeistMono-Medium.ttf +0 -0
  347. package/templates/distribution/fonts/GeistMono-Regular.ttf +0 -0
  348. package/templates/distribution/fonts/GeistMono-SemiBold.ttf +0 -0
  349. package/templates/distribution/fonts/IBMPlexMono-Regular.otf +0 -0
  350. package/templates/distribution/fonts/JetBrainsMono-Medium.ttf +0 -0
  351. package/templates/distribution/fonts/JetBrainsMono-Regular.ttf +0 -0
  352. package/templates/distribution/fonts/JetBrainsMono-SemiBold.ttf +0 -0
  353. package/templates/distribution/fonts/PlusJakartaSans-Bold.ttf +0 -0
  354. package/templates/distribution/fonts/PlusJakartaSans-Medium.ttf +0 -0
  355. package/templates/distribution/fonts/PlusJakartaSans-Regular.ttf +0 -0
  356. package/templates/distribution/fonts/PlusJakartaSans-SemiBold.ttf +0 -0
  357. package/templates/distribution/fonts/README.md +36 -0
  358. package/templates/distribution/fonts/SpaceGrotesk-Variable.ttf +0 -0
  359. package/templates/distribution/fonts/handwritten/Caveat.ttf +0 -0
  360. package/templates/distribution/fonts/legacy/IBMPlexMono-Regular.otf +0 -0
  361. package/templates/distribution/fonts/legacy/Inter-Medium.otf +0 -0
  362. package/templates/distribution/fonts/legacy/Inter-Regular.otf +0 -0
  363. package/templates/distribution/fonts/legacy/Inter-SemiBold.otf +0 -0
  364. package/templates/distribution/fonts/legacy/InterDisplay-SemiBold.otf +0 -0
  365. package/templates/distribution/fonts/legacy/SourceSerif4-Regular.otf +0 -0
  366. package/templates/distribution/fonts/legacy/SourceSerif4-Semibold.otf +0 -0
  367. package/templates/distribution/icons/activity.svg +15 -0
  368. package/templates/distribution/icons/alert-triangle.svg +17 -0
  369. package/templates/distribution/icons/book-open.svg +16 -0
  370. package/templates/distribution/icons/bot.svg +20 -0
  371. package/templates/distribution/icons/brain.svg +22 -0
  372. package/templates/distribution/icons/circle-check.svg +16 -0
  373. package/templates/distribution/icons/clipboard-check.svg +17 -0
  374. package/templates/distribution/icons/cpu.svg +28 -0
  375. package/templates/distribution/icons/database.svg +17 -0
  376. package/templates/distribution/icons/eye.svg +16 -0
  377. package/templates/distribution/icons/file-text.svg +19 -0
  378. package/templates/distribution/icons/gauge.svg +16 -0
  379. package/templates/distribution/icons/git-branch.svg +17 -0
  380. package/templates/distribution/icons/key.svg +17 -0
  381. package/templates/distribution/icons/layers.svg +17 -0
  382. package/templates/distribution/icons/list-checks.svg +19 -0
  383. package/templates/distribution/icons/lock.svg +16 -0
  384. package/templates/distribution/icons/message-square.svg +15 -0
  385. package/templates/distribution/icons/network.svg +19 -0
  386. package/templates/distribution/icons/route.svg +17 -0
  387. package/templates/distribution/icons/scale.svg +19 -0
  388. package/templates/distribution/icons/search.svg +16 -0
  389. package/templates/distribution/icons/send.svg +16 -0
  390. package/templates/distribution/icons/server.svg +18 -0
  391. package/templates/distribution/icons/shield-check.svg +16 -0
  392. package/templates/distribution/icons/users.svg +18 -0
  393. package/templates/distribution/icons/webhook.svg +17 -0
  394. package/templates/distribution/icons/workflow.svg +17 -0
  395. package/templates/distribution/icons/wrench.svg +15 -0
  396. package/templates/distribution/run.mjs +18 -1
  397. package/templates/docs/adr.md +7 -0
  398. package/templates/docs/construct_guide.md +8 -8
  399. package/templates/docs/customer-profile.md +4 -0
  400. package/templates/docs/one-pager.md +4 -0
  401. package/templates/docs/postmortem.md +31 -0
  402. package/templates/docs/prd-platform.md +19 -0
  403. package/templates/docs/prd.md +15 -0
  404. package/templates/docs/prfaq.md +7 -0
  405. package/templates/docs/qa-strategy.md +103 -0
  406. package/templates/docs/research-brief.md +8 -0
  407. package/templates/docs/rfc-platform.md +12 -0
  408. package/templates/docs/test-plan.md +7 -0
@@ -54,15 +54,45 @@
54
54
  "operating/change-management",
55
55
  "operating/unstructured-triage"
56
56
  ],
57
- "perspective": {
58
- "bias": "Over-routing to cx-engineer, false simplicity, plans where every task runs in parallel",
59
- "tension": "cx-product-manager",
60
- "openingQuestion": "What is actually being asked for, and who owns the answer?",
61
- "failureMode": "If every task routes to cx-engineer, you're relaying, not orchestrating."
62
- },
63
57
  "wordCapOverride": 4200,
64
58
  "canEdit": false
65
59
  },
60
+ {
61
+ "internal": true,
62
+ "name": "oracle",
63
+ "description": "Meta-controller — synthesizes fleet health gaps from the Oracle read model and routes remediation to owning specialists.",
64
+ "modelTier": "reasoning",
65
+ "reasoningEffort": "high",
66
+ "codexSandbox": "read-only",
67
+ "claudeTools": "Read,Grep,Glob,LS,list_skills,get_skill,search_skills,list_teams,get_team,memory_search,memory_add_observations,cx_trace,cx_score",
68
+ "promptFile": "specialists/prompts/cx-oracle.md",
69
+ "embedOrientation": {
70
+ "focusAreas": [
71
+ "parity drift",
72
+ "contract violations",
73
+ "doctor escalations",
74
+ "alignment census staleness",
75
+ "outcomes degradation"
76
+ ],
77
+ "riskSignals": [
78
+ "unrouted systemic gaps",
79
+ "auto actions needing approval",
80
+ "stale alignment census",
81
+ "missing read-model signals"
82
+ ],
83
+ "artifactBias": [
84
+ "notes",
85
+ "memos",
86
+ "adrs"
87
+ ]
88
+ },
89
+ "skills": [
90
+ "ai/orchestration-workflow",
91
+ "exploration/dependency-graph-reading",
92
+ "roles/reviewer.trace"
93
+ ],
94
+ "canEdit": false
95
+ },
66
96
  {
67
97
  "internal": true,
68
98
  "name": "rd-lead",
@@ -92,14 +122,9 @@
92
122
  },
93
123
  "skills": [
94
124
  "ai/agent-dev",
95
- "ai/prompt-and-eval"
125
+ "ai/prompt-and-eval",
126
+ "docs/research-workflow"
96
127
  ],
97
- "perspective": {
98
- "bias": "High-confidence requirements with no evidence, premature hardening, timelines with no room to be wrong",
99
- "tension": "cx-architect",
100
- "openingQuestion": "What are we trying to learn, and how will we know when we've learned it?",
101
- "failureMode": "If you can't write a falsifiable hypothesis, this is a planning task, not R&D."
102
- },
103
128
  "canEdit": false,
104
129
  "subscriptions": [
105
130
  "research.gate.required"
@@ -141,14 +166,9 @@
141
166
  "docs/prd-workflow",
142
167
  "docs/prfaq-workflow",
143
168
  "docs/backlog-proposal-workflow",
144
- "docs/product-intelligence-review"
169
+ "docs/product-intelligence-review",
170
+ "docs/strategy-workflow"
145
171
  ],
146
- "perspective": {
147
- "bias": "Untestable acceptance criteria, post-hoc success metrics, requirements from internal opinion",
148
- "tension": "cx-engineer",
149
- "openingQuestion": "Who is this for, what are they trying to do, and how will we know they succeeded?",
150
- "failureMode": "If all acceptance criteria are subjective, the requirements aren't done."
151
- },
152
172
  "canEdit": false,
153
173
  "collaborators": [
154
174
  "ux-researcher"
@@ -202,15 +222,10 @@
202
222
  ]
203
223
  },
204
224
  "skills": [
205
- "docs/research-workflow",
225
+ "docs/user-research-workflow",
226
+ "docs/evidence-ingest-workflow",
206
227
  "strategy/jobs-to-be-done"
207
228
  ],
208
- "perspective": {
209
- "bias": "Ideal-user personas, invisible friction, 'users will figure it out'",
210
- "tension": "cx-designer",
211
- "openingQuestion": "Who specifically is the user, and what would success feel like to them — not to us?",
212
- "failureMode": "If your brief has no friction points, you haven't talked to users."
213
- },
214
229
  "canEdit": false,
215
230
  "collaborators": [
216
231
  "architect",
@@ -254,12 +269,6 @@
254
269
  "operating/oncall-rotation",
255
270
  "operating/change-management"
256
271
  ],
257
- "perspective": {
258
- "bias": "Plans where every task runs in parallel, tasks that sound atomic but aren't, work starting before blockers clear",
259
- "tension": "cx-architect",
260
- "openingQuestion": "What must be done first, what blocks what, and who owns each deliverable?",
261
- "failureMode": "If every task can run in parallel, the dependency graph wasn't drawn."
262
- },
263
272
  "canEdit": false,
264
273
  "subscriptions": [
265
274
  "plan.requested"
@@ -297,12 +306,6 @@
297
306
  "devops/dependency-management",
298
307
  "docs/transcript-synthesis"
299
308
  ],
300
- "perspective": {
301
- "bias": "Undated sources, version-specific claims without citation, blog posts treated as authoritative",
302
- "tension": "cx-rd-lead",
303
- "openingQuestion": "What is the version, the publication date, and the primary source?",
304
- "failureMode": "If all sources are secondhand or undated, the research isn't done."
305
- },
306
309
  "canEdit": false,
307
310
  "subscriptions": [
308
311
  "evidence.requested",
@@ -348,12 +351,6 @@
348
351
  "strategy/pricing-positioning",
349
352
  "strategy/narrative-arc"
350
353
  ],
351
- "perspective": {
352
- "bias": "Tactical decisions dressed as strategy, ignoring competitive dynamics, 'build it and they will come'",
353
- "tension": "cx-product-manager",
354
- "openingQuestion": "What changes if we do this — who wins, who loses, and why does now matter?",
355
- "failureMode": "If the brief doesn't name a specific market moment, it's not a strategy — it's a plan."
356
- },
357
354
  "canEdit": false,
358
355
  "collaborators": [
359
356
  "data-analyst",
@@ -396,12 +393,6 @@
396
393
  "devops/database",
397
394
  "operating/raw-data-structuring"
398
395
  ],
399
- "perspective": {
400
- "bias": "Vanity metrics, post-hoc success definitions, averages that hide distributions",
401
- "tension": "cx-product-manager",
402
- "openingQuestion": "What specific behavior change in users would prove this worked?",
403
- "failureMode": "If the success metric can be hit without solving the problem, the metric is wrong."
404
- },
405
396
  "canEdit": false,
406
397
  "collaborators": [
407
398
  "evaluator",
@@ -442,12 +433,6 @@
442
433
  "ai/prompt-and-eval",
443
434
  "quality-gates/verify-quality"
444
435
  ],
445
- "perspective": {
446
- "bias": "Evals designed to match known outputs, cherry-picked baselines, promotion decisions on too few traces",
447
- "tension": "cx-engineer",
448
- "openingQuestion": "What would a regression look like, and can we detect it before shipping?",
449
- "failureMode": "If you can't define a failing case before seeing results, you're rationalizing, not evaluating."
450
- },
451
436
  "canEdit": false,
452
437
  "collaborators": [
453
438
  "product-manager",
@@ -493,12 +478,6 @@
493
478
  "ai/prompt-optimizer",
494
479
  "ai/ml-ops"
495
480
  ],
496
- "perspective": {
497
- "bias": "Prompts optimized for known inputs, hallucination risk dismissed as edge cases, eval sets without failure cases",
498
- "tension": "cx-evaluator",
499
- "openingQuestion": "What does failure look like at scale, and does the eval set actually cover it?",
500
- "failureMode": "If you haven't written a test case where the model should fail gracefully, you haven't tested the model."
501
- },
502
481
  "canEdit": true,
503
482
  "collaborators": [
504
483
  "architect",
@@ -542,12 +521,6 @@
542
521
  "architecture/message-queue",
543
522
  "architecture/security-arch"
544
523
  ],
545
- "perspective": {
546
- "bias": "Designs that emerged from code, missing ADRs, data models that encode assumptions that will change",
547
- "tension": "cx-engineer",
548
- "openingQuestion": "What are the invariants, and what breaks if they're violated?",
549
- "failureMode": "If the ADR has no 'options rejected' section, the decision defaulted — and defaulted decisions bite hardest."
550
- },
551
524
  "canEdit": false,
552
525
  "collaborators": [
553
526
  "ai-engineer",
@@ -614,12 +587,6 @@
614
587
  "exploration/tracer-bullet-method",
615
588
  "exploration/dependency-graph-reading"
616
589
  ],
617
- "perspective": {
618
- "bias": "Implementations that ignore existing conventions, abstractions that complicate the simple case",
619
- "tension": "cx-reviewer",
620
- "openingQuestion": "What does the existing pattern look like, and where does my change fit?",
621
- "failureMode": "If you haven't read every file you're about to touch, you don't know what you're changing."
622
- },
623
590
  "canEdit": true
624
591
  },
625
592
  {
@@ -653,12 +620,6 @@
653
620
  "quality-gates/review-work",
654
621
  "quality-gates/premortem"
655
622
  ],
656
- "perspective": {
657
- "bias": "Plans that are too elegant, 'unlikely' failure modes, scope drift with stable acceptance criteria",
658
- "tension": "cx-architect",
659
- "openingQuestion": "What's the simplest reason this fails?",
660
- "failureMode": "If you find no CRITICAL challenges, you looked at the happy path. Dig into the error paths."
661
- },
662
623
  "canEdit": false,
663
624
  "watchConditions": [
664
625
  {
@@ -698,12 +659,6 @@
698
659
  "quality-gates/review-work",
699
660
  "quality-gates/verify-module"
700
661
  ],
701
- "perspective": {
702
- "bias": "Edge cases under conditions the author didn't consider, missing error handling, tests that mock too much",
703
- "tension": "cx-engineer",
704
- "openingQuestion": "Does this do what it's supposed to do under the conditions it wasn't designed for?",
705
- "failureMode": "If your review only covered the happy path, you haven't reviewed."
706
- },
707
662
  "canEdit": true,
708
663
  "subscriptions": [
709
664
  "pr.opened",
@@ -747,12 +702,6 @@
747
702
  "quality-gates/verify-security",
748
703
  "architecture/security-arch"
749
704
  ],
750
- "perspective": {
751
- "bias": "'Internal only' as a security boundary, trust relationships never made explicit, unaudited dependencies",
752
- "tension": "cx-engineer",
753
- "openingQuestion": "What does an attacker see when they look at this?",
754
- "failureMode": "If the only finding is 'no hardcoded secrets,' you checked one category out of eight."
755
- },
756
705
  "canEdit": true,
757
706
  "subscriptions": [
758
707
  "config.protection.violation",
@@ -801,12 +750,6 @@
801
750
  "quality-gates/verify-change",
802
751
  "quality-gates/verify-module"
803
752
  ],
804
- "perspective": {
805
- "bias": "Tests that mock too much, coverage metrics over behavior metrics, E2E suites that only test the happy path",
806
- "tension": "cx-engineer",
807
- "openingQuestion": "For each acceptance criterion — how does the test fail when the criterion is violated?",
808
- "failureMode": "If every test passes on the first run with no debugging, the tests weren't hard enough."
809
- },
810
753
  "canEdit": true,
811
754
  "subscriptions": [
812
755
  "coverage.drop",
@@ -849,12 +792,6 @@
849
792
  "devops/observability",
850
793
  "devops/performance"
851
794
  ],
852
- "perspective": {
853
- "bias": "Symptom fixes, confirmation bias toward familiar failure patterns, 'it probably works now'",
854
- "tension": "cx-engineer",
855
- "openingQuestion": "Can I reproduce this deterministically, and what is the exact state at the point of failure?",
856
- "failureMode": "If you can't state the invariant that was violated, you haven't found root cause."
857
- },
858
795
  "canEdit": true,
859
796
  "subscriptions": [
860
797
  "hang.detected",
@@ -894,12 +831,6 @@
894
831
  "devops/performance",
895
832
  "devops/incident-response"
896
833
  ],
897
- "perspective": {
898
- "bias": "Observability added as afterthought, untested rollback procedures, SLOs defined after the first incident",
899
- "tension": "cx-engineer",
900
- "openingQuestion": "How will we know when this is failing in production, and what do we do first?",
901
- "failureMode": "If there's no alert definition before deployment, nobody planned for failure."
902
- },
903
834
  "canEdit": true,
904
835
  "collaborators": [
905
836
  "architect",
@@ -962,12 +893,6 @@
962
893
  "devops/devsecops",
963
894
  "devops/cost-optimization"
964
895
  ],
965
- "perspective": {
966
- "bias": "Hypothetical future problems solved with real present complexity, build systems only the author understands",
967
- "tension": "cx-architect",
968
- "openingQuestion": "What does the path from idea to verified change look like right now, and where is the real friction?",
969
- "failureMode": "If the improvement adds more configuration than it removes friction, it's not an improvement."
970
- },
971
896
  "canEdit": true,
972
897
  "collaborators": [
973
898
  "docs-keeper",
@@ -1014,12 +939,6 @@
1014
939
  "compliance/ai-disclosure",
1015
940
  "compliance/regulatory-review"
1016
941
  ],
1017
- "perspective": {
1018
- "bias": "'Just logging' as a data review bypass, first-layer-only license checks, AI features without disclosure strategy",
1019
- "tension": "cx-product-manager",
1020
- "openingQuestion": "What data is being collected, stored, or processed, and do we have documented legal basis for each?",
1021
- "failureMode": "If the risk list is empty, you didn't check AI processing obligations or dependency licenses past layer one."
1022
- },
1023
942
  "canEdit": false,
1024
943
  "subscriptions": [
1025
944
  "dep.license",
@@ -1055,14 +974,9 @@
1055
974
  },
1056
975
  "skills": [
1057
976
  "devops/git-workflow",
1058
- "quality-gates/verify-change"
977
+ "quality-gates/verify-change",
978
+ "docs/memo-and-decision-capture"
1059
979
  ],
1060
- "perspective": {
1061
- "bias": "Untested rollback procedures, migrations that can't be reversed, canary deployments without rollback triggers",
1062
- "tension": "cx-engineer",
1063
- "openingQuestion": "If this goes wrong 30 minutes after full rollout, what exactly do we do?",
1064
- "failureMode": "If the rollback procedure isn't tested, it doesn't exist. You'll find out during an incident."
1065
- },
1066
980
  "canEdit": true,
1067
981
  "subscriptions": [
1068
982
  "release.candidate",
@@ -1101,14 +1015,9 @@
1101
1015
  "docs/adr-workflow",
1102
1016
  "docs/runbook-workflow",
1103
1017
  "docs/init-docs",
1104
- "docs/memo-and-decision-capture"
1018
+ "docs/memo-and-decision-capture",
1019
+ "docs/document-ingest-workflow"
1105
1020
  ],
1106
- "perspective": {
1107
- "bias": "Completed work with no context update, decisions 'everyone understands' but nobody wrote down",
1108
- "tension": "cx-engineer",
1109
- "openingQuestion": "What did we decide, why did we decide it, and where will the next person find it?",
1110
- "failureMode": "If the project context file hasn't been updated since the work started, something important wasn't captured."
1111
- },
1112
1021
  "canEdit": true,
1113
1022
  "subscriptions": [
1114
1023
  "changelog.missing",
@@ -1156,12 +1065,6 @@
1156
1065
  "frontend-design/engineering",
1157
1066
  "frontend-design/accessibility"
1158
1067
  ],
1159
- "perspective": {
1160
- "bias": "Designs with no error or empty states, templates passed as design decisions, no hover/focus/active states",
1161
- "tension": "cx-ux-researcher",
1162
- "openingQuestion": "What is the user doing, what are they feeling, and what should the interface show them?",
1163
- "failureMode": "If you don't have designed error and empty states, you have an incomplete design."
1164
- },
1165
1068
  "canEdit": true,
1166
1069
  "subscriptions": [
1167
1070
  "design.requested"
@@ -1203,12 +1106,6 @@
1203
1106
  "frontend-design/accessibility",
1204
1107
  "frontend-design/screen-reader-testing"
1205
1108
  ],
1206
- "perspective": {
1207
- "bias": "ARIA added to pass audits, keyboard navigation never tested, contrast that 'looks fine' but fails the spec",
1208
- "tension": "cx-designer",
1209
- "openingQuestion": "Can a user with no mouse, no vision, or slow internet complete this flow end to end?",
1210
- "failureMode": "If every finding is LOW severity, you're reading the spec without using the product."
1211
- },
1212
1109
  "canEdit": false,
1213
1110
  "collaborators": [
1214
1111
  "designer",
@@ -1248,17 +1145,12 @@
1248
1145
  ]
1249
1146
  },
1250
1147
  "skills": [
1148
+ "docs/codebase-research-workflow",
1251
1149
  "exploration/repo-map",
1252
1150
  "exploration/unknown-codebase-onboarding",
1253
1151
  "exploration/tracer-bullet-method",
1254
1152
  "exploration/dependency-graph-reading"
1255
1153
  ],
1256
- "perspective": {
1257
- "bias": "'I know where this is' without verifying, grep results without context, 5-minute investigations",
1258
- "tension": "cx-engineer",
1259
- "openingQuestion": "What is actually here, and how does it actually work — not how it was intended to work?",
1260
- "failureMode": "If the investigation took less than 15 minutes and you feel confident, you probably missed something."
1261
- },
1262
1154
  "canEdit": false
1263
1155
  },
1264
1156
  {
@@ -1291,12 +1183,6 @@
1291
1183
  "ai/prompt-optimizer",
1292
1184
  "ai/trace-triage"
1293
1185
  ],
1294
- "perspective": {
1295
- "bias": "Stable-looking medians hiding variance, trace analyses looking only at successes, promotions on too few traces",
1296
- "tension": "cx-ai-engineer",
1297
- "openingQuestion": "Which agents have degraded since the last cycle, and what does the trace evidence say about why?",
1298
- "failureMode": "If all agents look stable, you haven't checked variance and trend. Median hides deterioration."
1299
- },
1300
1186
  "canEdit": true,
1301
1187
  "subscriptions": [
1302
1188
  "trace.anomaly"
@@ -1334,12 +1220,6 @@
1334
1220
  "devops/observability",
1335
1221
  "operating/raw-data-structuring"
1336
1222
  ],
1337
- "perspective": {
1338
- "bias": "Non-idempotent pipelines, unwritten data contracts, quality gates added after the first corruption incident",
1339
- "tension": "cx-data-analyst",
1340
- "openingQuestion": "Is this pipeline idempotent, observable, and does it have a contract for its output schema?",
1341
- "failureMode": "If there are no data quality tests, the pipeline is running on faith."
1342
- },
1343
1223
  "canEdit": true
1344
1224
  },
1345
1225
  {
@@ -1372,12 +1252,6 @@
1372
1252
  "quality-gates/verify-change",
1373
1253
  "quality-gates/verify-module"
1374
1254
  ],
1375
- "perspective": {
1376
- "bias": "Intermittent tests dismissed as infrastructure, coverage numbers over behavioral coverage, arbitrary sleeps",
1377
- "tension": "cx-qa",
1378
- "openingQuestion": "Is this test deterministic, and does it actually fail when the behavior it's testing breaks?",
1379
- "failureMode": "If the test suite has never caught a production bug, the tests are testing the wrong things."
1380
- },
1381
1255
  "canEdit": true
1382
1256
  }
1383
1257
  ],
@@ -1528,6 +1402,11 @@
1528
1402
  ],
1529
1403
  "copilot": [
1530
1404
  "Copilot has no spawnable subagents. Use the Construct prompt/profile for normal use; internal role-specific profiles are contributor-facing implementation details."
1405
+ ],
1406
+ "cursor": [
1407
+ "You are running inside Cursor. Construct is the single front door — route work through the `construct` persona and MCP tools (`orchestration_run`, `get_skill`, `orchestration_policy`).",
1408
+ "Start `construct dashboard` before multi-specialist orchestration. Project adapters live in `.cursor/mcp.json` and `.cursor/rules/construct.mdc` (regenerated by `npm run adapters` or `construct sync --project`).",
1409
+ "Skills are not copied into Cursor's skills UI — load playbooks via MCP `get_skill` with slash paths like `docs/adr-workflow` or `roles/engineer`."
1531
1410
  ]
1532
1411
  }
1533
1412
  }
@@ -0,0 +1,42 @@
1
+ {
2
+ "version": 1,
3
+ "description": "Shipped tone profiles for Construct document and agent output. Projects override via .cx/brand-voice.json.",
4
+ "profiles": {
5
+ "direct": {
6
+ "formality": 3,
7
+ "sentenceLength": "short to medium",
8
+ "whenToUse": ["runbooks", "internal memos", "research briefs", "technical ADRs"],
9
+ "constraints": "Lead with the answer. Plain language. Never contradict rules/common/neurodivergent-output.md."
10
+ },
11
+ "friendly": {
12
+ "formality": 2,
13
+ "sentenceLength": "medium",
14
+ "whenToUse": ["onboarding", "customer-facing FAQs", "PRFAQs", "docs-keeper memos"],
15
+ "constraints": "Warm but not casual. No idioms. Define terms on first use."
16
+ },
17
+ "executive-concise": {
18
+ "formality": 4,
19
+ "sentenceLength": "short",
20
+ "whenToUse": ["one-pagers", "strategy summaries", "business PRDs", "product intelligence readouts"],
21
+ "constraints": "TL;DR first. One idea per paragraph. Tables for numbers."
22
+ },
23
+ "decision-forcing-direct": {
24
+ "formality": 4,
25
+ "sentenceLength": "medium",
26
+ "whenToUse": ["PRDs", "ADRs", "RFCs", "meta-PRDs", "backlog proposals"],
27
+ "constraints": "Every section drives a decision or acceptance criterion. Rejected alternatives required where applicable."
28
+ },
29
+ "blameless": {
30
+ "formality": 3,
31
+ "sentenceLength": "medium",
32
+ "whenToUse": ["incident reports", "postmortems", "runbooks", "SRE comms"],
33
+ "constraints": "Corrective actions target systems, not people. No shame language."
34
+ },
35
+ "pedagogical": {
36
+ "formality": 2,
37
+ "sentenceLength": "medium",
38
+ "whenToUse": ["onboarding guides", "explorer maps", "UX research summaries", "architecture overviews"],
39
+ "constraints": "Teach the reader. Progressive disclosure. Examples before abstractions."
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * templates/demos/playwright/demo-recording.config.mjs — Playwright config scaffold.
3
+ *
4
+ * Copied to .cx/demos/playwright.config.mjs on `construct demo init`. webServer
5
+ * command/url come from DEMO_WEB_SERVER_* env injected by recordPlaywrightDemo.
6
+ */
7
+
8
+ import { defineConfig, devices } from '@playwright/test';
9
+ import path from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
11
+
12
+ const DEMO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
13
+ const DEMO_OUTPUT = process.env.DEMO_OUTPUT_DIR || path.join(DEMO_ROOT, '.cx', 'demos');
14
+
15
+ const webServerCommand = process.env.DEMO_WEB_SERVER_COMMAND;
16
+ const webServerUrl = process.env.DEMO_WEB_SERVER_URL;
17
+
18
+ export default defineConfig({
19
+ testDir: path.join(DEMO_ROOT, '.cx', 'demos', 'specs'),
20
+ timeout: 180_000,
21
+ fullyParallel: false,
22
+ workers: 1,
23
+ reporter: 'list',
24
+ use: {
25
+ baseURL: process.env.BASE_URL || webServerUrl || 'http://127.0.0.1:3456',
26
+ trace: 'off',
27
+ screenshot: 'off',
28
+ video: 'on',
29
+ viewport: { width: 1280, height: 720 },
30
+ },
31
+ projects: [
32
+ {
33
+ name: 'demo-recording',
34
+ use: { ...devices['Desktop Chrome'] },
35
+ },
36
+ ],
37
+ outputDir: DEMO_OUTPUT,
38
+ webServer: process.env.SKIP_WEBSERVER || process.env.CHECKLY || !webServerCommand
39
+ ? undefined
40
+ : {
41
+ command: webServerCommand,
42
+ url: webServerUrl || process.env.BASE_URL || 'http://127.0.0.1:3456',
43
+ reuseExistingServer: !process.env.CI,
44
+ timeout: Number(process.env.DEMO_WEB_SERVER_TIMEOUT || 120_000),
45
+ cwd: process.env.DEMO_WEB_SERVER_CWD || DEMO_ROOT,
46
+ },
47
+ });
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "agentic-platforms-prd",
3
+ "title": "Publish guardrails — agentic platforms PRD",
4
+ "engine": "playwright",
5
+ "workspace": "apps/dashboard",
6
+ "spec": "apps/dashboard/e2e/demo/agentic-platforms-prd.spec.ts",
7
+ "baseUrl": "http://127.0.0.1:4242",
8
+ "project": "demo-recording",
9
+ "artifactReveal": {
10
+ "mode": "constructPreview",
11
+ "staticDir": ".",
12
+ "file": "prd-platform.pdf",
13
+ "scroll": true
14
+ },
15
+ "output": {
16
+ "format": "mp4",
17
+ "path": ".cx/demos/dashboard/agentic-platforms-prd.mp4"
18
+ }
19
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "agentic-platforms-prd",
3
+ "title": "Publish guardrails — agentic platforms PRD",
4
+ "summary": "Prove Construct's path: workflow invoke returns a plan only, validate and publish fail on the thin stub, then pass on the golden fixture with styled PDF export.",
5
+ "systemOverlay": "Demo mode for publish guardrails. Run the exact construct CLI commands from each step using shell or construct_tool. Do not hand-author production PRD markdown in chat — the passing artifact is tests/fixtures/publish/golden-prd-platform.md. The stub is tests/fixtures/publish/agentic-platforms-stub.md.",
6
+ "tape": "agentic-platforms-prd",
7
+ "dashboardDemo": "agentic-platforms-prd",
8
+ "fallbackSurface": "tape",
9
+ "artifactReveal": {
10
+ "path": "prd-platform.pdf",
11
+ "scroll": true
12
+ },
13
+ "fixtures": {
14
+ "stub": "tests/fixtures/publish/agentic-platforms-stub.md",
15
+ "golden": "tests/fixtures/publish/golden-prd-platform.md"
16
+ },
17
+ "steps": [
18
+ {
19
+ "title": "Plan only — workflow invoke",
20
+ "prompt": "Run construct workflow invoke for prd-draft and show the specialist chain. This is plan-only — it does not draft the PRD.",
21
+ "command": "node bin/construct workflow invoke --json --workflow-type prd-draft --approval-mode proposal-only --text 'Enterprise agentic platform PRD'"
22
+ },
23
+ {
24
+ "title": "Release gate FAIL — thin stub",
25
+ "prompt": "Run artifact validate on the stub fixture with type prd-platform. It must fail (structure, visuals, citations).",
26
+ "command": "node bin/construct artifact validate tests/fixtures/publish/agentic-platforms-stub.md --type=prd-platform"
27
+ },
28
+ {
29
+ "title": "Publish FAIL — gate blocks distribution",
30
+ "prompt": "Run construct publish on the stub with --figures. Publish must exit 2 and block at the release gate.",
31
+ "command": "node bin/construct publish tests/fixtures/publish/agentic-platforms-stub.md --figures"
32
+ },
33
+ {
34
+ "title": "Golden fixture PASS — validate",
35
+ "prompt": "Run artifact validate on the golden prd-platform fixture. It must pass the release gate.",
36
+ "command": "node bin/construct artifact validate tests/fixtures/publish/golden-prd-platform.md --type=prd-platform"
37
+ },
38
+ {
39
+ "title": "Publish PASS — styled PDF",
40
+ "prompt": "Publish the golden fixture with --type=prd-platform --figures to .cx/publish/golden-prd-platform.pdf, then confirm the file exists.",
41
+ "command": "node bin/construct publish tests/fixtures/publish/golden-prd-platform.md --type=prd-platform --figures --output .cx/publish/golden-prd-platform.pdf"
42
+ }
43
+ ]
44
+ }