@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
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* bin/construct-postinstall.mjs — npm postinstall hook for consumer projects.
|
|
4
|
+
*
|
|
5
|
+
* When a downstream project pins `@geraldmaron/construct` as a (dev)Dependency
|
|
6
|
+
* and runs `npm install`, npm fetches Construct into the project's
|
|
7
|
+
* `node_modules/` and then runs this script. Its job: regenerate the project's
|
|
8
|
+
* `.claude/agents/` and `.claude/settings.json` from the bundled registry so
|
|
9
|
+
* the project clone is fully runnable without a manual `construct init`.
|
|
10
|
+
*
|
|
11
|
+
* The script is a no-op in three cases:
|
|
12
|
+
*
|
|
13
|
+
* 1. The install is happening inside the Construct repo itself.
|
|
14
|
+
* 2. CONSTRUCT_SKIP_POSTINSTALL=1 is set.
|
|
15
|
+
* 3. The install target has no package.json (monorepo nested installs).
|
|
16
|
+
*
|
|
17
|
+
* Staging itself lives in `lib/install/stage-project.mjs` so `construct init`
|
|
18
|
+
* can call the same code path for opt-in adoption after a clone.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { spawnSync } from 'node:child_process';
|
|
22
|
+
import { existsSync, statSync, readFileSync } from 'node:fs';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import { fileURLToPath } from 'node:url';
|
|
25
|
+
|
|
26
|
+
import { stageProjectAdapters } from '../lib/install/stage-project.mjs';
|
|
27
|
+
|
|
28
|
+
const HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
29
|
+
const PKG_ROOT = path.resolve(HERE, '..');
|
|
30
|
+
const PKG_VERSION = (() => {
|
|
31
|
+
try { return JSON.parse(readFileSync(path.join(PKG_ROOT, 'package.json'), 'utf8')).version || ''; }
|
|
32
|
+
catch { return ''; }
|
|
33
|
+
})();
|
|
34
|
+
|
|
35
|
+
const log = (msg) => process.stdout.write(`[construct-postinstall] ${msg}\n`);
|
|
36
|
+
|
|
37
|
+
if (process.env.CONSTRUCT_SKIP_POSTINSTALL === '1') {
|
|
38
|
+
log('skipping (CONSTRUCT_SKIP_POSTINSTALL=1)');
|
|
39
|
+
process.exit(0);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const initCwd = process.env.INIT_CWD || process.cwd();
|
|
43
|
+
|
|
44
|
+
// Skip when installing inside the Construct repo itself, but still wire up
|
|
45
|
+
// the local commit template so contributors get the right editor scaffolding.
|
|
46
|
+
try {
|
|
47
|
+
const pkgRealRoot = statSync(PKG_ROOT).isDirectory() ? PKG_ROOT : null;
|
|
48
|
+
if (pkgRealRoot && pkgRealRoot.startsWith(initCwd) && initCwd === PKG_ROOT) {
|
|
49
|
+
log('install is inside the Construct repo itself; skipping sync');
|
|
50
|
+
if (existsSync(path.join(PKG_ROOT, '.gitmessage')) && existsSync(path.join(PKG_ROOT, '.git'))) {
|
|
51
|
+
const cfg = spawnSync('git', ['config', 'commit.template', '.gitmessage'], {
|
|
52
|
+
cwd: PKG_ROOT,
|
|
53
|
+
stdio: 'ignore',
|
|
54
|
+
});
|
|
55
|
+
if (cfg.status === 0) log('configured git commit.template -> .gitmessage');
|
|
56
|
+
}
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
} catch { /* fall through */ }
|
|
60
|
+
|
|
61
|
+
// Require a package.json at the install target so monorepo nested installs
|
|
62
|
+
// don't accidentally trigger staging in the wrong directory.
|
|
63
|
+
|
|
64
|
+
const consumerPkgPath = path.join(initCwd, 'package.json');
|
|
65
|
+
if (!existsSync(consumerPkgPath)) {
|
|
66
|
+
log(`no package.json at ${initCwd}; skipping`);
|
|
67
|
+
process.exit(0);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let consumerPkg = {};
|
|
71
|
+
try { consumerPkg = JSON.parse(readFileSync(consumerPkgPath, 'utf8')); } catch { /* empty */ }
|
|
72
|
+
if (consumerPkg.name === '@geraldmaron/construct') {
|
|
73
|
+
log('install target is the Construct package itself; skipping');
|
|
74
|
+
process.exit(0);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
stageProjectAdapters({
|
|
79
|
+
projectRoot: initCwd,
|
|
80
|
+
packageRoot: PKG_ROOT,
|
|
81
|
+
pkgVersion: PKG_VERSION,
|
|
82
|
+
log,
|
|
83
|
+
});
|
|
84
|
+
} catch (err) {
|
|
85
|
+
log(`staging failed: ${err.message}; leaving project in a clean state`);
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
@@ -13,9 +13,9 @@ Before writing a line:
|
|
|
13
13
|
1. Read every file you will touch. Understand the existing pattern before deviating.
|
|
14
14
|
2. If the approach is uncertain, consult cx-architect first.
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
-
|
|
16
|
+
When dispatching subagents: set an implicit timeout expectation. If a dispatched agent
|
|
17
|
+
produces no output or tool activity within two minutes, surface it to the user with the
|
|
18
|
+
agent description and elapsed time rather than waiting silently. Do not re-dispatch until
|
|
19
|
+
the user confirms the prior invocation is not still running.
|
|
20
|
+
|
|
21
|
+
Verification protocol is owned by `cx-engineer` — apply its checklist before declaring done.
|
package/commands/plan/feature.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
<!--
|
|
2
|
-
commands/plan/feature.md — Plan a feature and
|
|
2
|
+
commands/plan/feature.md — Plan a feature and turn it into a tracker-linked implementation plan
|
|
3
3
|
|
|
4
4
|
Produces a structured spec using the canonical Construct plan format, saves it
|
|
5
|
-
to .cx/plans
|
|
5
|
+
to .cx/plans/ as a durable planning artifact linked to the active tracker slice.
|
|
6
6
|
-->
|
|
7
7
|
---
|
|
8
|
-
description: Plan a feature — produce a structured spec and
|
|
8
|
+
description: Plan a feature — produce a structured spec and link it to the active tracker-backed plan
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
You are Construct. Plan the following: $ARGUMENTS
|
|
@@ -45,5 +45,6 @@ Rules:
|
|
|
45
45
|
|
|
46
46
|
## Step 3 — Save and import
|
|
47
47
|
1. Save this full plan to `.cx/plans/{slug}-plan.md`
|
|
48
|
-
2.
|
|
49
|
-
3.
|
|
48
|
+
2. If the project uses Beads or another external tracker, include the issue id in the plan and keep the current `plan.md` aligned with it
|
|
49
|
+
3. Declare file ownership explicitly so parallel work still follows the single-writer rule
|
|
50
|
+
4. Report: tracker links, plan path, and ownership boundaries
|
|
@@ -21,4 +21,4 @@ Do not proceed to implementation until these are clear.
|
|
|
21
21
|
|
|
22
22
|
## Next step
|
|
23
23
|
|
|
24
|
-
Once requirements are agreed, run `/plan feature {topic}` to produce a structured implementation plan
|
|
24
|
+
Once requirements are agreed, run `/plan feature {topic}` to produce a structured implementation plan tied to the tracker and `plan.md`.
|
package/commands/ship/status.md
CHANGED
|
@@ -10,7 +10,7 @@ description: Status — current project state, workflow, uncommitted changes, re
|
|
|
10
10
|
You are Construct. Report status for: $ARGUMENTS
|
|
11
11
|
|
|
12
12
|
Check and report:
|
|
13
|
-
1.
|
|
13
|
+
1. Tracker and `plan.md` state — active slices, blockers, and ownership boundaries
|
|
14
14
|
2. Uncommitted changes via `git status`
|
|
15
15
|
3. Recent commits via `git log --oneline -10`
|
|
16
16
|
4. Active branch and relationship to main
|
package/commands/work/drive.md
CHANGED
|
@@ -11,7 +11,7 @@ You are Construct in drive mode. Execute $ARGUMENTS fully and autonomously witho
|
|
|
11
11
|
|
|
12
12
|
## Execution contract
|
|
13
13
|
|
|
14
|
-
Use the code-backed orchestration policy
|
|
14
|
+
Use the code-backed orchestration policy, tracker state, and `plan.md` as the control plane.
|
|
15
15
|
This command turns off planning confirmation, but it does not override validation, acceptance criteria, or approval boundaries.
|
|
16
16
|
|
|
17
17
|
## Execution Loop
|
|
@@ -20,7 +20,7 @@ This command turns off planning confirmation, but it does not override validatio
|
|
|
20
20
|
Map the codebase areas relevant to the task. Identify entry points, dependencies, and affected modules.
|
|
21
21
|
|
|
22
22
|
**Step 2 — Plan** (cx-architect)
|
|
23
|
-
Produce a structured plan using the canonical Construct plan format (see `commands/plan/feature.md` — `### T{N} — Title` sections with fielded sub-bullets). Save it to `.cx/plans/{slug}-plan.md`,
|
|
23
|
+
Produce a structured plan using the canonical Construct plan format (see `commands/plan/feature.md` — `### T{N} — Title` sections with fielded sub-bullets). Save it to `.cx/plans/{slug}-plan.md`, align `plan.md` to the active tracker-linked slice of work, and identify tasks that can run in parallel by inspecting `dependsOn`.
|
|
24
24
|
|
|
25
25
|
Initialize `.cx/drive-state.json`:
|
|
26
26
|
```json
|
|
@@ -66,4 +66,4 @@ Only stop when ALL of the following are true:
|
|
|
66
66
|
- Do not stop to ask for confirmation. If blocked by genuine ambiguity, surface the specific blocker and propose a resolution before stopping.
|
|
67
67
|
- Prefer parallel execution for independent tasks.
|
|
68
68
|
- Write verification evidence into each workflow task before marking it `done`.
|
|
69
|
-
- If context is running low,
|
|
69
|
+
- If context is running low, summarize the current handoff point in `plan.md` or the tracker and preserve the single-writer boundary for each file.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
commands/work/optimize-prompts.md — Prompt optimization command.
|
|
3
3
|
|
|
4
|
-
Runs the closed-loop prompt optimization workflow using
|
|
4
|
+
Runs the closed-loop prompt optimization workflow using telemetry trace data.
|
|
5
5
|
-->
|
|
6
6
|
---
|
|
7
|
-
description: Closed-loop prompt optimization — read
|
|
7
|
+
description: Closed-loop prompt optimization — read telemetry traces, diagnose failures, push improved version to staging
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
You are cx-trace-reviewer running a prompt optimization cycle for: $ARGUMENTS
|
|
@@ -19,7 +19,7 @@ Optimize prompt fragments and overlays, not the runtime orchestration policy. If
|
|
|
19
19
|
## Required steps
|
|
20
20
|
|
|
21
21
|
1. **Read current prompt** — read the agent's prompt from `agents/registry.json` (or its `promptFile`)
|
|
22
|
-
2. **Fetch recent scores** — GET `{
|
|
22
|
+
2. **Fetch recent scores** — GET `{CONSTRUCT_TELEMETRY_URL}/api/public/scores?name=quality&limit=200`
|
|
23
23
|
3. **Skip agents with fewer than 20 scored traces** — insufficient signal; note them but do not optimize
|
|
24
24
|
4. **Diagnose failure patterns** — analyze low-scoring traces, identify top 3 recurring patterns
|
|
25
25
|
5. **Generate improved prompt** — targeted edits that address failures without breaking high-scoring behaviors
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
-- db/schema/002_pgvector.sql
|
|
2
|
+
-- Enable pgvector extension and add vector-typed columns for semantic search.
|
|
3
|
+
-- This migration is idempotent — safe to run multiple times.
|
|
4
|
+
|
|
5
|
+
-- Enable pgvector extension
|
|
6
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
7
|
+
|
|
8
|
+
-- Add vector column to construct_embeddings if it doesn't exist yet
|
|
9
|
+
-- (The original 001_init.sql used double precision[], which we keep for backward compat)
|
|
10
|
+
DO $$
|
|
11
|
+
BEGIN
|
|
12
|
+
-- Check if embedding column is still array type and needs migration
|
|
13
|
+
IF EXISTS (
|
|
14
|
+
SELECT 1 FROM information_schema.columns
|
|
15
|
+
WHERE table_name = 'construct_embeddings'
|
|
16
|
+
AND column_name = 'embedding'
|
|
17
|
+
AND data_type = 'ARRAY'
|
|
18
|
+
) THEN
|
|
19
|
+
-- Add new vector column
|
|
20
|
+
ALTER TABLE construct_embeddings ADD COLUMN embedding_vec vector(384);
|
|
21
|
+
|
|
22
|
+
-- Copy data from old array column to new vector column
|
|
23
|
+
UPDATE construct_embeddings
|
|
24
|
+
SET embedding_vec = embedding::vector(384);
|
|
25
|
+
|
|
26
|
+
-- Drop old column and rename
|
|
27
|
+
ALTER TABLE construct_embeddings DROP COLUMN embedding;
|
|
28
|
+
ALTER TABLE construct_embeddings RENAME COLUMN embedding_vec TO embedding;
|
|
29
|
+
END IF;
|
|
30
|
+
END $$;
|
|
31
|
+
|
|
32
|
+
-- Ensure embedding column exists as vector type (for fresh installs)
|
|
33
|
+
ALTER TABLE construct_embeddings
|
|
34
|
+
ALTER COLUMN embedding TYPE vector(384) USING embedding::vector(384);
|
|
35
|
+
|
|
36
|
+
-- Create HNSW index for fast approximate nearest neighbor search
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_embeddings_hnsw
|
|
38
|
+
ON construct_embeddings
|
|
39
|
+
USING hnsw (embedding vector_cosine_ops)
|
|
40
|
+
WITH (m = 16, ef_construction = 64);
|
|
41
|
+
|
|
42
|
+
-- Create observations table with vector support
|
|
43
|
+
CREATE TABLE IF NOT EXISTS construct_observations (
|
|
44
|
+
id text PRIMARY KEY,
|
|
45
|
+
project text NOT NULL,
|
|
46
|
+
role text NOT NULL,
|
|
47
|
+
category text NOT NULL,
|
|
48
|
+
summary text NOT NULL,
|
|
49
|
+
content text NOT NULL,
|
|
50
|
+
tags jsonb NOT NULL DEFAULT '[]'::jsonb,
|
|
51
|
+
confidence float NOT NULL DEFAULT 0.8,
|
|
52
|
+
source text,
|
|
53
|
+
git_sha text,
|
|
54
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
55
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
56
|
+
embedding vector(384)
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
-- Indexes for observations
|
|
60
|
+
CREATE INDEX IF NOT EXISTS idx_observations_project ON construct_observations(project);
|
|
61
|
+
CREATE INDEX IF NOT EXISTS idx_observations_category ON construct_observations(project, category);
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_observations_created_at ON construct_observations(project, created_at DESC);
|
|
63
|
+
CREATE INDEX IF NOT EXISTS idx_observations_vector ON construct_observations USING hnsw (embedding vector_cosine_ops);
|
|
64
|
+
|
|
65
|
+
-- Create sessions table with vector support
|
|
66
|
+
CREATE TABLE IF NOT EXISTS construct_sessions (
|
|
67
|
+
id text PRIMARY KEY,
|
|
68
|
+
project text NOT NULL,
|
|
69
|
+
platform text,
|
|
70
|
+
summary text,
|
|
71
|
+
decisions jsonb DEFAULT '[]'::jsonb,
|
|
72
|
+
files_changed jsonb DEFAULT '[]'::jsonb,
|
|
73
|
+
open_questions jsonb DEFAULT '[]'::jsonb,
|
|
74
|
+
task_snapshot jsonb DEFAULT '[]'::jsonb,
|
|
75
|
+
status text DEFAULT 'active',
|
|
76
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
77
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
78
|
+
embedding vector(384)
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_project ON construct_sessions(project);
|
|
82
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_status ON construct_sessions(project, status);
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_vector ON construct_sessions USING hnsw (embedding vector_cosine_ops);
|
|
84
|
+
|
|
85
|
+
-- Create entities table with vector support
|
|
86
|
+
CREATE TABLE IF NOT EXISTS construct_entities (
|
|
87
|
+
name text PRIMARY KEY,
|
|
88
|
+
type text NOT NULL,
|
|
89
|
+
summary text,
|
|
90
|
+
project text,
|
|
91
|
+
observation_ids jsonb DEFAULT '[]'::jsonb,
|
|
92
|
+
related_entities jsonb DEFAULT '[]'::jsonb,
|
|
93
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
94
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
95
|
+
last_seen timestamptz,
|
|
96
|
+
embedding vector(384)
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
CREATE INDEX IF NOT EXISTS idx_entities_type ON construct_entities(type);
|
|
100
|
+
CREATE INDEX IF NOT EXISTS idx_entities_project ON construct_entities(project);
|
|
101
|
+
CREATE INDEX IF NOT EXISTS idx_entities_vector ON construct_entities USING hnsw (embedding vector_cosine_ops);
|
|
102
|
+
|
|
103
|
+
-- Function for searching documents by embedding
|
|
104
|
+
CREATE OR REPLACE FUNCTION search_documents(
|
|
105
|
+
project_name text,
|
|
106
|
+
query_embedding vector(384),
|
|
107
|
+
match_limit int DEFAULT 10,
|
|
108
|
+
min_similarity float DEFAULT 0.3
|
|
109
|
+
)
|
|
110
|
+
RETURNS TABLE(
|
|
111
|
+
id text,
|
|
112
|
+
title text,
|
|
113
|
+
summary text,
|
|
114
|
+
body text,
|
|
115
|
+
source_path text,
|
|
116
|
+
tags jsonb,
|
|
117
|
+
kind text,
|
|
118
|
+
similarity float
|
|
119
|
+
) AS $$
|
|
120
|
+
BEGIN
|
|
121
|
+
RETURN QUERY
|
|
122
|
+
SELECT
|
|
123
|
+
d.id,
|
|
124
|
+
d.title,
|
|
125
|
+
d.summary,
|
|
126
|
+
d.body,
|
|
127
|
+
d.source_path,
|
|
128
|
+
d.tags,
|
|
129
|
+
d.kind,
|
|
130
|
+
1 - (e.embedding <=> query_embedding) AS similarity
|
|
131
|
+
FROM construct_documents d
|
|
132
|
+
JOIN construct_embeddings e ON d.id = e.document_id
|
|
133
|
+
WHERE d.project = project_name
|
|
134
|
+
AND 1 - (e.embedding <=> query_embedding) > min_similarity
|
|
135
|
+
ORDER BY e.embedding <=> query_embedding
|
|
136
|
+
LIMIT match_limit;
|
|
137
|
+
END;
|
|
138
|
+
$$ LANGUAGE plpgsql;
|
|
139
|
+
|
|
140
|
+
-- Function for searching observations by embedding
|
|
141
|
+
CREATE OR REPLACE FUNCTION search_observations(
|
|
142
|
+
project_name text,
|
|
143
|
+
query_embedding vector(384),
|
|
144
|
+
match_limit int DEFAULT 10,
|
|
145
|
+
min_similarity float DEFAULT 0.3,
|
|
146
|
+
filter_role text DEFAULT NULL,
|
|
147
|
+
filter_category text DEFAULT NULL
|
|
148
|
+
)
|
|
149
|
+
RETURNS TABLE(
|
|
150
|
+
id text,
|
|
151
|
+
role text,
|
|
152
|
+
category text,
|
|
153
|
+
summary text,
|
|
154
|
+
content text,
|
|
155
|
+
tags jsonb,
|
|
156
|
+
confidence float,
|
|
157
|
+
source text,
|
|
158
|
+
created_at timestamptz,
|
|
159
|
+
similarity float
|
|
160
|
+
) AS $$
|
|
161
|
+
BEGIN
|
|
162
|
+
RETURN QUERY
|
|
163
|
+
SELECT
|
|
164
|
+
o.id,
|
|
165
|
+
o.role,
|
|
166
|
+
o.category,
|
|
167
|
+
o.summary,
|
|
168
|
+
o.content,
|
|
169
|
+
o.tags,
|
|
170
|
+
o.confidence,
|
|
171
|
+
o.source,
|
|
172
|
+
o.created_at,
|
|
173
|
+
1 - (o.embedding <=> query_embedding) AS similarity
|
|
174
|
+
FROM construct_observations o
|
|
175
|
+
WHERE o.project = project_name
|
|
176
|
+
AND 1 - (o.embedding <=> query_embedding) > min_similarity
|
|
177
|
+
AND (filter_role IS NULL OR o.role = filter_role)
|
|
178
|
+
AND (filter_category IS NULL OR o.category = filter_category)
|
|
179
|
+
ORDER BY o.embedding <=> query_embedding
|
|
180
|
+
LIMIT match_limit;
|
|
181
|
+
END;
|
|
182
|
+
$$ LANGUAGE plpgsql;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
-- 003_intake.sql — R&D intake queue backing table for team and enterprise mode.
|
|
2
|
+
-- Solo mode uses the filesystem under .cx/intake/ instead.
|
|
3
|
+
--
|
|
4
|
+
-- Worker claim algorithm: SELECT ... FROM construct_intake_items
|
|
5
|
+
-- WHERE status = 'pending' ORDER BY created_at ASC FOR UPDATE SKIP LOCKED LIMIT 1;
|
|
6
|
+
-- then set status = 'claimed', claimed_by, claimed_at in the same transaction.
|
|
7
|
+
--
|
|
8
|
+
-- payload jsonb carries the rest of the intake packet (intake, triage,
|
|
9
|
+
-- suggestion, related, excerpt, query) so the on-disk shape and the
|
|
10
|
+
-- in-table shape stay aligned.
|
|
11
|
+
|
|
12
|
+
create table if not exists construct_intake_items (
|
|
13
|
+
id text primary key,
|
|
14
|
+
project text not null,
|
|
15
|
+
tenant_id text,
|
|
16
|
+
status text not null default 'pending',
|
|
17
|
+
intake_type text,
|
|
18
|
+
rd_stage text,
|
|
19
|
+
primary_owner text,
|
|
20
|
+
recommended_action text,
|
|
21
|
+
risk text,
|
|
22
|
+
requires_approval boolean not null default false,
|
|
23
|
+
confidence double precision,
|
|
24
|
+
payload jsonb not null,
|
|
25
|
+
created_at timestamptz not null default now(),
|
|
26
|
+
updated_at timestamptz not null default now(),
|
|
27
|
+
claimed_by text,
|
|
28
|
+
claimed_at timestamptz,
|
|
29
|
+
processed_at timestamptz,
|
|
30
|
+
processed_by text,
|
|
31
|
+
notes text,
|
|
32
|
+
skipped_at timestamptz,
|
|
33
|
+
skipped_by text,
|
|
34
|
+
skip_reason text
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
create index if not exists construct_intake_items_status_idx
|
|
38
|
+
on construct_intake_items(status, created_at);
|
|
39
|
+
|
|
40
|
+
create index if not exists construct_intake_items_owner_idx
|
|
41
|
+
on construct_intake_items(primary_owner, status, created_at);
|
|
42
|
+
|
|
43
|
+
create index if not exists construct_intake_items_payload_gin_idx
|
|
44
|
+
on construct_intake_items using gin(payload);
|
|
45
|
+
|
|
46
|
+
create index if not exists construct_intake_items_project_tenant_idx
|
|
47
|
+
on construct_intake_items(project, tenant_id, status);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Prompt Example Fixtures
|
|
2
|
+
|
|
3
|
+
This directory holds shipped example fixtures for Construct's public persona and internal role layers.
|
|
4
|
+
|
|
5
|
+
Use it for three things:
|
|
6
|
+
|
|
7
|
+
- golden examples: canonical strong behavior worth preserving
|
|
8
|
+
- bad examples: labeled failure modes that should fail review/eval
|
|
9
|
+
- boundary and adversarial examples: ambiguity, escalation, stale context, and injection pressure
|
|
10
|
+
|
|
11
|
+
Best practice in this repo:
|
|
12
|
+
|
|
13
|
+
- keep the public persona and internal specialist prompts lean and rule-based
|
|
14
|
+
- keep most examples here as regression fixtures, not embedded into prompt bodies
|
|
15
|
+
- use bad examples as critique and eval assets, not as raw few-shot prompt content
|
|
16
|
+
- add in-prompt examples only when behavior is hard to specify precisely in rules
|
|
17
|
+
|
|
18
|
+
## Layout
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
examples/
|
|
22
|
+
├── personas/
|
|
23
|
+
│ └── construct/
|
|
24
|
+
│ ├── golden/
|
|
25
|
+
│ ├── bad/
|
|
26
|
+
│ ├── boundary/
|
|
27
|
+
│ └── adversarial/
|
|
28
|
+
└── internal/
|
|
29
|
+
└── roles/
|
|
30
|
+
├── architect/
|
|
31
|
+
├── engineer/
|
|
32
|
+
├── orchestrator/
|
|
33
|
+
├── qa/
|
|
34
|
+
└── reviewer/
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Fixture format
|
|
38
|
+
|
|
39
|
+
Each fixture is markdown with YAML frontmatter.
|
|
40
|
+
|
|
41
|
+
Required frontmatter:
|
|
42
|
+
|
|
43
|
+
- `id`: stable fixture id
|
|
44
|
+
- `surface`: `persona` or `internal-role`
|
|
45
|
+
- `name`: fixture target name, such as `construct` or `engineer`
|
|
46
|
+
- `category`: `golden`, `bad`, `boundary`, or `adversarial`
|
|
47
|
+
- `verdict`: `pass` or `fail`
|
|
48
|
+
- `summary`: one-line purpose
|
|
49
|
+
|
|
50
|
+
Recommended frontmatter:
|
|
51
|
+
|
|
52
|
+
- `references`: prompt or role files this fixture exercises
|
|
53
|
+
- `tags`: stable labels for filtering and future eval harnesses
|
|
54
|
+
|
|
55
|
+
Required body sections:
|
|
56
|
+
|
|
57
|
+
- `## User`
|
|
58
|
+
- `## Expected`
|
|
59
|
+
|
|
60
|
+
Bad fixtures should also include:
|
|
61
|
+
|
|
62
|
+
- `## Why This Fails`
|
|
63
|
+
|
|
64
|
+
## Coverage policy
|
|
65
|
+
|
|
66
|
+
Required public coverage:
|
|
67
|
+
|
|
68
|
+
- `construct`: at least one `golden`, `bad`, `boundary`, and `adversarial`
|
|
69
|
+
|
|
70
|
+
Required internal coverage:
|
|
71
|
+
|
|
72
|
+
- `architect`, `engineer`, `reviewer`, `qa`, and `orchestrator`: at least one `golden` and one `bad`
|
|
73
|
+
|
|
74
|
+
## Authoring rules
|
|
75
|
+
|
|
76
|
+
- Keep fixtures short and behaviorally specific.
|
|
77
|
+
- Prefer one core contract per fixture.
|
|
78
|
+
- Name the expected behavior in repo terms: branch confirmation, approval boundary, routing, verification, blocker surfacing, anti-pattern avoidance.
|
|
79
|
+
- For bad examples, show the failure plainly and explain why it violates the surface contract.
|
|
80
|
+
|
|
81
|
+
See `docs/concepts/prompt-surfaces.md` for the canonical public-vs-internal taxonomy.
|
|
82
|
+
|
|
83
|
+
## Scope
|
|
84
|
+
|
|
85
|
+
These fixtures are shipped examples and regression assets. They are not yet executed by a model harness, but the structure is designed so a future evaluator can consume them without reshaping the corpus.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: architect-bad-clever-plan-without-contracts
|
|
3
|
+
surface: internal-role
|
|
4
|
+
name: architect
|
|
5
|
+
category: bad
|
|
6
|
+
verdict: fail
|
|
7
|
+
summary: Recommends a clever architecture without exposing contracts or rejected alternatives.
|
|
8
|
+
references:
|
|
9
|
+
- skills/roles/architect.md
|
|
10
|
+
- agents/prompts/cx-architect.md
|
|
11
|
+
tags:
|
|
12
|
+
- missing-contracts
|
|
13
|
+
- hidden-dependencies
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## User
|
|
17
|
+
|
|
18
|
+
Design the runtime coordination layer.
|
|
19
|
+
|
|
20
|
+
## Expected
|
|
21
|
+
|
|
22
|
+
This is a bad outcome:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
We should add a shared coordinator and let each module figure it out dynamically.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Why This Fails
|
|
29
|
+
|
|
30
|
+
It hides the interface contract, does not expose tradeoffs, and gives no basis for downstream engineering or review.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: architect-golden-explicit-tradeoff-before-plan
|
|
3
|
+
surface: internal-role
|
|
4
|
+
name: architect
|
|
5
|
+
category: golden
|
|
6
|
+
verdict: pass
|
|
7
|
+
summary: Makes interface and dependency tradeoffs explicit before locking in a plan.
|
|
8
|
+
references:
|
|
9
|
+
- skills/roles/architect.md
|
|
10
|
+
- agents/prompts/cx-architect.md
|
|
11
|
+
tags:
|
|
12
|
+
- tradeoffs
|
|
13
|
+
- contracts
|
|
14
|
+
- architecture
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## User
|
|
18
|
+
|
|
19
|
+
Plan the auth/session split across modules.
|
|
20
|
+
|
|
21
|
+
## Expected
|
|
22
|
+
|
|
23
|
+
Strong architect behavior names the relevant module boundaries, interface contracts, and tradeoffs before recommending a plan. It does not skip directly to file changes or implementation detail.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: engineer-bad-speculative-abstraction
|
|
3
|
+
surface: internal-role
|
|
4
|
+
name: engineer
|
|
5
|
+
category: bad
|
|
6
|
+
verdict: fail
|
|
7
|
+
summary: Introduces an abstraction for future cases without evidence from the code.
|
|
8
|
+
references:
|
|
9
|
+
- skills/roles/engineer.md
|
|
10
|
+
- agents/prompts/cx-engineer.md
|
|
11
|
+
tags:
|
|
12
|
+
- speculative-abstraction
|
|
13
|
+
- unnecessary-surface-area
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## User
|
|
17
|
+
|
|
18
|
+
Add support for this one new storage backend.
|
|
19
|
+
|
|
20
|
+
## Expected
|
|
21
|
+
|
|
22
|
+
This is a bad outcome:
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
I introduced a generic provider factory, backend registry, pluggable resolver, and four config flags so future backends are easy.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Why This Fails
|
|
29
|
+
|
|
30
|
+
It violates the engineer anti-pattern against speculative abstraction. The current case asks for one concrete backend, not a framework for hypothetical future ones.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: engineer-golden-read-before-write
|
|
3
|
+
surface: internal-role
|
|
4
|
+
name: engineer
|
|
5
|
+
category: golden
|
|
6
|
+
verdict: pass
|
|
7
|
+
summary: Reads the touched files and surrounding pattern before proposing code changes.
|
|
8
|
+
references:
|
|
9
|
+
- skills/roles/engineer.md
|
|
10
|
+
- agents/prompts/cx-engineer.md
|
|
11
|
+
tags:
|
|
12
|
+
- read-before-write
|
|
13
|
+
- local-conventions
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## User
|
|
17
|
+
|
|
18
|
+
Rename the auth token helper and update its callers.
|
|
19
|
+
|
|
20
|
+
## Expected
|
|
21
|
+
|
|
22
|
+
Strong engineer behavior reads the helper and at least one caller before drafting the change. It does not jump straight to abstraction or a blind rename.
|
|
23
|
+
|
|
24
|
+
The contract is:
|
|
25
|
+
|
|
26
|
+
- surrounding file is read first
|
|
27
|
+
- at least one caller or call site is examined
|
|
28
|
+
- edits follow existing local conventions
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: orchestrator-bad-everything-becomes-multi-agent
|
|
3
|
+
surface: internal-role
|
|
4
|
+
name: orchestrator
|
|
5
|
+
category: bad
|
|
6
|
+
verdict: fail
|
|
7
|
+
summary: Treats a simple ask as a full orchestrated workflow.
|
|
8
|
+
references:
|
|
9
|
+
- skills/roles/orchestrator.md
|
|
10
|
+
tags:
|
|
11
|
+
- over-orchestration
|
|
12
|
+
- ceremony
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## User
|
|
16
|
+
|
|
17
|
+
What file defines the main persona?
|
|
18
|
+
|
|
19
|
+
## Expected
|
|
20
|
+
|
|
21
|
+
This is a bad outcome:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
Plan: cx-architect for discovery, cx-explorer for repo mapping, cx-reviewer for quality, then cx-docs-keeper for synthesis.
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Why This Fails
|
|
28
|
+
|
|
29
|
+
It violates the orchestrator contract to classify first and choose the smallest adequate path.
|