forge-workflow 0.0.10 → 0.1.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +82 -5
- package/.forge/hooks/forge-native-hook.js +431 -0
- package/.forge/protected-paths.yaml +157 -0
- package/AGENTS.md +151 -61
- package/CHANGELOG.md +709 -0
- package/CLAUDE.md +9 -118
- package/QUICKSTART.md +175 -0
- package/README.md +275 -365
- package/bin/forge-cmd.js +120 -9
- package/bin/forge-preflight.js +26 -5
- package/bin/forge.js +532 -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/forge/TOOLCHAIN.md +670 -0
- 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 +121 -0
- package/docs/guides/SUPPORT.md +190 -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 +214 -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/{TOOLCHAIN.md → reference/TOOLCHAIN.md} +62 -47
- 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 +155 -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/activation/ensure-forge-home.js +135 -0
- package/lib/adapter-cli.js +307 -0
- package/lib/adapters/beads-issue-adapter.js +127 -0
- package/lib/adapters/beads-kernel-compat.js +1109 -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 +139 -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-detect.js +60 -0
- package/lib/beads-nudge.js +91 -0
- package/lib/beads-setup.js +121 -0
- package/lib/beads-sync-scaffold.js +25 -101
- package/lib/codex-skills.js +51 -1
- package/lib/commands/_aliases.js +248 -0
- package/lib/commands/_issue.js +780 -77
- package/lib/commands/_manifest.js +93 -0
- package/lib/commands/_registry.js +99 -34
- package/lib/commands/_resolve-command-opts.js +230 -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 +209 -0
- package/lib/commands/hooks.js +377 -0
- package/lib/commands/inbox.js +118 -0
- package/lib/commands/init.js +604 -0
- package/lib/commands/insights.js +79 -0
- package/lib/commands/issue.js +12 -1
- package/lib/commands/issues.js +17 -0
- package/lib/commands/lint.js +5 -0
- package/lib/commands/list.js +2 -2
- package/lib/commands/memory.js +81 -0
- package/lib/commands/merge.js +312 -0
- package/lib/commands/migrate.js +362 -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 +481 -29
- package/lib/commands/pr.js +88 -0
- package/lib/commands/preflight.js +211 -0
- package/lib/commands/prime.js +13 -0
- package/lib/commands/push.js +135 -2
- package/lib/commands/ready.js +2 -2
- package/lib/commands/recall.js +171 -0
- package/lib/commands/recap.js +75 -0
- package/lib/commands/recommend.js +0 -1
- package/lib/commands/release.js +104 -0
- package/lib/commands/remember.js +140 -0
- package/lib/commands/role.js +99 -0
- package/lib/commands/serve.js +581 -0
- package/lib/commands/setup.js +900 -971
- package/lib/commands/shepherd.js +501 -0
- package/lib/commands/ship.js +59 -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 +158 -21
- package/lib/commands/sync.js +34 -46
- package/lib/commands/team.js +4 -1
- package/lib/commands/test.js +43 -27
- package/lib/commands/update.js +2 -2
- package/lib/commands/upgrade.js +47 -0
- package/lib/commands/validate.js +43 -18
- package/lib/commands/worktree.js +362 -99
- package/lib/config-writer.js +202 -0
- package/lib/control-plane.js +236 -0
- package/lib/core/runtime-graph.js +977 -0
- package/lib/dep-guard/keyword-ripple.js +2 -2
- package/lib/deprecated-sync-cleanup.js +362 -0
- package/lib/detect-agent.js +2 -28
- package/lib/detect-worktree.js +35 -9
- 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 +382 -11
- package/lib/forge-lock.js +262 -0
- package/lib/gate-events.js +192 -0
- package/lib/global-flags.js +104 -0
- package/lib/greptile-match.js +7 -63
- package/lib/grounding/context-events.js +230 -0
- package/lib/grounding/read-first.js +112 -0
- package/lib/harness-capability-matrix.js +380 -0
- package/lib/hook-global-installer.js +347 -0
- package/lib/hook-renderer.js +541 -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/kernel/backing-issue.js +311 -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/owned-kernel.js +43 -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 +2540 -0
- package/lib/kernel/taxonomy-validator.js +394 -0
- package/lib/lefthook-check.js +3 -2
- 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/auto-actions.js +175 -0
- package/lib/pr-monitor/differ.js +195 -0
- package/lib/pr-monitor/digest.js +206 -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 +192 -0
- package/lib/pr-monitor/upsert-sticky.js +169 -0
- package/lib/pr-monitor/watch-lifecycle.js +95 -0
- package/lib/pr-monitor/watch.js +247 -0
- package/lib/pr-pull.js +1314 -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 +99 -497
- package/lib/protected-path-manifest.js +281 -0
- package/lib/protected-state-surfaces.js +387 -0
- package/lib/release-readiness.js +2105 -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 +241 -20
- 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/scoring.js +17 -3
- package/lib/status/beads-snapshot.js +45 -2
- package/lib/status/presenter.js +169 -18
- 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 +251 -0
- package/lib/workflow/enforce-stage.js +351 -45
- package/lib/workflow/stage-transition.js +115 -0
- package/lib/workflow/stages.js +30 -6
- package/lib/workflow/state-manager.js +11 -22
- package/lib/workflow/state.js +23 -1
- package/lib/workflow-profiles.js +17 -5
- package/package.json +37 -35
- 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 +81 -57
- package/scripts/beads-upgrade-smoke.sh +24 -3
- 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.sh +22 -3
- 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 +49 -84
- 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 +50 -83
- 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/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-auto-actions.js +93 -0
- package/scripts/pr-coordinator.sh +3 -0
- package/scripts/pr-verdict-label.js +50 -0
- package/scripts/preflight-sonar.eslint.config.mjs +44 -0
- package/scripts/preflight.sh +21 -94
- package/scripts/protected-state-check.js +104 -0
- package/scripts/smart-status.sh +60 -57
- 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-utils.sh +3 -0
- package/scripts/test-ci-shard.js +13 -6
- package/scripts/test.js +95 -12
- 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} +44 -50
- 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} +132 -157
- 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/{.github/prompts/ship.prompt.md → skills/ship/SKILL.md} +81 -45
- 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/{.github/prompts/status.prompt.md → skills/status/SKILL.md} +20 -10
- 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/verify.prompt.md +0 -271
- package/.github/workflows/beads-to-github.yml +0 -89
- package/.github/workflows/github-to-beads.yml +0 -100
- 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 -281
- 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-bootstrap.js +0 -225
- package/lib/beads-health-check.js +0 -188
- package/lib/commands/commands-reset.js +0 -147
- package/opencode.json +0 -67
- package/scripts/beads-context.test.js +0 -584
- 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 -356
- package/scripts/github-beads-sync/label-mapper.mjs +0 -54
- package/scripts/github-beads-sync/mapping.mjs +0 -132
- package/scripts/github-beads-sync/reverse-sync-cli.mjs +0 -31
- package/scripts/github-beads-sync/reverse-sync.mjs +0 -162
- 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/lib/commands/test.js
CHANGED
|
@@ -27,6 +27,18 @@ const LOCKFILE_MAP = [
|
|
|
27
27
|
|
|
28
28
|
const DEFAULT_TIMEOUT = 120000;
|
|
29
29
|
const BEADS_CHECK_TIMEOUT = 3000;
|
|
30
|
+
const DIRECT_TEST_CANDIDATES = Object.freeze({
|
|
31
|
+
'bin/forge.js': [
|
|
32
|
+
'test/cli-flags.test.js',
|
|
33
|
+
'test/forge-cli-registry.test.js',
|
|
34
|
+
'test/setup-github-sync.test.js',
|
|
35
|
+
'test/setup-runtime-flags.test.js',
|
|
36
|
+
],
|
|
37
|
+
'lib/lefthook-check.js': ['test/lefthook-check.test.js', 'test/runtime-health.test.js'],
|
|
38
|
+
'lib/runtime-health.js': ['test/runtime-health.test.js'],
|
|
39
|
+
'lib/upgrade-safety.js': ['test/commands/upgrade.test.js'],
|
|
40
|
+
'scripts/test.js': ['test/scripts/test-runner.test.js'],
|
|
41
|
+
});
|
|
30
42
|
|
|
31
43
|
/**
|
|
32
44
|
* Detect the package manager by checking which lockfile exists.
|
|
@@ -115,7 +127,17 @@ function getChangedFiles(execFileSync, options = {}) {
|
|
|
115
127
|
encoding: 'utf8',
|
|
116
128
|
timeout: 5000,
|
|
117
129
|
}).trim();
|
|
118
|
-
} catch (
|
|
130
|
+
} catch (err) { // NOSONAR S2486
|
|
131
|
+
// A git-diff FAILURE is NOT the same as "no files changed": we could not
|
|
132
|
+
// determine the change set at all. Callers that must fail closed (preflight)
|
|
133
|
+
// pass { strict: true } so the error surfaces instead of masquerading as an
|
|
134
|
+
// empty list. The default path keeps the historical empty-list fallback that
|
|
135
|
+
// `forge test --affected` and the pre-push mapping rely on to run the full
|
|
136
|
+
// suite, so their semantics are unchanged.
|
|
137
|
+
if (options.strict) {
|
|
138
|
+
const reason = err && err.message ? err.message : String(err);
|
|
139
|
+
throw new Error(`git diff failed while computing changed files: ${reason}`);
|
|
140
|
+
}
|
|
119
141
|
/* intentional: git diff failed, no affected files to report */
|
|
120
142
|
return [];
|
|
121
143
|
}
|
|
@@ -152,22 +174,29 @@ function getAffectedTestFiles(projectRoot, execFileSync, fs = defaultFs, options
|
|
|
152
174
|
function getTestCandidatesForChangedFile(file) {
|
|
153
175
|
if (!file) return [];
|
|
154
176
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
if (file === 'lib/runtime-health.js') {
|
|
160
|
-
return ['test/runtime-health.test.js'];
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
if (file === 'scripts/test.js') {
|
|
164
|
-
return ['test/scripts/test-runner.test.js'];
|
|
177
|
+
const directCandidates = DIRECT_TEST_CANDIDATES[file];
|
|
178
|
+
if (directCandidates) {
|
|
179
|
+
return directCandidates;
|
|
165
180
|
}
|
|
166
181
|
|
|
167
182
|
if (file.startsWith('test/') && file.endsWith('.test.js')) {
|
|
168
183
|
return [file];
|
|
169
184
|
}
|
|
170
185
|
|
|
186
|
+
if (file === 'README.md'
|
|
187
|
+
|| file === 'QUICKSTART.md'
|
|
188
|
+
|| file === 'CHANGELOG.md'
|
|
189
|
+
|| file === 'AGENTS.md'
|
|
190
|
+
|| file === 'DEVELOPMENT.md'
|
|
191
|
+
|| file === 'docs/INDEX.md'
|
|
192
|
+
|| file === 'docs/PROJECT_DESIGN.md'
|
|
193
|
+
|| file.startsWith('docs/forge/')
|
|
194
|
+
|| file.startsWith('docs/guides/')
|
|
195
|
+
|| file.startsWith('docs/reference/')
|
|
196
|
+
|| file.startsWith('docs/work/')) {
|
|
197
|
+
return ['test/docs-consistency.test.js'];
|
|
198
|
+
}
|
|
199
|
+
|
|
171
200
|
if (file.startsWith('lib/') && file.endsWith('.js')) {
|
|
172
201
|
const relative = file.slice('lib/'.length);
|
|
173
202
|
return [`test/${relative.replace(/\.js$/, '.test.js')}`];
|
|
@@ -196,26 +225,13 @@ function getTestCandidatesForChangedFile(file) {
|
|
|
196
225
|
];
|
|
197
226
|
}
|
|
198
227
|
|
|
199
|
-
if (file.startsWith('.claude/commands/') && file.endsWith('.md')) {
|
|
200
|
-
return [
|
|
201
|
-
'test/command-sync-check.test.js',
|
|
202
|
-
'test/structural/command-sync.test.js',
|
|
203
|
-
];
|
|
204
|
-
}
|
|
205
|
-
|
|
206
228
|
if (file.startsWith('.forge/')
|
|
207
229
|
|| file.startsWith('.cursor/')
|
|
208
|
-
|| file.startsWith('.
|
|
209
|
-
|| file.startsWith('.roo/')
|
|
210
|
-
|| file.startsWith('.kilocode/')
|
|
211
|
-
|| file.startsWith('.opencode/')
|
|
212
|
-
|| file.startsWith('.codex/skills/')
|
|
213
|
-
|| file.startsWith('.github/prompts/')) {
|
|
230
|
+
|| file.startsWith('.codex/')) {
|
|
214
231
|
return [
|
|
215
232
|
'test/agent-gaps.test.js',
|
|
216
|
-
'test/command-sync-check.test.js',
|
|
217
233
|
'test/scripts/check-agents.test.js',
|
|
218
|
-
'test/structural/
|
|
234
|
+
'test/structural/skills-sync-drift.test.js',
|
|
219
235
|
];
|
|
220
236
|
}
|
|
221
237
|
|
|
@@ -227,7 +243,7 @@ module.exports = {
|
|
|
227
243
|
getAffectedTestFiles,
|
|
228
244
|
getTestCandidatesForChangedFile,
|
|
229
245
|
name: 'test',
|
|
230
|
-
description: 'Run tests with smart defaults (timeout,
|
|
246
|
+
description: 'Run tests with smart defaults (timeout, affected-only)',
|
|
231
247
|
usage: 'forge test [--affected]',
|
|
232
248
|
flags: {
|
|
233
249
|
'--affected': 'Run only tests for changed files',
|
package/lib/commands/update.js
CHANGED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
applySelfHeal,
|
|
5
|
+
buildUpgradeDryRunReport,
|
|
6
|
+
renderUpgradeDryRunReport,
|
|
7
|
+
} = require('../upgrade-safety');
|
|
8
|
+
|
|
9
|
+
function hasArg(args, name) {
|
|
10
|
+
return Array.isArray(args) && args.includes(name);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const usage = 'Usage: forge upgrade [--dry-run] [--self-heal]';
|
|
14
|
+
|
|
15
|
+
async function handler(args, flags, projectRoot) {
|
|
16
|
+
const dryRun = flags?.dryRun === true || flags?.['dry-run'] === true || hasArg(args, '--dry-run');
|
|
17
|
+
const selfHeal = flags?.selfHeal === true || flags?.['self-heal'] === true || hasArg(args, '--self-heal');
|
|
18
|
+
|
|
19
|
+
if (!dryRun && !selfHeal) {
|
|
20
|
+
return {
|
|
21
|
+
success: false,
|
|
22
|
+
error: usage,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const report = buildUpgradeDryRunReport(projectRoot);
|
|
27
|
+
const selfHealResult = selfHeal ? applySelfHeal(report.projectRoot, report) : null;
|
|
28
|
+
const output = renderUpgradeDryRunReport(report, selfHealResult);
|
|
29
|
+
const success = report.ok && !selfHealResult?.refused;
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
success,
|
|
33
|
+
output,
|
|
34
|
+
error: success ? undefined : output,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = {
|
|
39
|
+
name: 'upgrade',
|
|
40
|
+
description: 'Preview and self-heal safe Forge upgrade readiness',
|
|
41
|
+
usage,
|
|
42
|
+
flags: {
|
|
43
|
+
'--dry-run': 'Preview upgrade readiness without writing files',
|
|
44
|
+
'--self-heal': 'Apply safe metadata repairs only; does not snapshot or restore',
|
|
45
|
+
},
|
|
46
|
+
handler,
|
|
47
|
+
};
|
package/lib/commands/validate.js
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
const { execFileSync } = require('node:child_process');
|
|
12
12
|
const fs = require('node:fs');
|
|
13
13
|
const path = require('node:path');
|
|
14
|
+
const { secureExecFileSync } = require('../shell-utils');
|
|
14
15
|
|
|
15
16
|
// Constants
|
|
16
17
|
const CHECK_TYPES = {
|
|
@@ -31,15 +32,11 @@ const CONFLICT_MARKER_IGNORE_DIRS = new Set([
|
|
|
31
32
|
]);
|
|
32
33
|
const CONFLICT_MARKER_ALLOWED_DOT_DIRS = new Set([
|
|
33
34
|
'.claude',
|
|
34
|
-
'.cline',
|
|
35
35
|
'.codex',
|
|
36
36
|
'.cursor',
|
|
37
37
|
'.forge',
|
|
38
38
|
'.github',
|
|
39
39
|
'.husky',
|
|
40
|
-
'.kilocode',
|
|
41
|
-
'.opencode',
|
|
42
|
-
'.roo',
|
|
43
40
|
'.sonarlint',
|
|
44
41
|
]);
|
|
45
42
|
const CONFLICT_START_PATTERN = /^<<<<<<<(?: .*)?$/;
|
|
@@ -466,7 +463,7 @@ async function runSecurityScan() { // NOSONAR S3776
|
|
|
466
463
|
try {
|
|
467
464
|
let npmRawOutput = null;
|
|
468
465
|
try {
|
|
469
|
-
npmRawOutput =
|
|
466
|
+
npmRawOutput = secureExecFileSync('npm', ['audit', '--json', '--production'], getExecOptions()); // NOSONAR S4036 - hardcoded CLI command, no user input, developer tool context
|
|
470
467
|
} catch (npmExitError) {
|
|
471
468
|
if (npmExitError.killed && npmExitError.signal === 'SIGTERM') {
|
|
472
469
|
return {
|
|
@@ -566,23 +563,46 @@ async function runSecurityScan() { // NOSONAR S3776
|
|
|
566
563
|
* const result = await runAllTests();
|
|
567
564
|
* console.log(`${result.passed}/${result.total} tests passed`);
|
|
568
565
|
*/
|
|
569
|
-
|
|
566
|
+
function parseTestCounts(output) {
|
|
567
|
+
const text = String(output || '');
|
|
568
|
+
const passed = parseNumber(/(\d+) pass/.exec(text)); // NOSONAR S5852 - bounded \d+ pattern
|
|
569
|
+
const failed = parseNumber(/(\d+) fail/.exec(text)); // NOSONAR S5852 - bounded \d+ pattern
|
|
570
|
+
const skipped = parseNumber(/(\d+) skip/.exec(text)); // NOSONAR S5852 - bounded \d+ pattern
|
|
571
|
+
const ranMatch = /Ran (\d+) tests/.exec(text); // NOSONAR S5852 - bounded \d+ pattern
|
|
572
|
+
const total = ranMatch ? parseNumber(ranMatch, 1) : passed + failed + skipped;
|
|
573
|
+
return { passed, failed, skipped, total, testsFound: total > 0 };
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
async function runAllTests(exec = execFileSync) {
|
|
570
577
|
const startTime = Date.now();
|
|
571
578
|
|
|
572
579
|
try {
|
|
573
|
-
const result =
|
|
580
|
+
const result = exec('bun', ['test', '--timeout', '30000'], getExecOptions()); // NOSONAR S4036 - hardcoded CLI command, no user input, developer tool context
|
|
581
|
+
|
|
582
|
+
const { passed, failed, skipped, total, testsFound } = parseTestCounts(result);
|
|
574
583
|
|
|
575
|
-
//
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
584
|
+
// B2 (N1): a bun run that executes 0 tests must NEVER report PASS — that
|
|
585
|
+
// manufactures false confidence. Surface it as an explicit SKIP instead.
|
|
586
|
+
if (!testsFound) {
|
|
587
|
+
return {
|
|
588
|
+
success: true,
|
|
589
|
+
skipped: true,
|
|
590
|
+
testsFound: false,
|
|
591
|
+
duration: Date.now() - startTime,
|
|
592
|
+
passed,
|
|
593
|
+
failed,
|
|
594
|
+
total,
|
|
595
|
+
message: 'No tests found — 0 tests executed (SKIP, not a pass). Add tests or check the runner config.',
|
|
596
|
+
};
|
|
597
|
+
}
|
|
580
598
|
|
|
581
599
|
return {
|
|
582
600
|
success: failed === 0,
|
|
601
|
+
testsFound: true,
|
|
583
602
|
duration: Date.now() - startTime,
|
|
584
603
|
passed,
|
|
585
604
|
failed,
|
|
605
|
+
skipped,
|
|
586
606
|
total,
|
|
587
607
|
message: failed === 0
|
|
588
608
|
? `All ${total} tests passed`
|
|
@@ -601,28 +621,32 @@ async function runAllTests() {
|
|
|
601
621
|
};
|
|
602
622
|
}
|
|
603
623
|
|
|
604
|
-
// Test
|
|
624
|
+
// Test runner absent — say so explicitly (do NOT silently pass).
|
|
605
625
|
if (isCommandNotFound(error)) {
|
|
606
626
|
return {
|
|
607
627
|
success: true,
|
|
608
628
|
skipped: true,
|
|
629
|
+
testsFound: false,
|
|
609
630
|
duration: Date.now() - startTime,
|
|
610
631
|
passed: 0,
|
|
611
632
|
failed: 0,
|
|
612
633
|
total: 0,
|
|
613
|
-
message: 'Tests skipped: bun not found.',
|
|
634
|
+
message: 'Tests skipped: bun test runner not found. Install bun to run tests.',
|
|
614
635
|
};
|
|
615
636
|
}
|
|
616
637
|
|
|
617
638
|
// Parse test failures from output
|
|
618
639
|
const output = error.stdout || error.message;
|
|
619
|
-
const
|
|
620
|
-
const
|
|
621
|
-
|
|
622
|
-
|
|
640
|
+
const counts = parseTestCounts(output);
|
|
641
|
+
const passed = counts.passed;
|
|
642
|
+
// bun exited non-zero: if the output shows no explicit failure count, treat
|
|
643
|
+
// it as at least one failure rather than swallowing the non-zero exit.
|
|
644
|
+
const failed = counts.failed > 0 ? counts.failed : Math.max(1, counts.failed);
|
|
645
|
+
const total = counts.total > 0 ? counts.total : passed + failed + counts.skipped;
|
|
623
646
|
|
|
624
647
|
return {
|
|
625
648
|
success: false,
|
|
649
|
+
testsFound: counts.testsFound,
|
|
626
650
|
duration: Date.now() - startTime,
|
|
627
651
|
passed,
|
|
628
652
|
failed,
|
|
@@ -832,6 +856,7 @@ module.exports = {
|
|
|
832
856
|
runLint,
|
|
833
857
|
runSecurityScan,
|
|
834
858
|
runAllTests,
|
|
859
|
+
parseTestCounts,
|
|
835
860
|
scanForConflictMarkers,
|
|
836
861
|
executeValidate,
|
|
837
862
|
executeDebugMode,
|