forge-workflow 0.1.0-beta.2 → 0.1.0-beta.4
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/.forge/hooks/check-tdd.js +79 -5
- package/.forge/hooks/forge-native-hook.js +194 -8
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +28 -0
- package/QUICKSTART.md +6 -2
- package/README.md +3 -1
- package/bin/forge-cmd.js +1 -1
- package/bin/forge.js +95 -19
- package/docs/guides/SETUP.md +4 -1
- package/docs/guides/SUPPORT.md +5 -0
- package/docs/reference/COMMANDS.md +12 -1
- package/docs/reference/shepherd.md +114 -3
- package/lib/activation/ensure-forge-home.js +135 -0
- package/lib/adapters/beads-kernel-compat.js +67 -0
- package/lib/adapters/greptile-review-adapter.js +1 -1
- package/lib/adapters/pr-state-adapter.js +103 -8
- package/lib/adoption-profiles.js +17 -4
- package/lib/agents-config.js +5 -0
- package/lib/beads-detect.js +60 -0
- package/lib/commands/_aliases.js +248 -0
- package/lib/commands/_issue.js +65 -41
- package/lib/commands/_manifest.js +3 -1
- package/lib/commands/_registry.js +14 -0
- package/lib/commands/_resolve-command-opts.js +36 -60
- package/lib/commands/claim.js +2 -4
- package/lib/commands/gate.js +19 -2
- package/lib/commands/hooks.js +294 -12
- package/lib/commands/init.js +26 -20
- package/lib/commands/memory.js +81 -0
- package/lib/commands/migrate.js +0 -161
- package/lib/commands/plan.js +71 -123
- package/lib/commands/pr.js +88 -0
- package/lib/commands/prime.js +8 -1
- package/lib/commands/push.js +66 -0
- package/lib/commands/recall.js +67 -12
- package/lib/commands/recap.js +18 -4
- package/lib/commands/release.js +15 -3
- package/lib/commands/remember.js +86 -20
- package/lib/commands/serve.js +5 -2
- package/lib/commands/setup.js +135 -73
- package/lib/commands/shepherd.js +102 -4
- package/lib/commands/ship.js +40 -4
- package/lib/commands/skill.js +275 -0
- package/lib/commands/status.js +37 -32
- package/lib/commands/test.js +32 -0
- package/lib/commands/worktree.js +87 -5
- package/lib/core/runtime-graph.js +122 -17
- package/lib/forge-issues.js +13 -464
- package/lib/gate-events.js +54 -55
- package/lib/global-flags.js +30 -0
- package/lib/grounding/context-events.js +230 -0
- package/lib/grounding/read-first.js +112 -0
- package/lib/harness-capability-matrix.js +2 -2
- package/lib/hook-renderer.js +144 -12
- package/lib/issue-backend.js +42 -3
- package/lib/kernel/backing-issue.js +7 -1
- package/lib/kernel/broker.js +28 -0
- package/lib/kernel/migrations.js +30 -2
- package/lib/kernel/owned-kernel.js +43 -0
- package/lib/kernel/schema.js +35 -0
- package/lib/kernel/sqlite-driver.js +187 -1
- package/lib/memory-recall.js +151 -0
- package/lib/orientation.js +303 -6
- package/lib/pr-bundle.js +6 -2
- package/lib/pr-monitor/auto-actions.js +175 -0
- package/lib/pr-monitor/digest.js +206 -0
- package/lib/pr-monitor/reconcile-executor.js +659 -0
- package/lib/pr-monitor/reconcile-tick.js +138 -0
- package/lib/pr-monitor/reconcile.js +0 -0
- package/lib/pr-monitor/render-sticky.js +57 -8
- package/lib/pr-monitor/shepherd-lease.js +243 -0
- package/lib/pr-monitor/upsert-sticky.js +169 -0
- package/lib/pr-monitor/watch-lifecycle.js +1 -1
- package/lib/pr-pull.js +113 -17
- package/lib/project-memory.js +8 -0
- package/lib/release-readiness.js +17 -1
- package/lib/rules-sync.js +4 -0
- package/lib/runtime-health.js +15 -46
- package/lib/skill-eval.js +750 -0
- package/lib/status/identity.js +46 -0
- package/lib/status/presenter.js +0 -35
- package/lib/status/snapshot.js +11 -16
- package/lib/upgrade-safety.js +52 -1
- package/lib/using-forge.js +315 -0
- package/lib/workflow/enforce-stage.js +64 -7
- package/lib/workflow/state-manager.js +23 -23
- package/package.json +2 -2
- package/rules/using-forge.md +24 -0
- package/scripts/forge-team/index.sh +0 -5
- package/scripts/forge-team/tests/dispatcher.test.sh +1 -1
- package/scripts/forge-team/tests/workflow-integration.test.sh +0 -1
- package/scripts/pr-auto-actions.js +93 -0
- package/scripts/pr-verdict-label.js +50 -0
- package/scripts/test.js +8 -1
- package/skills/claim-safety/SKILL.md +4 -0
- package/skills/claim-safety/evals/scorecard.json +41 -0
- package/skills/coverage.json +83 -0
- package/skills/dev/SKILL.md +4 -0
- package/skills/dev/evals/scorecard.json +41 -0
- package/skills/gates/SKILL.md +80 -0
- package/skills/gates/evals/evals.json +38 -0
- package/skills/gates/evals/scorecard.json +41 -0
- package/skills/hermes-forge/SKILL.md +1 -0
- package/skills/hermes-forge/evals/scorecard.json +41 -0
- package/skills/issue-basics/SKILL.md +1 -0
- package/skills/issue-basics/evals/scorecard.json +41 -0
- package/skills/kernel/SKILL.md +38 -0
- package/skills/kernel/evals/scorecard.json +41 -0
- package/skills/memory/SKILL.md +16 -1
- package/skills/memory/evals/scorecard.json +41 -0
- package/skills/parallel-deep-research/SKILL.md +1 -0
- package/skills/parallel-deep-research/evals/scorecard.json +41 -0
- package/skills/plan/SKILL.md +6 -0
- package/skills/plan/evals/scorecard.json +41 -0
- package/skills/portability/SKILL.md +47 -0
- package/skills/portability/evals/evals.json +34 -0
- package/skills/portability/evals/scorecard.json +41 -0
- package/skills/research/SKILL.md +1 -0
- package/skills/research/evals/scorecard.json +41 -0
- package/skills/review/SKILL.md +6 -0
- package/skills/review/evals/scorecard.json +41 -0
- package/skills/rollback/SKILL.md +1 -0
- package/skills/rollback/evals/scorecard.json +41 -0
- package/skills/setup/SKILL.md +91 -0
- package/skills/setup/evals/evals.json +42 -0
- package/skills/setup/evals/scorecard.json +41 -0
- package/skills/shepherd/SKILL.md +76 -36
- package/skills/shepherd/evals/evals.json +21 -9
- package/skills/shepherd/evals/scorecard.json +41 -0
- package/skills/ship/SKILL.md +6 -0
- package/skills/ship/evals/scorecard.json +41 -0
- package/skills/smith/SKILL.md +8 -0
- package/skills/smith/evals/scorecard.json +41 -0
- package/skills/sonarcloud/SKILL.md +1 -0
- package/skills/sonarcloud/evals/scorecard.json +41 -0
- package/skills/sonarcloud-analysis/SKILL.md +1 -0
- package/skills/sonarcloud-analysis/evals/scorecard.json +41 -0
- package/skills/status/SKILL.md +3 -0
- package/skills/status/evals/scorecard.json +41 -0
- package/skills/triage-ready/SKILL.md +2 -0
- package/skills/triage-ready/evals/scorecard.json +41 -0
- package/skills/using-forge/SKILL.md +104 -0
- package/skills/using-forge/evals/scorecard.json +41 -0
- package/skills/validate/SKILL.md +4 -0
- package/skills/validate/evals/scorecard.json +41 -0
- package/skills/verify/SKILL.md +4 -0
- package/skills/verify/evals/scorecard.json +41 -0
- package/skills/worktree/SKILL.md +87 -0
- package/skills/worktree/evals/evals.json +38 -0
- package/skills/worktree/evals/scorecard.json +41 -0
- package/lib/adapters/beads-issue-adapter.js +0 -127
- package/lib/commands/board.js +0 -64
- package/lib/status/beads-snapshot.js +0 -145
- package/scripts/forge-team/lib/dashboard.sh +0 -316
- package/scripts/forge-team/tests/dashboard.test.sh +0 -155
package/skills/dev/SKILL.md
CHANGED
|
@@ -13,12 +13,16 @@ description: >
|
|
|
13
13
|
opening the PR (ship), for addressing PR review feedback (review), or for orchestrating
|
|
14
14
|
several stages / taking an issue end-to-end to a merged PR (smith).
|
|
15
15
|
allowed-tools: Bash, Read, Write, Edit, Grep, Glob
|
|
16
|
+
next: validate
|
|
17
|
+
terminal: false
|
|
16
18
|
---
|
|
17
19
|
|
|
18
20
|
Implement each task from the /plan task list using a subagent-driven loop: implementer → spec compliance reviewer → code quality reviewer per task.
|
|
19
21
|
|
|
20
22
|
# Dev
|
|
21
23
|
|
|
24
|
+
> **Chain (HARD-GATE):** the ONLY skill you invoke after `dev` is `validate`. Never open a PR straight from `dev`.
|
|
25
|
+
|
|
22
26
|
This skill reads the task list created by `/plan` and implements each task using a three-stage subagent loop. TDD is enforced inside each implementer subagent.
|
|
23
27
|
|
|
24
28
|
## Usage
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "dev",
|
|
3
|
+
"fixtures": "present",
|
|
4
|
+
"static": {
|
|
5
|
+
"token_cost": {
|
|
6
|
+
"desc_chars": 962,
|
|
7
|
+
"body_lines": 328,
|
|
8
|
+
"score": 20
|
|
9
|
+
},
|
|
10
|
+
"caps": {
|
|
11
|
+
"desc_within": true,
|
|
12
|
+
"body_within": true,
|
|
13
|
+
"score": 100
|
|
14
|
+
},
|
|
15
|
+
"description_quality": {
|
|
16
|
+
"has_trigger_cues": true,
|
|
17
|
+
"has_disambiguation_cues": true,
|
|
18
|
+
"adequate_length": true,
|
|
19
|
+
"score": 100
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"router_reachability": {
|
|
23
|
+
"has_curated_rule": true,
|
|
24
|
+
"router_exempt": false,
|
|
25
|
+
"fixtures": "present",
|
|
26
|
+
"fixtures_total": 6,
|
|
27
|
+
"fixtures_best_hit": 2,
|
|
28
|
+
"reachable": true,
|
|
29
|
+
"keyword_alignment": 0.33
|
|
30
|
+
},
|
|
31
|
+
"behavioral": {
|
|
32
|
+
"trigger_recall": null,
|
|
33
|
+
"trigger_precision": null,
|
|
34
|
+
"disambiguation": null,
|
|
35
|
+
"chain_correctness": null,
|
|
36
|
+
"outcome_quality": null,
|
|
37
|
+
"variance": null,
|
|
38
|
+
"note": "behavioral — W5 (LLM judge): semantic recall/precision/chain/outcome/variance, not deterministic"
|
|
39
|
+
},
|
|
40
|
+
"composite": 76
|
|
41
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gates
|
|
3
|
+
description: >
|
|
4
|
+
Toggle Forge's workflow gates and rails — strong-but-toggleable enforcement. `forge gate
|
|
5
|
+
enable|disable <gate-id>` flips `workflow.gates.<id>.enabled` in `.forge/config.yaml`; the
|
|
6
|
+
installed git hooks read resolved config at run time, so disabling a rail makes them
|
|
7
|
+
genuinely inert. `forge gate approve|reject <issue> <gate>` records durable human-gate
|
|
8
|
+
approval events; `forge gate status`/`check` query them; `forge control <id>
|
|
9
|
+
<mandatory|optional|permission>` sets tri-state DECLARED intent (writes the same `enabled`
|
|
10
|
+
field — no independent runtime enforcement). Use when the user says "disable the gate",
|
|
11
|
+
"turn off TDD enforcement", "the tdd intent rail is blocking me", "toggle or enable a
|
|
12
|
+
gate", "loosen enforcement", or "approve a human gate". Common default-ON toggleable rails:
|
|
13
|
+
`rail.tdd_intent`, `rail.kernel_tracking`, `rail.auto_shepherd` — e.g. `forge gate disable
|
|
14
|
+
rail.tdd_intent`. NOT for addressing PR review feedback (review), NOT the status snapshot
|
|
15
|
+
of work in flight (status).
|
|
16
|
+
allowed-tools: Bash, Read, Grep, Glob
|
|
17
|
+
terminal: true
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
Forge's gates and rails are **default-strong but toggleable**. The `gates` skill is how you flip one off (or back on), record a human-gate approval, and see enforcement state. The stored truth is one field — `workflow.gates.<id>.enabled` — and the installed hooks read the resolved config at run time, so a disabled rail is genuinely inert, not cosmetically off.
|
|
21
|
+
|
|
22
|
+
# Toggling gates and rails
|
|
23
|
+
|
|
24
|
+
## When to use
|
|
25
|
+
|
|
26
|
+
- "Disable the gate", "turn off TDD enforcement", "the tdd intent rail is blocking me".
|
|
27
|
+
- "Toggle / enable a gate", "loosen enforcement for this repo".
|
|
28
|
+
- "Approve a human gate" (record a durable approval event on an issue).
|
|
29
|
+
|
|
30
|
+
## Toggle a gate or rail (the enforcement switch)
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
forge gate disable <gate-id> # set workflow.gates.<id>.enabled = false in .forge/config.yaml
|
|
34
|
+
forge gate enable <gate-id> # set it back to true
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
An unknown gate id — or disabling a **locked** gate — errors **before** anything is written, never mid-run. Because the hooks resolve config at run time, the flip takes effect immediately with no reinstall.
|
|
38
|
+
|
|
39
|
+
### Common rails (default-ON, toggleable)
|
|
40
|
+
|
|
41
|
+
| Rail | What it enforces | Turn off with |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| `rail.tdd_intent` | Pre-commit TDD gate (source changed ⇒ tests changed). The `minimal` adoption profile ships it off. | `forge gate disable rail.tdd_intent` |
|
|
44
|
+
| `rail.kernel_tracking` | "File every issue" — nothing discussed goes missing. | `forge gate disable rail.kernel_tracking` |
|
|
45
|
+
| `rail.auto_shepherd` | The autonomous PR-shepherd daemon fire. | `forge gate disable rail.auto_shepherd` |
|
|
46
|
+
|
|
47
|
+
The `gate.*` and `rail.*` id namespaces are disjoint, so `forge gate enable|disable` governs both through one flat surface.
|
|
48
|
+
|
|
49
|
+
## Human-gate approval events
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
forge gate approve <issue-id> <gate-id> # record a durable gate.approved event
|
|
53
|
+
forge gate reject <issue-id> <gate-id> # record gate.rejected
|
|
54
|
+
forge gate status <issue-id> # list recorded events for that issue (resume-safe)
|
|
55
|
+
forge gate check <issue-id> <gate-id> # exit 0 iff gate DISABLED or an approval exists on that issue
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`check` is the reusable enforcement primitive a stage skill calls: it passes when the gate is disabled or an approval event has been recorded for that specific issue id (approvals are issue-scoped, so pass the same `<issue-id>` you approved against). Events are durable on the issue, so they survive a compaction or crash.
|
|
59
|
+
|
|
60
|
+
## Tri-state control (declared intent)
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
forge control <gate-id|rail-id> <mandatory|optional|permission>
|
|
64
|
+
forge control status [--json]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`forge control` sets the **declared intent** vocabulary and writes the **same** `enabled` field that `forge gate` writes — there is deliberately no parallel key. It is a view/intent layer: today no runtime consumer denies purely on a control flag (MCP/rules/skills are presence-only and refused). For actually turning enforcement off, use `forge gate disable`.
|
|
68
|
+
|
|
69
|
+
## The doc-update gate
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
forge gate doc <detect|check|init|...> # = forge doc-gate (run `forge doc-gate --help`)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The doc-update gate folds under this noun as `forge gate doc`; bare `forge doc-gate` stays as a back-compat alias.
|
|
76
|
+
|
|
77
|
+
## Adjacent skills
|
|
78
|
+
|
|
79
|
+
- Addressing PR review feedback / resolving threads → `review`.
|
|
80
|
+
- The snapshot of where the project stands and what's in flight → `status`.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"query": "Disable the tdd gate for this repo.",
|
|
4
|
+
"should_trigger": true
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
"query": "Turn off TDD enforcement — the tdd intent rail is blocking my commit.",
|
|
8
|
+
"should_trigger": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"query": "Toggle the kernel tracking rail off for now.",
|
|
12
|
+
"should_trigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"query": "Enable a gate that I disabled earlier and loosen enforcement.",
|
|
16
|
+
"should_trigger": true
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"query": "Approve the human gate on this issue so the stage can proceed.",
|
|
20
|
+
"should_trigger": true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"query": "Disable the auto shepherd rail so no PR daemon fires.",
|
|
24
|
+
"should_trigger": true
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"query": "Address the CodeRabbit review feedback and resolve the threads.",
|
|
28
|
+
"should_trigger": false
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"query": "Where am I in the workflow and what work is in flight right now?",
|
|
32
|
+
"should_trigger": false
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"query": "Run the tests and lint before I push.",
|
|
36
|
+
"should_trigger": false
|
|
37
|
+
}
|
|
38
|
+
]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "gates",
|
|
3
|
+
"fixtures": "present",
|
|
4
|
+
"static": {
|
|
5
|
+
"token_cost": {
|
|
6
|
+
"desc_chars": 994,
|
|
7
|
+
"body_lines": 63,
|
|
8
|
+
"score": 45
|
|
9
|
+
},
|
|
10
|
+
"caps": {
|
|
11
|
+
"desc_within": true,
|
|
12
|
+
"body_within": true,
|
|
13
|
+
"score": 100
|
|
14
|
+
},
|
|
15
|
+
"description_quality": {
|
|
16
|
+
"has_trigger_cues": true,
|
|
17
|
+
"has_disambiguation_cues": true,
|
|
18
|
+
"adequate_length": true,
|
|
19
|
+
"score": 100
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"router_reachability": {
|
|
23
|
+
"has_curated_rule": true,
|
|
24
|
+
"router_exempt": false,
|
|
25
|
+
"fixtures": "present",
|
|
26
|
+
"fixtures_total": 6,
|
|
27
|
+
"fixtures_best_hit": 6,
|
|
28
|
+
"reachable": true,
|
|
29
|
+
"keyword_alignment": 1
|
|
30
|
+
},
|
|
31
|
+
"behavioral": {
|
|
32
|
+
"trigger_recall": null,
|
|
33
|
+
"trigger_precision": null,
|
|
34
|
+
"disambiguation": null,
|
|
35
|
+
"chain_correctness": null,
|
|
36
|
+
"outcome_quality": null,
|
|
37
|
+
"variance": null,
|
|
38
|
+
"note": "behavioral — W5 (LLM judge): semantic recall/precision/chain/outcome/variance, not deterministic"
|
|
39
|
+
},
|
|
40
|
+
"composite": 84
|
|
41
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "hermes-forge",
|
|
3
|
+
"fixtures": "present",
|
|
4
|
+
"static": {
|
|
5
|
+
"token_cost": {
|
|
6
|
+
"desc_chars": 993,
|
|
7
|
+
"body_lines": 157,
|
|
8
|
+
"score": 36
|
|
9
|
+
},
|
|
10
|
+
"caps": {
|
|
11
|
+
"desc_within": true,
|
|
12
|
+
"body_within": true,
|
|
13
|
+
"score": 100
|
|
14
|
+
},
|
|
15
|
+
"description_quality": {
|
|
16
|
+
"has_trigger_cues": true,
|
|
17
|
+
"has_disambiguation_cues": true,
|
|
18
|
+
"adequate_length": true,
|
|
19
|
+
"score": 100
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"router_reachability": {
|
|
23
|
+
"has_curated_rule": true,
|
|
24
|
+
"router_exempt": false,
|
|
25
|
+
"fixtures": "present",
|
|
26
|
+
"fixtures_total": 6,
|
|
27
|
+
"fixtures_best_hit": 2,
|
|
28
|
+
"reachable": true,
|
|
29
|
+
"keyword_alignment": 0.33
|
|
30
|
+
},
|
|
31
|
+
"behavioral": {
|
|
32
|
+
"trigger_recall": null,
|
|
33
|
+
"trigger_precision": null,
|
|
34
|
+
"disambiguation": null,
|
|
35
|
+
"chain_correctness": null,
|
|
36
|
+
"outcome_quality": null,
|
|
37
|
+
"variance": null,
|
|
38
|
+
"note": "behavioral — W5 (LLM judge): semantic recall/precision/chain/outcome/variance, not deterministic"
|
|
39
|
+
},
|
|
40
|
+
"composite": 81
|
|
41
|
+
}
|
|
@@ -14,6 +14,7 @@ description: >
|
|
|
14
14
|
the plan->dev->validate->ship pipeline or open a PR (use smith or stage skills); does NOT
|
|
15
15
|
report the current stage or what's in flight (use status).
|
|
16
16
|
allowed-tools: Read, Bash(forge:*)
|
|
17
|
+
terminal: true
|
|
17
18
|
---
|
|
18
19
|
|
|
19
20
|
# Issue basics — the CRUD floor
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "issue-basics",
|
|
3
|
+
"fixtures": "present",
|
|
4
|
+
"static": {
|
|
5
|
+
"token_cost": {
|
|
6
|
+
"desc_chars": 991,
|
|
7
|
+
"body_lines": 95,
|
|
8
|
+
"score": 42
|
|
9
|
+
},
|
|
10
|
+
"caps": {
|
|
11
|
+
"desc_within": true,
|
|
12
|
+
"body_within": true,
|
|
13
|
+
"score": 100
|
|
14
|
+
},
|
|
15
|
+
"description_quality": {
|
|
16
|
+
"has_trigger_cues": false,
|
|
17
|
+
"has_disambiguation_cues": true,
|
|
18
|
+
"adequate_length": true,
|
|
19
|
+
"score": 60
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"router_reachability": {
|
|
23
|
+
"has_curated_rule": true,
|
|
24
|
+
"router_exempt": false,
|
|
25
|
+
"fixtures": "present",
|
|
26
|
+
"fixtures_total": 6,
|
|
27
|
+
"fixtures_best_hit": 0,
|
|
28
|
+
"reachable": false,
|
|
29
|
+
"keyword_alignment": 0
|
|
30
|
+
},
|
|
31
|
+
"behavioral": {
|
|
32
|
+
"trigger_recall": null,
|
|
33
|
+
"trigger_precision": null,
|
|
34
|
+
"disambiguation": null,
|
|
35
|
+
"chain_correctness": null,
|
|
36
|
+
"outcome_quality": null,
|
|
37
|
+
"variance": null,
|
|
38
|
+
"note": "behavioral — W5 (LLM judge): semantic recall/precision/chain/outcome/variance, not deterministic"
|
|
39
|
+
},
|
|
40
|
+
"composite": 63
|
|
41
|
+
}
|
package/skills/kernel/SKILL.md
CHANGED
|
@@ -14,6 +14,7 @@ description: >
|
|
|
14
14
|
merged PR under gates → `smith`; token-bounded state for the Hermes harness →
|
|
15
15
|
`hermes-forge`.
|
|
16
16
|
allowed-tools: Read, Bash(forge:*)
|
|
17
|
+
terminal: true
|
|
17
18
|
---
|
|
18
19
|
|
|
19
20
|
# Forge kernel surface
|
|
@@ -56,6 +57,43 @@ mutating it — a claim returning ok:true does not by itself prove ownership).
|
|
|
56
57
|
status → plan → dev → validate → ship → review → verify
|
|
57
58
|
```
|
|
58
59
|
|
|
60
|
+
### Chain map (each skill declares its successor)
|
|
61
|
+
|
|
62
|
+
Every skill carries chain metadata in its frontmatter (`next`, `terminal`,
|
|
63
|
+
`subskills`, `handoffs`); each workflow STAGE skill additionally carries a
|
|
64
|
+
HARD-GATE chain line in its body, so each stage announces the next one. The
|
|
65
|
+
linear ladder:
|
|
66
|
+
|
|
67
|
+
| Skill | `next` | `terminal` |
|
|
68
|
+
|-------|--------|-----------|
|
|
69
|
+
| `plan` | `dev` | `false` |
|
|
70
|
+
| `dev` | `validate` | `false` |
|
|
71
|
+
| `validate` | `ship` | `false` |
|
|
72
|
+
| `ship` | `review` | `false` |
|
|
73
|
+
| `review` | `verify` | `false` |
|
|
74
|
+
| `verify` | `ship` | `false` |
|
|
75
|
+
|
|
76
|
+
The `next` column is each stage's DEFAULT / critical-path successor (`plan`
|
|
77
|
+
composes `research`; `ship` and `review` also carry a `shepherd` handoff). The
|
|
78
|
+
actual successor after `ship`, `review`, and `verify` is classification-dependent
|
|
79
|
+
— see the note below. `verify`'s `next` (`ship`) is the `docs`-only pre-ship
|
|
80
|
+
reuse; in every other flow nothing follows `verify`.
|
|
81
|
+
|
|
82
|
+
Feeders into the chain: `triage-ready` → `claim-safety` → `dev` (rank the pick,
|
|
83
|
+
prove the live lease, then work it). `research` is standalone / callable
|
|
84
|
+
mid-workflow and returns to its CALLER (no forced `next`); it is also a `subskill`
|
|
85
|
+
of `plan`. The `smith` orchestrator composes the six stages (`subskills`).
|
|
86
|
+
Utility/terminal skills (`status`, `shepherd`, `kernel`, `issue-basics`, `memory`,
|
|
87
|
+
`rollback`, `research`, `sonarcloud`, `sonarcloud-analysis`,
|
|
88
|
+
`parallel-deep-research`, `using-forge`) declare no forward-stage `next`. Meta
|
|
89
|
+
skills (`hermes-forge`) are chain-exempt.
|
|
90
|
+
|
|
91
|
+
The stage `next` values above are the DEFAULT / critical-path successors. The
|
|
92
|
+
actual successor after `ship`, `review`, and `verify` is
|
|
93
|
+
classification-dependent — the authoritative matrix is `lib/workflow/stages.js`
|
|
94
|
+
(Simple/Hotfix/Refactor end at `ship`; Standard ends at `review`; Critical runs
|
|
95
|
+
through `verify`; the `docs` classification reuses `verify` → `ship`).
|
|
96
|
+
|
|
59
97
|
## Orchestrator super-skill
|
|
60
98
|
|
|
61
99
|
`smith` is the flagship: a thin orchestrator that COMPOSES the skills above into
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "kernel",
|
|
3
|
+
"fixtures": "present",
|
|
4
|
+
"static": {
|
|
5
|
+
"token_cost": {
|
|
6
|
+
"desc_chars": 993,
|
|
7
|
+
"body_lines": 187,
|
|
8
|
+
"score": 33
|
|
9
|
+
},
|
|
10
|
+
"caps": {
|
|
11
|
+
"desc_within": true,
|
|
12
|
+
"body_within": true,
|
|
13
|
+
"score": 100
|
|
14
|
+
},
|
|
15
|
+
"description_quality": {
|
|
16
|
+
"has_trigger_cues": true,
|
|
17
|
+
"has_disambiguation_cues": true,
|
|
18
|
+
"adequate_length": true,
|
|
19
|
+
"score": 100
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"router_reachability": {
|
|
23
|
+
"has_curated_rule": true,
|
|
24
|
+
"router_exempt": false,
|
|
25
|
+
"fixtures": "present",
|
|
26
|
+
"fixtures_total": 6,
|
|
27
|
+
"fixtures_best_hit": 0,
|
|
28
|
+
"reachable": false,
|
|
29
|
+
"keyword_alignment": 0
|
|
30
|
+
},
|
|
31
|
+
"behavioral": {
|
|
32
|
+
"trigger_recall": null,
|
|
33
|
+
"trigger_precision": null,
|
|
34
|
+
"disambiguation": null,
|
|
35
|
+
"chain_correctness": null,
|
|
36
|
+
"outcome_quality": null,
|
|
37
|
+
"variance": null,
|
|
38
|
+
"note": "behavioral — W5 (LLM judge): semantic recall/precision/chain/outcome/variance, not deterministic"
|
|
39
|
+
},
|
|
40
|
+
"composite": 80
|
|
41
|
+
}
|
package/skills/memory/SKILL.md
CHANGED
|
@@ -13,6 +13,7 @@ description: >
|
|
|
13
13
|
The local backend is always the offline floor. Not for: issue create/list/close ops
|
|
14
14
|
(issue-basics), workflow status (status), or transient scratch notes.
|
|
15
15
|
allowed-tools: Bash, Read, Grep, Glob
|
|
16
|
+
terminal: true
|
|
16
17
|
---
|
|
17
18
|
|
|
18
19
|
# Memory
|
|
@@ -20,6 +21,16 @@ allowed-tools: Bash, Read, Grep, Glob
|
|
|
20
21
|
Durable project memory for agents. This skill teaches you where a fact belongs,
|
|
21
22
|
which backend is active, and how to use graph memory when it is enabled.
|
|
22
23
|
|
|
24
|
+
## Applies to: Forge-managed memory
|
|
25
|
+
|
|
26
|
+
This skill describes memory managed by **Forge's own store** — `forge remember` /
|
|
27
|
+
`forge recall`, whose backend the Backends section (below) explains. If the repo you are working in ships
|
|
28
|
+
its **own** memory system (a database, an API, a "log a decision" surface, an
|
|
29
|
+
in-app memory service), **that** system is authoritative here and this skill does
|
|
30
|
+
not apply — follow the repo's own memory instructions instead. When unsure, prefer
|
|
31
|
+
the host repo's memory over `forge remember`; a note written to the wrong store is
|
|
32
|
+
a note nobody finds.
|
|
33
|
+
|
|
23
34
|
## The one rule
|
|
24
35
|
|
|
25
36
|
Persistent, project-level knowledge goes to **`forge remember`** — never to a
|
|
@@ -33,7 +44,11 @@ is a local file store, so they always work offline with zero setup.
|
|
|
33
44
|
convention, a decision and its rationale, a non-obvious gotcha, an environment
|
|
34
45
|
quirk, a "we tried X, it failed because Y". Add `--tag <label>` for retrieval.
|
|
35
46
|
- **`forge recall "<query>"`** — before assuming, check what is already known.
|
|
36
|
-
Search first; do not re-derive knowledge the project already recorded.
|
|
47
|
+
Search first; do not re-derive knowledge the project already recorded. Note that
|
|
48
|
+
memory relevant to your current prompt **may already be injected automatically**
|
|
49
|
+
(a per-turn hook surfaces the best-matching notes; silent when nothing clears the
|
|
50
|
+
relevance bar). Treat auto-surfaced memory as a head start, and still `recall`
|
|
51
|
+
explicitly when you need to search for something specific it did not surface.
|
|
37
52
|
- **`forge issue comment <id> "<note>"`** — progress or context that belongs to
|
|
38
53
|
ONE issue's lifecycle (status, a blocker, a hand-off). Issue-scoped, not global.
|
|
39
54
|
- **Rule of thumb:** would a future session on a *different* issue want this? →
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "memory",
|
|
3
|
+
"fixtures": "no-fixtures",
|
|
4
|
+
"static": {
|
|
5
|
+
"token_cost": {
|
|
6
|
+
"desc_chars": 938,
|
|
7
|
+
"body_lines": 101,
|
|
8
|
+
"score": 44
|
|
9
|
+
},
|
|
10
|
+
"caps": {
|
|
11
|
+
"desc_within": true,
|
|
12
|
+
"body_within": true,
|
|
13
|
+
"score": 100
|
|
14
|
+
},
|
|
15
|
+
"description_quality": {
|
|
16
|
+
"has_trigger_cues": true,
|
|
17
|
+
"has_disambiguation_cues": true,
|
|
18
|
+
"adequate_length": true,
|
|
19
|
+
"score": 100
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"router_reachability": {
|
|
23
|
+
"has_curated_rule": true,
|
|
24
|
+
"router_exempt": false,
|
|
25
|
+
"fixtures": "no-fixtures",
|
|
26
|
+
"fixtures_total": 0,
|
|
27
|
+
"fixtures_best_hit": 0,
|
|
28
|
+
"reachable": null,
|
|
29
|
+
"keyword_alignment": null
|
|
30
|
+
},
|
|
31
|
+
"behavioral": {
|
|
32
|
+
"trigger_recall": null,
|
|
33
|
+
"trigger_precision": null,
|
|
34
|
+
"disambiguation": null,
|
|
35
|
+
"chain_correctness": null,
|
|
36
|
+
"outcome_quality": null,
|
|
37
|
+
"variance": null,
|
|
38
|
+
"note": "behavioral — W5 (LLM judge): semantic recall/precision/chain/outcome/variance, not deterministic"
|
|
39
|
+
},
|
|
40
|
+
"composite": 83
|
|
41
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "parallel-deep-research",
|
|
3
|
+
"fixtures": "present",
|
|
4
|
+
"static": {
|
|
5
|
+
"token_cost": {
|
|
6
|
+
"desc_chars": 996,
|
|
7
|
+
"body_lines": 92,
|
|
8
|
+
"score": 42
|
|
9
|
+
},
|
|
10
|
+
"caps": {
|
|
11
|
+
"desc_within": true,
|
|
12
|
+
"body_within": true,
|
|
13
|
+
"score": 100
|
|
14
|
+
},
|
|
15
|
+
"description_quality": {
|
|
16
|
+
"has_trigger_cues": true,
|
|
17
|
+
"has_disambiguation_cues": true,
|
|
18
|
+
"adequate_length": true,
|
|
19
|
+
"score": 100
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"router_reachability": {
|
|
23
|
+
"has_curated_rule": true,
|
|
24
|
+
"router_exempt": false,
|
|
25
|
+
"fixtures": "present",
|
|
26
|
+
"fixtures_total": 5,
|
|
27
|
+
"fixtures_best_hit": 1,
|
|
28
|
+
"reachable": true,
|
|
29
|
+
"keyword_alignment": 0.2
|
|
30
|
+
},
|
|
31
|
+
"behavioral": {
|
|
32
|
+
"trigger_recall": null,
|
|
33
|
+
"trigger_precision": null,
|
|
34
|
+
"disambiguation": null,
|
|
35
|
+
"chain_correctness": null,
|
|
36
|
+
"outcome_quality": null,
|
|
37
|
+
"variance": null,
|
|
38
|
+
"note": "behavioral — W5 (LLM judge): semantic recall/precision/chain/outcome/variance, not deterministic"
|
|
39
|
+
},
|
|
40
|
+
"composite": 83
|
|
41
|
+
}
|
package/skills/plan/SKILL.md
CHANGED
|
@@ -13,12 +13,18 @@ description: >
|
|
|
13
13
|
where work stands or what is stale (status), and NOT for everyday issue create/list/close or
|
|
14
14
|
picking the next ready issue (issue-basics / triage-ready).
|
|
15
15
|
allowed-tools: Bash, Read, Write, Edit, Grep, Glob
|
|
16
|
+
next: dev
|
|
17
|
+
terminal: false
|
|
18
|
+
subskills:
|
|
19
|
+
- research
|
|
16
20
|
---
|
|
17
21
|
|
|
18
22
|
Plan a feature from scratch: brainstorm design intent, research technical approach, then set up branch, worktree, and a complete task list ready for /dev.
|
|
19
23
|
|
|
20
24
|
# Plan
|
|
21
25
|
|
|
26
|
+
> **Chain (HARD-GATE):** the next skill after `plan` is `dev`. `plan` composes the `research` sub-skill for its Phase 2 technical bundle. Do not skip ahead past `dev`.
|
|
27
|
+
|
|
22
28
|
`/plan` is the default planning super-skill. A full invocation runs the three legacy sections below (intent, research, setup/task list), but v3 treats the internal planning work as callable sub-skills:
|
|
23
29
|
|
|
24
30
|
- `plan.intent_capture`
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "plan",
|
|
3
|
+
"fixtures": "present",
|
|
4
|
+
"static": {
|
|
5
|
+
"token_cost": {
|
|
6
|
+
"desc_chars": 958,
|
|
7
|
+
"body_lines": 530,
|
|
8
|
+
"score": 3
|
|
9
|
+
},
|
|
10
|
+
"caps": {
|
|
11
|
+
"desc_within": true,
|
|
12
|
+
"body_within": true,
|
|
13
|
+
"score": 100
|
|
14
|
+
},
|
|
15
|
+
"description_quality": {
|
|
16
|
+
"has_trigger_cues": false,
|
|
17
|
+
"has_disambiguation_cues": true,
|
|
18
|
+
"adequate_length": true,
|
|
19
|
+
"score": 60
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"router_reachability": {
|
|
23
|
+
"has_curated_rule": true,
|
|
24
|
+
"router_exempt": false,
|
|
25
|
+
"fixtures": "present",
|
|
26
|
+
"fixtures_total": 5,
|
|
27
|
+
"fixtures_best_hit": 4,
|
|
28
|
+
"reachable": true,
|
|
29
|
+
"keyword_alignment": 0.8
|
|
30
|
+
},
|
|
31
|
+
"behavioral": {
|
|
32
|
+
"trigger_recall": null,
|
|
33
|
+
"trigger_precision": null,
|
|
34
|
+
"disambiguation": null,
|
|
35
|
+
"chain_correctness": null,
|
|
36
|
+
"outcome_quality": null,
|
|
37
|
+
"variance": null,
|
|
38
|
+
"note": "behavioral — W5 (LLM judge): semantic recall/precision/chain/outcome/variance, not deterministic"
|
|
39
|
+
},
|
|
40
|
+
"composite": 51
|
|
41
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: portability
|
|
3
|
+
description: >
|
|
4
|
+
Forge kernel data portability — getting issue data in and out of the local kernel. `forge
|
|
5
|
+
export [--dir] [--dry-run]` writes the kernel backlog to deterministic git-tracked JSONL
|
|
6
|
+
(D16 portability projection); `forge export --import` reads that committed snapshot back
|
|
7
|
+
into the kernel (hydrate). `forge migrate --from beads [--dry-run] [--source <dir>]` imports
|
|
8
|
+
a Beads issue store into the kernel — the onboarding path for users coming from Beads. Use
|
|
9
|
+
when the user says "export the kernel backlog to JSONL", "back up / snapshot the backlog",
|
|
10
|
+
"re-import / hydrate the backlog", "migrate from beads", or "import a beads store". Honesty:
|
|
11
|
+
bare `forge migrate --dry-run` (no `--from`) is v2→v3 preview only; a re-import that applies
|
|
12
|
+
nothing reports "already hydrated". NOT the cloud/backend sync of the kernel (that is `forge
|
|
13
|
+
sync`, cloud-native), NOT a database/schema migration (plan/dev), NOT memory notes (memory),
|
|
14
|
+
NOT syncing a git branch with main (ship).
|
|
15
|
+
allowed-tools: Bash, Read, Grep, Glob
|
|
16
|
+
terminal: true
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
Moving Forge kernel issue data across a boundary: project the backlog to a git-committable snapshot (and hydrate it back), or import an existing issue store into the kernel. This is data portability — distinct from schema/database migrations and from the cloud backend sync (`forge sync`).
|
|
20
|
+
|
|
21
|
+
# Export / re-import the backlog
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
forge export # write the kernel backlog to git-tracked JSONL (deterministic)
|
|
25
|
+
forge export --dir <path> # choose the projection directory
|
|
26
|
+
forge export --dry-run # show what would be written, change nothing
|
|
27
|
+
forge export --import # read the committed JSONL snapshot back INTO the kernel (hydrate)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
`forge export` is the **D16 portability projection**: a deterministic, git-committable snapshot of the backlog you can review in a diff and carry between machines or checkouts. `forge export --import` is the reverse — it hydrates the kernel from that on-disk snapshot; a re-import that finds everything already present reports "already hydrated" rather than claiming it imported anything.
|
|
31
|
+
|
|
32
|
+
# Migrate in from Beads (or preview v2→v3)
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
forge migrate --from beads [--dry-run] # import a Beads issue store into the kernel
|
|
36
|
+
forge migrate --from beads --source <dir> # point at exported beads *.jsonl (defaults to auto-detecting .beads/)
|
|
37
|
+
forge migrate --dry-run # preview the v2→v3 migration (the ONLY supported mode without --from)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`forge migrate --from beads` is the **onboarding path for users coming from Beads** — it imports a Beads issue store into the Forge Kernel (`--dry-run` reads + maps only, writing nothing). Without `--from`, migrate is **v2→v3 preview only**: `--dry-run` is required and applying the migration is not yet available.
|
|
41
|
+
|
|
42
|
+
## Boundaries
|
|
43
|
+
|
|
44
|
+
- The **cloud/backend sync** of the kernel is `forge sync` (cloud-native) — a different operation; this skill is the local, git-based portability projection.
|
|
45
|
+
- A **database/schema** migration (adding a column, altering a table) is application work — that's **plan**/**dev**, not `forge migrate`.
|
|
46
|
+
- Persisting a decision or note is **memory** (`forge remember`), not export.
|
|
47
|
+
- Syncing a git **branch** with main before a PR is **ship**/**worktree**.
|