forge-workflow 0.0.10 → 0.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +150 -61
- package/CHANGELOG.md +681 -0
- package/CLAUDE.md +9 -118
- 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 +461 -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 +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/{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 +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 +121 -0
- package/lib/beads-sync-scaffold.js +25 -101
- package/lib/codex-skills.js +51 -1
- package/lib/commands/_issue.js +741 -77
- 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 +17 -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 +0 -1
- 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 +838 -972
- 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 +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 +307 -100
- 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 +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 +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/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 +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/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 +99 -497
- 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 +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 +199 -0
- package/lib/workflow/enforce-stage.js +296 -47
- 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-coordinator.sh +3 -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
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hermes-forge
|
|
3
|
+
description: >
|
|
4
|
+
Hermes⇄Forge boundary: Hermes CONSUMES Forge state, never a second source of truth. Use
|
|
5
|
+
whenever a Hermes session runs on a Forge repo: at session start, before acting on an issue,
|
|
6
|
+
or when you need CURRENT state. Read state ONLY via `forge orient` / `forge recap
|
|
7
|
+
<issue-id>` (bounded JSON envelope), citing each source's `path`/`authority`; never
|
|
8
|
+
reconstruct it from raw stores or kernel internals. Writeback ONLY via `forge
|
|
9
|
+
comment`/`update`/`create`; NEVER leak Hermes profile or session memory into Forge state.
|
|
10
|
+
Triggers: "orient me / current project state", "where did this fact come from, cite it",
|
|
11
|
+
"orient came back truncated", "persist a decision into Forge", "safe to store in kernel
|
|
12
|
+
state?". NOT the Forge session router over stage skills (kernel), NOT the human "what stage
|
|
13
|
+
am I in" report (status), NOT everyday issue create/update/close/search CRUD (issue-basics),
|
|
14
|
+
NOT ranking the next ready issue (triage-ready), NOT live PR monitoring (shepherd—outside
|
|
15
|
+
Hermes, unseen by orient).
|
|
16
|
+
compatibility: >
|
|
17
|
+
Requires the Forge CLI (`forge`) on PATH in a Forge-initialized repo. Install
|
|
18
|
+
path — like every Forge skill pack (e.g. parallel-deep-research,
|
|
19
|
+
sonarcloud-analysis) this is delivered by the unified Skills CLI; run
|
|
20
|
+
`skills sync` to install it into `.hermes/skills/hermes-forge/`. (`forge setup`
|
|
21
|
+
initializes the skills registry via `skills init` but does not sync packs to
|
|
22
|
+
agents.) Read-only orientation works anywhere; writeback requires a Forge
|
|
23
|
+
Kernel issue backend. CLI-only — no direct file or profile writes into Forge
|
|
24
|
+
state.
|
|
25
|
+
metadata:
|
|
26
|
+
author: forge
|
|
27
|
+
version: "1.0.0"
|
|
28
|
+
roadmap: forge-2agy.9.7.x
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
# Hermes ⇄ Forge consumption contract
|
|
32
|
+
|
|
33
|
+
Hermes is a *consumer* of Forge project state, not an owner of it. This skill
|
|
34
|
+
defines how a Hermes session reads, cites, and writes back to a Forge project
|
|
35
|
+
without ever becoming a second source of truth.
|
|
36
|
+
|
|
37
|
+
The boundary between what Forge owns and what Hermes owns is specified in the
|
|
38
|
+
Forge repo at `docs/reference/HERMES_INTEGRATION.md` (repo-relative path — this
|
|
39
|
+
skill is synced to `.hermes/skills/hermes-forge/`, so relative links would not
|
|
40
|
+
resolve from the installed location).
|
|
41
|
+
|
|
42
|
+
## When to use
|
|
43
|
+
|
|
44
|
+
- At the start of any Hermes session on a Forge repo (orientation).
|
|
45
|
+
- Before acting on a specific issue (issue recap).
|
|
46
|
+
- Whenever you need current project state — never reconstruct it from raw files.
|
|
47
|
+
|
|
48
|
+
## Authority: orient / recap are the only state source
|
|
49
|
+
|
|
50
|
+
The Forge Kernel is the single source of truth. Hermes obtains project state
|
|
51
|
+
**exclusively** through two thin CLI wrappers and must not infer state by
|
|
52
|
+
reading raw issue stores, design files, or kernel internals directly:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
forge orient --json # bounded project orientation (envelope)
|
|
56
|
+
forge orient --budget 4000 --json
|
|
57
|
+
forge recap <issue-id> --json # bounded per-issue recap (envelope)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`forge orient` and `forge recap <issue-id>` emit the deterministic JSON envelope
|
|
61
|
+
described below (assembly `deterministic-file-assembly-v1`). Parse the JSON; do
|
|
62
|
+
not screen-scrape the human text form.
|
|
63
|
+
|
|
64
|
+
> Note: `forge recap` always requires an issue id — bare `forge recap --json`
|
|
65
|
+
> (no id) prints its usage and exits non-zero rather than returning a summary.
|
|
66
|
+
> Use `forge orient` for project-level orientation, or `forge recap <issue-id>`
|
|
67
|
+
> for a single issue; both emit the deterministic envelope.
|
|
68
|
+
|
|
69
|
+
### Envelope shape
|
|
70
|
+
|
|
71
|
+
| Field | Meaning |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| `schema_version` | Contract version (currently `1`). Reject unknown majors. |
|
|
74
|
+
| `kind` | `orientation`, `issue_recap`, or `prime`. |
|
|
75
|
+
| `generated_at` | Assembly timestamp. |
|
|
76
|
+
| `assembly` | `deterministic-file-assembly-v1` — same inputs ⇒ same output. |
|
|
77
|
+
| `token_budget` | Budget accounting (see below). |
|
|
78
|
+
| `sections[]` | Ordered content blocks, each independently cited. |
|
|
79
|
+
| `sources[]` | Deduplicated provenance across all sections. |
|
|
80
|
+
| `next_commands[]` | Suggested follow-up `forge` commands. Prefer these for navigation. |
|
|
81
|
+
|
|
82
|
+
Each `sections[]` entry: `{ id, title, content, sources, truncated, estimated_tokens }`.
|
|
83
|
+
|
|
84
|
+
## Token budget
|
|
85
|
+
|
|
86
|
+
`forge orient` / `forge recap <issue-id>` are bounded so they fit a context
|
|
87
|
+
window deterministically.
|
|
88
|
+
|
|
89
|
+
- Default budget: **2000** estimated tokens. Minimum honored: **40**.
|
|
90
|
+
- Estimation is approximate: `token_budget.approximate === true`,
|
|
91
|
+
`token_budget.chars_per_token === 4`.
|
|
92
|
+
- `token_budget.requested` is what you asked for; `token_budget.used` is the
|
|
93
|
+
estimate actually emitted.
|
|
94
|
+
- Raise the ceiling with `--budget N` when you need more depth; do not retry
|
|
95
|
+
blindly — request a specific larger budget.
|
|
96
|
+
|
|
97
|
+
## Citation & provenance model
|
|
98
|
+
|
|
99
|
+
Every fact Hermes surfaces to a user MUST be attributable. Each section carries
|
|
100
|
+
`sources: [{ path, source_kind, authority, role }]`:
|
|
101
|
+
|
|
102
|
+
- `path` — the file the content came from.
|
|
103
|
+
- `source_kind` — the kind of artifact (e.g. design, decision, claim, queue).
|
|
104
|
+
- `authority` — how authoritative the source is. Prefer higher-authority
|
|
105
|
+
sources when two sources conflict; surface the conflict rather than silently
|
|
106
|
+
picking one.
|
|
107
|
+
- `role` — the role the source plays in the section.
|
|
108
|
+
|
|
109
|
+
When Hermes states a project fact, cite at least the `path` and `authority` of
|
|
110
|
+
the backing source. The top-level `sources[]` is the deduplicated set for the
|
|
111
|
+
whole payload.
|
|
112
|
+
|
|
113
|
+
## Truncation policy
|
|
114
|
+
|
|
115
|
+
Truncation is deterministic, never random:
|
|
116
|
+
|
|
117
|
+
- Non-preserved sections are trimmed in the order given by
|
|
118
|
+
`token_budget.truncation_order`; when the budget is exhausted, sections later
|
|
119
|
+
in that order are trimmed first. Preserved sections are kept whole and trimmed
|
|
120
|
+
only as a last resort if the payload is still over budget. The authoritative
|
|
121
|
+
per-section signal is each section's `truncated` flag and `estimated_tokens` —
|
|
122
|
+
there is no per-section `priority` field; the overall trim order is
|
|
123
|
+
`token_budget.truncation_order`.
|
|
124
|
+
- A trimmed section ends with the literal marker
|
|
125
|
+
`[truncated deterministically by token budget]` and has `truncated: true`.
|
|
126
|
+
- `token_budget.truncated === true` means the payload as a whole was trimmed.
|
|
127
|
+
|
|
128
|
+
Treat any `truncated` section as **incomplete**. Do not present a truncated
|
|
129
|
+
section as exhaustive; if completeness matters, re-request with a higher
|
|
130
|
+
`--budget` or recap the specific issue.
|
|
131
|
+
|
|
132
|
+
## Writeback path: Hermes → Forge Kernel
|
|
133
|
+
|
|
134
|
+
Evidence and decisions discovered during a Hermes session flow back into the
|
|
135
|
+
Forge Kernel **only** through Forge CLI commands. Use the issue command surface
|
|
136
|
+
documented in the Forge repo at
|
|
137
|
+
`docs/reference/forge-kernel-issue-command-contract.md`:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
forge comment <id> <body...> # attach evidence, a decision, or a note to an issue
|
|
141
|
+
forge update <id...> [flags] # update issue state/fields
|
|
142
|
+
forge create [title] [flags] # open a new issue for follow-up work
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
> Note: `forge audit` is verify-only (`forge audit verify`) and does **not**
|
|
146
|
+
> append evidence — record evidence as an issue comment via `forge comment`.
|
|
147
|
+
|
|
148
|
+
These writes land in the Forge Kernel issue store, where they become part of the
|
|
149
|
+
issue's durable history (view them via the issue itself, e.g. `forge show <id>`).
|
|
150
|
+
Note the read/write asymmetry: the bounded `forge orient` / `forge recap`
|
|
151
|
+
envelope is assembled from project docs, `docs/work` artifacts, and the issue
|
|
152
|
+
summary — it surfaces issue/design/decision state but does **not** echo
|
|
153
|
+
individual issue comments back. Do not assume evidence added via `forge comment`
|
|
154
|
+
reappears verbatim in the next orient/recap payload; it lives in the issue
|
|
155
|
+
history, reachable from the issue record.
|
|
156
|
+
|
|
157
|
+
## No-profile-write guard (hard boundary)
|
|
158
|
+
|
|
159
|
+
Hermes **MUST NOT write Hermes profile** state, conversation memory, or any
|
|
160
|
+
Hermes-native artifact into Forge Kernel state — not into kernel storage, not
|
|
161
|
+
into design/decision files, not into the issue backend. Hermes-native memory
|
|
162
|
+
stays in Hermes' own store.
|
|
163
|
+
|
|
164
|
+
- ✅ Read state via `forge orient` / `forge recap`.
|
|
165
|
+
- ✅ Write evidence/decisions via `forge comment` / `forge update`.
|
|
166
|
+
- ❌ Never persist Hermes profile/session memory into Forge Kernel state.
|
|
167
|
+
- ❌ Never edit Forge state files directly to record Hermes-side context.
|
|
168
|
+
|
|
169
|
+
If a piece of context only matters to Hermes, it belongs in Hermes-native
|
|
170
|
+
memory. If it is a project fact, decision, or evidence item, write it through
|
|
171
|
+
the Forge CLI so it becomes part of the shared, cited source of truth.
|
|
172
|
+
|
|
173
|
+
## PR shepherd (external scheduler, not orientation)
|
|
174
|
+
|
|
175
|
+
The PR shepherd runs **outside** Hermes. An external scheduler invokes
|
|
176
|
+
`forge shepherd <pr>` as discrete bounded passes — each pass reads CI/check
|
|
177
|
+
state, takes at most one idempotent action (re-run a flaky required check), or
|
|
178
|
+
escalates, then exits. It **never merges** (the human merges in the GitHub UI)
|
|
179
|
+
and **never resolves review threads**.
|
|
180
|
+
|
|
181
|
+
Hermes does not run the shepherd and does not learn shepherd progress through
|
|
182
|
+
`forge orient` (which is deterministic-source orientation with no live PR
|
|
183
|
+
awareness). Shepherd progress is durable on the **PR itself** — its comments and
|
|
184
|
+
labels. When a Hermes session needs PR/CI status, read the PR directly; do not
|
|
185
|
+
expect `orient` to carry it.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"query": "I just started a Hermes session on this Forge repo — get me oriented on where the project stands before I touch anything.",
|
|
4
|
+
"should_trigger": true
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
"query": "The forge orient envelope came back with the active-work section flagged truncated. Can I treat that as the full list, or do I need to pull more?",
|
|
8
|
+
"should_trigger": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"query": "Before I tell the user which approach we settled on, I need to point at the exact source file and how authoritative it is — where does that decision come from?",
|
|
12
|
+
"should_trigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"query": "I uncovered a design decision in this session that the team needs to keep. What's the correct way to write it back into Forge without dragging my Hermes notes into kernel state?",
|
|
16
|
+
"should_trigger": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"query": "Default orientation is clipping the decisions section at 2000 tokens — give me more headroom.",
|
|
20
|
+
"should_trigger": true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"query": "Don't rebuild the project picture by grepping the design docs yourself — go through the proper bounded orient/recap surface instead.",
|
|
24
|
+
"should_trigger": true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"query": "Which workflow stage am I sitting in right now, and has any of my work gone stale?",
|
|
28
|
+
"should_trigger": false
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"query": "I'm kicking off a Forge session in Claude — which stage skill do I run to start planning a new feature?",
|
|
32
|
+
"should_trigger": false
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"query": "Watch PR #418, rerun the flaky required check if it trips, and ping me when it's ready to merge.",
|
|
36
|
+
"should_trigger": false
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"query": "Open a bug issue for the checkout timeout, set priority 1, and add a note about the repro steps.",
|
|
40
|
+
"should_trigger": false
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"query": "What's the highest-priority ready issue I should pick up next?",
|
|
44
|
+
"should_trigger": false
|
|
45
|
+
}
|
|
46
|
+
]
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: issue-basics
|
|
3
|
+
description: >
|
|
4
|
+
Everyday single-issue CRUD over the `forge issue` verbs:
|
|
5
|
+
create/update/show/list/search/close/reopen/comment, set priority/labels/assignee, claim or
|
|
6
|
+
release one issue, add/remove dependency edges, plus backlog `stats`. Use for ANY routine
|
|
7
|
+
one-off issue op: "create an issue/bug/task for X", "update/edit issue <id>", "close or
|
|
8
|
+
reopen this issue", "comment a handoff note on <id>", "list/filter open bugs by
|
|
9
|
+
status/label/priority", "bump this to P1", "reassign to alice", "mark <id> blocked by <id>".
|
|
10
|
+
Also the parity floor migrating off a Beads-style tracker (label/reopen/delete map to forge
|
|
11
|
+
equivalents). Single-operation plumbing only. Does NOT choose, rank, or explain the next
|
|
12
|
+
issue to work on or why it's blocked (use triage-ready); does NOT run
|
|
13
|
+
claim-then-prove-lease-ownership safety (use claim-safety); does NOT drive an issue through
|
|
14
|
+
the plan->dev->validate->ship pipeline or open a PR (use smith or stage skills); does NOT
|
|
15
|
+
report the current stage or what's in flight (use status).
|
|
16
|
+
allowed-tools: Read, Bash(forge:*)
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Issue basics — the CRUD floor
|
|
20
|
+
|
|
21
|
+
Everyday issue operations over the Forge kernel. Every command here is a real
|
|
22
|
+
`forge issue` verb (confirm with `forge issue --help`). The kernel is the single
|
|
23
|
+
source of truth — never hand-edit the issue store.
|
|
24
|
+
|
|
25
|
+
Every `--json` reply is the same envelope: `{ ok, schema_version, command, data,
|
|
26
|
+
next_commands }` on success, or `{ ok:false, error:{ message, exit_code } }` on
|
|
27
|
+
failure. **Gate on `ok`** — do not parse `data` until you confirm `ok:true`.
|
|
28
|
+
|
|
29
|
+
## The core loop
|
|
30
|
+
|
|
31
|
+
| Need | Command |
|
|
32
|
+
|------|---------|
|
|
33
|
+
| Create an issue | `forge issue create --title "…" --type <task\|bug\|epic\|decision>` |
|
|
34
|
+
| Inspect one issue | `forge issue show <id> [--json]` |
|
|
35
|
+
| List / filter issues | `forge issue list [--status … --type … --priority … --label …] [--json]` |
|
|
36
|
+
| Full-text search | `forge issue search "…" [--json]` |
|
|
37
|
+
| Backlog counts | `forge issue stats [--json]` |
|
|
38
|
+
| Claim work (DB-enforced lease) | `forge issue claim <id>` |
|
|
39
|
+
| Release a claim | `forge issue release <id>` |
|
|
40
|
+
| Update fields | `forge issue update <id> [flags]` |
|
|
41
|
+
| Add a handoff note | `forge issue comment <id> "…"` |
|
|
42
|
+
| Close (one or many) | `forge issue close <id...> --reason "…"` |
|
|
43
|
+
| Dependencies | `forge issue dep add\|remove <id> <blocks-id>` |
|
|
44
|
+
|
|
45
|
+
## Create — the flags that matter
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
forge issue create --title "Add rate limiting" --type task \
|
|
49
|
+
--priority P1 --label "feature,api,security" --assignee alice \
|
|
50
|
+
--acceptance "429 returned after N req/min; covered by a test"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
| Flag | Meaning | Default |
|
|
54
|
+
|------|---------|---------|
|
|
55
|
+
| `--title "…"` | Human title (a bare leading positional also works) | minted id |
|
|
56
|
+
| `--type <…>` | `task` · `bug` · `epic` · `decision` | `task` |
|
|
57
|
+
| `--priority <…>` | `P0`..`P4` (or bare `0`..`4`); `P0` is highest | unset |
|
|
58
|
+
| `--label "a,b"` | Comma-separated set — one flag, split on `,` (repeats do NOT accumulate) | none |
|
|
59
|
+
| `--body "…"` | Long description (`--description` is an accepted alias) | empty |
|
|
60
|
+
| `--assignee <who>` | Persistent assignee | unset |
|
|
61
|
+
| `--acceptance "…"` | Acceptance criteria (`--design`, `--notes` also persist) | unset |
|
|
62
|
+
| `--parent <id>` | Parent/epic id | none |
|
|
63
|
+
|
|
64
|
+
`--status` defaults to `open`. Status vocabulary: `open` · `in_progress` ·
|
|
65
|
+
`review` · `done` · `cancelled`. Unlike `--priority` and `--status` (which reject
|
|
66
|
+
unknown values), `--type` is stored verbatim — a non-canonical value like
|
|
67
|
+
`feature` is accepted without error but carries no kernel behaviour, so stick to
|
|
68
|
+
the four canonical types. Epics and decisions are excluded from the ready queue
|
|
69
|
+
(non-claimability is a queue convention, not enforcement — `forge issue claim`
|
|
70
|
+
currently returns `ok:true` on them too).
|
|
71
|
+
|
|
72
|
+
## Update — same field flags, plus close
|
|
73
|
+
|
|
74
|
+
`forge issue update <id>` takes `--status`, `--title`, `--body`/`--description`,
|
|
75
|
+
`--priority`, `--label` (reparents the whole set), `--parent`, `--assignee`,
|
|
76
|
+
`--acceptance`, `--design`, `--notes`. `forge issue close <id> --reason "…"`
|
|
77
|
+
records the reason on the close event and accepts multiple ids in one call.
|
|
78
|
+
|
|
79
|
+
## Migrating from a Beads-style tracker — verb disposition
|
|
80
|
+
|
|
81
|
+
Nothing you relied on silently disappears; a few verbs map onto a `forge` flag or
|
|
82
|
+
are intentionally unsupported:
|
|
83
|
+
|
|
84
|
+
| Old verb | Forge equivalent |
|
|
85
|
+
|----------|------------------|
|
|
86
|
+
| `label` (add/remove) | **No subcommand** — pass the full set via `--label "a,b"` on `create`/`update` (last-value-wins). |
|
|
87
|
+
| `reopen` | `forge issue update <id> --status open`. |
|
|
88
|
+
| `delete` | **Unsupported by design** — the kernel is append-only/event-sourced. Use `forge issue close <id> --reason "…"` instead. |
|
|
89
|
+
|
|
90
|
+
## Reliability
|
|
91
|
+
|
|
92
|
+
- **Check `ok` before trusting output.** On `ok:false`, read `error.message` and
|
|
93
|
+
fix the input rather than retrying blindly.
|
|
94
|
+
- **Claim before you mutate shared work.** `forge issue claim <id>` takes a
|
|
95
|
+
DB-enforced lease; hand off to the `claim-safety` procedure before acting on a
|
|
96
|
+
claimed issue you intend to change. `forge issue release <id>` if you abandon it.
|
|
97
|
+
- **Record decisions as comments, not memory.** `forge issue comment <id> "…"`
|
|
98
|
+
survives the session; scratch notes do not.
|
|
99
|
+
|
|
100
|
+
## Fork points
|
|
101
|
+
|
|
102
|
+
Editable conventions — set these once for your team and this skill enforces them.
|
|
103
|
+
It is a canonical source you fork, not a fixed policy.
|
|
104
|
+
|
|
105
|
+
| Knob | Default | How to change |
|
|
106
|
+
|------|---------|---------------|
|
|
107
|
+
| **Default type** | `task` (kernel default) | Decide your create convention — e.g. always pass `--label feature` for user-facing work (feature is a label, not a canonical type), `--type bug` for regressions. |
|
|
108
|
+
| **Default priority** | unset | Adopt a house scale (e.g. new work opens at `P2`, incidents at `P0`) and always pass `--priority`. |
|
|
109
|
+
| **Fields required on create** | `--title` only | Require `--acceptance` (and `--label`/`--assignee`) on every create so issues are actionable from birth. |
|
|
110
|
+
| **Id / reference convention** | kernel-minted ids | Standardize how you cite issues in commits/PRs (e.g. `Closes <id>`) and whether you pass an explicit `--id`. |
|
|
111
|
+
| **Label taxonomy** | free-form | Pin an allowed label set your team agrees on and pass it consistently via `--label "a,b"`. |
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"query": "Open a bug ticket for the checkout 500 error and mark it P0",
|
|
4
|
+
"should_trigger": true
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
"query": "Add a note to forge-abc123 documenting why we chose JWT",
|
|
8
|
+
"should_trigger": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"query": "Show me all open issues tagged backend",
|
|
12
|
+
"should_trigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"query": "Reopen forge-77, it wasn't actually fixed",
|
|
16
|
+
"should_trigger": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"query": "Add a dependency so forge-12 is blocked by forge-9",
|
|
20
|
+
"should_trigger": true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"query": "Claim forge-abc so I can start on it",
|
|
24
|
+
"should_trigger": true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"query": "What's the next ready issue I should pick up?",
|
|
28
|
+
"should_trigger": false
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"query": "Explain why forge-55 is still blocked and what to unblock first",
|
|
32
|
+
"should_trigger": false
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"query": "Claim this issue and confirm I hold the lease before I change anything",
|
|
36
|
+
"should_trigger": false
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"query": "Drive forge-30 all the way through to a merged PR",
|
|
40
|
+
"should_trigger": false
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"query": "Where am I in the workflow right now and what's in flight?",
|
|
44
|
+
"should_trigger": false
|
|
45
|
+
}
|
|
46
|
+
]
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kernel
|
|
3
|
+
description: >
|
|
4
|
+
Forge kernel — umbrella index/router for a Forge project. Reach for this FIRST when
|
|
5
|
+
orienting rather than executing: at session start, when you need the map of how the system
|
|
6
|
+
fits together, or when unsure WHICH skill or `forge` verb a task belongs to. It indexes
|
|
7
|
+
`smith` (end-to-end orchestrator), the stage ladder (plan → dev → validate → ship → review →
|
|
8
|
+
verify), the utility/issue skills, and the day-to-day `forge` CLI verbs. Trigger on "how
|
|
9
|
+
does the Forge workflow work", "which forge command or skill for X", "I'm new here, how is
|
|
10
|
+
Forge set up", or "should this be a Forge issue or a TodoWrite". Index layer only — hand off
|
|
11
|
+
the doing: rank/pick the next ready issue → `triage-ready`; current stage / "where am I" /
|
|
12
|
+
active or stale work → `status`; create/update/close/search one issue → `issue-basics`;
|
|
13
|
+
claim-then-prove ownership before mutating → `claim-safety`; drive one issue from plan to a
|
|
14
|
+
merged PR under gates → `smith`; token-bounded state for the Hermes harness →
|
|
15
|
+
`hermes-forge`.
|
|
16
|
+
allowed-tools: Read, Bash(forge:*)
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Forge kernel surface
|
|
20
|
+
|
|
21
|
+
Forge is a TDD-first workflow harness. The agent-facing surface is **skills + the
|
|
22
|
+
`forge` CLI** — there are no slash-command files. This umbrella skill is the
|
|
23
|
+
entry point: it tells you which stage skill to use and which `forge` verb runs
|
|
24
|
+
each day-to-day operation. Every skill is a thin guide over a real `forge`
|
|
25
|
+
command; the CLI remains the implementation, the skills are the surface.
|
|
26
|
+
|
|
27
|
+
## Stage skills (the TDD ladder)
|
|
28
|
+
|
|
29
|
+
The default workflow is a configurable ladder of per-stage skills. Use the whole
|
|
30
|
+
flow when it fits, or invoke an individual stage when the active plan permits a
|
|
31
|
+
smaller path.
|
|
32
|
+
|
|
33
|
+
| Stage | Skill | Purpose |
|
|
34
|
+
|-------|-------|---------|
|
|
35
|
+
| utility | `status` | Check current context, active work, recent completions |
|
|
36
|
+
| 1 | `plan` | Design intent → research → branch + worktree + task list |
|
|
37
|
+
| 2 | `dev` | Subagent-driven TDD per task (implementer → spec → quality review) |
|
|
38
|
+
| 3 | `validate` | Type check, lint, code review, security, tests — all fresh output |
|
|
39
|
+
| 4 | `ship` | Push branch and open the PR with design-doc reference |
|
|
40
|
+
| 5 | `review` | Address ALL PR feedback (GitHub Actions, Greptile, SonarCloud) |
|
|
41
|
+
| 6 | `verify` | Post-merge health check (CI on main, close issues) |
|
|
42
|
+
|
|
43
|
+
**Pre-merge gate** (not a numbered stage): before merge, finish the doc updates on
|
|
44
|
+
the feature branch and confirm CI is green, then hand off the PR for manual merge.
|
|
45
|
+
The gate is embedded in `ship` and `review` — it is not a standalone skill.
|
|
46
|
+
|
|
47
|
+
Utility skills outside the linear ladder: `research` (deep web research),
|
|
48
|
+
`rollback` (safe revert operations), `sonarcloud` (code-quality queries),
|
|
49
|
+
`shepherd` (cross-harness PR monitoring).
|
|
50
|
+
|
|
51
|
+
Procedure skills (reusable operations any stage/agent embeds): `claim-safety`
|
|
52
|
+
(claim an issue and PROVE you own the lease via `forge issue owns <id>` before
|
|
53
|
+
mutating it — a claim returning ok:true does not by itself prove ownership).
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
status → plan → dev → validate → ship → review → verify
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Orchestrator super-skill
|
|
60
|
+
|
|
61
|
+
`smith` is the flagship: a thin orchestrator that COMPOSES the skills above into
|
|
62
|
+
the right path for a piece of work — pick (`triage-ready`) → claim
|
|
63
|
+
(`claim-safety`) → `plan` → `dev` → `validate` → `ship` → `review` → `verify` —
|
|
64
|
+
driving autonomously between human gates and pausing AT them. The human gates are
|
|
65
|
+
durable kernel EVENTS (`forge gate check|approve|reject|status <issue> <gate>`;
|
|
66
|
+
gates `gate.intent` · `gate.plan-approval` · `gate.merge`), so a gated run is
|
|
67
|
+
resume-safe across compaction. During planning `smith` calibrates how many gates
|
|
68
|
+
the work needs from its size × importance × complexity and proposes that tier at
|
|
69
|
+
the intent gate (the human confirms or overrides). Reach for `smith` to run a
|
|
70
|
+
whole issue end to end under human control; invoke an individual stage skill to
|
|
71
|
+
run a single step.
|
|
72
|
+
|
|
73
|
+
## Kernel-native skills
|
|
74
|
+
|
|
75
|
+
Read-and-repair skills that work directly against the kernel's issue store. They
|
|
76
|
+
complement the ladder: reach for them to decide *what* to do and to run the
|
|
77
|
+
everyday issue operations, then route into a stage skill to execute.
|
|
78
|
+
|
|
79
|
+
| Skill | Purpose |
|
|
80
|
+
|-------|---------|
|
|
81
|
+
| `triage-ready` | Read-only "what should I work on" — ranks and *explains* the ready queue via `forge issue ready` / `blocked` / `stats` (never `board`), then hands off the pick. |
|
|
82
|
+
| `issue-basics` | The everyday CRUD floor — create/update/claim/release/comment/close/show/list/search/stats over the `forge issue` verbs, plus the label/reopen/delete disposition for teams migrating in. |
|
|
83
|
+
|
|
84
|
+
## Day-to-day verbs (the `forge` CLI)
|
|
85
|
+
|
|
86
|
+
The kernel verbs are the operations you reach for inside any stage — find work,
|
|
87
|
+
claim it, fix in place, query the board, orient. They are grouped in four
|
|
88
|
+
families. Run them through Bash; never hand-edit the issue store.
|
|
89
|
+
|
|
90
|
+
### A — Issue lifecycle (the core loop)
|
|
91
|
+
|
|
92
|
+
| Need | Command |
|
|
93
|
+
|------|---------|
|
|
94
|
+
| Find ready work | `forge ready [--json]` |
|
|
95
|
+
| Inspect an issue | `forge show <id> [--json]` |
|
|
96
|
+
| List / filter issues | `forge list [--status …] [--json]` |
|
|
97
|
+
| Create an issue | `forge create --title "…" --type <feature\|bug\|task>` |
|
|
98
|
+
| Claim work (DB-enforced lease) | `forge claim <id>` |
|
|
99
|
+
| Prove you own the lease | `forge issue owns <id>` — exit 0 iff you hold the live lease (see the `claim-safety` skill) |
|
|
100
|
+
| Release a claim | `forge release <id>` |
|
|
101
|
+
| Update fields | `forge update <id> --priority <n>` (etc.) |
|
|
102
|
+
| Add a handoff comment | `forge comment <id> "…"` |
|
|
103
|
+
| Close an issue | `forge close <id> --reason "…"` |
|
|
104
|
+
| Dependencies | `forge issue dep add\|remove <id> <id>` |
|
|
105
|
+
| Search / stats | `forge issue search "…"` · `forge issue stats` |
|
|
106
|
+
| Blocked work | `forge blocked` |
|
|
107
|
+
|
|
108
|
+
### B — Memory / knowledge
|
|
109
|
+
|
|
110
|
+
`forge remember <note> [--tag <label>]... [--json]` and `forge recall` are live —
|
|
111
|
+
they persist and retrieve project-memory notes from a file-backed store. Only
|
|
112
|
+
`forge knowledge search` is not on the CLI yet; until it lands, capture durable
|
|
113
|
+
decisions as `forge remember` notes or issue comments (`forge comment`).
|
|
114
|
+
|
|
115
|
+
### C — Board / planning / admin
|
|
116
|
+
|
|
117
|
+
| Need | Command |
|
|
118
|
+
|------|---------|
|
|
119
|
+
| Team board | `forge board [--json]` |
|
|
120
|
+
| Export the issue projection | `forge export [--import]` |
|
|
121
|
+
| Release-readiness gate | `forge release check --target <ref>` |
|
|
122
|
+
| Sync team state | `forge sync` |
|
|
123
|
+
|
|
124
|
+
### D — Orientation / session
|
|
125
|
+
|
|
126
|
+
| Need | Command |
|
|
127
|
+
|------|---------|
|
|
128
|
+
| Prime a session | `forge prime [--json]` |
|
|
129
|
+
| Full orientation | `forge orient [--json]` |
|
|
130
|
+
| Recap an issue / context | `forge recap [<id>] [--json]` |
|
|
131
|
+
|
|
132
|
+
## Forge issues vs. TodoWrite — decision table
|
|
133
|
+
|
|
134
|
+
| Situation | Use |
|
|
135
|
+
|-----------|-----|
|
|
136
|
+
| Work spans sessions, has blockers, or needs recovery after compaction | **Forge issues** (`forge create`/`claim`/`close`) |
|
|
137
|
+
| Cross-agent or cross-worktree coordination | **Forge issues** (DB-enforced leases) |
|
|
138
|
+
| Durable decisions, design rationale, handoff notes | **Forge issue comments** |
|
|
139
|
+
| Ephemeral, single-session checklist for the current task | **TodoWrite** |
|
|
140
|
+
| Steps you will finish and discard within this turn | **TodoWrite** |
|
|
141
|
+
|
|
142
|
+
When in doubt, prefer a Forge issue: it survives the session and is visible to
|
|
143
|
+
the team. TodoWrite is for scratch tracking only.
|
|
144
|
+
|
|
145
|
+
## Session protocol
|
|
146
|
+
|
|
147
|
+
1. **Orient first.** Start with the `status` skill (or `forge prime` /
|
|
148
|
+
`forge orient`) — never reconstruct project state from raw files.
|
|
149
|
+
2. **Claim before you build — then prove it.** `forge claim <id>` takes the lease;
|
|
150
|
+
one issue at a time. A claim's ok:true does not by itself prove ownership, so
|
|
151
|
+
confirm with `forge issue owns <id>` before working and again before
|
|
152
|
+
`close`/`release` (the `claim-safety` skill). `forge release <id>` if you abandon it.
|
|
153
|
+
3. **Work the ladder.** `plan` → `dev` → `validate` → `ship` → `review` →
|
|
154
|
+
`verify`, skipping stages only when the plan allows. The pre-merge doc gate
|
|
155
|
+
runs inside `ship` and `review` before merge — it is not a separate stage.
|
|
156
|
+
4. **Record evidence as you go.** Progress and decisions go to
|
|
157
|
+
`forge comment <id> "…"`, not to memory.
|
|
158
|
+
5. **Hand off cleanly.** Close completed issues (`forge close <id> --reason …`)
|
|
159
|
+
and `forge sync` so the team sees the result.
|
|
160
|
+
|
|
161
|
+
## Core principles
|
|
162
|
+
|
|
163
|
+
- **TDD-first** — write tests before implementation (RED → GREEN → REFACTOR).
|
|
164
|
+
- **Research-first** — understand before building; document decisions.
|
|
165
|
+
- **Security built-in** — OWASP Top 10 analysis for every feature.
|
|
166
|
+
- **Documentation progressive** — update at each stage, verify at the end.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"query": "I just cloned this Forge repo and I'm not sure how any of it works — give me the lay of the land: what's the workflow, what skills exist, and where do I even start?",
|
|
4
|
+
"should_trigger": true
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
"query": "There are a bunch of forge skills and I can't tell which one to use for what — lay out how they fit together and when I'd reach for each.",
|
|
8
|
+
"should_trigger": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"query": "Which forge CLI command adds a dependency between two issues, and what's the verb for proving I hold a claim? Just the reference, don't run anything.",
|
|
12
|
+
"should_trigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"query": "Is this small cleanup worth filing as a Forge issue, or should I just throw it on a TodoWrite checklist for this session?",
|
|
16
|
+
"should_trigger": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"query": "Walk me through the Forge stage ladder from planning to post-merge verify and what each stage owns.",
|
|
20
|
+
"should_trigger": true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"query": "Give me the reference of all the day-to-day forge issue and board verbs — I want the index, not to execute a command yet.",
|
|
24
|
+
"should_trigger": true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"query": "What should I pick up next? Rank the ready queue and tell me the top unblocked issue and why.",
|
|
28
|
+
"should_trigger": false
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"query": "Where am I in the workflow right now, what's my active work, and has anything gone stale?",
|
|
32
|
+
"should_trigger": false
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"query": "Create a bug issue titled 'login times out after 30s', priority 1, and link it under the auth epic.",
|
|
36
|
+
"should_trigger": false
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"query": "Claim forge-4h9 for me and confirm I actually hold the lease before I start editing.",
|
|
40
|
+
"should_trigger": false
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"query": "Take forge-7c2 all the way from planning through a merged PR, pausing for my approval at the plan and the merge.",
|
|
44
|
+
"should_trigger": false
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"query": "In the Hermes harness, give me the token-bounded project state to work from — treat forge orient as the source of truth.",
|
|
48
|
+
"should_trigger": false
|
|
49
|
+
}
|
|
50
|
+
]
|