@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.
Files changed (218) hide show
  1. package/README.md +39 -34
  2. package/bin/construct +1403 -96
  3. package/commands/build/feature.md +1 -1
  4. package/commands/build/fix.md +1 -1
  5. package/commands/design/access.md +1 -1
  6. package/commands/design/flow.md +1 -1
  7. package/commands/design/ui.md +1 -1
  8. package/commands/measure/experiment.md +1 -1
  9. package/commands/measure/metrics.md +1 -1
  10. package/commands/measure/results.md +1 -1
  11. package/commands/plan/api.md +1 -1
  12. package/commands/plan/challenge.md +1 -1
  13. package/commands/plan/decide.md +1 -1
  14. package/commands/plan/feature.md +1 -1
  15. package/commands/plan/requirements.md +1 -1
  16. package/commands/remember/context.md +1 -1
  17. package/commands/remember/handoff.md +1 -1
  18. package/commands/remember/runbook.md +1 -1
  19. package/commands/review/code.md +1 -1
  20. package/commands/review/quality.md +1 -1
  21. package/commands/review/security.md +1 -1
  22. package/commands/ship/ready.md +1 -1
  23. package/commands/ship/release.md +1 -1
  24. package/commands/ship/status.md +1 -1
  25. package/commands/understand/docs.md +1 -1
  26. package/commands/understand/this.md +1 -1
  27. package/commands/understand/why.md +1 -1
  28. package/commands/work/clean.md +1 -1
  29. package/commands/work/drive.md +1 -1
  30. package/commands/work/optimize-prompts.md +2 -2
  31. package/commands/work/parallel-review.md +1 -1
  32. package/db/schema/007_tags.sql +30 -0
  33. package/db/schema/008_skill_usage.sql +24 -0
  34. package/db/schema/009_scheduler.sql +14 -0
  35. package/examples/internal/roles/architect/bad/clever-plan-without-contracts.md +1 -1
  36. package/examples/internal/roles/architect/golden/explicit-tradeoff-before-plan.md +1 -1
  37. package/examples/internal/roles/engineer/bad/speculative-abstraction.md +1 -1
  38. package/examples/internal/roles/engineer/golden/read-before-write.md +1 -1
  39. package/examples/internal/roles/qa/bad/coverage-theater.md +1 -1
  40. package/examples/internal/roles/qa/golden/regression-gate.md +1 -1
  41. package/examples/seed-observations/decisions.md +1 -1
  42. package/lib/audit-skills.mjs +3 -3
  43. package/lib/auto-docs.mjs +8 -8
  44. package/lib/boundary.mjs +126 -0
  45. package/lib/cache-strategy-google.js +26 -31
  46. package/lib/cli-commands.mjs +276 -122
  47. package/lib/comment-lint.mjs +139 -1
  48. package/lib/completions.mjs +1 -1
  49. package/lib/config/schema.mjs +15 -1
  50. package/lib/contracts/validate.mjs +371 -0
  51. package/lib/daemons/contract.mjs +210 -0
  52. package/lib/distill.mjs +22 -4
  53. package/lib/doc-stamp.mjs +48 -0
  54. package/lib/docs-verify.mjs +59 -6
  55. package/lib/doctor/cli.mjs +16 -1
  56. package/lib/doctor/index.mjs +3 -1
  57. package/lib/doctor/watchers/consistency.mjs +360 -0
  58. package/lib/doctor/watchers/mcp-protocol.mjs +232 -0
  59. package/lib/document-extract.mjs +420 -17
  60. package/lib/document-ingest.mjs +2 -0
  61. package/lib/embed/cli.mjs +124 -3
  62. package/lib/embed/daemon.mjs +43 -4
  63. package/lib/embed/docs-lifecycle.mjs +1 -1
  64. package/lib/embed/inbox.mjs +50 -3
  65. package/lib/embed/role-framing.mjs +3 -3
  66. package/lib/embed/scheduler.mjs +33 -5
  67. package/lib/env-config.mjs +9 -3
  68. package/lib/evaluator-optimizer.mjs +2 -3
  69. package/lib/extractors/calendar.mjs +173 -0
  70. package/lib/extractors/shared/drop-info.mjs +22 -0
  71. package/lib/extractors/transcript.mjs +0 -0
  72. package/lib/gates-audit.mjs +8 -2
  73. package/lib/git-hooks/prepare-commit-msg +1 -1
  74. package/lib/headhunt.mjs +2 -2
  75. package/lib/hooks/agent-tracker.mjs +6 -11
  76. package/lib/hooks/comment-lint.mjs +16 -0
  77. package/lib/hooks/guard-bash.mjs +35 -14
  78. package/lib/hooks/mcp-audit.mjs +14 -1
  79. package/lib/hooks/pre-compact.mjs +92 -5
  80. package/lib/hooks/pre-push-gate.mjs +41 -8
  81. package/lib/hooks/proactive-activation.mjs +0 -14
  82. package/lib/hooks/registry-sync.mjs +2 -2
  83. package/lib/hooks/rule-verifier.mjs +217 -0
  84. package/lib/hooks/session-optimize.mjs +2 -1
  85. package/lib/hooks/stop-notify.mjs +7 -6
  86. package/lib/host-capabilities.mjs +10 -1
  87. package/lib/hygiene/scan.mjs +141 -0
  88. package/lib/init-unified.mjs +73 -65
  89. package/lib/install/stage-project.mjs +4 -4
  90. package/lib/intake/classify.mjs +309 -58
  91. package/lib/intake/daemon.mjs +121 -0
  92. package/lib/intake/filesystem-queue.mjs +31 -6
  93. package/lib/intake/intake-config.mjs +2 -1
  94. package/lib/intake/postgres-queue.mjs +45 -3
  95. package/lib/intake/prepare.mjs +3 -1
  96. package/lib/intake/quarantine.mjs +205 -0
  97. package/lib/intake/session-prelude.mjs +7 -1
  98. package/lib/intake/traceability.mjs +90 -0
  99. package/lib/knowledge/postgres-search.mjs +132 -0
  100. package/lib/knowledge/research-store.mjs +2 -0
  101. package/lib/knowledge/search.mjs +14 -4
  102. package/lib/maintenance/cleanup.mjs +315 -0
  103. package/lib/mcp/memory-bridge.mjs +276 -0
  104. package/lib/mcp/server.mjs +11 -3
  105. package/lib/mcp/tools/skills.mjs +32 -11
  106. package/lib/mcp/tools/workflow.mjs +25 -0
  107. package/lib/mcp-catalog.json +12 -8
  108. package/lib/mcp-platform-config.mjs +16 -8
  109. package/lib/migrations/index.mjs +106 -0
  110. package/lib/migrations/v1-baseline.mjs +33 -0
  111. package/lib/model-registry.mjs +1 -1
  112. package/lib/observation-store.mjs +9 -4
  113. package/lib/opencode-runtime-plugin.mjs +1 -1
  114. package/lib/orchestration-policy.mjs +4 -4
  115. package/lib/outcomes/record.mjs +2 -0
  116. package/lib/overrides/resolver.mjs +3 -3
  117. package/lib/parity.mjs +4 -4
  118. package/lib/policy/engine.mjs +2 -2
  119. package/lib/profiles/lifecycle.mjs +1 -1
  120. package/lib/profiles/rebrand.mjs +46 -0
  121. package/lib/project-init-shared.mjs +12 -0
  122. package/lib/prompt-metadata.mjs +4 -4
  123. package/lib/provider-capabilities.js +20 -7
  124. package/lib/providers/auth-manager.mjs +58 -17
  125. package/lib/providers/circuit-breaker.mjs +14 -0
  126. package/lib/providers/contract.mjs +67 -3
  127. package/lib/providers/creds.mjs +219 -0
  128. package/lib/providers/scaffold.mjs +107 -0
  129. package/lib/reflect.mjs +49 -12
  130. package/lib/role-preload.mjs +5 -0
  131. package/lib/roles/catalog.mjs +1 -1
  132. package/lib/roles/manifest.mjs +2 -2
  133. package/lib/scheduler/index.mjs +112 -0
  134. package/lib/scheduler/solo.mjs +183 -0
  135. package/lib/server/index.mjs +29 -29
  136. package/lib/server/insights.mjs +14 -12
  137. package/lib/server/langfuse-login.mjs +58 -0
  138. package/lib/server/static/assets/index-ab25c707.js +1 -1
  139. package/lib/session-store.mjs +6 -4
  140. package/lib/setup.mjs +14 -3
  141. package/lib/{agent-contracts-enforce.mjs → specialist-contracts-enforce.mjs} +4 -4
  142. package/lib/{agent-contracts.mjs → specialist-contracts.mjs} +9 -8
  143. package/lib/{agents → specialists}/postconditions.mjs +3 -3
  144. package/lib/{agents → specialists}/schema.mjs +6 -6
  145. package/lib/status.mjs +13 -11
  146. package/lib/storage/backup.mjs +2 -2
  147. package/lib/tags/lifecycle.mjs +278 -0
  148. package/lib/tags/vocabulary.mjs +140 -0
  149. package/lib/telemetry/client.mjs +5 -1
  150. package/lib/telemetry/otel-tracer.mjs +184 -0
  151. package/lib/telemetry/skill-calls.mjs +73 -12
  152. package/lib/uninstall/uninstall.mjs +1 -1
  153. package/lib/update.mjs +1 -1
  154. package/lib/validator.mjs +57 -56
  155. package/lib/version.mjs +51 -0
  156. package/lib/worker/trace.mjs +5 -1
  157. package/lib/workflows/instantiate.mjs +320 -0
  158. package/package.json +16 -3
  159. package/personas/construct.md +5 -3
  160. package/platforms/claude/CLAUDE.md +1 -1
  161. package/rules/common/development-workflow.md +2 -1
  162. package/rules/common/no-fabrication.md +69 -0
  163. package/rules/common/review-before-change.md +58 -0
  164. package/scripts/{sync-agents.mjs → sync-specialists.mjs} +171 -68
  165. package/skills/ai/prompt-optimizer.md +3 -3
  166. package/skills/exploration/dependency-graph-reading.md +98 -0
  167. package/skills/exploration/tracer-bullet-method.md +71 -0
  168. package/skills/exploration/unknown-codebase-onboarding.md +91 -0
  169. package/skills/operating/change-management.md +91 -0
  170. package/skills/operating/incident-response.md +75 -0
  171. package/skills/operating/oncall-rotation.md +95 -0
  172. package/skills/operating/orchestration-reference.md +2 -2
  173. package/skills/strategy/competitive-landscape.md +75 -0
  174. package/skills/strategy/market-research-methods.md +87 -0
  175. package/skills/strategy/narrative-arc.md +77 -0
  176. package/skills/strategy/pricing-positioning.md +94 -0
  177. package/specialists/contracts.json +1002 -0
  178. package/specialists/contracts.schema.json +83 -0
  179. package/specialists/policy-inventory.json +160 -0
  180. package/{agents → specialists}/prompts/cx-accessibility.md +3 -1
  181. package/{agents → specialists}/prompts/cx-ai-engineer.md +3 -1
  182. package/{agents → specialists}/prompts/cx-architect.md +3 -1
  183. package/{agents → specialists}/prompts/cx-business-strategist.md +3 -1
  184. package/{agents → specialists}/prompts/cx-data-analyst.md +3 -1
  185. package/{agents → specialists}/prompts/cx-data-engineer.md +3 -1
  186. package/{agents → specialists}/prompts/cx-debugger.md +3 -1
  187. package/{agents → specialists}/prompts/cx-designer.md +3 -1
  188. package/{agents → specialists}/prompts/cx-devil-advocate.md +3 -1
  189. package/{agents → specialists}/prompts/cx-docs-keeper.md +4 -2
  190. package/{agents → specialists}/prompts/cx-engineer.md +4 -2
  191. package/{agents → specialists}/prompts/cx-evaluator.md +3 -1
  192. package/{agents → specialists}/prompts/cx-explorer.md +3 -1
  193. package/{agents → specialists}/prompts/cx-legal-compliance.md +3 -1
  194. package/{agents → specialists}/prompts/cx-operations.md +3 -1
  195. package/{agents → specialists}/prompts/cx-orchestrator.md +4 -2
  196. package/{agents → specialists}/prompts/cx-platform-engineer.md +3 -1
  197. package/{agents → specialists}/prompts/cx-product-manager.md +3 -1
  198. package/{agents → specialists}/prompts/cx-qa.md +3 -1
  199. package/{agents → specialists}/prompts/cx-rd-lead.md +3 -1
  200. package/{agents → specialists}/prompts/cx-release-manager.md +3 -1
  201. package/{agents → specialists}/prompts/cx-researcher.md +3 -1
  202. package/{agents → specialists}/prompts/cx-reviewer.md +4 -2
  203. package/{agents → specialists}/prompts/cx-security.md +3 -1
  204. package/{agents → specialists}/prompts/cx-sre.md +4 -2
  205. package/{agents → specialists}/prompts/cx-test-automation.md +3 -1
  206. package/{agents → specialists}/prompts/cx-trace-reviewer.md +5 -3
  207. package/{agents → specialists}/prompts/cx-ux-researcher.md +3 -1
  208. package/{agents → specialists}/registry.json +651 -418
  209. package/{agents → specialists}/role-manifests.json +8 -8
  210. package/templates/docs/construct_guide.md +6 -6
  211. package/templates/docs/skill-artifact.md +1 -1
  212. package/templates/provider-scaffold/health.test.mjs +30 -0
  213. package/templates/provider-scaffold/index.mjs +48 -0
  214. package/templates/workflows/cross-team-handoff.yml +85 -0
  215. package/templates/workflows/engineering-onboarding.yml +77 -0
  216. package/templates/workflows/new-feature.yml +53 -0
  217. package/agents/contracts.json +0 -387
  218. /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 agents/registry.json). Empty entries reserve the slot for future onboarding without code change.",
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:agents/**"]
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:agents/**"]
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:agents/registry.json", "edit:install.sh", "edit:claude/settings.template.json"]
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:agents/**"]
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/agents/**", "agents/**", "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" },
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:agents/**"] }, "outputs": { "bdLabels": ["orchestration", "dispatch"], "docTypes": ["memo"] }, "handoffCandidates": ["product-manager", "architect", "engineer", "security", "qa", "sre"], "killSwitchEnv": "CONSTRUCT_ROLE_ORCHESTRATOR" },
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/v2/](https://geraldmaron.github.io/construct/v2/)
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/v2/docs/reference/cli>
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/v2/docs/operations/troubleshooting>
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/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.
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"