@geraldmaron/construct 1.4.2 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +36 -0
- package/README.md +41 -7
- package/bin/construct +1027 -64
- package/examples/distribution/sources/deck-one-pager.md +1 -1
- package/lib/acp/server.mjs +21 -7
- package/lib/adapters-sync.mjs +2 -1
- package/lib/audit-trail.mjs +185 -2
- package/lib/beads/auto-close.mjs +2 -1
- package/lib/beads/drift.mjs +2 -1
- package/lib/bridges/copilot-proxy.mjs +20 -5
- package/lib/certification/skill-inventory.mjs +10 -1
- package/lib/cli/approvals.mjs +147 -0
- package/lib/cli-commands.mjs +105 -14
- package/lib/comment-lint.mjs +127 -8
- package/lib/config/schema.mjs +6 -29
- package/lib/config/source-target-registry.mjs +70 -0
- package/lib/config/source-targets.mjs +179 -205
- package/lib/contracts/coverage.mjs +77 -0
- package/lib/contracts/validate.mjs +102 -13
- package/lib/contracts/violation-log.mjs +50 -4
- package/lib/db/migrate.mjs +69 -0
- package/lib/db/migrations/001_orchestration_runs.sql +9 -0
- package/lib/db/migrations/002_queue_provider.sql +50 -0
- package/lib/db/migrations/003_worker_registry.sql +17 -0
- package/lib/db/migrations/004_trace_events.sql +16 -0
- package/lib/db/migrations/005_shared_memory.sql +15 -0
- package/lib/db/migrations/006_orchestration_runs_tenant.sql +5 -0
- package/lib/decisions/enforced-baseline.json +0 -2
- package/lib/decisions/registry.mjs +3 -2
- package/lib/deployment/parity-contract.mjs +1 -1
- package/lib/deployment-mode.mjs +78 -2
- package/lib/diagram-export.mjs +10 -1
- package/lib/distill.mjs +5 -2
- package/lib/docs-verify.mjs +2 -1
- package/lib/doctor/cli.mjs +1 -0
- package/lib/doctor/command-on-path.mjs +24 -0
- package/lib/doctor/diagnosis.mjs +89 -0
- package/lib/doctor/embedding-health.mjs +50 -0
- package/lib/doctor/engine-health.mjs +93 -0
- package/lib/doctor/graph-validate.mjs +47 -0
- package/lib/doctor/index.mjs +18 -4
- package/lib/doctor/sidecar-providers.mjs +56 -0
- package/lib/doctor/watchers/consistency.mjs +93 -1
- package/lib/doctor/watchers/cx-budget.mjs +1 -1
- package/lib/doctor/watchers/graph-staleness.mjs +1 -1
- package/lib/doctor/watchers/mcp-protocol.mjs +17 -0
- package/lib/doctor/watchers/oracle-liveness.mjs +92 -0
- package/lib/doctor/watchers/orchestration-runs.mjs +108 -0
- package/lib/doctor/watchers/provider-breaker.mjs +78 -0
- package/lib/document-export.mjs +52 -27
- package/lib/document-extract/docling-client.mjs +9 -5
- package/lib/document-extract/docling-sidecar.py +30 -0
- package/lib/document-extract.mjs +1 -1
- package/lib/document-ingest.mjs +9 -0
- package/lib/embed/approval-queue.mjs +184 -88
- package/lib/embed/authority-guard.mjs +65 -2
- package/lib/embed/capability-jobs.mjs +365 -0
- package/lib/embed/capability-lifecycle.mjs +219 -0
- package/lib/embed/capability-loader.mjs +303 -0
- package/lib/embed/capability-runtime.mjs +58 -0
- package/lib/embed/cli.mjs +185 -8
- package/lib/embed/config.mjs +4 -0
- package/lib/embed/daemon.mjs +125 -6
- package/lib/embed/demand-fetch.mjs +190 -54
- package/lib/embed/inbox.mjs +12 -10
- package/lib/embed/presets/ops-triage.mjs +236 -0
- package/lib/embed/presets/pm-feedback.mjs +341 -0
- package/lib/embed/presets/tpm.mjs +401 -0
- package/lib/embed/providers/jira.mjs +72 -1
- package/lib/embed/providers/registry.mjs +140 -33
- package/lib/embedded-contract/capability.mjs +4 -0
- package/lib/embedded-contract/execution.mjs +1 -1
- package/lib/embedded-contract/model-resolve.mjs +53 -3
- package/lib/embedded-contract/workflow-defs.mjs +48 -73
- package/lib/embedded-contract/workflow-invoke.mjs +144 -4
- package/lib/embedded-contract/workflows/architecture-review.manifest.json +15 -0
- package/lib/embedded-contract/workflows/data-structure.manifest.json +14 -0
- package/lib/embedded-contract/workflows/evidence-ingest.manifest.json +14 -0
- package/lib/embedded-contract/workflows/memo-draft.manifest.json +14 -0
- package/lib/embedded-contract/workflows/operations-triage.manifest.json +18 -0
- package/lib/embedded-contract/workflows/operations.manifest.json +18 -0
- package/lib/embedded-contract/workflows/pm-feedback.manifest.json +18 -0
- package/lib/embedded-contract/workflows/prd-draft.manifest.json +15 -0
- package/lib/embedded-contract/workflows/proposal-review.manifest.json +15 -0
- package/lib/embedded-contract/workflows/research-synthesis.manifest.json +14 -0
- package/lib/embedded-contract/workflows/risk-review.manifest.json +15 -0
- package/lib/embedded-contract/workflows/structure-notes.manifest.json +14 -0
- package/lib/embedded-contract/workflows/transcript-process.manifest.json +14 -0
- package/lib/embedded-contract/workflows/triage.manifest.json +14 -0
- package/lib/env-config.mjs +50 -9
- package/lib/extensions/index.mjs +27 -0
- package/lib/extensions/loader.mjs +120 -0
- package/lib/extensions/manifest-schema.mjs +141 -0
- package/lib/extensions/manifests/anthropic.manifest.json +12 -0
- package/lib/extensions/manifests/atlassian-confluence.manifest.json +12 -0
- package/lib/extensions/manifests/atlassian-jira.manifest.json +53 -0
- package/lib/extensions/manifests/directory.manifest.json +12 -0
- package/lib/extensions/manifests/docling.manifest.json +37 -0
- package/lib/extensions/manifests/echo.manifest.json +8 -0
- package/lib/extensions/manifests/feedback.manifest.json +12 -0
- package/lib/extensions/manifests/github-copilot.manifest.json +12 -0
- package/lib/extensions/manifests/github.manifest.json +52 -0
- package/lib/extensions/manifests/linear.manifest.json +50 -0
- package/lib/extensions/manifests/local.manifest.json +12 -0
- package/lib/extensions/manifests/ollama.manifest.json +12 -0
- package/lib/extensions/manifests/openai.manifest.json +12 -0
- package/lib/extensions/manifests/openrouter-anthropic.manifest.json +12 -0
- package/lib/extensions/manifests/openrouter-deepseek.manifest.json +12 -0
- package/lib/extensions/manifests/openrouter-google.manifest.json +12 -0
- package/lib/extensions/manifests/openrouter-llama.manifest.json +12 -0
- package/lib/extensions/manifests/openrouter-qwen.manifest.json +12 -0
- package/lib/extensions/manifests/openrouter.manifest.json +12 -0
- package/lib/extensions/manifests/postgres.manifest.json +12 -0
- package/lib/extensions/manifests/salesforce.manifest.json +12 -0
- package/lib/extensions/manifests/slack.manifest.json +58 -0
- package/lib/extensions/manifests/whisper.manifest.json +36 -0
- package/lib/extensions/validate.mjs +175 -0
- package/lib/features.mjs +13 -9
- package/lib/flows/checkpoint.mjs +184 -0
- package/lib/flows/constants.mjs +27 -0
- package/lib/flows/define.mjs +146 -0
- package/lib/flows/engine.mjs +249 -0
- package/lib/flows/errors.mjs +19 -0
- package/lib/flows/index.mjs +27 -0
- package/lib/flows/joins.mjs +18 -0
- package/lib/flows/schema.mjs +90 -0
- package/lib/flows/state.mjs +31 -0
- package/lib/frameworks/loader.mjs +99 -0
- package/lib/frameworks/schema.mjs +157 -0
- package/lib/graph/build-from-corpus.mjs +67 -0
- package/lib/graph/build-from-embed.mjs +82 -0
- package/lib/graph/build-from-registry.mjs +164 -3
- package/lib/graph/cli.mjs +456 -12
- package/lib/graph/gap-queries.mjs +156 -0
- package/lib/graph/gaps.mjs +41 -0
- package/lib/graph/impacted.mjs +129 -0
- package/lib/graph/runtime-evidence.mjs +177 -0
- package/lib/graph/security-coverage.mjs +113 -0
- package/lib/graph/staleness.mjs +241 -10
- package/lib/graph/store.mjs +24 -7
- package/lib/graph/validate.mjs +161 -0
- package/lib/headhunt.mjs +9 -8
- package/lib/health-check.mjs +15 -7
- package/lib/hook-health.mjs +1 -1
- package/lib/hooks/agent-tracker.mjs +10 -4
- package/lib/hooks/edit-guard.mjs +3 -3
- package/lib/hooks/graph-impact-advisory.mjs +2 -2
- package/lib/hooks/guard-bash.mjs +41 -15
- package/lib/hooks/mcp-health-check.mjs +11 -4
- package/lib/hooks/model-fallback.mjs +50 -6
- package/lib/hooks/orchestration-dispatch-guard.mjs +14 -3
- package/lib/hooks/pre-compact.mjs +181 -173
- package/lib/hooks/rule-verifier.mjs +2 -1
- package/lib/hooks/session-reflect.mjs +2 -1
- package/lib/hooks/session-start.mjs +3 -3
- package/lib/host-capabilities.mjs +13 -2
- package/lib/host-disposition.mjs +19 -7
- package/lib/identity.mjs +92 -0
- package/lib/ingest/degraded-extract.mjs +96 -0
- package/lib/ingest/docling-remote.mjs +2 -1
- package/lib/ingest/provider-extract.mjs +7 -19
- package/lib/ingest/sidecar-providers.mjs +196 -0
- package/lib/ingest-tooling.mjs +11 -5
- package/lib/init-unified.mjs +57 -45
- package/lib/init-update.mjs +2 -1
- package/lib/install/legacy-global-cleanup.mjs +25 -0
- package/lib/intake/daemon.mjs +99 -8
- package/lib/intake/git-queue.mjs +110 -38
- package/lib/intake/queue-registry.mjs +50 -0
- package/lib/intake/queue.mjs +133 -17
- package/lib/intake/session-prelude.mjs +57 -8
- package/lib/integrations/intake-integrations.mjs +61 -111
- package/lib/intent-classifier.mjs +43 -5
- package/lib/libreoffice-export.mjs +8 -8
- package/lib/logging/rotate.mjs +5 -4
- package/lib/mcp/broker.mjs +332 -17
- package/lib/mcp/denied-store.mjs +95 -0
- package/lib/mcp/destructive-gate.mjs +30 -0
- package/lib/mcp/dispatch-envelope.mjs +199 -0
- package/lib/mcp/memory-bridge.mjs +2 -1
- package/lib/mcp/server.mjs +154 -1411
- package/lib/mcp/tool-definitions-memory.mjs +376 -0
- package/lib/mcp/tool-definitions-project.mjs +271 -0
- package/lib/mcp/tool-definitions-skills.mjs +311 -0
- package/lib/mcp/tool-definitions-workflow.mjs +398 -0
- package/lib/mcp/tool-definitions.mjs +25 -0
- package/lib/mcp/tool-registry.mjs +107 -0
- package/lib/mcp/tool-safety.mjs +1 -0
- package/lib/mcp/tools/orchestration-delegation-next.tool.mjs +68 -0
- package/lib/mcp/tools/orchestration-run.mjs +165 -25
- package/lib/mcp/tools/orchestration-task-result.tool.mjs +77 -0
- package/lib/mcp/tools/provider-write.mjs +187 -0
- package/lib/mcp/tools/scope.mjs +0 -3
- package/lib/mcp/tools/skills.mjs +1 -1
- package/lib/mcp/tools/storage.mjs +0 -8
- package/lib/mcp/transport/auth.mjs +238 -0
- package/lib/mcp/transport/http.mjs +136 -0
- package/lib/mcp/transport/mode.mjs +31 -0
- package/lib/mcp/transport/stdio.mjs +22 -0
- package/lib/mcp-catalog.json +4 -4
- package/lib/mcp-manager.mjs +34 -23
- package/lib/mcp-platform-config.mjs +31 -7
- package/lib/mode-capabilities.mjs +109 -0
- package/lib/model-router.mjs +42 -9
- package/lib/models/catalog.mjs +40 -1
- package/lib/net-guard.mjs +247 -0
- package/lib/observation-store.mjs +6 -2
- package/lib/ollama/provision-context.mjs +2 -1
- package/lib/opencode-config.mjs +22 -3
- package/lib/opencode-runtime-plugin.mjs +120 -2
- package/lib/oracle/actions.mjs +204 -10
- package/lib/oracle/cli.mjs +24 -3
- package/lib/oracle/dispatch.mjs +2 -1
- package/lib/oracle/execute.mjs +2 -2
- package/lib/oracle/gaps.mjs +3 -3
- package/lib/oracle/heartbeat.mjs +53 -0
- package/lib/oracle/read-model.mjs +69 -13
- package/lib/oracle/reconcile.mjs +3 -46
- package/lib/oracle/routing.mjs +37 -31
- package/lib/oracle/synthesize.mjs +1 -1
- package/lib/orchestration/classification.mjs +434 -0
- package/lib/orchestration/delegation-flow.mjs +132 -0
- package/lib/orchestration/flow-selection.mjs +418 -0
- package/lib/orchestration/gates.mjs +244 -0
- package/lib/orchestration/host-sampling.mjs +121 -0
- package/lib/orchestration/policy-constants.mjs +48 -0
- package/lib/orchestration/provider-outcome.mjs +197 -0
- package/lib/orchestration/readiness.mjs +114 -13
- package/lib/orchestration/run-store-postgres.mjs +32 -26
- package/lib/orchestration/run-store-sqlite.mjs +8 -14
- package/lib/orchestration/run-store.mjs +25 -12
- package/lib/orchestration/runtime.mjs +446 -39
- package/lib/orchestration/store.mjs +87 -12
- package/lib/orchestration/trace-store.mjs +125 -0
- package/lib/orchestration/web-capability.mjs +3 -2
- package/lib/orchestration/worker-runtime.mjs +162 -0
- package/lib/orchestration/worker.mjs +528 -89
- package/lib/orchestration-policy.mjs +67 -1111
- package/lib/packs/cli.mjs +144 -0
- package/lib/packs/core-pack.mjs +112 -0
- package/lib/packs/enablement.mjs +187 -0
- package/lib/packs/index.mjs +23 -0
- package/lib/packs/loader.mjs +176 -0
- package/lib/packs/manifest-schema.mjs +58 -0
- package/lib/packs/prompts.mjs +120 -0
- package/lib/packs/validate.mjs +208 -0
- package/lib/plugin-registry.mjs +4 -5
- package/lib/policy/audit-gate.mjs +42 -0
- package/lib/policy/consumption-budget.mjs +149 -0
- package/lib/policy/engine.mjs +81 -6
- package/lib/policy/role-authority.mjs +89 -0
- package/lib/prompt-composer.js +19 -3
- package/lib/providers/contract/adapters/confluence/governed-write.mjs +215 -0
- package/lib/providers/contract/adapters/confluence/manifest.json +17 -0
- package/lib/providers/contract/adapters/confluence/transport.mjs +135 -0
- package/lib/providers/contract/adapters/github/governed-write.mjs +121 -0
- package/lib/providers/contract/adapters/github/index.mjs +38 -3
- package/lib/providers/contract/adapters/jira/adf.mjs +151 -0
- package/lib/providers/contract/adapters/jira/createmeta.mjs +143 -0
- package/lib/providers/contract/adapters/jira/governed-write.mjs +182 -0
- package/lib/providers/contract/adapters/jira/manifest.json +17 -0
- package/lib/providers/contract/adapters/jira/transport.mjs +119 -0
- package/lib/providers/contract.mjs +207 -0
- package/lib/providers/credential-bootstrap.mjs +7 -4
- package/lib/providers/credential-sources.mjs +14 -2
- package/lib/providers/directory/index.mjs +273 -0
- package/lib/providers/feedback/index.mjs +392 -0
- package/lib/providers/filter-audit.mjs +68 -0
- package/lib/providers/filter-schema.mjs +54 -0
- package/lib/providers/github/index.mjs +31 -0
- package/lib/providers/instance-config.mjs +215 -0
- package/lib/providers/op-locate.mjs +96 -0
- package/lib/providers/op-run.mjs +64 -9
- package/lib/providers/registry.mjs +26 -3
- package/lib/providers/secret-audit-wiring.mjs +6 -0
- package/lib/providers/secret-resolver.mjs +240 -23
- package/lib/publish-template.mjs +6 -3
- package/lib/publish-tooling.mjs +4 -0
- package/lib/publish.mjs +32 -4
- package/lib/queue/pg-queue.mjs +395 -0
- package/lib/reflect.mjs +2 -1
- package/lib/registry/assemble.mjs +28 -2
- package/lib/registry/consolidation.mjs +8 -1
- package/lib/registry/custom-scaffold.mjs +200 -0
- package/lib/registry/custom-schema.mjs +137 -0
- package/lib/registry/loader.mjs +8 -3
- package/lib/registry/manifests/format-engines.default.json +15 -0
- package/lib/registry/manifests/surface-map.default.json +46 -0
- package/lib/registry/retired-paths.mjs +1 -0
- package/lib/registry/surface-map.mjs +100 -50
- package/lib/render-visual-check.mjs +240 -0
- package/lib/resources/budget.mjs +40 -17
- package/lib/roles/flavor-bindings.mjs +36 -14
- package/lib/roles/gateway.mjs +15 -8
- package/lib/roots.mjs +107 -0
- package/lib/runtime/uv-bootstrap.mjs +32 -6
- package/lib/runtime/whisper-bootstrap.mjs +11 -3
- package/lib/runtime-env.mjs +5 -2
- package/lib/scheduler/index.mjs +8 -20
- package/lib/schema-infer.mjs +31 -2
- package/lib/scopes/lifecycle.mjs +29 -25
- package/lib/scopes/loader.mjs +49 -12
- package/lib/scopes/teams.mjs +1 -1
- package/lib/security/ingest-boundary.mjs +80 -0
- package/lib/security/recall-wrapper.mjs +99 -0
- package/lib/security/trust.mjs +132 -0
- package/lib/service-manager.mjs +38 -19
- package/lib/setup.mjs +41 -23
- package/lib/skills-apply.mjs +4 -2
- package/lib/specialists/postconditions.mjs +2 -2
- package/lib/state-root.mjs +147 -0
- package/lib/status.mjs +597 -6
- package/lib/storage/admin.mjs +77 -5
- package/lib/storage/backend-registry.mjs +73 -0
- package/lib/storage/backend.mjs +63 -9
- package/lib/storage/embeddings-openai.mjs +12 -2
- package/lib/storage/hybrid-query.mjs +11 -3
- package/lib/storage/retrieval-hardening.mjs +384 -0
- package/lib/storage/shared-memory.mjs +158 -0
- package/lib/storage/vector-client.mjs +69 -2
- package/lib/team/health.mjs +72 -0
- package/lib/telemetry/backends/local.mjs +9 -3
- package/lib/telemetry/client.mjs +3 -7
- package/lib/template-registry.mjs +10 -12
- package/lib/tenant/context.mjs +82 -0
- package/lib/tenant/isolation.mjs +129 -0
- package/lib/test-corpus-inventory.mjs +104 -2
- package/lib/uninstall/uninstall.mjs +78 -12
- package/lib/validator.mjs +4 -6
- package/lib/worker/entrypoint.mjs +2 -1
- package/lib/worker/run.mjs +2 -2
- package/lib/worker/trace.mjs +5 -11
- package/lib/workflow-state.mjs +52 -8
- package/lib/workflows/liveness.mjs +203 -0
- package/lib/workflows/loader.mjs +177 -0
- package/lib/workflows/manifest-schema.mjs +71 -0
- package/lib/workflows/surface-parity.mjs +118 -0
- package/lib/workflows/validate.mjs +127 -0
- package/lib/writes/control-plane.mjs +140 -0
- package/lib/writes/envelope.mjs +206 -0
- package/lib/writes/sent-log.mjs +86 -0
- package/lib/writes/write-intent.mjs +109 -0
- package/package.json +16 -8
- package/personas/construct.md +12 -3
- package/registry/capabilities.json +143 -36
- package/rules/common/comments.md +1 -0
- package/schemas/project-config.schema.json +0 -12
- package/schemas/unified-registry.schema.json +2 -4
- package/scripts/sync-specialists.mjs +284 -81
- package/skills/docs/adr-workflow.md +1 -1
- package/skills/docs/codebase-research-workflow.md +3 -3
- package/skills/docs/prd-workflow.md +5 -6
- package/skills/docs/runbook-workflow.md +2 -2
- package/skills/docs/user-research-workflow.md +3 -3
- package/skills/operating/fleet-health-routing.md +77 -0
- package/skills/roles/ai-engineer.md +1 -1
- package/skills/roles/architect.md +0 -1
- package/skills/roles/business-strategist.md +1 -1
- package/skills/roles/data-analyst.telemetry.md +1 -1
- package/skills/roles/data-engineer.md +1 -1
- package/skills/roles/data-engineer.pipeline.md +1 -1
- package/skills/roles/data-engineer.vector-retrieval.md +1 -2
- package/skills/roles/data-engineer.warehouse.md +1 -1
- package/skills/roles/designer.accessibility.md +1 -1
- package/skills/roles/designer.md +0 -1
- package/skills/roles/devil-advocate.md +1 -1
- package/skills/roles/docs-keeper.md +1 -1
- package/skills/roles/evaluator.md +1 -1
- package/skills/roles/explorer.md +1 -1
- package/skills/roles/platform-engineer.md +1 -1
- package/skills/roles/qa.ai-eval.md +1 -2
- package/skills/roles/qa.api-contract.md +0 -1
- package/skills/roles/qa.data-pipeline.md +0 -1
- package/skills/roles/qa.md +0 -1
- package/skills/roles/qa.web-ui.md +0 -1
- package/skills/roles/release-manager.md +1 -1
- package/skills/roles/researcher.md +0 -2
- package/skills/roles/reviewer.md +0 -3
- package/skills/roles/security.ai.md +1 -1
- package/skills/roles/security.legal-compliance.md +1 -1
- package/skills/roles/security.md +0 -1
- package/skills/roles/security.privacy.md +0 -1
- package/skills/roles/security.supply-chain.md +1 -1
- package/skills/roles/sre.md +1 -1
- package/skills/roles/test-automation.md +1 -1
- package/skills/roles/trace-reviewer.md +1 -1
- package/skills/roles/ux-researcher.md +1 -1
- package/specialists/artifact-manifest.json +36 -36
- package/specialists/org/contracts/accessibility-to-qa.json +11 -3
- package/specialists/org/contracts/any-to-business-strategist.json +19 -7
- package/specialists/org/contracts/any-to-debugger.json +7 -1
- package/specialists/org/contracts/any-to-designer.json +7 -1
- package/specialists/org/contracts/any-to-docs-keeper.json +18 -4
- package/specialists/org/contracts/any-to-explorer.json +13 -4
- package/specialists/org/contracts/any-to-sre-incident.json +6 -2
- package/specialists/org/contracts/any-to-trace-reviewer.json +16 -4
- package/specialists/org/contracts/architect-to-ai-engineer.json +6 -2
- package/specialists/org/contracts/architect-to-data-engineer.json +17 -5
- package/specialists/org/contracts/architect-to-devil-advocate.json +11 -3
- package/specialists/org/contracts/architect-to-engineer.json +20 -4
- package/specialists/org/contracts/architect-to-evaluator.json +15 -5
- package/specialists/org/contracts/architect-to-legal-compliance.json +15 -5
- package/specialists/org/contracts/architect-to-operations.json +17 -4
- package/specialists/org/contracts/architect-to-platform-engineer.json +20 -4
- package/specialists/org/contracts/construct-to-orchestrator.json +10 -2
- package/specialists/org/contracts/data-analyst-to-product-manager.json +11 -2
- package/specialists/org/contracts/engineer-to-qa.json +20 -4
- package/specialists/org/contracts/engineer-to-reviewer.json +29 -5
- package/specialists/org/contracts/explorer-to-engineer.json +11 -3
- package/specialists/org/contracts/legal-compliance-to-release-manager.json +12 -4
- package/specialists/org/contracts/operations-to-user.json +53 -0
- package/specialists/org/contracts/operations-triage-output.json +53 -0
- package/specialists/org/contracts/pm-requirements-candidates.json +53 -0
- package/specialists/org/contracts/product-manager-to-architect.json +30 -10
- package/specialists/org/contracts/product-manager-to-data-analyst.json +13 -3
- package/specialists/org/contracts/product-manager-to-ux-researcher.json +15 -5
- package/specialists/org/contracts/qa-to-release-manager.json +11 -3
- package/specialists/org/contracts/researcher-to-architect.json +10 -2
- package/specialists/org/contracts/researcher-to-product-manager.json +16 -5
- package/specialists/org/contracts/reviewer-to-security.json +17 -3
- package/specialists/org/contracts/test-automation-to-engineer.json +11 -3
- package/specialists/org/contracts/trace-reviewer-to-sre.json +12 -4
- package/specialists/org/contracts/user-to-construct.json +11 -4
- package/specialists/org/frameworks/cx-architect-constraint-option-failure.md +66 -0
- package/specialists/org/frameworks/cx-engineer-feasibility-blast-radius.md +66 -0
- package/specialists/org/frameworks/cx-ops-dependency-sequencing.md +74 -0
- package/specialists/org/frameworks/cx-pm-value-tradeoff.md +66 -0
- package/specialists/org/frameworks/cx-qa-risk-based-coverage.md +69 -0
- package/specialists/org/groups/engineering-group.json +2 -6
- package/specialists/org/groups/governance-group.json +2 -3
- package/specialists/org/groups/operations-group.json +5 -8
- package/specialists/org/groups/product-group.json +4 -8
- package/specialists/org/groups/quality-group.json +3 -7
- package/specialists/org/groups/strategy-group.json +6 -9
- package/specialists/org/models.json.example +8 -0
- package/specialists/org/scopes/creative.json +6 -1
- package/specialists/org/scopes/operations.json +7 -1
- package/specialists/org/scopes/research.json +6 -1
- package/specialists/org/scopes/rnd.json +7 -1
- package/specialists/org/specialists/cx-architect.json +27 -8
- package/specialists/org/specialists/cx-designer.json +22 -8
- package/specialists/org/specialists/cx-engineer.json +71 -7
- package/specialists/org/specialists/cx-operations.json +89 -15
- package/specialists/org/specialists/cx-orchestrator.json +16 -4
- package/specialists/org/specialists/cx-product-manager.json +28 -9
- package/specialists/org/specialists/cx-qa.json +16 -6
- package/specialists/org/specialists/cx-researcher.json +40 -7
- package/specialists/org/specialists/cx-reviewer.json +61 -11
- package/specialists/org/specialists/cx-security.json +30 -10
- package/specialists/org/teams/design-team.json +3 -4
- package/specialists/org/teams/engineering-team.json +3 -10
- package/specialists/org/teams/governance-team.json +3 -5
- package/specialists/org/teams/operations-team.json +6 -12
- package/specialists/org/teams/product-management-team.json +2 -3
- package/specialists/org/teams/quality-team.json +4 -12
- package/specialists/org/teams/research-team.json +3 -3
- package/specialists/org/teams/strategy-team.json +7 -14
- package/specialists/prompts/cx-architect.md +20 -1
- package/specialists/prompts/cx-data-analyst.md +1 -1
- package/specialists/prompts/cx-designer.md +12 -4
- package/specialists/prompts/cx-engineer.md +15 -1
- package/specialists/prompts/cx-operations.md +14 -2
- package/specialists/prompts/cx-orchestrator.md +9 -5
- package/specialists/prompts/cx-product-manager.md +5 -1
- package/specialists/prompts/cx-qa.md +6 -2
- package/specialists/prompts/cx-researcher.md +25 -30
- package/specialists/prompts/cx-reviewer.md +19 -1
- package/specialists/prompts/cx-security.md +5 -1
- package/templates/distribution/construct-brand.typ +123 -59
- package/templates/distribution/construct-decision.typ +6 -3
- package/templates/distribution/construct-pdf.typ +11 -4
- package/templates/distribution/construct-prd.typ +6 -3
- package/templates/distribution/construct-research.typ +7 -4
- package/lib/providers/contract/adapters/git/index.mjs +0 -115
- package/lib/providers/contract/adapters/slack/index.mjs +0 -175
- package/specialists/org/contracts/business-strategist-to-product-manager.json +0 -39
- package/specialists/org/contracts/construct-to-rd-lead.json +0 -53
- package/specialists/org/contracts/data-engineer-to-platform-engineer.json +0 -36
- package/specialists/org/contracts/designer-to-accessibility.json +0 -36
- package/specialists/org/contracts/platform-engineer-to-engineer.json +0 -31
- package/specialists/org/contracts/qa-to-test-automation.json +0 -42
- package/specialists/org/contracts/rd-lead-to-architect.json +0 -38
- package/specialists/org/contracts/sre-to-release-manager.json +0 -36
- package/specialists/org/specialists/cx-accessibility.json +0 -69
- package/specialists/org/specialists/cx-ai-engineer.json +0 -75
- package/specialists/org/specialists/cx-business-strategist.json +0 -72
- package/specialists/org/specialists/cx-data-engineer.json +0 -71
- package/specialists/org/specialists/cx-devil-advocate.json +0 -71
- package/specialists/org/specialists/cx-docs-keeper.json +0 -82
- package/specialists/org/specialists/cx-evaluator.json +0 -69
- package/specialists/org/specialists/cx-explorer.json +0 -69
- package/specialists/org/specialists/cx-legal-compliance.json +0 -74
- package/specialists/org/specialists/cx-oracle.json +0 -46
- package/specialists/org/specialists/cx-platform-engineer.json +0 -80
- package/specialists/org/specialists/cx-rd-lead.json +0 -73
- package/specialists/org/specialists/cx-release-manager.json +0 -77
- package/specialists/org/specialists/cx-sre.json +0 -94
- package/specialists/org/specialists/cx-test-automation.json +0 -69
- package/specialists/org/specialists/cx-trace-reviewer.json +0 -69
- package/specialists/org/specialists/cx-ux-researcher.json +0 -68
- package/specialists/org/teams/accessibility-team.json +0 -39
- package/specialists/org/teams/ux-research-team.json +0 -39
- package/specialists/prompts/cx-accessibility.md +0 -55
- package/specialists/prompts/cx-ai-engineer.md +0 -124
- package/specialists/prompts/cx-business-strategist.md +0 -58
- package/specialists/prompts/cx-data-engineer.md +0 -55
- package/specialists/prompts/cx-devil-advocate.md +0 -59
- package/specialists/prompts/cx-docs-keeper.md +0 -164
- package/specialists/prompts/cx-evaluator.md +0 -49
- package/specialists/prompts/cx-explorer.md +0 -71
- package/specialists/prompts/cx-legal-compliance.md +0 -58
- package/specialists/prompts/cx-oracle.md +0 -98
- package/specialists/prompts/cx-platform-engineer.md +0 -97
- package/specialists/prompts/cx-rd-lead.md +0 -59
- package/specialists/prompts/cx-release-manager.md +0 -54
- package/specialists/prompts/cx-sre.md +0 -111
- package/specialists/prompts/cx-test-automation.md +0 -55
- package/specialists/prompts/cx-trace-reviewer.md +0 -101
- package/specialists/prompts/cx-ux-researcher.md +0 -53
package/lib/cli-commands.mjs
CHANGED
|
@@ -24,14 +24,14 @@ export const CLI_COMMANDS = [
|
|
|
24
24
|
category: 'Core',
|
|
25
25
|
core: true,
|
|
26
26
|
description: 'Start services for development',
|
|
27
|
-
usage: 'construct dev [--select] [--only=
|
|
27
|
+
usage: 'construct dev [--select] [--only=memory,opencode,...]',
|
|
28
28
|
examples: [
|
|
29
29
|
{ cmd: 'construct dev', desc: 'Start the default service set' },
|
|
30
|
-
{ cmd: 'construct dev --only=
|
|
30
|
+
{ cmd: 'construct dev --only=memory', desc: 'Start just the memory (cm) service' },
|
|
31
31
|
],
|
|
32
32
|
options: [
|
|
33
33
|
{ flag: '--select', desc: 'Pick which services to start from an interactive checklist' },
|
|
34
|
-
{ flag: '--only=<a,b,c>', desc: 'Start only the named services (
|
|
34
|
+
{ flag: '--only=<a,b,c>', desc: 'Start only the named services (telemetry, memory, opencode, copilot-bridge)' },
|
|
35
35
|
],
|
|
36
36
|
},
|
|
37
37
|
{
|
|
@@ -61,22 +61,37 @@ export const CLI_COMMANDS = [
|
|
|
61
61
|
{ flag: '--json', desc: 'Output full status payload as JSON' },
|
|
62
62
|
],
|
|
63
63
|
},
|
|
64
|
+
{
|
|
65
|
+
name: 'workers',
|
|
66
|
+
emoji: '🫀',
|
|
67
|
+
category: 'Core',
|
|
68
|
+
core: true,
|
|
69
|
+
description: 'List registered team workers and heartbeat freshness',
|
|
70
|
+
usage: 'construct workers <list> [--json]',
|
|
71
|
+
strictFlags: true,
|
|
72
|
+
examples: [
|
|
73
|
+
{ cmd: 'construct workers list', desc: 'Show live/stale registered workers' },
|
|
74
|
+
{ cmd: 'construct workers list --json', desc: 'Machine-readable worker status' },
|
|
75
|
+
],
|
|
76
|
+
options: [
|
|
77
|
+
{ flag: '--json', desc: 'Output worker list as JSON' },
|
|
78
|
+
],
|
|
79
|
+
},
|
|
64
80
|
{
|
|
65
81
|
name: 'install',
|
|
66
82
|
emoji: '🛠️',
|
|
67
83
|
category: 'Core',
|
|
68
84
|
core: true,
|
|
69
85
|
description: 'Machine setup (scoped per ADR-0029): --scope=project|user|both, default project',
|
|
70
|
-
usage: 'construct install [--scope=project|user|both] [--yes] [--dry-run] [--no-
|
|
86
|
+
usage: 'construct install [--scope=project|user|both] [--yes] [--dry-run] [--no-launch-agent] [--reconfigure] [--with-docling]',
|
|
71
87
|
examples: [
|
|
72
88
|
{ cmd: 'construct install --dry-run', desc: 'Preview the plan before writing anything' },
|
|
73
89
|
{ cmd: 'construct install --scope=user --yes', desc: 'Non-interactive user-scope install' },
|
|
74
90
|
],
|
|
75
91
|
options: [
|
|
76
|
-
{ flag: '--scope=<s>', desc: 'project (default, no-op + guidance) | user (writes ~/.construct/, MCP, ~/.claude/* via consent) | both' },
|
|
92
|
+
{ flag: '--scope=<s>', desc: 'project (default, no-op + guidance) | user (writes ~/.config/construct/, MCP, ~/.claude/* via consent) | both' },
|
|
77
93
|
{ flag: '--yes', desc: 'Apply defaults without prompts (only meaningful with --scope=user|both)' },
|
|
78
94
|
{ flag: '--dry-run', desc: 'Preview the install plan (scopes, files, services) without writing anything' },
|
|
79
|
-
{ flag: '--no-docker', desc: 'Skip Docker-based service setup (local Postgres)' },
|
|
80
95
|
{ flag: '--no-launch-agent', desc: 'Skip background macOS LaunchAgent registration' },
|
|
81
96
|
{ flag: '--reconfigure', desc: 'Re-prompt for service consent, ignoring cached answers' },
|
|
82
97
|
{ flag: '--with-docling', desc: 'Eagerly provision the docling document-extraction venv now (heavy, ~10 min; else lazy on first ingest)' },
|
|
@@ -407,9 +422,25 @@ export const CLI_COMMANDS = [
|
|
|
407
422
|
category: 'Work',
|
|
408
423
|
core: false,
|
|
409
424
|
description: 'Task graph management',
|
|
410
|
-
usage: 'construct graph <list|show|from-intake|recommend>',
|
|
425
|
+
usage: 'construct graph <list|show|from-intake|recommend|build|stat|query|validate|explain|owasp>',
|
|
411
426
|
subcommands: [
|
|
412
427
|
{ name: 'recommend --json [--text|--file|<stdin>]', desc: 'Return a role-aware plan for an artifact without enqueuing (embedded contract; alias of intake classify)' },
|
|
428
|
+
{ name: 'build|stat|query|validate|explain', desc: 'Living dependency graph — build/inspect/validate the typed file↔capability↔workflow↔test↔embed graph (replaces `construct matrix`)' },
|
|
429
|
+
{ name: 'owasp | missing-tests --security', desc: 'OWASP GenAI Top-10 coverage matrix and the workflow/preset security-coverage gap list (LMCP-N8)' },
|
|
430
|
+
],
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
name: 'pack',
|
|
434
|
+
emoji: '📦',
|
|
435
|
+
category: 'Work',
|
|
436
|
+
core: false,
|
|
437
|
+
description: 'Specialist/team/profile pack enable/disable lifecycle (LMCP-E3)',
|
|
438
|
+
usage: 'construct pack <list|enable|disable|info> [--json]',
|
|
439
|
+
subcommands: [
|
|
440
|
+
{ name: 'list', desc: 'Every pack discovered across builtin/user/project tiers with its durable enabled state' },
|
|
441
|
+
{ name: 'enable <pack-id>[@version]', desc: 'Validate the pack manifest and record it enabled in .cx/packs.json; refuses on an incompatible compatVersion or other validation failure' },
|
|
442
|
+
{ name: 'disable <pack-id>', desc: 'Remove the pack\'s enabled entry (idempotent; the core pack cannot be disabled)' },
|
|
443
|
+
{ name: 'info <pack-id>', desc: 'Full manifest plus enabled state for one pack' },
|
|
413
444
|
],
|
|
414
445
|
},
|
|
415
446
|
{
|
|
@@ -462,6 +493,30 @@ export const CLI_COMMANDS = [
|
|
|
462
493
|
{ name: 'preflight [--host H] [--json] [--no-probe]', desc: 'Verify orchestration tool attachment/readiness and return a typed reason plus recovery step' },
|
|
463
494
|
],
|
|
464
495
|
},
|
|
496
|
+
{
|
|
497
|
+
name: 'flow',
|
|
498
|
+
emoji: '🧵',
|
|
499
|
+
category: 'Models & Integrations',
|
|
500
|
+
core: false,
|
|
501
|
+
description: 'Deterministic flow-engine runs: start or resume a checkpointed flow, or inspect its status',
|
|
502
|
+
usage: 'construct flow <resume|status> <run-id> [--flow=<path>] [--state=<json>]',
|
|
503
|
+
subcommands: [
|
|
504
|
+
{ name: 'resume <run-id> --flow=<path> [--state=<json>]', desc: 'Start (new run-id) or resume a checkpointed flow and drive it to completion' },
|
|
505
|
+
{ name: 'status <run-id>', desc: 'Read a flow checkpoint without driving it' },
|
|
506
|
+
],
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
name: 'db',
|
|
510
|
+
emoji: '🗄️',
|
|
511
|
+
category: 'Models & Integrations',
|
|
512
|
+
core: false,
|
|
513
|
+
description: 'Inspect and migrate the optional Postgres backend',
|
|
514
|
+
usage: 'construct db <status|migrate> [--json]',
|
|
515
|
+
subcommands: [
|
|
516
|
+
{ name: 'status [--json]', desc: 'Check Postgres reachability and migration state' },
|
|
517
|
+
{ name: 'migrate [--json]', desc: 'Apply pending Postgres migrations idempotently' },
|
|
518
|
+
],
|
|
519
|
+
},
|
|
465
520
|
{
|
|
466
521
|
name: 'acp',
|
|
467
522
|
emoji: '🔗',
|
|
@@ -601,11 +656,12 @@ export const CLI_COMMANDS = [
|
|
|
601
656
|
emoji: '👥',
|
|
602
657
|
category: 'Work',
|
|
603
658
|
core: false,
|
|
604
|
-
description: 'Team review
|
|
605
|
-
usage: 'construct team <list|show|review|templates>',
|
|
659
|
+
description: 'Team review, template listing, and custom team authoring (`team:add` / `team:remove` are internal registry editors)',
|
|
660
|
+
usage: 'construct team <list|show|create|review|templates>',
|
|
606
661
|
subcommands: [
|
|
607
662
|
{ name: 'list', desc: 'List macro groups and squads (--kind group|squad)' },
|
|
608
663
|
{ name: 'show', desc: 'Show one group or squad by id' },
|
|
664
|
+
{ name: 'create', desc: 'Scaffold a custom team into .cx/org/ (or ~/.construct/org/ with --user) — see docs/guides/cookbook/custom-specialists-and-teams.md' },
|
|
609
665
|
{ name: 'review', desc: 'Team review workflow' },
|
|
610
666
|
{ name: 'templates', desc: 'List team doc templates' },
|
|
611
667
|
],
|
|
@@ -785,7 +841,7 @@ export const CLI_COMMANDS = [
|
|
|
785
841
|
{ flag: '--dry-run', desc: 'Print the plan and exit; change nothing' },
|
|
786
842
|
{ flag: '--yes', desc: 'Remove auto-risk (✓) categories without prompting' },
|
|
787
843
|
{ flag: '--all', desc: 'Combined with --yes: also remove ask-risk (◐) categories (project data, machine config)' },
|
|
788
|
-
{ flag: '--keep-state', desc: 'Only remove the launcher + adapters; preserve .cx/, ~/.construct, Postgres' },
|
|
844
|
+
{ flag: '--keep-state', desc: 'Only remove the launcher + adapters; preserve .cx/, ~/.config/construct, Postgres' },
|
|
789
845
|
{ flag: '--scope=<...>', desc: 'Limit to project | machine | all (default: all)' },
|
|
790
846
|
],
|
|
791
847
|
},
|
|
@@ -835,7 +891,16 @@ export const CLI_COMMANDS = [
|
|
|
835
891
|
category: 'Advanced',
|
|
836
892
|
core: false,
|
|
837
893
|
description: 'Embed mode management',
|
|
838
|
-
usage: 'construct embed start|stop|status',
|
|
894
|
+
usage: 'construct embed start|stop|status|list|enable|disable|dry-run',
|
|
895
|
+
subcommands: [
|
|
896
|
+
{ name: 'start', desc: 'Fork the detached embed daemon' },
|
|
897
|
+
{ name: 'stop', desc: 'Stop the running embed daemon' },
|
|
898
|
+
{ name: 'status [<id>] [--json]', desc: 'Daemon status, or per-capability bindings/filter/runtime/last-tick with an id' },
|
|
899
|
+
{ name: 'list [--json]', desc: 'Available embed capabilities and per-project enabled state (ADR-0061)' },
|
|
900
|
+
{ name: 'enable <id>', desc: 'Enable an embed capability: validate and write .cx/embed/<id>.manifest.json' },
|
|
901
|
+
{ name: 'disable <id>', desc: 'Disable an embed capability (idempotent)' },
|
|
902
|
+
{ name: 'dry-run <id> [--json]', desc: 'Resolve the specialist→providers→filter→framework→authority→runtime chain; no side effects' },
|
|
903
|
+
],
|
|
839
904
|
},
|
|
840
905
|
{
|
|
841
906
|
name: 'backup',
|
|
@@ -957,7 +1022,19 @@ export const CLI_COMMANDS = [
|
|
|
957
1022
|
category: 'Advanced',
|
|
958
1023
|
core: false,
|
|
959
1024
|
description: 'Provider management',
|
|
960
|
-
usage: 'construct provider list|test',
|
|
1025
|
+
usage: 'construct provider list|status|health|validate|test|add|configure',
|
|
1026
|
+
subcommands: [
|
|
1027
|
+
{ name: 'list', desc: 'List all resolved providers with capabilities and health' },
|
|
1028
|
+
{ name: 'status [--json]', desc: 'Alias of list with breaker state, degradation, and active filter columns' },
|
|
1029
|
+
{ name: 'health [id] [--json]', desc: 'Run health probes; exits non-zero if any probe fails' },
|
|
1030
|
+
{ name: 'validate <path|id> [--strict] [--json]', desc: 'Validate a manifest file or provider id against the B1 schema' },
|
|
1031
|
+
{ name: 'info <id>', desc: 'Show a single provider\'s metadata and config schema' },
|
|
1032
|
+
{ name: 'test <id>', desc: 'Run one provider\'s health probe; exits non-zero on failure' },
|
|
1033
|
+
{ name: 'add <id> [--json]', desc: 'Scaffold instance config from the provider\'s configSchema defaults, persisted to .cx/providers/<id>.json' },
|
|
1034
|
+
{ name: 'configure <id> [--key.path value ...] [--json]', desc: 'Merge + validate instance config (incl. ADR-0060 filter block) against configSchema; rejects with the schema path on failure' },
|
|
1035
|
+
{ name: 'plugins <add|remove> <id> [<package>] [--global]', desc: 'Register or remove a plugin provider override' },
|
|
1036
|
+
{ name: 'new <name> [--capabilities=...]', desc: 'Scaffold a new provider module' },
|
|
1037
|
+
],
|
|
961
1038
|
},
|
|
962
1039
|
{
|
|
963
1040
|
name: 'auth:status',
|
|
@@ -967,6 +1044,20 @@ export const CLI_COMMANDS = [
|
|
|
967
1044
|
description: 'Check auth status',
|
|
968
1045
|
usage: 'construct auth:status',
|
|
969
1046
|
},
|
|
1047
|
+
{
|
|
1048
|
+
name: 'approvals',
|
|
1049
|
+
emoji: '✅',
|
|
1050
|
+
category: 'Core',
|
|
1051
|
+
core: true,
|
|
1052
|
+
description: 'Manage pending MCP tool approvals',
|
|
1053
|
+
usage: 'construct approvals list|approve|deny|status',
|
|
1054
|
+
subcommands: [
|
|
1055
|
+
{ name: 'list', desc: 'List pending approvals with tool name, requestedAt, requestedBy' },
|
|
1056
|
+
{ name: 'approve <id>', desc: 'Approve a pending approval by id' },
|
|
1057
|
+
{ name: 'deny <id> [--reason=...]', desc: 'Deny a pending approval by id' },
|
|
1058
|
+
{ name: 'status <id>', desc: 'Show the full status of a specific approval' },
|
|
1059
|
+
],
|
|
1060
|
+
},
|
|
970
1061
|
{
|
|
971
1062
|
name: 'tags',
|
|
972
1063
|
emoji: '🏷',
|
|
@@ -1133,7 +1224,7 @@ export const CLI_COMMANDS = [
|
|
|
1133
1224
|
{ name: 'lint:research', category: 'Internal', core: false, internal: true, description: 'Internal lint: research artifacts', usage: 'construct lint:research' },
|
|
1134
1225
|
{ name: 'lint:templates', category: 'Internal', core: false, internal: true, description: 'Internal lint: shipped templates', usage: 'construct lint:templates' },
|
|
1135
1226
|
{ name: 'lint:prompts', category: 'Internal', core: false, internal: true, description: 'Internal lint: specialist prompt frontmatter + sections', usage: 'construct lint:prompts' },
|
|
1136
|
-
{ name: 'specialist', category: 'Internal', core: false, internal: true, description: 'Maintainer tool: scaffold
|
|
1227
|
+
{ name: 'specialist', category: 'Internal', core: false, internal: true, description: 'Maintainer tool: scaffold/edit/lint built-in specialist prompts; `create --custom` scaffolds a user-authored specialist into .cx/org/ or ~/.construct/org/', usage: 'construct specialist <create|edit|lint> [--custom]' },
|
|
1137
1228
|
{ name: 'registry:status', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Dev: capability registry inspector', usage: 'construct registry:status [--json]' },
|
|
1138
1229
|
{ name: 'registry:validate', category: 'Internal', core: false, internal: true, surface: 'internal', strictFlags: true, description: 'Validate registry/capabilities.json against repo reality; --unified validates specialists/org (+ .cx overlay) invariants', usage: 'construct registry:validate [--json] [--unified]', options: [
|
|
1139
1230
|
{ flag: '--json', desc: 'Emit the validation report as JSON' },
|
|
@@ -1147,7 +1238,7 @@ export const CLI_COMMANDS = [
|
|
|
1147
1238
|
{ name: 'specialist:add', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Add a new specialist to a team', usage: 'construct specialist:add <specialist-id> --team <team-id>' },
|
|
1148
1239
|
{ name: 'specialist:remove', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Remove a specialist from the unified registry', usage: 'construct specialist:remove <specialist-id> [--force]' },
|
|
1149
1240
|
{ name: 'oracle', emoji: '🔮', category: 'Core', core: true, description: 'Oracle meta-controller — fleet health review and bounded-auto maintenance', usage: 'construct oracle start|status|review|pending|approve|gaps|reconcile' },
|
|
1150
|
-
{ name: 'matrix', category: 'Internal', core: false, internal: true, surface: 'internal', description: '
|
|
1241
|
+
{ name: 'matrix', category: 'Internal', core: false, internal: true, surface: 'internal', description: 'Deprecated alias of `construct graph` — living dependency graph', usage: 'construct matrix build|stat|query|validate <node-id> [--json]' },
|
|
1151
1242
|
{ 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]' },
|
|
1152
1243
|
{ name: 'rules', category: 'Diagnostics', core: false, internal: false, surface: 'thin-cli', description: 'Rule and hook reference telemetry rollup', usage: 'construct rules usage [--since=30d]' },
|
|
1153
1244
|
{ name: 'evaluator:rubrics', category: 'Internal', core: false, internal: true, description: 'Internal: list registered evaluator rubrics', usage: 'construct evaluator:rubrics' },
|
package/lib/comment-lint.mjs
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* lintFile(path) checks a single file. lintRepo({ rootDir, fix }) checks all
|
|
5
5
|
* scoped paths and optionally inserts stub headers for files missing one.
|
|
6
6
|
* Used by `construct lint:comments`, the comment-lint PostToolUse hook, and CI.
|
|
7
|
+
* Also enforces the future-state doc marker convention (construct-9oi4.15.3 /
|
|
8
|
+
* LMCP-O3): a guide/operations doc claiming a capability is "staged/
|
|
9
|
+
* experimental" or "not yet {implemented,active,shipped,supported}" must cite
|
|
10
|
+
* a construct-* bead id within two lines. And bans naming another project by
|
|
11
|
+
* name in a code comment (BANNED_EXTERNAL_PROJECTS) outside docs/decisions/**
|
|
12
|
+
* and docs/notes/**, where a prior-art comparison can carry a citation.
|
|
7
13
|
*/
|
|
8
14
|
|
|
9
15
|
import fs from 'node:fs';
|
|
@@ -202,11 +208,125 @@ const BANNED_ARTIFACT = [
|
|
|
202
208
|
},
|
|
203
209
|
];
|
|
204
210
|
|
|
211
|
+
// Future-state doc markers (construct-9oi4.15.3 / LMCP-O3): a guide or
|
|
212
|
+
// operations doc that tells the reader a capability is "staged/experimental"
|
|
213
|
+
// or "not yet {implemented,active,shipped,supported}" must cite a tracked
|
|
214
|
+
// construct-* bead within two lines, or the claim is unfalsifiable — nobody
|
|
215
|
+
// can check whether the gap is still open. Scope is guides/operations/README,
|
|
216
|
+
// matching where the M3 sweep (construct-9oi4.13.3) found and fixed its
|
|
217
|
+
// contradictions. ADRs/RFCs carry their own Status/Tracking header convention
|
|
218
|
+
// and docs/notes/research/** are working notes, not shipped-behavior claims —
|
|
219
|
+
// both excluded. hooks-deprecated.md is excluded: it is a self-governing
|
|
220
|
+
// ledger of removed hooks (checked separately by `construct doctor`), not a
|
|
221
|
+
// forward-looking capability claim.
|
|
222
|
+
|
|
223
|
+
const FUTURE_STATE_DOC_INCLUDE = [
|
|
224
|
+
/^docs\/guides\//,
|
|
225
|
+
/^docs\/operations\//,
|
|
226
|
+
/^docs\/README\.md$/,
|
|
227
|
+
];
|
|
228
|
+
|
|
229
|
+
const FUTURE_STATE_DOC_EXCLUDE = [
|
|
230
|
+
/^docs\/guides\/reference\/hooks-deprecated\.md$/,
|
|
231
|
+
];
|
|
232
|
+
|
|
233
|
+
function isFutureStateDocPath(rel) {
|
|
234
|
+
return FUTURE_STATE_DOC_INCLUDE.some((r) => r.test(rel)) && !FUTURE_STATE_DOC_EXCLUDE.some((r) => r.test(rel));
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const FUTURE_STATE_MARKERS = [
|
|
238
|
+
/\bstaged\/experimental\b/i,
|
|
239
|
+
/\bnot\s+yet\s+(?:implemented|active|shipped|supported)\b/i,
|
|
240
|
+
/\bplanned[;:—-]+\s*not\s+(?:yet\s+)?implemented\b/i,
|
|
241
|
+
];
|
|
242
|
+
|
|
243
|
+
const BEAD_ID_RE = /\bconstruct-[a-z0-9]+(?:\.[a-z0-9]+)*\b/i;
|
|
244
|
+
|
|
245
|
+
function hasBeadIdNearby(lines, idx) {
|
|
246
|
+
const lo = Math.max(0, idx - 2);
|
|
247
|
+
const hi = Math.min(lines.length, idx + 3);
|
|
248
|
+
for (let i = lo; i < hi; i++) {
|
|
249
|
+
if (BEAD_ID_RE.test(lines[i])) return true;
|
|
250
|
+
}
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function checkFutureStateMarkers(content, rel) {
|
|
255
|
+
if (!isFutureStateDocPath(rel)) return [];
|
|
256
|
+
const lines = content.split('\n');
|
|
257
|
+
const skip = buildSkipMap(lines);
|
|
258
|
+
const violations = [];
|
|
259
|
+
for (let i = 0; i < lines.length; i++) {
|
|
260
|
+
if (skip[i]) continue;
|
|
261
|
+
if (lines[i].includes('construct-lint-ignore')) continue;
|
|
262
|
+
for (const pattern of FUTURE_STATE_MARKERS) {
|
|
263
|
+
if (pattern.test(lines[i]) && !hasBeadIdNearby(lines, i)) {
|
|
264
|
+
violations.push({
|
|
265
|
+
line: i + 1,
|
|
266
|
+
label: 'future-state doc marker ("staged/experimental" / "not yet implemented" / "planned — not implemented") has no construct-* bead id within 2 lines (rules/common/no-fabrication.md)',
|
|
267
|
+
kind: 'artifact',
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return violations;
|
|
273
|
+
}
|
|
274
|
+
|
|
205
275
|
function isBannedCheckSkipped(filePath) {
|
|
206
276
|
if (!filePath) return false;
|
|
207
277
|
return BANNED_CHECK_SKIP.some((suffix) => filePath.endsWith(suffix));
|
|
208
278
|
}
|
|
209
279
|
|
|
280
|
+
// External project names named in a code comment read as an unverifiable
|
|
281
|
+
// comparison — no-fabrication requires prior-art comparisons carry a citation,
|
|
282
|
+
// and only a decision document carries one. docs/decisions/** and docs/notes/**
|
|
283
|
+
// are that citation-bearing exception; every other comment in the repo
|
|
284
|
+
// describes this codebase's own behavior. A variant of CMT excludes the `//`
|
|
285
|
+
// in a URL scheme (`https://…`) so a cited reference link doesn't misread as
|
|
286
|
+
// a comment marker — this check runs on markdown prose too, unlike the other
|
|
287
|
+
// BANNED entries above, so citation URLs are common in its input.
|
|
288
|
+
|
|
289
|
+
const BANNED_EXTERNAL_PROJECTS = ['CrewAI', 'LangGraph', 'AutoGen', 'LangChain', 'MetaGPT', 'Aider', 'Devin'];
|
|
290
|
+
|
|
291
|
+
const EXTERNAL_PROJECT_CMT = '(?:(?<!:)\\/\\/|^\\s*\\*(?!\\/))';
|
|
292
|
+
|
|
293
|
+
const EXTERNAL_PROJECT_NAME_RE = new RegExp(
|
|
294
|
+
`${EXTERNAL_PROJECT_CMT}.*\\b(?:${BANNED_EXTERNAL_PROJECTS.join('|')})\\b`,
|
|
295
|
+
'i',
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
const EXTERNAL_PROJECT_EXEMPT_GLOBS = [
|
|
299
|
+
/^docs\/decisions\//,
|
|
300
|
+
/^docs\/notes\//,
|
|
301
|
+
];
|
|
302
|
+
|
|
303
|
+
function isExternalProjectExempt(rel) {
|
|
304
|
+
return EXTERNAL_PROJECT_EXEMPT_GLOBS.some((r) => r.test(rel));
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function checkExternalProjectNames(content, filePath, rel) {
|
|
308
|
+
if (isBannedCheckSkipped(filePath)) return [];
|
|
309
|
+
if (isExternalProjectExempt(rel)) return [];
|
|
310
|
+
|
|
311
|
+
// Same JS/TS comment-convention scope as checkBanned: the "// " / " * "
|
|
312
|
+
// detection matches markdown's own "**bold**"/"* bullet" syntax as a
|
|
313
|
+
// false positive, so markdown/MDX prose is out of scope for this check.
|
|
314
|
+
if (filePath && ['.md', '.mdx'].includes(path.extname(filePath))) return [];
|
|
315
|
+
const lines = content.split('\n');
|
|
316
|
+
const violations = [];
|
|
317
|
+
for (let i = 0; i < lines.length; i++) {
|
|
318
|
+
if (lines[i].includes('construct-lint-ignore')) continue;
|
|
319
|
+
if (EXTERNAL_PROJECT_NAME_RE.test(lines[i])) {
|
|
320
|
+
violations.push({
|
|
321
|
+
line: i + 1,
|
|
322
|
+
label: 'external project name in a code comment — prior-art comparisons belong in docs/decisions or docs/notes with citations (rules/common/comments.md)',
|
|
323
|
+
kind: 'artifact',
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return violations;
|
|
328
|
+
}
|
|
329
|
+
|
|
210
330
|
// Track fenced code blocks ( ``` … ``` ) and YAML frontmatter ( --- … --- )
|
|
211
331
|
// so artifact-prose patterns inside code or metadata are not flagged.
|
|
212
332
|
function buildSkipMap(lines) {
|
|
@@ -327,11 +447,8 @@ function checkArtifactBanned(content, rel) {
|
|
|
327
447
|
// path and must never throw on a missing or malformed registry file.
|
|
328
448
|
|
|
329
449
|
export const KNOWN_CX_ROLE_IDS = [
|
|
330
|
-
'
|
|
331
|
-
'
|
|
332
|
-
'evaluator', 'explorer', 'legal-compliance', 'operations', 'oracle', 'orchestrator',
|
|
333
|
-
'platform-engineer', 'product-manager', 'qa', 'rd-lead', 'release-manager', 'researcher',
|
|
334
|
-
'reviewer', 'security', 'sre', 'test-automation', 'trace-reviewer', 'ux-researcher',
|
|
450
|
+
'architect', 'data-analyst', 'debugger', 'designer', 'engineer', 'operations',
|
|
451
|
+
'orchestrator', 'product-manager', 'qa', 'researcher', 'reviewer', 'security',
|
|
335
452
|
];
|
|
336
453
|
|
|
337
454
|
const CX_ROLE_LEAK = new RegExp(
|
|
@@ -392,8 +509,8 @@ function findToolIdentityLeaks(content) {
|
|
|
392
509
|
function checkBanned(content, filePath) {
|
|
393
510
|
if (isBannedCheckSkipped(filePath)) return [];
|
|
394
511
|
|
|
395
|
-
// Banned patterns are JS/TS comment conventions — they don't apply to markdown prose.
|
|
396
|
-
if (filePath && path.extname(filePath)
|
|
512
|
+
// Banned patterns are JS/TS comment conventions — they don't apply to markdown/MDX prose.
|
|
513
|
+
if (filePath && ['.md', '.mdx'].includes(path.extname(filePath))) return [];
|
|
397
514
|
|
|
398
515
|
const warnings = [];
|
|
399
516
|
const lines = content.split('\n');
|
|
@@ -465,6 +582,8 @@ export function lintFile(filePath, { rootDir = process.cwd(), fix = false } = {}
|
|
|
465
582
|
// the finding.
|
|
466
583
|
const artifactHits = checkArtifactBanned(content, rel);
|
|
467
584
|
if (isArtifactPath(rel)) artifactHits.push(...findDanglingCitations(content, { rootDir }));
|
|
585
|
+
artifactHits.push(...checkFutureStateMarkers(content, rel));
|
|
586
|
+
artifactHits.push(...checkExternalProjectNames(content, filePath, rel));
|
|
468
587
|
if (artifactHits.length > 0) {
|
|
469
588
|
const mode = process.env.CONSTRUCT_ARTIFACT_LINT_MODE || 'warn';
|
|
470
589
|
const bucket = mode === 'block' ? errors : warnings;
|
|
@@ -514,7 +633,7 @@ export function lintRepo({ rootDir = process.cwd(), fix = false } = {}) {
|
|
|
514
633
|
const rel = relPath(rootDir, f);
|
|
515
634
|
const { required } = requiresHeader(rel);
|
|
516
635
|
const ext = path.extname(f);
|
|
517
|
-
if (!required && !['.mjs', '.md', '.sh'].includes(ext)) continue;
|
|
636
|
+
if (!required && !['.mjs', '.md', '.mdx', '.sh'].includes(ext)) continue;
|
|
518
637
|
const result = lintFile(f, { rootDir, fix });
|
|
519
638
|
if (result.errors.length || result.warnings.length) results.push(result);
|
|
520
639
|
}
|
package/lib/config/schema.mjs
CHANGED
|
@@ -23,15 +23,14 @@ export const DEPLOYMENT_MODES = ['solo', 'team', 'enterprise'];
|
|
|
23
23
|
export const MCP_BROKER_VALUES = ['auto', 'on', 'off'];
|
|
24
24
|
export const DEFAULT_SCOPE_ID = 'rnd';
|
|
25
25
|
|
|
26
|
-
export const SURFACES = ['claude', 'opencode', 'codex', 'copilot', 'vscode', 'cursor'];
|
|
27
|
-
|
|
28
26
|
export const INGEST_STRATEGIES = ['adapter', 'provider', 'docling-remote'];
|
|
29
27
|
export const INGEST_FALLBACKS = ['none', 'provider', 'adapter'];
|
|
30
28
|
export const INGEST_ORCHESTRATIONS = ['prompt-only', 'orchestrated'];
|
|
31
29
|
|
|
32
|
-
export const ORCHESTRATION_WORKER_BACKENDS = ['inline', 'provider'];
|
|
30
|
+
export const ORCHESTRATION_WORKER_BACKENDS = ['inline', 'provider', 'host'];
|
|
33
31
|
export const ORCHESTRATION_STORES = ['filesystem', 'sqlite', 'postgres'];
|
|
34
32
|
export const CHAIN_OF_THOUGHT_MODES = ['hidden', 'surface', 'telemetry_only'];
|
|
33
|
+
export const ORCHESTRATION_HOST_EXECUTION_MODES = ['auto', 'pickup', 'sampling'];
|
|
35
34
|
|
|
36
35
|
// SessionStart context routing. `auto` keeps the rich payload on stdout for
|
|
37
36
|
// interactive sessions and suppresses it (to a debug log) for non-interactive /
|
|
@@ -70,6 +69,7 @@ export const DEFAULT_PROJECT_CONFIG = Object.freeze({
|
|
|
70
69
|
workerBackend: 'inline',
|
|
71
70
|
store: 'filesystem',
|
|
72
71
|
chainOfThought: 'hidden',
|
|
72
|
+
hostExecution: 'auto',
|
|
73
73
|
}),
|
|
74
74
|
telemetry: Object.freeze({
|
|
75
75
|
enabled: true,
|
|
@@ -89,12 +89,6 @@ export const DEFAULT_PROJECT_CONFIG = Object.freeze({
|
|
|
89
89
|
maxLiveFree: 24,
|
|
90
90
|
}),
|
|
91
91
|
}),
|
|
92
|
-
roleSelection: Object.freeze({
|
|
93
|
-
primary: null,
|
|
94
|
-
secondary: null,
|
|
95
|
-
perConversationOverride: true,
|
|
96
|
-
}),
|
|
97
|
-
hosts: Object.freeze(Object.fromEntries(SURFACES.map((s) => [s, Object.freeze({ enabled: true })]))),
|
|
98
92
|
resources: Object.freeze({
|
|
99
93
|
disk: Object.freeze({
|
|
100
94
|
tracesMaxDays: 30,
|
|
@@ -109,6 +103,8 @@ export const DEFAULT_PROJECT_CONFIG = Object.freeze({
|
|
|
109
103
|
handoffsMaxDays: 30,
|
|
110
104
|
handoffsMaxItems: 50,
|
|
111
105
|
totalCxMaxMb: 2000,
|
|
106
|
+
observationsMaxDays: 90,
|
|
107
|
+
observationsMaxRows: 5000,
|
|
112
108
|
}),
|
|
113
109
|
process: Object.freeze({
|
|
114
110
|
embedDaemonMaxRssMb: 800,
|
|
@@ -174,6 +170,7 @@ export const FIELD_RULES = {
|
|
|
174
170
|
workerBackend: { type: 'string', enum: ORCHESTRATION_WORKER_BACKENDS },
|
|
175
171
|
store: { type: 'string', enum: ORCHESTRATION_STORES },
|
|
176
172
|
chainOfThought: { type: 'string', enum: CHAIN_OF_THOUGHT_MODES },
|
|
173
|
+
hostExecution: { type: 'string', enum: ORCHESTRATION_HOST_EXECUTION_MODES },
|
|
177
174
|
},
|
|
178
175
|
},
|
|
179
176
|
telemetry: {
|
|
@@ -190,27 +187,7 @@ export const FIELD_RULES = {
|
|
|
190
187
|
outputMode: { type: 'string', enum: HOOK_OUTPUT_MODES },
|
|
191
188
|
},
|
|
192
189
|
},
|
|
193
|
-
roleSelection: {
|
|
194
|
-
type: 'object',
|
|
195
|
-
required: false,
|
|
196
|
-
fields: {
|
|
197
|
-
primary: { type: ['string', 'null'], maxLength: 50 },
|
|
198
|
-
secondary: { type: ['string', 'null'], maxLength: 50 },
|
|
199
|
-
perConversationOverride: { type: 'boolean' },
|
|
200
|
-
},
|
|
201
|
-
},
|
|
202
190
|
resources: { type: 'object', required: false },
|
|
203
|
-
hosts: {
|
|
204
|
-
type: 'object',
|
|
205
|
-
required: false,
|
|
206
|
-
fields: Object.fromEntries(SURFACES.map((s) => [s, {
|
|
207
|
-
type: 'object',
|
|
208
|
-
required: false,
|
|
209
|
-
fields: {
|
|
210
|
-
enabled: { type: 'boolean', required: false },
|
|
211
|
-
},
|
|
212
|
-
}])),
|
|
213
|
-
},
|
|
214
191
|
costs: {
|
|
215
192
|
type: 'object',
|
|
216
193
|
required: false,
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/config/source-target-registry.mjs — manifest-derived source-target descriptors.
|
|
3
|
+
*
|
|
4
|
+
* Loads the merged (builtin/user/project) extension manifests and collects each
|
|
5
|
+
* manifest's optional `sourceTarget` block into a descriptor keyed by the block's
|
|
6
|
+
* own `provider` field — the string used in construct.config.json's
|
|
7
|
+
* `sources.targets[].provider`, in legacy env-derived targets, and in embed
|
|
8
|
+
* source records. That key is distinct from the manifest `id` for providers
|
|
9
|
+
* whose manifest id differs from their config-facing provider name (the Jira
|
|
10
|
+
* manifest id is `atlassian-jira`; its sourceTarget.provider is `jira`).
|
|
11
|
+
*
|
|
12
|
+
* lib/config/source-targets.mjs and lib/embed/demand-fetch.mjs iterate these
|
|
13
|
+
* descriptors instead of naming providers directly, so adding a fifth
|
|
14
|
+
* source-target-eligible provider requires only a manifest with a
|
|
15
|
+
* `sourceTarget` block — no edits to either file. See each descriptor field
|
|
16
|
+
* for its consumer:
|
|
17
|
+
* selector / secondaryField — validateSourceTarget, normalizeConfigTarget
|
|
18
|
+
* signature — targetSignature
|
|
19
|
+
* legacyEnv — legacyEnvSourceTargets
|
|
20
|
+
* aliases — resolveKnownSourcesFromTargets
|
|
21
|
+
* embed — targetsToEmbedSources
|
|
22
|
+
* embedFilters — targetsToEmbedSourcesWithFilters
|
|
23
|
+
* demandFetch.target* — lib/embed/demand-fetch.mjs buildReadCallsForTarget
|
|
24
|
+
* demandFetch.query* — lib/embed/demand-fetch.mjs buildReadCalls
|
|
25
|
+
*
|
|
26
|
+
* Computed once at module load (mirrors the BUILT_INS pattern in
|
|
27
|
+
* lib/providers/registry.mjs) using the default rootDir (process.cwd()).
|
|
28
|
+
* Callers that need a project-tier-aware view for a different rootDir should
|
|
29
|
+
* call loadSourceTargetDescriptors(rootDir) directly.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import { loadManifestsFromDir, mergeManifests, resolveManifestDirs } from '../extensions/loader.mjs';
|
|
33
|
+
|
|
34
|
+
export function loadSourceTargetDescriptors(rootDir = process.cwd()) {
|
|
35
|
+
const { builtin, user, project } = resolveManifestDirs({ rootDir });
|
|
36
|
+
const { manifests: builtinManifests } = loadManifestsFromDir(builtin);
|
|
37
|
+
const { manifests: userManifests } = loadManifestsFromDir(user);
|
|
38
|
+
const { manifests: projectManifests } = loadManifestsFromDir(project);
|
|
39
|
+
const merged = mergeManifests(builtinManifests, userManifests, projectManifests);
|
|
40
|
+
|
|
41
|
+
const byProvider = new Map();
|
|
42
|
+
for (const manifest of merged) {
|
|
43
|
+
const descriptor = manifest.sourceTarget;
|
|
44
|
+
if (!descriptor || typeof descriptor !== 'object' || !descriptor.provider) continue;
|
|
45
|
+
byProvider.set(descriptor.provider, descriptor);
|
|
46
|
+
}
|
|
47
|
+
return byProvider;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const DESCRIPTORS = loadSourceTargetDescriptors();
|
|
51
|
+
|
|
52
|
+
export const SOURCE_TARGET_PROVIDERS = Object.freeze([...DESCRIPTORS.keys()]);
|
|
53
|
+
|
|
54
|
+
export function getSourceTargetDescriptor(provider) {
|
|
55
|
+
return DESCRIPTORS.get(provider) ?? null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function listSourceTargetDescriptors() {
|
|
59
|
+
return [...DESCRIPTORS.values()];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Fill a descriptor string template's `{name}` placeholders from `vars`.
|
|
64
|
+
* Shared by lib/config/source-targets.mjs (signatures) and
|
|
65
|
+
* lib/embed/demand-fetch.mjs (JQL construction) so both consume the same
|
|
66
|
+
* placeholder syntax the manifests declare.
|
|
67
|
+
*/
|
|
68
|
+
export function renderTemplate(template, vars) {
|
|
69
|
+
return template.replace(/\{(\w+)\}/g, (_, key) => (key in vars ? String(vars[key]) : ''));
|
|
70
|
+
}
|