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
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Auto Kernel Tracking — foundational primitive.
|
|
5
|
+
*
|
|
6
|
+
* `ensureBackingIssue()` guarantees that a unit of work (a branch/worktree) has a
|
|
7
|
+
* backing Kernel issue, WITHOUT anyone remembering to run `forge issue create`.
|
|
8
|
+
* It is the reusable core of the auto-tracking design
|
|
9
|
+
* (docs/work/2026-07-06-auto-kernel-tracking/design.md, kernel issue 67ab465b /
|
|
10
|
+
* PR1 131ab014); PR2/PR3 wire it into `forge worktree`, `forge push`, and the
|
|
11
|
+
* lefthook pre-push, but this module is deliberately side-effect-free beyond the
|
|
12
|
+
* injected kernel and never wires itself in.
|
|
13
|
+
*
|
|
14
|
+
* Contract (all guarantees are covered by test/kernel/backing-issue.test.js):
|
|
15
|
+
* - Idempotent + deduped BY BRANCH: if the branch already resolves to an issue
|
|
16
|
+
* (via the kernel_worktrees linkage row, or an issue id encoded in the branch
|
|
17
|
+
* name), that issue is returned/linked — never a duplicate.
|
|
18
|
+
* - Auto-creates a good-enough stub otherwise: title derived from the branch,
|
|
19
|
+
* body noting it was auto-created, labelled `auto-stub`. Then links the branch.
|
|
20
|
+
* - Skips work it should not track: main/master, detached HEAD (no branch), and
|
|
21
|
+
* ignore-glob branches (tmp/spike/wip/throwaway). Returns null, creates nothing.
|
|
22
|
+
* - Degrades gracefully: a missing/limited kernel, a non-kernel backend, or any
|
|
23
|
+
* thrown error yields null (never throws) — so it is safe to call from a hook.
|
|
24
|
+
* - Fully injectable: pass the kernel `driver` + `broker` (or a fake with the
|
|
25
|
+
* same method surface), plus an optional clock (`now`) and id source
|
|
26
|
+
* (`generateId`), so it is unit-testable without a real repo or sqlite DB.
|
|
27
|
+
*
|
|
28
|
+
* Storage choice: the branch->issue link lives in the `kernel_worktrees` row
|
|
29
|
+
* (`issue_id`, keyed by worktree `path`, with `branch` recorded) — the existing
|
|
30
|
+
* "the issue this branch serves" linkage cited by the design. No new table.
|
|
31
|
+
*
|
|
32
|
+
* @module kernel/backing-issue
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
const { randomUUID } = require('node:crypto');
|
|
36
|
+
|
|
37
|
+
const DEFAULT_PROTECTED_BRANCHES = Object.freeze(['main', 'master']);
|
|
38
|
+
const DEFAULT_IGNORE_GLOBS = Object.freeze(['tmp/*', 'spike/*', 'wip/*', 'throwaway/*']);
|
|
39
|
+
const AUTO_STUB_LABEL = 'auto-stub';
|
|
40
|
+
// Branch prefixes stripped before deriving a title / probing for an encoded issue id.
|
|
41
|
+
const BRANCH_PREFIX = /^(feat|feature|fix|bugfix|hotfix|chore|refactor|docs|test|spike|wip)\//i;
|
|
42
|
+
// An issue key encoded in a branch slug, e.g. `feat/kap-7-foo` -> `kap-7`.
|
|
43
|
+
const ENCODED_ISSUE_ID = /^([a-z][a-z0-9]*-\d+)\b/i;
|
|
44
|
+
// Regex metacharacters escaped when compiling an ignore glob.
|
|
45
|
+
const GLOB_METACHARS = '.+^${}()|[]\\';
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Resolve the injected kernel driver/broker from a variety of accepted shapes, so
|
|
49
|
+
* a caller can pass `{ driver, broker }`, the real `{ kernelDriver, kernelBroker }`
|
|
50
|
+
* from buildMigratedKernelIssueDeps(), or `{ kernel: <either> }`.
|
|
51
|
+
*
|
|
52
|
+
* @param {object} options
|
|
53
|
+
* @returns {{ driver: object|null, broker: object|null }}
|
|
54
|
+
*/
|
|
55
|
+
function resolveKernel(options) {
|
|
56
|
+
const kernel = options.kernel || {};
|
|
57
|
+
const driver = options.driver || options.kernelDriver || kernel.driver || kernel.kernelDriver || null;
|
|
58
|
+
const broker = options.broker || options.kernelBroker || kernel.broker || kernel.kernelBroker || null;
|
|
59
|
+
return { driver, broker };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @param {object} driver
|
|
64
|
+
* @returns {boolean} whether the driver exposes the worktree-linkage surface used here.
|
|
65
|
+
*/
|
|
66
|
+
function driverIsUsable(driver) {
|
|
67
|
+
return Boolean(
|
|
68
|
+
driver
|
|
69
|
+
&& typeof driver.registerWorktree === 'function'
|
|
70
|
+
&& (typeof driver.getWorktreeLinkage === 'function' || typeof driver.listWorktrees === 'function'),
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** @param {object} broker @returns {boolean} whether the broker can create issues. */
|
|
75
|
+
function brokerIsUsable(broker) {
|
|
76
|
+
return Boolean(broker && typeof broker.runIssueOperation === 'function');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** @param {string} glob @returns {RegExp} anchored regex; `*` = one segment, `**` = any. */
|
|
80
|
+
function globToRegExp(glob) {
|
|
81
|
+
const source = String(glob);
|
|
82
|
+
let pattern = '';
|
|
83
|
+
for (let i = 0; i < source.length; i += 1) {
|
|
84
|
+
const char = source[i];
|
|
85
|
+
if (char === '*') {
|
|
86
|
+
if (source[i + 1] === '*') {
|
|
87
|
+
pattern += '.*';
|
|
88
|
+
i += 1;
|
|
89
|
+
} else {
|
|
90
|
+
pattern += '[^/]*';
|
|
91
|
+
}
|
|
92
|
+
} else if (GLOB_METACHARS.includes(char)) {
|
|
93
|
+
pattern += `\\${char}`;
|
|
94
|
+
} else {
|
|
95
|
+
pattern += char;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return new RegExp(`^${pattern}$`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @param {string} branch
|
|
103
|
+
* @param {string[]} globs
|
|
104
|
+
* @returns {boolean} whether the branch matches any ignore glob.
|
|
105
|
+
*/
|
|
106
|
+
function matchesIgnoreGlob(branch, globs) {
|
|
107
|
+
return globs.some(glob => globToRegExp(glob).test(branch));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Decide whether the branch is a trackable unit of work.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} branch
|
|
114
|
+
* @param {{ protectedBranches: string[], ignoreGlobs: string[] }} config
|
|
115
|
+
* @returns {{ skip: boolean, reason?: string }}
|
|
116
|
+
*/
|
|
117
|
+
function classifyBranch(branch, { protectedBranches, ignoreGlobs }) {
|
|
118
|
+
if (!branch || typeof branch !== 'string' || branch === 'HEAD') {
|
|
119
|
+
return { skip: true, reason: 'detached HEAD / no branch' };
|
|
120
|
+
}
|
|
121
|
+
if (protectedBranches.includes(branch)) {
|
|
122
|
+
return { skip: true, reason: `protected branch (${branch})` };
|
|
123
|
+
}
|
|
124
|
+
if (matchesIgnoreGlob(branch, ignoreGlobs)) {
|
|
125
|
+
return { skip: true, reason: `ignore-glob branch (${branch})` };
|
|
126
|
+
}
|
|
127
|
+
return { skip: false };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** @param {string} branch @returns {string} branch slug with any known prefix removed. */
|
|
131
|
+
function stripPrefix(branch) {
|
|
132
|
+
return branch.replace(BRANCH_PREFIX, '');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Derive a human-ish issue title from a branch name.
|
|
137
|
+
*
|
|
138
|
+
* @param {string} branch
|
|
139
|
+
* @returns {string}
|
|
140
|
+
*/
|
|
141
|
+
function deriveTitle(branch) {
|
|
142
|
+
const slug = stripPrefix(branch).replace(/[-_/]+/g, ' ').trim();
|
|
143
|
+
if (!slug) return branch;
|
|
144
|
+
return slug.charAt(0).toUpperCase() + slug.slice(1);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Extract an issue id encoded in the branch name (e.g. `feat/kap-7-foo` -> `kap-7`).
|
|
149
|
+
*
|
|
150
|
+
* @param {string} branch
|
|
151
|
+
* @returns {string|null}
|
|
152
|
+
*/
|
|
153
|
+
function extractEncodedIssueId(branch) {
|
|
154
|
+
const match = ENCODED_ISSUE_ID.exec(stripPrefix(branch));
|
|
155
|
+
return match ? match[1] : null;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Find an existing branch->issue linkage row (with a non-null issue_id). Prefers the
|
|
160
|
+
* path-keyed row; falls back to scanning by branch. Best-effort — returns null on any error.
|
|
161
|
+
*
|
|
162
|
+
* @param {object} driver
|
|
163
|
+
* @param {{ worktreePath?: string, branch: string }} query
|
|
164
|
+
* @returns {object|null} the linkage row, or null.
|
|
165
|
+
*/
|
|
166
|
+
function findExistingLink(driver, { worktreePath, branch }) {
|
|
167
|
+
try {
|
|
168
|
+
if (worktreePath && typeof driver.getWorktreeLinkage === 'function') {
|
|
169
|
+
const row = driver.getWorktreeLinkage({ path: worktreePath });
|
|
170
|
+
if (row && row.issue_id && row.branch === branch) return row;
|
|
171
|
+
}
|
|
172
|
+
if (typeof driver.listWorktrees === 'function') {
|
|
173
|
+
const rows = driver.listWorktrees() || [];
|
|
174
|
+
const match = rows.find(row => row && row.branch === branch && row.issue_id);
|
|
175
|
+
if (match) return match;
|
|
176
|
+
}
|
|
177
|
+
} catch {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Persist the branch->issue link into the kernel_worktrees registry.
|
|
185
|
+
*
|
|
186
|
+
* @param {object} driver
|
|
187
|
+
* @param {object} params
|
|
188
|
+
* @returns {object|null} the upserted row, or null on error.
|
|
189
|
+
*/
|
|
190
|
+
function linkBranchToIssue(driver, { projectRoot, worktreePath, gitCommonDir, branch, issueId, actor, now }) {
|
|
191
|
+
try {
|
|
192
|
+
return driver.registerWorktree({
|
|
193
|
+
git_common_dir: gitCommonDir || projectRoot || 'unknown',
|
|
194
|
+
path: worktreePath || projectRoot,
|
|
195
|
+
branch,
|
|
196
|
+
actor: actor || null,
|
|
197
|
+
issue_id: issueId,
|
|
198
|
+
work_folder: null,
|
|
199
|
+
registered_at: now().toISOString(),
|
|
200
|
+
state: 'active',
|
|
201
|
+
});
|
|
202
|
+
} catch {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Ensure the given branch has a backing Kernel issue. Idempotent, deduped by branch,
|
|
209
|
+
* best-effort (never throws). See the module doc for the full contract.
|
|
210
|
+
*
|
|
211
|
+
* @param {object} options
|
|
212
|
+
* @param {string} options.branch - Current branch (falsy or 'HEAD' => detached => skip).
|
|
213
|
+
* @param {string} [options.projectRoot] - Repo root; default worktree path / git-common-dir fallback.
|
|
214
|
+
* @param {string} [options.worktreePath] - Absolute worktree path (linkage row key). Defaults to projectRoot.
|
|
215
|
+
* @param {string} [options.gitCommonDir] - Git common dir for the linkage row.
|
|
216
|
+
* @param {object} [options.driver] - Kernel driver (real or fake). Also accepts kernelDriver / kernel.*.
|
|
217
|
+
* @param {object} [options.broker] - Kernel broker (real or fake). Also accepts kernelBroker / kernel.*.
|
|
218
|
+
* @param {string} [options.actor] - Actor recorded on the issue/linkage. Default FORGE_ACTOR or 'forge'.
|
|
219
|
+
* @param {string[]} [options.protectedBranches] - Never-track branches. Default ['main','master'].
|
|
220
|
+
* @param {string[]} [options.ignoreGlobs] - Never-track globs. Default tmp/spike/wip/throwaway.
|
|
221
|
+
* @param {() => Date} [options.now] - Clock injection. Default () => new Date().
|
|
222
|
+
* @param {() => string} [options.generateId] - Issue id source. Default randomUUID.
|
|
223
|
+
* @returns {Promise<{issueId: string, branch: string, created: boolean, existed: boolean, linked?: boolean, label?: string}|null>}
|
|
224
|
+
* The backing issue descriptor, or null when the branch is skipped or the kernel is unavailable.
|
|
225
|
+
*/
|
|
226
|
+
async function ensureBackingIssue(options = {}) {
|
|
227
|
+
try {
|
|
228
|
+
const {
|
|
229
|
+
branch,
|
|
230
|
+
projectRoot,
|
|
231
|
+
worktreePath,
|
|
232
|
+
gitCommonDir,
|
|
233
|
+
actor = process.env.FORGE_ACTOR || 'forge',
|
|
234
|
+
protectedBranches = DEFAULT_PROTECTED_BRANCHES,
|
|
235
|
+
ignoreGlobs = DEFAULT_IGNORE_GLOBS,
|
|
236
|
+
now = () => new Date(),
|
|
237
|
+
generateId = randomUUID,
|
|
238
|
+
} = options;
|
|
239
|
+
|
|
240
|
+
// 1. Only track real units of work.
|
|
241
|
+
const classification = classifyBranch(branch, { protectedBranches, ignoreGlobs });
|
|
242
|
+
if (classification.skip) return null;
|
|
243
|
+
|
|
244
|
+
// 2. Kernel must be present + usable, else degrade (non-kernel backend / offline).
|
|
245
|
+
const { driver, broker } = resolveKernel(options);
|
|
246
|
+
if (!driverIsUsable(driver) || !brokerIsUsable(broker)) return null;
|
|
247
|
+
|
|
248
|
+
const linkParams = { projectRoot, worktreePath, gitCommonDir, branch, actor, now };
|
|
249
|
+
|
|
250
|
+
// 3. Idempotency: an existing branch->issue link wins (the common, cheap case).
|
|
251
|
+
const existing = findExistingLink(driver, { worktreePath, branch });
|
|
252
|
+
if (existing) {
|
|
253
|
+
return { issueId: existing.issue_id, branch, created: false, existed: true };
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// 4. Dedupe: if the branch encodes an existing issue id, link that instead of
|
|
257
|
+
// minting a stub.
|
|
258
|
+
const encodedId = extractEncodedIssueId(branch);
|
|
259
|
+
if (encodedId && typeof driver.loadKernelEntity === 'function') {
|
|
260
|
+
let entity = null;
|
|
261
|
+
try {
|
|
262
|
+
entity = await driver.loadKernelEntity('issue', encodedId);
|
|
263
|
+
} catch {
|
|
264
|
+
entity = null;
|
|
265
|
+
}
|
|
266
|
+
if (entity) {
|
|
267
|
+
// Report link persistence honestly: if registerWorktree failed (returns null),
|
|
268
|
+
// linked:false surfaces that the branch->issue link did NOT persist, so the
|
|
269
|
+
// idempotency guarantee is degraded (a later call may re-create) rather than
|
|
270
|
+
// silently claiming success. Callers/hooks can warn on linked:false.
|
|
271
|
+
const linked = linkBranchToIssue(driver, { ...linkParams, issueId: encodedId });
|
|
272
|
+
return { issueId: encodedId, branch, created: false, existed: true, linked: linked !== null };
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// 5. Create a good-enough stub, then link the branch to it.
|
|
277
|
+
const issueId = generateId();
|
|
278
|
+
const title = deriveTitle(branch);
|
|
279
|
+
const body = `Auto-created stub for branch ${branch} — enrich with design/acceptance.`;
|
|
280
|
+
const createResult = await broker.runIssueOperation(
|
|
281
|
+
'create',
|
|
282
|
+
['--id', issueId, '--title', title, '--body', body, '--label', AUTO_STUB_LABEL, '--type', 'task', '--status', 'open'],
|
|
283
|
+
{ actor, origin: 'forge-autotrack', idempotencyKey: `issue.create:${issueId}` },
|
|
284
|
+
);
|
|
285
|
+
if (createResult && createResult.ok === false) return null;
|
|
286
|
+
|
|
287
|
+
const linked = linkBranchToIssue(driver, { ...linkParams, issueId });
|
|
288
|
+
return { issueId, branch, created: true, existed: false, linked: linked !== null, label: AUTO_STUB_LABEL };
|
|
289
|
+
} catch {
|
|
290
|
+
// Best-effort: a hook must never be broken by tracking. Degrade to null.
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
module.exports = {
|
|
296
|
+
ensureBackingIssue,
|
|
297
|
+
// Exported for focused unit tests / reuse by PR2-PR4 surfaces.
|
|
298
|
+
classifyBranch,
|
|
299
|
+
deriveTitle,
|
|
300
|
+
extractEncodedIssueId,
|
|
301
|
+
matchesIgnoreGlob,
|
|
302
|
+
DEFAULT_PROTECTED_BRANCHES,
|
|
303
|
+
DEFAULT_IGNORE_GLOBS,
|
|
304
|
+
AUTO_STUB_LABEL,
|
|
305
|
+
};
|