@izkac/forgekit 0.2.0 → 0.3.1
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/README.md +83 -36
- package/bin/forge.mjs +5 -1
- package/package.json +4 -4
- package/scripts/run-tests.mjs +7 -0
- package/src/brief-cli.mjs +62 -0
- package/src/brief.mjs +104 -0
- package/src/brief.test.mjs +186 -0
- package/src/cleanup-sessions.mjs +2 -0
- package/src/fleet.mjs +233 -0
- package/src/fleet.test.mjs +137 -0
- package/src/lib/fleet.mjs +212 -0
- package/src/lib.mjs +5 -0
- package/src/session-reminder.mjs +12 -1
- package/src/set-phase.mjs +28 -0
- package/vendor/skills/forge/phases/plan-openspec.md +15 -2
- package/vendor/skills/forge/phases/plan-specs.md +15 -2
- package/vendor/skills/forge/references/operator-brief.md +74 -0
|
@@ -31,14 +31,27 @@ Thin wrapper around the project **`openspec-propose`** skill (or `/opsx:propose`
|
|
|
31
31
|
valid spine and, when the spine has rows, a green current e2e run —
|
|
32
32
|
keyword sniffing does not decide.)
|
|
33
33
|
|
|
34
|
-
5.
|
|
34
|
+
5. **Operator brief (mandatory)** — see [../references/operator-brief.md](../references/operator-brief.md):
|
|
35
|
+
write `openspec/changes/<change-name>/brief.html` — a plain-language,
|
|
36
|
+
self-contained HTML explanation of what will be built (mermaid diagrams
|
|
37
|
+
where helpful), then:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
forge brief stamp # records specs hash + opens it in the operator's browser
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`forge phase implement` hard-refuses while the brief is missing or stale
|
|
44
|
+
(specs edited after stamping → rewrite affected sections and re-stamp).
|
|
45
|
+
|
|
46
|
+
6. Update session:
|
|
35
47
|
```bash
|
|
36
48
|
forge phase plan --plan-type openspec --openspec <change-name>
|
|
37
49
|
forge phase implement --tasks-total <N>
|
|
38
50
|
```
|
|
39
51
|
Count tasks from `tasks.md` checkboxes.
|
|
40
52
|
|
|
41
|
-
|
|
53
|
+
7. Get user approval to proceed to implement (unless they already said "go").
|
|
54
|
+
The brief (opened by `forge brief stamp`) is what the operator reviews.
|
|
42
55
|
|
|
43
56
|
## Session tracking
|
|
44
57
|
|
|
@@ -79,7 +79,19 @@ OpenSpec propose flow without the vendor CLI. Change lives under
|
|
|
79
79
|
valid spine and, when the spine has rows, a green current e2e run —
|
|
80
80
|
keyword sniffing does not decide.)
|
|
81
81
|
|
|
82
|
-
5.
|
|
82
|
+
5. **Operator brief (mandatory)** — see [../references/operator-brief.md](../references/operator-brief.md):
|
|
83
|
+
write `<specsDir>/changes/<change-name>/brief.html` — a plain-language,
|
|
84
|
+
self-contained HTML explanation of what will be built (mermaid diagrams
|
|
85
|
+
where helpful), then:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
forge brief stamp # records specs hash + opens it in the operator's browser
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`forge phase implement` hard-refuses while the brief is missing or stale
|
|
92
|
+
(specs edited after stamping → rewrite affected sections and re-stamp).
|
|
93
|
+
|
|
94
|
+
6. Update session:
|
|
83
95
|
|
|
84
96
|
```bash
|
|
85
97
|
forge phase plan --plan-type specs --openspec <change-name>
|
|
@@ -89,7 +101,8 @@ OpenSpec propose flow without the vendor CLI. Change lives under
|
|
|
89
101
|
Count tasks from `tasks.md` checkboxes. (`--openspec` carries the change
|
|
90
102
|
name for both engines.)
|
|
91
103
|
|
|
92
|
-
|
|
104
|
+
7. Get user approval on the artefacts before implementing (unless they already said "go").
|
|
105
|
+
The brief (opened by `forge brief stamp`) is what the operator reviews.
|
|
93
106
|
|
|
94
107
|
## Compatibility
|
|
95
108
|
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Operator brief — `brief.html`
|
|
2
|
+
|
|
3
|
+
Every tracked change (openspec or specs engine) ends its plan phase with an
|
|
4
|
+
**operator brief**: one self-contained HTML file at
|
|
5
|
+
`<changeDir>/brief.html` that a human can read in two minutes and understand
|
|
6
|
+
*what will be built* — without reading proposal.md, design.md, or tasks.md.
|
|
7
|
+
|
|
8
|
+
The plan-approval checkpoint is only as strong as the operator's comprehension.
|
|
9
|
+
The specs are written for agents; the brief is the translation for the human
|
|
10
|
+
who approves them. `forge phase implement` **refuses** while the brief is
|
|
11
|
+
missing, unstamped, or stale.
|
|
12
|
+
|
|
13
|
+
## Who writes it
|
|
14
|
+
|
|
15
|
+
You (the agent), at the end of the plan phase — after the specs are final,
|
|
16
|
+
before `forge phase implement`. The CLI never generates prose; it only stamps
|
|
17
|
+
freshness and opens the file.
|
|
18
|
+
|
|
19
|
+
## Workflow
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# 1. specs are final (proposal.md / design.md / tasks.md)
|
|
23
|
+
# 2. write <changeDir>/brief.html (structure below)
|
|
24
|
+
forge brief stamp # records specs hash + opens it in the operator's browser
|
|
25
|
+
forge phase implement --tasks-total <N> # hard-gated on a fresh stamped brief
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
If any spec file changes later, the brief goes **stale** — update the affected
|
|
29
|
+
sections and `forge brief stamp` again. `forge brief check` reports status.
|
|
30
|
+
Genuine edge case (operator explicitly waives it):
|
|
31
|
+
`forge phase implement --allow-incomplete "<reason>"`.
|
|
32
|
+
|
|
33
|
+
## Writing rules
|
|
34
|
+
|
|
35
|
+
Audience: a smart human who has NOT read the specs and doesn't want to.
|
|
36
|
+
Plain language. No spec-speak, no requirement IDs, no file paths in headings.
|
|
37
|
+
If a sentence would not make sense to a project stakeholder outside this
|
|
38
|
+
session, rewrite it.
|
|
39
|
+
|
|
40
|
+
Structure (sections, in order — skip a section only when truly empty):
|
|
41
|
+
|
|
42
|
+
1. **TL;DR** — 2-3 sentences: what will exist after this change that doesn't
|
|
43
|
+
today, and why it's worth doing.
|
|
44
|
+
2. **What you'll get** — the observable outcomes, bulleted. Behavior, not
|
|
45
|
+
implementation ("you can send a message to any session from one terminal",
|
|
46
|
+
not "a registry module under lib/").
|
|
47
|
+
3. **How it works** — the shape of the solution in one short narrative plus a
|
|
48
|
+
**mermaid diagram** where a picture beats prose (flow, sequence, or state —
|
|
49
|
+
whichever fits; skip the diagram for trivial changes rather than forcing one).
|
|
50
|
+
4. **What changes for you** — new commands/screens/steps the operator will
|
|
51
|
+
use; anything that behaves differently than before.
|
|
52
|
+
5. **Risks and open questions** — honest, short. What could go wrong, what was
|
|
53
|
+
deliberately deferred, what the operator should keep an eye on.
|
|
54
|
+
6. **Out of scope** — what this change deliberately does NOT do.
|
|
55
|
+
7. **Work overview** — task groups from tasks.md compressed to one line each,
|
|
56
|
+
with rough size (n tasks). Not the full task list.
|
|
57
|
+
|
|
58
|
+
## File rules
|
|
59
|
+
|
|
60
|
+
- One file, self-contained: inline CSS, no build step, no local assets.
|
|
61
|
+
- Mermaid via CDN is fine (`<script src="https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.min.js">`
|
|
62
|
+
+ `mermaid.initialize({ startOnLoad: true })`; diagrams in `<pre class="mermaid">` blocks).
|
|
63
|
+
Trade-off accepted: diagrams need internet to render; the text must stand on
|
|
64
|
+
its own without them.
|
|
65
|
+
- Readable defaults: max-width ~48rem/prose, system font stack, dark-on-light.
|
|
66
|
+
Keep styling minimal — this is a memo, not a product page.
|
|
67
|
+
- Do not remove the `<!-- forge-brief-specs-hash:… -->` comment `forge brief
|
|
68
|
+
stamp` inserts; re-stamping updates it.
|
|
69
|
+
|
|
70
|
+
## Archive
|
|
71
|
+
|
|
72
|
+
`brief.html` lives in the change dir, so it archives with the change
|
|
73
|
+
(`changes/archive/…`) and remains the human-readable record of what was
|
|
74
|
+
approved — useful input for archive→ADR.
|