@geraldmaron/construct 1.4.2 → 1.5.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/.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 +55 -38
- 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 +261 -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 +103 -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
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
* lib/embed/providers/registry.mjs — ProviderRegistry.
|
|
3
3
|
*
|
|
4
4
|
* Holds named provider instances and exposes an async factory that builds
|
|
5
|
-
* the standard set from
|
|
5
|
+
* the standard set from the unified extension manifest registry (LMCP-B1,
|
|
6
|
+
* lib/extensions/*) rather than a second, hardcoded env-var table. Each
|
|
7
|
+
* embed-mode provider implements:
|
|
6
8
|
*
|
|
7
9
|
* read(ref, opts) → Promise<Item[]>
|
|
8
10
|
* ref: source-type string e.g. 'prs', 'issues', 'commits', 'messages'
|
|
@@ -11,11 +13,106 @@
|
|
|
11
13
|
* write(action) → Promise<void> (optional — only mutation providers)
|
|
12
14
|
* action: { type, channel?, text?, … }
|
|
13
15
|
*
|
|
16
|
+
* `fromEnv()` reads the merged builtin/user/project manifest tiers, keeps
|
|
17
|
+
* only `kind: 'data-source'` manifests that declare the `read` capability
|
|
18
|
+
* and have a registered embed adapter (ADAPTERS below), and gates each on
|
|
19
|
+
* the credential predicate declared next to that adapter. A manifest with
|
|
20
|
+
* no adapter entry, or whose credential predicate fails, is never silently
|
|
21
|
+
* dropped: `fromEnv()` also returns the unavailable set with a reason so
|
|
22
|
+
* callers (construct status, `describe()`) can surface "configured but
|
|
23
|
+
* unavailable" instead of a provider that appears to simply not exist.
|
|
24
|
+
*
|
|
14
25
|
* Providers are registered by name and can be swapped for test doubles.
|
|
15
26
|
*/
|
|
16
27
|
|
|
28
|
+
import { loadManifestsFromDir, mergeManifests, resolveManifestDirs } from '../../extensions/loader.mjs';
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Registered embed adapters keyed by unified-manifest id. Each entry names
|
|
32
|
+
* the module to dynamically import, the aliases to register the instance
|
|
33
|
+
* under, how to build the constructor options from env, and a credential
|
|
34
|
+
* predicate over the manifest's own `secretEnvKeys` — so "is this provider
|
|
35
|
+
* usable" is derived from the manifest's declared keys, not re-hardcoded.
|
|
36
|
+
*
|
|
37
|
+
* `credentials` is one of:
|
|
38
|
+
* { anyOf: [...] } — usable if at least one listed env var is set (GitHub)
|
|
39
|
+
* { allOf: [...] } — usable only if every listed env var is set (Jira)
|
|
40
|
+
*/
|
|
41
|
+
const ADAPTERS = {
|
|
42
|
+
github: {
|
|
43
|
+
aliases: ['github', 'gh'],
|
|
44
|
+
credentials: { anyOf: ['GITHUB_TOKEN', 'GITHUB_PERSONAL_ACCESS_TOKEN', 'GH_TOKEN'] },
|
|
45
|
+
load: () => import('./github.mjs'),
|
|
46
|
+
build: (mod, env) => new mod.GitHubProvider({
|
|
47
|
+
token: env.GITHUB_TOKEN || env.GITHUB_PERSONAL_ACCESS_TOKEN || env.GH_TOKEN,
|
|
48
|
+
}),
|
|
49
|
+
},
|
|
50
|
+
slack: {
|
|
51
|
+
aliases: ['slack'],
|
|
52
|
+
credentials: { anyOf: ['SLACK_BOT_TOKEN'] },
|
|
53
|
+
load: () => import('./slack.mjs'),
|
|
54
|
+
build: (mod, env) => new mod.SlackProvider({
|
|
55
|
+
token: env.SLACK_BOT_TOKEN,
|
|
56
|
+
teamId: env.SLACK_TEAM_ID,
|
|
57
|
+
}),
|
|
58
|
+
},
|
|
59
|
+
linear: {
|
|
60
|
+
aliases: ['linear'],
|
|
61
|
+
credentials: { anyOf: ['LINEAR_API_KEY'] },
|
|
62
|
+
load: () => import('./linear.mjs'),
|
|
63
|
+
build: (mod, env) => new mod.LinearProvider({
|
|
64
|
+
apiKey: env.LINEAR_API_KEY,
|
|
65
|
+
}),
|
|
66
|
+
},
|
|
67
|
+
'atlassian-jira': {
|
|
68
|
+
aliases: ['jira', 'atlassian'],
|
|
69
|
+
credentials: { allOf: ['JIRA_BASE_URL', 'JIRA_EMAIL', 'JIRA_API_TOKEN'] },
|
|
70
|
+
load: () => import('./jira.mjs'),
|
|
71
|
+
build: (mod, env) => new mod.JiraProvider({
|
|
72
|
+
baseUrl: env.JIRA_BASE_URL,
|
|
73
|
+
email: env.JIRA_EMAIL,
|
|
74
|
+
token: env.JIRA_API_TOKEN,
|
|
75
|
+
}),
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
function credentialStatus(predicate, env) {
|
|
80
|
+
if (!predicate) return { ok: true, missing: [] };
|
|
81
|
+
if (predicate.anyOf) {
|
|
82
|
+
const ok = predicate.anyOf.some((key) => !!env[key]);
|
|
83
|
+
return { ok, missing: ok ? [] : predicate.anyOf };
|
|
84
|
+
}
|
|
85
|
+
if (predicate.allOf) {
|
|
86
|
+
const missing = predicate.allOf.filter((key) => !env[key]);
|
|
87
|
+
return { ok: missing.length === 0, missing };
|
|
88
|
+
}
|
|
89
|
+
return { ok: true, missing: [] };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Load the merged data-source manifests (builtin < user < project tiers)
|
|
94
|
+
* that also carry a registered embed adapter. Manifests for kinds embed
|
|
95
|
+
* mode cannot use (e.g. ingestion-provider) are excluded here rather than
|
|
96
|
+
* downstream, so every caller of this helper sees the same candidate set.
|
|
97
|
+
*/
|
|
98
|
+
function candidateManifests(rootDir) {
|
|
99
|
+
const { builtin, user, project } = resolveManifestDirs({ rootDir });
|
|
100
|
+
const { manifests: builtinManifests } = loadManifestsFromDir(builtin);
|
|
101
|
+
const { manifests: userManifests } = loadManifestsFromDir(user);
|
|
102
|
+
const { manifests: projectManifests } = loadManifestsFromDir(project);
|
|
103
|
+
const merged = mergeManifests(builtinManifests, userManifests, projectManifests);
|
|
104
|
+
|
|
105
|
+
return merged.filter((m) => (
|
|
106
|
+
m.kind === 'data-source' &&
|
|
107
|
+
Array.isArray(m.capabilities) &&
|
|
108
|
+
m.capabilities.includes('read') &&
|
|
109
|
+
Object.prototype.hasOwnProperty.call(ADAPTERS, m.id)
|
|
110
|
+
));
|
|
111
|
+
}
|
|
112
|
+
|
|
17
113
|
export class ProviderRegistry {
|
|
18
114
|
#providers = new Map();
|
|
115
|
+
#unavailable = [];
|
|
19
116
|
|
|
20
117
|
/**
|
|
21
118
|
* Register a provider under one or more names.
|
|
@@ -68,46 +165,56 @@ export class ProviderRegistry {
|
|
|
68
165
|
}
|
|
69
166
|
|
|
70
167
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
168
|
+
* Manifest-declared data-source providers this registry knows about but
|
|
169
|
+
* did not register — each entry names why, so status surfaces render
|
|
170
|
+
* "configured but unavailable" instead of the provider vanishing.
|
|
171
|
+
* @returns {{ id: string, displayName: string, reason: string }[]}
|
|
172
|
+
*/
|
|
173
|
+
unavailable() {
|
|
174
|
+
return this.#unavailable;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Build a registry pre-populated with every unified-registry data-source
|
|
179
|
+
* manifest (LMCP-B1, lib/extensions/*) that declares the `read` capability
|
|
180
|
+
* and has a registered embed adapter, gated on that adapter's credential
|
|
181
|
+
* predicate. Providers whose required credentials are absent are not
|
|
182
|
+
* registered but are recorded in `unavailable()` with a reason — callers
|
|
183
|
+
* get an explicit "configured but unavailable" signal rather than a
|
|
184
|
+
* provider that silently doesn't exist.
|
|
75
185
|
*
|
|
76
186
|
* @param {object} env - Merged environment (loadConstructEnv output)
|
|
187
|
+
* @param {object} [opts]
|
|
188
|
+
* @param {string} [opts.rootDir] - Project root for project-tier manifests
|
|
77
189
|
* @returns {Promise<ProviderRegistry>}
|
|
78
190
|
*/
|
|
79
|
-
static async fromEnv(env = process.env) {
|
|
191
|
+
static async fromEnv(env = process.env, { rootDir = process.cwd() } = {}) {
|
|
80
192
|
const registry = new ProviderRegistry();
|
|
81
193
|
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
token: env.GITHUB_TOKEN || env.GITHUB_PERSONAL_ACCESS_TOKEN,
|
|
86
|
-
}));
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (env.SLACK_BOT_TOKEN) {
|
|
90
|
-
const { SlackProvider } = await import('./slack.mjs');
|
|
91
|
-
registry.register(['slack'], new SlackProvider({
|
|
92
|
-
token: env.SLACK_BOT_TOKEN,
|
|
93
|
-
teamId: env.SLACK_TEAM_ID,
|
|
94
|
-
}));
|
|
95
|
-
}
|
|
194
|
+
for (const manifest of candidateManifests(rootDir)) {
|
|
195
|
+
const adapter = ADAPTERS[manifest.id];
|
|
196
|
+
const { ok, missing } = credentialStatus(adapter.credentials, env);
|
|
96
197
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
198
|
+
if (!ok) {
|
|
199
|
+
registry.#unavailable.push({
|
|
200
|
+
id: manifest.id,
|
|
201
|
+
displayName: manifest.id,
|
|
202
|
+
reason: `missing credentials: ${missing.join(', ')}`,
|
|
203
|
+
});
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
103
206
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
207
|
+
try {
|
|
208
|
+
const mod = await adapter.load();
|
|
209
|
+
const instance = adapter.build(mod, env);
|
|
210
|
+
registry.register(adapter.aliases, instance);
|
|
211
|
+
} catch (err) {
|
|
212
|
+
registry.#unavailable.push({
|
|
213
|
+
id: manifest.id,
|
|
214
|
+
displayName: manifest.id,
|
|
215
|
+
reason: `adapter failed to load: ${err.message}`,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
111
218
|
}
|
|
112
219
|
|
|
113
220
|
return registry;
|
|
@@ -100,6 +100,10 @@ function buildModels(env) {
|
|
|
100
100
|
local: f.local,
|
|
101
101
|
requiresEnv: f.requiresEnv,
|
|
102
102
|
configured: f.configured,
|
|
103
|
+
// `configured` is a presence check (env/op:// ref/CLI session found), not proof
|
|
104
|
+
// the credential authenticates — deep verification is the opt-in provider probe
|
|
105
|
+
// (construct doctor --probe-providers / orchestrate preflight --probe).
|
|
106
|
+
configuredBasis: 'presence',
|
|
103
107
|
healthStatus: 'unknown',
|
|
104
108
|
}));
|
|
105
109
|
const tiers = resolveModelTiers({ env });
|
|
@@ -162,7 +162,7 @@ export function resolveExecution(request = {}, { env = process.env, cwd = proces
|
|
|
162
162
|
let degradationReason = null;
|
|
163
163
|
if (!orchestrationAvailable) {
|
|
164
164
|
degraded = true;
|
|
165
|
-
degradationReason = `Model could not be resolved; orchestration requires a runnable model — ${modelResolution.error?.reason || 'no model available'}.`;
|
|
165
|
+
degradationReason = `Model could not be resolved; orchestration requires a runnable model — ${(modelResolution.error?.reason || 'no model available').replace(/\.$/, '')}.`;
|
|
166
166
|
} else if (requestedStrategy === 'orchestrated') {
|
|
167
167
|
degraded = true;
|
|
168
168
|
degradationReason = `Orchestration was requested but no orchestration plan is available${workflowType ? ` for workflowType "${workflowType}"` : ''}.`;
|
|
@@ -15,7 +15,14 @@
|
|
|
15
15
|
* claims provider health it cannot verify (`healthStatus` defaults to unknown).
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
defaultModelRegistryPath,
|
|
20
|
+
describeModelFamily,
|
|
21
|
+
formatModelResolutionNotices,
|
|
22
|
+
isModelAvailable,
|
|
23
|
+
listModelFamilies,
|
|
24
|
+
resolveValidatedModel,
|
|
25
|
+
} from '../model-router.mjs';
|
|
19
26
|
import { resolveModelTiers } from '../model-registry.mjs';
|
|
20
27
|
import { resolveProviderCapabilitiesSync } from '../provider-capabilities.js';
|
|
21
28
|
|
|
@@ -158,9 +165,24 @@ export function resolveEmbeddedModel(request = {}, { env = process.env, registry
|
|
|
158
165
|
});
|
|
159
166
|
}
|
|
160
167
|
|
|
161
|
-
const tiers = resolveModelTiers({ env, registryPath });
|
|
168
|
+
const tiers = resolveModelTiers({ env, registryPath: registryPath ?? defaultModelRegistryPath(env) });
|
|
162
169
|
const defaultModel = tiers.models[tier];
|
|
163
170
|
if (defaultModel) {
|
|
171
|
+
// The env/registry tier pin is a preference, not blind truth: validate it
|
|
172
|
+
// against the retired-slug denylist and provider-configured catalog before
|
|
173
|
+
// emitting it, so a stale pin (e.g. a retired Anthropic slug) surfaces a
|
|
174
|
+
// named warning instead of resolving silently (construct-uccl.4). Route
|
|
175
|
+
// through resolveValidatedModel so a rejected pin also surfaces a
|
|
176
|
+
// catalog-wide recommended replacement, not just the rejection notice.
|
|
177
|
+
const validation = isModelAvailable(defaultModel, { env, strictPin: true });
|
|
178
|
+
if (!validation.ok) {
|
|
179
|
+
const validated = resolveValidatedModel({ env, requested: defaultModel });
|
|
180
|
+
for (const notice of validated.notices) warnings.push(notice);
|
|
181
|
+
if (!validated.notices.length) {
|
|
182
|
+
for (const notice of formatModelResolutionNotices({ rejected: validation })) warnings.push(notice);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
164
186
|
const fallbackReason = hadHostContext
|
|
165
187
|
? 'Host context could not be honored within its family; used the Construct tier default after cross-provider fallback was permitted.'
|
|
166
188
|
: 'No host context supplied; used the Construct tier default.';
|
|
@@ -178,10 +200,38 @@ export function resolveEmbeddedModel(request = {}, { env = process.env, registry
|
|
|
178
200
|
});
|
|
179
201
|
}
|
|
180
202
|
|
|
203
|
+
// No pin resolved (env/registry tier-default came back empty). Before
|
|
204
|
+
// degrading, check whether ANY provider family has a credential configured
|
|
205
|
+
// and fall back to that family's tier default — the remediation on the
|
|
206
|
+
// config-error path ("configure a provider credential") is otherwise
|
|
207
|
+
// unfollowable, since this path never consulted credentials at all
|
|
208
|
+
// (construct-uccl.2). An explicit pin always wins over this fallback
|
|
209
|
+
// because it is only reached once resolveModelTiers found no pin.
|
|
210
|
+
const configuredFamily = listModelFamilies({ env, allowAmbient }).find((f) => f.configured && f.tiers[tier]);
|
|
211
|
+
if (configuredFamily) {
|
|
212
|
+
const model = configuredFamily.tiers[tier];
|
|
213
|
+
warnings.push(
|
|
214
|
+
`Model tier '${tier}' is unpinned; using ${model} from the ${configuredFamily.id} credential family. `
|
|
215
|
+
+ `Pin with CX_MODEL_${tier.toUpperCase()} to override.`,
|
|
216
|
+
);
|
|
217
|
+
return success({
|
|
218
|
+
selectedModel: model,
|
|
219
|
+
family: configuredFamily,
|
|
220
|
+
tier,
|
|
221
|
+
resolutionSource: 'credential-family-fallback',
|
|
222
|
+
fallbackReason: `No tier pin configured; resolved the ${tier} model from the ${configuredFamily.id} credential family.`,
|
|
223
|
+
tierSource: 'credential-family-fallback',
|
|
224
|
+
capabilities,
|
|
225
|
+
warnings,
|
|
226
|
+
env,
|
|
227
|
+
allowAmbient,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
|
|
181
231
|
return configError({
|
|
182
232
|
tier,
|
|
183
233
|
reason: `No model could be resolved for the ${tier} tier.`,
|
|
184
|
-
remediation:
|
|
234
|
+
remediation: `Set CX_MODEL_${tier.toUpperCase()}=<provider/model>, or configure a provider credential such as ANTHROPIC_API_KEY / OPENROUTER_API_KEY, then rerun`,
|
|
185
235
|
warnings,
|
|
186
236
|
});
|
|
187
237
|
}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* lib/embedded-contract/workflow-defs.mjs — embedded workflow type definitions.
|
|
3
3
|
*
|
|
4
|
+
* Generated/compat shim (LMCP-D2) — this module has no hand-authored catalog.
|
|
5
|
+
* DEFS is computed at import time exclusively from lib/workflows/loader.mjs
|
|
6
|
+
* (LMCP-D1), which reads builtin/pack/project *.manifest.json files. Editing a
|
|
7
|
+
* workflow means editing a manifest under lib/embedded-contract/workflows/ (or a
|
|
8
|
+
* pack/.cx manifest); this file cannot silently drift from them because it does
|
|
9
|
+
* not store data of its own. scripts/check-workflow-defs-drift.mjs enforces that
|
|
10
|
+
* invariant in CI — it fails if the source regains a hardcoded catalog entry or
|
|
11
|
+
* loses the loader import.
|
|
12
|
+
*
|
|
4
13
|
* The single source of truth for the workflow types an embedding application can
|
|
5
14
|
* invoke. Each definition names a default role chain (real registry role ids), a
|
|
6
15
|
* model tier, a default approval mode, an optional output-schema artifact, and a
|
|
@@ -8,80 +17,40 @@
|
|
|
8
17
|
* selected roles' declared skills (role-facts) so this file never names a skill
|
|
9
18
|
* id that does not exist. Capability discovery reads these definitions so the
|
|
10
19
|
* published workflow list cannot drift from what invocation actually supports.
|
|
20
|
+
*
|
|
21
|
+
* INTAKE_TO_WORKFLOW starts from a hand-authored base table (the mapping for
|
|
22
|
+
* the 11 builtin workflows) and is then extended by every loaded manifest's
|
|
23
|
+
* optional `intakeType` field (LMCP-D3) — a pack or project workflow
|
|
24
|
+
* contribution claims or remaps a classifier label by declaring `intakeType`
|
|
25
|
+
* in its manifest, with no edit to this file. Manifests are applied in
|
|
26
|
+
* `workflows` array order, which mirrors loader precedence (builtin, then
|
|
27
|
+
* pack, then project) for overridden ids and appends new project/pack ids
|
|
28
|
+
* last, so a project-contributed `intakeType` wins ties over the hardcoded
|
|
29
|
+
* base table.
|
|
11
30
|
*/
|
|
12
31
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
'prd-draft': {
|
|
29
|
-
tier: 'standard',
|
|
30
|
-
defaultApprovalMode: 'proposal-only',
|
|
31
|
-
chain: ['product-manager', 'architect'],
|
|
32
|
-
outputSchema: 'decision',
|
|
33
|
-
description: 'Draft a product requirements document from a problem statement and supporting evidence.',
|
|
34
|
-
},
|
|
35
|
-
'architecture-review': {
|
|
36
|
-
tier: 'reasoning',
|
|
37
|
-
defaultApprovalMode: 'requires-human-approval',
|
|
38
|
-
chain: ['architect', 'security', 'devil-advocate'],
|
|
39
|
-
outputSchema: 'review-report',
|
|
40
|
-
description: 'Review an architecture or design for trade-offs, failure modes, and security exposure.',
|
|
41
|
-
},
|
|
42
|
-
'risk-review': {
|
|
43
|
-
tier: 'reasoning',
|
|
44
|
-
defaultApprovalMode: 'requires-human-approval',
|
|
45
|
-
chain: ['devil-advocate', 'security', 'legal-compliance'],
|
|
46
|
-
outputSchema: 'review-report',
|
|
47
|
-
description: 'Stress-test a plan for risk: failure modes, security, and compliance exposure.',
|
|
48
|
-
},
|
|
49
|
-
'research-synthesis': {
|
|
50
|
-
tier: 'reasoning',
|
|
51
|
-
defaultApprovalMode: 'proposal-only',
|
|
52
|
-
chain: ['researcher', 'data-analyst', 'evaluator'],
|
|
53
|
-
outputSchema: null,
|
|
54
|
-
description: 'Synthesize multiple sources into a cited, evidence-graded research summary.',
|
|
55
|
-
},
|
|
56
|
-
'transcript-process': {
|
|
57
|
-
tier: 'fast',
|
|
58
|
-
defaultApprovalMode: 'proposal-only',
|
|
59
|
-
chain: ['researcher', 'data-analyst'],
|
|
60
|
-
outputSchema: null,
|
|
61
|
-
description: 'Process a meeting/call transcript into a summary, decisions, and action items.',
|
|
62
|
-
},
|
|
63
|
-
'data-structure': {
|
|
64
|
-
tier: 'standard',
|
|
65
|
-
defaultApprovalMode: 'proposal-only',
|
|
66
|
-
chain: ['data-analyst', 'data-engineer'],
|
|
67
|
-
outputSchema: null,
|
|
68
|
-
description: 'Parse, validate, and profile a raw dataset into a structured, described shape.',
|
|
69
|
-
},
|
|
70
|
-
'memo-draft': {
|
|
71
|
-
tier: 'fast',
|
|
72
|
-
defaultApprovalMode: 'proposal-only',
|
|
73
|
-
chain: ['docs-keeper', 'reviewer'],
|
|
74
|
-
outputSchema: null,
|
|
75
|
-
description: 'Draft a decision or status memo from a problem statement and context.',
|
|
76
|
-
},
|
|
77
|
-
'structure-notes': {
|
|
78
|
-
tier: 'fast',
|
|
79
|
-
defaultApprovalMode: 'proposal-only',
|
|
80
|
-
chain: ['orchestrator', 'researcher'],
|
|
32
|
+
import { loadAllWorkflows } from '../workflows/loader.mjs';
|
|
33
|
+
|
|
34
|
+
const { workflows } = loadAllWorkflows();
|
|
35
|
+
|
|
36
|
+
// Embed manifests are a workflow-manifest specialization (an embed capability,
|
|
37
|
+
// discovered by the embed-capability loader) — they carry an embed block, no
|
|
38
|
+
// executable role chain — so they are excluded from the invokable workflow-type
|
|
39
|
+
// catalog rather than surfaced as a chain-less workflow.
|
|
40
|
+
const DEFS = {};
|
|
41
|
+
for (const wf of workflows) {
|
|
42
|
+
if (wf.type === 'embed') continue;
|
|
43
|
+
DEFS[wf.id] = {
|
|
44
|
+
tier: wf.tier || 'standard',
|
|
45
|
+
defaultApprovalMode: wf.defaultApprovalMode,
|
|
46
|
+
chain: wf.roleChain || [],
|
|
81
47
|
outputSchema: null,
|
|
82
|
-
description:
|
|
83
|
-
}
|
|
84
|
-
|
|
48
|
+
description: wf.description || '',
|
|
49
|
+
};
|
|
50
|
+
if (wf.outputSchema?.artifact) {
|
|
51
|
+
DEFS[wf.id].outputSchema = wf.outputSchema.artifact;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
85
54
|
|
|
86
55
|
// Maps a classifier intakeType to the workflow type that would carry it out, so
|
|
87
56
|
// the triage contract can suggest a directly-invokable workflow. Returns null
|
|
@@ -106,6 +75,12 @@ const INTAKE_TO_WORKFLOW = {
|
|
|
106
75
|
unknown: 'structure-notes',
|
|
107
76
|
};
|
|
108
77
|
|
|
78
|
+
for (const wf of workflows) {
|
|
79
|
+
if (typeof wf.intakeType === 'string' && wf.intakeType) {
|
|
80
|
+
INTAKE_TO_WORKFLOW[wf.intakeType] = wf.id;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
109
84
|
export const WORKFLOW_TYPES = Object.keys(DEFS);
|
|
110
85
|
|
|
111
86
|
export function getWorkflowDef(type) {
|
|
@@ -117,9 +92,9 @@ export function getWorkflowDef(type) {
|
|
|
117
92
|
* @returns {Array<object>}
|
|
118
93
|
*/
|
|
119
94
|
export function listWorkflowDefs() {
|
|
120
|
-
return
|
|
95
|
+
return Object.entries(DEFS).map(([type, def]) => ({ type, ...def }));
|
|
121
96
|
}
|
|
122
97
|
|
|
123
98
|
export function workflowTypeForIntake(intakeType) {
|
|
124
99
|
return INTAKE_TO_WORKFLOW[intakeType] || null;
|
|
125
|
-
}
|
|
100
|
+
}
|