forge-workflow 0.0.10 → 0.1.0-beta.2

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 (454) hide show
  1. package/.claude/rules/{greptile-review-process.md → review-process.md} +56 -41
  2. package/.claude/scripts/{greptile-resolve.sh → review-resolve.sh} +13 -3
  3. package/.cursor/rules/permissions-guidance.mdc +2 -2
  4. package/.forge/hooks/check-tdd.js +3 -0
  5. package/.forge/hooks/forge-native-hook.js +245 -0
  6. package/.forge/protected-paths.yaml +157 -0
  7. package/AGENTS.md +150 -61
  8. package/CHANGELOG.md +681 -0
  9. package/CLAUDE.md +9 -118
  10. package/QUICKSTART.md +171 -0
  11. package/README.md +271 -363
  12. package/bin/forge-cmd.js +120 -9
  13. package/bin/forge-preflight.js +26 -5
  14. package/bin/forge.js +461 -489
  15. package/docs/INDEX.md +93 -0
  16. package/docs/PROJECT_DESIGN.md +685 -0
  17. package/docs/architecture/index.md +66 -0
  18. package/docs/architecture/notes/README.md +35 -0
  19. package/docs/architecture/subsystems/README.md +46 -0
  20. package/docs/forge/TOOLCHAIN.md +670 -0
  21. package/docs/forge/VALIDATION.md +82 -0
  22. package/docs/{AGENT_INSTALL_PROMPT.md → guides/AGENT_INSTALL_PROMPT.md} +3 -3
  23. package/docs/guides/BEADS_GITHUB_SYNC.md +32 -0
  24. package/docs/{ENHANCED_ONBOARDING.md → guides/ENHANCED_ONBOARDING.md} +16 -12
  25. package/docs/guides/GREPTILE_SETUP.md +46 -0
  26. package/docs/guides/MANUAL_REVIEW_GUIDE.md +58 -0
  27. package/docs/guides/MIGRATION.md +56 -0
  28. package/docs/guides/SETUP.md +118 -0
  29. package/docs/guides/SUPPORT.md +185 -0
  30. package/docs/guides/WORKFLOW_TEMPLATES.md +74 -0
  31. package/docs/guides/memory-backends.md +183 -0
  32. package/docs/reference/ADAPTERS.md +128 -0
  33. package/docs/reference/AGENT_SKILL_PARITY.md +175 -0
  34. package/docs/reference/COMMANDS.md +205 -0
  35. package/docs/reference/DECISION_DRIFT_GUARDS.md +97 -0
  36. package/docs/{EXAMPLES.md → reference/EXAMPLES.md} +7 -5
  37. package/docs/reference/FORGE_KERNEL_STORAGE_MODEL.md +135 -0
  38. package/docs/reference/HERMES_INTEGRATION.md +118 -0
  39. package/docs/reference/INSIGHTS_RECAP.md +63 -0
  40. package/docs/reference/INSTALL.md +164 -0
  41. package/docs/reference/KERNEL_TAXONOMY_VALIDATION.md +161 -0
  42. package/docs/reference/PROTECTED_PATH_MANIFEST.md +25 -0
  43. package/docs/reference/RELEASE.md +68 -0
  44. package/docs/reference/RESEARCH_TEMPLATE.md +292 -0
  45. package/docs/{ROADMAP.md → reference/ROADMAP.md} +12 -9
  46. package/docs/reference/SKILLS.md +35 -0
  47. package/docs/reference/STATUS_BOARD.md +80 -0
  48. package/docs/reference/TEMPLATES.md +106 -0
  49. package/docs/{TOOLCHAIN.md → reference/TOOLCHAIN.md} +62 -47
  50. package/docs/reference/VALIDATION.md +82 -0
  51. package/docs/reference/agent-permissions.md +169 -0
  52. package/docs/reference/beads-to-kernel-migration-ux.md +61 -0
  53. package/docs/reference/control-plane-guarantees.md +125 -0
  54. package/docs/reference/dependency-chain.md +331 -0
  55. package/docs/reference/forge-kernel-issue-command-contract.md +161 -0
  56. package/docs/reference/forge-kernel-schema.md +72 -0
  57. package/docs/reference/kernel-conflict-evaluators.md +27 -0
  58. package/docs/reference/patch-md-format.md +77 -0
  59. package/docs/reference/protected-state-surfaces.md +59 -0
  60. package/docs/reference/shepherd.md +115 -0
  61. package/docs/reference/superpowers-analysis.md +320 -0
  62. package/docs/reference/superpowers-integration-options.md +404 -0
  63. package/docs/reference/test-environment.md +519 -0
  64. package/docs/reference/upgrade-safety.md +59 -0
  65. package/lefthook.yml +18 -0
  66. package/lib/adapter-cli.js +307 -0
  67. package/lib/adapters/beads-issue-adapter.js +127 -0
  68. package/lib/adapters/beads-kernel-compat.js +1042 -0
  69. package/lib/adapters/greptile-review-adapter.js +141 -0
  70. package/lib/adapters/kernel-issue-adapter.js +101 -0
  71. package/lib/adapters/pr-state-adapter.js +484 -0
  72. package/lib/adoption-profiles.js +126 -0
  73. package/lib/agents/README.md +2 -6
  74. package/lib/agents/claude.plugin.json +3 -8
  75. package/lib/agents/codex.plugin.json +9 -1
  76. package/lib/agents/cursor.plugin.json +2 -6
  77. package/lib/agents/hermes.plugin.json +22 -0
  78. package/lib/agents-config.js +39 -1236
  79. package/lib/audit-evidence.js +282 -0
  80. package/lib/beads-setup.js +121 -0
  81. package/lib/beads-sync-scaffold.js +25 -101
  82. package/lib/codex-skills.js +51 -1
  83. package/lib/commands/_issue.js +741 -77
  84. package/lib/commands/_manifest.js +91 -0
  85. package/lib/commands/_registry.js +85 -34
  86. package/lib/commands/_resolve-command-opts.js +261 -0
  87. package/lib/commands/_serve-security.js +270 -0
  88. package/lib/commands/adapter.js +12 -0
  89. package/lib/commands/add.js +118 -0
  90. package/lib/commands/audit.js +70 -0
  91. package/lib/commands/blocked.js +5 -0
  92. package/lib/commands/board.js +64 -0
  93. package/lib/commands/claim.js +21 -2
  94. package/lib/commands/claims.js +7 -0
  95. package/lib/commands/clean.js +485 -75
  96. package/lib/commands/close.js +2 -2
  97. package/lib/commands/comment.js +5 -0
  98. package/lib/commands/control.js +148 -0
  99. package/lib/commands/create.js +2 -2
  100. package/lib/commands/dev.js +185 -7
  101. package/lib/commands/doc-gate.js +336 -0
  102. package/lib/commands/doctor.js +156 -0
  103. package/lib/commands/explain.js +15 -0
  104. package/lib/commands/export.js +237 -0
  105. package/lib/commands/gate.js +192 -0
  106. package/lib/commands/hooks.js +242 -0
  107. package/lib/commands/inbox.js +118 -0
  108. package/lib/commands/init.js +598 -0
  109. package/lib/commands/insights.js +79 -0
  110. package/lib/commands/issue.js +12 -1
  111. package/lib/commands/issues.js +17 -0
  112. package/lib/commands/lint.js +5 -0
  113. package/lib/commands/list.js +2 -2
  114. package/lib/commands/merge.js +312 -0
  115. package/lib/commands/migrate.js +523 -0
  116. package/lib/commands/new.js +12 -0
  117. package/lib/commands/options.js +241 -0
  118. package/lib/commands/orient.js +13 -0
  119. package/lib/commands/orphans.js +5 -0
  120. package/lib/commands/patch.js +67 -0
  121. package/lib/commands/plan.js +436 -24
  122. package/lib/commands/preflight.js +211 -0
  123. package/lib/commands/prime.js +13 -0
  124. package/lib/commands/push.js +69 -2
  125. package/lib/commands/ready.js +2 -2
  126. package/lib/commands/recall.js +116 -0
  127. package/lib/commands/recap.js +61 -0
  128. package/lib/commands/recommend.js +0 -1
  129. package/lib/commands/release.js +91 -0
  130. package/lib/commands/remember.js +74 -0
  131. package/lib/commands/role.js +99 -0
  132. package/lib/commands/serve.js +581 -0
  133. package/lib/commands/setup.js +838 -972
  134. package/lib/commands/shepherd.js +436 -0
  135. package/lib/commands/ship.js +23 -1
  136. package/lib/commands/show.js +2 -2
  137. package/lib/commands/stage.js +192 -0
  138. package/lib/commands/stale.js +5 -0
  139. package/lib/commands/status.js +158 -21
  140. package/lib/commands/sync.js +34 -46
  141. package/lib/commands/team.js +4 -1
  142. package/lib/commands/test.js +43 -27
  143. package/lib/commands/update.js +2 -2
  144. package/lib/commands/upgrade.js +47 -0
  145. package/lib/commands/validate.js +43 -18
  146. package/lib/commands/worktree.js +307 -100
  147. package/lib/config-writer.js +202 -0
  148. package/lib/control-plane.js +236 -0
  149. package/lib/core/runtime-graph.js +946 -0
  150. package/lib/dep-guard/keyword-ripple.js +2 -2
  151. package/lib/deprecated-sync-cleanup.js +362 -0
  152. package/lib/detect-agent.js +2 -28
  153. package/lib/detect-worktree.js +35 -9
  154. package/lib/doc-gate/declaration.js +177 -0
  155. package/lib/doc-gate/detect.js +289 -0
  156. package/lib/doc-gate/gate.js +375 -0
  157. package/lib/doc-gate/okf-config.js +128 -0
  158. package/lib/doc-gate/okf.js +429 -0
  159. package/lib/docs-command.js +1161 -6
  160. package/lib/forge-issues.js +382 -11
  161. package/lib/forge-lock.js +262 -0
  162. package/lib/gate-events.js +193 -0
  163. package/lib/global-flags.js +74 -0
  164. package/lib/greptile-match.js +7 -63
  165. package/lib/harness-capability-matrix.js +380 -0
  166. package/lib/hook-global-installer.js +347 -0
  167. package/lib/hook-renderer.js +451 -0
  168. package/lib/inbox.js +391 -0
  169. package/lib/insights.js +397 -0
  170. package/lib/issue-adapter.js +156 -0
  171. package/lib/issue-backend.js +145 -0
  172. package/lib/issue-render.js +220 -0
  173. package/lib/kernel/backing-issue.js +305 -0
  174. package/lib/kernel/broker.js +1218 -0
  175. package/lib/kernel/cli-broker-factory.js +130 -0
  176. package/lib/kernel/conflict-signal.js +82 -0
  177. package/lib/kernel/evaluators.js +195 -0
  178. package/lib/kernel/fs-class.js +495 -0
  179. package/lib/kernel/issue-command-contract.js +559 -0
  180. package/lib/kernel/issue-id-resolver.js +186 -0
  181. package/lib/kernel/lease-enforcer.js +158 -0
  182. package/lib/kernel/migrations.js +333 -0
  183. package/lib/kernel/planning-buckets-schema.js +109 -0
  184. package/lib/kernel/projection-jsonl-writer.js +450 -0
  185. package/lib/kernel/readiness-model.js +329 -0
  186. package/lib/kernel/schema.js +356 -0
  187. package/lib/kernel/sqlite-driver.js +2504 -0
  188. package/lib/kernel/taxonomy-validator.js +394 -0
  189. package/lib/lefthook-check.js +3 -2
  190. package/lib/lefthook-wiring.js +413 -0
  191. package/lib/mcp-config-renderer.js +288 -0
  192. package/lib/memory/graphiti-mcp.js +106 -0
  193. package/lib/memory/router.js +387 -0
  194. package/lib/memory/typed-api.js +102 -0
  195. package/lib/memory-digest.js +195 -0
  196. package/lib/merge-rules.js +395 -0
  197. package/lib/migrate-dry-run.js +466 -0
  198. package/lib/orientation.js +863 -0
  199. package/lib/package-manager-remediation.js +103 -0
  200. package/lib/package-root.js +381 -0
  201. package/lib/patch-intent.js +890 -0
  202. package/lib/plugin-catalog.js +3 -4
  203. package/lib/plugin-manager.js +0 -5
  204. package/lib/pr-bundle.js +186 -0
  205. package/lib/pr-monitor/differ.js +195 -0
  206. package/lib/pr-monitor/events.js +0 -0
  207. package/lib/pr-monitor/gather.js +124 -0
  208. package/lib/pr-monitor/journal.js +299 -0
  209. package/lib/pr-monitor/monitor.js +146 -0
  210. package/lib/pr-monitor/render-sticky.js +157 -0
  211. package/lib/pr-monitor/watch-lifecycle.js +95 -0
  212. package/lib/pr-monitor/watch.js +247 -0
  213. package/lib/pr-pull.js +1273 -0
  214. package/lib/pr-shepherd.js +494 -0
  215. package/lib/pr-state-validator.js +59 -0
  216. package/lib/preflight/gates.js +237 -0
  217. package/lib/preflight/runner.js +116 -0
  218. package/lib/project-discovery.js +0 -53
  219. package/lib/project-memory.js +99 -497
  220. package/lib/protected-path-manifest.js +281 -0
  221. package/lib/protected-state-surfaces.js +387 -0
  222. package/lib/release-readiness.js +2089 -0
  223. package/lib/reset.js +59 -45
  224. package/lib/review-adapter.js +68 -0
  225. package/lib/rules-sync.js +260 -0
  226. package/lib/runtime-health.js +241 -20
  227. package/lib/safety-config-renderer.js +268 -0
  228. package/lib/setup-action-log.js +1 -7
  229. package/lib/setup.js +27 -65
  230. package/lib/shell-utils.js +76 -6
  231. package/lib/skills-sync.js +330 -0
  232. package/lib/smart-status/scoring.js +17 -3
  233. package/lib/status/beads-snapshot.js +45 -2
  234. package/lib/status/presenter.js +169 -18
  235. package/lib/status/snapshot.js +186 -0
  236. package/lib/sync-backend.js +202 -0
  237. package/lib/untrusted-content.js +52 -0
  238. package/lib/upgrade-safety.js +199 -0
  239. package/lib/workflow/enforce-stage.js +296 -47
  240. package/lib/workflow/stage-transition.js +115 -0
  241. package/lib/workflow/stages.js +30 -6
  242. package/lib/workflow/state-manager.js +11 -22
  243. package/lib/workflow/state.js +23 -1
  244. package/lib/workflow-profiles.js +17 -5
  245. package/package.json +37 -35
  246. package/rules/documentation.md +19 -0
  247. package/rules/kernel-tracking.md +26 -0
  248. package/rules/security.md +22 -0
  249. package/rules/tdd.md +20 -0
  250. package/rules/workflow.md +27 -0
  251. package/scripts/auto-backing-issue.js +47 -0
  252. package/scripts/beads-context.sh +81 -57
  253. package/scripts/beads-upgrade-smoke.sh +24 -3
  254. package/scripts/bootstrap-windows-tools.sh +78 -0
  255. package/scripts/branch-protection.js +2 -3
  256. package/scripts/check-agents.js +34 -137
  257. package/scripts/commitlint.js +3 -1
  258. package/scripts/conflict-detect.sh +3 -0
  259. package/scripts/dep-guard.sh +22 -3
  260. package/scripts/file-index.sh +3 -0
  261. package/scripts/forge-team/lib/claim.sh +34 -18
  262. package/scripts/forge-team/lib/dashboard.sh +61 -86
  263. package/scripts/forge-team/lib/epic.sh +99 -263
  264. package/scripts/forge-team/lib/hooks.sh +26 -28
  265. package/scripts/forge-team/lib/identity.sh +4 -4
  266. package/scripts/forge-team/lib/sync-github.sh +49 -84
  267. package/scripts/forge-team/lib/verify.sh +93 -83
  268. package/scripts/forge-team/lib/workload.sh +41 -65
  269. package/scripts/forge-team/tests/claim.test.sh +25 -19
  270. package/scripts/forge-team/tests/dashboard.test.sh +31 -46
  271. package/scripts/forge-team/tests/epic.test.sh +52 -71
  272. package/scripts/forge-team/tests/hooks.test.sh +38 -50
  273. package/scripts/forge-team/tests/identity.test.sh +3 -3
  274. package/scripts/forge-team/tests/integration.test.sh +44 -66
  275. package/scripts/forge-team/tests/sync-github.test.sh +50 -83
  276. package/scripts/forge-team/tests/verify.test.sh +37 -46
  277. package/scripts/forge-team/tests/workflow-integration.test.sh +4 -4
  278. package/scripts/forge-team/tests/workload.test.sh +32 -66
  279. package/scripts/gen-command-manifest.js +153 -0
  280. package/scripts/gen-embedded-assets.mjs +129 -0
  281. package/scripts/install.ps1 +139 -0
  282. package/scripts/install.sh +268 -0
  283. package/scripts/lib/release-asset.mjs +84 -0
  284. package/scripts/parity-check.mjs +145 -0
  285. package/scripts/parity-check.test.mjs +58 -0
  286. package/scripts/pin-agentic-workflow-images.js +112 -0
  287. package/scripts/pr-coordinator.sh +3 -0
  288. package/scripts/preflight-sonar.eslint.config.mjs +44 -0
  289. package/scripts/preflight.sh +21 -94
  290. package/scripts/protected-state-check.js +104 -0
  291. package/scripts/smart-status.sh +60 -57
  292. package/scripts/spikes/config-race-bench.js +111 -0
  293. package/scripts/spikes/harness-capability-matrix.js +13 -0
  294. package/scripts/spikes/patch-anchor-stability-bench.js +125 -0
  295. package/scripts/spikes/protected-path-manifest.js +20 -0
  296. package/scripts/spikes/skill-auto-invoke-parity.js +292 -0
  297. package/scripts/sync-agent-skills.js +62 -0
  298. package/scripts/sync-utils.sh +3 -0
  299. package/scripts/test-ci-shard.js +13 -6
  300. package/scripts/test.js +95 -12
  301. package/skills/claim-safety/SKILL.md +102 -0
  302. package/skills/claim-safety/evals/evals.json +46 -0
  303. package/{.github/prompts/dev.prompt.md → skills/dev/SKILL.md} +44 -50
  304. package/skills/dev/evals/evals.json +50 -0
  305. package/skills/hermes-forge/SKILL.md +185 -0
  306. package/skills/hermes-forge/evals/evals.json +46 -0
  307. package/skills/issue-basics/SKILL.md +111 -0
  308. package/skills/issue-basics/evals/evals.json +46 -0
  309. package/skills/kernel/SKILL.md +166 -0
  310. package/skills/kernel/evals/evals.json +50 -0
  311. package/skills/memory/SKILL.md +102 -0
  312. package/skills/parallel-deep-research/SKILL.md +14 -11
  313. package/skills/parallel-deep-research/evals/evals.json +11 -27
  314. package/{.github/prompts/plan.prompt.md → skills/plan/SKILL.md} +132 -157
  315. package/skills/plan/evals/evals.json +42 -0
  316. package/skills/research/SKILL.md +195 -0
  317. package/skills/research/evals/evals.json +42 -0
  318. package/{.github/prompts/review.prompt.md → skills/review/SKILL.md} +98 -62
  319. package/skills/review/evals/evals.json +42 -0
  320. package/skills/rollback/SKILL.md +110 -0
  321. package/skills/rollback/evals/evals.json +46 -0
  322. package/skills/rollback/references/methods.md +204 -0
  323. package/{.cursor/commands/rollback.md → skills/rollback/references/workflow-integration.md} +10 -284
  324. package/skills/shepherd/SKILL.md +66 -0
  325. package/skills/shepherd/evals/evals.json +42 -0
  326. package/{.github/prompts/ship.prompt.md → skills/ship/SKILL.md} +81 -45
  327. package/skills/ship/evals/evals.json +42 -0
  328. package/skills/smith/SKILL.md +142 -0
  329. package/skills/smith/evals/evals.json +46 -0
  330. package/skills/smith/references/autonomy-and-gates.md +94 -0
  331. package/{.github/prompts/sonarcloud.prompt.md → skills/sonarcloud/SKILL.md} +14 -3
  332. package/skills/sonarcloud/evals/evals.json +46 -0
  333. package/skills/sonarcloud-analysis/SKILL.md +18 -13
  334. package/skills/sonarcloud-analysis/evals/evals.json +11 -15
  335. package/{.github/prompts/status.prompt.md → skills/status/SKILL.md} +20 -10
  336. package/skills/status/evals/evals.json +50 -0
  337. package/skills/triage-ready/SKILL.md +121 -0
  338. package/skills/triage-ready/evals/evals.json +42 -0
  339. package/{.github/prompts/validate.prompt.md → skills/validate/SKILL.md} +52 -29
  340. package/skills/validate/evals/evals.json +42 -0
  341. package/skills/verify/SKILL.md +299 -0
  342. package/skills/verify/evals/evals.json +50 -0
  343. package/.claude/commands/dev.md +0 -345
  344. package/.claude/commands/plan.md +0 -566
  345. package/.claude/commands/premerge.md +0 -186
  346. package/.claude/commands/research.md +0 -42
  347. package/.claude/commands/review.md +0 -451
  348. package/.claude/commands/rollback.md +0 -721
  349. package/.claude/commands/ship.md +0 -213
  350. package/.claude/commands/sonarcloud.md +0 -152
  351. package/.claude/commands/status.md +0 -90
  352. package/.claude/commands/validate.md +0 -288
  353. package/.claude/commands/verify.md +0 -269
  354. package/.claude/rules/workflow.md +0 -121
  355. package/.cline/workflows/dev.md +0 -342
  356. package/.cline/workflows/plan.md +0 -563
  357. package/.cline/workflows/premerge.md +0 -183
  358. package/.cline/workflows/research.md +0 -39
  359. package/.cline/workflows/review.md +0 -448
  360. package/.cline/workflows/rollback.md +0 -718
  361. package/.cline/workflows/ship.md +0 -210
  362. package/.cline/workflows/sonarcloud.md +0 -146
  363. package/.cline/workflows/status.md +0 -87
  364. package/.cline/workflows/validate.md +0 -285
  365. package/.cline/workflows/verify.md +0 -266
  366. package/.codex/config.toml +0 -11
  367. package/.codex/skills/dev/SKILL.md +0 -345
  368. package/.codex/skills/plan/SKILL.md +0 -566
  369. package/.codex/skills/premerge/SKILL.md +0 -186
  370. package/.codex/skills/research/SKILL.md +0 -42
  371. package/.codex/skills/review/SKILL.md +0 -451
  372. package/.codex/skills/rollback/SKILL.md +0 -721
  373. package/.codex/skills/ship/SKILL.md +0 -213
  374. package/.codex/skills/sonarcloud/SKILL.md +0 -149
  375. package/.codex/skills/status/SKILL.md +0 -90
  376. package/.codex/skills/validate/SKILL.md +0 -288
  377. package/.codex/skills/verify/SKILL.md +0 -269
  378. package/.cursor/commands/dev.md +0 -342
  379. package/.cursor/commands/plan.md +0 -563
  380. package/.cursor/commands/premerge.md +0 -183
  381. package/.cursor/commands/research.md +0 -39
  382. package/.cursor/commands/review.md +0 -448
  383. package/.cursor/commands/ship.md +0 -210
  384. package/.cursor/commands/sonarcloud.md +0 -146
  385. package/.cursor/commands/status.md +0 -87
  386. package/.cursor/commands/validate.md +0 -285
  387. package/.cursor/commands/verify.md +0 -266
  388. package/.cursorrules +0 -149
  389. package/.github/prompts/premerge.prompt.md +0 -188
  390. package/.github/prompts/research.prompt.md +0 -44
  391. package/.github/prompts/rollback.prompt.md +0 -723
  392. package/.github/prompts/verify.prompt.md +0 -271
  393. package/.github/workflows/beads-to-github.yml +0 -89
  394. package/.github/workflows/github-to-beads.yml +0 -100
  395. package/.kilocode/workflows/dev.md +0 -346
  396. package/.kilocode/workflows/plan.md +0 -567
  397. package/.kilocode/workflows/premerge.md +0 -187
  398. package/.kilocode/workflows/research.md +0 -43
  399. package/.kilocode/workflows/review.md +0 -452
  400. package/.kilocode/workflows/rollback.md +0 -722
  401. package/.kilocode/workflows/ship.md +0 -214
  402. package/.kilocode/workflows/sonarcloud.md +0 -150
  403. package/.kilocode/workflows/status.md +0 -91
  404. package/.kilocode/workflows/validate.md +0 -289
  405. package/.kilocode/workflows/verify.md +0 -270
  406. package/.opencode/commands/dev.md +0 -345
  407. package/.opencode/commands/plan.md +0 -566
  408. package/.opencode/commands/premerge.md +0 -186
  409. package/.opencode/commands/research.md +0 -42
  410. package/.opencode/commands/review.md +0 -451
  411. package/.opencode/commands/rollback.md +0 -721
  412. package/.opencode/commands/ship.md +0 -213
  413. package/.opencode/commands/sonarcloud.md +0 -149
  414. package/.opencode/commands/status.md +0 -90
  415. package/.opencode/commands/validate.md +0 -288
  416. package/.opencode/commands/verify.md +0 -269
  417. package/.roo/commands/dev.md +0 -346
  418. package/.roo/commands/plan.md +0 -567
  419. package/.roo/commands/premerge.md +0 -187
  420. package/.roo/commands/research.md +0 -43
  421. package/.roo/commands/review.md +0 -452
  422. package/.roo/commands/rollback.md +0 -722
  423. package/.roo/commands/ship.md +0 -214
  424. package/.roo/commands/sonarcloud.md +0 -150
  425. package/.roo/commands/status.md +0 -91
  426. package/.roo/commands/validate.md +0 -289
  427. package/.roo/commands/verify.md +0 -270
  428. package/docs/BEADS_GITHUB_SYNC.md +0 -281
  429. package/docs/GREPTILE_SETUP.md +0 -400
  430. package/docs/MANUAL_REVIEW_GUIDE.md +0 -106
  431. package/docs/SETUP.md +0 -663
  432. package/docs/VALIDATION.md +0 -363
  433. package/lib/agents/cline.plugin.json +0 -29
  434. package/lib/agents/copilot.plugin.json +0 -24
  435. package/lib/agents/kilocode.plugin.json +0 -22
  436. package/lib/agents/opencode.plugin.json +0 -23
  437. package/lib/agents/roo.plugin.json +0 -30
  438. package/lib/beads-bootstrap.js +0 -225
  439. package/lib/beads-health-check.js +0 -188
  440. package/lib/commands/commands-reset.js +0 -147
  441. package/opencode.json +0 -67
  442. package/scripts/beads-context.test.js +0 -584
  443. package/scripts/github-beads-sync/comment.mjs +0 -64
  444. package/scripts/github-beads-sync/config.mjs +0 -148
  445. package/scripts/github-beads-sync/github-api.mjs +0 -131
  446. package/scripts/github-beads-sync/index.mjs +0 -356
  447. package/scripts/github-beads-sync/label-mapper.mjs +0 -54
  448. package/scripts/github-beads-sync/mapping.mjs +0 -132
  449. package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
  450. package/scripts/github-beads-sync/reverse-sync.mjs +0 -162
  451. package/scripts/github-beads-sync/run-bd.mjs +0 -161
  452. package/scripts/github-beads-sync/sanitize.mjs +0 -121
  453. package/scripts/github-beads-sync.config.json +0 -26
  454. package/scripts/sync-commands.js +0 -600
