@geraldmaron/construct 1.2.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -10
- package/bin/construct +286 -220
- package/bin/construct-postinstall.mjs +0 -21
- package/commands/work/optimize-prompts.md +1 -1
- package/examples/distribution/sources/adr.md +2 -2
- package/examples/seed-observations/decisions.md +1 -1
- package/lib/artifact-loop-core.mjs +412 -0
- package/lib/artifact-manifest.mjs +6 -0
- package/lib/artifact-release-gate.mjs +115 -49
- package/lib/audit-rules.mjs +2 -4
- package/lib/audit-skills.mjs +32 -20
- package/lib/audit-specialists.mjs +44 -26
- package/lib/auto-docs.mjs +6 -5
- package/lib/brand-prose.mjs +3 -3
- package/lib/brand-tokens.mjs +2 -2
- package/lib/certification/artifact-fixtures.mjs +4 -1
- package/lib/certification/demo-parity.mjs +6 -32
- package/lib/certification/real-llm-scenarios.mjs +58 -13
- package/lib/certification/role-cards.mjs +7 -6
- package/lib/certification/role-overlays.mjs +4 -4
- package/lib/certification/runner.mjs +9 -2
- package/lib/certification/skill-inventory.mjs +34 -22
- package/lib/certification/skill-scenarios.mjs +21 -8
- package/lib/certification/specialist-contracts.mjs +4 -3
- package/lib/certification/specialist-scenarios.mjs +7 -6
- package/lib/certification/status.mjs +5 -4
- package/lib/cli-commands.mjs +56 -57
- package/lib/comment-lint.mjs +1 -5
- package/lib/completions.mjs +20 -2
- package/lib/config/legacy-config-migration.mjs +125 -0
- package/lib/config/schema.mjs +5 -5
- package/lib/config/source-targets.mjs +80 -0
- package/lib/contracts/validate.mjs +119 -51
- package/lib/decisions/golden.mjs +3 -2
- package/lib/decisions/registry.mjs +11 -6
- package/lib/demo-project.mjs +188 -0
- package/lib/demo-recording.mjs +9 -34
- package/lib/demo-script.mjs +2 -2
- package/lib/demo-surface.mjs +13 -131
- package/lib/demo-tour-renderer.mjs +92 -0
- package/lib/demo.mjs +69 -54
- package/lib/diagram-export.mjs +63 -14
- package/lib/doctor/source-checkout.mjs +3 -4
- package/lib/doctor/watchers/consistency.mjs +90 -22
- package/lib/doctor/watchers/credential-parity.mjs +97 -0
- package/lib/doctor/watchers/mcp-protocol.mjs +1 -1
- package/lib/doctor/watchers/service-health.mjs +4 -32
- package/lib/document-export.mjs +73 -9
- package/lib/document-extract.mjs +10 -198
- package/lib/embed/artifact.mjs +2 -3
- package/lib/embed/cli.mjs +1 -1
- package/lib/embed/config.mjs +1 -2
- package/lib/embed/customer-profiles.mjs +1 -1
- package/lib/embed/daemon.mjs +5 -6
- package/lib/embed/demand-fetch.mjs +114 -2
- package/lib/embed/docs-lifecycle.mjs +9 -5
- package/lib/embed/intake-metrics.mjs +2 -2
- package/lib/embed/notifications.mjs +2 -3
- package/lib/embed/recommendation-store.mjs +25 -22
- package/lib/embed/role-framing.mjs +4 -9
- package/lib/embedded-contract/capability.mjs +4 -2
- package/lib/embedded-contract/contract-version.mjs +1 -1
- package/lib/env-config.mjs +2 -2
- package/lib/flavors/loader.mjs +21 -19
- package/lib/graph/build-from-registry.mjs +31 -7
- package/lib/graph/staleness.mjs +1 -1
- package/lib/headhunt.mjs +82 -35
- package/lib/hooks/agent-tracker.mjs +2 -2
- package/lib/hooks/config-protection.mjs +1 -1
- package/lib/hooks/registry-sync.mjs +3 -3
- package/lib/host-capabilities.mjs +5 -5
- package/lib/improvement/controller.mjs +2 -2
- package/lib/init-unified.mjs +19 -21
- package/lib/intake/classify.mjs +26 -0
- package/lib/intake/daemon.mjs +2 -3
- package/lib/intake/prepare.mjs +10 -3
- package/lib/intake/session-prelude.mjs +1 -1
- package/lib/intake/tables/creative.mjs +9 -9
- package/lib/intake/tables/operations.mjs +4 -4
- package/lib/intake/tables/research.mjs +2 -2
- package/lib/integrations/intake-integrations.mjs +9 -10
- package/lib/knowledge/research-store.mjs +2 -2
- package/lib/mcp/server.mjs +104 -61
- package/lib/mcp/tool-budget.mjs +1 -46
- package/lib/mcp/tool-recovery.mjs +44 -0
- package/lib/mcp/tools/artifact-author.mjs +36 -0
- package/lib/mcp/tools/find-tool.mjs +86 -0
- package/lib/mcp/tools/orchestration-run.mjs +107 -69
- package/lib/mcp/tools/project.mjs +4 -3
- package/lib/mcp/tools/{profile.mjs → scope.mjs} +54 -52
- package/lib/mcp/tools/skills.mjs +39 -22
- package/lib/mcp/tools/telemetry.mjs +2 -1
- package/lib/mcp/tools/workflow.mjs +1 -1
- package/lib/mcp-platform-config.mjs +7 -5
- package/lib/migrations/index.mjs +4 -2
- package/lib/migrations/v2-unified-registry.mjs +35 -0
- package/lib/model-router.mjs +203 -36
- package/lib/models/catalog.mjs +25 -9
- package/lib/models/execution-capability-profile.mjs +3 -3
- package/lib/models/execution-policy.mjs +7 -6
- package/lib/models/provider-poll.mjs +18 -4
- package/lib/opencode-config.mjs +56 -1
- package/lib/opencode-runtime-plugin.mjs +13 -10
- package/lib/oracle/artifact-gate.mjs +14 -4
- package/lib/oracle/cli.mjs +2 -0
- package/lib/oracle/dispatch.mjs +18 -1
- package/lib/oracle/execute.mjs +39 -7
- package/lib/oracle/index.mjs +1 -1
- package/lib/oracle/org-graph.mjs +10 -5
- package/lib/oracle/policy.mjs +6 -0
- package/lib/oracle/read-model.mjs +103 -6
- package/lib/oracle/reconcile.mjs +31 -4
- package/lib/oracle/remediation-dispatch.mjs +53 -0
- package/lib/oracle/routing.mjs +5 -0
- package/lib/oracle/synthesize.mjs +80 -3
- package/lib/orchestration/routing-tables.mjs +44 -10
- package/lib/orchestration/runtime.mjs +2 -0
- package/lib/orchestration/worker.mjs +1 -1
- package/lib/orchestration-policy.mjs +351 -62
- package/lib/overrides/resolver.mjs +1 -12
- package/lib/parity.mjs +37 -11
- package/lib/policy/engine.mjs +80 -15
- package/lib/prompt-composer.js +51 -15
- package/lib/prompt-metadata.mjs +3 -2
- package/lib/providers/connection-probe.mjs +58 -0
- package/lib/providers/copilot-auth.mjs +1 -1
- package/lib/providers/credential-bootstrap.mjs +1 -1
- package/lib/providers/op-run.mjs +3 -4
- package/lib/providers/secret-resolver.mjs +31 -0
- package/lib/publish-tooling.mjs +3 -11
- package/lib/publish.mjs +12 -29
- package/lib/reconcile/mcp-entry-reconcile.mjs +14 -9
- package/lib/reflect.mjs +2 -2
- package/lib/registry/agent-manifest.mjs +190 -0
- package/lib/registry/assemble.mjs +133 -0
- package/lib/registry/catalog.mjs +171 -0
- package/lib/registry/cli.mjs +590 -6
- package/lib/registry/consolidation.mjs +5 -4
- package/lib/registry/docs-sync.mjs +67 -0
- package/lib/registry/loader.mjs +147 -0
- package/lib/registry/org-io.mjs +76 -0
- package/lib/registry/retired-paths.mjs +71 -0
- package/lib/registry/surface-map.mjs +5 -7
- package/lib/registry/validator.mjs +438 -0
- package/lib/research-execution-policy.mjs +173 -0
- package/lib/roles/catalog.mjs +4 -9
- package/lib/roles/fence.mjs +107 -1
- package/lib/roles/flavor-bindings.mjs +68 -0
- package/lib/roles/gateway.mjs +140 -29
- package/lib/roles/manifest.mjs +22 -13
- package/lib/roles/router.mjs +1 -1
- package/lib/runtime-env.mjs +1 -1
- package/lib/scopes/enrich.mjs +67 -0
- package/lib/scopes/hooks.mjs +12 -0
- package/lib/{profiles → scopes}/lifecycle.mjs +70 -70
- package/lib/scopes/loader.mjs +104 -0
- package/lib/scopes/rebrand.mjs +32 -0
- package/lib/scopes/research-profile.mjs +16 -0
- package/lib/scopes/teams.mjs +98 -0
- package/lib/service-manager.mjs +1 -117
- package/lib/setup-prompts.mjs +1 -1
- package/lib/setup.mjs +17 -28
- package/lib/skills/composition-graph.mjs +98 -0
- package/lib/skills/router.mjs +80 -0
- package/lib/specialist-contracts.mjs +17 -18
- package/lib/specialists/postconditions.mjs +2 -2
- package/lib/specialists/prompt-schema.mjs +6 -5
- package/lib/specialists/roster.mjs +7 -12
- package/lib/specialists/schema.mjs +9 -6
- package/lib/status.mjs +25 -90
- package/lib/storage/file-lock.mjs +6 -3
- package/lib/telemetry/skill-calls.mjs +1 -1
- package/lib/templates/doc-presentation.mjs +63 -0
- package/lib/templates/visual-requirements.mjs +35 -2
- package/lib/term-format.mjs +107 -2
- package/lib/test-env-setup.mjs +21 -0
- package/lib/ui/components.mjs +42 -0
- package/lib/ui/glyphs.mjs +58 -0
- package/lib/ui/links.mjs +115 -0
- package/lib/ui/theme.mjs +108 -0
- package/lib/uninstall/uninstall.mjs +2 -1
- package/lib/validator.mjs +45 -8
- package/lib/validators/skill-effectiveness.mjs +174 -0
- package/lib/validators/skills.mjs +1 -1
- package/package.json +12 -7
- package/personas/construct.md +12 -3
- package/platforms/claude/CLAUDE.md +1 -1
- package/rules/common/beads-hygiene.md +52 -0
- package/rules/common/neurodivergent-output.md +4 -7
- package/rules/common/research.md +2 -0
- package/scripts/sync-specialists.mjs +260 -49
- package/skills/ai/prompt-optimizer.md +3 -3
- package/skills/brand/output-vibe.md +48 -0
- package/skills/docs/adr-workflow.md +3 -0
- package/skills/docs/backlog-proposal-workflow.md +3 -0
- package/skills/docs/codebase-research-workflow.md +5 -2
- package/skills/docs/customer-profile-workflow.md +3 -0
- package/skills/docs/document-ingest-workflow.md +3 -0
- package/skills/docs/evidence-ingest-workflow.md +4 -1
- package/skills/docs/init-project.md +1 -1
- package/skills/docs/prd-workflow.md +1 -1
- package/skills/docs/prfaq-workflow.md +3 -0
- package/skills/docs/product-intelligence-workflow.md +4 -1
- package/skills/docs/product-signal-workflow.md +3 -0
- package/skills/docs/research-workflow.md +13 -6
- package/skills/docs/runbook-workflow.md +3 -0
- package/skills/docs/strategy-workflow.md +3 -0
- package/skills/docs/user-research-workflow.md +6 -3
- package/skills/operating/orchestration-reference.md +1 -1
- package/skills/roles/{engineer.ai.md → ai-engineer.md} +2 -2
- package/skills/roles/architect.ai-systems.md +1 -1
- package/skills/roles/architect.data.md +1 -1
- package/skills/roles/architect.enterprise.md +1 -1
- package/skills/roles/architect.integration.md +1 -1
- package/skills/roles/architect.md +1 -1
- package/skills/roles/architect.platform.md +1 -1
- package/skills/roles/{product-manager.business-strategy.md → business-strategist.md} +3 -3
- package/skills/roles/data-analyst.experiment.md +1 -1
- package/skills/roles/data-analyst.md +1 -1
- package/skills/roles/data-analyst.product-intelligence.md +1 -1
- package/skills/roles/data-analyst.product.md +1 -1
- package/skills/roles/data-analyst.telemetry.md +1 -1
- package/skills/roles/{engineer.data.md → data-engineer.md} +2 -2
- package/skills/roles/data-engineer.pipeline.md +2 -2
- package/skills/roles/data-engineer.vector-retrieval.md +2 -2
- package/skills/roles/data-engineer.warehouse.md +2 -2
- package/skills/roles/debugger.md +1 -1
- package/skills/roles/designer.accessibility.md +1 -1
- package/skills/roles/designer.md +1 -1
- package/skills/roles/{reviewer.devil-advocate.md → devil-advocate.md} +2 -2
- package/skills/roles/{operator.docs.md → docs-keeper.md} +3 -3
- package/skills/roles/engineer.md +3 -7
- package/skills/roles/{reviewer.evaluator.md → evaluator.md} +2 -2
- package/skills/roles/{researcher.explorer.md → explorer.md} +2 -2
- package/skills/roles/{operator.md → operations.md} +2 -5
- package/skills/roles/orchestrator.md +1 -1
- package/skills/roles/{engineer.platform.md → platform-engineer.md} +2 -2
- package/skills/roles/product-manager.ai-product.md +1 -1
- package/skills/roles/product-manager.enterprise.md +1 -1
- package/skills/roles/product-manager.growth.md +1 -2
- package/skills/roles/product-manager.md +1 -2
- package/skills/roles/product-manager.platform.md +1 -1
- package/skills/roles/product-manager.product.md +1 -1
- package/skills/roles/qa.ai-eval.md +1 -1
- package/skills/roles/qa.api-contract.md +1 -1
- package/skills/roles/qa.data-pipeline.md +1 -1
- package/skills/roles/qa.md +1 -1
- package/skills/roles/qa.web-ui.md +1 -1
- package/skills/roles/{operator.release.md → release-manager.md} +3 -3
- package/skills/roles/researcher.md +1 -1
- package/skills/roles/reviewer.md +1 -1
- package/skills/roles/security.ai.md +1 -1
- package/skills/roles/security.appsec.md +1 -1
- package/skills/roles/security.cloud.md +1 -1
- package/skills/roles/security.legal-compliance.md +1 -1
- package/skills/roles/security.md +1 -1
- package/skills/roles/security.privacy.md +1 -1
- package/skills/roles/security.supply-chain.md +1 -1
- package/skills/roles/{operator.sre.md → sre.md} +3 -3
- package/skills/roles/{qa.test-automation.md → test-automation.md} +2 -2
- package/skills/roles/{reviewer.trace.md → trace-reviewer.md} +2 -2
- package/skills/roles/{researcher.ux.md → ux-researcher.md} +2 -2
- package/skills/routing.json +18 -0
- package/skills/routing.md +1 -1
- package/specialists/artifact-manifest.json +2 -1
- package/specialists/audit-enrichments.json +14 -14
- package/specialists/org/contracts/accessibility-to-qa.json +37 -0
- package/specialists/org/contracts/any-to-business-strategist.json +57 -0
- package/specialists/org/contracts/any-to-debugger.json +38 -0
- package/specialists/org/contracts/any-to-designer.json +33 -0
- package/specialists/org/contracts/any-to-docs-keeper.json +34 -0
- package/specialists/org/contracts/any-to-explorer.json +39 -0
- package/specialists/org/contracts/any-to-sre-incident.json +33 -0
- package/specialists/org/contracts/any-to-trace-reviewer.json +32 -0
- package/specialists/org/contracts/architect-to-ai-engineer.json +32 -0
- package/specialists/org/contracts/architect-to-data-engineer.json +52 -0
- package/specialists/org/contracts/architect-to-devil-advocate.json +38 -0
- package/specialists/org/contracts/architect-to-engineer.json +34 -0
- package/specialists/org/contracts/architect-to-evaluator.json +59 -0
- package/specialists/org/contracts/architect-to-legal-compliance.json +55 -0
- package/specialists/org/contracts/architect-to-operations.json +45 -0
- package/specialists/org/contracts/architect-to-platform-engineer.json +42 -0
- package/specialists/org/contracts/business-strategist-to-product-manager.json +39 -0
- package/specialists/org/contracts/construct-to-orchestrator.json +36 -0
- package/specialists/org/contracts/construct-to-rd-lead.json +53 -0
- package/specialists/org/contracts/data-analyst-to-product-manager.json +43 -0
- package/specialists/org/contracts/data-engineer-to-platform-engineer.json +36 -0
- package/specialists/org/contracts/designer-to-accessibility.json +36 -0
- package/specialists/org/contracts/engineer-to-qa.json +34 -0
- package/specialists/org/contracts/engineer-to-reviewer.json +52 -0
- package/specialists/org/contracts/explorer-to-engineer.json +38 -0
- package/specialists/org/contracts/legal-compliance-to-release-manager.json +43 -0
- package/specialists/org/contracts/platform-engineer-to-engineer.json +31 -0
- package/specialists/org/contracts/product-manager-to-architect.json +71 -0
- package/specialists/org/contracts/product-manager-to-data-analyst.json +49 -0
- package/specialists/org/contracts/product-manager-to-ux-researcher.json +51 -0
- package/specialists/org/contracts/qa-to-release-manager.json +42 -0
- package/specialists/org/contracts/qa-to-test-automation.json +42 -0
- package/specialists/org/contracts/rd-lead-to-architect.json +38 -0
- package/specialists/org/contracts/researcher-to-architect.json +40 -0
- package/specialists/org/contracts/researcher-to-product-manager.json +57 -0
- package/specialists/org/contracts/reviewer-to-security.json +41 -0
- package/specialists/org/contracts/sre-to-release-manager.json +36 -0
- package/specialists/org/contracts/test-automation-to-engineer.json +34 -0
- package/specialists/org/contracts/trace-reviewer-to-sre.json +41 -0
- package/specialists/org/contracts/user-to-construct.json +30 -0
- package/specialists/org/groups/engineering-group.json +43 -0
- package/specialists/org/groups/governance-group.json +38 -0
- package/specialists/org/groups/operations-group.json +41 -0
- package/specialists/org/groups/product-group.json +46 -0
- package/specialists/org/groups/quality-group.json +42 -0
- package/specialists/org/groups/strategy-group.json +41 -0
- package/specialists/org/policies/action-approval.json +13 -0
- package/specialists/org/policies/agents-routing.json +13 -0
- package/specialists/org/policies/architecture.json +20 -0
- package/specialists/org/policies/bash-safety.json +13 -0
- package/specialists/org/policies/beads-hygiene.json +13 -0
- package/specialists/org/policies/bootstrap-state.json +13 -0
- package/specialists/org/policies/code-review.json +13 -0
- package/specialists/org/policies/coding-style.json +13 -0
- package/specialists/org/policies/comments.json +13 -0
- package/specialists/org/policies/commit-approval.json +13 -0
- package/specialists/org/policies/contract-preconditions.json +13 -0
- package/specialists/org/policies/deployment.json +20 -0
- package/specialists/org/policies/description.json +14 -0
- package/specialists/org/policies/design-approval.json +19 -0
- package/specialists/org/policies/doc-ownership.json +13 -0
- package/specialists/org/policies/file-path-fence.json +13 -0
- package/specialists/org/policies/framing.json +13 -0
- package/specialists/org/policies/git-workflow.json +13 -0
- package/specialists/org/policies/incident-response.json +15 -0
- package/specialists/org/policies/intake-triage.json +15 -0
- package/specialists/org/policies/neurodivergent-output.json +13 -0
- package/specialists/org/policies/no-fabrication.json +13 -0
- package/specialists/org/policies/patterns.json +13 -0
- package/specialists/org/policies/quality-gate-approval.json +17 -0
- package/specialists/org/policies/release-gates.json +13 -0
- package/specialists/org/policies/research-evidence.json +13 -0
- package/specialists/org/policies/review-before-change.json +13 -0
- package/specialists/org/policies/rollback.json +15 -0
- package/specialists/org/policies/scope-change.json +20 -0
- package/specialists/org/policies/secret-scan.json +13 -0
- package/specialists/org/policies/security-approval.json +17 -0
- package/specialists/org/policies/security.json +13 -0
- package/specialists/org/policies/session-efficiency.json +13 -0
- package/specialists/org/policies/skill-routing.json +13 -0
- package/specialists/org/policies/strategic-prioritization.json +17 -0
- package/specialists/org/policies/testing.json +13 -0
- package/specialists/org/policies/tool-invisibility.json +14 -0
- package/specialists/org/scopes/creative.json +54 -0
- package/specialists/org/scopes/operations.json +51 -0
- package/specialists/org/scopes/research.json +60 -0
- package/specialists/org/scopes/rnd.json +81 -0
- package/specialists/org/specialists/cx-accessibility.json +69 -0
- package/specialists/org/specialists/cx-ai-engineer.json +75 -0
- package/specialists/org/specialists/cx-architect.json +89 -0
- package/specialists/org/specialists/cx-business-strategist.json +72 -0
- package/specialists/org/specialists/cx-data-analyst.json +68 -0
- package/specialists/org/specialists/cx-data-engineer.json +71 -0
- package/specialists/org/specialists/cx-debugger.json +75 -0
- package/specialists/org/specialists/cx-designer.json +85 -0
- package/specialists/org/specialists/cx-devil-advocate.json +71 -0
- package/specialists/org/specialists/cx-docs-keeper.json +82 -0
- package/specialists/org/specialists/cx-engineer.json +106 -0
- package/specialists/org/specialists/cx-evaluator.json +69 -0
- package/specialists/org/specialists/cx-explorer.json +69 -0
- package/specialists/org/specialists/cx-legal-compliance.json +74 -0
- package/specialists/org/specialists/cx-operations.json +72 -0
- package/specialists/org/specialists/cx-oracle.json +46 -0
- package/specialists/org/specialists/cx-orchestrator.json +81 -0
- package/specialists/org/specialists/cx-platform-engineer.json +80 -0
- package/specialists/org/specialists/cx-product-manager.json +102 -0
- package/specialists/org/specialists/cx-qa.json +79 -0
- package/specialists/org/specialists/cx-rd-lead.json +73 -0
- package/specialists/org/specialists/cx-release-manager.json +77 -0
- package/specialists/org/specialists/cx-researcher.json +82 -0
- package/specialists/org/specialists/cx-reviewer.json +71 -0
- package/specialists/org/specialists/cx-security.json +91 -0
- package/specialists/org/specialists/cx-sre.json +94 -0
- package/specialists/org/specialists/cx-test-automation.json +69 -0
- package/specialists/org/specialists/cx-trace-reviewer.json +69 -0
- package/specialists/org/specialists/cx-ux-researcher.json +68 -0
- package/specialists/org/teams/accessibility-team.json +39 -0
- package/specialists/org/teams/design-team.json +40 -0
- package/specialists/org/teams/engineering-team.json +50 -0
- package/specialists/org/teams/governance-team.json +41 -0
- package/specialists/org/teams/operations-team.json +46 -0
- package/specialists/org/teams/product-management-team.json +45 -0
- package/specialists/org/teams/quality-team.json +49 -0
- package/specialists/org/teams/research-team.json +39 -0
- package/specialists/org/teams/strategy-team.json +48 -0
- package/specialists/org/teams/ux-research-team.json +39 -0
- package/specialists/prompts/_shared/validation-contract.md +1 -1
- package/specialists/prompts/_team-template.md +10 -0
- package/specialists/prompts/cx-accessibility.md +1 -0
- package/specialists/prompts/cx-ai-engineer.md +1 -1
- package/specialists/prompts/cx-business-strategist.md +1 -1
- package/specialists/prompts/cx-data-engineer.md +1 -1
- package/specialists/prompts/cx-designer.md +1 -0
- package/specialists/prompts/cx-devil-advocate.md +1 -1
- package/specialists/prompts/cx-docs-keeper.md +1 -1
- package/specialists/prompts/cx-evaluator.md +1 -1
- package/specialists/prompts/cx-explorer.md +1 -1
- package/specialists/prompts/cx-operations.md +1 -1
- package/specialists/prompts/cx-oracle.md +7 -3
- package/specialists/prompts/cx-orchestrator.md +17 -1
- package/specialists/prompts/cx-platform-engineer.md +1 -1
- package/specialists/prompts/cx-product-manager.md +2 -0
- package/specialists/prompts/cx-release-manager.md +1 -1
- package/specialists/prompts/cx-researcher.md +7 -4
- package/specialists/prompts/cx-sre.md +1 -1
- package/specialists/prompts/cx-test-automation.md +2 -2
- package/specialists/prompts/cx-trace-reviewer.md +3 -3
- package/specialists/prompts/cx-ux-researcher.md +2 -1
- package/templates/demos/scripts/architecture-review-adr.json +30 -0
- package/templates/demos/scripts/capability-contract.json +25 -0
- package/templates/demos/scripts/intake-triage.json +25 -0
- package/templates/demos/scripts/profile-doctor-health.json +25 -0
- package/templates/demos/tapes/agentic-platforms-prd.tape +2 -2
- package/templates/demos/tapes/architecture-review-adr.tape +44 -0
- package/templates/demos/tapes/capability-contract.tape +39 -0
- package/templates/demos/tapes/intake-triage.tape +39 -0
- package/templates/demos/tapes/profile-doctor-health.tape +39 -0
- package/templates/distribution/construct-brand.typ +23 -18
- package/templates/distribution/construct-decision.typ +1 -1
- package/templates/distribution/construct-pdf.typ +1 -1
- package/templates/distribution/construct-prd.typ +1 -1
- package/templates/distribution/construct-research.typ +1 -1
- package/templates/distribution/mermaid-puppeteer.json +8 -0
- package/templates/docs/persona-artifact.md +1 -1
- package/templates/docs/prd.md +6 -0
- package/lib/boundary.mjs +0 -127
- package/lib/certification/dashboard-api.mjs +0 -71
- package/lib/chat/cli.mjs +0 -333
- package/lib/chat/command-suggest.mjs +0 -161
- package/lib/chat/commands.mjs +0 -215
- package/lib/chat/config.mjs +0 -142
- package/lib/chat/context-compactor.mjs +0 -250
- package/lib/chat/context-continuation.mjs +0 -253
- package/lib/chat/continuation-source.mjs +0 -58
- package/lib/chat/demo-guide.mjs +0 -61
- package/lib/chat/design-tokens.mjs +0 -91
- package/lib/chat/desktop-binary.mjs +0 -81
- package/lib/chat/desktop-build.mjs +0 -130
- package/lib/chat/desktop-launcher.mjs +0 -133
- package/lib/chat/evidence.mjs +0 -145
- package/lib/chat/export.mjs +0 -74
- package/lib/chat/harness/driver.mjs +0 -91
- package/lib/chat/list-picker.mjs +0 -112
- package/lib/chat/model-picker.mjs +0 -356
- package/lib/chat/openrouter-fallback.mjs +0 -151
- package/lib/chat/permission-prompt.mjs +0 -33
- package/lib/chat/picker-catalog.mjs +0 -45
- package/lib/chat/policy-telemetry.mjs +0 -34
- package/lib/chat/present.mjs +0 -246
- package/lib/chat/session-context.mjs +0 -39
- package/lib/chat/session-persist.mjs +0 -73
- package/lib/chat/session-restore.mjs +0 -71
- package/lib/chat/session-settings.mjs +0 -53
- package/lib/chat/system-prompt.mjs +0 -52
- package/lib/chat/transparency.mjs +0 -93
- package/lib/chat/tui/color-scheme.mjs +0 -42
- package/lib/chat/tui/markdown.mjs +0 -123
- package/lib/chat/tui/presentation.mjs +0 -100
- package/lib/chat/tui/render.mjs +0 -500
- package/lib/chat/tui/turn-block.mjs +0 -284
- package/lib/chat/tui/turn-present.mjs +0 -18
- package/lib/chat/tui/turn-state.mjs +0 -88
- package/lib/chat/tui/usage.mjs +0 -122
- package/lib/chat/web-commands.mjs +0 -146
- package/lib/chat/web-launcher.mjs +0 -63
- package/lib/chat/web-picker-keys.mjs +0 -46
- package/lib/chat/web-session.mjs +0 -159
- package/lib/config/alias.mjs +0 -57
- package/lib/dashboard-demo.mjs +0 -71
- package/lib/dashboard-static.mjs +0 -175
- package/lib/install/desktop-binary-download.mjs +0 -88
- package/lib/profiles/loader.mjs +0 -123
- package/lib/profiles/rebrand.mjs +0 -46
- package/lib/server/auth.mjs +0 -169
- package/lib/server/chat-loop.mjs +0 -622
- package/lib/server/chat.mjs +0 -336
- package/lib/server/cors.mjs +0 -77
- package/lib/server/csrf.mjs +0 -103
- package/lib/server/demo-preview.mjs +0 -63
- package/lib/server/index.mjs +0 -2641
- package/lib/server/insights.mjs +0 -780
- package/lib/server/langfuse-login.mjs +0 -58
- package/lib/server/rate-limit.mjs +0 -93
- package/lib/server/telemetry-login.mjs +0 -100
- package/lib/server/webhook.mjs +0 -512
- package/specialists/contracts.json +0 -1032
- package/specialists/contracts.schema.json +0 -83
- package/specialists/policy-inventory.json +0 -188
- package/specialists/registry.json +0 -1412
- package/specialists/role-manifests.json +0 -217
- package/specialists/teams.json +0 -94
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* lib/server/langfuse-login.mjs — Magic-link bridge for local Langfuse.
|
|
3
|
-
*
|
|
4
|
-
* `construct dev` seeds Langfuse with deterministic admin creds via the
|
|
5
|
-
* LANGFUSE_INIT_* env vars in langfuse/docker-compose.yml. This bridge turns
|
|
6
|
-
* the "Open Langfuse" link in the dashboard into a one-click sign-in: the
|
|
7
|
-
* server fetches a CSRF token from local Langfuse, then returns an HTML
|
|
8
|
-
* auto-submit form that POSTs the seeded credentials to NextAuth's callback.
|
|
9
|
-
* The browser receives Langfuse's session cookie on localhost:3000 directly,
|
|
10
|
-
* sidestepping cross-origin restrictions.
|
|
11
|
-
*
|
|
12
|
-
* The seeded creds are NOT secret — they are deterministic local defaults
|
|
13
|
-
* declared in the public compose file. Their only job is to make local
|
|
14
|
-
* Langfuse zero-touch.
|
|
15
|
-
*/
|
|
16
|
-
import { LANGFUSE_LOCAL } from '../service-manager.mjs';
|
|
17
|
-
|
|
18
|
-
const HTML_HEADERS = { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' };
|
|
19
|
-
|
|
20
|
-
function escapeHtml(value) {
|
|
21
|
-
return String(value).replace(/[&<>"']/g, (c) => ({
|
|
22
|
-
'&': '&', '<': '<', '>': '>', '"': '"', "'": ''',
|
|
23
|
-
})[c]);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export async function handleLangfuseLogin(req, res, { baseUrl = LANGFUSE_LOCAL.baseUrl, email = LANGFUSE_LOCAL.email, pwd = LANGFUSE_LOCAL.pwd } = {}) {
|
|
27
|
-
try {
|
|
28
|
-
const csrfResponse = await fetch(`${baseUrl}/api/auth/csrf`, { headers: { Accept: 'application/json' } });
|
|
29
|
-
if (!csrfResponse.ok) {
|
|
30
|
-
res.writeHead(502, HTML_HEADERS);
|
|
31
|
-
res.end(`<!doctype html><meta charset="utf-8"><title>Langfuse unreachable</title><pre>Could not reach local Langfuse at ${escapeHtml(baseUrl)}. Status: ${csrfResponse.status}. Try \`construct dev\` first.</pre>`);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const { csrfToken } = await csrfResponse.json();
|
|
35
|
-
|
|
36
|
-
const callbackUrl = `${baseUrl}/api/auth/callback/credentials`;
|
|
37
|
-
const redirectAfter = `${baseUrl}/`;
|
|
38
|
-
|
|
39
|
-
res.writeHead(200, HTML_HEADERS);
|
|
40
|
-
res.end(`<!doctype html>
|
|
41
|
-
<html><head><meta charset="utf-8"><title>Signing in to Langfuse…</title>
|
|
42
|
-
<style>body{font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;height:100vh;margin:0;color:#666;background:#fff}</style>
|
|
43
|
-
</head><body>
|
|
44
|
-
<p>Signing you in to Langfuse…</p>
|
|
45
|
-
<form id="lf" method="POST" action="${escapeHtml(callbackUrl)}">
|
|
46
|
-
<input type="hidden" name="csrfToken" value="${escapeHtml(csrfToken)}">
|
|
47
|
-
<input type="hidden" name="email" value="${escapeHtml(email)}">
|
|
48
|
-
<input type="hidden" name="password" value="${escapeHtml(pwd)}">
|
|
49
|
-
<input type="hidden" name="callbackUrl" value="${escapeHtml(redirectAfter)}">
|
|
50
|
-
<input type="hidden" name="json" value="false">
|
|
51
|
-
</form>
|
|
52
|
-
<script>document.getElementById('lf').submit();</script>
|
|
53
|
-
</body></html>`);
|
|
54
|
-
} catch (err) {
|
|
55
|
-
res.writeHead(502, HTML_HEADERS);
|
|
56
|
-
res.end(`<!doctype html><meta charset="utf-8"><title>Langfuse unreachable</title><pre>Could not reach local Langfuse: ${escapeHtml(err?.message || 'unknown error')}. Try \`construct dev\` first.</pre>`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* lib/server/rate-limit.mjs — token-bucket rate limiting for the dashboard.
|
|
3
|
-
*
|
|
4
|
-
* Three tiers, configurable via env:
|
|
5
|
-
*
|
|
6
|
-
* read 60 req/min/key (dashboard polling, list endpoints)
|
|
7
|
-
* chat 10 req/min/key (/api/chat/stream — bursty + expensive)
|
|
8
|
-
* command 120 req/min/key (/api/chat/loop/command — slash cmds, no LLM)
|
|
9
|
-
* write 5 req/min/key (state-mutating endpoints — approvals, config)
|
|
10
|
-
*
|
|
11
|
-
* `key` is by default the request's source IP, with the active session id
|
|
12
|
-
* mixed in when present so two users behind the same NAT get separate
|
|
13
|
-
* buckets. Buckets live in-memory; they are NOT shared across processes.
|
|
14
|
-
* Adequate for solo mode; team and enterprise deployments need a shared
|
|
15
|
-
* store (Redis or Postgres) because a multi-instance worker pool needs
|
|
16
|
-
* one rate-limit view across replicas.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
const DEFAULT_TIERS = {
|
|
20
|
-
read: { capacity: 60, refillPerMs: 60 / 60_000 },
|
|
21
|
-
chat: { capacity: 10, refillPerMs: 10 / 60_000 },
|
|
22
|
-
command: { capacity: 120, refillPerMs: 120 / 60_000 },
|
|
23
|
-
write: { capacity: 5, refillPerMs: 5 / 60_000 },
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
const BUCKETS = new Map();
|
|
27
|
-
|
|
28
|
-
function readEnvLimits(env) {
|
|
29
|
-
// Operators can override any tier via CONSTRUCT_RATELIMIT_<TIER>=N where N
|
|
30
|
-
// is requests-per-minute. Capacity = N; refill = N / 60_000.
|
|
31
|
-
const out = {};
|
|
32
|
-
for (const tier of Object.keys(DEFAULT_TIERS)) {
|
|
33
|
-
const raw = env[`CONSTRUCT_RATELIMIT_${tier.toUpperCase()}`];
|
|
34
|
-
const n = raw ? Number(raw) : null;
|
|
35
|
-
out[tier] = (n && n > 0)
|
|
36
|
-
? { capacity: n, refillPerMs: n / 60_000 }
|
|
37
|
-
: DEFAULT_TIERS[tier];
|
|
38
|
-
}
|
|
39
|
-
return out;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function takeFromBucket(key, tier, env) {
|
|
43
|
-
const limits = readEnvLimits(env);
|
|
44
|
-
const cfg = limits[tier];
|
|
45
|
-
if (!cfg) return { allowed: true, retryAfterMs: 0 };
|
|
46
|
-
|
|
47
|
-
const now = Date.now();
|
|
48
|
-
const id = `${tier}:${key}`;
|
|
49
|
-
const existing = BUCKETS.get(id);
|
|
50
|
-
if (!existing) {
|
|
51
|
-
BUCKETS.set(id, { tokens: cfg.capacity - 1, lastRefill: now });
|
|
52
|
-
return { allowed: true, retryAfterMs: 0, tokensLeft: cfg.capacity - 1 };
|
|
53
|
-
}
|
|
54
|
-
const elapsed = now - existing.lastRefill;
|
|
55
|
-
const refilled = Math.min(cfg.capacity, existing.tokens + elapsed * cfg.refillPerMs);
|
|
56
|
-
if (refilled >= 1) {
|
|
57
|
-
BUCKETS.set(id, { tokens: refilled - 1, lastRefill: now });
|
|
58
|
-
return { allowed: true, retryAfterMs: 0, tokensLeft: refilled - 1 };
|
|
59
|
-
}
|
|
60
|
-
BUCKETS.set(id, { tokens: refilled, lastRefill: now });
|
|
61
|
-
const retryAfterMs = Math.ceil((1 - refilled) / cfg.refillPerMs);
|
|
62
|
-
return { allowed: false, retryAfterMs, tokensLeft: 0 };
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function clientKey(req) {
|
|
66
|
-
// Honour X-Forwarded-For (single-tenant deploy behind ALB), fall back to
|
|
67
|
-
// the socket address. If a session cookie is present, mix it in so the
|
|
68
|
-
// same IP serving multiple users yields per-user buckets.
|
|
69
|
-
const xf = req.headers['x-forwarded-for'];
|
|
70
|
-
const ip = (xf ? String(xf).split(',')[0] : req.socket?.remoteAddress) || 'unknown';
|
|
71
|
-
const cookie = req.headers.cookie || '';
|
|
72
|
-
const sessionMatch = cookie.match(/(?:^|;)\s*cx_session=([^;]+)/);
|
|
73
|
-
const session = sessionMatch ? sessionMatch[1] : '';
|
|
74
|
-
return `${ip}|${session}`;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Apply rate limit to `req`. Returns { allowed, retryAfterMs }. When the
|
|
79
|
-
* call is denied, callers should set `Retry-After` and respond 429.
|
|
80
|
-
*/
|
|
81
|
-
export function checkRateLimit(req, tier, { env = process.env, key } = {}) {
|
|
82
|
-
const k = key || clientKey(req);
|
|
83
|
-
return takeFromBucket(k, tier, env);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Test-only — wipe every in-memory bucket so a fresh test run starts clean.
|
|
88
|
-
*/
|
|
89
|
-
export function _resetRateLimitBucketsForTests() {
|
|
90
|
-
BUCKETS.clear();
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export { DEFAULT_TIERS };
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* lib/server/telemetry-login.mjs — magic-link bridge for a configured telemetry UI.
|
|
3
|
-
*
|
|
4
|
-
* CONSTRUCT_TELEMETRY_URL may point at a Langfuse-compatible deployment.
|
|
5
|
-
* The dashboard link can use this bridge for one-click sign-in by fetching a
|
|
6
|
-
* CSRF token and returning an HTML auto-submit form for NextAuth's callback.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const HTML_HEADERS = { 'Content-Type': 'text/html; charset=utf-8', 'Cache-Control': 'no-store' };
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Resolve the configured telemetry UI URL from env.
|
|
13
|
-
*/
|
|
14
|
-
function resolveTelemetryUrl(env = process.env) {
|
|
15
|
-
return (
|
|
16
|
-
env.CONSTRUCT_TELEMETRY_URL ?? ''
|
|
17
|
-
).replace(/\/$/, '');
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export const TELEMETRY_LOGIN_DEFAULTS = Object.freeze({
|
|
21
|
-
baseUrl: '',
|
|
22
|
-
email: '',
|
|
23
|
-
password: '',
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
function escapeHtml(value) {
|
|
27
|
-
return String(value).replace(/[&<>"']/g, (c) => ({
|
|
28
|
-
'&': '&',
|
|
29
|
-
'<': '<',
|
|
30
|
-
'>': '>',
|
|
31
|
-
'"': '"',
|
|
32
|
-
"'": ''',
|
|
33
|
-
})[c]);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Render the auto-submit form HTML. Pure for testing — pass everything
|
|
38
|
-
* the form needs and get back the string.
|
|
39
|
-
*/
|
|
40
|
-
export function renderAutoSubmitForm({ csrfToken, callbackUrl, redirectAfter, email, password }) {
|
|
41
|
-
return `<!doctype html>
|
|
42
|
-
<html><head><meta charset="utf-8"><title>Signing in to telemetry UI…</title>
|
|
43
|
-
<style>body{font-family:system-ui,sans-serif;display:flex;align-items:center;justify-content:center;height:100vh;margin:0;color:#666;background:#fff}</style>
|
|
44
|
-
</head><body>
|
|
45
|
-
<p>Signing you in to telemetry UI…</p>
|
|
46
|
-
<form id="tf" method="POST" action="${escapeHtml(callbackUrl)}">
|
|
47
|
-
<input type="hidden" name="csrfToken" value="${escapeHtml(csrfToken)}">
|
|
48
|
-
<input type="hidden" name="email" value="${escapeHtml(email)}">
|
|
49
|
-
<input type="hidden" name="password" value="${escapeHtml(password)}">
|
|
50
|
-
<input type="hidden" name="callbackUrl" value="${escapeHtml(redirectAfter)}">
|
|
51
|
-
<input type="hidden" name="json" value="false">
|
|
52
|
-
</form>
|
|
53
|
-
<script>document.getElementById('tf').submit();</script>
|
|
54
|
-
</body></html>`;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* HTTP handler: GET /api/services/telemetry/login
|
|
59
|
-
*
|
|
60
|
-
* Returns an HTML page that immediately POSTs credentials to the configured
|
|
61
|
-
* NextAuth callback. Returns 502 when the endpoint is unreachable.
|
|
62
|
-
*/
|
|
63
|
-
export async function handleTelemetryLogin(req, res, {
|
|
64
|
-
baseUrl,
|
|
65
|
-
email = '',
|
|
66
|
-
password = '',
|
|
67
|
-
fetchFn = globalThis.fetch,
|
|
68
|
-
} = {}) {
|
|
69
|
-
const resolvedBaseUrl = baseUrl ?? resolveTelemetryUrl();
|
|
70
|
-
|
|
71
|
-
if (!resolvedBaseUrl) {
|
|
72
|
-
res.writeHead(503, HTML_HEADERS);
|
|
73
|
-
res.end(`<!doctype html><meta charset="utf-8"><title>Telemetry UI not configured</title>` +
|
|
74
|
-
`<pre>CONSTRUCT_TELEMETRY_URL is not set. Configure a Langfuse-compatible telemetry UI to use this feature.</pre>`);
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
try {
|
|
79
|
-
const csrfResponse = await fetchFn(`${resolvedBaseUrl}/api/auth/csrf`, {
|
|
80
|
-
headers: { Accept: 'application/json' },
|
|
81
|
-
});
|
|
82
|
-
if (!csrfResponse.ok) {
|
|
83
|
-
res.writeHead(502, HTML_HEADERS);
|
|
84
|
-
res.end(`<!doctype html><meta charset="utf-8"><title>Telemetry UI unreachable</title>` +
|
|
85
|
-
`<pre>Could not reach telemetry UI at ${escapeHtml(resolvedBaseUrl)}. Status: ${csrfResponse.status}. ` +
|
|
86
|
-
`Check CONSTRUCT_TELEMETRY_URL and the configured service.</pre>`);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const { csrfToken } = await csrfResponse.json();
|
|
90
|
-
const callbackUrl = `${resolvedBaseUrl}/api/auth/callback/credentials`;
|
|
91
|
-
const redirectAfter = `${resolvedBaseUrl}/`;
|
|
92
|
-
res.writeHead(200, HTML_HEADERS);
|
|
93
|
-
res.end(renderAutoSubmitForm({ csrfToken, callbackUrl, redirectAfter, email, password }));
|
|
94
|
-
} catch (err) {
|
|
95
|
-
res.writeHead(502, HTML_HEADERS);
|
|
96
|
-
res.end(`<!doctype html><meta charset="utf-8"><title>Telemetry UI unreachable</title>` +
|
|
97
|
-
`<pre>Could not reach telemetry UI: ${escapeHtml(err?.message || 'unknown error')}. ` +
|
|
98
|
-
`Check CONSTRUCT_TELEMETRY_URL and the configured service.</pre>`);
|
|
99
|
-
}
|
|
100
|
-
}
|