@geraldmaron/construct 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -34
- package/bin/construct +1403 -96
- package/commands/build/feature.md +1 -1
- package/commands/build/fix.md +1 -1
- package/commands/design/access.md +1 -1
- package/commands/design/flow.md +1 -1
- package/commands/design/ui.md +1 -1
- package/commands/measure/experiment.md +1 -1
- package/commands/measure/metrics.md +1 -1
- package/commands/measure/results.md +1 -1
- package/commands/plan/api.md +1 -1
- package/commands/plan/challenge.md +1 -1
- package/commands/plan/decide.md +1 -1
- package/commands/plan/feature.md +1 -1
- package/commands/plan/requirements.md +1 -1
- package/commands/remember/context.md +1 -1
- package/commands/remember/handoff.md +1 -1
- package/commands/remember/runbook.md +1 -1
- package/commands/review/code.md +1 -1
- package/commands/review/quality.md +1 -1
- package/commands/review/security.md +1 -1
- package/commands/ship/ready.md +1 -1
- package/commands/ship/release.md +1 -1
- package/commands/ship/status.md +1 -1
- package/commands/understand/docs.md +1 -1
- package/commands/understand/this.md +1 -1
- package/commands/understand/why.md +1 -1
- package/commands/work/clean.md +1 -1
- package/commands/work/drive.md +1 -1
- package/commands/work/optimize-prompts.md +2 -2
- package/commands/work/parallel-review.md +1 -1
- package/db/schema/007_tags.sql +30 -0
- package/db/schema/008_skill_usage.sql +24 -0
- package/db/schema/009_scheduler.sql +14 -0
- package/examples/internal/roles/architect/bad/clever-plan-without-contracts.md +1 -1
- package/examples/internal/roles/architect/golden/explicit-tradeoff-before-plan.md +1 -1
- package/examples/internal/roles/engineer/bad/speculative-abstraction.md +1 -1
- package/examples/internal/roles/engineer/golden/read-before-write.md +1 -1
- package/examples/internal/roles/qa/bad/coverage-theater.md +1 -1
- package/examples/internal/roles/qa/golden/regression-gate.md +1 -1
- package/examples/seed-observations/decisions.md +1 -1
- package/lib/audit-skills.mjs +3 -3
- package/lib/auto-docs.mjs +8 -8
- package/lib/boundary.mjs +126 -0
- package/lib/cache-strategy-google.js +26 -31
- package/lib/cli-commands.mjs +276 -122
- package/lib/comment-lint.mjs +139 -1
- package/lib/completions.mjs +1 -1
- package/lib/config/schema.mjs +15 -1
- package/lib/contracts/validate.mjs +371 -0
- package/lib/daemons/contract.mjs +210 -0
- package/lib/distill.mjs +22 -4
- package/lib/doc-stamp.mjs +48 -0
- package/lib/docs-verify.mjs +59 -6
- package/lib/doctor/cli.mjs +16 -1
- package/lib/doctor/index.mjs +3 -1
- package/lib/doctor/watchers/consistency.mjs +360 -0
- package/lib/doctor/watchers/mcp-protocol.mjs +232 -0
- package/lib/document-extract.mjs +420 -17
- package/lib/document-ingest.mjs +2 -0
- package/lib/embed/cli.mjs +124 -3
- package/lib/embed/daemon.mjs +43 -4
- package/lib/embed/docs-lifecycle.mjs +1 -1
- package/lib/embed/inbox.mjs +50 -3
- package/lib/embed/role-framing.mjs +3 -3
- package/lib/embed/scheduler.mjs +33 -5
- package/lib/env-config.mjs +9 -3
- package/lib/evaluator-optimizer.mjs +2 -3
- package/lib/extractors/calendar.mjs +173 -0
- package/lib/extractors/shared/drop-info.mjs +22 -0
- package/lib/extractors/transcript.mjs +0 -0
- package/lib/gates-audit.mjs +8 -2
- package/lib/git-hooks/prepare-commit-msg +1 -1
- package/lib/headhunt.mjs +2 -2
- package/lib/hooks/agent-tracker.mjs +6 -11
- package/lib/hooks/comment-lint.mjs +16 -0
- package/lib/hooks/guard-bash.mjs +35 -14
- package/lib/hooks/mcp-audit.mjs +14 -1
- package/lib/hooks/pre-compact.mjs +92 -5
- package/lib/hooks/pre-push-gate.mjs +41 -8
- package/lib/hooks/proactive-activation.mjs +0 -14
- package/lib/hooks/registry-sync.mjs +2 -2
- package/lib/hooks/rule-verifier.mjs +217 -0
- package/lib/hooks/session-optimize.mjs +2 -1
- package/lib/hooks/stop-notify.mjs +7 -6
- package/lib/host-capabilities.mjs +10 -1
- package/lib/hygiene/scan.mjs +141 -0
- package/lib/init-unified.mjs +73 -65
- package/lib/install/stage-project.mjs +4 -4
- package/lib/intake/classify.mjs +309 -58
- package/lib/intake/daemon.mjs +121 -0
- package/lib/intake/filesystem-queue.mjs +31 -6
- package/lib/intake/intake-config.mjs +2 -1
- package/lib/intake/postgres-queue.mjs +45 -3
- package/lib/intake/prepare.mjs +3 -1
- package/lib/intake/quarantine.mjs +205 -0
- package/lib/intake/session-prelude.mjs +7 -1
- package/lib/intake/traceability.mjs +90 -0
- package/lib/knowledge/postgres-search.mjs +132 -0
- package/lib/knowledge/research-store.mjs +2 -0
- package/lib/knowledge/search.mjs +14 -4
- package/lib/maintenance/cleanup.mjs +315 -0
- package/lib/mcp/memory-bridge.mjs +276 -0
- package/lib/mcp/server.mjs +11 -3
- package/lib/mcp/tools/skills.mjs +32 -11
- package/lib/mcp/tools/workflow.mjs +25 -0
- package/lib/mcp-catalog.json +12 -8
- package/lib/mcp-platform-config.mjs +16 -8
- package/lib/migrations/index.mjs +106 -0
- package/lib/migrations/v1-baseline.mjs +33 -0
- package/lib/model-registry.mjs +1 -1
- package/lib/observation-store.mjs +9 -4
- package/lib/opencode-runtime-plugin.mjs +1 -1
- package/lib/orchestration-policy.mjs +4 -4
- package/lib/outcomes/record.mjs +2 -0
- package/lib/overrides/resolver.mjs +3 -3
- package/lib/parity.mjs +4 -4
- package/lib/policy/engine.mjs +2 -2
- package/lib/profiles/lifecycle.mjs +1 -1
- package/lib/profiles/rebrand.mjs +46 -0
- package/lib/project-init-shared.mjs +12 -0
- package/lib/prompt-metadata.mjs +4 -4
- package/lib/provider-capabilities.js +20 -7
- package/lib/providers/auth-manager.mjs +58 -17
- package/lib/providers/circuit-breaker.mjs +14 -0
- package/lib/providers/contract.mjs +67 -3
- package/lib/providers/creds.mjs +219 -0
- package/lib/providers/scaffold.mjs +107 -0
- package/lib/reflect.mjs +49 -12
- package/lib/role-preload.mjs +5 -0
- package/lib/roles/catalog.mjs +1 -1
- package/lib/roles/manifest.mjs +2 -2
- package/lib/scheduler/index.mjs +112 -0
- package/lib/scheduler/solo.mjs +183 -0
- package/lib/server/index.mjs +29 -29
- package/lib/server/insights.mjs +14 -12
- package/lib/server/langfuse-login.mjs +58 -0
- package/lib/server/static/assets/index-ab25c707.js +1 -1
- package/lib/session-store.mjs +6 -4
- package/lib/setup.mjs +14 -3
- package/lib/{agent-contracts-enforce.mjs → specialist-contracts-enforce.mjs} +4 -4
- package/lib/{agent-contracts.mjs → specialist-contracts.mjs} +9 -8
- package/lib/{agents → specialists}/postconditions.mjs +3 -3
- package/lib/{agents → specialists}/schema.mjs +6 -6
- package/lib/status.mjs +13 -11
- package/lib/storage/backup.mjs +2 -2
- package/lib/tags/lifecycle.mjs +278 -0
- package/lib/tags/vocabulary.mjs +140 -0
- package/lib/telemetry/client.mjs +5 -1
- package/lib/telemetry/otel-tracer.mjs +184 -0
- package/lib/telemetry/skill-calls.mjs +73 -12
- package/lib/uninstall/uninstall.mjs +1 -1
- package/lib/update.mjs +1 -1
- package/lib/validator.mjs +57 -56
- package/lib/version.mjs +51 -0
- package/lib/worker/trace.mjs +5 -1
- package/lib/workflows/instantiate.mjs +320 -0
- package/package.json +16 -3
- package/personas/construct.md +5 -3
- package/platforms/claude/CLAUDE.md +1 -1
- package/rules/common/development-workflow.md +2 -1
- package/rules/common/no-fabrication.md +69 -0
- package/rules/common/review-before-change.md +58 -0
- package/scripts/{sync-agents.mjs → sync-specialists.mjs} +171 -68
- package/skills/ai/prompt-optimizer.md +3 -3
- package/skills/exploration/dependency-graph-reading.md +98 -0
- package/skills/exploration/tracer-bullet-method.md +71 -0
- package/skills/exploration/unknown-codebase-onboarding.md +91 -0
- package/skills/operating/change-management.md +91 -0
- package/skills/operating/incident-response.md +75 -0
- package/skills/operating/oncall-rotation.md +95 -0
- package/skills/operating/orchestration-reference.md +2 -2
- package/skills/strategy/competitive-landscape.md +75 -0
- package/skills/strategy/market-research-methods.md +87 -0
- package/skills/strategy/narrative-arc.md +77 -0
- package/skills/strategy/pricing-positioning.md +94 -0
- package/specialists/contracts.json +1002 -0
- package/specialists/contracts.schema.json +83 -0
- package/specialists/policy-inventory.json +160 -0
- package/{agents → specialists}/prompts/cx-accessibility.md +3 -1
- package/{agents → specialists}/prompts/cx-ai-engineer.md +3 -1
- package/{agents → specialists}/prompts/cx-architect.md +3 -1
- package/{agents → specialists}/prompts/cx-business-strategist.md +3 -1
- package/{agents → specialists}/prompts/cx-data-analyst.md +3 -1
- package/{agents → specialists}/prompts/cx-data-engineer.md +3 -1
- package/{agents → specialists}/prompts/cx-debugger.md +3 -1
- package/{agents → specialists}/prompts/cx-designer.md +3 -1
- package/{agents → specialists}/prompts/cx-devil-advocate.md +3 -1
- package/{agents → specialists}/prompts/cx-docs-keeper.md +4 -2
- package/{agents → specialists}/prompts/cx-engineer.md +4 -2
- package/{agents → specialists}/prompts/cx-evaluator.md +3 -1
- package/{agents → specialists}/prompts/cx-explorer.md +3 -1
- package/{agents → specialists}/prompts/cx-legal-compliance.md +3 -1
- package/{agents → specialists}/prompts/cx-operations.md +3 -1
- package/{agents → specialists}/prompts/cx-orchestrator.md +4 -2
- package/{agents → specialists}/prompts/cx-platform-engineer.md +3 -1
- package/{agents → specialists}/prompts/cx-product-manager.md +3 -1
- package/{agents → specialists}/prompts/cx-qa.md +3 -1
- package/{agents → specialists}/prompts/cx-rd-lead.md +3 -1
- package/{agents → specialists}/prompts/cx-release-manager.md +3 -1
- package/{agents → specialists}/prompts/cx-researcher.md +3 -1
- package/{agents → specialists}/prompts/cx-reviewer.md +4 -2
- package/{agents → specialists}/prompts/cx-security.md +3 -1
- package/{agents → specialists}/prompts/cx-sre.md +4 -2
- package/{agents → specialists}/prompts/cx-test-automation.md +3 -1
- package/{agents → specialists}/prompts/cx-trace-reviewer.md +5 -3
- package/{agents → specialists}/prompts/cx-ux-researcher.md +3 -1
- package/{agents → specialists}/registry.json +651 -418
- package/{agents → specialists}/role-manifests.json +8 -8
- package/templates/docs/construct_guide.md +6 -6
- package/templates/docs/skill-artifact.md +1 -1
- package/templates/provider-scaffold/health.test.mjs +30 -0
- package/templates/provider-scaffold/index.mjs +48 -0
- package/templates/workflows/cross-team-handoff.yml +85 -0
- package/templates/workflows/engineering-onboarding.yml +77 -0
- package/templates/workflows/new-feature.yml +53 -0
- package/agents/contracts.json +0 -387
- /package/{agents → specialists}/teams.json +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$comment": "Role manifests for the Construct-on-Construct role framework. Keyed by registry persona name (without cx- prefix, matching
|
|
2
|
+
"$comment": "Role manifests for the Construct-on-Construct role framework. Keyed by registry persona name (without cx- prefix, matching specialists/registry.json). Empty entries reserve the slot for future onboarding without code change.",
|
|
3
3
|
"version": 1,
|
|
4
4
|
"personas": {
|
|
5
5
|
"sre": {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"allowedPaths": ["docs/runbooks/**", "docs/incidents/**", "docs/postmortems/**"],
|
|
10
10
|
"allowedBdLabels": ["incident", "sre", "reliability"],
|
|
11
11
|
"allowedCommands": ["bd create", "bd note", "bd update", "bd link", "bd label"],
|
|
12
|
-
"approvalRequired": ["commit", "push", "edit:lib/**", "edit:bin/**", "edit:
|
|
12
|
+
"approvalRequired": ["commit", "push", "edit:lib/**", "edit:bin/**", "edit:specialists/**"]
|
|
13
13
|
},
|
|
14
14
|
"outputs": {
|
|
15
15
|
"bdLabels": ["incident", "sre"],
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"allowedPaths": ["docs/**", "**/README.md", "CHANGELOG.md"],
|
|
58
58
|
"allowedBdLabels": ["docs", "doc-drift", "changelog"],
|
|
59
59
|
"allowedCommands": ["bd create", "bd note", "bd update", "bd label"],
|
|
60
|
-
"approvalRequired": ["commit", "push", "edit:lib/**", "edit:bin/**", "edit:
|
|
60
|
+
"approvalRequired": ["commit", "push", "edit:lib/**", "edit:bin/**", "edit:specialists/**"]
|
|
61
61
|
},
|
|
62
62
|
"outputs": {
|
|
63
63
|
"bdLabels": ["docs", "doc-drift"],
|
|
@@ -72,8 +72,8 @@
|
|
|
72
72
|
"fence": {
|
|
73
73
|
"allowedPaths": ["lib/**", "bin/**", "src/**", "app/**", "tests/**", "docs/**"],
|
|
74
74
|
"allowedBdLabels": ["bug", "feature", "task", "engineering", "fix"],
|
|
75
|
-
"allowedCommands": ["bd create", "bd note", "bd update", "bd link", "bd label", "bd close"],
|
|
76
|
-
"approvalRequired": ["commit", "push", "edit:
|
|
75
|
+
"allowedCommands": ["bd create", "bd note", "bd update", "bd link", "bd label", "bd close", "node", "npm", "git status", "git diff", "git log"],
|
|
76
|
+
"approvalRequired": ["commit", "push", "edit:specialists/registry.json", "edit:install.sh", "edit:claude/settings.template.json"]
|
|
77
77
|
},
|
|
78
78
|
"outputs": {
|
|
79
79
|
"bdLabels": ["engineering", "fix"],
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"allowedPaths": ["docs/adr/**", "docs/rfc/**", "docs/concepts/architecture.md", "docs/system-design/**"],
|
|
90
90
|
"allowedBdLabels": ["architecture", "adr", "rfc", "design"],
|
|
91
91
|
"allowedCommands": ["bd create", "bd note", "bd update", "bd label"],
|
|
92
|
-
"approvalRequired": ["commit", "push", "edit:lib/**", "edit:bin/**", "edit:
|
|
92
|
+
"approvalRequired": ["commit", "push", "edit:lib/**", "edit:bin/**", "edit:specialists/**"]
|
|
93
93
|
},
|
|
94
94
|
"outputs": { "bdLabels": ["architecture", "adr"], "docTypes": ["adr", "rfc", "rfc-platform", "architecture-overview", "system-design"] },
|
|
95
95
|
"handoffCandidates": ["engineer", "platform-engineer", "reviewer"],
|
|
@@ -191,7 +191,7 @@
|
|
|
191
191
|
"evaluator": { "events": ["handoff.received", "eval.regression"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/evals/**", ".cx/evals/**", "tests/evals/**"], "allowedBdLabels": ["eval", "regression-eval"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:**"] }, "outputs": { "bdLabels": ["eval"], "docTypes": ["memo"] }, "handoffCandidates": ["engineer", "ai-engineer"], "killSwitchEnv": "CONSTRUCT_ROLE_EVALUATOR" },
|
|
192
192
|
"trace-reviewer": { "events": ["handoff.received", "trace.anomaly"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/traces/**", ".cx/traces/**"], "allowedBdLabels": ["trace", "observability"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:**"] }, "outputs": { "bdLabels": ["trace"], "docTypes": ["memo"] }, "handoffCandidates": ["sre", "ai-engineer", "engineer"], "killSwitchEnv": "CONSTRUCT_ROLE_TRACE_REVIEWER" },
|
|
193
193
|
"test-automation": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["tests/**", "docs/test-automation/**"], "allowedBdLabels": ["test-automation", "ci", "test-infra"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:lib/**", "edit:bin/**"] }, "outputs": { "bdLabels": ["test-automation"], "docTypes": ["memo"] }, "handoffCandidates": ["qa", "engineer", "platform-engineer"], "killSwitchEnv": "CONSTRUCT_ROLE_TEST_AUTOMATION" },
|
|
194
|
-
"ai-engineer": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/ai/**", "docs/
|
|
194
|
+
"ai-engineer": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/ai/**", "docs/specialists/**", "specialists/**", "skills/ai/**"], "allowedBdLabels": ["ai", "agent", "model"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:lib/**", "edit:bin/**"] }, "outputs": { "bdLabels": ["ai"], "docTypes": ["memo"] }, "handoffCandidates": ["engineer", "architect", "evaluator"], "killSwitchEnv": "CONSTRUCT_ROLE_AI_ENGINEER" },
|
|
195
195
|
"business-strategist": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/strategy/**", ".cx/knowledge/decisions/strategy/**"], "allowedBdLabels": ["strategy", "business"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:**"] }, "outputs": { "bdLabels": ["strategy"], "docTypes": ["memo", "strategy"] }, "handoffCandidates": ["product-manager", "researcher"], "killSwitchEnv": "CONSTRUCT_ROLE_BUSINESS_STRATEGIST" },
|
|
196
196
|
"researcher": {
|
|
197
197
|
"events": ["handoff.received", "research.requested", "evidence.requested"],
|
|
@@ -209,7 +209,7 @@
|
|
|
209
209
|
"ux-researcher": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/ux-research/**", ".cx/ux-research/**"], "allowedBdLabels": ["ux-research", "user-research"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:**"] }, "outputs": { "bdLabels": ["ux-research"], "docTypes": ["memo"] }, "handoffCandidates": ["product-manager", "designer", "researcher"], "killSwitchEnv": "CONSTRUCT_ROLE_UX_RESEARCHER" },
|
|
210
210
|
"explorer": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/explorations/**", ".cx/explorations/**"], "allowedBdLabels": ["exploration", "spike"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:**"] }, "outputs": { "bdLabels": ["exploration"], "docTypes": ["memo"] }, "handoffCandidates": ["engineer", "architect", "researcher"], "killSwitchEnv": "CONSTRUCT_ROLE_EXPLORER" },
|
|
211
211
|
"operations": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/ops/**", "docs/operations/**"], "allowedBdLabels": ["ops", "operations"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:**"] }, "outputs": { "bdLabels": ["ops"], "docTypes": ["memo", "runbook"] }, "handoffCandidates": ["sre", "platform-engineer", "release-manager"], "killSwitchEnv": "CONSTRUCT_ROLE_OPERATIONS" },
|
|
212
|
-
"orchestrator": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/**", "plan.md", ".cx/context.md"], "allowedBdLabels": ["orchestration", "workflow", "dispatch"], "allowedCommands": ["bd create", "bd note", "bd update", "bd label", "bd link"], "approvalRequired": ["commit", "push", "edit:lib/**", "edit:bin/**", "edit:
|
|
212
|
+
"orchestrator": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/**", "plan.md", ".cx/context.md"], "allowedBdLabels": ["orchestration", "workflow", "dispatch"], "allowedCommands": ["bd create", "bd note", "bd update", "bd label", "bd link"], "approvalRequired": ["commit", "push", "edit:lib/**", "edit:bin/**", "edit:specialists/**"] }, "outputs": { "bdLabels": ["orchestration", "dispatch"], "docTypes": ["memo"] }, "handoffCandidates": ["product-manager", "architect", "engineer", "security", "qa", "sre"], "killSwitchEnv": "CONSTRUCT_ROLE_ORCHESTRATOR" },
|
|
213
213
|
"rd-lead": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/research/**", "docs/experiments/**", ".cx/experiments/**"], "allowedBdLabels": ["rd", "research", "experiment"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:**"] }, "outputs": { "bdLabels": ["rd"], "docTypes": ["memo", "research-brief"] }, "handoffCandidates": ["researcher", "architect", "ai-engineer"], "killSwitchEnv": "CONSTRUCT_ROLE_RD_LEAD" },
|
|
214
214
|
"legal-compliance": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/legal/**", "docs/compliance/**", "docs/security/**", ".cx/knowledge/**"], "allowedBdLabels": ["legal", "compliance", "privacy"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:**"] }, "outputs": { "bdLabels": ["legal", "compliance"], "docTypes": ["memo"] }, "handoffCandidates": ["security", "product-manager"], "killSwitchEnv": "CONSTRUCT_ROLE_LEGAL_COMPLIANCE" },
|
|
215
215
|
"devil-advocate": { "events": ["handoff.received"], "severityImmediate": [], "fence": { "allowedPaths": ["docs/critiques/**"], "allowedBdLabels": ["critique", "devil-advocate"], "allowedCommands": ["bd create", "bd note", "bd update"], "approvalRequired": ["commit", "push", "edit:**"] }, "outputs": { "bdLabels": ["critique"], "docTypes": ["memo"] }, "handoffCandidates": ["architect", "product-manager", "engineer"], "killSwitchEnv": "CONSTRUCT_ROLE_DEVIL_ADVOCATE" }
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
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
4
|
|
|
5
|
-
**Full docs:** [https://geraldmaron.github.io/construct/
|
|
5
|
+
**Full docs:** [https://geraldmaron.github.io/construct/](https://geraldmaron.github.io/construct/)
|
|
6
6
|
|
|
7
7
|
## What Construct is doing in your project
|
|
8
8
|
|
|
@@ -117,7 +117,7 @@ All ports bind to `127.0.0.1` only; nothing is reachable from other machines on
|
|
|
117
117
|
| `construct search "..."` | Hybrid file + SQL + semantic search over project state |
|
|
118
118
|
| `construct uninstall` | Interactive teardown: never touches Docker or your code |
|
|
119
119
|
|
|
120
|
-
Full reference: <https://geraldmaron.github.io/construct/
|
|
120
|
+
Full reference: <https://geraldmaron.github.io/construct/docs/reference/cli>
|
|
121
121
|
|
|
122
122
|
## Updating Construct
|
|
123
123
|
|
|
@@ -134,13 +134,13 @@ construct doctor # most issues surface here with a fix hint
|
|
|
134
134
|
construct down && construct up # restart local services
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
Troubleshooting guide: <https://geraldmaron.github.io/construct/
|
|
137
|
+
Troubleshooting guide: <https://geraldmaron.github.io/construct/docs/operations/troubleshooting>
|
|
138
138
|
|
|
139
139
|
## Next steps
|
|
140
140
|
|
|
141
|
-
- [Connect your editor](https://geraldmaron.github.io/construct/
|
|
142
|
-
- [Run your first task](https://geraldmaron.github.io/construct/
|
|
143
|
-
- Skim [the architecture](https://geraldmaron.github.io/construct/
|
|
141
|
+
- [Connect your editor](https://geraldmaron.github.io/construct/docs/start/connect-your-editor) if you haven't already.
|
|
142
|
+
- [Run your first task](https://geraldmaron.github.io/construct/docs/start/first-task) to feel the flow.
|
|
143
|
+
- Skim [the architecture](https://geraldmaron.github.io/construct/docs/concepts/architecture) when you have 10 minutes: it'll save you hours later.
|
|
144
144
|
|
|
145
145
|
If you'd rather have a teammate walk you through it, the persona itself can:
|
|
146
146
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: <verb-led-id>
|
|
3
|
-
scope: <one paragraph: what it covers, what it does not>
|
|
3
|
+
scope: "<one paragraph: what it covers, what it does not>"
|
|
4
4
|
observable_outcome: <how someone outside the role tells this skill happened>
|
|
5
5
|
provenance:
|
|
6
6
|
- <citation: post-mortem, public framework, competency model>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* templates/provider-scaffold/health.test.mjs — scaffold health test template.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that the scaffolded provider's health() function can be called and
|
|
5
|
+
* returns a result with the expected shape. Replace the import path and add
|
|
6
|
+
* real assertions once the provider is implemented.
|
|
7
|
+
*
|
|
8
|
+
* Placeholder: %%PROVIDER_NAME%%
|
|
9
|
+
*/
|
|
10
|
+
import assert from 'node:assert/strict';
|
|
11
|
+
import { describe, it } from 'node:test';
|
|
12
|
+
import { create } from '../../lib/providers/%%PROVIDER_NAME%%/index.mjs';
|
|
13
|
+
|
|
14
|
+
describe('%%PROVIDER_NAME%% provider health', () => {
|
|
15
|
+
it('health() returns an object with an ok field', async () => {
|
|
16
|
+
const provider = create();
|
|
17
|
+
const result = await provider.health();
|
|
18
|
+
assert.ok(typeof result === 'object' && result !== null, 'health() must return an object');
|
|
19
|
+
assert.ok('ok' in result, 'health() result must have an ok field');
|
|
20
|
+
assert.ok(typeof result.ok === 'boolean', 'health().ok must be a boolean');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('provider satisfies the contract shape', () => {
|
|
24
|
+
const provider = create();
|
|
25
|
+
assert.ok(provider.meta, 'provider must have a meta object');
|
|
26
|
+
assert.equal(provider.meta.id, '%%PROVIDER_NAME%%');
|
|
27
|
+
assert.ok(Array.isArray(provider.meta.capabilities), 'meta.capabilities must be an array');
|
|
28
|
+
assert.ok(typeof provider.health === 'function', 'provider must export health()');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/providers/%%PROVIDER_NAME%%/index.mjs — %%PROVIDER_NAME%% provider.
|
|
3
|
+
*
|
|
4
|
+
* Capabilities: %%CAPABILITIES%%
|
|
5
|
+
*
|
|
6
|
+
* Generated by `construct scaffold provider %%PROVIDER_NAME%%`.
|
|
7
|
+
* Replace every TODO comment with a real implementation before using this
|
|
8
|
+
* provider in production.
|
|
9
|
+
*/
|
|
10
|
+
import { validateAllowlist } from '../contract.mjs';
|
|
11
|
+
|
|
12
|
+
const PROVIDER_NAME = '%%PROVIDER_NAME%%';
|
|
13
|
+
|
|
14
|
+
export function create({ env = process.env } = {}) {
|
|
15
|
+
return {
|
|
16
|
+
meta: {
|
|
17
|
+
id: PROVIDER_NAME,
|
|
18
|
+
displayName: '%%PROVIDER_NAME%%',
|
|
19
|
+
capabilities: ['%%CAPABILITIES%%'],
|
|
20
|
+
description: '%%PROVIDER_NAME%% provider (scaffolded — fill in details)',
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
configSchema: {
|
|
24
|
+
$schema: 'https://json-schema.org/draft/2020-12/schema',
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {},
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
async health() {
|
|
30
|
+
// Replace with a real connectivity check that returns { ok, detail }. // construct-lint-ignore
|
|
31
|
+
return { ok: false, reason: 'not implemented' };
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
async read(resource, config = {}) {
|
|
35
|
+
const check = validateAllowlist(PROVIDER_NAME, resource, config);
|
|
36
|
+
if (!check.allowed) throw Object.assign(new Error(check.reason), { code: 'OUT_OF_SCOPE' });
|
|
37
|
+
// Replace with a real fetch against the remote system. // construct-lint-ignore
|
|
38
|
+
throw new Error('not implemented');
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
async search(query, config = {}) {
|
|
42
|
+
// Replace with a real query against the remote system; return an array of items. // construct-lint-ignore
|
|
43
|
+
throw new Error('not implemented');
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export default create;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
id: cross-team-handoff
|
|
3
|
+
title: Cross-team handoff workflow
|
|
4
|
+
description: Structured handoff across Eng, PM, Support, and Ops. Scaffolds the handoff brief, owner mapping, and success criteria so every receiving team has the context it needs before the sender is gone.
|
|
5
|
+
|
|
6
|
+
inputs:
|
|
7
|
+
- name: project_name
|
|
8
|
+
prompt: "Project or feature being handed off (lowercase-hyphenated)"
|
|
9
|
+
required: true
|
|
10
|
+
- name: sending_team
|
|
11
|
+
prompt: "Team handing off (e.g. eng, pm, infra)"
|
|
12
|
+
required: true
|
|
13
|
+
- name: receiving_team
|
|
14
|
+
prompt: "Team taking ownership (e.g. support, ops, pm)"
|
|
15
|
+
required: true
|
|
16
|
+
- name: handoff_date
|
|
17
|
+
prompt: "Target handoff date (YYYY-MM-DD)"
|
|
18
|
+
default: "TBD"
|
|
19
|
+
- name: primary_contact
|
|
20
|
+
prompt: "Primary contact on the sending team"
|
|
21
|
+
default: "TBD"
|
|
22
|
+
|
|
23
|
+
artifacts:
|
|
24
|
+
- template: memo.md
|
|
25
|
+
path: "docs/handoffs/${project_name}/brief.md"
|
|
26
|
+
title: "Handoff brief: ${project_name} from ${sending_team} to ${receiving_team}"
|
|
27
|
+
|
|
28
|
+
- template: rfc.md
|
|
29
|
+
path: "docs/handoffs/${project_name}/owner-mapping.md"
|
|
30
|
+
title: "Owner mapping: ${project_name}"
|
|
31
|
+
depends_on:
|
|
32
|
+
- "docs/handoffs/${project_name}/brief.md"
|
|
33
|
+
|
|
34
|
+
- template: prd.md
|
|
35
|
+
path: "docs/handoffs/${project_name}/success-criteria.md"
|
|
36
|
+
title: "Success criteria: ${project_name} post-handoff"
|
|
37
|
+
depends_on:
|
|
38
|
+
- "docs/handoffs/${project_name}/owner-mapping.md"
|
|
39
|
+
|
|
40
|
+
- template: runbook.md
|
|
41
|
+
path: "docs/handoffs/${project_name}/ops-runbook.md"
|
|
42
|
+
title: "Ops runbook: ${project_name}"
|
|
43
|
+
depends_on:
|
|
44
|
+
- "docs/handoffs/${project_name}/success-criteria.md"
|
|
45
|
+
|
|
46
|
+
beads_items:
|
|
47
|
+
- type: task
|
|
48
|
+
title: "${project_name}: draft handoff brief (${sending_team})"
|
|
49
|
+
link_to: "docs/handoffs/${project_name}/brief.md"
|
|
50
|
+
|
|
51
|
+
- type: task
|
|
52
|
+
title: "${project_name}: agree owner mapping with ${receiving_team}"
|
|
53
|
+
link_to: "docs/handoffs/${project_name}/owner-mapping.md"
|
|
54
|
+
depends_on_prior: true
|
|
55
|
+
|
|
56
|
+
- type: task
|
|
57
|
+
title: "${project_name}: sign off success criteria"
|
|
58
|
+
link_to: "docs/handoffs/${project_name}/success-criteria.md"
|
|
59
|
+
depends_on_prior: true
|
|
60
|
+
|
|
61
|
+
- type: task
|
|
62
|
+
title: "${project_name}: ops runbook review and acceptance"
|
|
63
|
+
link_to: "docs/handoffs/${project_name}/ops-runbook.md"
|
|
64
|
+
depends_on_prior: true
|
|
65
|
+
|
|
66
|
+
- type: task
|
|
67
|
+
title: "${project_name}: handoff complete on ${handoff_date}"
|
|
68
|
+
depends_on_prior: true
|
|
69
|
+
|
|
70
|
+
checks:
|
|
71
|
+
- name: brief-precedes-owner-mapping
|
|
72
|
+
kind: file-order
|
|
73
|
+
files:
|
|
74
|
+
- "docs/handoffs/${project_name}/brief.md"
|
|
75
|
+
- "docs/handoffs/${project_name}/owner-mapping.md"
|
|
76
|
+
- name: owner-mapping-precedes-success-criteria
|
|
77
|
+
kind: file-order
|
|
78
|
+
files:
|
|
79
|
+
- "docs/handoffs/${project_name}/owner-mapping.md"
|
|
80
|
+
- "docs/handoffs/${project_name}/success-criteria.md"
|
|
81
|
+
- name: success-criteria-precedes-runbook
|
|
82
|
+
kind: file-order
|
|
83
|
+
files:
|
|
84
|
+
- "docs/handoffs/${project_name}/success-criteria.md"
|
|
85
|
+
- "docs/handoffs/${project_name}/ops-runbook.md"
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
id: engineering-onboarding
|
|
3
|
+
title: Engineering onboarding workflow
|
|
4
|
+
description: Day-1 setup through week-1 checkpoint. Scaffolds the onboarding brief, access checklist, and milestone handoff artifacts so a new engineer has documented progress at each stage.
|
|
5
|
+
|
|
6
|
+
inputs:
|
|
7
|
+
- name: engineer_name
|
|
8
|
+
prompt: "New engineer's full name"
|
|
9
|
+
required: true
|
|
10
|
+
- name: team_name
|
|
11
|
+
prompt: "Team name (e.g. platform, growth, infra)"
|
|
12
|
+
required: true
|
|
13
|
+
- name: manager_name
|
|
14
|
+
prompt: "Onboarding manager's name"
|
|
15
|
+
default: "TBD"
|
|
16
|
+
- name: start_date
|
|
17
|
+
prompt: "Start date (YYYY-MM-DD)"
|
|
18
|
+
default: "TBD"
|
|
19
|
+
|
|
20
|
+
artifacts:
|
|
21
|
+
- template: onboarding.md
|
|
22
|
+
path: "docs/onboarding/${engineer_name}/brief.md"
|
|
23
|
+
title: "Onboarding brief: ${engineer_name}"
|
|
24
|
+
|
|
25
|
+
- template: runbook.md
|
|
26
|
+
path: "docs/onboarding/${engineer_name}/day-1-checklist.md"
|
|
27
|
+
title: "Day-1 checklist: ${engineer_name} on ${team_name}"
|
|
28
|
+
depends_on:
|
|
29
|
+
- "docs/onboarding/${engineer_name}/brief.md"
|
|
30
|
+
|
|
31
|
+
- template: runbook.md
|
|
32
|
+
path: "docs/onboarding/${engineer_name}/day-3-checkpoint.md"
|
|
33
|
+
title: "Day-3 checkpoint: ${engineer_name}"
|
|
34
|
+
depends_on:
|
|
35
|
+
- "docs/onboarding/${engineer_name}/day-1-checklist.md"
|
|
36
|
+
|
|
37
|
+
- template: memo.md
|
|
38
|
+
path: "docs/onboarding/${engineer_name}/week-1-handoff.md"
|
|
39
|
+
title: "Week-1 handoff: ${engineer_name} to ${manager_name}"
|
|
40
|
+
depends_on:
|
|
41
|
+
- "docs/onboarding/${engineer_name}/day-3-checkpoint.md"
|
|
42
|
+
|
|
43
|
+
beads_items:
|
|
44
|
+
- type: task
|
|
45
|
+
title: "${engineer_name}: day-1 setup"
|
|
46
|
+
link_to: "docs/onboarding/${engineer_name}/day-1-checklist.md"
|
|
47
|
+
|
|
48
|
+
- type: task
|
|
49
|
+
title: "${engineer_name}: day-3 checkpoint review"
|
|
50
|
+
link_to: "docs/onboarding/${engineer_name}/day-3-checkpoint.md"
|
|
51
|
+
depends_on_prior: true
|
|
52
|
+
|
|
53
|
+
- type: task
|
|
54
|
+
title: "${engineer_name}: week-1 handoff with ${manager_name}"
|
|
55
|
+
link_to: "docs/onboarding/${engineer_name}/week-1-handoff.md"
|
|
56
|
+
depends_on_prior: true
|
|
57
|
+
|
|
58
|
+
- type: task
|
|
59
|
+
title: "${engineer_name}: onboarding complete sign-off"
|
|
60
|
+
depends_on_prior: true
|
|
61
|
+
|
|
62
|
+
checks:
|
|
63
|
+
- name: brief-precedes-checklist
|
|
64
|
+
kind: file-order
|
|
65
|
+
files:
|
|
66
|
+
- "docs/onboarding/${engineer_name}/brief.md"
|
|
67
|
+
- "docs/onboarding/${engineer_name}/day-1-checklist.md"
|
|
68
|
+
- name: checklist-precedes-checkpoint
|
|
69
|
+
kind: file-order
|
|
70
|
+
files:
|
|
71
|
+
- "docs/onboarding/${engineer_name}/day-1-checklist.md"
|
|
72
|
+
- "docs/onboarding/${engineer_name}/day-3-checkpoint.md"
|
|
73
|
+
- name: checkpoint-precedes-handoff
|
|
74
|
+
kind: file-order
|
|
75
|
+
files:
|
|
76
|
+
- "docs/onboarding/${engineer_name}/day-3-checkpoint.md"
|
|
77
|
+
- "docs/onboarding/${engineer_name}/week-1-handoff.md"
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
id: new-feature
|
|
3
|
+
title: New feature workflow
|
|
4
|
+
description: PRD to ADR to tests to implementation to review chain.
|
|
5
|
+
|
|
6
|
+
inputs:
|
|
7
|
+
- name: feature_name
|
|
8
|
+
prompt: "Short feature name (lowercase-hyphenated)"
|
|
9
|
+
required: true
|
|
10
|
+
- name: owner
|
|
11
|
+
prompt: "Owner specialist"
|
|
12
|
+
default: engineer
|
|
13
|
+
|
|
14
|
+
artifacts:
|
|
15
|
+
- template: prd.md
|
|
16
|
+
path: "docs/prd/${feature_name}.md"
|
|
17
|
+
title: "PRD: ${feature_name}"
|
|
18
|
+
|
|
19
|
+
- template: adr.md
|
|
20
|
+
path: "docs/adr/${feature_name}.md"
|
|
21
|
+
title: "ADR: ${feature_name}"
|
|
22
|
+
depends_on:
|
|
23
|
+
- "docs/prd/${feature_name}.md"
|
|
24
|
+
|
|
25
|
+
- template: test-plan.md
|
|
26
|
+
path: "docs/test-plans/${feature_name}.md"
|
|
27
|
+
depends_on:
|
|
28
|
+
- "docs/adr/${feature_name}.md"
|
|
29
|
+
|
|
30
|
+
beads_items:
|
|
31
|
+
- type: feature
|
|
32
|
+
title: "${feature_name}: spec"
|
|
33
|
+
link_to: "docs/prd/${feature_name}.md"
|
|
34
|
+
|
|
35
|
+
- type: feature
|
|
36
|
+
title: "${feature_name}: design"
|
|
37
|
+
link_to: "docs/adr/${feature_name}.md"
|
|
38
|
+
depends_on_prior: true
|
|
39
|
+
|
|
40
|
+
- type: feature
|
|
41
|
+
title: "${feature_name}: implementation"
|
|
42
|
+
depends_on_prior: true
|
|
43
|
+
|
|
44
|
+
- type: feature
|
|
45
|
+
title: "${feature_name}: review"
|
|
46
|
+
depends_on_prior: true
|
|
47
|
+
|
|
48
|
+
checks:
|
|
49
|
+
- name: prd-precedes-adr
|
|
50
|
+
kind: file-order
|
|
51
|
+
files:
|
|
52
|
+
- "docs/prd/${feature_name}.md"
|
|
53
|
+
- "docs/adr/${feature_name}.md"
|