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
package/bin/forge-cmd.js CHANGED
@@ -15,6 +15,7 @@ const HANDLERS = {
15
15
  dev: require('../lib/commands/dev'),
16
16
  validate: require('../lib/commands/validate'),
17
17
  ship: require('../lib/commands/ship'),
18
+ shepherd: require('../lib/commands/shepherd'),
18
19
  };
19
20
 
20
21
  const VALID_COMMANDS = [
@@ -25,10 +26,50 @@ const VALID_COMMANDS = [
25
26
  'check', // backward-compat alias for validate
26
27
  'ship',
27
28
  'review',
29
+ 'shepherd',
28
30
  'merge',
29
31
  'verify',
30
32
  ];
31
33
 
34
+ function findWorkPlanDoc(dir, slug) {
35
+ if (!fs.existsSync(dir)) return null;
36
+
37
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
38
+ const entryPath = `${dir}/${entry.name}`;
39
+ if (entry.isDirectory()) {
40
+ const found = findWorkPlanDoc(entryPath, slug);
41
+ if (found) return found;
42
+ }
43
+ if (entry.isFile() && (entry.name === 'plan.md' || entry.name === 'design.md' || entry.name === 'tasks.md')) {
44
+ const workDirName = dir.split(/[\\/]/).pop() || '';
45
+ const workSlug = workDirName.replace(/^\d{4}-\d{2}-\d{2}-/, '');
46
+ if (workSlug === slug) {
47
+ return entryPath;
48
+ }
49
+ }
50
+ }
51
+
52
+ return null;
53
+ }
54
+
55
+ function legacyPlanMatchesSlug(fileName, slug) {
56
+ const legacySlug = fileName
57
+ .replace(/\.md$/, '')
58
+ .replace(/^\d{4}-\d{2}-\d{2}-/, '')
59
+ .replace(/-(?:design|plan|tasks|decisions)$/, '');
60
+ return legacySlug === slug;
61
+ }
62
+
63
+ function findPlanDocForBranch(branch) {
64
+ const slug = branch.replace(/^(feat|fix|docs|refactor)\//, '');
65
+ const workPlan = findWorkPlanDoc('docs/work', slug);
66
+ if (workPlan) return workPlan;
67
+
68
+ if (!fs.existsSync('docs/plans')) return null;
69
+ const legacy = fs.readdirSync('docs/plans').find(f => f.endsWith('.md') && legacyPlanMatchesSlug(f, slug));
70
+ return legacy ? `docs/plans/${legacy}` : null;
71
+ }
72
+
32
73
  const COMMAND_DESCRIPTIONS = {
33
74
  status: 'Detect current workflow stage (1-7)',
34
75
  plan: 'Create branch + Beads + design doc',
@@ -37,6 +78,7 @@ const COMMAND_DESCRIPTIONS = {
37
78
  check: 'Alias for validate (deprecated — use validate)',
38
79
  ship: 'Auto-generate PR body and create PR',
39
80
  review: 'Aggregate all review feedback',
81
+ shepherd: 'Run one bounded monitor pass over a PR (never merges)',
40
82
  merge: 'Update docs, merge PR, cleanup',
41
83
  verify: 'Final documentation verification',
42
84
  };
@@ -45,6 +87,7 @@ const REQUIRED_ARGS = {
45
87
  plan: ['feature-slug'],
46
88
  ship: ['feature-slug', 'title'],
47
89
  review: [],
90
+ shepherd: ['pr'],
48
91
  merge: [],
49
92
  // Other commands don't require arguments
50
93
  status: [],
@@ -54,6 +97,14 @@ const REQUIRED_ARGS = {
54
97
  verify: [],
55
98
  };
56
99
 
100
+ // Allowed flags per command. Commands listed here have their flags strictly
101
+ // validated — an unknown flag is rejected rather than silently forwarded
102
+ // (e.g. a typo like `--auto-reabse` must not run shepherd with default
103
+ // behaviour). Commands NOT listed here keep their permissive flag handling.
104
+ const ALLOWED_FLAGS = {
105
+ shepherd: ['--auto-rebase', '--bundle', '--pull', '--json'],
106
+ };
107
+
57
108
  /**
58
109
  * Parse command line arguments
59
110
  * @param {string[]} argv - Process arguments
@@ -127,6 +178,26 @@ function validateArgs(command, args) {
127
178
  const required = REQUIRED_ARGS[command] || [];
128
179
  const positionalArgs = args.filter(a => !a.startsWith('--'));
129
180
 
181
+ // `--json` has no standalone meaning for shepherd — it only toggles the JSON
182
+ // rendering of the `--bundle` or `--pull` gather. Without one of those it would
183
+ // silently fall back to the human-readable pass output, so reject it loudly.
184
+ if (command === 'shepherd' && args.includes('--json')
185
+ && !args.includes('--bundle') && !args.includes('--pull')) {
186
+ return {
187
+ valid: false,
188
+ error: "Error: '--json' is only supported with 'forge shepherd <pr> --bundle --json' or '--pull --json'",
189
+ };
190
+ }
191
+
192
+ // `--bundle` and `--pull` are mutually exclusive output modes — shepherd.js returns on
193
+ // `--pull` first, so accepting both would silently drop the bundle. Fail fast.
194
+ if (command === 'shepherd' && args.includes('--bundle') && args.includes('--pull')) {
195
+ return {
196
+ valid: false,
197
+ error: "Error: 'forge shepherd <pr>' accepts '--bundle' OR '--pull', not both",
198
+ };
199
+ }
200
+
130
201
  if (required.length > 0 && positionalArgs.length < required.length) {
131
202
  const missing = required.slice(positionalArgs.length);
132
203
  return {
@@ -144,6 +215,19 @@ function validateArgs(command, args) {
144
215
  }
145
216
  }
146
217
 
218
+ // Reject unknown flags for commands with a strict flag allow-list, so typos
219
+ // fail loudly instead of running with default behaviour.
220
+ const allowedFlags = ALLOWED_FLAGS[command];
221
+ if (allowedFlags) {
222
+ const unknownFlag = args.find(a => a.startsWith('--') && !allowedFlags.includes(a));
223
+ if (unknownFlag) {
224
+ return {
225
+ valid: false,
226
+ error: `Error: Unknown flag '${unknownFlag}' for 'forge ${command}'\n\nAllowed flags: ${allowedFlags.join(', ') || '(none)'}`,
227
+ };
228
+ }
229
+ }
230
+
147
231
  return { valid: true };
148
232
  }
149
233
 
@@ -208,8 +292,15 @@ async function main() { // NOSONAR S3776
208
292
  // Execute command
209
293
  try {
210
294
  const quotedArgs = args.map(a => `"${a.replaceAll('"', '\\"')}"`); // NOSONAR S7780 - intentional backslash escape for console quoting
211
- console.log(`Executing: forge ${command}${quotedArgs.length > 0 ? ' ' + quotedArgs.join(' ') : ''}`);
212
- console.log('');
295
+ // `forge shepherd <pr> --bundle` / `--pull` emit a machine-consumable JSON
296
+ // payload on stdout (the monitor/agent parses it). Suppress the human banner
297
+ // + blank line in those modes so stdout stays valid standalone JSON.
298
+ const quietJsonMode = command === 'shepherd'
299
+ && (args.includes('--bundle') || args.includes('--pull'));
300
+ if (!quietJsonMode) {
301
+ console.log(`Executing: forge ${command}${quotedArgs.length > 0 ? ' ' + quotedArgs.join(' ') : ''}`);
302
+ console.log('');
303
+ }
213
304
 
214
305
  let result;
215
306
  const positionalArgs = args.filter(a => !a.startsWith('--'));
@@ -223,11 +314,7 @@ async function main() { // NOSONAR S3776
223
314
  const context = {
224
315
  branch,
225
316
  researchDoc: fs.existsSync('docs/research') ? fs.readdirSync('docs/research').find(f => f.endsWith('.md')) : null,
226
- plan: (() => {
227
- if (!fs.existsSync('docs/plans')) return null;
228
- const slug = branch.replace(/^(feat|fix|docs|refactor)\//, '');
229
- return fs.readdirSync('docs/plans').find(f => f.endsWith('.md') && f.includes(slug)) || null;
230
- })(),
317
+ plan: findPlanDocForBranch(branch),
231
318
  tests: (() => { try { return fs.readdirSync('test').filter(f => f.endsWith('.test.js')); } catch (error_) { void error_; return []; } })(), // NOSONAR S2486 - intentional: missing test dir
232
319
  };
233
320
  const stageResult = HANDLERS.status.detectStage(context);
@@ -237,7 +324,7 @@ async function main() { // NOSONAR S3776
237
324
  result = await HANDLERS.plan.executePlan(positionalArgs[0]);
238
325
  if (result.success) {
239
326
  console.log(`✓ Plan created: ${result.summary || result.branchName || ''}`);
240
- if (result.beadsIssueId) console.log(` Beads: ${result.beadsIssueId}`);
327
+ if (result.issueId) console.log(` ${HANDLERS.plan.issueBackendLabel(result.issueBackend)}: ${result.issueId}`);
241
328
  } else {
242
329
  console.error(`✗ Plan failed: ${result.error}`);
243
330
  process.exit(1);
@@ -284,13 +371,34 @@ async function main() { // NOSONAR S3776
284
371
  process.exit(1);
285
372
  }
286
373
 
374
+ } else if (command === 'shepherd') {
375
+ result = await HANDLERS.shepherd.handler(args, {}, process.cwd());
376
+ if (result.pull !== undefined) {
377
+ // --pull: emit the compact "why it failed + what to fix" payload as
378
+ // JSON only, so an agent consumes ONE payload instead of running
379
+ // gh/GraphQL by hand.
380
+ console.log(JSON.stringify(result.pull, null, 2));
381
+ } else if (result.bundle !== undefined) {
382
+ // --bundle: emit the gathered PR-state bundle as JSON only, so the
383
+ // output is machine-consumable by the monitor/fixer-agent.
384
+ console.log(JSON.stringify(result.bundle, null, 2));
385
+ } else if (result.success) {
386
+ console.log(`✓ shepherd: ${result.state}`);
387
+ if (result.reason) console.log(` ${result.reason}`);
388
+ } else {
389
+ console.error(`✗ shepherd: ${result.state || 'failed'}`);
390
+ if (result.error) console.error(` ${result.error}`);
391
+ if (result.reason) console.error(` ${result.reason}`);
392
+ process.exit(1);
393
+ }
394
+
287
395
  } else {
288
396
  // review, merge, verify - not yet implemented as automated CLI commands
289
397
  // These stages require interactive AI assistance
290
398
  const prRef = positionalArgs[0] ? ` ${positionalArgs[0]}` : '';
291
399
  console.log(`ℹ️ '${command}' is a guided workflow stage.`);
292
400
  console.log(` Use your AI agent with the /${command}${prRef} slash command for interactive execution.`);
293
- console.log(` See .claude/commands/${command}.md for the full workflow guide.`);
401
+ console.log(` See skills/${command}/SKILL.md for the full workflow guide.`);
294
402
  }
295
403
 
296
404
  process.exit(0);
@@ -314,4 +422,7 @@ module.exports = {
314
422
  validateArgs,
315
423
  validateSlug,
316
424
  getHelpText,
425
+ findWorkPlanDoc,
426
+ findPlanDocForBranch,
427
+ ALLOWED_FLAGS,
317
428
  };
@@ -20,6 +20,30 @@ const fs = require("node:fs");
20
20
  // Validation results
21
21
  let checks = [];
22
22
 
23
+ function hasDesignDocUnder(dir) {
24
+ if (!fs.existsSync(dir)) return false;
25
+
26
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
27
+ const entryPath = `${dir}/${entry.name}`;
28
+ if (entry.isDirectory() && hasDesignDocUnder(entryPath)) {
29
+ return true;
30
+ }
31
+ if (entry.isFile() && entry.name === "plan.md") {
32
+ return true;
33
+ }
34
+ }
35
+
36
+ return false;
37
+ }
38
+
39
+ function hasPlanDesignDoc() {
40
+ const legacyPlansDir = "docs/plans";
41
+ const hasLegacyDesign = fs.existsSync(legacyPlansDir)
42
+ && fs.readdirSync(legacyPlansDir).some((f) => f.endsWith("-plan.md"));
43
+
44
+ return hasLegacyDesign || hasDesignDocUnder("docs/work");
45
+ }
46
+
23
47
  function check(label, condition, message) {
24
48
  const passed = typeof condition === "function" ? condition() : condition;
25
49
  checks.push({ label, passed, message: passed ? "✓" : `✗ ${message}` });
@@ -130,15 +154,12 @@ function validateDev() {
130
154
  "Plan file exists",
131
155
  () => {
132
156
  try {
133
- const plansDir = "docs/plans";
134
- if (!fs.existsSync(plansDir)) return false;
135
- const plans = fs.readdirSync(plansDir).filter((f) => f.endsWith("-design.md"));
136
- return plans.length > 0;
157
+ return hasPlanDesignDoc();
137
158
  } catch {
138
159
  return false;
139
160
  }
140
161
  },
141
- "No plan file found in docs/plans/. Run: /plan",
162
+ "No plan file found in docs/work/. Run: /plan",
142
163
  );
143
164
 
144
165
  check(