@geraldmaron/construct 1.0.0 → 1.0.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 +10 -7
- package/LICENSE +201 -21
- package/README.md +132 -257
- package/agents/contracts.json +387 -0
- package/agents/prompts/cx-accessibility.md +8 -0
- package/agents/prompts/cx-ai-engineer.md +92 -0
- package/agents/prompts/cx-architect.md +10 -2
- package/agents/prompts/cx-business-strategist.md +13 -0
- package/agents/prompts/cx-data-analyst.md +80 -0
- package/agents/prompts/cx-data-engineer.md +4 -0
- package/agents/prompts/cx-debugger.md +8 -0
- package/agents/prompts/cx-designer.md +19 -0
- package/agents/prompts/cx-devil-advocate.md +4 -0
- package/agents/prompts/cx-docs-keeper.md +128 -0
- package/agents/prompts/cx-engineer.md +13 -0
- package/agents/prompts/cx-evaluator.md +4 -0
- package/agents/prompts/cx-explorer.md +12 -0
- package/agents/prompts/cx-legal-compliance.md +13 -0
- package/agents/prompts/cx-operations.md +13 -0
- package/agents/prompts/cx-orchestrator.md +107 -4
- package/agents/prompts/cx-platform-engineer.md +75 -0
- package/agents/prompts/cx-product-manager.md +8 -0
- package/agents/prompts/cx-qa.md +100 -0
- package/agents/prompts/cx-rd-lead.md +13 -0
- package/agents/prompts/cx-release-manager.md +8 -0
- package/agents/prompts/cx-researcher.md +21 -1
- package/agents/prompts/cx-reviewer.md +8 -0
- package/agents/prompts/cx-security.md +104 -0
- package/agents/prompts/cx-sre.md +104 -0
- package/agents/prompts/cx-test-automation.md +4 -0
- package/agents/prompts/cx-trace-reviewer.md +7 -3
- package/agents/prompts/cx-ux-researcher.md +4 -0
- package/agents/registry.json +365 -90
- package/agents/role-manifests.json +217 -0
- package/bin/construct +3345 -141
- package/bin/construct-postinstall.mjs +87 -0
- package/commands/build/feature.md +6 -6
- package/commands/plan/feature.md +6 -5
- package/commands/plan/requirements.md +1 -1
- package/commands/ship/status.md +1 -1
- package/commands/work/drive.md +3 -3
- package/commands/work/optimize-prompts.md +3 -3
- package/db/{migrations → schema}/001_init.sql +2 -0
- package/db/schema/002_pgvector.sql +182 -0
- package/db/schema/003_intake.sql +47 -0
- package/examples/README.md +85 -0
- package/examples/internal/roles/architect/bad/clever-plan-without-contracts.md +30 -0
- package/examples/internal/roles/architect/golden/explicit-tradeoff-before-plan.md +23 -0
- package/examples/internal/roles/engineer/bad/speculative-abstraction.md +30 -0
- package/examples/internal/roles/engineer/golden/read-before-write.md +28 -0
- package/examples/internal/roles/orchestrator/bad/everything-becomes-multi-agent.md +29 -0
- package/examples/internal/roles/orchestrator/golden/minimal-dispatch.md +22 -0
- package/examples/internal/roles/qa/bad/coverage-theater.md +30 -0
- package/examples/internal/roles/qa/golden/regression-gate.md +23 -0
- package/examples/internal/roles/reviewer/bad/lgtm-without-verification.md +29 -0
- package/examples/internal/roles/reviewer/golden/find-structural-risk-first.md +28 -0
- package/examples/personas/construct/adversarial/ignore-instruction-to-skip-approval.md +22 -0
- package/examples/personas/construct/bad/commit-without-approval.md +30 -0
- package/examples/personas/construct/boundary/blocked-needs-main-input.md +29 -0
- package/examples/personas/construct/golden/branch-approval-before-mutation.md +36 -0
- package/examples/personas/construct/golden/focused-direct-answer.md +28 -0
- package/examples/provider-plugin/README.md +34 -0
- package/examples/provider-plugin/index.mjs +74 -0
- package/examples/provider-plugin/package.json +15 -0
- package/examples/seed-observations/README.md +38 -0
- package/examples/seed-observations/anti-patterns.md +44 -0
- package/examples/seed-observations/decisions.md +36 -0
- package/examples/seed-observations/patterns.md +42 -0
- package/lib/agent-contracts-enforce.mjs +158 -0
- package/lib/agent-contracts.mjs +231 -0
- package/lib/agents/postconditions.mjs +126 -0
- package/lib/agents/schema.mjs +124 -0
- package/lib/artifact-capture.mjs +183 -0
- package/lib/audit-trail.mjs +149 -0
- package/lib/auto-docs.mjs +245 -65
- package/lib/beads/auto-close.mjs +126 -0
- package/lib/beads/drift.mjs +171 -0
- package/lib/beads-automation.mjs +542 -0
- package/lib/beads-client.mjs +518 -0
- package/lib/beads-lock.mjs +377 -0
- package/lib/beads-optimistic.mjs +365 -0
- package/lib/bootstrap/built-ins.mjs +136 -0
- package/lib/bootstrap/lazy-install.mjs +161 -0
- package/lib/bootstrap/resources.mjs +120 -0
- package/lib/bootstrap.mjs +105 -0
- package/lib/cache-governor.js +213 -0
- package/lib/cache-strategy-anthropic.js +62 -0
- package/lib/cache-strategy-google.js +79 -0
- package/lib/cache-strategy-none.js +30 -0
- package/lib/cache-strategy-openai.js +48 -0
- package/lib/cache-strategy.js +91 -0
- package/lib/claude-allow.mjs +149 -0
- package/lib/cli-commands.mjs +413 -258
- package/lib/codex-config.mjs +3 -1
- package/lib/comment-lint.mjs +55 -6
- package/lib/completions.mjs +21 -6
- package/lib/config/alias.mjs +56 -0
- package/lib/config/project-config.mjs +335 -0
- package/lib/config/schema.mjs +159 -0
- package/lib/context-router.mjs +308 -0
- package/lib/cost-ledger.mjs +177 -0
- package/lib/cost.mjs +171 -10
- package/lib/dashboard-static.mjs +158 -0
- package/lib/deployment-mode.mjs +86 -0
- package/lib/deprecate.mjs +49 -0
- package/lib/dispatch-batch.js +183 -0
- package/lib/distill.mjs +21 -8
- package/lib/doc-stamp.mjs +164 -0
- package/lib/doc-verify.mjs +119 -0
- package/lib/docs-routing.mjs +89 -0
- package/lib/docs-verify.mjs +417 -0
- package/lib/doctor/audit.mjs +71 -0
- package/lib/doctor/cli.mjs +99 -0
- package/lib/doctor/escalate.mjs +29 -0
- package/lib/doctor/index.mjs +140 -0
- package/lib/doctor/report.mjs +170 -0
- package/lib/doctor/watchers/bd-watch.mjs +117 -0
- package/lib/doctor/watchers/cost.mjs +130 -0
- package/lib/doctor/watchers/disk.mjs +122 -0
- package/lib/doctor/watchers/handoffs.mjs +33 -0
- package/lib/doctor/watchers/process-pressure.mjs +60 -0
- package/lib/doctor/watchers/service-health.mjs +188 -0
- package/lib/document-extract.mjs +288 -0
- package/lib/document-ingest.mjs +230 -0
- package/lib/drop.mjs +282 -0
- package/lib/embed/approval-queue.mjs +176 -0
- package/lib/embed/artifact.mjs +349 -0
- package/lib/embed/authority-guard.mjs +155 -0
- package/lib/embed/cli.mjs +408 -0
- package/lib/embed/config.mjs +355 -0
- package/lib/embed/conflict-detection.mjs +264 -0
- package/lib/embed/customer-profiles.mjs +480 -0
- package/lib/embed/daemon.mjs +1309 -0
- package/lib/embed/demand-fetch.mjs +449 -0
- package/lib/embed/docs-lifecycle.mjs +349 -0
- package/lib/embed/inbox-live-watcher.mjs +119 -0
- package/lib/embed/inbox.mjs +343 -0
- package/lib/embed/intake-metrics.mjs +190 -0
- package/lib/embed/jobs/vector-sync.mjs +198 -0
- package/lib/embed/notifications.mjs +75 -0
- package/lib/embed/output.mjs +79 -0
- package/lib/embed/providers/github.mjs +295 -0
- package/lib/embed/providers/jira.mjs +192 -0
- package/lib/embed/providers/linear.mjs +186 -0
- package/lib/embed/providers/registry.mjs +115 -0
- package/lib/embed/providers/slack.mjs +203 -0
- package/lib/embed/recommendation-store.mjs +378 -0
- package/lib/embed/roadmap.mjs +374 -0
- package/lib/embed/role-framing.mjs +110 -0
- package/lib/embed/scheduler.mjs +99 -0
- package/lib/embed/semantic.mjs +325 -0
- package/lib/embed/snapshot.mjs +191 -0
- package/lib/embed/supervision.mjs +235 -0
- package/lib/embed/target-resolver.mjs +186 -0
- package/lib/embed/worker.mjs +62 -0
- package/lib/embed/workspaces.mjs +297 -0
- package/lib/engine/chunker-headings.mjs +110 -0
- package/lib/engine/compressor-heuristic.mjs +100 -0
- package/lib/engine/consolidate.mjs +287 -0
- package/lib/engine/contracts.mjs +126 -0
- package/lib/engine/defaults.mjs +129 -0
- package/lib/engine/eval-retrieval.mjs +148 -0
- package/lib/engine/fuser-rrf.mjs +62 -0
- package/lib/engine/index.mjs +37 -0
- package/lib/engine/registry.mjs +146 -0
- package/lib/engine/reranker-mmr.mjs +90 -0
- package/lib/engine/tokens.mjs +77 -0
- package/lib/entity-store.mjs +280 -0
- package/lib/env-config.mjs +69 -4
- package/lib/evals/retrieval-bench.mjs +159 -0
- package/lib/evaluator-optimizer.mjs +317 -0
- package/lib/features.mjs +159 -29
- package/lib/gates-audit.mjs +236 -0
- package/lib/git-hooks/prepare-commit-msg +58 -0
- package/lib/handoffs/cleanup.mjs +159 -0
- package/lib/handoffs/contract.mjs +162 -0
- package/lib/handoffs/inventory.mjs +120 -0
- package/lib/headhunt.mjs +28 -47
- package/lib/health-check.mjs +399 -0
- package/lib/hook-health.mjs +442 -0
- package/lib/hooks/_lib/log.mjs +82 -0
- package/lib/hooks/adaptive-lint.mjs +26 -2
- package/lib/hooks/agent-tracker.mjs +171 -14
- package/lib/hooks/audit-reads.mjs +109 -0
- package/lib/hooks/audit-trail.mjs +153 -0
- package/lib/hooks/bash-output-logger.mjs +71 -0
- package/lib/hooks/block-no-verify.mjs +41 -0
- package/lib/hooks/ci-status-check.mjs +82 -0
- package/lib/hooks/comment-lint.mjs +29 -7
- package/lib/hooks/config-protection.mjs +39 -18
- package/lib/hooks/context-watch.mjs +137 -0
- package/lib/hooks/context-window-recovery.mjs +4 -20
- package/lib/hooks/dep-audit.mjs +16 -0
- package/lib/hooks/doc-coupling-check.mjs +80 -0
- package/lib/hooks/edit-accumulator.mjs +3 -0
- package/lib/hooks/edit-error-recovery.mjs +3 -0
- package/lib/hooks/edit-guard.mjs +45 -4
- package/lib/hooks/env-check.mjs +3 -0
- package/lib/hooks/guard-bash.mjs +58 -1
- package/lib/hooks/mcp-audit.mjs +18 -20
- package/lib/hooks/mcp-health-check.mjs +36 -0
- package/lib/hooks/model-fallback.mjs +42 -56
- package/lib/hooks/policy-engine.mjs +209 -0
- package/lib/hooks/post-merge-docs-check.mjs +63 -0
- package/lib/hooks/pre-compact.mjs +4 -24
- package/lib/hooks/pre-push-gate.mjs +200 -37
- package/lib/hooks/proactive-activation.mjs +284 -0
- package/lib/hooks/read-tracker.mjs +27 -4
- package/lib/hooks/readme-age-check.mjs +77 -0
- package/lib/hooks/registry-sync.mjs +12 -5
- package/lib/hooks/scan-secrets.mjs +50 -7
- package/lib/hooks/session-optimize.mjs +311 -0
- package/lib/hooks/session-start.mjs +287 -28
- package/lib/hooks/stop-notify.mjs +236 -96
- package/lib/hooks/stop-typecheck.mjs +13 -1
- package/lib/hooks/test-watch.mjs +68 -0
- package/lib/host-capabilities.mjs +31 -10
- package/lib/init-docs.mjs +731 -291
- package/lib/init-unified.mjs +1116 -0
- package/lib/init-update.mjs +168 -0
- package/lib/init.mjs +107 -0
- package/lib/install/first-invocation.mjs +119 -0
- package/lib/install/stage-project.mjs +69 -0
- package/lib/intake/classify.mjs +278 -0
- package/lib/intake/feedback.mjs +273 -0
- package/lib/intake/filesystem-queue.mjs +158 -0
- package/lib/intake/intake-config.mjs +132 -0
- package/lib/intake/postgres-queue.mjs +198 -0
- package/lib/intake/prepare.mjs +139 -0
- package/lib/intake/queue.mjs +83 -0
- package/lib/intake/session-prelude.mjs +50 -0
- package/lib/integrations/intake-integrations.mjs +740 -0
- package/lib/intent-classifier.mjs +253 -0
- package/lib/knowledge/layout.mjs +72 -0
- package/lib/knowledge/rag.mjs +331 -0
- package/lib/knowledge/search.mjs +315 -0
- package/lib/knowledge/trends.mjs +261 -0
- package/lib/logger.mjs +85 -0
- package/lib/mcp/broker.mjs +124 -0
- package/lib/mcp/server.mjs +554 -854
- package/lib/mcp/tools/document.mjs +132 -0
- package/lib/mcp/tools/memory.mjs +209 -0
- package/lib/mcp/tools/project.mjs +349 -0
- package/lib/mcp/tools/skills.mjs +409 -0
- package/lib/mcp/tools/storage.mjs +60 -0
- package/lib/mcp/tools/telemetry.mjs +315 -0
- package/lib/mcp/tools/workflow.mjs +112 -0
- package/lib/mcp-catalog.json +54 -3
- package/lib/mcp-manager.mjs +96 -48
- package/lib/mcp-platform-config.mjs +22 -22
- package/lib/memory-stats.mjs +121 -0
- package/lib/mode-commands.mjs +124 -0
- package/lib/model-free-selector.mjs +184 -0
- package/lib/model-pricing.mjs +152 -0
- package/lib/model-registry.mjs +226 -0
- package/lib/model-router.mjs +362 -386
- package/lib/observation-store.mjs +391 -0
- package/lib/ollama-manager.mjs +428 -0
- package/lib/opencode-config.mjs +13 -3
- package/lib/opencode-runtime-plugin.mjs +70 -38
- package/lib/opencode-telemetry.mjs +64 -6
- package/lib/orchestration-policy.mjs +509 -6
- package/lib/overrides/resolver.mjs +207 -0
- package/lib/parity.mjs +147 -0
- package/lib/paths.mjs +33 -0
- package/lib/performance/generate.mjs +212 -0
- package/lib/plugin-registry.mjs +268 -0
- package/lib/policy/engine.mjs +130 -0
- package/lib/policy/unified-gates.mjs +96 -0
- package/lib/project-detection.mjs +129 -0
- package/lib/project-init-shared.mjs +272 -0
- package/lib/project-profile.mjs +447 -0
- package/lib/prompt-composer.js +434 -0
- package/lib/prompt-metadata.mjs +1 -1
- package/lib/provider-capabilities-anthropic.js +44 -0
- package/lib/provider-capabilities-deepseek.js +37 -0
- package/lib/provider-capabilities-generic.js +26 -0
- package/lib/provider-capabilities-google.js +47 -0
- package/lib/provider-capabilities-openai.js +45 -0
- package/lib/provider-capabilities.js +142 -0
- package/lib/providers/atlassian-confluence/index.mjs +103 -0
- package/lib/providers/atlassian-jira/index.mjs +100 -0
- package/lib/providers/auth-manager.mjs +126 -0
- package/lib/providers/circuit-breaker.mjs +124 -0
- package/lib/providers/contract.mjs +93 -0
- package/lib/providers/github/index.mjs +126 -0
- package/lib/providers/registry.mjs +184 -0
- package/lib/providers/salesforce/index.mjs +100 -0
- package/lib/providers/slack/index.mjs +80 -0
- package/lib/reflect.mjs +137 -0
- package/lib/research-lint.mjs +164 -0
- package/lib/resources/budget.mjs +259 -0
- package/lib/role-preload.mjs +21 -6
- package/lib/roles/approval-surface.mjs +54 -0
- package/lib/roles/cli.mjs +118 -0
- package/lib/roles/event-bus.mjs +79 -0
- package/lib/roles/fence.mjs +84 -0
- package/lib/roles/gateway.mjs +260 -0
- package/lib/roles/hook-emit.mjs +37 -0
- package/lib/roles/manifest.mjs +48 -0
- package/lib/roles/router.mjs +27 -0
- package/lib/runtime-pressure.mjs +360 -0
- package/lib/schema-artifact.mjs +134 -0
- package/lib/schema-infer.mjs +551 -0
- package/lib/server/auth.mjs +168 -0
- package/lib/server/chat.mjs +336 -0
- package/lib/server/cors.mjs +77 -0
- package/lib/server/csrf.mjs +91 -0
- package/lib/server/index.mjs +1927 -78
- package/lib/server/insights.mjs +765 -0
- package/lib/server/rate-limit.mjs +91 -0
- package/lib/server/static/assets/index-ab25c707.js +70 -0
- package/lib/server/static/assets/index-f0c80a2b.css +1 -0
- package/lib/server/static/index.html +12 -817
- package/lib/server/telemetry-login.mjs +108 -0
- package/lib/server/webhook.mjs +510 -0
- package/lib/service-manager.mjs +522 -58
- package/lib/services/pattern-promotion-service.mjs +167 -0
- package/lib/services/telemetry-backend.mjs +178 -0
- package/lib/session-store.mjs +374 -0
- package/lib/setup-prompts.mjs +96 -0
- package/lib/setup.mjs +525 -38
- package/lib/skills-apply.mjs +280 -0
- package/lib/skills-scope.mjs +118 -0
- package/lib/status.mjs +261 -70
- package/lib/storage/admin.mjs +355 -0
- package/lib/storage/backend.mjs +2 -1
- package/lib/storage/backup.mjs +347 -0
- package/lib/storage/embeddings-engine.mjs +133 -0
- package/lib/storage/embeddings-legacy.mjs +85 -0
- package/lib/storage/embeddings-local.mjs +108 -0
- package/lib/storage/embeddings-ollama.mjs +78 -0
- package/lib/storage/embeddings-openai.mjs +85 -0
- package/lib/storage/embeddings.mjs +92 -33
- package/lib/storage/file-lock.mjs +130 -0
- package/lib/storage/fusion.mjs +95 -0
- package/lib/storage/hybrid-query.mjs +34 -27
- package/lib/storage/migrations.mjs +187 -0
- package/lib/storage/postgres-backup.mjs +124 -0
- package/lib/storage/sql-store.mjs +5 -15
- package/lib/storage/state-source.mjs +12 -13
- package/lib/storage/store-version.mjs +115 -0
- package/lib/storage/sync.mjs +144 -35
- package/lib/storage/unified-storage.mjs +550 -0
- package/lib/storage/vector-client.mjs +286 -0
- package/lib/storage/vector-store.mjs +71 -30
- package/lib/task-graph/generate.mjs +135 -0
- package/lib/task-graph/schema.mjs +81 -0
- package/lib/task-graph/store.mjs +71 -0
- package/lib/telemetry/backends/local.mjs +62 -0
- package/lib/telemetry/backends/{langfuse.mjs → remote.mjs} +27 -14
- package/lib/telemetry/backfill.mjs +180 -0
- package/lib/telemetry/eval-datasets.mjs +203 -0
- package/lib/telemetry/{langfuse-ingest.mjs → ingest.mjs} +26 -20
- package/lib/telemetry/intent-verifications.mjs +86 -0
- package/lib/telemetry/llm-judge.mjs +350 -0
- package/lib/telemetry/model-pricing-catalog.mjs +557 -0
- package/lib/telemetry/setup.mjs +151 -0
- package/lib/telemetry/skill-calls.mjs +78 -0
- package/lib/telemetry/team-rollup.mjs +4 -4
- package/lib/token-engine.js +117 -0
- package/lib/token-estimator-anthropic.js +15 -0
- package/lib/token-estimator-deepseek.js +13 -0
- package/lib/token-estimator-default.js +13 -0
- package/lib/token-estimator-google.js +13 -0
- package/lib/token-estimator-openai.js +13 -0
- package/lib/toolkit-env.mjs +1 -1
- package/lib/tty-prompts.mjs +211 -0
- package/lib/uninstall/uninstall.mjs +423 -0
- package/lib/update.mjs +115 -0
- package/lib/upgrade.mjs +141 -0
- package/lib/validator.mjs +51 -2
- package/lib/validators/skills.mjs +142 -0
- package/lib/wireframe.mjs +422 -0
- package/lib/worker/entrypoint.mjs +241 -0
- package/lib/worker/evidence.mjs +107 -0
- package/lib/worker/run.mjs +154 -0
- package/lib/worker/trace.mjs +182 -0
- package/lib/workflow-state.mjs +14 -18
- package/package.json +21 -8
- package/personas/construct.md +53 -51
- package/platforms/claude/CLAUDE.md +1 -1
- package/platforms/claude/settings.template.json +115 -68
- package/platforms/opencode/config.template.json +3 -7
- package/rules/common/agents.md +11 -38
- package/rules/common/beads-hygiene.md +75 -0
- package/rules/common/code-review.md +11 -100
- package/rules/common/coding-style.md +5 -3
- package/rules/common/comments.md +30 -111
- package/rules/common/commit-approval.md +53 -0
- package/rules/common/cx-agent-routing.md +1 -0
- package/rules/common/development-workflow.md +23 -41
- package/rules/common/doc-ownership.md +54 -0
- package/rules/common/efficiency.md +57 -0
- package/rules/common/framing.md +76 -0
- package/rules/common/git-workflow.md +2 -4
- package/rules/common/patterns.md +3 -7
- package/rules/common/performance.md +15 -31
- package/rules/common/release-gates.md +69 -0
- package/rules/common/research.md +107 -0
- package/rules/common/security.md +6 -6
- package/rules/common/skill-composition.md +67 -0
- package/rules/common/testing.md +15 -27
- package/rules/golang/hooks.md +0 -4
- package/rules/policy/bootstrap.yaml +11 -0
- package/rules/policy/drive.yaml +8 -0
- package/rules/policy/task.yaml +9 -0
- package/rules/policy/workflow.yaml +9 -0
- package/rules/python/hooks.md +0 -4
- package/rules/swift/hooks.md +0 -4
- package/rules/typescript/hooks.md +0 -4
- package/rules/web/hooks.md +0 -2
- package/{sync-agents.mjs → scripts/sync-agents.mjs} +306 -61
- package/skills/ai/prompt-optimizer.md +7 -7
- package/skills/compliance/ai-disclosure.md +58 -0
- package/skills/compliance/data-privacy.md +46 -0
- package/skills/compliance/license-audit.md +40 -0
- package/skills/compliance/regulatory-review.md +61 -0
- package/skills/docs/document-ingest-workflow.md +52 -0
- package/skills/docs/evidence-ingest-workflow.md +9 -0
- package/skills/docs/init-docs.md +51 -18
- package/skills/docs/product-intelligence-workflow.md +12 -0
- package/skills/docs/product-signal-workflow.md +4 -0
- package/skills/docs/research-workflow.md +23 -8
- package/skills/docs/runbook-workflow.md +1 -1
- package/skills/operating/orchestration-reference.md +151 -0
- package/skills/roles/architect.md +5 -0
- package/skills/roles/engineer.md +32 -0
- package/skills/roles/operator.md +12 -0
- package/skills/roles/reviewer.md +23 -0
- package/skills/routing.md +1 -1
- package/templates/devcontainer/Dockerfile.devcontainer +38 -0
- package/templates/devcontainer/devcontainer.json +31 -0
- package/templates/distribution/bootstrap.ps1 +142 -0
- package/templates/distribution/bootstrap.sh +196 -0
- package/templates/distribution/run.mjs +187 -0
- package/templates/docs/adr.md +44 -8
- package/templates/docs/changelog-entry.md +43 -0
- package/templates/docs/construct_guide.md +149 -0
- package/templates/docs/evidence-brief.md +2 -2
- package/templates/docs/meta-prd.md +140 -19
- package/templates/docs/onboarding.md +57 -0
- package/templates/docs/prd.md +159 -15
- package/templates/docs/research-brief.md +4 -4
- package/templates/homebrew/construct.rb +67 -0
- package/langfuse/docker-compose.yml +0 -82
- package/lib/eval-harness.mjs +0 -59
- package/lib/hooks/bootstrap-guard.mjs +0 -90
- package/lib/hooks/console-warn.mjs +0 -43
- package/lib/hooks/continuation-enforcer.mjs +0 -72
- package/lib/hooks/drive-guard.mjs +0 -89
- package/lib/hooks/mcp-task-scope.mjs +0 -47
- package/lib/hooks/task-completed-guard.mjs +0 -43
- package/lib/hooks/teammate-idle-guard.mjs +0 -54
- package/lib/hooks/workflow-guard.mjs +0 -62
- package/lib/prompt-composer.mjs +0 -196
- package/lib/review.mjs +0 -429
- package/lib/server/static/app.js +0 -841
- package/lib/telemetry/langfuse-model-sync.mjs +0 -270
- package/rules/common/hooks.md +0 -35
- package/rules/zh/README.md +0 -113
- package/rules/zh/agents.md +0 -55
- package/rules/zh/code-review.md +0 -129
- package/rules/zh/coding-style.md +0 -53
- package/rules/zh/development-workflow.md +0 -49
- package/rules/zh/git-workflow.md +0 -29
- package/rules/zh/hooks.md +0 -35
- package/rules/zh/patterns.md +0 -36
- package/rules/zh/performance.md +0 -60
- package/rules/zh/security.md +0 -34
- package/rules/zh/testing.md +0 -34
package/lib/workflow-state.mjs
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* lib/workflow-state.mjs —
|
|
3
|
+
* lib/workflow-state.mjs — Read, write, and validate Construct workflow state.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Manages the canonical workflow.json lifecycle: loading, phase transitions,
|
|
6
|
+
* task status updates, validation, and executive-gate enforcement. Also builds
|
|
7
|
+
* task packets for agent dispatch and derives plan.md summaries. Backs the
|
|
8
|
+
* MCP workflow tools, CLI commands, and the concierge routing layer.
|
|
6
9
|
*/
|
|
7
10
|
import fs from "node:fs";
|
|
8
11
|
import path from "node:path";
|
|
@@ -10,16 +13,6 @@ import { execSync } from "node:child_process";
|
|
|
10
13
|
import { routeRequest } from "./orchestration-policy.mjs";
|
|
11
14
|
|
|
12
15
|
const PHASES = ["research", "plan", "implement", "validate", "operate"];
|
|
13
|
-
// Back-compat stub: pre-overhaul workflow.json files used Matrix-themed phase
|
|
14
|
-
// names. Kept solely to migrate existing state on load. Do not use these names
|
|
15
|
-
// in new code — write only the canonical PHASES values above.
|
|
16
|
-
const LEGACY_PHASE_ALIASES = {
|
|
17
|
-
oracle: "research",
|
|
18
|
-
morpheus: "plan",
|
|
19
|
-
neo: "implement",
|
|
20
|
-
trinity: "validate",
|
|
21
|
-
operator: "operate"
|
|
22
|
-
};
|
|
23
16
|
const VALID_STATUS = new Set(["todo", "in-progress", "blocked", "blocked_needs_user", "blocked_needs_executive", "done", "skipped"]);
|
|
24
17
|
|
|
25
18
|
/**
|
|
@@ -32,8 +25,7 @@ export const EXECUTIVE_GATES = {
|
|
|
32
25
|
};
|
|
33
26
|
|
|
34
27
|
function normalizePhase(value, fallback = null) {
|
|
35
|
-
|
|
36
|
-
return PHASES.includes(normalized) ? normalized : fallback;
|
|
28
|
+
return PHASES.includes(value) ? value : fallback;
|
|
37
29
|
}
|
|
38
30
|
|
|
39
31
|
function normalizeWorkflow(workflow) {
|
|
@@ -78,9 +70,7 @@ function projectName(root) {
|
|
|
78
70
|
.trim();
|
|
79
71
|
const match = remote.match(/[:/]([^/]+\/[^/.]+)(?:\.git)?$/);
|
|
80
72
|
if (match) return match[1];
|
|
81
|
-
} catch {
|
|
82
|
-
// best effort
|
|
83
|
-
}
|
|
73
|
+
} catch { /* remote origin read is non-critical */ }
|
|
84
74
|
return path.basename(root);
|
|
85
75
|
}
|
|
86
76
|
|
|
@@ -217,7 +207,13 @@ export function addTask(root, options) {
|
|
|
217
207
|
}
|
|
218
208
|
|
|
219
209
|
export function buildTaskPacketFromIntent(request, options = {}) {
|
|
220
|
-
const route = routeRequest({
|
|
210
|
+
const route = routeRequest({
|
|
211
|
+
request: String(request || ""),
|
|
212
|
+
fileCount: options.fileCount ?? 0,
|
|
213
|
+
moduleCount: options.moduleCount ?? 0,
|
|
214
|
+
introducesContract: options.introducesContract ?? false,
|
|
215
|
+
explicitDrive: options.explicitDrive ?? false,
|
|
216
|
+
});
|
|
221
217
|
if (!route) return null;
|
|
222
218
|
if (route.track === "immediate") return null;
|
|
223
219
|
|
package/package.json
CHANGED
|
@@ -1,31 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geraldmaron/construct",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "Construct —
|
|
5
|
+
"description": "Construct — agent orchestration layer for OpenCode, Claude Code, and other coding surfaces",
|
|
6
6
|
"bin": {
|
|
7
7
|
"construct": "bin/construct"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"bin/construct",
|
|
11
|
+
"bin/construct-postinstall.mjs",
|
|
11
12
|
"lib/**",
|
|
12
13
|
"agents/**",
|
|
14
|
+
"examples/**",
|
|
13
15
|
"personas/**",
|
|
14
16
|
"commands/**",
|
|
15
17
|
"skills/**",
|
|
16
18
|
"rules/**",
|
|
17
19
|
"platforms/**",
|
|
18
20
|
"templates/**",
|
|
19
|
-
"
|
|
21
|
+
"templates/distribution/**",
|
|
20
22
|
"db/**",
|
|
21
|
-
"sync-agents.mjs",
|
|
23
|
+
"scripts/sync-agents.mjs",
|
|
22
24
|
"README.md",
|
|
23
25
|
".env.example"
|
|
24
26
|
],
|
|
25
27
|
"engines": {
|
|
26
|
-
"node": ">=
|
|
28
|
+
"node": ">=20"
|
|
27
29
|
},
|
|
28
|
-
"license": "
|
|
30
|
+
"license": "Apache-2.0",
|
|
29
31
|
"publishConfig": {
|
|
30
32
|
"access": "public"
|
|
31
33
|
},
|
|
@@ -39,15 +41,26 @@
|
|
|
39
41
|
},
|
|
40
42
|
"scripts": {
|
|
41
43
|
"mcp": "node lib/mcp/server.mjs",
|
|
42
|
-
"test": "node
|
|
44
|
+
"test": "node scripts/run-tests.mjs",
|
|
43
45
|
"docs:init": "node lib/init-docs.mjs --yes",
|
|
44
46
|
"docs:update": "node ./bin/construct docs:update",
|
|
45
47
|
"docs:site": "node ./bin/construct docs:site",
|
|
48
|
+
"docs:dev": "npm --prefix apps/docs run dev",
|
|
49
|
+
"docs:build": "npm --prefix apps/docs run build",
|
|
46
50
|
"lint:comments": "node ./bin/construct lint:comments",
|
|
47
|
-
"
|
|
51
|
+
"lint:templates": "node scripts/lint-commits-pr.mjs",
|
|
52
|
+
"eval:routing": "node scripts/eval/score-intent-classifier.mjs",
|
|
53
|
+
"release:check": "node ./bin/construct doctor && npm test && node ./bin/construct docs:update --check && node ./bin/construct dashboard:sync --check && node ./bin/construct lint:comments && node scripts/lint-commits-pr.mjs",
|
|
54
|
+
"npm:publish": "npm run release:check && npm publish --access public",
|
|
55
|
+
"postinstall": "node ./bin/construct-postinstall.mjs"
|
|
48
56
|
},
|
|
49
57
|
"dependencies": {
|
|
58
|
+
"@huggingface/transformers": "^4.2.0",
|
|
50
59
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
60
|
+
"@xenova/transformers": "^2.0.1",
|
|
51
61
|
"postgres": "^3.4.9"
|
|
62
|
+
},
|
|
63
|
+
"overrides": {
|
|
64
|
+
"express-rate-limit": "8.5.1"
|
|
52
65
|
}
|
|
53
66
|
}
|
package/personas/construct.md
CHANGED
|
@@ -1,94 +1,96 @@
|
|
|
1
1
|
<!--
|
|
2
|
-
personas/construct.md —
|
|
2
|
+
personas/construct.md — Construct persona prompt.
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
and
|
|
4
|
+
Defines the single user-facing AI interface and its session-start behavior,
|
|
5
|
+
routing rules, approval boundaries, and output contract. Loaded by sync-agents
|
|
6
|
+
and emitted to every supported platform.
|
|
7
7
|
-->
|
|
8
|
-
You are Construct —
|
|
9
|
-
|
|
10
|
-
Dispatching a specialist is not delegation — it is forcing the same problem through a different cognitive lens. An architect's suspicion of unwritten contracts and a reviewer's attention to edge cases are structurally different views, not redundant passes.
|
|
8
|
+
You are Construct — the single AI interface for everything from a quick question to a full software lifecycle. The user talks only to you; internal routing and specialist dispatch are implementation detail.
|
|
11
9
|
|
|
12
10
|
## Start of every session
|
|
13
11
|
|
|
14
12
|
Before responding, run in parallel — do not narrate:
|
|
15
|
-
1. `
|
|
16
|
-
2. `
|
|
17
|
-
3. `
|
|
13
|
+
1. `project_context` — state from `.cx/context.md`
|
|
14
|
+
2. `memory_search` with the basename of CWD — prior session context and user preferences
|
|
15
|
+
3. Read `AGENTS.md`, `plan.md`, and the relevant docs for the current task when present
|
|
16
|
+
4. Check `.cx/handoffs/` for the most recent handoff — if another session was active, read it to understand what was in progress and what NOT to touch
|
|
18
17
|
|
|
19
18
|
Apply results silently. If memory returns preferences or past decisions, honor them without asking the user to repeat.
|
|
20
19
|
|
|
20
|
+
Honor the project operating hierarchy:
|
|
21
|
+
- Beads (`bd`) is the durable source of truth for tasks; hygiene contract — claim, close, supersede, prune — lives in `rules/common/beads-hygiene.md`. `bd ready` for unblocked work, `bd show <id>` for the active issue.
|
|
22
|
+
- `plan.md` is the human-readable implementation plan
|
|
23
|
+
- cass-memory via MCP `memory` is for cross-tool/session recall, not task tracking
|
|
24
|
+
|
|
25
|
+
Use the single-writer rule whenever multiple sessions are active: if two sessions would touch the same file, one session owns the edit and the other reviews, researches, or waits for handoff.
|
|
26
|
+
|
|
21
27
|
## Classify before acting
|
|
22
28
|
|
|
23
|
-
Use the code-backed orchestration policy
|
|
24
|
-
- intent classification
|
|
25
|
-
- execution track (`immediate`, `focused`, `orchestrated`)
|
|
26
|
-
- specialist selection
|
|
27
|
-
- escalation and approval boundaries
|
|
29
|
+
Use the code-backed orchestration policy for intent, execution track, specialist selection, escalation, and approval boundaries. Visual deliverables (wireframes, diagrams, decks) are first-class — use real visual tools, not bullet prose.
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
Execution model:
|
|
32
|
+
- **Immediate** — answer or act directly when no hidden worker is needed.
|
|
33
|
+
- **Focused** — dispatch one bounded specialist path; return in Construct's voice.
|
|
34
|
+
- **Orchestrated** — plan → challenge → build → validate, with tracker-backed slices and explicit file ownership.
|
|
30
35
|
|
|
31
|
-
|
|
32
|
-
- **Immediate** — answer or act directly when the policy says no hidden worker is needed.
|
|
33
|
-
- **Focused** — dispatch one bounded specialist path and return in Construct's voice.
|
|
34
|
-
- **Orchestrated** — run plan → challenge → build → validate using workflow-backed task packets.
|
|
36
|
+
Devil's advocate is mandatory for new architectural directions, AI/agent workflow changes, security or data-integrity changes, and promoting a temporary capability to persistent.
|
|
35
37
|
|
|
36
|
-
|
|
38
|
+
## Gates and contracts (org-in-a-box)
|
|
37
39
|
|
|
38
|
-
|
|
40
|
+
`routeRequest` returns three artifacts; honor all three:
|
|
39
41
|
|
|
40
|
-
|
|
42
|
+
1. **Gates** — `framingChallenge`, `externalResearch`, `docAuthoring`
|
|
43
|
+
2. **Contract chain** — typed handoffs from `agents/contracts.json`. Call `agent_contract` MCP tool at handoff.
|
|
44
|
+
3. **Specialist sequence** — dispatch plan with ordering/parallel markers.
|
|
41
45
|
|
|
42
|
-
|
|
46
|
+
Before DONE: postconditions met · sources cited · framing logged · ADRs have Rejected alternatives.
|
|
43
47
|
|
|
44
|
-
|
|
45
|
-
- **Ask or look up — don't speculate.** Choosing between named options (SDK A vs B, pattern X vs Y) that aren't already in your context: call `context7_query-docs` / `WebFetch`, ask the user one question, or commit to a default and note the assumption. Never a fourth round of internal debate.
|
|
46
|
-
- **Deliberation cap: two passes.** Reasoning about the same decision twice consecutively without a new read, tool call, or user input means you skipped a dispatch or a lookup. Hand off, query, or ask — never think a third time.
|
|
47
|
-
- **Probe before bulk read.** Before `Read` with `limit > 200` or unset, check size via `Glob`, `Bash wc -l`, or a `limit: 50` probe. Reading 220 lines of a 74-line file is the tell.
|
|
48
|
-
- **Start-of-task contract is binding.** First action on any non-trivial request is the parallel bootstrap above, plus `cx_trace` once the goal is clear. A first-action `Read` or thinking turn means you skipped it.
|
|
48
|
+
## Branch + commit approval
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
- **Working branch is surfaced every session** at the top of session-start. Restate it before any mutating operation.
|
|
51
|
+
- **Never commit, push, or merge without asking first.** Before `git commit`, `git push`, or `gh pr merge`: state branch, show the proposed message / refspec / PR number verbatim, wait for explicit yes. A batch go-ahead covers a defined sequence; new commits later are their own gate. See `rules/common/commit-approval.md`.
|
|
51
52
|
|
|
52
|
-
##
|
|
53
|
+
## R&D intake surface
|
|
53
54
|
|
|
54
|
-
-
|
|
55
|
-
- Lead with the answer or action, not the reasoning
|
|
56
|
-
- One clear question when blocked — not a list
|
|
57
|
-
- Confirm what changed and what's next when done — nothing more
|
|
55
|
+
Session-start surfaces pending intake at `.cx/intake/pending/<id>.json`. Read with `construct intake show <id>`; the triage block names the primary owner, recommended chain, and next action. For non-trivial signals, plan with `construct graph from-intake <id>` and update node status with evidence (`construct graph status … done --evidence=…`). A node cannot reach `done` without an evidence record. Team / enterprise mode wraps tool calls in the MCP broker — when it returns `ApprovalRequired`, surface the question; never bypass.
|
|
58
56
|
|
|
59
|
-
##
|
|
57
|
+
## Action discipline
|
|
60
58
|
|
|
61
|
-
|
|
59
|
+
- Dispatch, don't solo-plan: 3+ files, 2+ modules, or a new contract → cx-architect owns the plan.
|
|
60
|
+
- Ask or look up, don't speculate: call `context7_query-docs` / `WebFetch`, ask, or commit to a default. Never a fourth round of internal debate.
|
|
61
|
+
- Deliberation cap: two passes. Same decision twice without a new read, tool call, or user input = hand off, query, or ask.
|
|
62
|
+
- Probe before bulk read: check size via `Glob` / `wc -l` or a `limit: 50` probe before `Read` with `limit > 200`.
|
|
63
|
+
- Start-of-task: parallel bootstrap (above) + `cx_trace` before anything mutating.
|
|
62
64
|
|
|
63
|
-
##
|
|
65
|
+
## Communication + state
|
|
64
66
|
|
|
65
|
-
|
|
67
|
+
Lead with the answer. One question when blocked. Confirm what changed when done.
|
|
66
68
|
|
|
67
|
-
- `.cx/context.md
|
|
68
|
-
- `.cx/context.json`
|
|
69
|
-
- `.cx/workflow.json`
|
|
70
|
-
- `docs/README.md`
|
|
71
|
-
- `docs/architecture.md`
|
|
69
|
+
Non-trivial work: update Beads (`bd note <id>`), `plan.md`, docs with owner / acceptance / verification. Preserve tracker ids in handoffs. Surface NEEDS_MAIN_INPUT in your voice; resume after the answer. End every session with a handoff at `.cx/handoffs/{date}-{slug}.md` and updates to `.cx/context.md`.
|
|
72
70
|
|
|
73
|
-
|
|
71
|
+
Load-bearing state: `AGENTS.md`, `.cx/context.md`/`.json`, `docs/README.md`, `docs/architecture.md` (read at session start, update before DONE, prune stale sections). `plan.md` is local-only.
|
|
74
72
|
|
|
75
73
|
## Quality gates
|
|
76
74
|
|
|
77
|
-
After any implementation, dispatch validation before marking done
|
|
75
|
+
After any implementation, dispatch validation before marking done:
|
|
78
76
|
1. cx-reviewer — correctness, regression, coverage
|
|
79
77
|
2. cx-qa — tests pass, coverage meets threshold
|
|
80
78
|
3. cx-security if auth/secrets/user data touched
|
|
81
79
|
|
|
82
|
-
Do not mark `done`
|
|
80
|
+
Do not mark `done` until cx-reviewer and cx-qa return verdicts. BLOCKED or any CRITICAL finding stops shipping.
|
|
81
|
+
|
|
82
|
+
## Hard release gates
|
|
83
|
+
|
|
84
|
+
Run `npm run release:check` before any commit or push — never wait for CI. Commits follow `.gitmessage`; PRs follow `.github/pull_request_template.md`. Full policy: `rules/common/release-gates.md`.
|
|
83
85
|
|
|
84
86
|
## Loop guard
|
|
85
87
|
|
|
86
88
|
Same action 3+ times with no state change → stop. Report what was tried, what blocked progress, what decision is needed.
|
|
87
89
|
|
|
88
|
-
|
|
90
|
+
Before stopping: surface incomplete tracker-linked plan slices and unmet acceptance criteria. Do not stop silently with work in-flight.
|
|
89
91
|
|
|
90
|
-
|
|
92
|
+
## Drive mode
|
|
91
93
|
|
|
92
|
-
|
|
94
|
+
Activates on word-boundary triggers — `/work:drive`, standalone `drive`, or `full send`. Substring matches do not count.
|
|
93
95
|
|
|
94
|
-
State the dispatch plan upfront
|
|
96
|
+
On trigger: orchestrated track, skip planning confirmation, continue until verification or a real blocker. State the dispatch plan upfront; brief status at phase transitions. User sees plan and outcomes, not deliberation.
|
|
@@ -27,4 +27,4 @@ When using Bash, always provide both `command` and `description` string fields.
|
|
|
27
27
|
|
|
28
28
|
## Cross-Tool Memory
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
Construct uses cass-memory for cross-tool memory. Start the local HTTP server with `cm serve`, then use `memory_search` to find prior context.
|
|
@@ -31,28 +31,28 @@
|
|
|
31
31
|
],
|
|
32
32
|
"PreToolUse": [
|
|
33
33
|
{
|
|
34
|
-
"matcher": "
|
|
34
|
+
"matcher": "Write|Edit|MultiEdit|NotebookEdit|TodoWrite|Read|Grep|Glob|LS|NotebookRead",
|
|
35
35
|
"hooks": [
|
|
36
36
|
{
|
|
37
37
|
"type": "command",
|
|
38
|
-
"command": "node \"$HOME/.construct/lib/hooks/
|
|
39
|
-
"timeout":
|
|
38
|
+
"command": "node \"$HOME/.construct/lib/hooks/policy-engine.mjs\" PreToolUse",
|
|
39
|
+
"timeout": 10
|
|
40
40
|
}
|
|
41
41
|
],
|
|
42
|
-
"id": "pre:
|
|
43
|
-
"description": "
|
|
42
|
+
"id": "pre:policy-engine",
|
|
43
|
+
"description": "Consolidated policy gating (bootstrap rule): block mutations until session is grounded via project_context+memory_search or 3+ exploratory reads"
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"matcher": "Bash",
|
|
47
47
|
"hooks": [
|
|
48
48
|
{
|
|
49
49
|
"type": "command",
|
|
50
|
-
"command": "
|
|
50
|
+
"command": "node \"$HOME/.construct/lib/hooks/block-no-verify.mjs\"",
|
|
51
51
|
"timeout": 5
|
|
52
52
|
}
|
|
53
53
|
],
|
|
54
54
|
"id": "pre:bash:block-no-verify",
|
|
55
|
-
"description": "Block git --no-verify to prevent pre-commit hook bypass"
|
|
55
|
+
"description": "Block git --no-verify / -n to prevent pre-commit/pre-push hook bypass (vendored)"
|
|
56
56
|
},
|
|
57
57
|
{
|
|
58
58
|
"matcher": "Bash",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"description": "Prevent weakening eslint/tsconfig/prettier/biome configs"
|
|
92
92
|
},
|
|
93
93
|
{
|
|
94
|
-
"matcher": "
|
|
94
|
+
"matcher": "mcp__.*",
|
|
95
95
|
"hooks": [
|
|
96
96
|
{
|
|
97
97
|
"type": "command",
|
|
@@ -113,18 +113,6 @@
|
|
|
113
113
|
],
|
|
114
114
|
"id": "pre:edit-guard",
|
|
115
115
|
"description": "Hash-anchored edit verification — blocks Edit when old_string not found verbatim"
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
"matcher": "mcp__.*",
|
|
119
|
-
"hooks": [
|
|
120
|
-
{
|
|
121
|
-
"type": "command",
|
|
122
|
-
"command": "node \"$HOME/.construct/lib/hooks/mcp-task-scope.mjs\"",
|
|
123
|
-
"timeout": 3
|
|
124
|
-
}
|
|
125
|
-
],
|
|
126
|
-
"id": "pre:mcp-task-scope",
|
|
127
|
-
"description": "Warn when calling an MCP not declared in the active task mcpScope"
|
|
128
116
|
}
|
|
129
117
|
],
|
|
130
118
|
"PostToolUse": [
|
|
@@ -166,29 +154,28 @@
|
|
|
166
154
|
"description": "Auto-run project linter/formatter after every file edit"
|
|
167
155
|
},
|
|
168
156
|
{
|
|
169
|
-
"matcher": "Write|Edit",
|
|
157
|
+
"matcher": "Write|Edit|MultiEdit",
|
|
170
158
|
"hooks": [
|
|
171
159
|
{
|
|
172
160
|
"type": "command",
|
|
173
|
-
"command": "node \"$HOME/.construct/lib/hooks/
|
|
174
|
-
"timeout":
|
|
161
|
+
"command": "node \"$HOME/.construct/lib/hooks/comment-lint.mjs\"",
|
|
162
|
+
"timeout": 15
|
|
175
163
|
}
|
|
176
164
|
],
|
|
177
|
-
"id": "post:edit:
|
|
178
|
-
"description": "
|
|
165
|
+
"id": "post:edit:comment-lint",
|
|
166
|
+
"description": "Block edits that violate comment policy (banned patterns, missing required header). Bypass: CONSTRUCT_SKIP_COMMENT_LINT=1"
|
|
179
167
|
},
|
|
180
168
|
{
|
|
181
|
-
"matcher": "Write|Edit",
|
|
169
|
+
"matcher": "Write|Edit|MultiEdit",
|
|
182
170
|
"hooks": [
|
|
183
171
|
{
|
|
184
172
|
"type": "command",
|
|
185
|
-
"command": "node \"$HOME/.construct/lib/hooks/
|
|
186
|
-
"timeout":
|
|
187
|
-
"async": true
|
|
173
|
+
"command": "node \"$HOME/.construct/lib/hooks/doc-coupling-check.mjs\"",
|
|
174
|
+
"timeout": 5
|
|
188
175
|
}
|
|
189
176
|
],
|
|
190
|
-
"id": "post:edit:
|
|
191
|
-
"description": "
|
|
177
|
+
"id": "post:edit:doc-coupling",
|
|
178
|
+
"description": "Advisory: nudge when code edits accumulate without CHANGELOG/docs updates (pre-commit gate will block at commit time)"
|
|
192
179
|
},
|
|
193
180
|
{
|
|
194
181
|
"matcher": "Write|Edit|MultiEdit",
|
|
@@ -229,29 +216,30 @@
|
|
|
229
216
|
"description": "Audit dependencies for vulnerabilities after manifest changes"
|
|
230
217
|
},
|
|
231
218
|
{
|
|
232
|
-
"matcher": "
|
|
219
|
+
"matcher": "Read",
|
|
233
220
|
"hooks": [
|
|
234
221
|
{
|
|
235
222
|
"type": "command",
|
|
236
|
-
"command": "node \"$HOME/.construct/lib/hooks/
|
|
237
|
-
"timeout":
|
|
223
|
+
"command": "node \"$HOME/.construct/lib/hooks/read-tracker.mjs\"",
|
|
224
|
+
"timeout": 3,
|
|
225
|
+
"async": true
|
|
238
226
|
}
|
|
239
227
|
],
|
|
240
|
-
"id": "post:
|
|
241
|
-
"description": "
|
|
228
|
+
"id": "post:read-tracker",
|
|
229
|
+
"description": "Record file content hash after Read for staleness detection in edit-guard"
|
|
242
230
|
},
|
|
243
231
|
{
|
|
244
232
|
"matcher": "Read",
|
|
245
233
|
"hooks": [
|
|
246
234
|
{
|
|
247
235
|
"type": "command",
|
|
248
|
-
"command": "node \"$HOME/.construct/lib/hooks/
|
|
236
|
+
"command": "node \"$HOME/.construct/lib/hooks/audit-reads.mjs\"",
|
|
249
237
|
"timeout": 3,
|
|
250
238
|
"async": true
|
|
251
239
|
}
|
|
252
240
|
],
|
|
253
|
-
"id": "post:
|
|
254
|
-
"description": "
|
|
241
|
+
"id": "post:audit-reads",
|
|
242
|
+
"description": "Tamper-evident chain log of every Read tool call. Off by default — enable with CONSTRUCT_AUDIT_READS=1."
|
|
255
243
|
},
|
|
256
244
|
{
|
|
257
245
|
"matcher": "mcp__.*",
|
|
@@ -278,6 +266,56 @@
|
|
|
278
266
|
],
|
|
279
267
|
"id": "post:agent-tracker",
|
|
280
268
|
"description": "Record dispatched cx-* agent name for per-agent cost attribution"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"matcher": "Bash",
|
|
272
|
+
"hooks": [
|
|
273
|
+
{
|
|
274
|
+
"type": "command",
|
|
275
|
+
"command": "node \"$HOME/.construct/lib/hooks/bash-output-logger.mjs\"",
|
|
276
|
+
"timeout": 5
|
|
277
|
+
}
|
|
278
|
+
],
|
|
279
|
+
"id": "post:bash:output-logger",
|
|
280
|
+
"description": "Persist long Bash outputs to ~/.cx/bash-logs/ and nudge toward referencing the log"
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"matcher": "Bash",
|
|
284
|
+
"hooks": [
|
|
285
|
+
{
|
|
286
|
+
"type": "command",
|
|
287
|
+
"command": "node \"$HOME/.construct/lib/hooks/test-watch.mjs\"",
|
|
288
|
+
"timeout": 5,
|
|
289
|
+
"async": true
|
|
290
|
+
}
|
|
291
|
+
],
|
|
292
|
+
"id": "post:bash:test-watch",
|
|
293
|
+
"description": "Emit role events when a test command exits non-zero or repeats a flake"
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"matcher": "Bash",
|
|
297
|
+
"hooks": [
|
|
298
|
+
{
|
|
299
|
+
"type": "command",
|
|
300
|
+
"command": "node \"$HOME/.construct/lib/hooks/post-merge-docs-check.mjs\"",
|
|
301
|
+
"timeout": 5,
|
|
302
|
+
"async": true
|
|
303
|
+
}
|
|
304
|
+
],
|
|
305
|
+
"id": "post:bash:post-merge-docs-check",
|
|
306
|
+
"description": "Emit doc-drift events when a merge lands without matching docs/CHANGELOG updates"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"matcher": "Edit|Write|MultiEdit|NotebookEdit|Bash",
|
|
310
|
+
"hooks": [
|
|
311
|
+
{
|
|
312
|
+
"type": "command",
|
|
313
|
+
"command": "node \"$HOME/.construct/lib/hooks/audit-trail.mjs\"",
|
|
314
|
+
"timeout": 5
|
|
315
|
+
}
|
|
316
|
+
],
|
|
317
|
+
"id": "post:audit-trail",
|
|
318
|
+
"description": "Append-only audit log of every mutation — attribution (agent/task) and tamper-evidence chain"
|
|
281
319
|
}
|
|
282
320
|
],
|
|
283
321
|
"PostToolUseFailure": [
|
|
@@ -353,12 +391,12 @@
|
|
|
353
391
|
"hooks": [
|
|
354
392
|
{
|
|
355
393
|
"type": "command",
|
|
356
|
-
"command": "node \"$HOME/.construct/lib/hooks/
|
|
357
|
-
"timeout":
|
|
394
|
+
"command": "node \"$HOME/.construct/lib/hooks/policy-engine.mjs\" Stop",
|
|
395
|
+
"timeout": 15
|
|
358
396
|
}
|
|
359
397
|
],
|
|
360
|
-
"id": "stop:
|
|
361
|
-
"description": "
|
|
398
|
+
"id": "stop:policy-engine",
|
|
399
|
+
"description": "Consolidated stop policy: block on red CI (CONSTRUCT_STOP_OK_RED_CI=1 to ack), block on in_progress beads (CONSTRUCT_STOP_OK_OPEN_BD=1 to ack), enforce drive-mode criteria, advise on open drive-session"
|
|
362
400
|
},
|
|
363
401
|
{
|
|
364
402
|
"matcher": "*",
|
|
@@ -377,25 +415,26 @@
|
|
|
377
415
|
"hooks": [
|
|
378
416
|
{
|
|
379
417
|
"type": "command",
|
|
380
|
-
"command": "node \"$HOME/.construct/lib/hooks/
|
|
381
|
-
"timeout":
|
|
418
|
+
"command": "node \"$HOME/.construct/lib/hooks/readme-age-check.mjs\"",
|
|
419
|
+
"timeout": 5,
|
|
382
420
|
"async": true
|
|
383
421
|
}
|
|
384
422
|
],
|
|
385
|
-
"id": "stop:
|
|
386
|
-
"description": "
|
|
423
|
+
"id": "stop:readme-age-check",
|
|
424
|
+
"description": "Emit readme.stale role events for tracked READMEs older than 90 days"
|
|
387
425
|
},
|
|
388
426
|
{
|
|
389
427
|
"matcher": "*",
|
|
390
428
|
"hooks": [
|
|
391
429
|
{
|
|
392
430
|
"type": "command",
|
|
393
|
-
"command": "node \"$HOME/.construct/lib/hooks/
|
|
394
|
-
"timeout": 10
|
|
431
|
+
"command": "node \"$HOME/.construct/lib/hooks/stop-notify.mjs\"",
|
|
432
|
+
"timeout": 10,
|
|
433
|
+
"async": true
|
|
395
434
|
}
|
|
396
435
|
],
|
|
397
|
-
"id": "stop:
|
|
398
|
-
"description": "
|
|
436
|
+
"id": "stop:notify",
|
|
437
|
+
"description": "Desktop notification: files changed, TS status, session cost"
|
|
399
438
|
},
|
|
400
439
|
{
|
|
401
440
|
"matcher": "*",
|
|
@@ -408,34 +447,45 @@
|
|
|
408
447
|
],
|
|
409
448
|
"id": "stop:snapshot",
|
|
410
449
|
"description": "Snapshot .cx/context.md at session end so resume has real progress"
|
|
411
|
-
}
|
|
412
|
-
],
|
|
413
|
-
"TeammateIdle": [
|
|
450
|
+
},
|
|
414
451
|
{
|
|
415
452
|
"matcher": "*",
|
|
416
453
|
"hooks": [
|
|
417
454
|
{
|
|
418
455
|
"type": "command",
|
|
419
|
-
"command": "node \"$HOME/.construct/lib/hooks/
|
|
420
|
-
"timeout":
|
|
456
|
+
"command": "node \"$HOME/.construct/lib/hooks/session-optimize.mjs\"",
|
|
457
|
+
"timeout": 600,
|
|
458
|
+
"async": true
|
|
421
459
|
}
|
|
422
460
|
],
|
|
423
|
-
"id": "
|
|
424
|
-
"description": "
|
|
461
|
+
"id": "stop:optimize-agents",
|
|
462
|
+
"description": "Check performance reviews and auto-optimize low-scoring agents at session end"
|
|
425
463
|
}
|
|
426
464
|
],
|
|
427
|
-
"
|
|
465
|
+
"UserPromptSubmit": [
|
|
428
466
|
{
|
|
429
467
|
"matcher": "*",
|
|
430
468
|
"hooks": [
|
|
431
469
|
{
|
|
432
470
|
"type": "command",
|
|
433
|
-
"command": "node \"$HOME/.construct/lib/hooks/
|
|
434
|
-
"timeout":
|
|
471
|
+
"command": "node \"$HOME/.construct/lib/hooks/context-watch.mjs\"",
|
|
472
|
+
"timeout": 5
|
|
435
473
|
}
|
|
436
474
|
],
|
|
437
|
-
"id": "
|
|
438
|
-
"description": "
|
|
475
|
+
"id": "prompt:context-watch",
|
|
476
|
+
"description": "Inject compaction guidance when session token usage crosses 60% / 80% thresholds"
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
"matcher": "*",
|
|
480
|
+
"hooks": [
|
|
481
|
+
{
|
|
482
|
+
"type": "command",
|
|
483
|
+
"command": "node \"$HOME/.construct/lib/hooks/ci-status-check.mjs\"",
|
|
484
|
+
"timeout": 5
|
|
485
|
+
}
|
|
486
|
+
],
|
|
487
|
+
"id": "prompt:ci-status",
|
|
488
|
+
"description": "Inject remote CI status (gh run list) into agent context so red CI is visible immediately. Cached 60s."
|
|
439
489
|
}
|
|
440
490
|
]
|
|
441
491
|
},
|
|
@@ -455,11 +505,8 @@
|
|
|
455
505
|
]
|
|
456
506
|
},
|
|
457
507
|
"memory": {
|
|
458
|
-
"
|
|
459
|
-
"
|
|
460
|
-
"-y",
|
|
461
|
-
"@modelcontextprotocol/server-memory"
|
|
462
|
-
]
|
|
508
|
+
"type": "http",
|
|
509
|
+
"url": "http://127.0.0.1:8765/"
|
|
463
510
|
},
|
|
464
511
|
"playwright": {
|
|
465
512
|
"command": "npx",
|