@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/worker/trace.mjs
CHANGED
|
@@ -33,6 +33,7 @@ import path from 'node:path';
|
|
|
33
33
|
import { createTelemetryClient } from '../telemetry/client.mjs';
|
|
34
34
|
import { ensureCxDir } from '../project-init-shared.mjs';
|
|
35
35
|
import { appendWithRotationSync } from '../logging/rotate.mjs';
|
|
36
|
+
import { ensureDiskWrite, warnBudgetOnce } from '../resources/budget.mjs';
|
|
36
37
|
|
|
37
38
|
const TRACE_SUBDIR = '.cx/traces';
|
|
38
39
|
|
|
@@ -183,9 +184,16 @@ export function emitTraceEvent({
|
|
|
183
184
|
createdAt: new Date().toISOString(),
|
|
184
185
|
};
|
|
185
186
|
const shardPath = path.join(dir, `${todayShard()}.jsonl`);
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
187
|
+
const line = `${JSON.stringify(event)}\n`;
|
|
188
|
+
const gate = ensureDiskWrite(rootDir, 'traces', Buffer.byteLength(line), env);
|
|
189
|
+
if (gate.ok) {
|
|
190
|
+
appendWithRotationSync(shardPath, line, {
|
|
191
|
+
maxBytes: traceMaxBytes(env),
|
|
192
|
+
});
|
|
193
|
+
} else {
|
|
194
|
+
warnBudgetOnce(gate.message || 'trace write blocked by .cx/ disk budget', env);
|
|
195
|
+
return { ...event, budgetSkipped: true, budgetReason: gate.reason || 'budget-exceeded' };
|
|
196
|
+
}
|
|
189
197
|
|
|
190
198
|
// Fire-and-forget export to the configured remote adapter. Silent no-op when not configured.
|
|
191
199
|
exportToRemote(event, env, rootDir);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geraldmaron/construct",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"packageManager": "npm@11.5.1",
|
|
6
6
|
"description": "Construct — agent orchestration layer for OpenCode, Claude Code, and other coding surfaces",
|
|
@@ -26,7 +26,6 @@
|
|
|
26
26
|
"platforms/**",
|
|
27
27
|
"templates/**",
|
|
28
28
|
"templates/distribution/**",
|
|
29
|
-
"db/**",
|
|
30
29
|
"scripts/sync-specialists.mjs",
|
|
31
30
|
"README.md",
|
|
32
31
|
".env.example"
|
|
@@ -57,20 +56,28 @@
|
|
|
57
56
|
"test:unit": "node scripts/run-tests.mjs --exclude=tests/functional",
|
|
58
57
|
"lint:js": "eslint bin/construct \"lib/**/*.mjs\" \"scripts/**/*.mjs\" \"tests/**/*.mjs\"",
|
|
59
58
|
"coverage": "c8 --reporter=text-summary --reporter=lcov --src=lib --src=bin node scripts/run-tests.mjs --exclude=tests/functional",
|
|
60
|
-
"docs:init": "node
|
|
59
|
+
"docs:init": "node -e \"console.error('docs:init is deprecated — use: construct init --docs-preset=lean|product|full'); process.exit(1)\"",
|
|
61
60
|
"docs:update": "node ./bin/construct docs:update",
|
|
62
61
|
"docs:site": "node ./bin/construct docs:site",
|
|
63
|
-
"docs:dev": "npm --prefix apps/docs run dev",
|
|
64
|
-
"docs:build": "npm --prefix apps/docs run build",
|
|
62
|
+
"docs:dev": "node scripts/npm-run.mjs npm --prefix apps/docs run dev",
|
|
63
|
+
"docs:build": "node scripts/npm-run.mjs npm --prefix apps/docs run build",
|
|
65
64
|
"lint:comments": "node ./bin/construct lint:comments",
|
|
66
65
|
"lint:contracts": "node ./bin/construct lint:contracts",
|
|
67
66
|
"lint:agents": "node ./bin/construct lint:agents",
|
|
68
67
|
"build:sea": "esbuild bin/construct --bundle --platform=node --target=node20 --packages=external --outfile=dist/construct-bundle.cjs 2>&1 || (echo 'esbuild not found — install with: npm install -g esbuild' && exit 1)",
|
|
68
|
+
"build:chat": "esbuild apps/chat/tui/index.jsx --bundle --platform=node --format=esm --packages=external --jsx=automatic --jsx-import-source=react --outfile=apps/chat/dist/tui.mjs",
|
|
69
|
+
"build:chat-desktop": "node scripts/build-chat-desktop.mjs",
|
|
70
|
+
"build:chat-desktop:bundle": "node scripts/npm-run.mjs npm install --prefix apps/chat/desktop --include=dev && node scripts/npm-run.mjs npm --prefix apps/chat/desktop run build",
|
|
71
|
+
"build:dashboard": "node scripts/npm-run.mjs npm install --prefix apps/dashboard && node scripts/npm-run.mjs npm --prefix apps/dashboard run build",
|
|
72
|
+
"examples:deck": "node scripts/generate-deck-examples.mjs",
|
|
73
|
+
"examples:distribution": "node scripts/generate-distribution-examples.mjs",
|
|
74
|
+
"clean:artifacts": "node scripts/clean-artifacts.mjs",
|
|
69
75
|
"lint:profiles": "node scripts/lint-profiles.mjs",
|
|
70
76
|
"learning:status": "node scripts/learning-status.mjs",
|
|
71
77
|
"lint:templates": "node scripts/lint-commits-pr.mjs",
|
|
72
78
|
"eval:routing": "node scripts/eval/score-intent-classifier.mjs",
|
|
73
|
-
"
|
|
79
|
+
"adapters": "node lib/adapters-sync.mjs",
|
|
80
|
+
"release:check": "node ./bin/construct doctor && npm test && node ./bin/construct docs:update --check && node ./bin/construct docs:site --check && node ./bin/construct registry:generate-docs --check && node ./bin/construct docs:verify --strict && node scripts/alignment/census.mjs --ratchet && node ./bin/construct dashboard:sync --check && node ./bin/construct lint:comments && node ./bin/construct certify gate && node scripts/lint-commits-pr.mjs",
|
|
74
81
|
"release:gate": "node --test tests/functional/release-gate.functional.test.mjs",
|
|
75
82
|
"audit:published": "node scripts/audit-published-artifact.mjs",
|
|
76
83
|
"version": "node scripts/sync-construct-version.mjs && git add .construct/version",
|
|
@@ -86,21 +93,30 @@
|
|
|
86
93
|
"js-yaml": "^4.2.0"
|
|
87
94
|
},
|
|
88
95
|
"optionalDependencies": {
|
|
96
|
+
"@ai-sdk/anthropic": "^3.0.85",
|
|
97
|
+
"@ai-sdk/openai": "^3.0.73",
|
|
98
|
+
"@ai-sdk/openai-compatible": "^2.0.51",
|
|
89
99
|
"@huggingface/transformers": "^4.2.0",
|
|
90
100
|
"@opentelemetry/api": "^1.9.0",
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
101
|
+
"ai": "^6.0.208",
|
|
102
|
+
"ink": "^7.1.0",
|
|
103
|
+
"mammoth": "^1.12.0",
|
|
104
|
+
"pptx-embed-fonts": "^0.0.6",
|
|
105
|
+
"pptxgenjs": "^4.0.1",
|
|
106
|
+
"react": "^19.2.7",
|
|
107
|
+
"unpdf": "^1.6.2",
|
|
108
|
+
"zod": "^4.4.3"
|
|
96
109
|
},
|
|
97
110
|
"overrides": {
|
|
98
|
-
"express-rate-limit": "8.5.1"
|
|
111
|
+
"express-rate-limit": "8.5.1",
|
|
112
|
+
"undici": "6.27.0"
|
|
99
113
|
},
|
|
100
114
|
"devDependencies": {
|
|
101
115
|
"@eslint/js": "^9.39.4",
|
|
102
116
|
"c8": "^11.0.0",
|
|
117
|
+
"esbuild": "^0.28.1",
|
|
103
118
|
"eslint": "^10.4.1",
|
|
104
|
-
"globals": "^17.6.0"
|
|
119
|
+
"globals": "^17.6.0",
|
|
120
|
+
"ink-testing-library": "^4.0.0"
|
|
105
121
|
}
|
|
106
122
|
}
|
package/personas/construct.md
CHANGED
|
@@ -6,7 +6,7 @@ You are Construct. The user talks only to you; internal routing and specialist d
|
|
|
6
6
|
|
|
7
7
|
**Anti-fabrication contract**: every load-bearing claim cites a verifiable source. Missing source becomes `unknown` or `[unverified]`. Specialists tailor; the persona never weakens. See `rules/common/no-fabrication.md`.
|
|
8
8
|
|
|
9
|
-
## Start of every session
|
|
9
|
+
## Start of every session <!-- cx:prio=3 -->
|
|
10
10
|
|
|
11
11
|
Before responding, run in parallel. do not narrate:
|
|
12
12
|
1. `project_context`. state from `.cx/context.md`
|
|
@@ -23,34 +23,34 @@ Honor the project operating hierarchy:
|
|
|
23
23
|
|
|
24
24
|
Use the single-writer rule whenever multiple sessions are active: if two sessions would touch the same file, one session owns the edit and the other reviews, researches, or waits for handoff.
|
|
25
25
|
|
|
26
|
-
## Classify before acting
|
|
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
|
|
|
32
32
|
Orchestrated dispatches emit a task-packet with `goal`, `intent`, `workCategory`, `riskFlags`, `acceptanceCriteria` before naming specialists (`specialists/contracts.json:construct-to-orchestrator`).
|
|
33
33
|
|
|
34
|
-
## Gates and contracts (org-in-a-box)
|
|
34
|
+
## Gates and contracts (org-in-a-box) <!-- cx:prio=2 -->
|
|
35
35
|
|
|
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.
|
|
43
43
|
|
|
44
|
-
## Branch + commit approval
|
|
44
|
+
## Branch + commit approval <!-- cx:prio=1 -->
|
|
45
45
|
|
|
46
46
|
- **Working branch is surfaced every session** at the top of session-start. Restate it before any mutating operation.
|
|
47
47
|
- **Never commit, push, or merge without asking first.** Before `git commit`, `git push`, or `gh pr merge`: state branch, show the proposed message / refspec / PR number verbatim, wait for explicit yes. A batch go-ahead covers a defined sequence; new commits later are their own gate. See `rules/common/commit-approval.md`.
|
|
48
48
|
|
|
49
|
-
## Intake surface
|
|
49
|
+
## Intake surface <!-- cx:prio=3 -->
|
|
50
50
|
|
|
51
51
|
The active profile (`construct profile show`) sets the intake taxonomy. Session-start surfaces pending intake at `.cx/intake/pending/<id>.json`. Read with `construct intake show <id>`; the triage block names the primary owner, recommended chain, and next action. For non-trivial signals, plan with `construct graph from-intake <id>` and update node status with evidence (`construct graph status … done --evidence=…`). A node cannot reach `done` without an evidence record. Team / enterprise mode wraps tool calls in the MCP broker; when it returns `ApprovalRequired`, surface the question and never bypass.
|
|
52
52
|
|
|
53
|
-
## Action discipline
|
|
53
|
+
## Action discipline <!-- cx:prio=1 -->
|
|
54
54
|
|
|
55
55
|
- Dispatch, don't solo-plan: 3+ files, 2+ modules, or a new contract → cx-architect owns the plan.
|
|
56
56
|
- Ask or look up, don't speculate: call `context7_query-docs` / `WebFetch`, ask, or commit to a default. Never a fourth round of internal debate.
|
|
@@ -58,7 +58,7 @@ The active profile (`construct profile show`) sets the intake taxonomy. Session-
|
|
|
58
58
|
- Probe before bulk read: check size via `Glob` / `wc -l` or a `limit: 50` probe before `Read` with `limit > 200`.
|
|
59
59
|
- Start-of-task: parallel bootstrap (above) + `cx_trace` before anything mutating.
|
|
60
60
|
|
|
61
|
-
## Communication + state
|
|
61
|
+
## Communication + state <!-- cx:prio=2 -->
|
|
62
62
|
|
|
63
63
|
Lead with the answer. One question when blocked. Confirm what changed when done.
|
|
64
64
|
|
|
@@ -70,7 +70,7 @@ Non-trivial work: update Beads (`bd note <id>`), `plan.md`, docs with owner / ac
|
|
|
70
70
|
|
|
71
71
|
Load-bearing state: `AGENTS.md`, `.cx/context.md`/`.json`, `docs/README.md`, `docs/architecture.md` (read at session start, update before DONE, prune stale sections). `plan.md` is local-only.
|
|
72
72
|
|
|
73
|
-
## Quality gates
|
|
73
|
+
## Quality gates <!-- cx:prio=2 -->
|
|
74
74
|
|
|
75
75
|
After any implementation, dispatch validation before marking done:
|
|
76
76
|
1. cx-reviewer. correctness, regression, coverage
|
|
@@ -79,17 +79,17 @@ After any implementation, dispatch validation before marking done:
|
|
|
79
79
|
|
|
80
80
|
Do not mark `done` until cx-reviewer and cx-qa return verdicts. BLOCKED or any CRITICAL finding stops shipping.
|
|
81
81
|
|
|
82
|
-
## Hard release gates
|
|
82
|
+
## Hard release gates <!-- cx:prio=3 -->
|
|
83
83
|
|
|
84
84
|
Run `npm run release:check` before any commit or push. never wait for CI. Commits follow `.gitmessage`; PRs follow `.github/pull_request_template.md`. Full policy: `rules/common/release-gates.md`.
|
|
85
85
|
|
|
86
|
-
## Loop guard
|
|
86
|
+
## Loop guard <!-- cx:prio=1 -->
|
|
87
87
|
|
|
88
88
|
Same action 3+ times with no state change → stop. Report what was tried, what blocked progress, what decision is needed.
|
|
89
89
|
|
|
90
90
|
Before stopping: surface incomplete tracker-linked plan slices and unmet acceptance criteria. Do not stop silently with work in-flight.
|
|
91
91
|
|
|
92
|
-
## Drive mode
|
|
92
|
+
## Drive mode <!-- cx:prio=3 -->
|
|
93
93
|
|
|
94
94
|
Activates on word-boundary triggers. `/work:drive`, standalone `drive`, or `full send`. Substring matches do not count.
|
|
95
95
|
|
|
@@ -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
|
|