forge-workflow 0.0.10 → 0.1.0-beta.3

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 (468) 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 +82 -5
  5. package/.forge/hooks/forge-native-hook.js +431 -0
  6. package/.forge/protected-paths.yaml +157 -0
  7. package/AGENTS.md +151 -61
  8. package/CHANGELOG.md +709 -0
  9. package/CLAUDE.md +9 -118
  10. package/QUICKSTART.md +175 -0
  11. package/README.md +275 -365
  12. package/bin/forge-cmd.js +120 -9
  13. package/bin/forge-preflight.js +26 -5
  14. package/bin/forge.js +532 -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 +121 -0
  29. package/docs/guides/SUPPORT.md +190 -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 +214 -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 +155 -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/activation/ensure-forge-home.js +135 -0
  67. package/lib/adapter-cli.js +307 -0
  68. package/lib/adapters/beads-issue-adapter.js +127 -0
  69. package/lib/adapters/beads-kernel-compat.js +1109 -0
  70. package/lib/adapters/greptile-review-adapter.js +141 -0
  71. package/lib/adapters/kernel-issue-adapter.js +101 -0
  72. package/lib/adapters/pr-state-adapter.js +484 -0
  73. package/lib/adoption-profiles.js +139 -0
  74. package/lib/agents/README.md +2 -6
  75. package/lib/agents/claude.plugin.json +3 -8
  76. package/lib/agents/codex.plugin.json +9 -1
  77. package/lib/agents/cursor.plugin.json +2 -6
  78. package/lib/agents/hermes.plugin.json +22 -0
  79. package/lib/agents-config.js +39 -1236
  80. package/lib/audit-evidence.js +282 -0
  81. package/lib/beads-detect.js +60 -0
  82. package/lib/beads-nudge.js +91 -0
  83. package/lib/beads-setup.js +121 -0
  84. package/lib/beads-sync-scaffold.js +25 -101
  85. package/lib/codex-skills.js +51 -1
  86. package/lib/commands/_aliases.js +248 -0
  87. package/lib/commands/_issue.js +780 -77
  88. package/lib/commands/_manifest.js +93 -0
  89. package/lib/commands/_registry.js +99 -34
  90. package/lib/commands/_resolve-command-opts.js +230 -0
  91. package/lib/commands/_serve-security.js +270 -0
  92. package/lib/commands/adapter.js +12 -0
  93. package/lib/commands/add.js +118 -0
  94. package/lib/commands/audit.js +70 -0
  95. package/lib/commands/blocked.js +5 -0
  96. package/lib/commands/board.js +64 -0
  97. package/lib/commands/claim.js +21 -2
  98. package/lib/commands/claims.js +7 -0
  99. package/lib/commands/clean.js +485 -75
  100. package/lib/commands/close.js +2 -2
  101. package/lib/commands/comment.js +5 -0
  102. package/lib/commands/control.js +148 -0
  103. package/lib/commands/create.js +2 -2
  104. package/lib/commands/dev.js +185 -7
  105. package/lib/commands/doc-gate.js +336 -0
  106. package/lib/commands/doctor.js +156 -0
  107. package/lib/commands/explain.js +15 -0
  108. package/lib/commands/export.js +237 -0
  109. package/lib/commands/gate.js +209 -0
  110. package/lib/commands/hooks.js +377 -0
  111. package/lib/commands/inbox.js +118 -0
  112. package/lib/commands/init.js +604 -0
  113. package/lib/commands/insights.js +79 -0
  114. package/lib/commands/issue.js +12 -1
  115. package/lib/commands/issues.js +17 -0
  116. package/lib/commands/lint.js +5 -0
  117. package/lib/commands/list.js +2 -2
  118. package/lib/commands/memory.js +81 -0
  119. package/lib/commands/merge.js +312 -0
  120. package/lib/commands/migrate.js +362 -0
  121. package/lib/commands/new.js +12 -0
  122. package/lib/commands/options.js +241 -0
  123. package/lib/commands/orient.js +13 -0
  124. package/lib/commands/orphans.js +5 -0
  125. package/lib/commands/patch.js +67 -0
  126. package/lib/commands/plan.js +481 -29
  127. package/lib/commands/pr.js +88 -0
  128. package/lib/commands/preflight.js +211 -0
  129. package/lib/commands/prime.js +13 -0
  130. package/lib/commands/push.js +135 -2
  131. package/lib/commands/ready.js +2 -2
  132. package/lib/commands/recall.js +171 -0
  133. package/lib/commands/recap.js +75 -0
  134. package/lib/commands/recommend.js +0 -1
  135. package/lib/commands/release.js +104 -0
  136. package/lib/commands/remember.js +140 -0
  137. package/lib/commands/role.js +99 -0
  138. package/lib/commands/serve.js +581 -0
  139. package/lib/commands/setup.js +900 -971
  140. package/lib/commands/shepherd.js +501 -0
  141. package/lib/commands/ship.js +59 -1
  142. package/lib/commands/show.js +2 -2
  143. package/lib/commands/stage.js +192 -0
  144. package/lib/commands/stale.js +5 -0
  145. package/lib/commands/status.js +158 -21
  146. package/lib/commands/sync.js +34 -46
  147. package/lib/commands/team.js +4 -1
  148. package/lib/commands/test.js +43 -27
  149. package/lib/commands/update.js +2 -2
  150. package/lib/commands/upgrade.js +47 -0
  151. package/lib/commands/validate.js +43 -18
  152. package/lib/commands/worktree.js +362 -99
  153. package/lib/config-writer.js +202 -0
  154. package/lib/control-plane.js +236 -0
  155. package/lib/core/runtime-graph.js +977 -0
  156. package/lib/dep-guard/keyword-ripple.js +2 -2
  157. package/lib/deprecated-sync-cleanup.js +362 -0
  158. package/lib/detect-agent.js +2 -28
  159. package/lib/detect-worktree.js +35 -9
  160. package/lib/doc-gate/declaration.js +177 -0
  161. package/lib/doc-gate/detect.js +289 -0
  162. package/lib/doc-gate/gate.js +375 -0
  163. package/lib/doc-gate/okf-config.js +128 -0
  164. package/lib/doc-gate/okf.js +429 -0
  165. package/lib/docs-command.js +1161 -6
  166. package/lib/forge-issues.js +382 -11
  167. package/lib/forge-lock.js +262 -0
  168. package/lib/gate-events.js +192 -0
  169. package/lib/global-flags.js +104 -0
  170. package/lib/greptile-match.js +7 -63
  171. package/lib/grounding/context-events.js +230 -0
  172. package/lib/grounding/read-first.js +112 -0
  173. package/lib/harness-capability-matrix.js +380 -0
  174. package/lib/hook-global-installer.js +347 -0
  175. package/lib/hook-renderer.js +541 -0
  176. package/lib/inbox.js +391 -0
  177. package/lib/insights.js +397 -0
  178. package/lib/issue-adapter.js +156 -0
  179. package/lib/issue-backend.js +145 -0
  180. package/lib/issue-render.js +220 -0
  181. package/lib/kernel/backing-issue.js +311 -0
  182. package/lib/kernel/broker.js +1218 -0
  183. package/lib/kernel/cli-broker-factory.js +130 -0
  184. package/lib/kernel/conflict-signal.js +82 -0
  185. package/lib/kernel/evaluators.js +195 -0
  186. package/lib/kernel/fs-class.js +495 -0
  187. package/lib/kernel/issue-command-contract.js +559 -0
  188. package/lib/kernel/issue-id-resolver.js +186 -0
  189. package/lib/kernel/lease-enforcer.js +158 -0
  190. package/lib/kernel/migrations.js +333 -0
  191. package/lib/kernel/owned-kernel.js +43 -0
  192. package/lib/kernel/planning-buckets-schema.js +109 -0
  193. package/lib/kernel/projection-jsonl-writer.js +450 -0
  194. package/lib/kernel/readiness-model.js +329 -0
  195. package/lib/kernel/schema.js +356 -0
  196. package/lib/kernel/sqlite-driver.js +2540 -0
  197. package/lib/kernel/taxonomy-validator.js +394 -0
  198. package/lib/lefthook-check.js +3 -2
  199. package/lib/lefthook-wiring.js +413 -0
  200. package/lib/mcp-config-renderer.js +288 -0
  201. package/lib/memory/graphiti-mcp.js +106 -0
  202. package/lib/memory/router.js +387 -0
  203. package/lib/memory/typed-api.js +102 -0
  204. package/lib/memory-digest.js +195 -0
  205. package/lib/merge-rules.js +395 -0
  206. package/lib/migrate-dry-run.js +466 -0
  207. package/lib/orientation.js +863 -0
  208. package/lib/package-manager-remediation.js +103 -0
  209. package/lib/package-root.js +381 -0
  210. package/lib/patch-intent.js +890 -0
  211. package/lib/plugin-catalog.js +3 -4
  212. package/lib/plugin-manager.js +0 -5
  213. package/lib/pr-bundle.js +186 -0
  214. package/lib/pr-monitor/auto-actions.js +175 -0
  215. package/lib/pr-monitor/differ.js +195 -0
  216. package/lib/pr-monitor/digest.js +206 -0
  217. package/lib/pr-monitor/events.js +0 -0
  218. package/lib/pr-monitor/gather.js +124 -0
  219. package/lib/pr-monitor/journal.js +299 -0
  220. package/lib/pr-monitor/monitor.js +146 -0
  221. package/lib/pr-monitor/render-sticky.js +192 -0
  222. package/lib/pr-monitor/upsert-sticky.js +169 -0
  223. package/lib/pr-monitor/watch-lifecycle.js +95 -0
  224. package/lib/pr-monitor/watch.js +247 -0
  225. package/lib/pr-pull.js +1314 -0
  226. package/lib/pr-shepherd.js +494 -0
  227. package/lib/pr-state-validator.js +59 -0
  228. package/lib/preflight/gates.js +237 -0
  229. package/lib/preflight/runner.js +116 -0
  230. package/lib/project-discovery.js +0 -53
  231. package/lib/project-memory.js +99 -497
  232. package/lib/protected-path-manifest.js +281 -0
  233. package/lib/protected-state-surfaces.js +387 -0
  234. package/lib/release-readiness.js +2105 -0
  235. package/lib/reset.js +59 -45
  236. package/lib/review-adapter.js +68 -0
  237. package/lib/rules-sync.js +260 -0
  238. package/lib/runtime-health.js +241 -20
  239. package/lib/safety-config-renderer.js +268 -0
  240. package/lib/setup-action-log.js +1 -7
  241. package/lib/setup.js +27 -65
  242. package/lib/shell-utils.js +76 -6
  243. package/lib/skills-sync.js +330 -0
  244. package/lib/smart-status/scoring.js +17 -3
  245. package/lib/status/beads-snapshot.js +45 -2
  246. package/lib/status/presenter.js +169 -18
  247. package/lib/status/snapshot.js +186 -0
  248. package/lib/sync-backend.js +202 -0
  249. package/lib/untrusted-content.js +52 -0
  250. package/lib/upgrade-safety.js +251 -0
  251. package/lib/workflow/enforce-stage.js +351 -45
  252. package/lib/workflow/stage-transition.js +115 -0
  253. package/lib/workflow/stages.js +30 -6
  254. package/lib/workflow/state-manager.js +11 -22
  255. package/lib/workflow/state.js +23 -1
  256. package/lib/workflow-profiles.js +17 -5
  257. package/package.json +37 -35
  258. package/rules/documentation.md +19 -0
  259. package/rules/kernel-tracking.md +26 -0
  260. package/rules/security.md +22 -0
  261. package/rules/tdd.md +20 -0
  262. package/rules/workflow.md +27 -0
  263. package/scripts/auto-backing-issue.js +47 -0
  264. package/scripts/beads-context.sh +81 -57
  265. package/scripts/beads-upgrade-smoke.sh +24 -3
  266. package/scripts/bootstrap-windows-tools.sh +78 -0
  267. package/scripts/branch-protection.js +2 -3
  268. package/scripts/check-agents.js +34 -137
  269. package/scripts/commitlint.js +3 -1
  270. package/scripts/conflict-detect.sh +3 -0
  271. package/scripts/dep-guard.sh +22 -3
  272. package/scripts/file-index.sh +3 -0
  273. package/scripts/forge-team/lib/claim.sh +34 -18
  274. package/scripts/forge-team/lib/dashboard.sh +61 -86
  275. package/scripts/forge-team/lib/epic.sh +99 -263
  276. package/scripts/forge-team/lib/hooks.sh +26 -28
  277. package/scripts/forge-team/lib/identity.sh +4 -4
  278. package/scripts/forge-team/lib/sync-github.sh +49 -84
  279. package/scripts/forge-team/lib/verify.sh +93 -83
  280. package/scripts/forge-team/lib/workload.sh +41 -65
  281. package/scripts/forge-team/tests/claim.test.sh +25 -19
  282. package/scripts/forge-team/tests/dashboard.test.sh +31 -46
  283. package/scripts/forge-team/tests/epic.test.sh +52 -71
  284. package/scripts/forge-team/tests/hooks.test.sh +38 -50
  285. package/scripts/forge-team/tests/identity.test.sh +3 -3
  286. package/scripts/forge-team/tests/integration.test.sh +44 -66
  287. package/scripts/forge-team/tests/sync-github.test.sh +50 -83
  288. package/scripts/forge-team/tests/verify.test.sh +37 -46
  289. package/scripts/forge-team/tests/workflow-integration.test.sh +4 -4
  290. package/scripts/forge-team/tests/workload.test.sh +32 -66
  291. package/scripts/gen-command-manifest.js +153 -0
  292. package/scripts/gen-embedded-assets.mjs +129 -0
  293. package/scripts/install.ps1 +139 -0
  294. package/scripts/install.sh +268 -0
  295. package/scripts/lib/release-asset.mjs +84 -0
  296. package/scripts/parity-check.mjs +145 -0
  297. package/scripts/parity-check.test.mjs +58 -0
  298. package/scripts/pin-agentic-workflow-images.js +112 -0
  299. package/scripts/pr-auto-actions.js +93 -0
  300. package/scripts/pr-coordinator.sh +3 -0
  301. package/scripts/pr-verdict-label.js +50 -0
  302. package/scripts/preflight-sonar.eslint.config.mjs +44 -0
  303. package/scripts/preflight.sh +21 -94
  304. package/scripts/protected-state-check.js +104 -0
  305. package/scripts/smart-status.sh +60 -57
  306. package/scripts/spikes/config-race-bench.js +111 -0
  307. package/scripts/spikes/harness-capability-matrix.js +13 -0
  308. package/scripts/spikes/patch-anchor-stability-bench.js +125 -0
  309. package/scripts/spikes/protected-path-manifest.js +20 -0
  310. package/scripts/spikes/skill-auto-invoke-parity.js +292 -0
  311. package/scripts/sync-agent-skills.js +62 -0
  312. package/scripts/sync-utils.sh +3 -0
  313. package/scripts/test-ci-shard.js +13 -6
  314. package/scripts/test.js +95 -12
  315. package/skills/claim-safety/SKILL.md +102 -0
  316. package/skills/claim-safety/evals/evals.json +46 -0
  317. package/{.github/prompts/dev.prompt.md → skills/dev/SKILL.md} +44 -50
  318. package/skills/dev/evals/evals.json +50 -0
  319. package/skills/hermes-forge/SKILL.md +185 -0
  320. package/skills/hermes-forge/evals/evals.json +46 -0
  321. package/skills/issue-basics/SKILL.md +111 -0
  322. package/skills/issue-basics/evals/evals.json +46 -0
  323. package/skills/kernel/SKILL.md +166 -0
  324. package/skills/kernel/evals/evals.json +50 -0
  325. package/skills/memory/SKILL.md +102 -0
  326. package/skills/parallel-deep-research/SKILL.md +14 -11
  327. package/skills/parallel-deep-research/evals/evals.json +11 -27
  328. package/{.github/prompts/plan.prompt.md → skills/plan/SKILL.md} +132 -157
  329. package/skills/plan/evals/evals.json +42 -0
  330. package/skills/research/SKILL.md +195 -0
  331. package/skills/research/evals/evals.json +42 -0
  332. package/{.github/prompts/review.prompt.md → skills/review/SKILL.md} +98 -62
  333. package/skills/review/evals/evals.json +42 -0
  334. package/skills/rollback/SKILL.md +110 -0
  335. package/skills/rollback/evals/evals.json +46 -0
  336. package/skills/rollback/references/methods.md +204 -0
  337. package/{.cursor/commands/rollback.md → skills/rollback/references/workflow-integration.md} +10 -284
  338. package/skills/shepherd/SKILL.md +66 -0
  339. package/skills/shepherd/evals/evals.json +42 -0
  340. package/{.github/prompts/ship.prompt.md → skills/ship/SKILL.md} +81 -45
  341. package/skills/ship/evals/evals.json +42 -0
  342. package/skills/smith/SKILL.md +142 -0
  343. package/skills/smith/evals/evals.json +46 -0
  344. package/skills/smith/references/autonomy-and-gates.md +94 -0
  345. package/{.github/prompts/sonarcloud.prompt.md → skills/sonarcloud/SKILL.md} +14 -3
  346. package/skills/sonarcloud/evals/evals.json +46 -0
  347. package/skills/sonarcloud-analysis/SKILL.md +18 -13
  348. package/skills/sonarcloud-analysis/evals/evals.json +11 -15
  349. package/{.github/prompts/status.prompt.md → skills/status/SKILL.md} +20 -10
  350. package/skills/status/evals/evals.json +50 -0
  351. package/skills/triage-ready/SKILL.md +121 -0
  352. package/skills/triage-ready/evals/evals.json +42 -0
  353. package/{.github/prompts/validate.prompt.md → skills/validate/SKILL.md} +52 -29
  354. package/skills/validate/evals/evals.json +42 -0
  355. package/skills/verify/SKILL.md +299 -0
  356. package/skills/verify/evals/evals.json +50 -0
  357. package/.claude/commands/dev.md +0 -345
  358. package/.claude/commands/plan.md +0 -566
  359. package/.claude/commands/premerge.md +0 -186
  360. package/.claude/commands/research.md +0 -42
  361. package/.claude/commands/review.md +0 -451
  362. package/.claude/commands/rollback.md +0 -721
  363. package/.claude/commands/ship.md +0 -213
  364. package/.claude/commands/sonarcloud.md +0 -152
  365. package/.claude/commands/status.md +0 -90
  366. package/.claude/commands/validate.md +0 -288
  367. package/.claude/commands/verify.md +0 -269
  368. package/.claude/rules/workflow.md +0 -121
  369. package/.cline/workflows/dev.md +0 -342
  370. package/.cline/workflows/plan.md +0 -563
  371. package/.cline/workflows/premerge.md +0 -183
  372. package/.cline/workflows/research.md +0 -39
  373. package/.cline/workflows/review.md +0 -448
  374. package/.cline/workflows/rollback.md +0 -718
  375. package/.cline/workflows/ship.md +0 -210
  376. package/.cline/workflows/sonarcloud.md +0 -146
  377. package/.cline/workflows/status.md +0 -87
  378. package/.cline/workflows/validate.md +0 -285
  379. package/.cline/workflows/verify.md +0 -266
  380. package/.codex/config.toml +0 -11
  381. package/.codex/skills/dev/SKILL.md +0 -345
  382. package/.codex/skills/plan/SKILL.md +0 -566
  383. package/.codex/skills/premerge/SKILL.md +0 -186
  384. package/.codex/skills/research/SKILL.md +0 -42
  385. package/.codex/skills/review/SKILL.md +0 -451
  386. package/.codex/skills/rollback/SKILL.md +0 -721
  387. package/.codex/skills/ship/SKILL.md +0 -213
  388. package/.codex/skills/sonarcloud/SKILL.md +0 -149
  389. package/.codex/skills/status/SKILL.md +0 -90
  390. package/.codex/skills/validate/SKILL.md +0 -288
  391. package/.codex/skills/verify/SKILL.md +0 -269
  392. package/.cursor/commands/dev.md +0 -342
  393. package/.cursor/commands/plan.md +0 -563
  394. package/.cursor/commands/premerge.md +0 -183
  395. package/.cursor/commands/research.md +0 -39
  396. package/.cursor/commands/review.md +0 -448
  397. package/.cursor/commands/ship.md +0 -210
  398. package/.cursor/commands/sonarcloud.md +0 -146
  399. package/.cursor/commands/status.md +0 -87
  400. package/.cursor/commands/validate.md +0 -285
  401. package/.cursor/commands/verify.md +0 -266
  402. package/.cursorrules +0 -149
  403. package/.github/prompts/premerge.prompt.md +0 -188
  404. package/.github/prompts/research.prompt.md +0 -44
  405. package/.github/prompts/rollback.prompt.md +0 -723
  406. package/.github/prompts/verify.prompt.md +0 -271
  407. package/.github/workflows/beads-to-github.yml +0 -89
  408. package/.github/workflows/github-to-beads.yml +0 -100
  409. package/.kilocode/workflows/dev.md +0 -346
  410. package/.kilocode/workflows/plan.md +0 -567
  411. package/.kilocode/workflows/premerge.md +0 -187
  412. package/.kilocode/workflows/research.md +0 -43
  413. package/.kilocode/workflows/review.md +0 -452
  414. package/.kilocode/workflows/rollback.md +0 -722
  415. package/.kilocode/workflows/ship.md +0 -214
  416. package/.kilocode/workflows/sonarcloud.md +0 -150
  417. package/.kilocode/workflows/status.md +0 -91
  418. package/.kilocode/workflows/validate.md +0 -289
  419. package/.kilocode/workflows/verify.md +0 -270
  420. package/.opencode/commands/dev.md +0 -345
  421. package/.opencode/commands/plan.md +0 -566
  422. package/.opencode/commands/premerge.md +0 -186
  423. package/.opencode/commands/research.md +0 -42
  424. package/.opencode/commands/review.md +0 -451
  425. package/.opencode/commands/rollback.md +0 -721
  426. package/.opencode/commands/ship.md +0 -213
  427. package/.opencode/commands/sonarcloud.md +0 -149
  428. package/.opencode/commands/status.md +0 -90
  429. package/.opencode/commands/validate.md +0 -288
  430. package/.opencode/commands/verify.md +0 -269
  431. package/.roo/commands/dev.md +0 -346
  432. package/.roo/commands/plan.md +0 -567
  433. package/.roo/commands/premerge.md +0 -187
  434. package/.roo/commands/research.md +0 -43
  435. package/.roo/commands/review.md +0 -452
  436. package/.roo/commands/rollback.md +0 -722
  437. package/.roo/commands/ship.md +0 -214
  438. package/.roo/commands/sonarcloud.md +0 -150
  439. package/.roo/commands/status.md +0 -91
  440. package/.roo/commands/validate.md +0 -289
  441. package/.roo/commands/verify.md +0 -270
  442. package/docs/BEADS_GITHUB_SYNC.md +0 -281
  443. package/docs/GREPTILE_SETUP.md +0 -400
  444. package/docs/MANUAL_REVIEW_GUIDE.md +0 -106
  445. package/docs/SETUP.md +0 -663
  446. package/docs/VALIDATION.md +0 -363
  447. package/lib/agents/cline.plugin.json +0 -29
  448. package/lib/agents/copilot.plugin.json +0 -24
  449. package/lib/agents/kilocode.plugin.json +0 -22
  450. package/lib/agents/opencode.plugin.json +0 -23
  451. package/lib/agents/roo.plugin.json +0 -30
  452. package/lib/beads-bootstrap.js +0 -225
  453. package/lib/beads-health-check.js +0 -188
  454. package/lib/commands/commands-reset.js +0 -147
  455. package/opencode.json +0 -67
  456. package/scripts/beads-context.test.js +0 -584
  457. package/scripts/github-beads-sync/comment.mjs +0 -64
  458. package/scripts/github-beads-sync/config.mjs +0 -148
  459. package/scripts/github-beads-sync/github-api.mjs +0 -131
  460. package/scripts/github-beads-sync/index.mjs +0 -356
  461. package/scripts/github-beads-sync/label-mapper.mjs +0 -54
  462. package/scripts/github-beads-sync/mapping.mjs +0 -132
  463. package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
  464. package/scripts/github-beads-sync/reverse-sync.mjs +0 -162
  465. package/scripts/github-beads-sync/run-bd.mjs +0 -161
  466. package/scripts/github-beads-sync/sanitize.mjs +0 -121
  467. package/scripts/github-beads-sync.config.json +0 -26
  468. 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,