@@ -0,0 +1,148 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * `forge control <gate-id|rail-id> <mandatory|optional|permission>`
5
+ * `forge control status [--json]`
6
+ *
7
+ * Tri-state control for the gate/rail CONFIG registry (`gate.*` / `rail.*`) —
8
+ * this sets *declared* intent, NOT runtime enforcement. Setting a state writes
9
+ * the SAME resolver-consumed field `forge gate` writes
10
+ * (`workflow.gates.<id>.enabled`); there is deliberately NO parallel `controls:`
11
+ * key, because a key the resolver never reads would be doubly-fake. The tri-state
12
+ * is the vocabulary; `enabled` is the stored truth (state is derived at read
13
+ * time). IMPORTANT: as of 2026-07-15 no runtime consumer denies on these flags —
14
+ * real enforcement lives independently (lefthook TDD hook, fail-closed
15
+ * validate/preflight, enforce-stage order+completion). See the guarantee matrix.
16
+ *
17
+ * For MCP servers / rules / skills it REFUSES with a clear "presence-only, not
18
+ * enforceable" message pointing at docs/reference/control-plane-guarantees.md,
19
+ * rather than pretend a control it cannot honor.
20
+ *
21
+ * `status` renders the all-surface read view with enforcement-locus badges
22
+ * (724356ea) so the UI never implies enforcement a surface lacks.
23
+ */
24
+
25
+ const path = require('node:path');
26
+ const { setConfigOverride } = require('../config-writer');
27
+ const { getDefaultRuntimeGraph, getResolvedRuntimeGraph } = require('../core/runtime-graph');
28
+ const {
29
+ classifySurface,
30
+ isControllable,
31
+ describeControl,
32
+ planControl,
33
+ GUARANTEE_DOC,
34
+ } = require('../control-plane');
35
+
36
+ function usage() {
37
+ return [
38
+ 'Usage: forge control <gate-id|rail-id> <mandatory|optional|permission>',
39
+ ' forge control status [--json]',
40
+ '',
41
+ `Tri-state control for the gate/rail registry. These flags are DECLARED intent`,
42
+ `— today no runtime consumer denies on them (see the guarantee matrix). MCP/`,
43
+ `rules/skills are presence-only and refused — see ${GUARANTEE_DOC}.`,
44
+ ].join('\n');
45
+ }
46
+
47
+ // The known toggleable set is gates PLUS unlocked rails — exactly the surface
48
+ // `forge gate` governs. Combined lookup because gate.* / rail.* namespaces are
49
+ // disjoint. Used to validate an id BEFORE writing (never mid-run).
50
+ function knownPrimitive(id) {
51
+ const graph = getDefaultRuntimeGraph();
52
+ return [...graph.gates, ...graph.rails].find(primitive => primitive.id === id);
53
+ }
54
+
55
+ function resolvedControls(projectRoot) {
56
+ const graph = getResolvedRuntimeGraph({ projectRoot });
57
+ return [...graph.gates, ...graph.rails].map(describeControl);
58
+ }
59
+
60
+ function renderStatus(records) {
61
+ const lines = ['Control plane — enforcement-locus per surface (honest to today wiring):', ''];
62
+ for (const rec of records) {
63
+ const state = rec.state ? ` [${rec.state}]` : '';
64
+ lines.push(`- ${rec.id}${state} ${rec.badge} (${rec.locus})`);
65
+ }
66
+ lines.push('');
67
+ lines.push(`No flag above is a wired runtime deny yet: real enforcement lives in`);
68
+ lines.push(`the lefthook TDD hook, fail-closed validate/preflight, and enforce-stage`);
69
+ lines.push(`order+completion — all independent of these flags. MCP/rules/skills are`);
70
+ lines.push(`presence-only (advisory) and not controllable here. See ${GUARANTEE_DOC}.`);
71
+ return `${lines.join('\n')}\n`;
72
+ }
73
+
74
+ function statusCommand(projectRoot, json) {
75
+ const records = resolvedControls(projectRoot);
76
+ if (json) {
77
+ return { success: true, output: `${JSON.stringify({ items: records }, null, 2)}\n` };
78
+ }
79
+ return { success: true, output: renderStatus(records) };
80
+ }
81
+
82
+ function setCommand(id, state, projectRoot) {
83
+ // Advisory surfaces (and unknown namespaces) are refused up front with the
84
+ // guarantee-matrix pointer — nothing is written.
85
+ if (!isControllable(id)) {
86
+ const plan = planControl({ id }, state);
87
+ return { success: false, error: plan.error };
88
+ }
89
+
90
+ // Validate the id is a real primitive BEFORE writing (mirrors `forge gate`).
91
+ const primitive = knownPrimitive(id);
92
+ if (!primitive) {
93
+ return {
94
+ success: false,
95
+ error: `Unknown ${classifySurface(id)} '${id}'. Run 'forge control status' to list controllable surfaces.`,
96
+ };
97
+ }
98
+
99
+ const plan = planControl({ id, locked: primitive.locked === true }, state);
100
+ if (!plan.ok) {
101
+ return { success: false, error: plan.error };
102
+ }
103
+
104
+ const { configPath } = setConfigOverride(
105
+ projectRoot,
106
+ ['workflow', 'gates', id, 'enabled'],
107
+ plan.enabled,
108
+ );
109
+ const where = path.relative(projectRoot, configPath) || configPath;
110
+ return {
111
+ success: true,
112
+ output: `set '${id}' to ${state} (workflow.gates.${id}.enabled=${plan.enabled}) in ${where}`,
113
+ };
114
+ }
115
+
116
+ async function handler(args, flags = {}, projectRoot = process.cwd()) {
117
+ const [first, second] = args;
118
+
119
+ if (first === 'status') {
120
+ // Reject junk after `status` (only the optional --json flag is allowed) so a
121
+ // typo like `forge control status enabled` errors instead of silently
122
+ // ignoring the extra token.
123
+ const extra = args.slice(1).filter(arg => arg !== '--json');
124
+ if (extra.length > 0) {
125
+ return {
126
+ success: false,
127
+ error: `Unexpected argument(s) for status: ${extra.join(', ')}.\n${usage()}`,
128
+ };
129
+ }
130
+ return statusCommand(projectRoot, flags.json === true || args.includes('--json'));
131
+ }
132
+
133
+ if (!first) {
134
+ return { success: false, error: usage() };
135
+ }
136
+ if (!second) {
137
+ return { success: false, error: `Missing state.\n${usage()}` };
138
+ }
139
+
140
+ return setCommand(first, second, projectRoot);
141
+ }
142
+
143
+ module.exports = {
144
+ name: 'control',
145
+ description: 'Set tri-state control (mandatory/optional/permission) for a gate or rail',
146
+ usage: usage(),
147
+ handler,
148
+ };
@@ -1,5 +1,5 @@
1
1
  'use strict';
