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/docs/VALIDATION.md
DELETED
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
# Validation & Enforcement
|
|
2
|
-
|
|
3
|
-
Forge includes built-in validation and TDD enforcement to ensure quality and consistency.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
- [Git Hooks](#git-hooks)
|
|
8
|
-
- [Validation CLI](#validation-cli)
|
|
9
|
-
- [Validators by Stage](#validators-by-stage)
|
|
10
|
-
- [Override Mechanisms](#override-mechanisms)
|
|
11
|
-
- [Configuration](#configuration)
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Git Hooks
|
|
16
|
-
|
|
17
|
-
Forge uses [Lefthook](https://github.com/evilmartians/lefthook) for fast, language-agnostic git hooks.
|
|
18
|
-
|
|
19
|
-
### Pre-Commit Hook
|
|
20
|
-
|
|
21
|
-
**Purpose**: Enforce TDD by blocking commits of source code without tests.
|
|
22
|
-
|
|
23
|
-
**Trigger**: Before every commit
|
|
24
|
-
|
|
25
|
-
**Checks**:
|
|
26
|
-
- Detects staged source files (`.js`, `.ts`, `.py`, `.go`, `.java`, `.rb`, etc.)
|
|
27
|
-
- Verifies corresponding test files exist (`.test.js`, `.spec.ts`, etc.)
|
|
28
|
-
- Excludes config files, test files, and documentation
|
|
29
|
-
|
|
30
|
-
**Behavior**:
|
|
31
|
-
When source code lacks tests, offers guided recovery:
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
⚠️ Looks like you're committing source code without tests:
|
|
35
|
-
|
|
36
|
-
- src/user-service.js
|
|
37
|
-
|
|
38
|
-
📋 TDD Reminder:
|
|
39
|
-
Write tests BEFORE implementation (RED-GREEN-REFACTOR)
|
|
40
|
-
|
|
41
|
-
What would you like to do?
|
|
42
|
-
1. Unstage source files (keep tests staged)
|
|
43
|
-
2. Continue anyway (I have a good reason)
|
|
44
|
-
3. Abort commit (let me add tests)
|
|
45
|
-
|
|
46
|
-
Your choice (1-3):
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
**Override**:
|
|
50
|
-
```bash
|
|
51
|
-
git commit --no-verify # Skip in emergencies
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Pre-Push Hook
|
|
55
|
-
|
|
56
|
-
**Purpose**: Ensure all tests pass before pushing to remote.
|
|
57
|
-
|
|
58
|
-
**Trigger**: Before every push
|
|
59
|
-
|
|
60
|
-
**Checks**:
|
|
61
|
-
- Runs `bun test`
|
|
62
|
-
- Verifies all tests pass
|
|
63
|
-
|
|
64
|
-
**Override**:
|
|
65
|
-
```bash
|
|
66
|
-
LEFTHOOK=0 git push # Skip all hooks
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
---
|
|
70
|
-
|
|
71
|
-
## Validation CLI
|
|
72
|
-
|
|
73
|
-
The `forge-preflight` CLI checks prerequisites for each workflow stage.
|
|
74
|
-
|
|
75
|
-
### Usage
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
forge-preflight <command>
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### Commands
|
|
82
|
-
|
|
83
|
-
| Command | Purpose | When to Use |
|
|
84
|
-
|---------|---------|-------------|
|
|
85
|
-
| `status` | Check project prerequisites | Setup, onboarding |
|
|
86
|
-
| `dev` | Validate before `/dev` | Before implementation |
|
|
87
|
-
| `ship` | Validate before `/ship` | Before creating PR |
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## Validators by Stage
|
|
92
|
-
|
|
93
|
-
### `forge-preflight status`
|
|
94
|
-
|
|
95
|
-
**Purpose**: Check basic project setup
|
|
96
|
-
|
|
97
|
-
**Checks**:
|
|
98
|
-
- ✓ Git repository initialized
|
|
99
|
-
- ✓ `package.json` exists
|
|
100
|
-
- ✓ Test framework configured (`bun test` script)
|
|
101
|
-
- ✓ Node.js installed
|
|
102
|
-
|
|
103
|
-
**Example**:
|
|
104
|
-
```bash
|
|
105
|
-
$ forge-preflight status
|
|
106
|
-
|
|
107
|
-
Checking project prerequisites...
|
|
108
|
-
|
|
109
|
-
Validation Results:
|
|
110
|
-
|
|
111
|
-
✓ Git repository
|
|
112
|
-
✓ package.json exists
|
|
113
|
-
✓ Test framework configured
|
|
114
|
-
✓ Node.js installed
|
|
115
|
-
|
|
116
|
-
✅ All checks passed!
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
### `forge-preflight dev`
|
|
122
|
-
|
|
123
|
-
**Purpose**: Validate before starting implementation (`/dev`)
|
|
124
|
-
|
|
125
|
-
**Checks**:
|
|
126
|
-
- ✓ On feature branch (`feat/*`, `fix/*`, `docs/*`)
|
|
127
|
-
- ✓ Plan file exists (`docs/plans/*.md`)
|
|
128
|
-
- ✓ Research file exists (`docs/research/*.md`)
|
|
129
|
-
- ✓ Test directory exists
|
|
130
|
-
|
|
131
|
-
**Example**:
|
|
132
|
-
```bash
|
|
133
|
-
$ forge-preflight dev
|
|
134
|
-
|
|
135
|
-
Validating prerequisites for /dev stage...
|
|
136
|
-
|
|
137
|
-
Validation Results:
|
|
138
|
-
|
|
139
|
-
✓ On feature branch
|
|
140
|
-
✓ Plan file exists
|
|
141
|
-
✓ Research file exists
|
|
142
|
-
✓ Test directory exists
|
|
143
|
-
|
|
144
|
-
✅ All checks passed!
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
**Failed Example**:
|
|
148
|
-
```bash
|
|
149
|
-
$ forge-preflight dev
|
|
150
|
-
|
|
151
|
-
Validating prerequisites for /dev stage...
|
|
152
|
-
|
|
153
|
-
Validation Results:
|
|
154
|
-
|
|
155
|
-
✗ On feature branch
|
|
156
|
-
Not on a feature branch. Create one: git checkout -b feat/your-feature
|
|
157
|
-
✓ Plan file exists
|
|
158
|
-
✗ Research file exists
|
|
159
|
-
No research file found in docs/research/. Run: /research
|
|
160
|
-
|
|
161
|
-
❌ Some checks failed. Please fix the issues above.
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
### `forge-preflight ship`
|
|
167
|
-
|
|
168
|
-
**Purpose**: Validate before creating PR (`/ship`)
|
|
169
|
-
|
|
170
|
-
**Checks**:
|
|
171
|
-
- ✓ Tests exist (`.test.js`, `.spec.ts` files)
|
|
172
|
-
- ✓ Tests pass (`bun test` succeeds)
|
|
173
|
-
- ✓ Documentation updated (`README.md` or `docs/`)
|
|
174
|
-
- ✓ No uncommitted changes
|
|
175
|
-
|
|
176
|
-
**Example**:
|
|
177
|
-
```bash
|
|
178
|
-
$ forge-preflight ship
|
|
179
|
-
|
|
180
|
-
Validating prerequisites for /ship stage...
|
|
181
|
-
|
|
182
|
-
Validation Results:
|
|
183
|
-
|
|
184
|
-
✓ Tests exist
|
|
185
|
-
✓ Tests pass
|
|
186
|
-
✓ Documentation updated
|
|
187
|
-
✓ No uncommitted changes
|
|
188
|
-
|
|
189
|
-
✅ All checks passed!
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
## Override Mechanisms
|
|
195
|
-
|
|
196
|
-
### Git Hooks
|
|
197
|
-
|
|
198
|
-
**Emergency Override** (use sparingly):
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
# Skip pre-commit hook
|
|
202
|
-
git commit --no-verify -m "Emergency hotfix"
|
|
203
|
-
|
|
204
|
-
# Skip pre-push hook
|
|
205
|
-
LEFTHOOK=0 git push
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
**When to use**:
|
|
209
|
-
- Emergency hotfixes
|
|
210
|
-
- Work-in-progress commits (before pushing)
|
|
211
|
-
- Non-code commits (docs, config)
|
|
212
|
-
|
|
213
|
-
**When NOT to use**:
|
|
214
|
-
- Regular development
|
|
215
|
-
- Public repositories
|
|
216
|
-
- Production deployments
|
|
217
|
-
|
|
218
|
-
### Validation CLI
|
|
219
|
-
|
|
220
|
-
The CLI provides guidance but doesn't block actions. You can proceed manually if checks fail.
|
|
221
|
-
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
## Configuration
|
|
225
|
-
|
|
226
|
-
### Lefthook Configuration
|
|
227
|
-
|
|
228
|
-
Edit `lefthook.yml` to customize hooks:
|
|
229
|
-
|
|
230
|
-
```yaml
|
|
231
|
-
pre-commit:
|
|
232
|
-
commands:
|
|
233
|
-
tdd-check:
|
|
234
|
-
run: node .forge/hooks/check-tdd.js
|
|
235
|
-
stage_fixed: false
|
|
236
|
-
tags: tdd
|
|
237
|
-
glob: "*.{js,ts,jsx,tsx,py,go,java,rb}"
|
|
238
|
-
|
|
239
|
-
pre-push:
|
|
240
|
-
commands:
|
|
241
|
-
tests:
|
|
242
|
-
run: bun test
|
|
243
|
-
tags: tests
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
**Options**:
|
|
247
|
-
- `run`: Command to execute
|
|
248
|
-
- `stage_fixed`: Auto-stage modified files (false = safer)
|
|
249
|
-
- `tags`: Categorize hooks
|
|
250
|
-
- `glob`: File patterns to trigger hook
|
|
251
|
-
|
|
252
|
-
### Custom Test Patterns
|
|
253
|
-
|
|
254
|
-
Edit `.forge/hooks/check-tdd.js` to add custom test patterns:
|
|
255
|
-
|
|
256
|
-
```javascript
|
|
257
|
-
// Around line 72
|
|
258
|
-
const testPatterns = [
|
|
259
|
-
`${basename}.test${ext}`,
|
|
260
|
-
`${basename}.spec${ext}`,
|
|
261
|
-
`test/${basename}.test${ext}`,
|
|
262
|
-
`tests/${basename}.test${ext}`,
|
|
263
|
-
`__tests__/${basename}.test${ext}`,
|
|
264
|
-
// Add custom patterns here
|
|
265
|
-
`${dir}/__tests__/${basename}${ext}`,
|
|
266
|
-
`spec/${basename}_spec${ext}`, // RSpec style
|
|
267
|
-
];
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
### Validation CLI Customization
|
|
271
|
-
|
|
272
|
-
Edit `bin/forge-preflight.js` to add custom validators:
|
|
273
|
-
|
|
274
|
-
```javascript
|
|
275
|
-
function validateCustomStage() {
|
|
276
|
-
console.log('Validating custom stage...\n');
|
|
277
|
-
|
|
278
|
-
check('Custom check', () => {
|
|
279
|
-
// Your validation logic
|
|
280
|
-
return true;
|
|
281
|
-
}, 'Custom error message');
|
|
282
|
-
|
|
283
|
-
return printResults();
|
|
284
|
-
}
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
---
|
|
288
|
-
|
|
289
|
-
## Installation
|
|
290
|
-
|
|
291
|
-
Hooks are automatically installed when you run:
|
|
292
|
-
|
|
293
|
-
```bash
|
|
294
|
-
# Install lefthook (one-time)
|
|
295
|
-
bun add -d lefthook
|
|
296
|
-
|
|
297
|
-
# Set up Forge
|
|
298
|
-
bunx forge setup
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
The hooks will be automatically installed in your project's `.git/hooks/` directory.
|
|
302
|
-
|
|
303
|
-
**Manual installation** (if needed):
|
|
304
|
-
|
|
305
|
-
```bash
|
|
306
|
-
# If you prefer global installation
|
|
307
|
-
bun install -g lefthook
|
|
308
|
-
|
|
309
|
-
# Install hooks
|
|
310
|
-
lefthook install
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
---
|
|
314
|
-
|
|
315
|
-
## Troubleshooting
|
|
316
|
-
|
|
317
|
-
### Hooks not running
|
|
318
|
-
|
|
319
|
-
```bash
|
|
320
|
-
# Check lefthook installation
|
|
321
|
-
lefthook version
|
|
322
|
-
|
|
323
|
-
# Reinstall hooks
|
|
324
|
-
lefthook install
|
|
325
|
-
|
|
326
|
-
# Check git hooks directory
|
|
327
|
-
ls -la .git/hooks/
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
### False positives
|
|
331
|
-
|
|
332
|
-
If the hook incorrectly flags a file:
|
|
333
|
-
|
|
334
|
-
1. **Short-term**: Use `--no-verify` to skip
|
|
335
|
-
2. **Long-term**: Update exclusion patterns in `.forge/hooks/check-tdd.js`
|
|
336
|
-
|
|
337
|
-
### Tests failing on push
|
|
338
|
-
|
|
339
|
-
```bash
|
|
340
|
-
# Run tests locally
|
|
341
|
-
bun test
|
|
342
|
-
|
|
343
|
-
# Fix failures, then
|
|
344
|
-
git push
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
---
|
|
348
|
-
|
|
349
|
-
## Best Practices
|
|
350
|
-
|
|
351
|
-
1. **Write tests first**: Let the hooks guide you to TDD
|
|
352
|
-
2. **Don't abuse overrides**: Only use `--no-verify` in emergencies
|
|
353
|
-
3. **Keep tests fast**: Pre-push hooks run on every push
|
|
354
|
-
4. **Document exceptions**: If you override, explain why in commit message
|
|
355
|
-
5. **Update validators**: Customize for your project's needs
|
|
356
|
-
|
|
357
|
-
---
|
|
358
|
-
|
|
359
|
-
## See Also
|
|
360
|
-
|
|
361
|
-
- [Workflow Guide](../AGENTS.md) - Complete 7-stage workflow
|
|
362
|
-
- [TDD Guide](../CLAUDE.md) - TDD principles and practices
|
|
363
|
-
- [Lefthook Docs](https://github.com/evilmartians/lefthook) - Full hook configuration
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "cline",
|
|
3
|
-
"name": "Cline",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "VS Code agent extension",
|
|
6
|
-
"homepage": "https://github.com/cline/cline",
|
|
7
|
-
"capabilities": {
|
|
8
|
-
"commands": true,
|
|
9
|
-
"skills": false,
|
|
10
|
-
"hooks": false
|
|
11
|
-
},
|
|
12
|
-
"directories": {
|
|
13
|
-
"workflows": ".cline/workflows"
|
|
14
|
-
},
|
|
15
|
-
"files": {
|
|
16
|
-
"rootConfig": ".clinerules"
|
|
17
|
-
},
|
|
18
|
-
"support": {
|
|
19
|
-
"status": "deprecated",
|
|
20
|
-
"surface": "editor-native",
|
|
21
|
-
"install": {
|
|
22
|
-
"required": false,
|
|
23
|
-
"repairRequired": false
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
"setup": {
|
|
27
|
-
"copyCommands": true
|
|
28
|
-
}
|
|
29
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "copilot",
|
|
3
|
-
"name": "GitHub Copilot",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "GitHub's AI assistant with native instructions and prompts",
|
|
6
|
-
"homepage": "https://github.com/features/copilot",
|
|
7
|
-
"capabilities": {
|
|
8
|
-
"commands": true,
|
|
9
|
-
"skills": false,
|
|
10
|
-
"hooks": false
|
|
11
|
-
},
|
|
12
|
-
"directories": {
|
|
13
|
-
"prompts": ".github/prompts",
|
|
14
|
-
"instructions": ".github/instructions"
|
|
15
|
-
},
|
|
16
|
-
"files": {
|
|
17
|
-
"rootConfig": ".github/copilot-instructions.md"
|
|
18
|
-
},
|
|
19
|
-
"setup": {
|
|
20
|
-
"needsConversion": true,
|
|
21
|
-
"promptFormat": true,
|
|
22
|
-
"customSetup": "copilot"
|
|
23
|
-
}
|
|
24
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "kilocode",
|
|
3
|
-
"name": "Kilo Code",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "VS Code extension with native workflows, rules, and skills",
|
|
6
|
-
"homepage": "https://marketplace.visualstudio.com/items?itemName=kilo-code",
|
|
7
|
-
"capabilities": {
|
|
8
|
-
"commands": true,
|
|
9
|
-
"skills": true,
|
|
10
|
-
"hooks": false
|
|
11
|
-
},
|
|
12
|
-
"directories": {
|
|
13
|
-
"workflows": ".kilocode/workflows",
|
|
14
|
-
"rules": ".kilocode/rules",
|
|
15
|
-
"skills": ".kilocode/skills/forge-workflow"
|
|
16
|
-
},
|
|
17
|
-
"setup": {
|
|
18
|
-
"copyRules": true,
|
|
19
|
-
"createSkill": true,
|
|
20
|
-
"needsConversion": true
|
|
21
|
-
}
|
|
22
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "opencode",
|
|
3
|
-
"name": "OpenCode",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "Open-source agent with native config and agent definitions",
|
|
6
|
-
"homepage": "https://opencode.ai",
|
|
7
|
-
"capabilities": {
|
|
8
|
-
"commands": true,
|
|
9
|
-
"skills": false,
|
|
10
|
-
"hooks": false
|
|
11
|
-
},
|
|
12
|
-
"directories": {
|
|
13
|
-
"commands": ".opencode/commands",
|
|
14
|
-
"agents": ".opencode/agents"
|
|
15
|
-
},
|
|
16
|
-
"files": {
|
|
17
|
-
"rootConfig": "opencode.json"
|
|
18
|
-
},
|
|
19
|
-
"setup": {
|
|
20
|
-
"copyCommands": true,
|
|
21
|
-
"customSetup": "opencode"
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "roo",
|
|
3
|
-
"name": "Roo Code",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "Cline fork with modes",
|
|
6
|
-
"homepage": "https://github.com/roocode/roo",
|
|
7
|
-
"capabilities": {
|
|
8
|
-
"commands": true,
|
|
9
|
-
"skills": false,
|
|
10
|
-
"hooks": false
|
|
11
|
-
},
|
|
12
|
-
"directories": {
|
|
13
|
-
"commands": ".roo/commands"
|
|
14
|
-
},
|
|
15
|
-
"files": {
|
|
16
|
-
"rootConfig": ".roorules"
|
|
17
|
-
},
|
|
18
|
-
"support": {
|
|
19
|
-
"status": "deprecated",
|
|
20
|
-
"surface": "editor-native",
|
|
21
|
-
"install": {
|
|
22
|
-
"required": false,
|
|
23
|
-
"repairRequired": false
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
"setup": {
|
|
27
|
-
"copyCommands": true,
|
|
28
|
-
"needsConversion": true
|
|
29
|
-
}
|
|
30
|
-
}
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Beads health check smoke test.
|
|
3
|
-
*
|
|
4
|
-
* After Beads init, runs a quick create/close/sync/cleanup cycle to verify
|
|
5
|
-
* the installation is functional.
|
|
6
|
-
*
|
|
7
|
-
* @module beads-health-check
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const { execFileSync } = require('node:child_process');
|
|
11
|
-
const fs = require('node:fs');
|
|
12
|
-
const path = require('node:path');
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* @typedef {Object} HealthCheckResult
|
|
16
|
-
* @property {boolean} healthy - Whether Beads is operational
|
|
17
|
-
* @property {string|null} failedStep - Which step failed: 'create'|'close'|'sync'|'cleanup', or null
|
|
18
|
-
* @property {string|null} error - Error message if unhealthy, null otherwise
|
|
19
|
-
* @property {string} [warning] - Non-fatal warning message (e.g. sync or cleanup issues)
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Parse the issue ID from `bd create` stdout.
|
|
24
|
-
*
|
|
25
|
-
* Expects output like "Created issue: forge-xxxx".
|
|
26
|
-
*
|
|
27
|
-
* @param {string} output - stdout from `bd create`
|
|
28
|
-
* @returns {string|null} The issue ID, or null if not found
|
|
29
|
-
*/
|
|
30
|
-
function parseIssueId(output) {
|
|
31
|
-
const match = /Created\s+issue:\s*([\w-]+)/i.exec(output);
|
|
32
|
-
return match ? match[1].trim() : null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Remove a test issue from the JSONL file by its ID.
|
|
37
|
-
* Silently ignores errors (file missing, locked, malformed lines).
|
|
38
|
-
*
|
|
39
|
-
* @param {string} jsonlPath - Absolute path to the issues.jsonl file
|
|
40
|
-
* @param {string|null} issueId - The issue ID to remove
|
|
41
|
-
*/
|
|
42
|
-
function cleanupTestIssue(jsonlPath, issueId) {
|
|
43
|
-
if (!issueId) return;
|
|
44
|
-
const raw = fs.readFileSync(jsonlPath, 'utf8');
|
|
45
|
-
const lines = raw.split('\n').filter(Boolean);
|
|
46
|
-
const filtered = lines.filter((line) => {
|
|
47
|
-
try { return JSON.parse(line).id !== issueId; } catch (_e) { /* Expected: malformed JSONL line — keep it as-is */ return true; }
|
|
48
|
-
});
|
|
49
|
-
fs.writeFileSync(jsonlPath, filtered.length > 0 ? filtered.join('\n') + '\n' : '');
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Run a Beads health check smoke test.
|
|
54
|
-
*
|
|
55
|
-
* Creates a temporary issue, closes it, syncs, then cleans up the JSONL file.
|
|
56
|
-
* Uses dependency injection for the exec function to support testing.
|
|
57
|
-
*
|
|
58
|
-
* @param {string} projectRoot - Absolute path to the project root
|
|
59
|
-
* @param {Object} [options={}] - Options
|
|
60
|
-
* @param {Function} [options._exec] - Injectable exec function (defaults to execFileSync)
|
|
61
|
-
* @returns {HealthCheckResult}
|
|
62
|
-
*/
|
|
63
|
-
function beadsHealthCheck(projectRoot, options = {}) {
|
|
64
|
-
const exec = options._exec || execFileSync;
|
|
65
|
-
const execOpts = { cwd: projectRoot, encoding: 'utf8' };
|
|
66
|
-
|
|
67
|
-
/** @type {string|undefined} */
|
|
68
|
-
let warning;
|
|
69
|
-
|
|
70
|
-
// Step a: Create a test issue
|
|
71
|
-
/** @type {string|null} */
|
|
72
|
-
let issueId;
|
|
73
|
-
try {
|
|
74
|
-
const createOutput = exec('bd', [
|
|
75
|
-
'create',
|
|
76
|
-
'--title=Setup verification',
|
|
77
|
-
'--type=task',
|
|
78
|
-
'--priority=4'
|
|
79
|
-
], execOpts);
|
|
80
|
-
|
|
81
|
-
issueId = parseIssueId(createOutput);
|
|
82
|
-
if (!issueId) {
|
|
83
|
-
return {
|
|
84
|
-
healthy: false,
|
|
85
|
-
failedStep: 'create',
|
|
86
|
-
error: 'Could not parse issue ID from bd create output'
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
} catch (err) {
|
|
90
|
-
return {
|
|
91
|
-
healthy: false,
|
|
92
|
-
failedStep: 'create',
|
|
93
|
-
error: err.message
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Step b: Close the test issue
|
|
98
|
-
try {
|
|
99
|
-
exec('bd', [
|
|
100
|
-
'close',
|
|
101
|
-
issueId,
|
|
102
|
-
'--reason=Setup smoke test'
|
|
103
|
-
], execOpts);
|
|
104
|
-
} catch (err) {
|
|
105
|
-
// Best-effort cleanup: remove the test issue from JSONL so it doesn't leak
|
|
106
|
-
try {
|
|
107
|
-
cleanupTestIssue(path.join(projectRoot, '.beads', 'issues.jsonl'), issueId);
|
|
108
|
-
} catch (_cleanupErr) {
|
|
109
|
-
// Expected: JSONL cleanup may fail if file is locked or missing — nothing more we can do
|
|
110
|
-
}
|
|
111
|
-
return {
|
|
112
|
-
healthy: false,
|
|
113
|
-
failedStep: 'close',
|
|
114
|
-
error: err.message
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Step c: Sync (may fail without a remote -- that's OK)
|
|
119
|
-
try {
|
|
120
|
-
exec('bd', ['sync'], execOpts);
|
|
121
|
-
} catch (syncErr) {
|
|
122
|
-
// Sync failure is non-fatal (no remote configured is common)
|
|
123
|
-
warning = `bd sync warning: ${syncErr.message}`;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Step d: Remove the test issue from JSONL
|
|
127
|
-
try {
|
|
128
|
-
cleanupTestIssue(path.join(projectRoot, '.beads', 'issues.jsonl'), issueId);
|
|
129
|
-
} catch (cleanupErr) {
|
|
130
|
-
// Cleanup failure is non-fatal
|
|
131
|
-
const cleanupWarning = `cleanup warning: ${cleanupErr.message}`;
|
|
132
|
-
warning = warning ? `${warning}; ${cleanupWarning}` : cleanupWarning;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
healthy: true,
|
|
137
|
-
failedStep: null,
|
|
138
|
-
error: null,
|
|
139
|
-
...(warning ? { warning } : {})
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
module.exports = { beadsHealthCheck, parseIssueId };
|