@geraldmaron/construct 1.1.0 → 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.
- package/README.md +30 -18
- package/bin/construct +392 -91
- 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 +112 -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/audit-skills.mjs +4 -0
- package/lib/audit-specialists.mjs +285 -0
- package/lib/audit-trail.mjs +77 -10
- package/lib/auto-docs.mjs +87 -18
- 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 +245 -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 +232 -11
- package/lib/comment-lint.mjs +6 -4
- package/lib/config/schema.mjs +36 -5
- 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 +703 -0
- package/lib/diagram-export.mjs +192 -0
- package/lib/diagram.mjs +302 -0
- package/lib/docs-verify.mjs +25 -7
- package/lib/doctor/index.mjs +4 -2
- package/lib/doctor/project-adapters.mjs +44 -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/doctor/watchers/service-health.mjs +1 -1
- package/lib/document-export.mjs +360 -36
- package/lib/document-extract.mjs +88 -0
- package/lib/document-ingest.mjs +32 -18
- package/lib/embed/cli.mjs +2 -2
- package/lib/embed/daemon.mjs +18 -46
- package/lib/embed/semantic.mjs +5 -2
- package/lib/embed/worker.mjs +2 -2
- 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/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/handoffs/cleanup.mjs +1 -1
- package/lib/health-check.mjs +90 -76
- package/lib/hooks/artifact-release-gate.mjs +43 -0
- package/lib/hooks/audit-trail.mjs +14 -28
- 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 +4 -5
- 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 +27 -97
- 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/daemon.mjs +2 -0
- package/lib/intake/git-queue.mjs +9 -8
- 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 +84 -9
- 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/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 +425 -93
- 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/persona-sections.mjs +66 -0
- package/lib/playwright-demo.mjs +252 -0
- package/lib/project-init-shared.mjs +4 -1
- package/lib/prompt-composer.js +9 -4
- 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 +229 -8
- package/lib/server/langfuse-login.mjs +3 -3
- package/lib/service-manager.mjs +61 -9
- package/lib/session-store.mjs +1 -1
- package/lib/setup.mjs +102 -2
- 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/embeddings-local.mjs +6 -3
- package/lib/storage/file-lock.mjs +18 -11
- 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 +29 -13
- package/personas/construct.md +13 -13
- 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 +187 -60
- 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 +8 -3
- 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 +480 -0
- package/specialists/artifact-manifest.schema.json +53 -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-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 +10 -10
- 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/lib/ingest/chunker.mjs +0 -94
- package/lib/ingest/pipeline.mjs +0 -53
- package/lib/ingest/store.mjs +0 -82
- package/lib/mode-commands.mjs +0 -122
- package/lib/policy/unified-gates.mjs +0 -96
- package/lib/profiles/validate-custom.mjs +0 -114
- package/lib/services/telemetry-backend.mjs +0 -177
- package/lib/storage/fusion.mjs +0 -95
package/lib/cli-commands.mjs
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import { resolveColors } from './term-format.mjs';
|
|
16
|
+
import { surfaceForCommand } from './registry/surface-map.mjs';
|
|
16
17
|
|
|
17
18
|
export const CLI_COMMANDS = [
|
|
18
19
|
// ── Core (shown by default) ───────────────────────────────────────────
|
|
@@ -23,6 +24,10 @@ export const CLI_COMMANDS = [
|
|
|
23
24
|
core: true,
|
|
24
25
|
description: 'Start services for development',
|
|
25
26
|
usage: 'construct dev [--select] [--only=postgres,dashboard,...]',
|
|
27
|
+
examples: [
|
|
28
|
+
{ cmd: 'construct dev', desc: 'Start the default service set' },
|
|
29
|
+
{ cmd: 'construct dev --only=dashboard', desc: 'Start just the dashboard' },
|
|
30
|
+
],
|
|
26
31
|
options: [
|
|
27
32
|
{ flag: '--select', desc: 'Pick which services to start from an interactive checklist' },
|
|
28
33
|
{ flag: '--only=<a,b,c>', desc: 'Start only the named services (postgres, dashboard, telemetry, memory, opencode)' },
|
|
@@ -35,6 +40,10 @@ export const CLI_COMMANDS = [
|
|
|
35
40
|
core: true,
|
|
36
41
|
description: 'Start the local dashboard/orchestration daemon (or --token to mint a dashboard token)',
|
|
37
42
|
usage: 'construct dashboard [--token]',
|
|
43
|
+
examples: [
|
|
44
|
+
{ cmd: 'construct dashboard', desc: 'Launch the local dashboard daemon' },
|
|
45
|
+
{ cmd: 'construct dashboard --token', desc: 'Mint a dashboard access token' },
|
|
46
|
+
],
|
|
38
47
|
},
|
|
39
48
|
{
|
|
40
49
|
name: 'stop',
|
|
@@ -43,6 +52,9 @@ export const CLI_COMMANDS = [
|
|
|
43
52
|
core: true,
|
|
44
53
|
description: 'Stop all running services',
|
|
45
54
|
usage: 'construct stop',
|
|
55
|
+
examples: [
|
|
56
|
+
{ cmd: 'construct stop', desc: 'Stop every running service' },
|
|
57
|
+
],
|
|
46
58
|
},
|
|
47
59
|
{
|
|
48
60
|
name: 'status',
|
|
@@ -51,6 +63,11 @@ export const CLI_COMMANDS = [
|
|
|
51
63
|
core: true,
|
|
52
64
|
description: 'Show system health and credentials',
|
|
53
65
|
usage: 'construct status',
|
|
66
|
+
strictFlags: true,
|
|
67
|
+
examples: [
|
|
68
|
+
{ cmd: 'construct status', desc: 'Human-readable health summary' },
|
|
69
|
+
{ cmd: 'construct status --json', desc: 'Full payload for scripting' },
|
|
70
|
+
],
|
|
54
71
|
options: [
|
|
55
72
|
{ flag: '--json', desc: 'Output full status payload as JSON' },
|
|
56
73
|
],
|
|
@@ -61,10 +78,15 @@ export const CLI_COMMANDS = [
|
|
|
61
78
|
category: 'Core',
|
|
62
79
|
core: true,
|
|
63
80
|
description: 'Machine setup (scoped per ADR-0029): --scope=project|user|both, default project',
|
|
64
|
-
usage: 'construct install [--scope=project|user|both] [--yes] [--no-docker] [--no-launch-agent] [--reconfigure] [--with-docling]',
|
|
81
|
+
usage: 'construct install [--scope=project|user|both] [--yes] [--dry-run] [--no-docker] [--no-launch-agent] [--reconfigure] [--with-docling]',
|
|
82
|
+
examples: [
|
|
83
|
+
{ cmd: 'construct install --dry-run', desc: 'Preview the plan before writing anything' },
|
|
84
|
+
{ cmd: 'construct install --scope=user --yes', desc: 'Non-interactive user-scope install' },
|
|
85
|
+
],
|
|
65
86
|
options: [
|
|
66
87
|
{ flag: '--scope=<s>', desc: 'project (default, no-op + guidance) | user (writes ~/.construct/, MCP, ~/.claude/* via consent) | both' },
|
|
67
88
|
{ flag: '--yes', desc: 'Apply defaults without prompts (only meaningful with --scope=user|both)' },
|
|
89
|
+
{ flag: '--dry-run', desc: 'Preview the install plan (scopes, files, services) without writing anything' },
|
|
68
90
|
{ flag: '--no-docker', desc: 'Skip Docker-based service setup (local Postgres)' },
|
|
69
91
|
{ flag: '--no-launch-agent', desc: 'Skip background macOS LaunchAgent registration' },
|
|
70
92
|
{ flag: '--reconfigure', desc: 'Re-prompt for service consent, ignoring cached answers' },
|
|
@@ -78,6 +100,10 @@ export const CLI_COMMANDS = [
|
|
|
78
100
|
core: true,
|
|
79
101
|
description: 'Project setup (once per repo): scaffold .cx/, AGENTS.md, plan.md, adapters',
|
|
80
102
|
usage: 'construct init [path] [options]',
|
|
103
|
+
examples: [
|
|
104
|
+
{ cmd: 'construct init', desc: 'Scaffold the current repo interactively' },
|
|
105
|
+
{ cmd: 'construct init --yes --with-adrs', desc: 'Non-interactive init with the ADR doc lane' },
|
|
106
|
+
],
|
|
81
107
|
options: [
|
|
82
108
|
{ flag: '--yes', desc: 'Accept all defaults (non-interactive)' },
|
|
83
109
|
{ flag: '--no-start', desc: 'Do not start services after init' },
|
|
@@ -103,6 +129,10 @@ export const CLI_COMMANDS = [
|
|
|
103
129
|
core: true,
|
|
104
130
|
description: 'Sync agent adapters to AI tools',
|
|
105
131
|
usage: 'construct sync [--project] [--dry-run] [--no-docs] [--compress-personas]',
|
|
132
|
+
examples: [
|
|
133
|
+
{ cmd: 'construct sync', desc: 'Sync adapters to detected AI tools' },
|
|
134
|
+
{ cmd: 'construct sync --dry-run', desc: 'Preview adapter changes without writing' },
|
|
135
|
+
],
|
|
106
136
|
options: [
|
|
107
137
|
{ flag: '--project', desc: 'Write project-local Claude adapters into the current repo only' },
|
|
108
138
|
{ flag: '--dry-run', desc: 'Preview adapter changes without writing files' },
|
|
@@ -117,6 +147,10 @@ export const CLI_COMMANDS = [
|
|
|
117
147
|
core: true,
|
|
118
148
|
description: 'View and process the active profile\'s intake queue (queue label varies by profile)',
|
|
119
149
|
usage: 'construct intake list|show|done|skip|reopen|integrate|classify',
|
|
150
|
+
examples: [
|
|
151
|
+
{ cmd: 'construct intake list', desc: 'See pending packets' },
|
|
152
|
+
{ cmd: 'construct intake done <id> --output=path', desc: 'Mark processed and stamp the artifact' },
|
|
153
|
+
],
|
|
120
154
|
subcommands: [
|
|
121
155
|
{ name: 'list', desc: 'List pending packets' },
|
|
122
156
|
{ name: 'show <id>', desc: 'Show one packet (triage, related docs, excerpt, tag suggestions)' },
|
|
@@ -134,6 +168,10 @@ export const CLI_COMMANDS = [
|
|
|
134
168
|
core: true,
|
|
135
169
|
description: 'View and manage artifact recommendations',
|
|
136
170
|
usage: 'construct recommendations list|show|dismiss|stats',
|
|
171
|
+
examples: [
|
|
172
|
+
{ cmd: 'construct recommendations list', desc: 'See open recommendations' },
|
|
173
|
+
{ cmd: 'construct recommendations dismiss <id>', desc: 'Dismiss one by id' },
|
|
174
|
+
],
|
|
137
175
|
},
|
|
138
176
|
{
|
|
139
177
|
name: 'integrations',
|
|
@@ -180,6 +218,10 @@ export const CLI_COMMANDS = [
|
|
|
180
218
|
core: true,
|
|
181
219
|
description: 'Isolated tmpdir-based environment for QA / specialist dry-runs',
|
|
182
220
|
usage: 'construct sandbox create|list|delete|prune [--profile=<id>]',
|
|
221
|
+
examples: [
|
|
222
|
+
{ cmd: 'construct sandbox create --profile=<id>', desc: 'Spin up an isolated sandbox' },
|
|
223
|
+
{ cmd: 'construct sandbox prune --days=7', desc: 'Remove sandboxes older than a week' },
|
|
224
|
+
],
|
|
183
225
|
subcommands: [
|
|
184
226
|
{ name: 'create [--profile=<id>]', desc: 'Create a new sandbox under ~/.cx/sandboxes/' },
|
|
185
227
|
{ name: 'list', desc: 'List existing sandboxes, newest first' },
|
|
@@ -194,6 +236,10 @@ export const CLI_COMMANDS = [
|
|
|
194
236
|
core: true,
|
|
195
237
|
description: 'Manage the active org profile and its lifecycle (draft, promote, archive, health)',
|
|
196
238
|
usage: 'construct profile show|list|set|create|drafts|archive|health',
|
|
239
|
+
examples: [
|
|
240
|
+
{ cmd: 'construct profile list', desc: 'List curated profiles' },
|
|
241
|
+
{ cmd: 'construct profile set <id>', desc: 'Switch the active profile' },
|
|
242
|
+
],
|
|
197
243
|
subcommands: [
|
|
198
244
|
{ name: 'show', desc: 'Show the active profile' },
|
|
199
245
|
{ name: 'list', desc: 'List curated profiles' },
|
|
@@ -225,6 +271,10 @@ export const CLI_COMMANDS = [
|
|
|
225
271
|
core: true,
|
|
226
272
|
description: 'Documentation commands',
|
|
227
273
|
usage: 'construct docs check|verify|update',
|
|
274
|
+
examples: [
|
|
275
|
+
{ cmd: 'construct docs verify', desc: 'Validate the docs tree' },
|
|
276
|
+
{ cmd: 'construct docs update', desc: 'Regenerate AUTO-managed regions' },
|
|
277
|
+
],
|
|
228
278
|
subcommands: [
|
|
229
279
|
{ name: 'check', desc: 'Check for missing how-to guides' },
|
|
230
280
|
{ name: 'verify', desc: 'Validate documentation quality' },
|
|
@@ -238,6 +288,10 @@ export const CLI_COMMANDS = [
|
|
|
238
288
|
core: true,
|
|
239
289
|
description: 'Check installation health',
|
|
240
290
|
usage: 'construct doctor [<status|logs|tick|report|consistency|watch|stop|credentials>] [--fix-legacy-agents]',
|
|
291
|
+
examples: [
|
|
292
|
+
{ cmd: 'construct doctor', desc: 'Run all health checks once' },
|
|
293
|
+
{ cmd: 'construct doctor report', desc: 'Print the latest health report' },
|
|
294
|
+
],
|
|
241
295
|
subcommands: [
|
|
242
296
|
{ name: 'status', desc: 'Doctor daemon status' },
|
|
243
297
|
{ name: 'logs', desc: 'Tail doctor daemon logs' },
|
|
@@ -268,15 +322,61 @@ export const CLI_COMMANDS = [
|
|
|
268
322
|
category: 'Work',
|
|
269
323
|
core: false,
|
|
270
324
|
description: 'Convert documents to indexed markdown',
|
|
271
|
-
usage: 'construct ingest <file> [--strategy=adapter|provider] [--orchestration=prompt-only|orchestrated] [--strict] [--
|
|
325
|
+
usage: 'construct ingest <file> [--strategy=adapter|provider] [--orchestration=prompt-only|orchestrated] [--strict] [--fidelity=fast|high]',
|
|
272
326
|
},
|
|
273
327
|
{
|
|
274
328
|
name: 'export',
|
|
275
329
|
emoji: '📤',
|
|
276
330
|
category: 'Work',
|
|
277
331
|
core: false,
|
|
278
|
-
description: 'Export markdown to PDF
|
|
279
|
-
usage: 'construct export <markdown-file> --to=<pdf|docx|html> [--output=<path>]',
|
|
332
|
+
description: 'Export markdown to PDF, DOCX, HTML, and other Pandoc formats via Pandoc + Typst (optional system binaries; ADR-0024)',
|
|
333
|
+
usage: 'construct export <markdown-file> --to=<pdf|docx|deck|pptx|html|rtf|odt|epub|tex|txt|md|mdx> [--output=<path>] [--figures] [--detect]',
|
|
334
|
+
strictFlags: true,
|
|
335
|
+
options: [
|
|
336
|
+
{ flag: '--to=<format>', desc: 'pdf, docx, deck, pptx, html, rtf, odt, epub, tex, txt, md, mdx' },
|
|
337
|
+
{ flag: '--output=<path>', desc: 'Output path' },
|
|
338
|
+
{ flag: '--figures', desc: 'Render d2/mermaid via pandoc-ext/diagram filter' },
|
|
339
|
+
{ flag: '--detect', desc: 'Report binary availability (JSON)' },
|
|
340
|
+
],
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
name: 'publish',
|
|
344
|
+
emoji: '📰',
|
|
345
|
+
category: 'Work',
|
|
346
|
+
core: false,
|
|
347
|
+
description: 'Publish typed artifacts: release gate + export PDF with figures + optional demos',
|
|
348
|
+
usage: 'construct publish <markdown> [--to=pdf] [--type=DOC] [--demo=NAME] [--strict]',
|
|
349
|
+
strictFlags: true,
|
|
350
|
+
options: [
|
|
351
|
+
{ flag: '--to=<format>', desc: 'pdf (default), docx, deck, pptx, html, rtf, odt, epub, tex, txt, md, mdx' },
|
|
352
|
+
{ flag: '--output=<path>', desc: 'Output path (default: .cx/publish/<name>.<format>)' },
|
|
353
|
+
{ flag: '--type=<doc-type>', desc: 'Manifest doc type for release gate (inferred when omitted)' },
|
|
354
|
+
{ flag: '--demo=<name>', desc: 'Terminal VHS tape to record (repeatable)' },
|
|
355
|
+
{ flag: '--dashboard-demo=<name>', desc: 'Playwright demo spec basename (repeatable)' },
|
|
356
|
+
{ flag: '--figures', desc: 'Render d2/mermaid via diagram filter (default on)' },
|
|
357
|
+
{ flag: '--no-figures', desc: 'Skip diagram filter' },
|
|
358
|
+
{ flag: '--no-gate', desc: 'Skip artifact release gate (escape hatch only)' },
|
|
359
|
+
{ flag: '--source-only', desc: 'Write sources only' },
|
|
360
|
+
{ flag: '--strict', desc: 'Exit 2 when toolchain or release gate fails (default)' },
|
|
361
|
+
{ flag: '--no-strict', desc: 'Do not exit 2 on toolchain/gate failure' },
|
|
362
|
+
{ flag: '--detect', desc: 'Print tooling JSON and exit' },
|
|
363
|
+
],
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
name: 'tools',
|
|
367
|
+
emoji: '🧰',
|
|
368
|
+
category: 'Work',
|
|
369
|
+
core: false,
|
|
370
|
+
description: 'Detect optional publish pipeline binaries (Pandoc, D2, VHS, Playwright)',
|
|
371
|
+
usage: 'construct tools detect [--json] [--figures] [--demo=NAME]',
|
|
372
|
+
strictFlags: true,
|
|
373
|
+
options: [
|
|
374
|
+
{ flag: '--json', desc: 'JSON output' },
|
|
375
|
+
{ flag: '--figures', desc: 'Include figure tooling (default on)' },
|
|
376
|
+
{ flag: '--no-figures', desc: 'Skip figure binaries' },
|
|
377
|
+
{ flag: '--demo=<name>', desc: 'Include terminal demo recorder check' },
|
|
378
|
+
{ flag: '--dashboard-demo=<name>', desc: 'Include dashboard Playwright check' },
|
|
379
|
+
],
|
|
280
380
|
},
|
|
281
381
|
{
|
|
282
382
|
name: 'infer',
|
|
@@ -380,6 +480,14 @@ export const CLI_COMMANDS = [
|
|
|
380
480
|
description: 'Run Construct as an Agent Client Protocol (ACP) server over stdio for Zed/JetBrains/VS Code ACP clients',
|
|
381
481
|
usage: 'construct acp',
|
|
382
482
|
},
|
|
483
|
+
{
|
|
484
|
+
name: 'chat',
|
|
485
|
+
emoji: '💬',
|
|
486
|
+
category: 'Models & Integrations',
|
|
487
|
+
core: false,
|
|
488
|
+
description: "Interactive terminal chat on Construct's owned agent loop, with a multi-pane transparency surface (live token/cost/context usage, reasoning, tool timeline, and the planned specialist route); switch models, change settings, and see a token/cost breakdown in-session. Use --accessible or --plain for the linear, screen-reader-friendly renderer",
|
|
489
|
+
usage: 'construct chat [--model <id>] [--free] [--web] [--list] [--resume[=file]] [--ascii] [--plain] [--accessible] [--no-thinking] [--no-path] [--no-specialists] [--no-tools] [--no-observability] [--quiet]',
|
|
490
|
+
},
|
|
383
491
|
{
|
|
384
492
|
name: 'mcp',
|
|
385
493
|
emoji: '🔌',
|
|
@@ -481,6 +589,15 @@ export const CLI_COMMANDS = [
|
|
|
481
589
|
description: 'Show evaluator catalog for prompt and agent experiments',
|
|
482
590
|
usage: 'construct evals <list|run>',
|
|
483
591
|
},
|
|
592
|
+
{
|
|
593
|
+
name: 'improvement',
|
|
594
|
+
emoji: '🔁',
|
|
595
|
+
category: 'Observability',
|
|
596
|
+
core: false,
|
|
597
|
+
surface: 'dashboard',
|
|
598
|
+
description: 'Governed improvement loop — review, approve, and record apply/rollback for proposals',
|
|
599
|
+
usage: 'construct improvement submit|review|pending|show|approve|apply|rollback|list',
|
|
600
|
+
},
|
|
484
601
|
{
|
|
485
602
|
name: 'cleanup',
|
|
486
603
|
emoji: '🧹',
|
|
@@ -488,10 +605,11 @@ export const CLI_COMMANDS = [
|
|
|
488
605
|
core: false,
|
|
489
606
|
description: 'Release dev-agent memory pressure by cleaning stale helper and bridge processes',
|
|
490
607
|
usage: 'construct cleanup [--dry-run] [--quiet] [--pressure-release] [--pressure-only] [--disk-only]',
|
|
608
|
+
strictFlags: true,
|
|
491
609
|
options: [
|
|
492
610
|
{ flag: '--dry-run', desc: 'Show what would be cleaned without changing anything' },
|
|
493
611
|
{ flag: '--quiet', desc: 'Minimal output' },
|
|
494
|
-
{ flag: '--pressure-release', desc: 'Also kill stale dev-agent processes' },
|
|
612
|
+
{ flag: '--pressure-release', desc: 'Also kill stale dev-agent and leaked VHS demo-recorder processes' },
|
|
495
613
|
{ flag: '--pressure-only', desc: 'Pressure release only — skip disk cleanup' },
|
|
496
614
|
{ flag: '--disk-only', desc: 'Disk cleanup only — skip pressure release' },
|
|
497
615
|
],
|
|
@@ -510,7 +628,41 @@ export const CLI_COMMANDS = [
|
|
|
510
628
|
category: 'Diagnostics',
|
|
511
629
|
core: false,
|
|
512
630
|
description: 'Audit Construct internals and review the mutation trail',
|
|
513
|
-
usage: 'construct audit <
|
|
631
|
+
usage: 'construct audit <skills|specialists|tests|trail>',
|
|
632
|
+
subcommands: [
|
|
633
|
+
{ name: 'skills', desc: 'Audit skill corpus coverage and metadata (`--inventory` checks certification skill inventory freshness)' },
|
|
634
|
+
{ name: 'specialists', desc: 'Audit specialist/skill matrix and cross-checks' },
|
|
635
|
+
{ name: 'tests', desc: 'Validate behavior-to-test capability traceability (`--corpus` checks test-file inventory)' },
|
|
636
|
+
{ name: 'trail', desc: 'Review mutation audit trail' },
|
|
637
|
+
],
|
|
638
|
+
},
|
|
639
|
+
{
|
|
640
|
+
name: 'certify',
|
|
641
|
+
emoji: '✅',
|
|
642
|
+
category: 'Diagnostics',
|
|
643
|
+
core: false,
|
|
644
|
+
description: 'Inspect and run scenario-based certification under .cx/certification/',
|
|
645
|
+
usage: 'construct certify list|show|scenarios|models|demos|status|gate|run <scenario-id>',
|
|
646
|
+
subcommands: [
|
|
647
|
+
{ name: 'list', desc: 'List recorded certification run ids' },
|
|
648
|
+
{ name: 'show', desc: 'Show one certification run record as JSON' },
|
|
649
|
+
{ name: 'scenarios', desc: 'List available certification scenarios with model tier' },
|
|
650
|
+
{ name: 'models', desc: 'List routable certification models (free by default)' },
|
|
651
|
+
{ name: 'status', desc: 'Roll up certification posture across capabilities and surfaces' },
|
|
652
|
+
{ name: 'gate', desc: 'Release candidate gate — stale or failing release-critical certification evidence blocks' },
|
|
653
|
+
{ name: 'run', desc: 'Execute a scenario (live requires CONSTRUCT_CERTIFY_LIVE=1; paid requires CONSTRUCT_CERTIFY_ALLOW_PAID=1)' },
|
|
654
|
+
],
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
name: 'artifact',
|
|
658
|
+
emoji: '📋',
|
|
659
|
+
category: 'Work',
|
|
660
|
+
core: false,
|
|
661
|
+
description: 'Validate typed document artifacts against the release gate',
|
|
662
|
+
usage: 'construct artifact validate <path> --type=<doc-type> [--json]',
|
|
663
|
+
subcommands: [
|
|
664
|
+
{ name: 'validate', desc: 'Run manifest structure, citation, and reviewer checks' },
|
|
665
|
+
],
|
|
514
666
|
},
|
|
515
667
|
{
|
|
516
668
|
name: 'doc',
|
|
@@ -560,6 +712,42 @@ export const CLI_COMMANDS = [
|
|
|
560
712
|
description: 'Generate wireframes from description',
|
|
561
713
|
usage: 'construct wireframe <description>',
|
|
562
714
|
},
|
|
715
|
+
{
|
|
716
|
+
name: 'diagram',
|
|
717
|
+
emoji: '📊',
|
|
718
|
+
category: 'Work',
|
|
719
|
+
core: false,
|
|
720
|
+
description: 'Render code-driven diagrams via D2/Graphviz (optional system binaries; ADR-0001)',
|
|
721
|
+
usage: 'construct diagram <description> [--type=architecture|flow|sequence|state|er|class] [--format=svg|png] [--theme=<name>] [--out=<path>] [--source-only]',
|
|
722
|
+
strictFlags: true,
|
|
723
|
+
options: [
|
|
724
|
+
{ flag: '--type=<t>', desc: 'architecture (default) | flow | sequence | state | er | class' },
|
|
725
|
+
{ flag: '--format=<f>', desc: 'svg (default) | png' },
|
|
726
|
+
{ flag: '--theme=<name>', desc: 'D2 theme name (e.g. neutral, sketch, cool-classics)' },
|
|
727
|
+
{ flag: '--out=<path>', desc: 'Output path (default: .cx/diagrams/<slug>-<ts>.<ext>)' },
|
|
728
|
+
{ flag: '--source-only', desc: 'Always write the source file; skip rendering' },
|
|
729
|
+
],
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
name: 'demo',
|
|
733
|
+
emoji: '🎬',
|
|
734
|
+
category: 'Work',
|
|
735
|
+
core: false,
|
|
736
|
+
description: 'Run guided demos via construct chat (default) or record VHS/asciinema tapes',
|
|
737
|
+
usage: 'construct demo <list|init|record|name> [--surface=chat|web|tape|dashboard] [--format=gif|mp4|webm] [--out=<path>] [--source-only]',
|
|
738
|
+
strictFlags: true,
|
|
739
|
+
options: [
|
|
740
|
+
{ flag: '--surface=<s>', desc: 'chat (default) | web | tape | dashboard' },
|
|
741
|
+
{ flag: '--model=<id>', desc: 'Pin model for chat demo' },
|
|
742
|
+
{ flag: '--web', desc: 'Open web chat (/chat/) instead of terminal Ink' },
|
|
743
|
+
{ flag: '--plain', desc: 'Linear chat renderer (accessibility / non-TTY)' },
|
|
744
|
+
{ flag: '--free', desc: 'OpenRouter free-router mode for chat demo' },
|
|
745
|
+
{ flag: '--format=<f>', desc: 'gif (default) | mp4 | webm (tape surface only)' },
|
|
746
|
+
{ flag: '--out=<path>', desc: 'Output path (tape recording)' },
|
|
747
|
+
{ flag: '--from=<t>', desc: 'Template for init: quickstart | diagram' },
|
|
748
|
+
{ flag: '--source-only', desc: 'Tape: write .tape only; skip recording' },
|
|
749
|
+
],
|
|
750
|
+
},
|
|
563
751
|
{
|
|
564
752
|
name: 'ollama',
|
|
565
753
|
emoji: '🦙',
|
|
@@ -792,8 +980,8 @@ export const CLI_COMMANDS = [
|
|
|
792
980
|
emoji: '🔑',
|
|
793
981
|
category: 'Integrations',
|
|
794
982
|
core: false,
|
|
795
|
-
description: 'Manage provider credentials (set, rotate, revoke, list)',
|
|
796
|
-
usage: 'construct creds <list|set|rotate|revoke|test>',
|
|
983
|
+
description: 'Manage provider credentials (login, set, rotate, revoke, list, test)',
|
|
984
|
+
usage: 'construct creds <list|login|set|rotate|revoke|test>',
|
|
797
985
|
},
|
|
798
986
|
{
|
|
799
987
|
name: 'providers',
|
|
@@ -907,8 +1095,8 @@ export const CLI_COMMANDS = [
|
|
|
907
1095
|
emoji: '📄',
|
|
908
1096
|
category: 'Diagnostics',
|
|
909
1097
|
core: false,
|
|
910
|
-
description: '
|
|
911
|
-
usage: 'construct docs:site
|
|
1098
|
+
description: 'Regenerate generated reference pages under docs/reference/',
|
|
1099
|
+
usage: 'construct docs:site [--check]',
|
|
912
1100
|
},
|
|
913
1101
|
{
|
|
914
1102
|
name: 'beads:stats',
|
|
@@ -939,7 +1127,13 @@ export const CLI_COMMANDS = [
|
|
|
939
1127
|
{ name: 'lint:templates', category: 'Internal', core: false, internal: true, description: 'Internal lint: shipped templates', usage: 'construct lint:templates' },
|
|
940
1128
|
{ name: 'lint:prompts', category: 'Internal', core: false, internal: true, description: 'Internal lint: specialist prompt frontmatter + sections', usage: 'construct lint:prompts' },
|
|
941
1129
|
{ name: 'specialist', category: 'Internal', core: false, internal: true, description: 'Maintainer tool: scaffold, edit, and lint specialist prompts', usage: 'construct specialist <create|edit|lint>' },
|
|
942
|
-
{ name: 'registry:status', category: 'Internal', core: false, internal: true, description: 'Dev: capability
|
|
1130
|
+
{ name: 'registry:status', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Dev: capability registry inspector', usage: 'construct registry:status [--json]' },
|
|
1131
|
+
{ name: 'registry:validate', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Validate registry/capabilities.json against repo reality', usage: 'construct registry:validate [--json]' },
|
|
1132
|
+
{ name: 'registry:generate-docs', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Generate docs/reference/capabilities.md from registry', usage: 'construct registry:generate-docs' },
|
|
1133
|
+
{ name: 'oracle', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Oracle meta-controller — fleet health review and bounded-auto maintenance', usage: 'construct oracle start|status|review|pending|approve|gaps|reconcile' },
|
|
1134
|
+
{ name: 'matrix', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Living dependency matrix — build/inspect the typed file↔capability↔workflow↔test graph', usage: 'construct matrix build|stat|query <node-id> [--json]' },
|
|
1135
|
+
{ name: 'impact', category: 'Diagnostics', core: false, internal: false, surface: 'thin-cli', description: 'Change-impact analysis — map changed files to affected tests, capabilities, and workflows', usage: 'construct impact [files…] [--stdin] [--run] [--json]' },
|
|
1136
|
+
{ name: 'rules', category: 'Diagnostics', core: false, internal: false, surface: 'thin-cli', description: 'Rule and hook reference telemetry rollup', usage: 'construct rules usage [--since=30d]' },
|
|
943
1137
|
{ name: 'evaluator:rubrics', category: 'Internal', core: false, internal: true, description: 'Internal: list registered evaluator rubrics', usage: 'construct evaluator:rubrics' },
|
|
944
1138
|
{ name: 'activation:status', category: 'Internal', core: false, internal: true, description: 'Internal: agent activation telemetry', usage: 'construct activation:status' },
|
|
945
1139
|
{ name: 'prune', category: 'Internal', core: false, internal: true, description: 'Internal: prune ephemeral storage entries', usage: 'construct prune' },
|
|
@@ -947,6 +1141,10 @@ export const CLI_COMMANDS = [
|
|
|
947
1141
|
{ name: 'resources', category: 'Internal', core: false, internal: true, description: 'Internal: resource probe', usage: 'construct resources' },
|
|
948
1142
|
];
|
|
949
1143
|
|
|
1144
|
+
for (const cmd of CLI_COMMANDS) {
|
|
1145
|
+
if (!cmd.surface) cmd.surface = surfaceForCommand(cmd.name);
|
|
1146
|
+
}
|
|
1147
|
+
|
|
950
1148
|
/** Flat list of all top-level command names (for completions). */
|
|
951
1149
|
export const COMMAND_NAMES = CLI_COMMANDS.filter((c) => !c.internal).map((c) => c.name);
|
|
952
1150
|
|
|
@@ -1035,5 +1233,28 @@ export function formatCommandHelp(name, { colors = false } = {}) {
|
|
|
1035
1233
|
}
|
|
1036
1234
|
lines.push('');
|
|
1037
1235
|
}
|
|
1236
|
+
|
|
1237
|
+
if (spec.examples && spec.examples.length > 0) {
|
|
1238
|
+
lines.push(`${c.bold}Examples${c.reset}`);
|
|
1239
|
+
for (const ex of spec.examples) {
|
|
1240
|
+
lines.push(` ${ex.cmd}`);
|
|
1241
|
+
if (ex.desc) lines.push(` ${c.dim}${ex.desc}${c.reset}`);
|
|
1242
|
+
}
|
|
1243
|
+
lines.push('');
|
|
1244
|
+
}
|
|
1245
|
+
|
|
1246
|
+
// Every help block closes with the obvious next action: an explicit `next`,
|
|
1247
|
+
// else "run a subcommand" for grouped commands, plus a See also pointer to the
|
|
1248
|
+
// full reference — so no surface is a dead end.
|
|
1249
|
+
|
|
1250
|
+
const firstSub = spec.subcommands?.[0]?.name.split(/\s+/)[0];
|
|
1251
|
+
const next = spec.next
|
|
1252
|
+
|| (firstSub ? `Run \`construct ${spec.name} ${firstSub}\` to start; add --help to any subcommand for details.` : null);
|
|
1253
|
+
if (next) {
|
|
1254
|
+
lines.push(`${c.dim}Next:${c.reset} ${next}`);
|
|
1255
|
+
lines.push('');
|
|
1256
|
+
}
|
|
1257
|
+
lines.push(`${c.dim}See also:${c.reset} run \`construct --help\` for all commands; full reference in docs/reference/cli/.`);
|
|
1258
|
+
lines.push('');
|
|
1038
1259
|
return lines.join('\n');
|
|
1039
1260
|
}
|
package/lib/comment-lint.mjs
CHANGED
|
@@ -94,7 +94,9 @@ function requiresHeader(rel) {
|
|
|
94
94
|
return { required: false, type: null };
|
|
95
95
|
}
|
|
96
96
|
// Exclude test fixture data files — these are project artifacts, not source files.
|
|
97
|
-
if (rel.startsWith('tests/fixtures/projects/')
|
|
97
|
+
if (rel.startsWith('tests/fixtures/projects/')
|
|
98
|
+
|| rel.startsWith('tests/fixtures/artifacts/')
|
|
99
|
+
|| rel.startsWith('tests/fixtures/document-io/')) {
|
|
98
100
|
return { required: false, type: null };
|
|
99
101
|
}
|
|
100
102
|
// Markdown files always get markdown-style headers, even if the directory
|
|
@@ -158,7 +160,7 @@ const BANNED = [
|
|
|
158
160
|
{ pattern: /<!--.*\b(?:added for|added recently|just added|new:)\b.*-->/i, label: 'point-in-time in markdown comment' },
|
|
159
161
|
{ pattern: /<!--.*\b(?:used by|called from|only consumer)\b.*-->/i, label: 'caller reference in markdown comment' },
|
|
160
162
|
// TODO without owner
|
|
161
|
-
{ pattern: new RegExp(`${CMT}\\s*TODO(
|
|
163
|
+
{ pattern: new RegExp(`${CMT}\\s*TODO(?!\\s*\\(\\w+\\)\\s*:)`, 'i'), label: 'TODO without owner — use: TODO(owner): what and why' }, // construct-lint-ignore
|
|
162
164
|
];
|
|
163
165
|
|
|
164
166
|
// Files whose content is authored precisely to demonstrate banned patterns
|
|
@@ -319,7 +321,7 @@ function checkArtifactBanned(content, rel) {
|
|
|
319
321
|
// Internal specialist role ids (cx-business-strategist, cx-product-manager, …) are
|
|
320
322
|
// implementation detail; in a consuming project's deliverable they read as a tool-identity
|
|
321
323
|
// leak. The set is anchored to the real role ids from specialists/registry.json — an
|
|
322
|
-
// open-ended /cx-[a-z-]+/ also matches unrelated npm packages (cx-
|
|
324
|
+
// open-ended /cx-[a-z-]+/ also matches unrelated npm packages (cx-ray, cx-pro, cx-widget)
|
|
323
325
|
// and would fail the release gate on legitimate user content. Drift from the registry is
|
|
324
326
|
// caught by tests/tool-invisibility.test.mjs, not at runtime: this module sits on the hook
|
|
325
327
|
// path and must never throw on a missing or malformed registry file.
|
|
@@ -327,7 +329,7 @@ function checkArtifactBanned(content, rel) {
|
|
|
327
329
|
export const KNOWN_CX_ROLE_IDS = [
|
|
328
330
|
'accessibility', 'ai-engineer', 'architect', 'business-strategist', 'data-analyst',
|
|
329
331
|
'data-engineer', 'debugger', 'designer', 'devil-advocate', 'docs-keeper', 'engineer',
|
|
330
|
-
'evaluator', 'explorer', 'legal-compliance', 'operations', 'orchestrator',
|
|
332
|
+
'evaluator', 'explorer', 'legal-compliance', 'operations', 'oracle', 'orchestrator',
|
|
331
333
|
'platform-engineer', 'product-manager', 'qa', 'rd-lead', 'release-manager', 'researcher',
|
|
332
334
|
'reviewer', 'security', 'sre', 'test-automation', 'trace-reviewer', 'ux-researcher',
|
|
333
335
|
];
|
package/lib/config/schema.mjs
CHANGED
|
@@ -65,6 +65,18 @@ export const DEFAULT_PROJECT_CONFIG = Object.freeze({
|
|
|
65
65
|
hooks: Object.freeze({
|
|
66
66
|
outputMode: 'auto',
|
|
67
67
|
}),
|
|
68
|
+
models: Object.freeze({
|
|
69
|
+
visibility: Object.freeze({
|
|
70
|
+
mode: 'all_configured',
|
|
71
|
+
include: [],
|
|
72
|
+
exclude: [],
|
|
73
|
+
providers: {},
|
|
74
|
+
}),
|
|
75
|
+
catalog: Object.freeze({
|
|
76
|
+
liveOpenRouter: true,
|
|
77
|
+
maxLiveFree: 24,
|
|
78
|
+
}),
|
|
79
|
+
}),
|
|
68
80
|
roleSelection: Object.freeze({
|
|
69
81
|
primary: null,
|
|
70
82
|
secondary: null,
|
|
@@ -171,14 +183,33 @@ export const FIELD_RULES = {
|
|
|
171
183
|
billingMode: { type: 'string', enum: ['metered', 'subscription', 'mixed'] },
|
|
172
184
|
enforce: { type: 'boolean' },
|
|
173
185
|
budgets: { type: 'object' },
|
|
174
|
-
// Per-provider billing-mode overrides. The global billingMode is the
|
|
175
|
-
// fallback; entries here win for the provider id (anthropic, openai,
|
|
176
|
-
// openrouter, gemini, ollama, local, github-copilot, …). Subscription
|
|
177
|
-
// entries contribute $0 to "actual spend" headline numbers; the
|
|
178
|
-
// metered-equivalent stays in the footnote.
|
|
179
186
|
providers: { type: 'object', required: false },
|
|
180
187
|
},
|
|
181
188
|
},
|
|
189
|
+
models: {
|
|
190
|
+
type: 'object',
|
|
191
|
+
required: false,
|
|
192
|
+
fields: {
|
|
193
|
+
visibility: {
|
|
194
|
+
type: 'object',
|
|
195
|
+
required: false,
|
|
196
|
+
fields: {
|
|
197
|
+
mode: { type: 'string', enum: ['all_configured', 'tier_defaults', 'explicit'] },
|
|
198
|
+
include: { type: 'array' },
|
|
199
|
+
exclude: { type: 'array' },
|
|
200
|
+
providers: { type: 'object' },
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
catalog: {
|
|
204
|
+
type: 'object',
|
|
205
|
+
required: false,
|
|
206
|
+
fields: {
|
|
207
|
+
liveOpenRouter: { type: 'boolean' },
|
|
208
|
+
maxLiveFree: { type: 'number' },
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
},
|
|
182
213
|
};
|
|
183
214
|
|
|
184
215
|
function checkType(value, expected) {
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Decision",
|
|
4
|
+
"description": "Output from cx-architect: a documented architectural or design decision",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["type", "goal", "approach", "tasks", "risks", "acceptanceCriteria"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"type": { "type": "string", "enum": ["decision"] },
|
|
9
|
+
"goal": { "type": "string", "description": "Objective restated in one sentence" },
|
|
10
|
+
"approach": { "type": "string", "description": "Chosen strategy and rationale" },
|
|
11
|
+
"alternativesConsidered": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"items": { "type": "string" }
|
|
14
|
+
},
|
|
15
|
+
"tasks": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"items": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"required": ["description", "owner", "complexity"],
|
|
20
|
+
"properties": {
|
|
21
|
+
"description": { "type": "string" },
|
|
22
|
+
"owner": { "type": "string" },
|
|
23
|
+
"complexity": { "type": "string", "enum": ["S", "M", "L"] }
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"risks": {
|
|
28
|
+
"type": "array",
|
|
29
|
+
"items": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"required": ["description", "mitigation"],
|
|
32
|
+
"properties": {
|
|
33
|
+
"description": { "type": "string" },
|
|
34
|
+
"mitigation": { "type": "string" }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"acceptanceCriteria": {
|
|
39
|
+
"type": "array",
|
|
40
|
+
"items": { "type": "string" },
|
|
41
|
+
"minItems": 1
|
|
42
|
+
},
|
|
43
|
+
"doNotTouch": {
|
|
44
|
+
"type": "array",
|
|
45
|
+
"items": { "type": "string" },
|
|
46
|
+
"description": "Files or systems that must stay unchanged"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"additionalProperties": false
|
|
50
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Implementation",
|
|
4
|
+
"description": "Output from cx-engineer: summary of changes made",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["type", "status", "filesChanged", "verificationChecklist"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"type": { "type": "string", "enum": ["implementation"] },
|
|
9
|
+
"status": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"enum": ["DONE", "BLOCKED", "NEEDS_MAIN_INPUT"]
|
|
12
|
+
},
|
|
13
|
+
"filesChanged": {
|
|
14
|
+
"type": "array",
|
|
15
|
+
"items": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"required": ["path", "action"],
|
|
18
|
+
"properties": {
|
|
19
|
+
"path": { "type": "string" },
|
|
20
|
+
"action": { "type": "string", "enum": ["created", "modified", "deleted"] },
|
|
21
|
+
"summary": { "type": "string" }
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"verificationChecklist": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"properties": {
|
|
28
|
+
"compilesWithoutErrors": { "type": "boolean" },
|
|
29
|
+
"existingTestsPass": { "type": "boolean" },
|
|
30
|
+
"newBehaviorHasCoverage": { "type": "boolean" },
|
|
31
|
+
"noHardcodedSecrets": { "type": "boolean" },
|
|
32
|
+
"noFileOver800Lines": { "type": "boolean" }
|
|
33
|
+
},
|
|
34
|
+
"required": ["compilesWithoutErrors", "existingTestsPass", "newBehaviorHasCoverage", "noHardcodedSecrets", "noFileOver800Lines"]
|
|
35
|
+
},
|
|
36
|
+
"blockerDescription": {
|
|
37
|
+
"type": "string",
|
|
38
|
+
"description": "Required when status is BLOCKED or NEEDS_MAIN_INPUT"
|
|
39
|
+
},
|
|
40
|
+
"needsMainInput": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"description": "Required when status is NEEDS_MAIN_INPUT",
|
|
43
|
+
"properties": {
|
|
44
|
+
"taskKey": { "type": "string" },
|
|
45
|
+
"question": { "type": "string" },
|
|
46
|
+
"safeDefault": { "type": "string" }
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"additionalProperties": false
|
|
51
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "ReviewReport",
|
|
4
|
+
"description": "Output from cx-reviewer or cx-security: findings from a code or security review",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["type", "target", "verdict", "findings"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"type": { "type": "string", "enum": ["review-report"] },
|
|
9
|
+
"target": { "type": "string", "description": "Files or scope reviewed" },
|
|
10
|
+
"verdict": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"enum": ["APPROVED", "APPROVED_WITH_WARNINGS", "BLOCKED"],
|
|
13
|
+
"description": "APPROVED = no CRITICAL/HIGH. APPROVED_WITH_WARNINGS = only HIGH (merge with caution). BLOCKED = CRITICAL found."
|
|
14
|
+
},
|
|
15
|
+
"findings": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"items": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"required": ["severity", "category", "location", "description", "fix"],
|
|
20
|
+
"properties": {
|
|
21
|
+
"severity": { "type": "string", "enum": ["CRITICAL", "HIGH", "MEDIUM", "LOW"] },
|
|
22
|
+
"category": { "type": "string", "description": "e.g. correctness, security, regression, coverage, maintainability" },
|
|
23
|
+
"location": { "type": "string", "description": "file:line" },
|
|
24
|
+
"description": { "type": "string" },
|
|
25
|
+
"fix": { "type": "string", "description": "Concrete remediation" }
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"summary": { "type": "string", "description": "One-paragraph summary of overall quality" }
|
|
30
|
+
},
|
|
31
|
+
"additionalProperties": false
|
|
32
|
+
}
|