2
2
 
3
- const { makeAliasCommand } = require('./_issue');
3
+ const { createIssueSubcommand } = require('./_issue');
4
4
 
5
- module.exports = makeAliasCommand('create');
5
+ module.exports = createIssueSubcommand('create');
@@ -11,6 +11,7 @@
11
11
  const { execFileSync } = require('node:child_process');
12
12
  const fs = require('node:fs');
13
13
  const path = require('node:path');
14
+ const { recordAndLabelSubagentAuditEvent } = require('../audit-evidence');
14
15
 
15
16
  function getExecOptions() {
16
17
  return { encoding: 'utf8', cwd: process.cwd(), timeout: 120000 };
@@ -380,21 +381,24 @@ async function executeDev(featureName, options = {}) {
380
381
  // Use --phase flag to explicitly specify GREEN or REFACTOR.
381
382
  currentPhase = detectTDDPhase({ sourceFiles, testFiles, testsPassing });
382
383
 
383
- return {
384
+ const result = {
384
385
  success: true,
385
386
  detectedPhase: currentPhase,
386
387
  autoDetected: true,
387
388
  guidance: getTDDGuidance(currentPhase),
388
389
  summary: `Default ${currentPhase} phase (use --phase flag for explicit phase control)`,
389
390
  };
391
+
392
+ return withDevAuditEvidence(featureName, currentPhase, result, options);
390
393
  }
391
394
 
392
395
  // Validate REFACTOR requires passing tests
393
396
  if (phase === 'REFACTOR' && testsPassing === false) {
394
- return {
397
+ const result = {
395
398
  success: false,
396
399
  error: 'Cannot proceed to REFACTOR phase: tests are failing. Complete GREEN phase first.',
397
400
  };
401
+ return withDevAuditEvidence(featureName, currentPhase, result, options);
398
402
  }
399
403
 
400
404
  // Execute based on phase
@@ -409,7 +413,8 @@ async function executeDev(featureName, options = {}) {
409
413
  result.summary = 'Write failing tests for the feature';
410
414
  } else if (currentPhase === 'GREEN') {
411
415
  // Run tests to check status
412
- const testResults = await runTests();
416
+ const runPhaseTests = options.runTests || runTests;
417
+ const testResults = await runPhaseTests();
413
418
  result.testResults = testResults;
414
419
  result.success = testResults.success; // Reflect actual test outcome
415
420
  if (!testResults.success) {
@@ -422,7 +427,7 @@ async function executeDev(featureName, options = {}) {
422
427
  result.summary = 'Improve code quality while keeping tests green';
423
428
  }
424
429
 
425
- return result;
430
+ return withDevAuditEvidence(featureName, currentPhase, result, options);
426
431
  } catch (error) {
427
432
  return {
428
433
  success: false,
@@ -431,6 +436,74 @@ async function executeDev(featureName, options = {}) {
431
436
  }
432
437
  }
433
438
 
439
+ function withDevAuditEvidence(featureName, phase, result, options = {}) {
440
+ if (!options.audit) {
441
+ return result;
442
+ }
443
+
444
+ const auditEvent = {
445
+ issueId: options.issueId,
446
+ phase,
447
+ taskTitle: `forge dev ${featureName}`,
448
+ prompt: `forge dev ${featureName} ${phase}`,
449
+ response: result.success === false
450
+ ? result.error || result.summary || result.guidance || ''
451
+ : result.summary || result.error || result.guidance || '',
452
+ verdict: result.success === false ? 'FAIL' : 'PASS',
453
+ metadata: {
454
+ featureName,
455
+ phase,
456
+ detectedPhase: result.detectedPhase,
457
+ nextPhase: result.nextPhase,
458
+ autoDetected: Boolean(result.autoDetected),
459
+ success: result.success !== false,
460
+ },
461
+ };
462
+
463
+ try {
464
+ const auditEvidence = emitImplementerAuditEvidence(auditEvent, options.auditOptions || {});
465
+ if (auditEvidence.record?.success === false) {
466
+ const auditError = auditEvidence.record.error || 'bd audit record failed';
467
+ return {
468
+ ...result,
469
+ success: false,
470
+ error: result.success === false ? result.error : `Audit evidence persistence failed: ${auditError}`,
471
+ auditEvidence,
472
+ };
473
+ }
474
+
475
+ return {
476
+ ...result,
477
+ auditEvidence,
478
+ };
479
+ } catch (error) {
480
+ if (isAuditCommandUnavailableError(error)) {
481
+ return {
482
+ ...result,
483
+ auditEvidence: {
484
+ success: false,
485
+ skipped: true,
486
+ error: error.message,
487
+ },
488
+ };
489
+ }
490
+
491
+ return {
492
+ ...result,
493
+ success: false,
494
+ error: result.success === false ? result.error : `Audit evidence persistence failed: ${error.message}`,
495
+ auditEvidence: {
496
+ success: false,
497
+ error: error.message,
498
+ },
499
+ };
500
+ }
501
+ }
502
+
503
+ function isAuditCommandUnavailableError(error) {
504
+ return error?.code === 'ENOENT' || /\bbd\b.*not found/i.test(error?.message || '');
505
+ }
506
+
434
507
  /**
435
508
  * Decision gate route constants
436
509
  *
@@ -557,12 +630,109 @@ function verifyTaskCompletion(taskTitle, ownedFiles, opts = {}) {
557
630
  return { committed: true, autoCommitted: true, commitSha, hasChanges: true };
558
631
  }
559
632
 
633
+ function emitDevSubagentAuditEvidence(role, phase, event = {}, options = {}) {
634
+ const safeEvent = event && typeof event === 'object' ? event : {};
635
+ return recordAndLabelSubagentAuditEvent({
636
+ ...safeEvent,
637
+ command: 'dev',
638
+ role,
639
+ phase: phase || safeEvent.phase,
640
+ }, options);
641
+ }
642
+
643
+ function emitImplementerAuditEvidence(event, options = {}) {
644
+ return emitDevSubagentAuditEvidence('implementer', event?.phase || 'GREEN', event, options);
645
+ }
646
+
647
+ function emitSpecReviewerAuditEvidence(event, options = {}) {
648
+ return emitDevSubagentAuditEvidence('spec_reviewer', 'SPEC', event, options);
649
+ }
650
+
651
+ function emitQualityReviewerAuditEvidence(event, options = {}) {
652
+ return emitDevSubagentAuditEvidence('quality_reviewer', 'QUALITY', event, options);
653
+ }
654
+
655
+ function isMissingDevFlagValue(value) {
656
+ return value === undefined || value === '' || (typeof value === 'string' && value.startsWith('--'));
657
+ }
658
+
659
+ function missingDevFlagValue(name, parsedArgs, flags) {
660
+ return { args: parsedArgs, flags, error: `${name} requires a value` };
661
+ }
662
+
663
+ function consumeSeparatedDevFlag(name, key, rawArgs, index, parsedArgs, flags) {
664
+ const value = rawArgs[index + 1];
665
+ if (isMissingDevFlagValue(value)) {
666
+ return missingDevFlagValue(name, parsedArgs, flags);
667
+ }
668
+
669
+ flags[key] = value;
670
+ return { consumed: 2 };
671
+ }
672
+
673
+ function consumeEqualsDevFlag(prefix, name, key, arg, parsedArgs, flags) {
674
+ const value = arg.slice(prefix.length);
675
+ if (value === '') {
676
+ return missingDevFlagValue(name, parsedArgs, flags);
677
+ }
678
+
679
+ flags[key] = value;
680
+ return { consumed: 1 };
681
+ }
682
+
683
+ function consumeDevFlag(rawArgs, index, parsedArgs, flags) {
684
+ const arg = rawArgs[index];
685
+ if (arg === '--issue-id') {
686
+ return consumeSeparatedDevFlag('--issue-id', 'issueId', rawArgs, index, parsedArgs, flags);
687
+ }
688
+ if (typeof arg === 'string' && arg.startsWith('--issue-id=')) {
689
+ return consumeEqualsDevFlag('--issue-id=', '--issue-id', 'issueId', arg, parsedArgs, flags);
690
+ }
691
+ if (arg === '--phase') {
692
+ return consumeSeparatedDevFlag('--phase', 'phase', rawArgs, index, parsedArgs, flags);
693
+ }
694
+ if (typeof arg === 'string' && arg.startsWith('--phase=')) {
695
+ return consumeEqualsDevFlag('--phase=', '--phase', 'phase', arg, parsedArgs, flags);
696
+ }
697
+
698
+ return { consumed: 0 };
699
+ }
700
+
701
+ function parseDevHandlerInput(rawArgs = [], rawFlags = {}) {
702
+ const parsedArgs = [];
703
+ const flags = { ...rawFlags };
704
+ if (flags['issue-id'] && !flags.issueId) {
705
+ flags.issueId = flags['issue-id'];
706
+ }
707
+
708
+ for (let i = 0; i < rawArgs.length; i++) {
709
+ const consumed = consumeDevFlag(rawArgs, i, parsedArgs, flags);
710
+ if (consumed.error) {
711
+ return consumed;
712
+ }
713
+ if (consumed.consumed > 0) {
714
+ i += consumed.consumed - 1;
715
+ continue;
716
+ }
717
+ parsedArgs.push(rawArgs[i]);
718
+ }
719
+
720
+ return { args: parsedArgs, flags };
721
+ }
722
+
560
723
  module.exports = {
561
724
  name: 'dev',
562
725
  description: 'Run the TDD development stage with phase guidance',
563
726
  handler: async (args, flags = {}) => {
564
- const featureName = args[0] || 'feature';
565
- const phaseInput = flags.phase || args[1];
727
+ const parsed = parseDevHandlerInput(args, flags);
728
+ if (parsed.error) {
729
+ return {
730
+ success: false,
731
+ error: parsed.error,
732
+ };
733
+ }
734
+ const featureName = parsed.args[0] || 'feature';
735
+ const phaseInput = parsed.flags.phase || parsed.args[1];
566
736
  const phase = typeof phaseInput === 'string' ? phaseInput.toUpperCase() : undefined;
567
737
  if (phase && !['RED', 'GREEN', 'REFACTOR'].includes(phase)) {
568
738
  return {
@@ -571,7 +741,12 @@ module.exports = {
571
741
  };
572
742
  }
573
743
 
574
- const result = await executeDev(featureName, phase ? { phase } : {});
744
+ const result = await executeDev(featureName, {
745
+ ...(phase ? { phase } : {}),
746
+ audit: true,
747
+ issueId: parsed.flags.issueId,
748
+ auditOptions: parsed.flags.auditOptions,
749
+ });
575
750
  if (!result.success) {
576
751
  return result;
577
752
  }
@@ -591,6 +766,9 @@ module.exports = {
591
766
  generateCommitMessage,
592
767
  identifyParallelWork,
593
768
  executeDev,
769
+ emitImplementerAuditEvidence,
770
+ emitSpecReviewerAuditEvidence,
771
+ emitQualityReviewerAuditEvidence,
594
772
  calculateDecisionRoute,
595
773
  DECISION_ROUTES,
596
774
  verifyTaskCompletion,