@geraldmaron/construct 1.0.7 → 1.0.9

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 (147) hide show
  1. package/README.md +20 -17
  2. package/bin/construct +1199 -69
  3. package/commands/work/optimize-prompts.md +1 -1
  4. package/db/schema/007_tags.sql +30 -0
  5. package/db/schema/008_skill_usage.sql +24 -0
  6. package/db/schema/009_scheduler.sql +14 -0
  7. package/examples/internal/roles/architect/bad/clever-plan-without-contracts.md +1 -1
  8. package/examples/internal/roles/architect/golden/explicit-tradeoff-before-plan.md +1 -1
  9. package/examples/internal/roles/engineer/bad/speculative-abstraction.md +1 -1
  10. package/examples/internal/roles/engineer/golden/read-before-write.md +1 -1
  11. package/examples/internal/roles/qa/bad/coverage-theater.md +1 -1
  12. package/examples/internal/roles/qa/golden/regression-gate.md +1 -1
  13. package/examples/seed-observations/decisions.md +1 -1
  14. package/lib/audit-skills.mjs +3 -3
  15. package/lib/auto-docs.mjs +2 -2
  16. package/lib/cli-commands.mjs +276 -122
  17. package/lib/comment-lint.mjs +5 -1
  18. package/lib/completions.mjs +1 -1
  19. package/lib/config/schema.mjs +15 -1
  20. package/lib/contracts/validate.mjs +65 -17
  21. package/lib/distill.mjs +22 -4
  22. package/lib/doc-stamp.mjs +48 -0
  23. package/lib/doctor/watchers/consistency.mjs +62 -12
  24. package/lib/document-extract.mjs +221 -28
  25. package/lib/document-ingest.mjs +2 -0
  26. package/lib/embed/inbox.mjs +48 -3
  27. package/lib/embed/role-framing.mjs +3 -3
  28. package/lib/env-config.mjs +9 -3
  29. package/lib/extractors/calendar.mjs +173 -0
  30. package/lib/extractors/shared/drop-info.mjs +22 -0
  31. package/lib/extractors/transcript.mjs +0 -0
  32. package/lib/gates-audit.mjs +8 -2
  33. package/lib/git-hooks/prepare-commit-msg +1 -1
  34. package/lib/headhunt.mjs +2 -2
  35. package/lib/hooks/agent-tracker.mjs +6 -11
  36. package/lib/hooks/guard-bash.mjs +35 -14
  37. package/lib/hooks/mcp-audit.mjs +12 -0
  38. package/lib/hooks/pre-compact.mjs +92 -5
  39. package/lib/hooks/pre-push-gate.mjs +41 -8
  40. package/lib/hooks/registry-sync.mjs +2 -2
  41. package/lib/hooks/stop-notify.mjs +7 -6
  42. package/lib/host-capabilities.mjs +10 -1
  43. package/lib/hygiene/scan.mjs +141 -0
  44. package/lib/init-unified.mjs +18 -0
  45. package/lib/install/stage-project.mjs +4 -4
  46. package/lib/intake/classify.mjs +222 -55
  47. package/lib/intake/filesystem-queue.mjs +25 -5
  48. package/lib/intake/postgres-queue.mjs +45 -3
  49. package/lib/intake/prepare.mjs +3 -0
  50. package/lib/intake/quarantine.mjs +205 -0
  51. package/lib/knowledge/postgres-search.mjs +132 -0
  52. package/lib/knowledge/search.mjs +14 -4
  53. package/lib/mcp/server.mjs +9 -3
  54. package/lib/mcp/tools/skills.mjs +32 -11
  55. package/lib/mcp/tools/workflow.mjs +1 -1
  56. package/lib/migrations/index.mjs +1 -1
  57. package/lib/model-registry.mjs +1 -1
  58. package/lib/opencode-runtime-plugin.mjs +1 -1
  59. package/lib/orchestration-policy.mjs +4 -4
  60. package/lib/overrides/resolver.mjs +3 -3
  61. package/lib/parity.mjs +4 -4
  62. package/lib/policy/engine.mjs +2 -2
  63. package/lib/profiles/lifecycle.mjs +1 -1
  64. package/lib/prompt-metadata.mjs +4 -4
  65. package/lib/providers/circuit-breaker.mjs +14 -0
  66. package/lib/providers/contract.mjs +67 -3
  67. package/lib/providers/creds.mjs +219 -0
  68. package/lib/providers/scaffold.mjs +107 -0
  69. package/lib/role-preload.mjs +5 -0
  70. package/lib/roles/catalog.mjs +1 -1
  71. package/lib/roles/manifest.mjs +2 -2
  72. package/lib/scheduler/index.mjs +112 -0
  73. package/lib/scheduler/solo.mjs +183 -0
  74. package/lib/server/index.mjs +7 -1
  75. package/lib/server/insights.mjs +14 -12
  76. package/lib/server/langfuse-login.mjs +58 -0
  77. package/lib/server/static/assets/index-ab25c707.js +1 -1
  78. package/lib/{agent-contracts-enforce.mjs → specialist-contracts-enforce.mjs} +4 -4
  79. package/lib/{agent-contracts.mjs → specialist-contracts.mjs} +9 -8
  80. package/lib/{agents → specialists}/postconditions.mjs +3 -3
  81. package/lib/{agents → specialists}/schema.mjs +6 -6
  82. package/lib/status.mjs +13 -11
  83. package/lib/storage/backup.mjs +2 -2
  84. package/lib/tags/lifecycle.mjs +278 -0
  85. package/lib/tags/vocabulary.mjs +140 -0
  86. package/lib/telemetry/otel-tracer.mjs +184 -0
  87. package/lib/telemetry/skill-calls.mjs +73 -12
  88. package/lib/uninstall/uninstall.mjs +1 -1
  89. package/lib/update.mjs +1 -1
  90. package/lib/validator.mjs +57 -56
  91. package/lib/workflows/instantiate.mjs +320 -0
  92. package/package.json +13 -3
  93. package/personas/construct.md +2 -2
  94. package/platforms/claude/CLAUDE.md +1 -1
  95. package/rules/common/no-fabrication.md +1 -1
  96. package/scripts/{sync-agents.mjs → sync-specialists.mjs} +130 -58
  97. package/skills/ai/prompt-optimizer.md +3 -3
  98. package/skills/exploration/dependency-graph-reading.md +98 -0
  99. package/skills/exploration/tracer-bullet-method.md +71 -0
  100. package/skills/exploration/unknown-codebase-onboarding.md +91 -0
  101. package/skills/operating/change-management.md +91 -0
  102. package/skills/operating/incident-response.md +75 -0
  103. package/skills/operating/oncall-rotation.md +95 -0
  104. package/skills/operating/orchestration-reference.md +2 -2
  105. package/skills/strategy/competitive-landscape.md +75 -0
  106. package/skills/strategy/market-research-methods.md +87 -0
  107. package/skills/strategy/narrative-arc.md +77 -0
  108. package/skills/strategy/pricing-positioning.md +94 -0
  109. package/{agents → specialists}/contracts.schema.json +1 -1
  110. package/specialists/policy-inventory.json +160 -0
  111. package/{agents → specialists}/prompts/cx-accessibility.md +1 -1
  112. package/{agents → specialists}/prompts/cx-ai-engineer.md +1 -1
  113. package/{agents → specialists}/prompts/cx-architect.md +1 -1
  114. package/{agents → specialists}/prompts/cx-business-strategist.md +1 -1
  115. package/{agents → specialists}/prompts/cx-data-analyst.md +1 -1
  116. package/{agents → specialists}/prompts/cx-data-engineer.md +1 -1
  117. package/{agents → specialists}/prompts/cx-debugger.md +1 -1
  118. package/{agents → specialists}/prompts/cx-designer.md +1 -1
  119. package/{agents → specialists}/prompts/cx-devil-advocate.md +1 -1
  120. package/{agents → specialists}/prompts/cx-docs-keeper.md +2 -2
  121. package/{agents → specialists}/prompts/cx-engineer.md +2 -2
  122. package/{agents → specialists}/prompts/cx-evaluator.md +1 -1
  123. package/{agents → specialists}/prompts/cx-explorer.md +1 -1
  124. package/{agents → specialists}/prompts/cx-legal-compliance.md +1 -1
  125. package/{agents → specialists}/prompts/cx-operations.md +1 -1
  126. package/{agents → specialists}/prompts/cx-orchestrator.md +2 -2
  127. package/{agents → specialists}/prompts/cx-platform-engineer.md +1 -1
  128. package/{agents → specialists}/prompts/cx-product-manager.md +1 -1
  129. package/{agents → specialists}/prompts/cx-qa.md +1 -1
  130. package/{agents → specialists}/prompts/cx-rd-lead.md +1 -1
  131. package/{agents → specialists}/prompts/cx-release-manager.md +1 -1
  132. package/{agents → specialists}/prompts/cx-researcher.md +1 -1
  133. package/{agents → specialists}/prompts/cx-reviewer.md +2 -2
  134. package/{agents → specialists}/prompts/cx-security.md +1 -1
  135. package/{agents → specialists}/prompts/cx-sre.md +2 -2
  136. package/{agents → specialists}/prompts/cx-test-automation.md +1 -1
  137. package/{agents → specialists}/prompts/cx-trace-reviewer.md +3 -3
  138. package/{agents → specialists}/prompts/cx-ux-researcher.md +1 -1
  139. package/{agents → specialists}/registry.json +651 -423
  140. package/{agents → specialists}/role-manifests.json +8 -8
  141. package/templates/provider-scaffold/health.test.mjs +30 -0
  142. package/templates/provider-scaffold/index.mjs +48 -0
  143. package/templates/workflows/cross-team-handoff.yml +85 -0
  144. package/templates/workflows/engineering-onboarding.yml +77 -0
  145. package/templates/workflows/new-feature.yml +53 -0
  146. /package/{agents → specialists}/contracts.json +0 -0
  147. /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" }
@@ -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"
File without changes
File without changes