forge-orkes 0.31.0 → 0.33.0
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/bin/create-forge.js +20 -1
- package/package.json +1 -1
- package/template/.claude/skills/chief-of-staff/SKILL.md +281 -0
- package/template/.claude/skills/discussing/SKILL.md +2 -0
- package/template/.claude/skills/forge/SKILL.md +31 -4
- package/template/.claude/skills/planning/SKILL.md +9 -0
- package/template/.claude/skills/upgrading/SKILL.md +30 -2
- package/template/.forge/FORGE.md +72 -23
- package/template/.forge/migrations/0.32.0-chief-streams.md +159 -0
- package/template/.forge/migrations/0.32.1-chief-front-door.md +64 -0
- package/template/.forge/migrations/0.33.0-worktree-convention-base.md +94 -0
- package/template/.forge/releases.yml +95 -15
- package/template/.forge/templates/context.md +4 -0
- package/template/.forge/templates/migration-guide.md +33 -0
- package/template/.forge/templates/streams/active.yml +34 -0
- package/template/.forge/templates/streams/brief.md +47 -0
- package/template/.forge/templates/streams/stream.yml +56 -0
- package/template/.forge/templates/streams/work-package.yml +70 -0
|
@@ -45,6 +45,37 @@ its version runs it once, and after the version is stamped it falls out of range
|
|
|
45
45
|
ledger, no per-version code, no staleness. (It also closes the install-run blind spot:
|
|
46
46
|
detection keys off the freshly-synced guides on disk, not the skill's own pre-sync code.)
|
|
47
47
|
|
|
48
|
+
### Experimental-skill guard (read if your change lives in an experimental skill)
|
|
49
|
+
|
|
50
|
+
If the behavior your guide migrates is implemented **only inside an experimental,
|
|
51
|
+
opt-in skill** (e.g. `.claude/skills/orchestrating/` from `experimental/m10/`),
|
|
52
|
+
a version-stamp check is **not enough**. `upgrading` never overwrites an
|
|
53
|
+
experimental skill in its base sync (it offers a re-sync in Step 3b, which the
|
|
54
|
+
user may decline), so the skill can stay pinned at install-time content while the
|
|
55
|
+
version stamp advances — and a stamp-only Detection block would report "nothing
|
|
56
|
+
to migrate" while the behavior is silently absent. This is exactly how the 0.28.0
|
|
57
|
+
repo-scoped worktree root became a no-op (issue #5).
|
|
58
|
+
|
|
59
|
+
So when your change touches experimental-skill behavior, the Detection block MUST
|
|
60
|
+
inspect the **skill's content on disk**, not the version, and emit `MIGRATE` when
|
|
61
|
+
the skill is stale:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# The behavior lives in an experimental skill — check its CONTENT, not the version.
|
|
65
|
+
S=.claude/skills/orchestrating/SKILL.md
|
|
66
|
+
[ -f "$S" ] || exit 0 # skill not installed → nothing to do
|
|
67
|
+
if grep -q 'forge-worktrees' "$S" \
|
|
68
|
+
&& ! grep -q '<repo>-worktrees' "$S"; then
|
|
69
|
+
echo "MIGRATE — experimental orchestrating skill is pinned to the pre-0.28.0 worktree root; re-sync it"
|
|
70
|
+
fi
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Better still, **also promote the load-bearing convention into base** (`FORGE.md`
|
|
74
|
+
or a base skill) so it is upgrade-synced regardless of the experimental skill's
|
|
75
|
+
state — then the base workflow no longer depends on experimental internals at all
|
|
76
|
+
(issue #6). The content-check Detection above is the floor; base promotion is the
|
|
77
|
+
durable fix.
|
|
78
|
+
|
|
48
79
|
### Detection block skeleton (applies)
|
|
49
80
|
|
|
50
81
|
```bash
|
|
@@ -106,5 +137,7 @@ must be confirmed with the user.>
|
|
|
106
137
|
- [ ] Exactly one `## Detection` heading; exactly one ` ```bash ` block under it.
|
|
107
138
|
- [ ] Block emits `MIGRATE` on stdout iff the migration applies; silent + exit 0 otherwise.
|
|
108
139
|
- [ ] Block is safe on a clean/empty project (no errors, exit 0).
|
|
140
|
+
- [ ] If the change lives in an experimental skill, Detection checks the skill's **content** (not just the version stamp) — see the Experimental-skill guard above.
|
|
141
|
+
- [ ] Any new accumulating artifact declares owner, size gate, archive/compaction rule, derived vs source-of-truth status, and future migration behavior.
|
|
109
142
|
- [ ] Mirrored byte-identical to `docs/migrations/{same-name}.md`.
|
|
110
143
|
- [ ] No edit to `upgrading/SKILL.md` or `create-forge.js` was needed (the loop covers it).
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Forge Streams — Active Project Map
|
|
2
|
+
# Size gate: keep this file <= 20 KB. It is the Project Chief's default context.
|
|
3
|
+
# Store summaries only. Deep stream history belongs in streams/{stream}/.
|
|
4
|
+
|
|
5
|
+
version: 1
|
|
6
|
+
updated_at: null
|
|
7
|
+
|
|
8
|
+
project_chief:
|
|
9
|
+
current_stream: null
|
|
10
|
+
merge_policy: "chief-owned"
|
|
11
|
+
notes: ""
|
|
12
|
+
|
|
13
|
+
streams:
|
|
14
|
+
# - id: "billing-retries"
|
|
15
|
+
# status: active # draft | active | paused | delegated | blocked | ready | merged | closed
|
|
16
|
+
# goal: "Fix checkout retry handling"
|
|
17
|
+
# branch: "forge/stream-billing-retries"
|
|
18
|
+
# worktree: "../app-worktrees/billing-retries"
|
|
19
|
+
# owner: "" # session/thread/user label
|
|
20
|
+
# owned_surfaces:
|
|
21
|
+
# - "src/billing/**"
|
|
22
|
+
# shared_surfaces:
|
|
23
|
+
# - "src/lib/events.ts"
|
|
24
|
+
# risk: medium # low | medium | high | unknown
|
|
25
|
+
# blocked_by: []
|
|
26
|
+
# next_action: "Review event contract before editing shared surface"
|
|
27
|
+
# last_sync: null
|
|
28
|
+
[]
|
|
29
|
+
|
|
30
|
+
merge_queue:
|
|
31
|
+
# - stream: "billing-retries"
|
|
32
|
+
# status: waiting # waiting | merging | blocked | merged
|
|
33
|
+
# reason: "shared event contract pending"
|
|
34
|
+
[]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Stream Brief: {stream}
|
|
2
|
+
|
|
3
|
+
Size gate: keep this brief <= 8 KB. It is the first file loaded when resuming a stream.
|
|
4
|
+
|
|
5
|
+
## Goal
|
|
6
|
+
|
|
7
|
+
{One sentence describing the line of work.}
|
|
8
|
+
|
|
9
|
+
## Current State
|
|
10
|
+
|
|
11
|
+
Status: draft | active | paused | delegated | blocked | ready | merged | closed
|
|
12
|
+
|
|
13
|
+
{What is true right now? Include whether code has changed, whether workers are active, and whether merge is safe.}
|
|
14
|
+
|
|
15
|
+
## Ownership
|
|
16
|
+
|
|
17
|
+
Owned surfaces:
|
|
18
|
+
- {paths/modules this stream may edit}
|
|
19
|
+
|
|
20
|
+
Shared surfaces:
|
|
21
|
+
- {paths/modules requiring contract or Project Chief approval}
|
|
22
|
+
|
|
23
|
+
Read-only surfaces:
|
|
24
|
+
- {paths/modules this stream may inspect but not edit}
|
|
25
|
+
|
|
26
|
+
Forbidden surfaces:
|
|
27
|
+
- {paths/modules this stream must not touch}
|
|
28
|
+
|
|
29
|
+
## Decisions
|
|
30
|
+
|
|
31
|
+
- {Locked decisions that apply to this stream}
|
|
32
|
+
|
|
33
|
+
## Findings
|
|
34
|
+
|
|
35
|
+
- {Recent findings needed to resume without chat history}
|
|
36
|
+
|
|
37
|
+
## Work Packages
|
|
38
|
+
|
|
39
|
+
- {WP-id}: {status} — {short goal}
|
|
40
|
+
|
|
41
|
+
## Blockers
|
|
42
|
+
|
|
43
|
+
- {blocker or "none"}
|
|
44
|
+
|
|
45
|
+
## Next Action
|
|
46
|
+
|
|
47
|
+
{The next concrete action for the stream chief or worker.}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Forge Stream State
|
|
2
|
+
# Copy to .forge/streams/{stream}.yml.
|
|
3
|
+
# Size gate: keep per-stream state <= 15 KB. Put narrative in brief.md or findings.md.
|
|
4
|
+
|
|
5
|
+
version: 1
|
|
6
|
+
|
|
7
|
+
stream:
|
|
8
|
+
id: ""
|
|
9
|
+
goal: ""
|
|
10
|
+
status: draft # draft | active | paused | delegated | blocked | ready | merged | closed
|
|
11
|
+
tier: null # quick | standard | full | null until known
|
|
12
|
+
created_at: null
|
|
13
|
+
updated_at: null
|
|
14
|
+
owner: ""
|
|
15
|
+
|
|
16
|
+
runtime:
|
|
17
|
+
branch: ""
|
|
18
|
+
worktree: ""
|
|
19
|
+
chief_session: ""
|
|
20
|
+
worker_sessions: []
|
|
21
|
+
|
|
22
|
+
ownership:
|
|
23
|
+
owned_surfaces: []
|
|
24
|
+
shared_surfaces: []
|
|
25
|
+
read_only_surfaces: []
|
|
26
|
+
forbidden_surfaces: []
|
|
27
|
+
reservations:
|
|
28
|
+
# - surface: "src/lib/events.ts"
|
|
29
|
+
# reason: "Event contract update"
|
|
30
|
+
# status: proposed # proposed | approved | blocked | released
|
|
31
|
+
[]
|
|
32
|
+
|
|
33
|
+
dependencies:
|
|
34
|
+
blocked_by_streams: []
|
|
35
|
+
blocks_streams: []
|
|
36
|
+
contracts: []
|
|
37
|
+
|
|
38
|
+
context:
|
|
39
|
+
brief: ".forge/streams/{stream}/brief.md"
|
|
40
|
+
findings: ".forge/streams/{stream}/findings.md"
|
|
41
|
+
packages_dir: ".forge/streams/{stream}/packages"
|
|
42
|
+
|
|
43
|
+
blockers:
|
|
44
|
+
# - type: decision | conflict | external | human-action
|
|
45
|
+
# summary: ""
|
|
46
|
+
# since: null
|
|
47
|
+
# resolution: ""
|
|
48
|
+
[]
|
|
49
|
+
|
|
50
|
+
merge:
|
|
51
|
+
readiness: not_ready # not_ready | ready | blocked | merged
|
|
52
|
+
risk: unknown # low | medium | high | unknown
|
|
53
|
+
required_checks: []
|
|
54
|
+
notes: ""
|
|
55
|
+
|
|
56
|
+
next_action: ""
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Forge Work Package Template
|
|
2
|
+
# Bounded delegated work for a single stream.
|
|
3
|
+
# Copy to: .forge/streams/{stream}/packages/{id}.yml
|
|
4
|
+
|
|
5
|
+
package:
|
|
6
|
+
id: "{package-id}"
|
|
7
|
+
stream: "{stream-id}"
|
|
8
|
+
title: ""
|
|
9
|
+
status: draft # draft | assigned | active | blocked | ready | returned | closed
|
|
10
|
+
created_at: "{ISO-8601}"
|
|
11
|
+
updated_at: "{ISO-8601}"
|
|
12
|
+
owner: "" # worker session, person, or agent label
|
|
13
|
+
reports_to: "chief-of-staff" # Project Chief or stream chief
|
|
14
|
+
|
|
15
|
+
goal:
|
|
16
|
+
summary: ""
|
|
17
|
+
observable_outcome: ""
|
|
18
|
+
non_goals: []
|
|
19
|
+
|
|
20
|
+
scope:
|
|
21
|
+
owns:
|
|
22
|
+
# Files, dirs, modules, routes, or contracts this worker may edit.
|
|
23
|
+
- ""
|
|
24
|
+
may_read:
|
|
25
|
+
# Context surfaces the worker may inspect but should not edit.
|
|
26
|
+
- ""
|
|
27
|
+
shared_surfaces:
|
|
28
|
+
# APIs, schemas, data contracts, docs, or config shared with other streams.
|
|
29
|
+
- surface: ""
|
|
30
|
+
contract_owner: ""
|
|
31
|
+
rule: "report changes before editing"
|
|
32
|
+
must_not_touch:
|
|
33
|
+
# Explicit exclusions. Any need to edit these returns to the Chief.
|
|
34
|
+
- ""
|
|
35
|
+
|
|
36
|
+
dependencies:
|
|
37
|
+
blocked_by: []
|
|
38
|
+
provides_to: []
|
|
39
|
+
contracts_required: []
|
|
40
|
+
|
|
41
|
+
verify:
|
|
42
|
+
commands:
|
|
43
|
+
# - cmd: "npm test -- ..."
|
|
44
|
+
# advisory: false
|
|
45
|
+
manual_checks: []
|
|
46
|
+
evidence_required: []
|
|
47
|
+
|
|
48
|
+
stop_conditions:
|
|
49
|
+
- "Need to edit must_not_touch or undeclared shared surface"
|
|
50
|
+
- "Find conflicting ownership with another stream"
|
|
51
|
+
- "Contract is missing, ambiguous, or contradicted by implementation"
|
|
52
|
+
- "Task scope expands beyond the package goal"
|
|
53
|
+
- "Verification cannot be run or fails for reasons outside package scope"
|
|
54
|
+
|
|
55
|
+
deliverables:
|
|
56
|
+
- "Changed files or commits"
|
|
57
|
+
- "Verification evidence"
|
|
58
|
+
- "Decision notes or conflicts found"
|
|
59
|
+
- "Recommended next action"
|
|
60
|
+
|
|
61
|
+
handoff:
|
|
62
|
+
instructions: ""
|
|
63
|
+
report_back:
|
|
64
|
+
to: "chief-of-staff"
|
|
65
|
+
include:
|
|
66
|
+
- "what changed"
|
|
67
|
+
- "what was verified"
|
|
68
|
+
- "conflicts or scope expansion"
|
|
69
|
+
- "open risks"
|
|
70
|
+
- "next action"
|