forge-workflow 0.0.9 → 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.
- package/.claude/rules/{greptile-review-process.md → review-process.md} +56 -41
- package/.claude/scripts/{greptile-resolve.sh → review-resolve.sh} +13 -3
- package/.cursor/rules/permissions-guidance.mdc +2 -2
- package/.forge/hooks/check-tdd.js +3 -0
- package/.forge/hooks/forge-native-hook.js +245 -0
- package/.forge/protected-paths.yaml +157 -0
- package/AGENTS.md +151 -61
- package/CHANGELOG.md +681 -0
- package/CLAUDE.md +9 -106
- package/QUICKSTART.md +171 -0
- package/README.md +271 -363
- package/bin/forge-cmd.js +120 -9
- package/bin/forge-preflight.js +26 -5
- package/bin/forge.js +466 -489
- package/docs/INDEX.md +93 -0
- package/docs/PROJECT_DESIGN.md +685 -0
- package/docs/architecture/index.md +66 -0
- package/docs/architecture/notes/README.md +35 -0
- package/docs/architecture/subsystems/README.md +46 -0
- package/docs/{TOOLCHAIN.md → forge/TOOLCHAIN.md} +56 -47
- package/docs/forge/VALIDATION.md +82 -0
- package/docs/{AGENT_INSTALL_PROMPT.md → guides/AGENT_INSTALL_PROMPT.md} +3 -3
- package/docs/guides/BEADS_GITHUB_SYNC.md +32 -0
- package/docs/{ENHANCED_ONBOARDING.md → guides/ENHANCED_ONBOARDING.md} +16 -12
- package/docs/guides/GREPTILE_SETUP.md +46 -0
- package/docs/guides/MANUAL_REVIEW_GUIDE.md +58 -0
- package/docs/guides/MIGRATION.md +56 -0
- package/docs/guides/SETUP.md +118 -0
- package/docs/guides/SUPPORT.md +185 -0
- package/docs/guides/WORKFLOW_TEMPLATES.md +74 -0
- package/docs/guides/memory-backends.md +183 -0
- package/docs/reference/ADAPTERS.md +128 -0
- package/docs/reference/AGENT_SKILL_PARITY.md +175 -0
- package/docs/reference/COMMANDS.md +205 -0
- package/docs/reference/DECISION_DRIFT_GUARDS.md +97 -0
- package/docs/{EXAMPLES.md → reference/EXAMPLES.md} +7 -5
- package/docs/reference/FORGE_KERNEL_STORAGE_MODEL.md +135 -0
- package/docs/reference/HERMES_INTEGRATION.md +118 -0
- package/docs/reference/INSIGHTS_RECAP.md +63 -0
- package/docs/reference/INSTALL.md +164 -0
- package/docs/reference/KERNEL_TAXONOMY_VALIDATION.md +161 -0
- package/docs/reference/PROTECTED_PATH_MANIFEST.md +25 -0
- package/docs/reference/RELEASE.md +68 -0
- package/docs/reference/RESEARCH_TEMPLATE.md +292 -0
- package/docs/{ROADMAP.md → reference/ROADMAP.md} +12 -9
- package/docs/reference/SKILLS.md +35 -0
- package/docs/reference/STATUS_BOARD.md +80 -0
- package/docs/reference/TEMPLATES.md +106 -0
- package/docs/reference/TOOLCHAIN.md +658 -0
- package/docs/reference/VALIDATION.md +82 -0
- package/docs/reference/agent-permissions.md +169 -0
- package/docs/reference/beads-to-kernel-migration-ux.md +61 -0
- package/docs/reference/control-plane-guarantees.md +125 -0
- package/docs/reference/dependency-chain.md +331 -0
- package/docs/reference/forge-kernel-issue-command-contract.md +161 -0
- package/docs/reference/forge-kernel-schema.md +72 -0
- package/docs/reference/kernel-conflict-evaluators.md +27 -0
- package/docs/reference/patch-md-format.md +77 -0
- package/docs/reference/protected-state-surfaces.md +59 -0
- package/docs/reference/shepherd.md +115 -0
- package/docs/reference/superpowers-analysis.md +320 -0
- package/docs/reference/superpowers-integration-options.md +404 -0
- package/docs/reference/test-environment.md +519 -0
- package/docs/reference/upgrade-safety.md +59 -0
- package/lefthook.yml +18 -0
- package/lib/adapter-cli.js +307 -0
- package/lib/adapters/beads-issue-adapter.js +127 -0
- package/lib/adapters/beads-kernel-compat.js +1042 -0
- package/lib/adapters/greptile-review-adapter.js +141 -0
- package/lib/adapters/kernel-issue-adapter.js +101 -0
- package/lib/adapters/pr-state-adapter.js +484 -0
- package/lib/adoption-profiles.js +126 -0
- package/lib/agents/README.md +2 -6
- package/lib/agents/claude.plugin.json +3 -8
- package/lib/agents/codex.plugin.json +9 -1
- package/lib/agents/cursor.plugin.json +2 -6
- package/lib/agents/hermes.plugin.json +22 -0
- package/lib/agents-config.js +39 -1236
- package/lib/audit-evidence.js +282 -0
- package/lib/beads-setup.js +225 -28
- package/lib/beads-sync-scaffold.js +36 -107
- package/lib/codex-skills.js +51 -1
- package/lib/commands/_issue.js +744 -70
- package/lib/commands/_manifest.js +91 -0
- package/lib/commands/_registry.js +85 -34
- package/lib/commands/_resolve-command-opts.js +261 -0
- package/lib/commands/_serve-security.js +270 -0
- package/lib/commands/adapter.js +12 -0
- package/lib/commands/add.js +118 -0
- package/lib/commands/audit.js +70 -0
- package/lib/commands/blocked.js +5 -0
- package/lib/commands/board.js +64 -0
- package/lib/commands/claim.js +21 -2
- package/lib/commands/claims.js +7 -0
- package/lib/commands/clean.js +485 -75
- package/lib/commands/close.js +2 -2
- package/lib/commands/comment.js +5 -0
- package/lib/commands/control.js +148 -0
- package/lib/commands/create.js +2 -2
- package/lib/commands/dev.js +185 -7
- package/lib/commands/doc-gate.js +336 -0
- package/lib/commands/doctor.js +156 -0
- package/lib/commands/explain.js +15 -0
- package/lib/commands/export.js +237 -0
- package/lib/commands/gate.js +192 -0
- package/lib/commands/hooks.js +242 -0
- package/lib/commands/inbox.js +118 -0
- package/lib/commands/init.js +598 -0
- package/lib/commands/insights.js +79 -0
- package/lib/commands/issue.js +12 -1
- package/lib/commands/issues.js +66 -0
- package/lib/commands/lint.js +5 -0
- package/lib/commands/list.js +2 -2
- package/lib/commands/merge.js +312 -0
- package/lib/commands/migrate.js +523 -0
- package/lib/commands/new.js +12 -0
- package/lib/commands/options.js +241 -0
- package/lib/commands/orient.js +13 -0
- package/lib/commands/orphans.js +5 -0
- package/lib/commands/patch.js +67 -0
- package/lib/commands/plan.js +436 -24
- package/lib/commands/preflight.js +211 -0
- package/lib/commands/prime.js +13 -0
- package/lib/commands/push.js +69 -2
- package/lib/commands/ready.js +2 -2
- package/lib/commands/recall.js +116 -0
- package/lib/commands/recap.js +61 -0
- package/lib/commands/recommend.js +22 -2
- package/lib/commands/release.js +91 -0
- package/lib/commands/remember.js +74 -0
- package/lib/commands/role.js +99 -0
- package/lib/commands/serve.js +581 -0
- package/lib/commands/setup.js +851 -979
- package/lib/commands/shepherd.js +436 -0
- package/lib/commands/ship.js +23 -1
- package/lib/commands/show.js +2 -2
- package/lib/commands/stage.js +192 -0
- package/lib/commands/stale.js +5 -0
- package/lib/commands/status.js +329 -11
- package/lib/commands/sync.js +34 -46
- package/lib/commands/team.js +15 -2
- package/lib/commands/test.js +58 -7
- package/lib/commands/update.js +2 -2
- package/lib/commands/upgrade.js +47 -0
- package/lib/commands/validate.js +56 -25
- package/lib/commands/worktree.js +308 -128
- package/lib/config-writer.js +202 -0
- package/lib/control-plane.js +236 -0
- package/lib/core/runtime-graph.js +946 -0
- package/lib/dep-guard/keyword-ripple.js +184 -0
- package/lib/deprecated-sync-cleanup.js +362 -0
- package/lib/detect-agent.js +2 -28
- package/lib/detect-worktree.js +42 -17
- package/lib/doc-gate/declaration.js +177 -0
- package/lib/doc-gate/detect.js +289 -0
- package/lib/doc-gate/gate.js +375 -0
- package/lib/doc-gate/okf-config.js +128 -0
- package/lib/doc-gate/okf.js +429 -0
- package/lib/docs-command.js +1161 -6
- package/lib/forge-issues.js +697 -0
- package/lib/forge-lock.js +262 -0
- package/lib/gate-events.js +193 -0
- package/lib/global-flags.js +74 -0
- package/lib/greptile-match.js +7 -63
- package/lib/harness-capability-matrix.js +380 -0
- package/lib/hook-global-installer.js +347 -0
- package/lib/hook-renderer.js +451 -0
- package/lib/inbox.js +391 -0
- package/lib/insights.js +397 -0
- package/lib/issue-adapter.js +156 -0
- package/lib/issue-backend.js +145 -0
- package/lib/issue-render.js +220 -0
- package/lib/issue-sync/authority.js +100 -0
- package/lib/issue-sync/github-pull.js +184 -0
- package/lib/issue-sync/import-primitives.js +98 -0
- package/lib/issue-sync/legacy-link-bridge.js +436 -0
- package/lib/issue-sync/link-store.js +292 -0
- package/lib/issue-sync/project-github.js +123 -0
- package/lib/issue-sync/reconcile.js +195 -0
- package/lib/issue-sync/schema.js +126 -0
- package/lib/kernel/backing-issue.js +305 -0
- package/lib/kernel/broker.js +1218 -0
- package/lib/kernel/cli-broker-factory.js +130 -0
- package/lib/kernel/conflict-signal.js +82 -0
- package/lib/kernel/evaluators.js +195 -0
- package/lib/kernel/fs-class.js +495 -0
- package/lib/kernel/issue-command-contract.js +559 -0
- package/lib/kernel/issue-id-resolver.js +186 -0
- package/lib/kernel/lease-enforcer.js +158 -0
- package/lib/kernel/migrations.js +333 -0
- package/lib/kernel/planning-buckets-schema.js +109 -0
- package/lib/kernel/projection-jsonl-writer.js +450 -0
- package/lib/kernel/readiness-model.js +329 -0
- package/lib/kernel/schema.js +356 -0
- package/lib/kernel/sqlite-driver.js +2504 -0
- package/lib/kernel/taxonomy-validator.js +394 -0
- package/lib/lefthook-check.js +8 -4
- package/lib/lefthook-wiring.js +413 -0
- package/lib/mcp-config-renderer.js +288 -0
- package/lib/memory/graphiti-mcp.js +106 -0
- package/lib/memory/router.js +387 -0
- package/lib/memory/typed-api.js +102 -0
- package/lib/memory-digest.js +195 -0
- package/lib/merge-rules.js +395 -0
- package/lib/migrate-dry-run.js +466 -0
- package/lib/orientation.js +863 -0
- package/lib/package-manager-remediation.js +103 -0
- package/lib/package-root.js +381 -0
- package/lib/patch-intent.js +890 -0
- package/lib/plugin-catalog.js +3 -4
- package/lib/plugin-manager.js +0 -5
- package/lib/pr-bundle.js +186 -0
- package/lib/pr-monitor/differ.js +195 -0
- package/lib/pr-monitor/events.js +0 -0
- package/lib/pr-monitor/gather.js +124 -0
- package/lib/pr-monitor/journal.js +299 -0
- package/lib/pr-monitor/monitor.js +146 -0
- package/lib/pr-monitor/render-sticky.js +157 -0
- package/lib/pr-monitor/watch-lifecycle.js +95 -0
- package/lib/pr-monitor/watch.js +247 -0
- package/lib/pr-pull.js +1273 -0
- package/lib/pr-shepherd.js +494 -0
- package/lib/pr-state-validator.js +59 -0
- package/lib/preflight/gates.js +237 -0
- package/lib/preflight/runner.js +116 -0
- package/lib/project-discovery.js +0 -53
- package/lib/project-memory.js +166 -0
- package/lib/protected-path-manifest.js +281 -0
- package/lib/protected-state-surfaces.js +387 -0
- package/lib/release-readiness.js +2089 -0
- package/lib/reset.js +59 -45
- package/lib/review-adapter.js +68 -0
- package/lib/rules-sync.js +260 -0
- package/lib/runtime-health.js +332 -23
- package/lib/safety-config-renderer.js +268 -0
- package/lib/setup-action-log.js +1 -7
- package/lib/setup.js +27 -65
- package/lib/shell-utils.js +76 -6
- package/lib/skills-sync.js +330 -0
- package/lib/smart-status/conflicts.js +205 -0
- package/lib/smart-status/scoring.js +191 -0
- package/lib/status/beads-snapshot.js +145 -0
- package/lib/status/presenter.js +216 -0
- package/lib/status/snapshot.js +186 -0
- package/lib/sync-backend.js +202 -0
- package/lib/untrusted-content.js +52 -0
- package/lib/upgrade-safety.js +199 -0
- package/lib/workflow/enforce-stage.js +298 -47
- package/lib/workflow/stage-transition.js +115 -0
- package/lib/workflow/stages.js +30 -6
- package/lib/workflow/state-manager.js +159 -14
- package/lib/workflow/state.js +23 -1
- package/lib/workflow-profiles.js +17 -5
- package/package.json +46 -36
- package/rules/documentation.md +19 -0
- package/rules/kernel-tracking.md +26 -0
- package/rules/security.md +22 -0
- package/rules/tdd.md +20 -0
- package/rules/workflow.md +27 -0
- package/scripts/auto-backing-issue.js +47 -0
- package/scripts/beads-context.sh +165 -22
- package/scripts/beads-migrate-to-dolt.sh +7 -0
- package/scripts/beads-upgrade-smoke.sh +284 -0
- package/scripts/behavioral-judge.sh +115 -11
- package/scripts/benchmark.js +349 -63
- package/scripts/bootstrap-windows-tools.sh +78 -0
- package/scripts/branch-protection.js +2 -3
- package/scripts/check-agents.js +34 -137
- package/scripts/commitlint.js +3 -1
- package/scripts/conflict-detect.sh +3 -0
- package/scripts/dep-guard-analyze.js +52 -17
- package/scripts/dep-guard-keyword-ripple.js +29 -0
- package/scripts/dep-guard-render-review.js +86 -0
- package/scripts/dep-guard.sh +64 -232
- package/scripts/file-index.sh +3 -0
- package/scripts/forge-team/lib/claim.sh +34 -18
- package/scripts/forge-team/lib/dashboard.sh +61 -86
- package/scripts/forge-team/lib/epic.sh +99 -263
- package/scripts/forge-team/lib/hooks.sh +26 -28
- package/scripts/forge-team/lib/identity.sh +4 -4
- package/scripts/forge-team/lib/sync-github.sh +144 -47
- package/scripts/forge-team/lib/verify.sh +93 -83
- package/scripts/forge-team/lib/workload.sh +41 -65
- package/scripts/forge-team/tests/claim.test.sh +25 -19
- package/scripts/forge-team/tests/dashboard.test.sh +31 -46
- package/scripts/forge-team/tests/epic.test.sh +52 -71
- package/scripts/forge-team/tests/hooks.test.sh +38 -50
- package/scripts/forge-team/tests/identity.test.sh +3 -3
- package/scripts/forge-team/tests/integration.test.sh +44 -66
- package/scripts/forge-team/tests/sync-github.test.sh +183 -79
- package/scripts/forge-team/tests/verify.test.sh +37 -46
- package/scripts/forge-team/tests/workflow-integration.test.sh +4 -4
- package/scripts/forge-team/tests/workload.test.sh +32 -66
- package/scripts/gen-command-manifest.js +153 -0
- package/scripts/gen-embedded-assets.mjs +129 -0
- package/scripts/install.ps1 +139 -0
- package/scripts/install.sh +268 -0
- package/scripts/lib/beads-migrate-to-dolt.mjs +503 -0
- package/scripts/lib/release-asset.mjs +84 -0
- package/scripts/parity-check.mjs +145 -0
- package/scripts/parity-check.test.mjs +58 -0
- package/scripts/pin-agentic-workflow-images.js +112 -0
- package/scripts/pr-coordinator.sh +3 -0
- package/scripts/preflight-sonar.eslint.config.mjs +44 -0
- package/scripts/preflight.sh +108 -0
- package/scripts/protected-state-check.js +104 -0
- package/scripts/smart-status-score.js +31 -0
- package/scripts/smart-status-sessions.js +51 -0
- package/scripts/smart-status.sh +117 -369
- package/scripts/spikes/config-race-bench.js +111 -0
- package/scripts/spikes/harness-capability-matrix.js +13 -0
- package/scripts/spikes/patch-anchor-stability-bench.js +125 -0
- package/scripts/spikes/protected-path-manifest.js +20 -0
- package/scripts/spikes/skill-auto-invoke-parity.js +292 -0
- package/scripts/sync-agent-skills.js +62 -0
- package/scripts/sync-agentic-workflow.js +48 -0
- package/scripts/sync-utils.sh +3 -0
- package/scripts/test-ci-shard.js +251 -0
- package/scripts/test-dashboard.js +188 -52
- package/scripts/test-full-suite.js +186 -0
- package/scripts/test-profile.js +278 -0
- package/scripts/test.js +302 -28
- package/scripts/validate.js +143 -0
- package/scripts/validate.sh +18 -1
- package/skills/claim-safety/SKILL.md +102 -0
- package/skills/claim-safety/evals/evals.json +46 -0
- package/{.github/prompts/dev.prompt.md → skills/dev/SKILL.md} +46 -52
- package/skills/dev/evals/evals.json +50 -0
- package/skills/hermes-forge/SKILL.md +185 -0
- package/skills/hermes-forge/evals/evals.json +46 -0
- package/skills/issue-basics/SKILL.md +111 -0
- package/skills/issue-basics/evals/evals.json +46 -0
- package/skills/kernel/SKILL.md +166 -0
- package/skills/kernel/evals/evals.json +50 -0
- package/skills/memory/SKILL.md +102 -0
- package/skills/parallel-deep-research/SKILL.md +14 -11
- package/skills/parallel-deep-research/evals/evals.json +11 -27
- package/{.github/prompts/plan.prompt.md → skills/plan/SKILL.md} +134 -159
- package/skills/plan/evals/evals.json +42 -0
- package/skills/research/SKILL.md +195 -0
- package/skills/research/evals/evals.json +42 -0
- package/{.github/prompts/review.prompt.md → skills/review/SKILL.md} +98 -62
- package/skills/review/evals/evals.json +42 -0
- package/skills/rollback/SKILL.md +110 -0
- package/skills/rollback/evals/evals.json +46 -0
- package/skills/rollback/references/methods.md +204 -0
- package/{.cursor/commands/rollback.md → skills/rollback/references/workflow-integration.md} +10 -284
- package/skills/shepherd/SKILL.md +66 -0
- package/skills/shepherd/evals/evals.json +42 -0
- package/skills/ship/SKILL.md +251 -0
- package/skills/ship/evals/evals.json +42 -0
- package/skills/smith/SKILL.md +142 -0
- package/skills/smith/evals/evals.json +46 -0
- package/skills/smith/references/autonomy-and-gates.md +94 -0
- package/{.github/prompts/sonarcloud.prompt.md → skills/sonarcloud/SKILL.md} +14 -3
- package/skills/sonarcloud/evals/evals.json +46 -0
- package/skills/sonarcloud-analysis/SKILL.md +18 -13
- package/skills/sonarcloud-analysis/evals/evals.json +11 -15
- package/skills/status/SKILL.md +102 -0
- package/skills/status/evals/evals.json +50 -0
- package/skills/triage-ready/SKILL.md +121 -0
- package/skills/triage-ready/evals/evals.json +42 -0
- package/{.github/prompts/validate.prompt.md → skills/validate/SKILL.md} +52 -29
- package/skills/validate/evals/evals.json +42 -0
- package/skills/verify/SKILL.md +299 -0
- package/skills/verify/evals/evals.json +50 -0
- package/.claude/commands/dev.md +0 -345
- package/.claude/commands/plan.md +0 -566
- package/.claude/commands/premerge.md +0 -186
- package/.claude/commands/research.md +0 -42
- package/.claude/commands/review.md +0 -451
- package/.claude/commands/rollback.md +0 -721
- package/.claude/commands/ship.md +0 -213
- package/.claude/commands/sonarcloud.md +0 -152
- package/.claude/commands/status.md +0 -90
- package/.claude/commands/validate.md +0 -288
- package/.claude/commands/verify.md +0 -269
- package/.claude/rules/workflow.md +0 -121
- package/.cline/workflows/dev.md +0 -342
- package/.cline/workflows/plan.md +0 -563
- package/.cline/workflows/premerge.md +0 -183
- package/.cline/workflows/research.md +0 -39
- package/.cline/workflows/review.md +0 -448
- package/.cline/workflows/rollback.md +0 -718
- package/.cline/workflows/ship.md +0 -210
- package/.cline/workflows/sonarcloud.md +0 -146
- package/.cline/workflows/status.md +0 -87
- package/.cline/workflows/validate.md +0 -285
- package/.cline/workflows/verify.md +0 -266
- package/.codex/config.toml +0 -11
- package/.codex/skills/dev/SKILL.md +0 -345
- package/.codex/skills/plan/SKILL.md +0 -566
- package/.codex/skills/premerge/SKILL.md +0 -186
- package/.codex/skills/research/SKILL.md +0 -42
- package/.codex/skills/review/SKILL.md +0 -451
- package/.codex/skills/rollback/SKILL.md +0 -721
- package/.codex/skills/ship/SKILL.md +0 -213
- package/.codex/skills/sonarcloud/SKILL.md +0 -149
- package/.codex/skills/status/SKILL.md +0 -90
- package/.codex/skills/validate/SKILL.md +0 -288
- package/.codex/skills/verify/SKILL.md +0 -269
- package/.cursor/commands/dev.md +0 -342
- package/.cursor/commands/plan.md +0 -563
- package/.cursor/commands/premerge.md +0 -183
- package/.cursor/commands/research.md +0 -39
- package/.cursor/commands/review.md +0 -448
- package/.cursor/commands/ship.md +0 -210
- package/.cursor/commands/sonarcloud.md +0 -146
- package/.cursor/commands/status.md +0 -87
- package/.cursor/commands/validate.md +0 -285
- package/.cursor/commands/verify.md +0 -266
- package/.cursorrules +0 -149
- package/.github/prompts/premerge.prompt.md +0 -188
- package/.github/prompts/research.prompt.md +0 -44
- package/.github/prompts/rollback.prompt.md +0 -723
- package/.github/prompts/ship.prompt.md +0 -215
- package/.github/prompts/status.prompt.md +0 -92
- package/.github/prompts/verify.prompt.md +0 -271
- package/.github/workflows/beads-to-github.yml +0 -56
- package/.github/workflows/github-to-beads.yml +0 -97
- package/.kilocode/workflows/dev.md +0 -346
- package/.kilocode/workflows/plan.md +0 -567
- package/.kilocode/workflows/premerge.md +0 -187
- package/.kilocode/workflows/research.md +0 -43
- package/.kilocode/workflows/review.md +0 -452
- package/.kilocode/workflows/rollback.md +0 -722
- package/.kilocode/workflows/ship.md +0 -214
- package/.kilocode/workflows/sonarcloud.md +0 -150
- package/.kilocode/workflows/status.md +0 -91
- package/.kilocode/workflows/validate.md +0 -289
- package/.kilocode/workflows/verify.md +0 -270
- package/.opencode/commands/dev.md +0 -345
- package/.opencode/commands/plan.md +0 -566
- package/.opencode/commands/premerge.md +0 -186
- package/.opencode/commands/research.md +0 -42
- package/.opencode/commands/review.md +0 -451
- package/.opencode/commands/rollback.md +0 -721
- package/.opencode/commands/ship.md +0 -213
- package/.opencode/commands/sonarcloud.md +0 -149
- package/.opencode/commands/status.md +0 -90
- package/.opencode/commands/validate.md +0 -288
- package/.opencode/commands/verify.md +0 -269
- package/.roo/commands/dev.md +0 -346
- package/.roo/commands/plan.md +0 -567
- package/.roo/commands/premerge.md +0 -187
- package/.roo/commands/research.md +0 -43
- package/.roo/commands/review.md +0 -452
- package/.roo/commands/rollback.md +0 -722
- package/.roo/commands/ship.md +0 -214
- package/.roo/commands/sonarcloud.md +0 -150
- package/.roo/commands/status.md +0 -91
- package/.roo/commands/validate.md +0 -289
- package/.roo/commands/verify.md +0 -270
- package/docs/BEADS_GITHUB_SYNC.md +0 -255
- package/docs/GREPTILE_SETUP.md +0 -400
- package/docs/MANUAL_REVIEW_GUIDE.md +0 -106
- package/docs/SETUP.md +0 -663
- package/docs/VALIDATION.md +0 -363
- package/lib/agents/cline.plugin.json +0 -29
- package/lib/agents/copilot.plugin.json +0 -24
- package/lib/agents/kilocode.plugin.json +0 -22
- package/lib/agents/opencode.plugin.json +0 -23
- package/lib/agents/roo.plugin.json +0 -30
- package/lib/beads-health-check.js +0 -143
- package/lib/commands/commands-reset.js +0 -147
- package/opencode.json +0 -67
- package/scripts/beads-context.test.js +0 -567
- package/scripts/github-beads-sync/comment.mjs +0 -64
- package/scripts/github-beads-sync/config.mjs +0 -148
- package/scripts/github-beads-sync/github-api.mjs +0 -131
- package/scripts/github-beads-sync/index.mjs +0 -332
- package/scripts/github-beads-sync/label-mapper.mjs +0 -54
- package/scripts/github-beads-sync/mapping.mjs +0 -78
- package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
- package/scripts/github-beads-sync/reverse-sync.mjs +0 -138
- package/scripts/github-beads-sync/run-bd.mjs +0 -161
- package/scripts/github-beads-sync/sanitize.mjs +0 -121
- package/scripts/github-beads-sync.config.json +0 -26
- 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
|
-
|
|
212
|
-
|
|
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.
|
|
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
|
|
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
|
};
|
package/bin/forge-preflight.js
CHANGED
|
@@ -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
|
-
|
|
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/
|
|
162
|
+
"No plan file found in docs/work/. Run: /plan",
|
|
142
163
|
);
|
|
143
164
|
|
|
144
165
|
check(
|