@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,187 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* .construct/run.mjs — project-local Construct launcher.
|
|
4
|
+
*
|
|
5
|
+
* Resolves the right Construct install for the project and forwards every
|
|
6
|
+
* argument and stream to it. Settings.json hooks invoke this file
|
|
7
|
+
* (`node .construct/run.mjs hook <name>`) so the hook command is identical
|
|
8
|
+
* for every peer who clones the project, regardless of whether they have
|
|
9
|
+
* Construct globally installed or have run `npm install`.
|
|
10
|
+
*
|
|
11
|
+
* Resolution order:
|
|
12
|
+
*
|
|
13
|
+
* 0. `CONSTRUCT_DEV_PATH` env var — if set, points at a Construct checkout
|
|
14
|
+
* and the launcher invokes its `bin/construct`. Used for development
|
|
15
|
+
* and smoke tests; not consulted in normal runs.
|
|
16
|
+
*
|
|
17
|
+
* 1. Workspace `node_modules/@geraldmaron/construct/bin/construct` — if a
|
|
18
|
+
* `npm install` has materialised Construct in this project's node_modules,
|
|
19
|
+
* use that. Fastest, no network.
|
|
20
|
+
*
|
|
21
|
+
* 2. `npx -p @geraldmaron/construct@<version> construct …` — if Node ≥ 18
|
|
22
|
+
* is on PATH but the package isn't installed locally. npx caches the
|
|
23
|
+
* package after the first run. The version pin comes from
|
|
24
|
+
* `.construct/version` next to this file.
|
|
25
|
+
*
|
|
26
|
+
* 3. Globally installed `construct` on PATH — if neither of the above
|
|
27
|
+
* hit but the user has installed Construct globally.
|
|
28
|
+
*
|
|
29
|
+
* 4. Cached binary at `.construct/cache/bin/construct-<os>-<arch>` — if
|
|
30
|
+
* a previous bootstrap downloaded the matching single-file binary
|
|
31
|
+
* from GitHub Releases.
|
|
32
|
+
*
|
|
33
|
+
* 5. Docker container — if the docker daemon is reachable, invoke
|
|
34
|
+
* `ghcr.io/geraldmaron/construct:<pinned-version>` with the project
|
|
35
|
+
* bind-mounted at /work. Lets language-agnostic projects (no Node,
|
|
36
|
+
* no global construct, no binary) still execute hooks. Disable with
|
|
37
|
+
* `CONSTRUCT_DISABLE_DOCKER=1` for environments where docker is
|
|
38
|
+
* reachable but undesirable (e.g. CI runners that prefer fail-fast).
|
|
39
|
+
*
|
|
40
|
+
* 6. Print a precise error with the exact install commands and exit
|
|
41
|
+
* with the documented exit code (127 = command not found).
|
|
42
|
+
*
|
|
43
|
+
* The launcher is intentionally tiny and dependency-free so it never
|
|
44
|
+
* needs `npm install` to be runnable. It uses only Node's stdlib.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
48
|
+
import { existsSync, readFileSync, statSync } from 'node:fs';
|
|
49
|
+
import { dirname, join, resolve } from 'node:path';
|
|
50
|
+
import { fileURLToPath } from 'node:url';
|
|
51
|
+
|
|
52
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
53
|
+
const PROJECT_ROOT = resolve(HERE, '..');
|
|
54
|
+
const VERSION_FILE = join(HERE, 'version');
|
|
55
|
+
const CACHE_BIN_DIR = join(HERE, 'cache', 'bin');
|
|
56
|
+
|
|
57
|
+
function readPinnedVersion() {
|
|
58
|
+
try {
|
|
59
|
+
const v = readFileSync(VERSION_FILE, 'utf8').trim();
|
|
60
|
+
if (v && /^[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z0-9.-]+)?$/.test(v)) return v;
|
|
61
|
+
} catch { /* file missing or unreadable */ }
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function isExecutable(path) {
|
|
66
|
+
try {
|
|
67
|
+
return statSync(path).isFile();
|
|
68
|
+
} catch { return false; }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function commandOnPath(cmd) {
|
|
72
|
+
const probe = spawnSync(process.platform === 'win32' ? 'where' : 'which', [cmd], {
|
|
73
|
+
encoding: 'utf8',
|
|
74
|
+
});
|
|
75
|
+
if (probe.status !== 0) return null;
|
|
76
|
+
const first = probe.stdout.split(/\r?\n/).find(Boolean);
|
|
77
|
+
return first || null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function runForeground(cmd, args, opts = {}) {
|
|
81
|
+
const child = spawn(cmd, args, {
|
|
82
|
+
stdio: 'inherit',
|
|
83
|
+
cwd: opts.cwd || PROJECT_ROOT,
|
|
84
|
+
env: { ...process.env, ...(opts.env || {}) },
|
|
85
|
+
});
|
|
86
|
+
child.on('exit', (code) => process.exit(code ?? 1));
|
|
87
|
+
child.on('error', (err) => {
|
|
88
|
+
process.stderr.write(`[construct] launcher failed to spawn ${cmd}: ${err.message}\n`);
|
|
89
|
+
process.exit(127);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function tryDevPath() {
|
|
94
|
+
const dev = process.env.CONSTRUCT_DEV_PATH;
|
|
95
|
+
if (!dev) return false;
|
|
96
|
+
const candidate = join(dev, 'bin', 'construct');
|
|
97
|
+
if (!isExecutable(candidate)) return false;
|
|
98
|
+
runForeground(process.execPath, [candidate, ...process.argv.slice(2)]);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function tryNodeModules() {
|
|
103
|
+
const candidate = join(
|
|
104
|
+
PROJECT_ROOT,
|
|
105
|
+
'node_modules', '@geraldmaron', 'construct', 'bin', 'construct'
|
|
106
|
+
);
|
|
107
|
+
if (!isExecutable(candidate)) return false;
|
|
108
|
+
runForeground(process.execPath, [candidate, ...process.argv.slice(2)]);
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function tryNpx(version) {
|
|
113
|
+
if (!commandOnPath('npx')) return false;
|
|
114
|
+
const spec = version ? `@geraldmaron/construct@${version}` : '@geraldmaron/construct';
|
|
115
|
+
runForeground('npx', ['-p', spec, '--', 'construct', ...process.argv.slice(2)]);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function tryGlobal() {
|
|
120
|
+
const found = commandOnPath('construct');
|
|
121
|
+
if (!found) return false;
|
|
122
|
+
runForeground(found, process.argv.slice(2));
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function tryCachedBinary() {
|
|
127
|
+
const arch = process.arch === 'arm64' ? 'arm64' : 'x64';
|
|
128
|
+
const os = process.platform === 'darwin' ? 'darwin'
|
|
129
|
+
: process.platform === 'win32' ? 'windows'
|
|
130
|
+
: 'linux';
|
|
131
|
+
const ext = process.platform === 'win32' ? '.exe' : '';
|
|
132
|
+
const candidate = join(CACHE_BIN_DIR, `construct-${os}-${arch}${ext}`);
|
|
133
|
+
if (!isExecutable(candidate)) return false;
|
|
134
|
+
runForeground(candidate, process.argv.slice(2));
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function tryDocker(version) {
|
|
139
|
+
if (process.env.CONSTRUCT_DISABLE_DOCKER === '1') return false;
|
|
140
|
+
if (!commandOnPath('docker')) return false;
|
|
141
|
+
// Confirm the daemon is reachable, not just that the CLI is installed.
|
|
142
|
+
const info = spawnSync('docker', ['info'], { stdio: 'ignore' });
|
|
143
|
+
if (info.status !== 0) return false;
|
|
144
|
+
const tag = version || 'latest';
|
|
145
|
+
const image = `ghcr.io/geraldmaron/construct:${tag}`;
|
|
146
|
+
const userHome = process.env.HOME || process.env.USERPROFILE || '';
|
|
147
|
+
const hostConstructDir = userHome ? join(userHome, '.construct') : null;
|
|
148
|
+
const dockerArgs = [
|
|
149
|
+
'run', '--rm', '-i',
|
|
150
|
+
'-v', `${PROJECT_ROOT}:/work`,
|
|
151
|
+
'-w', '/work',
|
|
152
|
+
'-e', 'CONSTRUCT_PROJECT_ROOT=/work',
|
|
153
|
+
];
|
|
154
|
+
if (hostConstructDir) {
|
|
155
|
+
dockerArgs.push('-v', `${hostConstructDir}:/data/.construct`);
|
|
156
|
+
}
|
|
157
|
+
dockerArgs.push(image, ...process.argv.slice(2));
|
|
158
|
+
runForeground('docker', dockerArgs);
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function fail() {
|
|
163
|
+
const v = readPinnedVersion();
|
|
164
|
+
process.stderr.write(
|
|
165
|
+
'[construct] No Construct install found.\n' +
|
|
166
|
+
'\n' +
|
|
167
|
+
' This project pins Construct' + (v ? ` ${v}` : '') + ' but no runtime resolved.\n' +
|
|
168
|
+
'\n' +
|
|
169
|
+
' Pick one:\n' +
|
|
170
|
+
' - Install Node.js 18+ from https://nodejs.org and re-run.\n' +
|
|
171
|
+
' - Install Construct globally: npm install -g @geraldmaron/construct\n' +
|
|
172
|
+
' - Install Docker: docker pull ghcr.io/geraldmaron/construct\n' +
|
|
173
|
+
' - Bootstrap a binary: ./.construct/bootstrap.sh (POSIX)\n' +
|
|
174
|
+
' powershell -File .construct/bootstrap.ps1 (Windows)\n'
|
|
175
|
+
);
|
|
176
|
+
process.exit(127);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const version = readPinnedVersion();
|
|
180
|
+
|
|
181
|
+
if (tryDevPath()) { /* spawned */ }
|
|
182
|
+
else if (tryNodeModules()) { /* spawned */ }
|
|
183
|
+
else if (tryNpx(version)) { /* spawned */ }
|
|
184
|
+
else if (tryGlobal()) { /* spawned */ }
|
|
185
|
+
else if (tryCachedBinary()) { /* spawned */ }
|
|
186
|
+
else if (tryDocker(version)) { /* spawned */ }
|
|
187
|
+
else fail();
|
package/templates/docs/adr.md
CHANGED
|
@@ -5,23 +5,59 @@
|
|
|
5
5
|
- **Deciders**: {names}
|
|
6
6
|
- **Supersedes**: {ADR-NNN or none}
|
|
7
7
|
|
|
8
|
+
<!--
|
|
9
|
+
Before drafting, read rules/common/framing.md.
|
|
10
|
+
|
|
11
|
+
Required framing rule: every section below must describe the domain
|
|
12
|
+
problem and the decision. Not the ticket. Not the PRD filename. Not the
|
|
13
|
+
meeting that prompted the ADR. A principal engineer who has never seen
|
|
14
|
+
the triggering inputs should be able to read this doc and understand the
|
|
15
|
+
decision and why it was made.
|
|
16
|
+
|
|
17
|
+
Owning specialist: cx-architect (see rules/common/doc-ownership.md).
|
|
18
|
+
-->
|
|
19
|
+
|
|
20
|
+
## Problem
|
|
21
|
+
<!--
|
|
22
|
+
The decision-forcing tension in the domain. State what is currently
|
|
23
|
+
true and what pressure makes a choice unavoidable.
|
|
24
|
+
|
|
25
|
+
Must NOT reference:
|
|
26
|
+
- Jira/Linear ticket IDs or titles
|
|
27
|
+
- PRD filenames or document structure
|
|
28
|
+
- Chat transcripts or meeting notes
|
|
29
|
+
- Process-level framing ("we need to decide how to document X")
|
|
30
|
+
|
|
31
|
+
Should reference:
|
|
32
|
+
- The constraint that makes this non-trivial
|
|
33
|
+
- The cost of not deciding
|
|
34
|
+
- What is observably broken, ambiguous, or at risk
|
|
35
|
+
-->
|
|
36
|
+
|
|
8
37
|
## Context
|
|
9
|
-
<!--
|
|
38
|
+
<!-- Forces at play beyond the core problem. What else is true today that bounds the decision space? Prior ADRs, architectural constraints, external commitments. -->
|
|
10
39
|
|
|
11
40
|
## Decision
|
|
12
41
|
<!-- The position taken, in one or two sentences. State it as a commitment, not a proposal. -->
|
|
13
42
|
|
|
14
43
|
## Rationale
|
|
15
|
-
<!-- Why this decision over the alternatives. The load-bearing reasons. -->
|
|
44
|
+
<!-- Why this decision over the alternatives. The load-bearing reasons, cited to the evidence. If the rationale leans on external references (standards, prior art, vendor behavior), cite them. -->
|
|
16
45
|
|
|
17
|
-
##
|
|
18
|
-
<!--
|
|
46
|
+
## Rejected alternatives
|
|
47
|
+
<!--
|
|
48
|
+
For each alternative considered, one paragraph covering:
|
|
49
|
+
- What the alternative was (concretely enough to be evaluated)
|
|
50
|
+
- The specific reason it was rejected (not "we preferred the chosen option")
|
|
51
|
+
- What evidence or constraint made it inferior
|
|
19
52
|
|
|
20
|
-
|
|
21
|
-
|
|
53
|
+
An ADR without rejected alternatives is a proposal, not a decision.
|
|
54
|
+
-->
|
|
55
|
+
|
|
56
|
+
## Consequences
|
|
57
|
+
<!-- What becomes easier, what becomes harder, what is now locked in. Include second-order effects and the new constraints this decision imposes. -->
|
|
22
58
|
|
|
23
59
|
## Reversibility
|
|
24
|
-
<!-- Is this a one-way or two-way door? What would it take to reverse?
|
|
60
|
+
<!-- Is this a one-way or two-way door? What would it take to reverse? Under what conditions would we revisit? -->
|
|
25
61
|
|
|
26
62
|
## References
|
|
27
|
-
<!--
|
|
63
|
+
<!-- Primary sources, prior ADRs, research briefs, standards. Execution artifacts (tickets, chat) may be listed for traceability but never as load-bearing reasoning. -->
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Changelog: {version} — {YYYY-MM-DD}
|
|
2
|
+
|
|
3
|
+
- **Version**: {semver or date-based tag}
|
|
4
|
+
- **Type**: major | minor | patch | hotfix
|
|
5
|
+
- **Authors**: {names}
|
|
6
|
+
- **Status**: draft | released
|
|
7
|
+
|
|
8
|
+
<!--
|
|
9
|
+
Keep entries user-facing. Describe what changed and why it matters, not how it
|
|
10
|
+
was implemented. Group under standard headings. Link to issues or PRDs when helpful.
|
|
11
|
+
-->
|
|
12
|
+
|
|
13
|
+
## Added
|
|
14
|
+
|
|
15
|
+
<!-- New features, endpoints, capabilities, or commands. -->
|
|
16
|
+
|
|
17
|
+
## Changed
|
|
18
|
+
|
|
19
|
+
<!-- Behaviour changes, interface updates, performance improvements. -->
|
|
20
|
+
|
|
21
|
+
## Fixed
|
|
22
|
+
|
|
23
|
+
<!-- Bug fixes. Link to issue numbers when available. -->
|
|
24
|
+
|
|
25
|
+
## Deprecated
|
|
26
|
+
|
|
27
|
+
<!-- Features that are still working but will be removed in a future release. -->
|
|
28
|
+
|
|
29
|
+
## Removed
|
|
30
|
+
|
|
31
|
+
<!-- Features removed in this release. Note migration path if one exists. -->
|
|
32
|
+
|
|
33
|
+
## Security
|
|
34
|
+
|
|
35
|
+
<!-- Vulnerability fixes. Reference CVE numbers if applicable. -->
|
|
36
|
+
|
|
37
|
+
## Migration notes
|
|
38
|
+
|
|
39
|
+
<!-- Breaking changes and what users need to do. Omit section if none. -->
|
|
40
|
+
|
|
41
|
+
## References
|
|
42
|
+
|
|
43
|
+
<!-- PRDs, RFCs, ADRs, or tracker issues that drove this release. -->
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Welcome to Construct
|
|
2
|
+
|
|
3
|
+
This file was generated by `construct init` to help you get oriented. It's safe to edit — Construct only writes it once, then leaves it alone.
|
|
4
|
+
|
|
5
|
+
**Full docs:** [https://geraldmaron.github.io/construct/v2/](https://geraldmaron.github.io/construct/v2/)
|
|
6
|
+
|
|
7
|
+
## What Construct is doing in your project
|
|
8
|
+
|
|
9
|
+
You added Construct as a dev dependency. That gave you:
|
|
10
|
+
|
|
11
|
+
- **One AI persona to address: `@construct`.** In your editor (Claude Code, OpenCode, Codex, Cursor, or Copilot), you talk to one entity. Behind the scenes, 28 specialists (architect, engineer, security, SRE, designer, …) pick up the work based on what you asked for.
|
|
12
|
+
- **Hard gates.** Every code change runs through commit-time policy: no secrets, tests green, docs current, comments lint-clean. Bypass exists for every gate but leaves an audit trail.
|
|
13
|
+
- **Persistent state.** Your active work, decisions, and history survive across sessions and editor restarts.
|
|
14
|
+
|
|
15
|
+
You don't need to manage any of that — it all runs locally.
|
|
16
|
+
|
|
17
|
+
## Files Construct created in your project
|
|
18
|
+
|
|
19
|
+
You'll see these in `git status`:
|
|
20
|
+
|
|
21
|
+
| Path | What it is | Touch? |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| `.construct/` | Launcher for hooks. Don't edit. Regenerated on `npm install`. | No |
|
|
24
|
+
| `.claude/agents/` | The 29 persona definitions. Regenerated on `npm install`. | No |
|
|
25
|
+
| `.claude/commands/` | Slash commands. Regenerated on `npm install`. | No |
|
|
26
|
+
| `.claude/settings.json` | Hooks + MCP server config. Construct keys are managed; your additions are preserved. | Carefully |
|
|
27
|
+
| `.cx/` | Per-project session state (active work, recent decisions). Construct writes here. | Read-mostly |
|
|
28
|
+
| `.beads/` | Issue tracker data. Use `bd <cmd>` to interact. | Via CLI |
|
|
29
|
+
| `AGENTS.md` | Operating rules the agent reads at session start. | Yes — your house rules go here |
|
|
30
|
+
| `plan.md` | Active work plan. Local-only (gitignored). | Yes — your current focus |
|
|
31
|
+
| `docs/` | Documentation lanes (ADRs, PRDs, memos, …). | Yes — this is your team's docs |
|
|
32
|
+
| `construct_guide.md` | This file. Friendly orientation. | Yes — adapt to your team |
|
|
33
|
+
|
|
34
|
+
## Where to drop information you want Construct to use
|
|
35
|
+
|
|
36
|
+
Three intake paths, ordered by formality:
|
|
37
|
+
|
|
38
|
+
1. **`.cx/inbox/`** — drop a file here (URL, screenshot, paste, anything). The embed daemon watches the directory; when a file lands, it ingests it into the local knowledge base within a second or two and writes a triage packet to `.cx/intake/pending/` describing the new content, its R&D classification (intake type, stage, owner persona, recommended chain), its suggested docs lane, and existing docs that overlap. The agent surfaces pending intake at the next session start and you can ask it to process them — propose updates to existing PRDs/RFCs/ADRs or scaffold new ones — based on the prepared context.
|
|
39
|
+
2. **`docs/intake/`** — for proper intake batches (research notes, evidence from a meeting, raw source material). Has a template. Survives in git history.
|
|
40
|
+
3. **`AGENTS.md`** — for rules and conventions you want the agent to follow every time. "We prefer functional components. Don't introduce new dependencies without flagging." Read at session start.
|
|
41
|
+
|
|
42
|
+
For URLs or quick notes, the easiest path is to drop a file into `~/Downloads` and run:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
construct drop # ingests the most recent download/desktop file
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## How to talk to Construct
|
|
49
|
+
|
|
50
|
+
In your editor:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
@construct help me add OAuth to the login flow
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Construct will classify the request, route to the right specialists (architect for design, engineer for implementation, security for review), and stream results back to you in one conversation.
|
|
57
|
+
|
|
58
|
+
You can also invoke a specialist directly if you know what you want:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
@cx-security audit the auth middleware for OWASP top 10
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The full list of personas lives in `.claude/agents/`. Run `construct list` to see them with descriptions.
|
|
65
|
+
|
|
66
|
+
## How to change Construct settings
|
|
67
|
+
|
|
68
|
+
Two scopes:
|
|
69
|
+
|
|
70
|
+
**Per-project** (committed, shared with peers): edit `.claude/settings.json`. Construct owns the `hooks` block and a known set of `mcpServers` keys (memory, context7, playwright, github, sequential-thinking, construct-mcp); your additions are preserved on `npm install`. Other top-level keys are yours to control.
|
|
71
|
+
|
|
72
|
+
**Per-machine** (private to you): edit `~/.construct/config.env`. This is where your API keys, consent flags, and local-service credentials live. Standard `KEY=value` format.
|
|
73
|
+
|
|
74
|
+
After editing settings, run:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
construct sync # regenerate platform adapters from any registry changes
|
|
78
|
+
construct doctor # verify everything's healthy
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Local services
|
|
82
|
+
|
|
83
|
+
If you ran `construct init` and have Docker, you have three things running locally on Construct's reserved port block (`54329-54339`, chosen to avoid colliding with Next.js, Postgres, Redis, etc.):
|
|
84
|
+
|
|
85
|
+
**Telemetry backend** (LLM observability — see your traces, costs, and quality scores)
|
|
86
|
+
|
|
87
|
+
- URL: <http://localhost:54330>
|
|
88
|
+
|
|
89
|
+
**Postgres + pgvector** (the database that backs hybrid retrieval)
|
|
90
|
+
|
|
91
|
+
- URL: `postgresql://construct:construct@127.0.0.1:54329/construct`
|
|
92
|
+
- Saved as `DATABASE_URL` in `~/.construct/config.env`
|
|
93
|
+
|
|
94
|
+
**Vector storage** (semantic search over your project + ingested docs)
|
|
95
|
+
|
|
96
|
+
- Backend: Postgres + pgvector (384d embeddings, `Xenova/all-MiniLM-L6-v2` model)
|
|
97
|
+
- Model auto-downloaded to `~/.construct/cache/embeddings/` on first use (~22 MB, one time)
|
|
98
|
+
- Run `construct search "your query"` to see it work
|
|
99
|
+
|
|
100
|
+
If you skipped Docker, Construct falls back to a local JSON vector index at `~/.construct/vector/index.json` and stops emitting traces — semantic search still works, just slower at scale, and the telemetry backend isn't available.
|
|
101
|
+
|
|
102
|
+
All ports bind to `127.0.0.1` only; nothing is reachable from other machines on your network.
|
|
103
|
+
|
|
104
|
+
## Useful commands
|
|
105
|
+
|
|
106
|
+
| Command | What it does |
|
|
107
|
+
|---|---|
|
|
108
|
+
| `construct init` | One-time per-machine: spins up local services, writes config |
|
|
109
|
+
| `construct config [mode <m>]` | Show active deployment mode (solo / team / enterprise) or set a new one |
|
|
110
|
+
| `construct doctor` | Health check across config, services, agents, hooks |
|
|
111
|
+
| `construct sync` | Regenerate platform adapters (Claude Code, OpenCode, Codex, Cursor) |
|
|
112
|
+
| `construct up` / `construct down` | Start / stop local services |
|
|
113
|
+
| `construct status` | Live runtime status (services, providers, daemons) |
|
|
114
|
+
| `construct intake list / show / done / skip / reopen` | Drive the R&D intake queue produced from `.cx/inbox/` |
|
|
115
|
+
| `construct graph from-intake <id>` | Generate a task graph from a triaged intake packet |
|
|
116
|
+
| `construct drop` | Ingest the most recent downloaded file |
|
|
117
|
+
| `construct search "..."` | Hybrid file + SQL + semantic search over project state |
|
|
118
|
+
| `construct uninstall` | Interactive teardown — never touches Docker or your code |
|
|
119
|
+
|
|
120
|
+
Full reference: <https://geraldmaron.github.io/construct/v2/docs/reference/cli>
|
|
121
|
+
|
|
122
|
+
## Updating Construct
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
npm update @geraldmaron/construct
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
That refreshes the agents, hooks, and slash commands in `.claude/` and `.construct/`. Your `.cx/`, `AGENTS.md`, `plan.md`, and `docs/` content is untouched.
|
|
129
|
+
|
|
130
|
+
## When things go wrong
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
construct doctor # most issues surface here with a fix hint
|
|
134
|
+
construct down && construct up # restart local services
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Troubleshooting guide: <https://geraldmaron.github.io/construct/v2/docs/operations/troubleshooting>
|
|
138
|
+
|
|
139
|
+
## Next steps
|
|
140
|
+
|
|
141
|
+
- [Connect your editor](https://geraldmaron.github.io/construct/v2/docs/start/connect-your-editor) if you haven't already.
|
|
142
|
+
- [Run your first task](https://geraldmaron.github.io/construct/v2/docs/start/first-task) to feel the flow.
|
|
143
|
+
- Skim [the architecture](https://geraldmaron.github.io/construct/v2/docs/concepts/architecture) when you have 10 minutes — it'll save you hours later.
|
|
144
|
+
|
|
145
|
+
If you'd rather have a teammate walk you through it, the persona itself can:
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
@construct give me a tour of this project — what's wired up, what's optional, what should I look at first
|
|
149
|
+
```
|
|
@@ -19,13 +19,13 @@ source lists or grouped findings. Keep em dashes rare.
|
|
|
19
19
|
<!-- State the minimum signal needed to proceed. Example: two independent customers, three repeated mentions, or one severe enterprise blocker. -->
|
|
20
20
|
|
|
21
21
|
## Sources
|
|
22
|
-
<!-- Table: source, date, customer or actor, link/path, confidence. -->
|
|
22
|
+
<!-- Table: source, source class, date/access date, customer or actor, link/path, confidence, and whether it is direct evidence or secondhand summary. -->
|
|
23
23
|
|
|
24
24
|
## What we observed
|
|
25
25
|
<!-- Factual observations only. Separate direct evidence from interpretation. -->
|
|
26
26
|
|
|
27
27
|
## Patterns
|
|
28
|
-
<!-- Synthesized themes across sources. Include strength of signal
|
|
28
|
+
<!-- Synthesized themes across sources. Include strength of signal, counter-evidence, and whether themes are observation or inference. -->
|
|
29
29
|
|
|
30
30
|
## Open asks
|
|
31
31
|
<!-- Customer or stakeholder asks that are not yet committed requirements. -->
|
|
@@ -16,41 +16,162 @@ Write with a balance of structured paragraphs, compact tables, and selective bul
|
|
|
16
16
|
Avoid a wall of bullets. Keep em dashes rare; prefer commas, periods, or parentheses.
|
|
17
17
|
-->
|
|
18
18
|
|
|
19
|
-
##
|
|
20
|
-
<!--
|
|
19
|
+
## Summary
|
|
20
|
+
<!--
|
|
21
|
+
One paragraph (3-5 sentences). What product practice or operating system is
|
|
22
|
+
being defined or changed, who runs it, and what becomes different about how
|
|
23
|
+
the org decides, documents, or evaluates work once this ships.
|
|
24
|
+
-->
|
|
25
|
+
|
|
26
|
+
## Background
|
|
27
|
+
<!--
|
|
28
|
+
The current state of the operating system: which workflow, template, eval
|
|
29
|
+
loop, or governance process is in play today, and what's actually happening
|
|
30
|
+
when teams or agents use it. Cite real examples — recent PRDs, prior decisions,
|
|
31
|
+
trace evidence, support tickets — not hypotheticals.
|
|
32
|
+
-->
|
|
33
|
+
|
|
34
|
+
## Problem
|
|
35
|
+
<!--
|
|
36
|
+
The failure mode in the current process. Name who feels it, how often, and
|
|
37
|
+
what breaks downstream. Keep solutions out of this section.
|
|
38
|
+
|
|
39
|
+
Examples of the right shape:
|
|
40
|
+
- "PRDs ship without rejected alternatives, so reviewers re-litigate decisions
|
|
41
|
+
three weeks in. Happens on ~40% of PRDs in the last quarter."
|
|
42
|
+
- "Postmortems are written by the on-call who shipped the bug, so the action
|
|
43
|
+
items reflect their proposals — not independent review."
|
|
44
|
+
-->
|
|
21
45
|
|
|
22
|
-
##
|
|
23
|
-
<!--
|
|
46
|
+
## Goals
|
|
47
|
+
<!--
|
|
48
|
+
What success looks like for the operating system. Three to five outcomes max.
|
|
49
|
+
Examples: "PRDs cite primary sources by default", "Postmortems get peer
|
|
50
|
+
review before publish", "ADR rejection rate drops from 60% to under 20%".
|
|
51
|
+
-->
|
|
24
52
|
|
|
25
|
-
##
|
|
26
|
-
<!--
|
|
53
|
+
## Outcome
|
|
54
|
+
<!--
|
|
55
|
+
What is concretely different about how work moves through the org once this
|
|
56
|
+
operating model is adopted. Written from the practitioner's perspective:
|
|
57
|
+
"When I open a PRD, I'm prompted to record rejected alternatives before
|
|
58
|
+
the doc enters review."
|
|
59
|
+
-->
|
|
60
|
+
|
|
61
|
+
## In scope and out of scope
|
|
62
|
+
|
|
63
|
+
| | Description |
|
|
64
|
+
|---|---|
|
|
65
|
+
| **In scope** | <which templates, workflows, agents, gates, or evals are touched> |
|
|
66
|
+
| **Out of scope** | <related operating systems explicitly deferred — name the reason> |
|
|
67
|
+
| **Adjacent (deferred)** | <natural follow-up changes not in this Meta PRD> |
|
|
27
68
|
|
|
28
69
|
## Principles
|
|
29
|
-
<!--
|
|
70
|
+
<!--
|
|
71
|
+
Durable rules this operating system must preserve across phases. Each
|
|
72
|
+
principle should be testable enough to guide tradeoffs when phases conflict.
|
|
73
|
+
-->
|
|
30
74
|
|
|
31
75
|
## Inputs and evidence
|
|
32
|
-
<!--
|
|
76
|
+
<!--
|
|
77
|
+
What evidence the system consumes — customer notes, interviews, traces, Jira
|
|
78
|
+
issues, PRDs, research, analytics, support tickets, prior decisions. State
|
|
79
|
+
minimum evidence thresholds where useful (e.g. "two independent customer
|
|
80
|
+
interviews before a PRD enters review").
|
|
81
|
+
-->
|
|
82
|
+
|
|
83
|
+
## Phases
|
|
84
|
+
|
|
85
|
+
<!--
|
|
86
|
+
Each phase below holds its own goal, status, workflow requirements (MR),
|
|
87
|
+
and document + evaluation requirements (DR), with acceptance criteria
|
|
88
|
+
inline next to each. Use `MR-<phase>.<n>` and `DR-<phase>.<n>` so
|
|
89
|
+
requirements can be referenced from reviews, traces, and evals.
|
|
90
|
+
|
|
91
|
+
MR = Workflow requirement: how the process or agent workflow must behave;
|
|
92
|
+
observable in generated artifacts, workflow state, or tool behavior.
|
|
93
|
+
|
|
94
|
+
DR = Document + evaluation requirement: how outputs are shaped, reviewed,
|
|
95
|
+
and scored; required sections, evidence rules, citation rules, formatting
|
|
96
|
+
constraints, anti-patterns, rubric dimensions, pass/fail checks.
|
|
33
97
|
|
|
34
|
-
|
|
35
|
-
|
|
98
|
+
Status values: not started | in progress | shipped | deferred.
|
|
99
|
+
-->
|
|
100
|
+
|
|
101
|
+
### Phase 1 — <name>
|
|
102
|
+
|
|
103
|
+
- **Goal**: <what this phase delivers>
|
|
104
|
+
- **Status**: not started
|
|
105
|
+
|
|
106
|
+
**Workflow**
|
|
107
|
+
|
|
108
|
+
- **MR-1.1** — <imperative statement of how the workflow must behave>
|
|
109
|
+
- *Acceptance*: <how a reviewer or trace verifies this without asking the author>
|
|
110
|
+
- **MR-1.2** — <...>
|
|
111
|
+
- *Acceptance*: <...>
|
|
112
|
+
|
|
113
|
+
**Document + evaluation**
|
|
114
|
+
|
|
115
|
+
- **DR-1.1** — <required section, evidence rule, citation rule, formatting constraint, or anti-pattern>
|
|
116
|
+
- *Acceptance*: <rubric dimension, pass/fail check, or trace signal that proves it>
|
|
117
|
+
|
|
118
|
+
### Phase 2 — <name>
|
|
119
|
+
|
|
120
|
+
- **Goal**: <what this phase delivers>
|
|
121
|
+
- **Status**: not started
|
|
122
|
+
|
|
123
|
+
**Workflow**
|
|
124
|
+
|
|
125
|
+
- **MR-2.1** — <...>
|
|
126
|
+
- *Acceptance*: <...>
|
|
127
|
+
- **MR-2.2** — <...>
|
|
128
|
+
- *Acceptance*: <...>
|
|
129
|
+
|
|
130
|
+
**Document + evaluation**
|
|
36
131
|
|
|
37
|
-
|
|
38
|
-
|
|
132
|
+
- **DR-2.1** — <...>
|
|
133
|
+
- *Acceptance*: <...>
|
|
134
|
+
|
|
135
|
+
### Phase 3 — <name>
|
|
136
|
+
|
|
137
|
+
- **Goal**: <what this phase delivers>
|
|
138
|
+
- **Status**: not started
|
|
139
|
+
|
|
140
|
+
**Workflow**
|
|
141
|
+
|
|
142
|
+
- **MR-3.1** — <...>
|
|
143
|
+
- *Acceptance*: <...>
|
|
144
|
+
|
|
145
|
+
**Document + evaluation**
|
|
146
|
+
|
|
147
|
+
- **DR-3.1** — <...>
|
|
148
|
+
- *Acceptance*: <...>
|
|
39
149
|
|
|
40
150
|
## Human approval gates
|
|
41
|
-
<!--
|
|
151
|
+
<!--
|
|
152
|
+
Where a person must review, approve, reject, or supply missing context before
|
|
153
|
+
the system writes externally or treats a document as approved. Name the gate,
|
|
154
|
+
the reviewer role, and the timeout policy if no reviewer responds.
|
|
155
|
+
-->
|
|
42
156
|
|
|
43
|
-
##
|
|
44
|
-
<!-- How quality will be measured. Include rubric dimensions, pass/fail checks, trace evidence, and examples of unacceptable output. -->
|
|
157
|
+
## Failure modes and mitigations
|
|
45
158
|
|
|
46
|
-
|
|
47
|
-
|
|
159
|
+
| Failure mode | Likelihood | Impact | Mitigation |
|
|
160
|
+
|---|---|---|---|
|
|
161
|
+
| <how this could go wrong if followed too literally, over-automated, or used with weak evidence> | low / med / high | low / med / high | <guardrail or escape hatch> |
|
|
48
162
|
|
|
49
163
|
## Rollout
|
|
50
|
-
<!--
|
|
164
|
+
<!--
|
|
165
|
+
How this operating model becomes the default. Migration steps, owners,
|
|
166
|
+
training, deprecation date for the older template or workflow. Name what
|
|
167
|
+
happens to in-flight work (grandfathered or migrated).
|
|
168
|
+
-->
|
|
51
169
|
|
|
52
170
|
## Open questions
|
|
53
|
-
|
|
171
|
+
|
|
172
|
+
| Question | Owner | Decision needed by |
|
|
173
|
+
|---|---|---|
|
|
174
|
+
| <unknown that could change the operating model> | <name> | <YYYY-MM-DD> |
|
|
54
175
|
|
|
55
176
|
## References
|
|
56
177
|
<!-- Linked examples, prior PRDs, Meta PRDs, research, tickets, traces, or decisions. -->
|