@geraldmaron/construct 1.1.1 → 1.2.1
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.
- package/README.md +30 -19
- package/bin/construct +487 -87
- package/bin/construct-postinstall.mjs +30 -2
- package/examples/distribution/README.md +42 -0
- package/examples/distribution/manifest.json +53 -0
- package/examples/distribution/sources/adr.md +84 -0
- package/examples/distribution/sources/deck-one-pager.md +65 -0
- package/examples/distribution/sources/prd-platform.md +161 -0
- package/examples/distribution/sources/research-brief.md +80 -0
- package/examples/distribution/sources/rfc-platform.md +82 -0
- package/examples/distribution/sources/runbook.md +103 -0
- package/examples/distribution/sources/strategy.md +88 -0
- package/lib/adapters-sync.mjs +67 -0
- package/lib/artifact-gate-notice.mjs +38 -0
- package/lib/artifact-manifest.mjs +258 -0
- package/lib/artifact-release-gate.mjs +171 -0
- package/lib/artifact-reviewers.mjs +68 -0
- package/lib/artifact-type-from-path.mjs +79 -0
- package/lib/artifact-workflow.mjs +252 -0
- package/lib/audit-skills.mjs +4 -0
- package/lib/audit-specialists.mjs +285 -0
- package/lib/audit-trail.mjs +1 -1
- package/lib/auto-docs.mjs +90 -19
- package/lib/beads/drift.mjs +27 -6
- package/lib/beads-client.mjs +49 -121
- package/lib/beads-optimistic.mjs +5 -12
- package/lib/brand-fonts.mjs +93 -0
- package/lib/brand-prose.mjs +214 -0
- package/lib/brand-tokens.mjs +92 -0
- package/lib/bridges/copilot-proxy.mjs +13 -26
- package/lib/capability-ledger.mjs +156 -0
- package/lib/certification/artifact-fixtures.mjs +132 -0
- package/lib/certification/artifact-gates.mjs +63 -0
- package/lib/certification/artifact-provenance.mjs +97 -0
- package/lib/certification/canonical-scenarios.mjs +78 -0
- package/lib/certification/cli.mjs +191 -0
- package/lib/certification/dashboard-api.mjs +71 -0
- package/lib/certification/demo-parity.mjs +116 -0
- package/lib/certification/document-io-fixtures.mjs +246 -0
- package/lib/certification/document-workflow.mjs +97 -0
- package/lib/certification/eval-bridge.mjs +77 -0
- package/lib/certification/model-routing.mjs +149 -0
- package/lib/certification/prompt-budget.mjs +119 -0
- package/lib/certification/rc-gate.mjs +206 -0
- package/lib/certification/real-llm-scenarios.mjs +303 -0
- package/lib/certification/role-cards.mjs +113 -0
- package/lib/certification/role-overlays.mjs +117 -0
- package/lib/certification/run.mjs +122 -0
- package/lib/certification/runner.mjs +323 -0
- package/lib/certification/scenarios.mjs +51 -0
- package/lib/certification/skill-inventory.mjs +289 -0
- package/lib/certification/skill-scenarios.mjs +147 -0
- package/lib/certification/specialist-contracts.mjs +85 -0
- package/lib/certification/specialist-scenarios.mjs +175 -0
- package/lib/certification/stale-impact.mjs +146 -0
- package/lib/certification/status.mjs +252 -0
- package/lib/certification/store.mjs +77 -0
- package/lib/chat/cli.mjs +333 -0
- package/lib/chat/command-suggest.mjs +161 -0
- package/lib/chat/commands.mjs +215 -0
- package/lib/chat/config.mjs +142 -0
- package/lib/chat/context-compactor.mjs +250 -0
- package/lib/chat/context-continuation.mjs +253 -0
- package/lib/chat/continuation-source.mjs +58 -0
- package/lib/chat/demo-guide.mjs +61 -0
- package/lib/chat/design-tokens.mjs +91 -0
- package/lib/chat/desktop-binary.mjs +79 -0
- package/lib/chat/desktop-build.mjs +130 -0
- package/lib/chat/desktop-launcher.mjs +133 -0
- package/lib/chat/evidence.mjs +145 -0
- package/lib/chat/export.mjs +74 -0
- package/lib/chat/harness/driver.mjs +91 -0
- package/lib/chat/list-picker.mjs +112 -0
- package/lib/chat/model-picker.mjs +356 -0
- package/lib/chat/openrouter-fallback.mjs +151 -0
- package/lib/chat/permission-prompt.mjs +33 -0
- package/lib/chat/picker-catalog.mjs +45 -0
- package/lib/chat/policy-telemetry.mjs +34 -0
- package/lib/chat/present.mjs +246 -0
- package/lib/chat/session-context.mjs +39 -0
- package/lib/chat/session-persist.mjs +73 -0
- package/lib/chat/session-restore.mjs +71 -0
- package/lib/chat/session-settings.mjs +53 -0
- package/lib/chat/system-prompt.mjs +52 -0
- package/lib/chat/transparency.mjs +93 -0
- package/lib/chat/tui/color-scheme.mjs +42 -0
- package/lib/chat/tui/markdown.mjs +123 -0
- package/lib/chat/tui/presentation.mjs +100 -0
- package/lib/chat/tui/render.mjs +500 -0
- package/lib/chat/tui/turn-block.mjs +284 -0
- package/lib/chat/tui/turn-present.mjs +18 -0
- package/lib/chat/tui/turn-state.mjs +88 -0
- package/lib/chat/tui/usage.mjs +122 -0
- package/lib/chat/web-commands.mjs +146 -0
- package/lib/chat/web-launcher.mjs +63 -0
- package/lib/chat/web-picker-keys.mjs +46 -0
- package/lib/chat/web-session.mjs +159 -0
- package/lib/cli-commands.mjs +146 -15
- package/lib/cli-service-inventory.mjs +42 -0
- package/lib/comment-lint.mjs +6 -4
- package/lib/config/intake-policy.mjs +209 -0
- package/lib/config/project-config.mjs +11 -2
- package/lib/config/schema.mjs +86 -6
- package/lib/config/source-targets.mjs +311 -0
- package/lib/contract-schemas/decision.json +50 -0
- package/lib/contract-schemas/implementation.json +51 -0
- package/lib/contract-schemas/review-report.json +32 -0
- package/lib/contract-schemas/test-report.json +43 -0
- package/lib/contracts/construct-handoff.mjs +60 -0
- package/lib/contracts/validate.mjs +32 -3
- package/lib/contracts/violation-log.mjs +58 -5
- package/lib/dashboard-demo.mjs +71 -0
- package/lib/dashboard-static.mjs +19 -5
- package/lib/decisions/registry.mjs +5 -3
- package/lib/deck-export-pptx.mjs +1152 -0
- package/lib/demo-recording.mjs +142 -0
- package/lib/demo-script.mjs +114 -0
- package/lib/demo-surface.mjs +249 -0
- package/lib/demo.mjs +598 -140
- package/lib/diagram-export.mjs +192 -0
- package/lib/diagram.mjs +13 -11
- package/lib/docs-verify.mjs +25 -7
- package/lib/doctor/index.mjs +3 -1
- package/lib/doctor/project-adapters.mjs +44 -0
- package/lib/doctor/source-checkout.mjs +16 -0
- package/lib/doctor/watchers/cx-budget.mjs +98 -0
- package/lib/doctor/watchers/graph-staleness.mjs +52 -0
- package/lib/doctor/watchers/process-pressure.mjs +4 -3
- package/lib/document-export.mjs +384 -38
- package/lib/document-extract.mjs +44 -4
- package/lib/document-ingest.mjs +29 -20
- package/lib/embed/auto-sources.mjs +44 -0
- package/lib/embed/cli.mjs +4 -3
- package/lib/embed/daemon.mjs +18 -46
- package/lib/embed/demand-fetch.mjs +50 -19
- package/lib/embed/inbox.mjs +6 -10
- package/lib/embed/worker.mjs +4 -3
- package/lib/embedded-contract/index.mjs +11 -0
- package/lib/embedded-contract/model-resolve.mjs +10 -9
- package/lib/env-config.mjs +26 -0
- package/lib/evals/dataset.mjs +137 -0
- package/lib/evals/gates.mjs +175 -0
- package/lib/export-branding.mjs +32 -0
- package/lib/graph/build-co-change.mjs +54 -0
- package/lib/graph/build-from-registry.mjs +136 -0
- package/lib/graph/build-import-graph.mjs +153 -0
- package/lib/graph/cli.mjs +110 -0
- package/lib/graph/impact-cli.mjs +89 -0
- package/lib/graph/impact.mjs +108 -0
- package/lib/graph/staleness.mjs +44 -0
- package/lib/graph/store.mjs +172 -0
- package/lib/health-check.mjs +90 -76
- package/lib/hooks/artifact-release-gate.mjs +43 -0
- package/lib/hooks/brand-prose-lint.mjs +38 -0
- package/lib/hooks/graph-impact-advisory.mjs +62 -0
- package/lib/hooks/session-optimize.mjs +84 -207
- package/lib/hooks/session-start.mjs +18 -16
- package/lib/host-disposition.mjs +7 -0
- package/lib/improvement/cli.mjs +189 -0
- package/lib/improvement/controller.mjs +137 -0
- package/lib/improvement/proposal.mjs +120 -0
- package/lib/improvement/specialist-loop.mjs +192 -0
- package/lib/improvement/store.mjs +89 -0
- package/lib/improvement/surface.mjs +219 -0
- package/lib/ingest-tooling.mjs +97 -0
- package/lib/init/doc-lanes.mjs +165 -0
- package/lib/init-docs.mjs +31 -178
- package/lib/init-unified.mjs +50 -119
- package/lib/init-update-guide.mjs +102 -0
- package/lib/init-update.mjs +32 -1
- package/lib/init.mjs +8 -0
- package/lib/install/desktop-binary-download.mjs +85 -0
- package/lib/install/legacy-global-cleanup.mjs +189 -0
- package/lib/intake/constants.mjs +29 -0
- package/lib/intake/daemon.mjs +2 -0
- package/lib/intake/git-queue.mjs +9 -8
- package/lib/intake/intake-config.mjs +52 -105
- package/lib/intake/legacy-paths.mjs +5 -0
- package/lib/intake/queue.mjs +2 -1
- package/lib/intake/session-prelude.mjs +90 -1
- package/lib/libreoffice-export.mjs +97 -0
- package/lib/logging/rotate.mjs +9 -0
- package/lib/maintenance/docker-reclaim.mjs +206 -0
- package/lib/mcp/external-schema-cost.mjs +74 -0
- package/lib/mcp/server.mjs +103 -10
- package/lib/mcp/stdio-mcp-probe.mjs +188 -0
- package/lib/mcp/tool-budget.mjs +55 -4
- package/lib/mcp/tools/document.mjs +18 -4
- package/lib/mcp/tools/embedded-contract.mjs +14 -0
- package/lib/mcp/tools/skills.mjs +32 -3
- package/lib/mcp/tools/workflow.mjs +13 -1
- package/lib/model-free-selector.mjs +18 -0
- package/lib/model-registry.mjs +13 -229
- package/lib/model-router.mjs +373 -92
- package/lib/models/behavior-matrix.mjs +289 -0
- package/lib/models/catalog.mjs +209 -0
- package/lib/models/execution-capability-profile.mjs +196 -0
- package/lib/models/execution-policy.mjs +307 -0
- package/lib/models/provider-poll.mjs +383 -0
- package/lib/npm-spawn-env.mjs +17 -0
- package/lib/ollama/installed-models.mjs +129 -0
- package/lib/oracle/actions.mjs +187 -0
- package/lib/oracle/artifact-gate.mjs +99 -0
- package/lib/oracle/cli.mjs +204 -0
- package/lib/oracle/daemon-entry.mjs +14 -0
- package/lib/oracle/dispatch.mjs +81 -0
- package/lib/oracle/execute.mjs +143 -0
- package/lib/oracle/gaps.mjs +76 -0
- package/lib/oracle/index.mjs +84 -0
- package/lib/oracle/issues.mjs +164 -0
- package/lib/oracle/org-graph.mjs +170 -0
- package/lib/oracle/policy.mjs +80 -0
- package/lib/oracle/read-model.mjs +398 -0
- package/lib/oracle/reconcile.mjs +191 -0
- package/lib/oracle/routing.mjs +89 -0
- package/lib/oracle/synthesize.mjs +384 -0
- package/lib/oracle/verdicts.mjs +51 -0
- package/lib/orchestration/worker.mjs +88 -27
- package/lib/orchestration-policy.mjs +50 -0
- package/lib/parity.mjs +96 -2
- package/lib/playwright-demo.mjs +254 -0
- package/lib/project-init-shared.mjs +4 -1
- package/lib/prompt-composer.js +7 -3
- package/lib/prompt-validation-contract.mjs +24 -0
- package/lib/provider-capabilities.js +57 -11
- package/lib/providers/contract/adapters/confluence/index.mjs +181 -0
- package/lib/providers/contract/adapters/git/index.mjs +115 -0
- package/lib/providers/contract/adapters/github/index.mjs +166 -0
- package/lib/providers/contract/adapters/jira/index.mjs +187 -0
- package/lib/providers/contract/adapters/slack/index.mjs +175 -0
- package/lib/providers/contract/contract-tests.mjs +57 -0
- package/lib/providers/contract/errors.mjs +48 -0
- package/lib/providers/contract/interface.mjs +50 -0
- package/lib/providers/contract/registry.mjs +102 -0
- package/lib/providers/copilot-auth.mjs +297 -0
- package/lib/providers/credential-bootstrap.mjs +178 -0
- package/lib/providers/credential-catalog.mjs +46 -0
- package/lib/providers/credential-sources.mjs +63 -0
- package/lib/providers/creds.mjs +5 -2
- package/lib/providers/op-run.mjs +59 -0
- package/lib/providers/secret-resolver.mjs +159 -0
- package/lib/publish-template.mjs +163 -0
- package/lib/publish-tooling.mjs +119 -0
- package/lib/publish.mjs +305 -0
- package/lib/registry/cli.mjs +82 -0
- package/lib/registry/consolidation.mjs +147 -0
- package/lib/registry/generate-docs.mjs +75 -0
- package/lib/registry/skill-verification.mjs +57 -0
- package/lib/registry/surface-map.mjs +76 -0
- package/lib/registry/validate.mjs +135 -0
- package/lib/resources/budget.mjs +82 -0
- package/lib/resources/process-budget.mjs +45 -0
- package/lib/rules-delivery.mjs +9 -2
- package/lib/rules-read.mjs +26 -0
- package/lib/runtime-env.mjs +23 -0
- package/lib/runtime-pressure.mjs +51 -7
- package/lib/schema-infer.mjs +13 -2
- package/lib/server/chat-loop.mjs +622 -0
- package/lib/server/demo-preview.mjs +63 -0
- package/lib/server/index.mjs +259 -9
- package/lib/server/rate-limit.mjs +5 -3
- package/lib/server/webhook.mjs +3 -2
- package/lib/service-manager.mjs +60 -8
- package/lib/setup.mjs +70 -7
- package/lib/specialists/prompt-schema.mjs +19 -10
- package/lib/specialists/roster.mjs +43 -0
- package/lib/specialists/scaffold.mjs +56 -0
- package/lib/storage/backend.mjs +6 -6
- package/lib/storage/hybrid-query.mjs +7 -4
- package/lib/storage/state-source.mjs +5 -5
- package/lib/storage/sync.mjs +2 -3
- package/lib/telemetry/rule-calls.mjs +52 -0
- package/lib/template-registry.mjs +2 -2
- package/lib/templates/visual-requirements.mjs +27 -51
- package/lib/test-corpus-inventory.mjs +313 -0
- package/lib/uninstall/uninstall.mjs +19 -7
- package/lib/update.mjs +12 -0
- package/lib/upgrade.mjs +14 -0
- package/lib/wireframe.mjs +20 -14
- package/lib/worker/run.mjs +17 -4
- package/lib/worker/trace.mjs +11 -3
- package/package.json +28 -14
- package/personas/construct.md +2 -2
- package/platforms/claude/settings.template.json +36 -0
- package/rules/common/patterns.md +1 -1
- package/rules/common/release-gates.md +4 -3
- package/scripts/sync-specialists.mjs +41 -28
- package/skills/devops/data-engineering.md +1 -1
- package/skills/docs/adr-workflow.md +1 -0
- package/skills/docs/backlog-proposal-workflow.md +1 -0
- package/skills/docs/codebase-research-workflow.md +40 -0
- package/skills/docs/customer-profile-workflow.md +1 -0
- package/skills/docs/document-ingest-workflow.md +1 -0
- package/skills/docs/evidence-ingest-workflow.md +1 -0
- package/skills/docs/init-docs.md +2 -2
- package/skills/docs/init-project.md +7 -2
- package/skills/docs/prd-workflow.md +24 -1
- package/skills/docs/prfaq-workflow.md +1 -0
- package/skills/docs/product-intelligence-workflow.md +1 -0
- package/skills/docs/product-signal-workflow.md +1 -0
- package/skills/docs/research-workflow.md +54 -37
- package/skills/docs/runbook-workflow.md +1 -0
- package/skills/docs/strategy-workflow.md +1 -0
- package/skills/docs/user-research-workflow.md +40 -0
- package/skills/operating/orchestration-reference.md +1 -1
- package/skills/roles/architect.md +5 -0
- package/skills/roles/operator.docs.md +4 -0
- package/skills/routing.md +4 -2
- package/specialists/artifact-manifest.json +489 -0
- package/specialists/artifact-manifest.schema.json +83 -0
- package/specialists/audit-enrichments.json +454 -0
- package/specialists/contracts.json +37 -25
- package/specialists/prompts/_shared/validation-contract.md +26 -0
- package/specialists/prompts/cx-accessibility.md +21 -2
- package/specialists/prompts/cx-ai-engineer.md +24 -1
- package/specialists/prompts/cx-architect.md +4 -1
- package/specialists/prompts/cx-business-strategist.md +23 -2
- package/specialists/prompts/cx-data-analyst.md +22 -1
- package/specialists/prompts/cx-data-engineer.md +23 -2
- package/specialists/prompts/cx-debugger.md +21 -2
- package/specialists/prompts/cx-designer.md +26 -3
- package/specialists/prompts/cx-devil-advocate.md +19 -2
- package/specialists/prompts/cx-docs-keeper.md +28 -1
- package/specialists/prompts/cx-engineer.md +22 -1
- package/specialists/prompts/cx-evaluator.md +18 -1
- package/specialists/prompts/cx-explorer.md +21 -2
- package/specialists/prompts/cx-legal-compliance.md +21 -2
- package/specialists/prompts/cx-operations.md +21 -2
- package/specialists/prompts/cx-oracle.md +94 -0
- package/specialists/prompts/cx-orchestrator.md +20 -1
- package/specialists/prompts/cx-platform-engineer.md +25 -2
- package/specialists/prompts/cx-product-manager.md +32 -1
- package/specialists/prompts/cx-qa.md +24 -2
- package/specialists/prompts/cx-rd-lead.md +23 -2
- package/specialists/prompts/cx-release-manager.md +23 -2
- package/specialists/prompts/cx-researcher.md +22 -2
- package/specialists/prompts/cx-reviewer.md +18 -1
- package/specialists/prompts/cx-security.md +22 -2
- package/specialists/prompts/cx-sre.md +30 -3
- package/specialists/prompts/cx-test-automation.md +7 -1
- package/specialists/prompts/cx-trace-reviewer.md +22 -3
- package/specialists/prompts/cx-ux-researcher.md +21 -2
- package/specialists/registry.json +52 -173
- package/specialists/tone-profiles.json +42 -0
- package/templates/demos/playwright/demo-recording.config.mjs +47 -0
- package/templates/demos/recordings/agentic-platforms-prd.json +19 -0
- package/templates/demos/scripts/agentic-platforms-prd.json +44 -0
- package/templates/demos/specs/_helpers/scroll-artifact.ts +89 -0
- package/templates/demos/tapes/agentic-platforms-prd.tape +49 -0
- package/templates/demos/tapes/resource-guard-rails.tape +49 -0
- package/templates/demos/vhs/construct-cockpit.json +24 -0
- package/templates/distribution/construct-brand.typ +446 -0
- package/templates/distribution/construct-decision.typ +38 -0
- package/templates/distribution/construct-deck.html +95 -0
- package/templates/distribution/construct-pdf.typ +38 -0
- package/templates/distribution/construct-prd.typ +38 -0
- package/templates/distribution/construct-reference.docx +0 -0
- package/templates/distribution/construct-research.typ +38 -0
- package/templates/distribution/construct-web.html +92 -0
- package/templates/distribution/fonts/Geist-Bold.ttf +0 -0
- package/templates/distribution/fonts/Geist-Medium.ttf +0 -0
- package/templates/distribution/fonts/Geist-Regular.ttf +0 -0
- package/templates/distribution/fonts/Geist-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/GeistMono-Medium.ttf +0 -0
- package/templates/distribution/fonts/GeistMono-Regular.ttf +0 -0
- package/templates/distribution/fonts/GeistMono-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/IBMPlexMono-Regular.otf +0 -0
- package/templates/distribution/fonts/JetBrainsMono-Medium.ttf +0 -0
- package/templates/distribution/fonts/JetBrainsMono-Regular.ttf +0 -0
- package/templates/distribution/fonts/JetBrainsMono-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-Bold.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-Medium.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-Regular.ttf +0 -0
- package/templates/distribution/fonts/PlusJakartaSans-SemiBold.ttf +0 -0
- package/templates/distribution/fonts/README.md +36 -0
- package/templates/distribution/fonts/SpaceGrotesk-Variable.ttf +0 -0
- package/templates/distribution/fonts/handwritten/Caveat.ttf +0 -0
- package/templates/distribution/fonts/legacy/IBMPlexMono-Regular.otf +0 -0
- package/templates/distribution/fonts/legacy/Inter-Medium.otf +0 -0
- package/templates/distribution/fonts/legacy/Inter-Regular.otf +0 -0
- package/templates/distribution/fonts/legacy/Inter-SemiBold.otf +0 -0
- package/templates/distribution/fonts/legacy/InterDisplay-SemiBold.otf +0 -0
- package/templates/distribution/fonts/legacy/SourceSerif4-Regular.otf +0 -0
- package/templates/distribution/fonts/legacy/SourceSerif4-Semibold.otf +0 -0
- package/templates/distribution/icons/activity.svg +15 -0
- package/templates/distribution/icons/alert-triangle.svg +17 -0
- package/templates/distribution/icons/book-open.svg +16 -0
- package/templates/distribution/icons/bot.svg +20 -0
- package/templates/distribution/icons/brain.svg +22 -0
- package/templates/distribution/icons/circle-check.svg +16 -0
- package/templates/distribution/icons/clipboard-check.svg +17 -0
- package/templates/distribution/icons/cpu.svg +28 -0
- package/templates/distribution/icons/database.svg +17 -0
- package/templates/distribution/icons/eye.svg +16 -0
- package/templates/distribution/icons/file-text.svg +19 -0
- package/templates/distribution/icons/gauge.svg +16 -0
- package/templates/distribution/icons/git-branch.svg +17 -0
- package/templates/distribution/icons/key.svg +17 -0
- package/templates/distribution/icons/layers.svg +17 -0
- package/templates/distribution/icons/list-checks.svg +19 -0
- package/templates/distribution/icons/lock.svg +16 -0
- package/templates/distribution/icons/message-square.svg +15 -0
- package/templates/distribution/icons/network.svg +19 -0
- package/templates/distribution/icons/route.svg +17 -0
- package/templates/distribution/icons/scale.svg +19 -0
- package/templates/distribution/icons/search.svg +16 -0
- package/templates/distribution/icons/send.svg +16 -0
- package/templates/distribution/icons/server.svg +18 -0
- package/templates/distribution/icons/shield-check.svg +16 -0
- package/templates/distribution/icons/users.svg +18 -0
- package/templates/distribution/icons/webhook.svg +17 -0
- package/templates/distribution/icons/workflow.svg +17 -0
- package/templates/distribution/icons/wrench.svg +15 -0
- package/templates/distribution/run.mjs +18 -1
- package/templates/docs/adr.md +7 -0
- package/templates/docs/construct_guide.md +8 -8
- package/templates/docs/customer-profile.md +4 -0
- package/templates/docs/one-pager.md +4 -0
- package/templates/docs/postmortem.md +31 -0
- package/templates/docs/prd-platform.md +19 -0
- package/templates/docs/prd.md +15 -0
- package/templates/docs/prfaq.md +7 -0
- package/templates/docs/qa-strategy.md +103 -0
- package/templates/docs/research-brief.md +8 -0
- package/templates/docs/rfc-platform.md +12 -0
- package/templates/docs/test-plan.md +7 -0
package/personas/construct.md
CHANGED
|
@@ -25,7 +25,7 @@ Use the single-writer rule whenever multiple sessions are active: if two session
|
|
|
25
25
|
|
|
26
26
|
## Classify before acting <!-- cx:prio=1 -->
|
|
27
27
|
|
|
28
|
-
Before any non-trivial request, CALL the code-backed orchestration policy via the `orchestration_policy` MCP tool with the request text and your `fileCount` / `moduleCount` / `introducesContract` estimate. Do not classify from memory. Honor the returned `track` and `specialists`. When `track` is
|
|
28
|
+
Before any non-trivial request, CALL the code-backed orchestration policy via the `orchestration_policy` MCP tool with the request text and your `fileCount` / `moduleCount` / `introducesContract` estimate. Do not classify from memory. Honor the returned `track` and `specialists`. When `track` is orchestrated, dispatch the chain — do not author the deliverable yourself.
|
|
29
29
|
|
|
30
30
|
Tracks: immediate (act directly), focused (one bounded specialist), orchestrated (plan → challenge → build → validate, tracker-backed). cx-devil-advocate is mandatory whenever `riskFlags` include architecture, security, dataIntegrity, or ai.
|
|
31
31
|
|
|
@@ -36,7 +36,7 @@ Orchestrated dispatches emit a task-packet with `goal`, `intent`, `workCategory`
|
|
|
36
36
|
`orchestration_policy` returns three artifacts; honor all three:
|
|
37
37
|
|
|
38
38
|
1. **Gates**. `framingChallenge`, `externalResearch`, `docAuthoring`
|
|
39
|
-
2. **Contract chain**. typed handoffs from `specialists/contracts.json`. Call `agent_contract`
|
|
39
|
+
2. **Contract chain**. typed handoffs from `specialists/contracts.json`. Call `agent_contract` with `handoffPacket` from `orchestration_policy`.
|
|
40
40
|
3. **Specialist sequence**. dispatch plan with ordering/parallel markers.
|
|
41
41
|
|
|
42
42
|
Before DONE: postconditions met · sources cited · framing logged · ADRs have Rejected alternatives.
|
|
@@ -165,6 +165,30 @@
|
|
|
165
165
|
"id": "post:edit:comment-lint",
|
|
166
166
|
"description": "Block edits that violate comment policy (banned patterns, missing required header). No bypass — repair the policy if it fires wrong."
|
|
167
167
|
},
|
|
168
|
+
{
|
|
169
|
+
"matcher": "Write|Edit|MultiEdit",
|
|
170
|
+
"hooks": [
|
|
171
|
+
{
|
|
172
|
+
"type": "command",
|
|
173
|
+
"command": "node \"$HOME/.construct/lib/hooks/brand-prose-lint.mjs\"",
|
|
174
|
+
"timeout": 15
|
|
175
|
+
}
|
|
176
|
+
],
|
|
177
|
+
"id": "post:edit:brand-prose-lint",
|
|
178
|
+
"description": "Block marketing voice, retired fonts, and Construct/cli naming drift in governed docs and templates."
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"matcher": "Write|Edit|MultiEdit",
|
|
182
|
+
"hooks": [
|
|
183
|
+
{
|
|
184
|
+
"type": "command",
|
|
185
|
+
"command": "node \"$HOME/.construct/lib/hooks/artifact-release-gate.mjs\"",
|
|
186
|
+
"timeout": 15
|
|
187
|
+
}
|
|
188
|
+
],
|
|
189
|
+
"id": "post:edit:artifact-release-gate",
|
|
190
|
+
"description": "Advisory: surface manifest structure/visual gaps on typed docs under docs/** and .cx/research/**"
|
|
191
|
+
},
|
|
168
192
|
{
|
|
169
193
|
"matcher": "Write|Edit|MultiEdit",
|
|
170
194
|
"hooks": [
|
|
@@ -177,6 +201,18 @@
|
|
|
177
201
|
"id": "post:edit:doc-coupling",
|
|
178
202
|
"description": "Advisory: nudge when code edits accumulate without CHANGELOG/docs updates (pre-commit gate will block at commit time)"
|
|
179
203
|
},
|
|
204
|
+
{
|
|
205
|
+
"matcher": "Write|Edit|MultiEdit",
|
|
206
|
+
"hooks": [
|
|
207
|
+
{
|
|
208
|
+
"type": "command",
|
|
209
|
+
"command": "node \"$HOME/.construct/lib/hooks/graph-impact-advisory.mjs\"",
|
|
210
|
+
"timeout": 10
|
|
211
|
+
}
|
|
212
|
+
],
|
|
213
|
+
"id": "post:edit:graph-impact",
|
|
214
|
+
"description": "Advisory: surface affected tests from the dependency graph after code edits"
|
|
215
|
+
},
|
|
180
216
|
{
|
|
181
217
|
"matcher": "Write|Edit|MultiEdit",
|
|
182
218
|
"hooks": [
|
package/rules/common/patterns.md
CHANGED
|
@@ -6,7 +6,7 @@ description: reusable design patterns and skeleton project strategy.
|
|
|
6
6
|
## Skeleton Projects
|
|
7
7
|
|
|
8
8
|
When implementing new functionality:
|
|
9
|
-
1. Search for
|
|
9
|
+
1. Search for proven skeleton projects
|
|
10
10
|
2. Evaluate options for security, extensibility, and relevance
|
|
11
11
|
3. Clone best match as foundation
|
|
12
12
|
4. Iterate within proven structure
|
|
@@ -7,7 +7,7 @@ These are blocking gates. Every agent, persona, and harness session working in o
|
|
|
7
7
|
|
|
8
8
|
The goal is simple: if a gate would fail in CI, it fails locally first. We never push and pray.
|
|
9
9
|
|
|
10
|
-
## The
|
|
10
|
+
## The six local gates
|
|
11
11
|
|
|
12
12
|
Run these before declaring work done. Pasting the output into the PR body or `bd note` is the standard evidence.
|
|
13
13
|
|
|
@@ -18,8 +18,9 @@ Run these before declaring work done. Pasting the output into the PR body or `bd
|
|
|
18
18
|
| Doc verification | `node bin/construct docs:verify` | "All documentation checks passed": no warnings either |
|
|
19
19
|
| AUTO doc drift | `node bin/construct docs:update --check` | "Docs are up to date" |
|
|
20
20
|
| Template policy | `npm run lint:templates` | "Template policy: clean." |
|
|
21
|
+
| Certification RC gate | `node bin/construct certify gate` | Release-critical capabilities are not stale; hermetic certification scenarios pass; skipped live runs do not satisfy evidence |
|
|
21
22
|
|
|
22
|
-
The shortcut for all
|
|
23
|
+
The shortcut for all six (plus dashboard sync) is:
|
|
23
24
|
|
|
24
25
|
```bash
|
|
25
26
|
npm run release:check
|
|
@@ -33,7 +34,7 @@ Commit subjects must match `type(scope): subject`: type from {feat, fix, refacto
|
|
|
33
34
|
|
|
34
35
|
PR descriptions must keep all six headings (Summary, Beads issue, Doc updates included, Local gates, Test plan, Risks / rollback) with at least one checked box in both the "Doc updates" and "Local gates" sections. Empty templates fail.
|
|
35
36
|
|
|
36
|
-
Forbidden in commit messages: `Co-Authored-By
|
|
37
|
+
Forbidden in commit messages: any `Co-Authored-By:` trailer (including Cursor agent attribution) unless the user explicitly asks, `--no-verify`, `--no-gpg-sign`. Forbidden in PR bodies: deleting the required headings, leaving every gate box unchecked.
|
|
37
38
|
|
|
38
39
|
## The tracker contract
|
|
39
40
|
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
* global so hooks fire in every Claude Code session.
|
|
14
14
|
*
|
|
15
15
|
* Project scope (`<project>/.claude/`, `<project>/.codex/`, `<project>/.github/`, …)
|
|
16
|
-
* - `construct`
|
|
17
|
-
* wiring.
|
|
16
|
+
* - `construct` front door only (Single Front Door), slash commands, skills, MCP
|
|
17
|
+
* wiring. Specialists dispatch internally via orchestration MCP tools.
|
|
18
18
|
*
|
|
19
19
|
* Flags:
|
|
20
20
|
* --dry-run Print a diff of what would change without writing anything.
|
|
@@ -56,6 +56,7 @@ import {
|
|
|
56
56
|
} from "../lib/mcp-platform-config.mjs";
|
|
57
57
|
import { loadConstructEnv } from "../lib/env-config.mjs";
|
|
58
58
|
import { inlineRoleAntiPatterns, PROMPT_WORD_CAP } from "../lib/role-preload.mjs";
|
|
59
|
+
import { inlineValidationContract } from "../lib/prompt-validation-contract.mjs";
|
|
59
60
|
import { loadManifest } from "../lib/roles/manifest.mjs";
|
|
60
61
|
import { resolveActiveProfile } from "../lib/profiles/loader.mjs";
|
|
61
62
|
import { resolveTiersForPrimary, resolveCapabilityTier, selectLocalEditorModel } from "../lib/model-router.mjs";
|
|
@@ -154,6 +155,16 @@ if (validationErrors.length > 0) {
|
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
|
|
158
|
+
{
|
|
159
|
+
const { validatePromptFiles } = await import("../lib/specialists/prompt-schema.mjs");
|
|
160
|
+
const promptResult = validatePromptFiles({ rootDir: root, registry });
|
|
161
|
+
if (promptResult.errors.length > 0) {
|
|
162
|
+
console.error("Specialist prompt validation failed:");
|
|
163
|
+
for (const err of promptResult.errors) console.error(` - ${err}`);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
157
168
|
// --- Dry-run + lockfile + two-phase write infrastructure ---
|
|
158
169
|
|
|
159
170
|
const DRY_RUN = process.argv.includes("--dry-run");
|
|
@@ -518,10 +529,6 @@ function loadPersonaPrompt(persona) {
|
|
|
518
529
|
return prompt;
|
|
519
530
|
}
|
|
520
531
|
|
|
521
|
-
export function buildAgentRoster(allEntries) {
|
|
522
|
-
return allEntries.map((e) => `- ${adapterName(e)}: ${e.when_to_use || e.description}`).join("\n");
|
|
523
|
-
}
|
|
524
|
-
|
|
525
532
|
function buildModelGuidanceBlock(entry) {
|
|
526
533
|
const merged = { ...globalModelGuidance, ...(entry.modelGuidance ?? {}) };
|
|
527
534
|
const families = Object.keys(merged);
|
|
@@ -675,7 +682,7 @@ function buildPrompt(entry, allEntries, platform, { capabilityTier = 'full' } =
|
|
|
675
682
|
|
|
676
683
|
if (capabilityTier && capabilityTier !== 'full' && entry.promptFile) {
|
|
677
684
|
let slim = renderPersonaForTier(readPromptBody(entry.promptFile, root), capabilityTier);
|
|
678
|
-
if (entry.injectAgentRoster
|
|
685
|
+
if (entry.injectAgentRoster) {
|
|
679
686
|
slim = `${ORCHESTRATION_MICRO_PROMPT}\n\n${slim}`;
|
|
680
687
|
}
|
|
681
688
|
return enforcePromptWordCap(slim, entry);
|
|
@@ -688,19 +695,17 @@ function buildPrompt(entry, allEntries, platform, { capabilityTier = 'full' } =
|
|
|
688
695
|
}).prompt;
|
|
689
696
|
|
|
690
697
|
prompt = inlineRoleAntiPatterns(prompt, root, entry.name, console.warn, { preload: entry.preloadRoleGuidance === true });
|
|
698
|
+
prompt = inlineValidationContract(prompt, root, entry.name);
|
|
691
699
|
|
|
692
|
-
// Platform-Native Orchestration Alignment (ADR-0002).
|
|
693
|
-
//
|
|
694
|
-
//
|
|
695
|
-
//
|
|
696
|
-
|
|
697
|
-
//
|
|
698
|
-
//
|
|
699
|
-
|
|
700
|
-
if (entry.injectAgentRoster
|
|
701
|
-
const roster = buildAgentRoster(allEntries);
|
|
702
|
-
prompt = `Available specialist agents:\n${roster}\n\n${prompt}`;
|
|
703
|
-
} else if (entry.injectAgentRoster && capabilities.hasNativeSubagents) {
|
|
700
|
+
// Platform-Native Orchestration Alignment (ADR-0002). All hosts receive the
|
|
701
|
+
// tool-bound micro-prompt when injectAgentRoster is set; the static 29-line
|
|
702
|
+
// roster was removed (construct-ymp5). Specialists resolve at runtime via
|
|
703
|
+
// orchestration_policy, which returns a lazy specialistCatalog.
|
|
704
|
+
|
|
705
|
+
// Single Front Door: all hosts resolve specialists at runtime via
|
|
706
|
+
// orchestration_policy / orchestration_run — never inject the static roster.
|
|
707
|
+
|
|
708
|
+
if (entry.injectAgentRoster) {
|
|
704
709
|
prompt = `${ORCHESTRATION_MICRO_PROMPT}\n\n${prompt}`;
|
|
705
710
|
}
|
|
706
711
|
|
|
@@ -1432,12 +1437,10 @@ function syncCursor(targetDir = null, wants = true) {
|
|
|
1432
1437
|
|
|
1433
1438
|
if (targetDir) {
|
|
1434
1439
|
const rulesPath = path.join(targetDir, ".cursor", "rules", "construct.mdc");
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
fs.writeFileSync(rulesPath, body);
|
|
1440
|
-
}
|
|
1440
|
+
const body = `---\ndescription: Construct front-door — invoke \`construct\` for orchestration\nalwaysApply: false\n---\n\n<!-- Generated by construct sync — do not edit; re-run \`construct sync\` -->\n\nThis project uses Construct (\`@geraldmaron/construct\`) as the single agent\nentry point. Route work through the \`construct\` persona; specialists are\ninternal and dispatched via MCP \`orchestration_run\` (start \`construct dashboard\`).\n\nSkills load via MCP \`get_skill\`; see \`.claude/skills/\` for synced playbooks.\n`;
|
|
1441
|
+
if (!DRY_RUN) {
|
|
1442
|
+
mkdirp(path.dirname(rulesPath));
|
|
1443
|
+
fs.writeFileSync(rulesPath, body);
|
|
1441
1444
|
}
|
|
1442
1445
|
|
|
1443
1446
|
// Glob-scoped language rules land as managed per-rule .mdc files only when
|
|
@@ -1646,7 +1649,8 @@ function syncOpencode(entries, targetDir = null, wants = true) {
|
|
|
1646
1649
|
}
|
|
1647
1650
|
}
|
|
1648
1651
|
|
|
1649
|
-
// Heavy external MCP servers serialize ~
|
|
1652
|
+
// Heavy external MCP servers serialize a measured ~37k tokens of tool schema
|
|
1653
|
+
// into EVERY agent's request — github ~30k alone (fixtures 2026-06-22) —
|
|
1650
1654
|
// agent's request — including the built-in Build/Plan agents the per-agent
|
|
1651
1655
|
// permission prune cannot reach. OpenCode 1.15.4 has no per-session tool
|
|
1652
1656
|
// filter (chat.params carries no tool list), so disabling the whole server in
|
|
@@ -1774,13 +1778,22 @@ function syncOpencode(entries, targetDir = null, wants = true) {
|
|
|
1774
1778
|
config.construct.models = { ...resolvedModels };
|
|
1775
1779
|
|
|
1776
1780
|
// Seed a cheap auxiliary model for titles and summaries when the user has not
|
|
1777
|
-
// chosen one — a cost lever only.
|
|
1778
|
-
// and is never written. Global scope only; project configs inherit it.
|
|
1781
|
+
// chosen one — a cost lever only. Global scope only; project configs inherit it.
|
|
1779
1782
|
|
|
1780
1783
|
if (!targetDir && config.small_model === undefined) {
|
|
1781
1784
|
config.small_model = resolvedModels.fast || "anthropic/claude-haiku-4-5-20251001";
|
|
1782
1785
|
}
|
|
1783
1786
|
|
|
1787
|
+
// Seed a text-capable primary model when the user has not pinned one, so chat
|
|
1788
|
+
// and routing never fall through to a host provider-default that happens to be
|
|
1789
|
+
// an image/non-text model. Seeds only when absent; an explicit user choice is
|
|
1790
|
+
// never overwritten. resolvedModels.standard is family-/registry-aware and
|
|
1791
|
+
// free-biased. Global scope only; project configs inherit it.
|
|
1792
|
+
|
|
1793
|
+
if (!targetDir && (config.model === undefined || config.model === null || config.model === "")) {
|
|
1794
|
+
config.model = resolvedModels.standard || resolvedModels.reasoning || resolvedModels.fast || "openrouter/qwen/qwen3-coder:free";
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1784
1797
|
writeOpenCodeConfig(config, configPath);
|
|
1785
1798
|
|
|
1786
1799
|
const sourcePluginsDir = path.join(root, "platforms", "opencode", "plugins");
|
|
@@ -17,7 +17,7 @@ artifactType: data-pipeline
|
|
|
17
17
|
|
|
18
18
|
### ELT over ETL
|
|
19
19
|
|
|
20
|
-
Modern data platforms (BigQuery, Snowflake, Redshift) are
|
|
20
|
+
Modern data platforms (BigQuery, Snowflake, Redshift) are capable enough to transform inside the warehouse. Prefer **ELT** (Extract → Load raw → Transform in warehouse):
|
|
21
21
|
|
|
22
22
|
```
|
|
23
23
|
Source → Airbyte/Fivetran → Raw tables → dbt models → Mart/API
|
|
@@ -3,6 +3,7 @@ name: docs-adr-workflow
|
|
|
3
3
|
description: "Use when: an architectural decision is made that affects the system structure, data model, API contracts, or technology choices."
|
|
4
4
|
inputs: [decision-context]
|
|
5
5
|
artifactType: adr
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# ADR Workflow
|
|
8
9
|
|
|
@@ -3,6 +3,7 @@ name: docs-backlog-proposal-workflow
|
|
|
3
3
|
description: "Use when: product evidence should create or update Jira, Linear, GitHub Issues, or another tracker."
|
|
4
4
|
inputs: [evidence-brief, prd, signal]
|
|
5
5
|
artifactType: backlog-proposal
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# Backlog Proposal Workflow
|
|
8
9
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: docs-codebase-research-workflow
|
|
3
|
+
description: "Use when: cx-explorer maps the repo — entry points, dependencies, hot paths, or unfamiliar subsystems."
|
|
4
|
+
inputs: [repository-path]
|
|
5
|
+
artifactType: research-brief
|
|
6
|
+
toneDefault: pedagogical
|
|
7
|
+
toneAllowed: [pedagogical, direct]
|
|
8
|
+
verificationBar: "Every claim cites file:line or command output; no assumed architecture."
|
|
9
|
+
---
|
|
10
|
+
# Codebase Research Workflow
|
|
11
|
+
|
|
12
|
+
Use when: cx-explorer investigates **this repository** — structure, dependencies, behavior. Not for external vendor research or user interviews.
|
|
13
|
+
|
|
14
|
+
Call `get_skill("roles/researcher.explorer")` and `get_skill("exploration/repo-map")` before deep dives.
|
|
15
|
+
|
|
16
|
+
## Steps
|
|
17
|
+
|
|
18
|
+
1. **Clarify the map question**: what subsystem, entry point, or data flow must be understood?
|
|
19
|
+
2. **Read before concluding**: grep, glob, read implicated files. No claims from memory.
|
|
20
|
+
3. **Produce artifacts**:
|
|
21
|
+
- `.cx/codebase-map.md` for broad orientation (repo-map skill)
|
|
22
|
+
- `.cx/research/{slug}.md` for focused investigations using `get_template("research-brief")`
|
|
23
|
+
4. **Source classes** (codebase-primary):
|
|
24
|
+
|
|
25
|
+
| Source | Class |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Source file at commit | primary |
|
|
28
|
+
| Test asserting behavior | primary |
|
|
29
|
+
| Config / schema in repo | primary |
|
|
30
|
+
| Comment or doc in repo | secondary |
|
|
31
|
+
| External blog about the repo | tertiary — locate code, do not cite alone |
|
|
32
|
+
|
|
33
|
+
5. **Cite as** `[source: path#Lnn]` or `[source: commit-sha]`.
|
|
34
|
+
6. **Tone**: default `pedagogical` — teach the next reader the shape of the system.
|
|
35
|
+
|
|
36
|
+
## Verification bar
|
|
37
|
+
|
|
38
|
+
- Every architectural claim traceable to file:line.
|
|
39
|
+
- Unknown paths marked `[unverified]` until read.
|
|
40
|
+
- cx-explorer must **not** answer product prioritization or user preference questions.
|
|
@@ -3,6 +3,7 @@ name: docs-customer-profile-workflow
|
|
|
3
3
|
description: "Use when: customer evidence should update durable product memory."
|
|
4
4
|
inputs: [signal, customer-profile]
|
|
5
5
|
artifactType: customer-profile
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# Customer Profile Workflow
|
|
8
9
|
|
|
@@ -3,6 +3,7 @@ name: docs-document-ingest-workflow
|
|
|
3
3
|
description: "Use when: the user points at a PDF, Word doc, spreadsheet, slide deck, export, or mixed document folder and wants a markdown version that Construct can search efficiently later."
|
|
4
4
|
inputs: [document]
|
|
5
5
|
artifactType: ingested-markdown
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# Document Ingest Workflow
|
|
8
9
|
|
|
@@ -3,6 +3,7 @@ name: docs-evidence-ingest-workflow
|
|
|
3
3
|
description: "Use when: the user pastes customer notes, Slack threads, support tickets, sales notes, research snippets, RFCs, analytics summaries, or competitor signals."
|
|
4
4
|
inputs: [signal, document]
|
|
5
5
|
artifactType: evidence-brief
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# Evidence Ingest Workflow
|
|
8
9
|
|
package/skills/docs/init-docs.md
CHANGED
|
@@ -46,7 +46,7 @@ docs/
|
|
|
46
46
|
|
|
47
47
|
## Interactive UX (TTY)
|
|
48
48
|
|
|
49
|
-
When run interactively, `construct init-
|
|
49
|
+
When run interactively, `construct init --docs-preset=*` renders a keyboard-driven **full-screen checkbox picker**: all available lanes listed with the default set pre-checked and context-suggested lanes highlighted in the UI. No typing required.
|
|
50
50
|
|
|
51
51
|
- **↑ / ↓**: move cursor (details shown in a dedicated panel)
|
|
52
52
|
- **Space**: toggle lane on/off
|
|
@@ -54,7 +54,7 @@ When run interactively, `construct init-docs` renders a keyboard-driven **full-s
|
|
|
54
54
|
- **Enter**: confirm and scaffold
|
|
55
55
|
- Follow-up choices use the same menu pattern instead of free-text answers
|
|
56
56
|
|
|
57
|
-
If the user selects the `intake` lane, `construct init
|
|
57
|
+
If the user selects the `intake` lane, `construct init` should also create `.cx/inbox/`. Both `.cx/inbox/` and `docs/intake/` act as drop zones for ingestable files, while `docs/intake/` also serves as the durable paper trail lane.
|
|
58
58
|
|
|
59
59
|
When run non-interactively (`--yes` or piped stdin), the lean default set is used unless `--docs=` is supplied. `--docs=lean|product|full` or `--docs=adrs,prds,rfcs` both work.
|
|
60
60
|
|
|
@@ -10,9 +10,14 @@ Use when: starting work on a new project or joining an existing one without doc
|
|
|
10
10
|
|
|
11
11
|
## Command
|
|
12
12
|
```bash
|
|
13
|
-
construct init-
|
|
13
|
+
construct init --docs-preset=lean [path] # defaults to current directory; presets: lean | product | full
|
|
14
|
+
# or lane-specific init:
|
|
15
|
+
construct init [path] [--docs-preset=lean|product|full] # unified bootstrap (preferred)
|
|
16
|
+
construct init --docs-preset=lean [path] # docs-only lean preset
|
|
14
17
|
```
|
|
15
18
|
|
|
19
|
+
`npm run docs:init` is deprecated — use `construct init --docs-preset=*` instead.
|
|
20
|
+
|
|
16
21
|
## What it creates
|
|
17
22
|
```
|
|
18
23
|
.cx/ ← agent session memory and decisions
|
|
@@ -35,7 +40,7 @@ docs/ ← human-readable project documentation
|
|
|
35
40
|
4. Run `construct dashboard` to see the project in the dashboard.
|
|
36
41
|
|
|
37
42
|
## For cx-docs-keeper
|
|
38
|
-
At session start, check the core docs set. If missing, suggest running `construct init-docs
|
|
43
|
+
At session start, check the core docs set. If missing, suggest running `construct init --docs-preset=lean` (or `construct init --docs-preset=full` for the full lane set).
|
|
39
44
|
At session end, update the affected core docs so the next LLM session inherits current project reality.
|
|
40
45
|
|
|
41
46
|
## For all LLMs working in the repo
|
|
@@ -3,6 +3,7 @@ name: docs-prd-workflow
|
|
|
3
3
|
description: "Use when: the user asks to create a PRD, platform spec, business case, RFC, or requirements document."
|
|
4
4
|
inputs: [research-question, evidence-brief]
|
|
5
5
|
artifactType: prd
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# PRD Workflow
|
|
8
9
|
|
|
@@ -10,6 +11,8 @@ Use when: the user asks to create a PRD, platform spec, business case, RFC, or r
|
|
|
10
11
|
|
|
11
12
|
Choose the document type before drafting:
|
|
12
13
|
|
|
14
|
+
Resolve tone from `specialists/tone-profiles.json` and optional `.cx/brand-voice.json` override for the selected template.
|
|
15
|
+
|
|
13
16
|
| Template | Use when |
|
|
14
17
|
|---|---|
|
|
15
18
|
| `prd` | Customer-facing product capabilities, user workflows, end-user requirements |
|
|
@@ -36,7 +39,10 @@ Style constraint: do not produce a wall of bullets. Use paragraphs for reasoning
|
|
|
36
39
|
| `meta-prd` | `docs/meta-prd/{YYYY-MM-DD}-{slug}.md` |
|
|
37
40
|
| `rfc` | `docs/rfc/{YYYY-MM-DD}-{slug}.md` |
|
|
38
41
|
| `rfc-platform` | `docs/rfc/{YYYY-MM-DD}-{slug}.md` |
|
|
39
|
-
5. **cx-
|
|
42
|
+
5. **cx-devil-advocate** runs the FMEA challenge pass (`roles/reviewer.devil-advocate`) on the draft; highest-RPN failure modes need a mitigation or explicit accept-with-rationale before ship. Their specialist id must appear in `.cx/agent-log.jsonl` (manifest `releaseGate.requiredReviewers` for PRD-family types).
|
|
43
|
+
6. **cx-docs-keeper** updates `.cx/context.md` with a link to the PRD
|
|
44
|
+
|
|
45
|
+
Run `construct artifact validate <path> --type=<type>` before marking the artifact approved.
|
|
40
46
|
|
|
41
47
|
## File naming
|
|
42
48
|
- `docs/{template-type}/{YYYY-MM-DD}-{slug}.md`
|
|
@@ -54,3 +60,20 @@ Style constraint: do not produce a wall of bullets. Use paragraphs for reasoning
|
|
|
54
60
|
## After approval → beads
|
|
55
61
|
|
|
56
62
|
Once the PRD is approved, run `/plan feature {feature-slug}` to produce a structured implementation plan and import it as workflow task packets (beads) into `.cx/workflow.json`. Link the resulting `.cx/plans/` file back in the PRD as the implementation reference.
|
|
63
|
+
|
|
64
|
+
## Distribution (publish pipeline)
|
|
65
|
+
|
|
66
|
+
**`construct workflow invoke` returns a plan only** — it does not draft the PRD. Run the listed specialists (cx-product-manager, cx-researcher, cx-ux-researcher as needed) to author the artifact from the template. **Do not hand-write a stub and publish.**
|
|
67
|
+
|
|
68
|
+
Before distribution:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
node bin/construct artifact validate docs/prd-platform/<slug>.md --type=prd-platform
|
|
72
|
+
node bin/construct publish docs/prd-platform/<slug>.md --strict --figures
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`construct publish` runs the artifact release gate by default. Thin or unscaffolded docs **exit 2** with remediation hints. Do not use `--no-gate` or `--no-strict` in demos or ship paths.
|
|
76
|
+
|
|
77
|
+
**Presentation is part of done.** Published PDFs use type-specific Typst templates (`construct-prd.typ`, `construct-research.typ`, `construct-decision.typ`) with violet editorial branding and Inter body typography. Lead with an `::: executive-summary` narrative paragraph — not a bullet wall. Diagrams on the publish path use D2 `--sketch` and Mermaid `handDrawn` styling with Construct violet accent.
|
|
78
|
+
|
|
79
|
+
`--strict` means **toolchain and release gate** both pass. Invoke alone is not "done."
|
|
@@ -3,6 +3,7 @@ name: docs-prfaq-workflow
|
|
|
3
3
|
description: "Use when: the user asks for a PRFAQ, working-backwards doc, launch narrative, or FAQ grounded in product evidence."
|
|
4
4
|
inputs: [prd, evidence-brief]
|
|
5
5
|
artifactType: prfaq
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# PRFAQ Workflow
|
|
8
9
|
|
|
@@ -3,6 +3,7 @@ name: docs-product-intelligence-workflow
|
|
|
3
3
|
description: "Use when: the request involves customer evidence, PM synthesis, product requirements, PRDs, PRFAQs, customer profiles, product signals, or backlog proposals."
|
|
4
4
|
inputs: [signal, evidence-brief]
|
|
5
5
|
artifactType: prd
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# Product Intelligence Workflow
|
|
8
9
|
|
|
@@ -3,6 +3,7 @@ name: docs-product-signal-workflow
|
|
|
3
3
|
description: "Use when: the user asks what customers are asking for, what themes are emerging, whether evidence is strong enough, or what should become a PRD."
|
|
4
4
|
inputs: [signal, evidence-brief]
|
|
5
5
|
artifactType: signal-brief
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# Product Signal Workflow
|
|
8
9
|
|
|
@@ -1,56 +1,73 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: docs-research-workflow
|
|
3
|
-
description: "Use when:
|
|
3
|
+
description: "Use when: cx-researcher must investigate external facts — CVEs, APIs, market data, regulations, or vendor behavior."
|
|
4
4
|
inputs: [research-question]
|
|
5
5
|
artifactType: research-brief
|
|
6
|
+
toneDefault: direct
|
|
7
|
+
toneAllowed: [direct]
|
|
8
|
+
verificationBar: "Every load-bearing claim cites a verifiable primary source; label inference confidence; satisfy template structure requirements."
|
|
6
9
|
---
|
|
7
|
-
# Research Workflow
|
|
10
|
+
# External Research Workflow
|
|
8
11
|
|
|
9
|
-
Use when:
|
|
12
|
+
Use when: cx-researcher investigates **external** facts — not user interviews or codebase exploration. For user evidence use `docs/user-research-workflow`; for repo exploration use `docs/codebase-research-workflow`.
|
|
10
13
|
|
|
11
14
|
Follow [rules/common/research.md](../../rules/common/research.md) as the default policy.
|
|
12
15
|
|
|
13
16
|
## Steps
|
|
14
17
|
|
|
15
18
|
1. **Clarify the question**: one specific, falsifiable question the research must answer.
|
|
16
|
-
2. **Apply recency discipline**:
|
|
17
|
-
3. **Check internal evidence first**:
|
|
18
|
-
4. **Choose
|
|
19
|
+
2. **Apply recency discipline**: search from the most recent year backward. For fast-moving domains, treat sources older than 12 months as presumptively stale unless confirmed.
|
|
20
|
+
3. **Check internal evidence first**: `.cx/research/`, `.cx/knowledge/`, PRDs, ADRs, runbooks before going external.
|
|
21
|
+
4. **Choose authoritative starting points** (external primary only):
|
|
19
22
|
|
|
20
|
-
| Domain |
|
|
23
|
+
| Domain | Starting points |
|
|
21
24
|
|---|---|
|
|
22
|
-
| AI
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
| Regulatory / compliance / privacy | Primary regulation text, then official agency guidance |
|
|
28
|
-
|
|
29
|
-
5. **Use a source hierarchy**:
|
|
30
|
-
- Primary: official docs, exact-version API references, standards, source code, peer-reviewed papers
|
|
31
|
-
- Secondary: changelogs, migration guides, maintainer issue comments, release notes
|
|
32
|
-
- Tertiary: blogs/forums/Q&A only to locate primaries: never cite tertiary alone for a load-bearing claim
|
|
33
|
-
6. **Verify every URL**: fetch each URL cited and confirm it resolves and matches the cited claim. Mark unconfirmed URLs as `[unverified]`.
|
|
34
|
-
7. **Structure findings** using the template from `get_template("research-brief")`: resolves `.cx/templates/docs/research-brief.md` (override) then `templates/docs/research-brief.md` (shipped)
|
|
35
|
-
8. **Write to `.cx/research/{topic-slug}.md`**: cx-docs-keeper owns this
|
|
36
|
-
9. **Reference the research doc** in the requesting agent's output (link by path)
|
|
25
|
+
| AI / LLM / multi-agent | arXiv, ACL Anthology, NeurIPS/ICML/ICLR proceedings |
|
|
26
|
+
| Security / CVEs | NVD, GitHub Security Advisories, OWASP, vendor security blogs |
|
|
27
|
+
| Market / adoption | SEC filings, company announcements, then analyst reports citing primaries |
|
|
28
|
+
| Cloud / API / SDK | Official vendor docs for exact version, changelog, migration guide |
|
|
29
|
+
| Regulatory | Primary regulation text, official agency guidance |
|
|
37
30
|
|
|
38
|
-
|
|
31
|
+
5. **Source hierarchy**: primary → secondary → tertiary (tertiary never alone for load-bearing claims).
|
|
32
|
+
6. **Verify every URL** before citing. Mark unconfirmed as `[unverified]`.
|
|
33
|
+
7. **Tone**: resolve from artifact manifest (`direct`). See `specialists/tone-profiles.json`.
|
|
34
|
+
8. **Structure** with `get_template("research-brief")`; write to `.cx/research/{topic-slug}.md`.
|
|
35
|
+
9. **Reference** the research doc in the requesting agent's output.
|
|
36
|
+
|
|
37
|
+
## Distribution (publish pipeline)
|
|
38
|
+
|
|
39
|
+
After the brief is written, **validate then publish** — the release gate is enforced by default:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
node bin/construct artifact validate .cx/research/{topic-slug}.md --type=research-brief
|
|
43
|
+
node bin/construct tools detect --json
|
|
44
|
+
node bin/construct publish .cx/research/{topic-slug}.md --strict \
|
|
45
|
+
--demo=resource-guard-rails \
|
|
46
|
+
--dashboard-demo=cockpit-tour
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Do **not** publish without a passing validate. Do **not** use `--no-gate` in demos or ship paths.
|
|
39
50
|
|
|
40
|
-
|
|
41
|
-
- Record publication date, version, or access date for each source. If no date is available, state `[undated]` and treat confidence as `low`.
|
|
42
|
-
- Fetch and confirm every URL before including it in a committed document.
|
|
43
|
-
- Separate observation from inference: label each finding's confidence as `high`, `medium`, or `low`.
|
|
44
|
-
- Name contradictions and unresolved gaps.
|
|
45
|
-
- Prefer two independent sources per load-bearing claim unless one authoritative primary source is sufficient.
|
|
46
|
-
- State the strongest counter-evidence when one exists.
|
|
51
|
+
Optional frontmatter in the brief:
|
|
47
52
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
53
|
+
```yaml
|
|
54
|
+
publish:
|
|
55
|
+
demo: resource-guard-rails
|
|
56
|
+
dashboardDemo: cockpit-tour
|
|
57
|
+
```
|
|
51
58
|
|
|
52
|
-
|
|
53
|
-
|
|
59
|
+
**Community patterns (do not hand-roll):**
|
|
60
|
+
|
|
61
|
+
- **Figures in PDF**: fenced ` ```d2` / ` ```mermaid` blocks rendered at export time via vendored [pandoc-ext/diagram](https://github.com/pandoc-ext/diagram) (`construct export --figures` or `construct publish`).
|
|
62
|
+
- **Terminal demos**: shipped `.tape` files under `templates/demos/tapes/`; project overrides in `.cx/demos/tapes/`; regenerate with `construct demo record <name>` or CI `charmbracelet/vhs-action`.
|
|
63
|
+
- **Dashboard demos**: Playwright `e2e/demo/*.spec.ts` with `video: on` in `apps/dashboard`; run via `construct demo dashboard:<name>`.
|
|
64
|
+
|
|
65
|
+
Install toolchain once: `brew install d2 graphviz pandoc typst vhs` and `npm install -g @mermaid-js/mermaid-cli`. Playwright: `cd apps/dashboard && npm install && npx playwright install chromium`.
|
|
66
|
+
|
|
67
|
+
Do **not** claim PDF/demo done until `construct tools detect` reports ready or `--strict` publish succeeds.
|
|
68
|
+
|
|
69
|
+
## Verification bar
|
|
54
70
|
|
|
55
|
-
|
|
56
|
-
|
|
71
|
+
- Two independent sources per load-bearing claim unless one authoritative primary suffices.
|
|
72
|
+
- Admiralty grades on every source. Counter-evidence named when it exists.
|
|
73
|
+
- cx-researcher must **not** answer UX preference questions or infer codebase behavior without reading code.
|
|
@@ -3,6 +3,7 @@ name: docs-runbook-workflow
|
|
|
3
3
|
description: "Use when: creating operational procedures for services, alerts, or recurring operations."
|
|
4
4
|
inputs: [service, incident]
|
|
5
5
|
artifactType: runbook
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# Runbook Workflow
|
|
8
9
|
|
|
@@ -3,6 +3,7 @@ name: docs-strategy-workflow
|
|
|
3
3
|
description: "Use when: the user asks about product direction, strategic bets, what to prioritize, whether a signal aligns with strategy, or wants to update the strategy."
|
|
4
4
|
inputs: [signal, decision-context]
|
|
5
5
|
artifactType: strategy
|
|
6
|
+
verificationBar: "Every load-bearing claim cites a verifiable source; label inference confidence; satisfy template structure requirements."
|
|
6
7
|
---
|
|
7
8
|
# Strategy Workflow
|
|
8
9
|
|