@lovrozagar/grunt 0.4.2 → 0.5.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/.agents/agents/grunt.md +2 -1
- package/.agents/agents/implementer.md +1 -1
- package/.agents/agents/orchestrator.md +19 -13
- package/.agents/agents/thinker.md +8 -6
- package/.agents/skills/ask/SKILL.md +18 -0
- package/.agents/skills/auto/SKILL.md +18 -0
- package/.agents/skills/browser/SKILL.md +4 -3
- package/.agents/skills/cascade/SKILL.md +5 -3
- package/.agents/skills/commit-and-push/SKILL.md +3 -3
- package/.agents/skills/explain/SKILL.md +1 -0
- package/.agents/skills/handoff/SKILL.md +1 -1
- package/.agents/skills/implement-plan/SKILL.md +117 -0
- package/.agents/skills/solo/SKILL.md +5 -3
- package/.agents/skills/tmp/SKILL.md +58 -0
- package/.agents/skills/write-plan/SKILL.md +85 -0
- package/.claude/agents/grunt.md +2 -1
- package/.claude/agents/implementer.md +1 -1
- package/.claude/agents/orchestrator.md +19 -13
- package/.claude/agents/thinker.md +8 -6
- package/.claude/skills/ask/SKILL.md +18 -0
- package/.claude/skills/auto/SKILL.md +18 -0
- package/.claude/skills/browser/SKILL.md +4 -3
- package/.claude/skills/cascade/SKILL.md +5 -3
- package/.claude/skills/commit-and-push/SKILL.md +3 -3
- package/.claude/skills/explain/SKILL.md +1 -0
- package/.claude/skills/handoff/SKILL.md +1 -1
- package/.claude/skills/implement-plan/SKILL.md +117 -0
- package/.claude/skills/solo/SKILL.md +5 -3
- package/.claude/skills/tmp/SKILL.md +58 -0
- package/.claude/skills/write-plan/SKILL.md +85 -0
- package/.codex/agents/grunt.toml +2 -1
- package/.codex/agents/implementer.toml +1 -1
- package/.codex/agents/orchestrator.toml +19 -13
- package/.codex/agents/thinker.toml +8 -6
- package/.grok/agents/grunt.md +2 -1
- package/.grok/agents/implementer.md +1 -1
- package/.grok/agents/orchestrator.md +19 -13
- package/.grok/agents/thinker.md +8 -6
- package/.grok/hooks/orchestrate-parent.js +280 -62
- package/.grok/skills/ask/SKILL.md +18 -0
- package/.grok/skills/auto/SKILL.md +18 -0
- package/.grok/skills/browser/SKILL.md +4 -3
- package/.grok/skills/cascade/SKILL.md +5 -3
- package/.grok/skills/commit-and-push/SKILL.md +3 -3
- package/.grok/skills/explain/SKILL.md +1 -0
- package/.grok/skills/handoff/SKILL.md +1 -1
- package/.grok/skills/implement-plan/SKILL.md +49 -20
- package/.grok/skills/solo/SKILL.md +5 -3
- package/.grok/skills/tmp/SKILL.md +58 -0
- package/.grok/skills/write-plan/SKILL.md +17 -14
- package/.rulesync/grunt.config.jsonc +7 -0
- package/.rulesync/reference/INDEX.md +46 -0
- package/.rulesync/reference/cascade.md +19 -15
- package/.rulesync/reference/hooks.md +6 -4
- package/.rulesync/reference/law.md +9 -0
- package/.rulesync/reference/map.md +20 -10
- package/.rulesync/reference/output.md +23 -8
- package/{.grok/skills/shared → .rulesync/reference}/plan-format.md +12 -11
- package/.rulesync/reference/refs-map.md +14 -0
- package/.rulesync/reference/skills-map.md +23 -0
- package/.rulesync/rules/CLAUDE.md +22 -15
- package/.rulesync/rules/overview.md +22 -15
- package/.rulesync/skills/ask/SKILL.md +18 -0
- package/.rulesync/skills/auto/SKILL.md +18 -0
- package/.rulesync/skills/browser/SKILL.md +2 -2
- package/.rulesync/skills/cascade/SKILL.md +5 -3
- package/.rulesync/skills/commit-and-push/SKILL.md +3 -3
- package/.rulesync/skills/explain/SKILL.md +1 -0
- package/.rulesync/skills/handoff/SKILL.md +1 -1
- package/.rulesync/skills/implement-plan/SKILL.md +127 -0
- package/.rulesync/skills/solo/SKILL.md +5 -3
- package/.rulesync/skills/tmp/SKILL.md +58 -0
- package/.rulesync/skills/write-plan/SKILL.md +92 -0
- package/.rulesync/subagents/grunt.md +2 -1
- package/.rulesync/subagents/implementer.md +1 -1
- package/.rulesync/subagents/orchestrator.md +19 -13
- package/.rulesync/subagents/thinker.md +8 -6
- package/AGENTS.md +22 -15
- package/CHANGELOG.md +56 -0
- package/CLAUDE.md +22 -15
- package/README.md +27 -22
- package/cli/grunt.mjs +12 -12
- package/cli/grunt.test.ts +29 -20
- package/cli/init.mjs +135 -22
- package/cli/init.test.ts +624 -36
- package/package.json +11 -4
- package/scripts/doctor.mjs +64 -2
- package/scripts/emit-maps.mjs +422 -0
- package/scripts/gate-fat-tools.mjs +2 -2
- package/scripts/grunt-config.mjs +50 -0
- package/scripts/guarded-roots.mjs +4 -7
- package/scripts/persist-plan.mjs +17 -2
- package/scripts/persist-tmp.mjs +123 -0
- package/scripts/pipeline.mjs +67 -0
- package/scripts/scrub-spawn-prompt.mjs +1 -1
- package/scripts/skill-conflicts.mjs +71 -0
|
@@ -13,8 +13,11 @@ Cheap outline. Not a file dump.
|
|
|
13
13
|
- `.rulesync/reference/hooks.md` — hook policy
|
|
14
14
|
- `.rulesync/reference/map.md` — this file
|
|
15
15
|
- `.rulesync/reference/output.md` — default voice
|
|
16
|
+
- `.rulesync/reference/law.md` — domain law (stub; protocol stays cascade/overview)
|
|
17
|
+
- Generated catalogs: `.rulesync/reference/INDEX.md` — aggregate catalog composed from slices (law.md, skills-map.md, refs-map.md). Maps/law = slices for deep dive. INDEX always. Not if-maps-else.
|
|
16
18
|
|
|
17
19
|
## Agent SSOT
|
|
20
|
+
- Docs SoT: `.rulesync/skills` + `.rulesync/reference`. Generate maps anything placed there. `.agents` / `.claude` (and other host trees) are mirrors, not SoT; no mirror scan
|
|
18
21
|
- `.rulesync/subagents/{orchestrator,implementer,thinker,grunt}.md`
|
|
19
22
|
- `.rulesync/rules/overview.md` → `AGENTS.md`
|
|
20
23
|
- `.rulesync/rules/CLAUDE.md` → `CLAUDE.md`
|
|
@@ -23,22 +26,25 @@ Cheap outline. Not a file dump.
|
|
|
23
26
|
## Grok hand files
|
|
24
27
|
- `.grok/hooks/orchestrate-parent.js` + `.grok/hooks/orchestrate-parent.json` — parent spawn/fat/stop/plan-write / SubagentStop intercept
|
|
25
28
|
- `.grok/hooks/rtk.json` — RTK
|
|
26
|
-
- `.grok/skills/{write-plan,implement-plan
|
|
27
|
-
- `.grok/skills/{parent,explain,handoff,pickup,solo,cascade,commit,commit-and-push,commit-push,commit-push-deploy,commit-push-release}/` — generated from `.rulesync/skills/`; do not hand-edit
|
|
29
|
+
- `.grok/skills/{parent,explain,handoff,pickup,solo,cascade,auto,ask,commit,commit-and-push,commit-push,commit-push-deploy,commit-push-release,write-plan,implement-plan}/` — generated from `.rulesync/skills/`; do not hand-edit
|
|
28
30
|
- `.grok/parent.md` — 1-line pointer to orchestrator agent; not SessionStart
|
|
29
31
|
- `.grok/roles/*.toml`
|
|
30
32
|
- `.grok/global-settings.toml` — merged into `~/.grok/config.toml` by `scripts/sync-global-settings.mjs` (not auto-loaded; project config cannot set `[features]`)
|
|
31
33
|
- `.rulesync/global-settings/` — host manifest and reserved noop payloads
|
|
32
34
|
- `.rulesync/mcp-policy.jsonc` — MCP deny-default SSOT (`default: deny`, `allow: []`)
|
|
33
|
-
- `.rulesync/
|
|
35
|
+
- `.rulesync/grunt.config.jsonc` — leftover-gate + spawnMode SSOT (`version` `1`, `leftoverGate` `ask`|`auto` committed default `ask`, `spawnMode` `solo`|`cascade` committed default `cascade` never `solo`). Effective spawn: stamp `spawn-mode-{sid}` > one-release `grunt-off` > config > `cascade`. Fail-closed cascade. Keys independent.
|
|
36
|
+
- `.rulesync/skills/{parent,explain,handoff,pickup,solo,cascade,auto,ask,commit,commit-and-push,commit-push,commit-push-deploy,commit-push-release,browser,write-plan,implement-plan}/` — skill SSOT; `rulesync -f skills` emits `.grok/skills/`, `.claude/skills/`, `.agents/skills/` byte-equal. `/cascade` = exit solo / restore cascade (not a sticky second mode). `/auto` `/ask` = session leftover-gate (not spawn-escape)
|
|
34
37
|
|
|
35
38
|
## Scripts
|
|
39
|
+
- `scripts/pipeline.mjs` — inner generate/check/watch chain (rulesync + emit-* + hooks-union / check-globals). Called by `guarded-roots`; not a public npm script (`rulesync:generate` `rulesync:check` `rulesync:watch` only)
|
|
40
|
+
- `scripts/guarded-roots.mjs` — snapshot/remerge `AGENTS.md` `CLAUDE.md` `GEMINI.md` around pipeline; check interiors wrapper
|
|
36
41
|
- `scripts/check-globals.mjs` — `$HOME/.grok/config.toml` `[agent].name==orchestrator` + `[features].two_pass_compaction==true`; project `.grok/config.toml` must not have `[features]`/`[agent]`; wired as `sync:globals:check` (also after emit-mcp in `rulesync:check`)
|
|
37
42
|
- `scripts/gate-fat-tools.mjs`
|
|
38
43
|
- `scripts/scrub-spawn-prompt.mjs`
|
|
39
44
|
- `scripts/grunt-job.mjs` — flags `--job` `--query` `--path` `--glob` (repeatable) `--cwd`; regex in `--query` OK; never `cd &&`; unknown flags / exec shell-meta → FALLBACK
|
|
40
45
|
- `scripts/parse-need.mjs`
|
|
41
46
|
- `scripts/persist-handoff.mjs` — `.tmp/grunt/handoffs/{serial}-{slug}-{stamp}.md`; `HANDOFF_NAME:` → slug; H2 `Goal|State|Context|Next|Watch-outs`; `status` `open|resumed|done`
|
|
47
|
+
- `scripts/persist-tmp.mjs` — `.tmp/grunt/{serial}-{slug}-{stamp}.{ext}` root files; `TMP_NAME:` / `TMP_EXT:`; own serial; skip reserved dirs
|
|
42
48
|
- `scripts/persist-plan.mjs`
|
|
43
49
|
- `scripts/sync-global-settings.mjs` — dry-run-by-default merge of `.grok/global-settings.toml` into `$HOME/.grok/config.toml`; manifest in `.rulesync/global-settings/`; `skipKeyPattern` skips MCP; never copies project MCP into `$HOME/.grok`
|
|
44
50
|
- `scripts/purge-global-mcps.mjs` — dry-run-by-default purge of stubborn global MCP sources (`$HOME/.grok/config.toml` plugins + `disabled_mcp_servers`, `$HOME/.cursor/mcp.json` `MCP_DOCKER`); `--apply` writes; never project MCP
|
|
@@ -46,21 +52,25 @@ Cheap outline. Not a file dump.
|
|
|
46
52
|
- `scripts/emit-gemini.mjs` — `GEMINI.md` (`@AGENTS.md`) + `.gemini/agents/{id}/agent.md` from `.rulesync/subagents` (not `rulesync -t geminicli`); no prune; does not touch settings
|
|
47
53
|
- `scripts/emit-agent-shell-tools.mjs` — after rulesync subagents: rewrite `.claude/agents/grunt.md` body `Bash`; grok/codex/gemini/generic keep `run_terminal_command`
|
|
48
54
|
- `scripts/browser.mjs` — session browser rail `nav|snap|click|fill|shot|pdf|stop`; Lightpanda default; Chromium on verb/OS/probe/paint-host/one-escalate; `.tmp/grunt/browser/`
|
|
55
|
+
- `scripts/grunt-config.mjs` — `loadLeftoverGate(workspaceRoot)` fail-closed `ask`; `loadSpawnMode(workspaceRoot)` fail-closed `cascade`; keys independent
|
|
49
56
|
|
|
50
57
|
## Tmp
|
|
51
|
-
- `.tmp/plans/` — persist-plan / parent / implementer
|
|
52
|
-
- `.tmp/orchestrator-logs/` — parent stamps
|
|
53
|
-
- `.tmp/grunt/` — grunt scratch
|
|
58
|
+
- `.tmp/grunt/plans/` — persist-plan / parent / implementer; format SSOT = `.rulesync/reference/plan-format.md`
|
|
59
|
+
- `.tmp/grunt/orchestrator-logs/` — parent stamps
|
|
60
|
+
- `.tmp/grunt/` — grunt scratch + `/tmp` dumps `{serial}-{slug}-{stamp}.{ext}` at root (not nested `tmp/`)
|
|
54
61
|
- `.tmp/grunt/browser/` — browser session/profile/shot/pdf (not MCP)
|
|
55
62
|
- `.tmp/grunt/handoffs/` — persist-handoff / `/handoff`; own serial counter (not plan serials)
|
|
56
63
|
|
|
57
|
-
## Stamps (`.tmp/orchestrator-logs/`)
|
|
58
|
-
- `tools-used` / `stop-block` / `need-intercept` / `parent-escape` — Stop does not waive impl finals for `tools-used`; `/parent` writes `parent-escape-{sid}` once
|
|
59
|
-
- `
|
|
64
|
+
## Stamps (`.tmp/grunt/orchestrator-logs/`)
|
|
65
|
+
- `tools-used` / `stop-block` / `need-intercept` / `parent-escape` / `auto-ask` / `spawn-mode` — Stop does not waive impl finals for `tools-used`; `/parent` writes `parent-escape-{sid}` once
|
|
66
|
+
- `spawn-mode-{sid}` — spawn session stamp. Body `solo`|`cascade`. Slash==config unlinks. Sid-less: no stamp. Unreadable/bad body ignored (dual-read `grunt-off` else config → cascade). `/solo` `/cascade` always unlink `grunt-off`
|
|
67
|
+
- `grunt-off-{sid}` — one-release dual-read as solo when spawn-mode stamp missing or body not exact `solo`|`cascade`. `/solo` `/cascade` always unlink. Requires a real sid (never the `default` fallback). Do not write new `grunt-off`
|
|
68
|
+
- `auto-ask-{sid}` — leftover-gate session stamp. Body `auto`|`ask`. Slash==config unlinks. Sid-less: no stamp. Unreadable/bad body ignored (fall through config → ask). Not spawn-escape.
|
|
60
69
|
|
|
61
70
|
## Generated (do not hand-edit; committed, not gitignored)
|
|
62
71
|
- `AGENTS.md`, `CLAUDE.md`
|
|
63
|
-
- `.
|
|
72
|
+
- `.rulesync/reference/INDEX.md`, `skills-map.md`, `refs-map.md` (`emit-maps.mjs`)
|
|
73
|
+
- `.claude/skills/*`, `.agents/skills/*`, `.grok/skills/{parent,explain,handoff,pickup,solo,cascade,auto,ask,commit,commit-and-push,commit-push,commit-push-deploy,commit-push-release,write-plan,implement-plan}/` (from `.rulesync/skills/`)
|
|
64
74
|
- `.grok/agents/*`
|
|
65
75
|
- `.claude/agents/*`
|
|
66
76
|
- `.codex/agents/*`
|
|
@@ -4,7 +4,7 @@ tags: [output]
|
|
|
4
4
|
|
|
5
5
|
# Output
|
|
6
6
|
|
|
7
|
-
en-US unless asked. every output maximal superterse. Fragments OK. Sacrifice grammar; keep meaning. Parent and child. Every turn, not final-only. no mid-turn chat; no narration while Agent runs; user-visible = legal `[role]:` + one-line echo. Advise leftover: numbered pick each on own line after that tagged recap — do not cram 1./2. onto the recap line
|
|
7
|
+
en-US unless asked. every output maximal superterse. Fragments OK. Sacrifice grammar; keep meaning. Parent and child. Every turn, not final-only. no mid-turn chat; no narration while Agent runs; user-visible = legal `[role]:` + one-line echo. Advise leftover: numbered pick each on own line after that tagged recap; one empty blank line immediately before leftover 1. (leftover last; not adjacent to recap/body) — do not cram 1./2./3. onto the recap line
|
|
8
8
|
|
|
9
9
|
**Mid-turn** (in-flight; first line still legal tag): `[orchestrator]: wait grunt` only. `need:` stop = JSON only. Grunt isolation = `verdict:` only; parent maps to natural recap. ⚠/validate: no recap; spawn. Imperative = routing/mid-turn only.
|
|
10
10
|
|
|
@@ -19,7 +19,7 @@ Buckets (semantic; not tokens):
|
|
|
19
19
|
|
|
20
20
|
Past-tense: completed work = past verbs only. Remainder/blocker = noun + one recommended X then ask. Do not break `need:` JSON, `verdict:`, wait-grunt, or legal first-line tag regex.
|
|
21
21
|
|
|
22
|
-
Ask = recap line + stop (no invent ask_user_question). Named `Do X?` / `X? y/n`: `y` = accept X. Bare `ok`/`yes`/`y`/`continue` after advise still ≠
|
|
22
|
+
Ask = recap line + stop (no invent ask_user_question). Named `Do X?` / `X? y/n`: `y` = accept X. Bare `ok`/`yes`/`y`/`continue` after advise still ≠ pick1/pick2.
|
|
23
23
|
|
|
24
24
|
**Do not ask** mid-turn / siblings-alive — stay `[orchestrator]: wait grunt` or tag+echo + peek.
|
|
25
25
|
|
|
@@ -30,15 +30,30 @@ Examples:
|
|
|
30
30
|
[implementer]: missing /abs/b.md. Prefetch via grunt? y/n
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
Child first line = those buckets in natural language. Body may continue (plans/findings). Parent echo one recap line. Advise leftover continues after it numbered pick each on own line. Do not force children to one line only.
|
|
33
|
+
Child first line = those buckets in natural language. Body may continue (plans/findings). Parent echo one recap line. Advise leftover continues after it: one empty blank line then numbered pick each on own line. Do not force children to one line only for body/logs.
|
|
34
|
+
|
|
35
|
+
Advise recap includes why-clause (one clause not treatise): `{decided}. {how-capsule}. {why-clause}`. Why-clause = rejected alt + constraint. Parent echo = that recap verbatim-ish; no-strip; forbid compress-to-verdict. Still one recap line. Do not dump body. Do not invent why if omitted. Pick1 recap-as-spec includes how+why; implementer must not paste why into code comments. Always-why recap ≠ `/explain` (`/explain` = expansion not the why path).
|
|
34
36
|
|
|
35
37
|
`/write-plan`: remainder `/implement-plan` (ask). `/explain`: same four buckets; sentences OK.
|
|
36
38
|
|
|
37
|
-
Advise leftover: numbered pick (
|
|
38
|
-
1. Implement
|
|
39
|
-
2.
|
|
39
|
+
Advise leftover: numbered pick (number or full leftover label, or unique tail `verbal plan` / `file plan`). Always-print typed leftover triple (advise-class final recap only) unless effective leftover-gate=auto and Implement-typed (pick2 chain skip leftover wait). Else always-print typed triple on advise-class final recap. Write-typed under auto still leftover wait. One verb per recap; never jammed `Implement/write`. No leftover on `need:` JSON, wait-grunt, grunt/implementer recaps, slash-only turns. Leftover ⊆ remainder kinds.
|
|
40
|
+
1. {Implement|Write} with verbal plan
|
|
41
|
+
2. {same verb} with file plan
|
|
42
|
+
3. Tweak
|
|
43
|
+
Type Implement — how-capsule = in-repo product writes (code tests `.rulesync/` CLAUDE/AGENTS skills). Product docs in-tree = Implement. Type Write — persist-only or implementer-nonsense: `.tmp/grunt/plans` inspect-pause `/tmp` artifact advise-only how/why with no product writes do-not-code external-human (SCA/bank/credentials). Recap remainder still names the human gate; leftover is not `4. Contact bank`. `/handoff` stays slash not Write pick1. Print all three every advise-class final recap. No omit 1/2. No frozen 4. Do not relabel 3.
|
|
40
44
|
```
|
|
41
45
|
[orchestrator]: wrote /abs/a
|
|
42
|
-
|
|
43
|
-
|
|
46
|
+
|
|
47
|
+
1. Implement with verbal plan
|
|
48
|
+
2. Implement with file plan
|
|
49
|
+
3. Tweak
|
|
50
|
+
```
|
|
51
|
+
```
|
|
52
|
+
[orchestrator]: advise-only how. Remainder persist note.
|
|
53
|
+
|
|
54
|
+
1. Write with verbal plan
|
|
55
|
+
2. Write with file plan
|
|
56
|
+
3. Tweak
|
|
44
57
|
```
|
|
58
|
+
Parent echoes printed leftover lines. Reuse echo: reprint last thinker’s leftover triple. Always-do leftover match printed lines (output.md cascade.md skills Rules); not Skill-name (`2` ≠ write-plan). Stop leftover-lines = recap format only; no code maps leftover numbers → skills; no leftover-label parser. `1` / full label / unique tail `verbal plan` → pick1. `2` / full / `file plan` → pick2. `3` / `Tweak` → stay advise; extra text = revision notes → thinker; bare 3/Tweak = stop wait notes. Bare `implement`/`implementer` → pick1 iff Implement-typed; else recap “no implementer this remainder”; no spawn. Bare `write` → pick1 iff Write-typed; else not a match. Type-mismatch → that recap no spawn. Alias `Implementer with verbal plan` / `Implementer with file plan` → pick1/pick2 iff Implement-typed. Implement pick1 = spawn implementer; paste last [thinker] recap as spec — how+why; implementer must not paste why into code comments; no `.tmp/grunt/plans`; no write-plan; no implement-plan. Implement pick2 = persist `.tmp/grunt/plans/{n}` then spawn implementer `plan=/abs/...` (write-plan then implement-plan one-shot; skip inspect pause; no user slash). Write pick1 = `/tmp` sequencing: persist recap/body under `.tmp/grunt/`; no implementer. Write pick2 = write-plan sequencing only: thinker draft + persist `.tmp/grunt/plans/{n}`; stop inspect-pause; remainder ask `/implement-plan {n}`; no implementer this turn. `/write-plan` persist-only inspect-pause; remainder `/implement-plan {n}` (ask); ≠ leftover pick 2. `/implement-plan {n}` disk/file ≠ verbal. `ok`/`yes`/`y`/`continue` ≠ either pick.
|
|
59
|
+
Owned-defect recap: `Fix {owned path}`. Leftover always-print typed triple (Implement when in-repo writes). Do not relabel 3 to the bug. Workaround in why-clause not remainder.
|
|
@@ -4,7 +4,7 @@ Local implementer checklist. Not a design doc, PR stack, or DAG.
|
|
|
4
4
|
|
|
5
5
|
## Path
|
|
6
6
|
|
|
7
|
-
`.tmp/plans/{serial}-{slug}-{YYYYMMDDTHHMMSSZ}.md`
|
|
7
|
+
`.tmp/grunt/plans/{serial}-{slug}-{YYYYMMDDTHHMMSSZ}.md`
|
|
8
8
|
|
|
9
9
|
- **serial:** unpadded decimal int only (`1`, `12`, `10000`). **Never** `0001`, never quoted `"0001"` / `"1"`. Serial ≥ 1.
|
|
10
10
|
- **filename:** unpadded serial, slug, UTC datetime stamp (`6-sync-global-settings-20260826T143000Z.md`, not `0001-slug.md`). Stamp is `created` with `-` and `:` dropped (keep `T` and `Z`).
|
|
@@ -26,9 +26,9 @@ Local implementer checklist. Not a design doc, PR stack, or DAG.
|
|
|
26
26
|
## Allocate next serial (grunt, bash)
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
mkdir -p .tmp/plans
|
|
29
|
+
mkdir -p .tmp/grunt/plans
|
|
30
30
|
next=1
|
|
31
|
-
for f in .tmp/plans/*; do
|
|
31
|
+
for f in .tmp/grunt/plans/*; do
|
|
32
32
|
[ -f "$f" ] || continue
|
|
33
33
|
b=$(basename "$f")
|
|
34
34
|
case "$b" in
|
|
@@ -70,6 +70,7 @@ source: "<≤120 chars of user task>"
|
|
|
70
70
|
`# {slug}`, `## Goal`, `## Context`, `## Constraints`, `## Watch-outs`, `## Steps`, `## Verify`
|
|
71
71
|
|
|
72
72
|
No other `##` headings. No PR Plan, Key Decisions, or DAG.
|
|
73
|
+
No required Why heading. Optional why footnote only (not a `##`). Pick2 file plan stays how-first; missing Why heading does not block.
|
|
73
74
|
|
|
74
75
|
## Checkbox grammar
|
|
75
76
|
|
|
@@ -101,14 +102,14 @@ Thinker cites **absolute paths**. Leaves must be implementable without re-planni
|
|
|
101
102
|
- frontmatter `serial` line matches `^serial: [1-9][0-9]*$` (unpadded decimal ≥ 1; reject `0001`, `"0001"`, `0`, `01`)
|
|
102
103
|
- frontmatter keys: `serial`, `name`, `status`, `created`, `source`
|
|
103
104
|
- `status` ∈ `ready` | `in-progress` | `done` | `blocked`; `created` `YYYY-MM-DDTHH:MM:SSZ` (new writes) or legacy `YYYY-MM-DD`; `source` ≤120
|
|
104
|
-
- headings in order only; no extra
|
|
105
|
+
- headings in order only; no extra `##`; no required Why heading (optional footnote only)
|
|
105
106
|
- ≥1 `N.M [ ]` leaf; every phase has ≥1 leaf; Verify is last numbered phase
|
|
106
107
|
- checkbox grammar (`N [ ]` / `N.M [ ]` / `N.M.K [ ]`); no `- [ ]`; no `1. [ ]`
|
|
107
108
|
- fresh write: zero `[x]` / `[X]`; Goal 1–3 sentences; Context/Constraints/Watch-outs bullets; Verify 1–5 leaves
|
|
108
109
|
|
|
109
110
|
## Worked example
|
|
110
111
|
|
|
111
|
-
File: `.tmp/plans/1-add-tmp-ignore-20260826T143000Z.md`
|
|
112
|
+
File: `.tmp/grunt/plans/1-add-tmp-ignore-20260826T143000Z.md`
|
|
112
113
|
|
|
113
114
|
```markdown
|
|
114
115
|
---
|
|
@@ -122,16 +123,16 @@ source: "gitignore .tmp so local plans stay untracked"
|
|
|
122
123
|
# add-tmp-ignore
|
|
123
124
|
|
|
124
125
|
## Goal
|
|
125
|
-
Repo `.gitignore` ignores `.tmp/` so files under `.tmp/plans/` stay untracked. Existing ignore entries stay.
|
|
126
|
+
Repo `.gitignore` ignores `.tmp/` so files under `.tmp/grunt/plans/` stay untracked. Existing ignore entries stay.
|
|
126
127
|
|
|
127
128
|
## Context
|
|
128
129
|
- `/home/ecomet/Development/example-app/.gitignore` may be missing or lack `.tmp/`
|
|
129
|
-
- Plans live at `/home/ecomet/Development/example-app/.tmp/plans/`
|
|
130
|
+
- Plans live at `/home/ecomet/Development/example-app/.tmp/grunt/plans/`
|
|
130
131
|
- No python helpers; bash only
|
|
131
132
|
|
|
132
133
|
## Constraints
|
|
133
134
|
- Do not clobber other `.gitignore` lines
|
|
134
|
-
- Do not create sample plans under `.tmp/plans` for git
|
|
135
|
+
- Do not create sample plans under `.tmp/grunt/plans` for git
|
|
135
136
|
- Do not edit `AGENTS.md`
|
|
136
137
|
|
|
137
138
|
## Watch-outs
|
|
@@ -144,15 +145,15 @@ Repo `.gitignore` ignores `.tmp/` so files under `.tmp/plans/` stay untracked. E
|
|
|
144
145
|
1.2 [ ] create `/home/ecomet/Development/example-app/.gitignore` when missing, body `.tmp/`
|
|
145
146
|
1.3 [ ] append `.tmp/` to `/home/ecomet/Development/example-app/.gitignore` if the line is absent
|
|
146
147
|
2 [ ] plans dir
|
|
147
|
-
2.1 [ ] mkdir -p `/home/ecomet/Development/example-app/.tmp/plans`
|
|
148
|
+
2.1 [ ] mkdir -p `/home/ecomet/Development/example-app/.tmp/grunt/plans`
|
|
148
149
|
2.2 [ ] confirm the dir exists; do not add a sample `*.md` under it
|
|
149
150
|
3 [ ] sanity
|
|
150
151
|
3.1 [ ] grep `^\.tmp/` in `/home/ecomet/Development/example-app/.gitignore`
|
|
151
152
|
3.2 [ ] confirm no extra hunks in that file besides the ignore line
|
|
152
|
-
3.3 [ ] `git check-ignore -v /home/ecomet/Development/example-app/.tmp/plans` from repo root
|
|
153
|
+
3.3 [ ] `git check-ignore -v /home/ecomet/Development/example-app/.tmp/grunt/plans` from repo root
|
|
153
154
|
|
|
154
155
|
## Verify
|
|
155
156
|
4 [ ] Verify
|
|
156
|
-
4.1 [ ] `git check-ignore -v .tmp/plans` reports ignored
|
|
157
|
+
4.1 [ ] `git check-ignore -v .tmp/grunt/plans` reports ignored
|
|
157
158
|
4.2 [ ] `git status --short -- .gitignore` shows only the ignore edit
|
|
158
159
|
```
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!-- Generated by emit-maps.mjs. Do not hand-edit. -->
|
|
2
|
+
|
|
3
|
+
# Refs map
|
|
4
|
+
|
|
5
|
+
| path | title | tags | summary |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| .rulesync/reference/browser.md | Browser | browser | Zero-config in-tree session rail. Not MCP. Not env. Not raw Playwright. |
|
|
8
|
+
| .rulesync/reference/cascade.md | Cascade | cascade | Shipped protocol: **parent-only spawn**. Only the parent **orchestrator** session calls `spawn_subagent`. Implementer a… |
|
|
9
|
+
| .rulesync/reference/hooks.md | Hooks | hooks | SessionStart: keep empty (token baseline). Do not inject context. Do not register a SessionStart hook on `../../.grok/h… |
|
|
10
|
+
| .rulesync/reference/law.md | Law | | Protocol stays cascade/overview; domain fills this. |
|
|
11
|
+
| .rulesync/reference/map.md | Map | map | Cheap outline. Not a file dump. |
|
|
12
|
+
| .rulesync/reference/output.md | Output | output | en-US unless asked. every output maximal superterse. Fragments OK. Sacrifice grammar; keep meaning. Parent and child. E… |
|
|
13
|
+
| .rulesync/reference/plan-format.md | Plan format (SSOT) | | Local implementer checklist. Not a design doc, PR stack, or DAG. |
|
|
14
|
+
| .rulesync/reference/rtk.md | RTK | rtk | Shell stdout compression. PreToolUse: Bash → `rtk <cmd>`. Not Read/Grep/Glob/prompts/images. |
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<!-- Generated by emit-maps.mjs. Do not hand-edit. -->
|
|
2
|
+
|
|
3
|
+
# Skills map
|
|
4
|
+
|
|
5
|
+
| name | origin | description | task | commandPath | refs |
|
|
6
|
+
| --- | --- | --- | --- | --- | --- |
|
|
7
|
+
| ask | local | Session leftover-gate. /ask sets leftover-gate ask for this session — leftover triple wait on advise-class recaps. Not… | | | |
|
|
8
|
+
| auto | local | Session leftover-gate. /auto sets leftover-gate auto for this session — Implement-typed pick2 chains write-plan persist… | | | |
|
|
9
|
+
| browser | local | Live URL/interact → this; not websearch. /browser or browse a URL. Call node scripts/browser.mjs nav\|snap\|click\|fill\|sh… | | | |
|
|
10
|
+
| cascade | local | Session mode. /cascade exits solo and restores the grunt cascade for this session — spawn, orchestrator, recap, need\|ve… | | | |
|
|
11
|
+
| commit | local | Inspect the diff and commit with a Conventional Commits subject line. Use for /commit, "commit this", "commit these cha… | | | |
|
|
12
|
+
| commit-and-push | local | Alias of commit-push (1-release stub). Use for /commit-and-push, "commit and push", "commit this and push". Must push.… | | | |
|
|
13
|
+
| commit-push | local | Commit with a Conventional Commits subject, then push. Use for /commit-push, "commit and push", "commit this and push".… | | | |
|
|
14
|
+
| commit-push-deploy | local | Commit, push, then deploy only if allowlisted infra already exists. Use for /commit-push-deploy, "commit push deploy",… | | | |
|
|
15
|
+
| commit-push-release | local | Commit, push, bump package.json, tag vX.Y.Z, push the tag. CI publishes. Use for /commit-push-release, "commit push rel… | | | |
|
|
16
|
+
| explain | local | One-off human recap. /explain. First action = spawn grunt\|implementer\|thinker if facts/work; else recap already-visible… | | | |
|
|
17
|
+
| handoff | local | Parent writes a session handoff under .tmp/grunt/handoffs/ and tells the user to continue in a fresh session. Use for /… | | | |
|
|
18
|
+
| implement-plan | local | Implementer executes a local .tmp/grunt/plans checklist: continue, resume, or pick among plans. Empty /implement-plan r… | | | |
|
|
19
|
+
| parent | local | One-turn parent-orchestrator escape. Use for /parent. Not a session mode. | | | |
|
|
20
|
+
| pickup | local | Pick up/continue a session handoff under .tmp/grunt/handoffs/. Use for /pickup, pick up, continue handoff, serial, drag… | | | |
|
|
21
|
+
| solo | local | Session mode. /solo disables the grunt cascade for this session — one normal agent, no spawn, no orchestrator. /cascade… | | | |
|
|
22
|
+
| tmp | local | One-off convo artifact dump under .tmp/grunt/. Use for /tmp, dump a draft, save a note/email/script from this session.… | | | |
|
|
23
|
+
| write-plan | local | Thinker drafts a local implementer-ready checklist plan; parent Write persists .tmp/grunt/plans/{serial}-{slug}-{YYYYMM… | | | |
|
|
@@ -4,44 +4,51 @@ targets:
|
|
|
4
4
|
- claudecode
|
|
5
5
|
---
|
|
6
6
|
Voice: `.rulesync/reference/output.md` — cite once; apply every turn.
|
|
7
|
-
en-US unless asked. every output maximal superterse. Fragments OK. Sacrifice grammar; keep meaning. Parent and child. Every turn, not final-only. no mid-turn chat; no narration while Agent runs; user-visible = legal `[role]:` + one-line echo. Advise leftover: numbered pick each on own line
|
|
7
|
+
en-US unless asked. every output maximal superterse. Fragments OK. Sacrifice grammar; keep meaning. Parent and child. Every turn, not final-only. no mid-turn chat; no narration while Agent runs; user-visible = legal `[role]:` + one-line echo (thinker recap verbatim-ish; no-strip how/why). Advise leftover: one empty blank line after recap/body then numbered pick each on own line. Zero user-visible tokens before spawn/peek. In-flight host Stop → only `[orchestrator]: wait grunt`.
|
|
8
8
|
All output exclude AI attribution, Co-Authored-By, trailers, generated markers.
|
|
9
9
|
Protocol: `.rulesync/reference/cascade.md`. Do not paste.
|
|
10
|
+
On-demand (feat/domain; never every-turn; parent does not Read): `.rulesync/reference/INDEX.md` — load this then only the matching row. Never load the folder.
|
|
10
11
|
Always-do:
|
|
11
12
|
|
|
12
13
|
| signal | next |
|
|
13
14
|
|---|---|
|
|
14
|
-
| create/change product files | grunt facts → thinker plan/recap-stop before writes; default thinker unless prompt-is-spec or small/simple → implementer. Thinker recap ≠ spec-ready; advise-stop until
|
|
15
|
-
| plan/spec ready + file writes remain |
|
|
15
|
+
| create/change product files | grunt facts → thinker plan/recap-stop before writes; default thinker unless prompt-is-spec or small/simple → implementer. Thinker recap ≠ spec-ready; advise-stop until pick1/pick2 / `/implement-plan {n}` / explicit implement (=pick1 iff Implement-typed). Never parent Write/Bash/Skill |
|
|
16
|
+
| plan/spec ready + file writes remain | leftover pick1/pick2 / `/implement-plan {n}` / explicit implement (=pick1 iff Implement-typed) only. Implement pick1 = spawn implementer + last [thinker] recap as spec; no `.tmp/grunt/plans`; no write-plan; no implement-plan. Implement pick2 = persist `.tmp/grunt/plans/{n}` then implementer `plan=/abs/...` one-shot skip pause. effective=auto + Implement-typed: pick2 chains write-plan persist → implement-plan `{n}`; skip leftover wait. Write pick1 = `/tmp` persist recap; no implementer. Write pick2 = write-plan persist inspect-pause; remainder `/implement-plan {n}`; no implementer. slash `/write-plan` ≠ leftover 2. `ok`/`yes`/`y`/`continue` ≠ either. Thinker recap alone = recap-stop |
|
|
16
17
|
| tools/facts/git/test/mechanical write | spawn grunt |
|
|
18
|
+
| snippet / cite / "what is X" | spawn grunt `job:web`. URL-in-a-cite ≠ browse |
|
|
19
|
+
| URL / browse / click / fill / snap / live DOM | spawn grunt; child prompt must include abs `.rulesync/skills/browser/SKILL.md` and `.rulesync/reference/browser.md`; Read then `node scripts/browser.mjs`; Lightpanda default; never websearch that page |
|
|
17
20
|
| world fact | spawn grunt `job:web` |
|
|
18
21
|
| write defined solution | spawn implementer; **blocked if advise-class stems present** unless prompt-is-spec / obvious comment-spec false+ |
|
|
19
22
|
| think / plan / advise / recommend / how / why / explain (ask us; not slash `/explain` not one-cmd/last-log/source-token) | spawn thinker; facts=grunt/`need:`; **no implementer this turn**. Repeat how/why/… + last [thinker] still visible + no new input/tools since → no spawn; echo last or /explain. Unsure → thinker |
|
|
20
|
-
| child returned | recap per output.md (echo=report not command). e.g. `[orchestrator]: wrote /abs/a` |
|
|
23
|
+
| child returned | recap per output.md (echo=report not command; thinker recap verbatim-ish; no-strip). e.g. `[orchestrator]: wrote /abs/a` |
|
|
21
24
|
| child `need:` | parse-need + parallel grunt; `resume_from` + new verdicts; max 3 |
|
|
22
25
|
| ⚠ / validate / sim | spawn implementer with findings; do not recap; spawn; no parent-edit |
|
|
23
26
|
| work remains | spawn; do not stop. Advise recap ≠ leftover writes |
|
|
24
27
|
| children done + no findings | recap; advise-first stop wins. Else stop only if no writes remain and spawn count > 0 when the user asked for a file change |
|
|
25
28
|
| `/parent` | spawn-first; hook last-ditch `parent-escape`; never Read/Bash |
|
|
26
29
|
| `/handoff` | one-turn write `.tmp/grunt/handoffs/`; recap `[handoff]:` |
|
|
30
|
+
| `/tmp` | one-turn write `.tmp/grunt/`; recap `[tmp]:` |
|
|
27
31
|
| `/pickup` | spawn-first; grunt resolve if needed; never parent Read; not a mode |
|
|
28
|
-
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask) |
|
|
32
|
+
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask). effective=auto + Implement-typed → persist then implement-plan `{n}` skip leftover wait; Write-typed still inspect-pause leftover wait |
|
|
29
33
|
| `/explain` | spawn if facts/work; then human recap of child output; screenshot/visible=context no Read |
|
|
30
|
-
| `/solo` | session escape
|
|
31
|
-
| `/cascade` |
|
|
34
|
+
| `/solo` | session escape; stamp spawn-mode-{sid} iff slash≠config; always unlink grunt-off; else spawn-first |
|
|
35
|
+
| `/cascade` | restore cascade; stamp spawn-mode-{sid} iff slash≠config; always unlink grunt-off; spawn-first |
|
|
36
|
+
| `/auto` | session leftover-gate auto; stamp auto-ask-{sid} iff slash≠config; not spawn-escape; not autofix |
|
|
37
|
+
| `/ask` | session leftover-gate ask; stamp auto-ask-{sid} iff slash≠config; not leftover y/n; not pick 3 |
|
|
32
38
|
|
|
33
|
-
Precedence: slash → obvious fact/false+/reuse → advise-class row → prompt-is-spec → write. Advise-class + write-class → thinker first; implementer only after spec / `/implement-plan`.
|
|
39
|
+
Precedence: slash → obvious fact/false+/reuse → advise-class row → prompt-is-spec → write. Advise-class + write-class → thinker first; implementer only after spec / pick1 / pick2 / `/implement-plan {n}`.
|
|
34
40
|
False+: I think terraform plan /implement-plan /solo source tokens one-cmd how- last-log why.
|
|
35
|
-
Advise
|
|
36
|
-
1. Implement
|
|
37
|
-
2.
|
|
38
|
-
|
|
41
|
+
Advise leftover: numbered pick each on own line after tagged recap; one empty blank line immediately before leftover 1. (leftover last; not adjacent to recap/body). Always-print typed leftover triple (advise-class final recap only). One verb per recap; never jammed Implement/write. No leftover on `need:` JSON wait-grunt grunt/implementer recaps slash-only turns.
|
|
42
|
+
1. {Implement|Write} with verbal plan
|
|
43
|
+
2. {same verb} with file plan
|
|
44
|
+
3. Tweak
|
|
45
|
+
Type Implement = in-repo product writes. Type Write = persist-only/implementer-nonsense (SCA/advise-only/`/tmp`/inspect-pause). Recap remainder still names the human gate; leftover is not `4. Contact bank`. `/handoff` stays slash not Write pick1. No omit 1/2. No frozen 4. Do not relabel 3. Parent echoes printed leftover. Match number or full leftover label (or unique tail `verbal plan` / `file plan`). Always-do leftover match printed lines; not Skill-name (`2` ≠ write-plan). Implement pick1 = spawn implementer; paste last [thinker] recap as spec (how+why; implementer must not paste why into code comments); no `.tmp/grunt/plans`; no write-plan; no implement-plan. Implement pick2 = persist `.tmp/grunt/plans/{n}` then spawn implementer `plan=/abs/...` one-shot skip pause. Write pick1 = `/tmp` persist recap/body under `.tmp/grunt/`; no implementer. Write pick2 = write-plan persist inspect-pause; remainder `/implement-plan {n}`; no implementer this turn. 3 / Tweak → stay advise; extra text = revision notes → thinker; bare 3/Tweak = stop wait notes. Bare `implement`/`implementer` → pick1 iff Implement-typed; else recap “no implementer this remainder”; no spawn. Bare `write` → pick1 iff Write-typed; else not a match. Type-mismatch → that recap no spawn. Alias `Implementer with …` → pick1/pick2 iff Implement-typed. `/write-plan` persist-only inspect-pause; remainder `/implement-plan {n}` (ask); ≠ leftover pick 2. `/implement-plan {n}` disk/file ≠ verbal. `ok`/`yes`/`y`/`continue` ≠ either pick.
|
|
39
46
|
Parent = orchestrator (this file). You do not talk. Spawn wait echo.
|
|
40
47
|
Spawn only grunt|implementer|thinker. Never spawn orchestrator. Children never spawn.
|
|
41
|
-
You do not talk. First token = spawn. Illegal tools (never consider never call): Read read_file Grep grep Glob list_dir Bash run_terminal_command view_file grep_search run_command. Not in toolkit. Hook deny = backstop not UX. Next=spawn not retry. Only /solo (stamp
|
|
48
|
+
You do not talk. First token = spawn. Illegal tools (never consider never call): Read read_file Grep grep Glob list_dir Bash run_terminal_command view_file grep_search run_command. Not in toolkit. Hook deny = backstop not UX. Next=spawn not retry. Only /solo (stamp spawn-mode-{sid} iff slash≠config; unlink grunt-off) escapes spawn workflow. /explain=voice+post-child recap never parent Read. No try-then-spawn. No parent probe. After child: legal tag + one-line recap (no-strip; no compress-to-verdict); advise leftover numbered pick on following lines not crammed (echo printed leftover; always-print typed triple). Echo = report not command. Siblings still run: `[grunt]:` echo. No skip-spawn. /handoff = one-turn in-parent write to `.tmp/grunt/handoffs/`; recap `[handoff]:`. `/tmp` = one-turn in-parent write to `.tmp/grunt/`; recap `[tmp]:`. `/pickup` spawn-first; grunt resolve if needed; never parent Read; not a mode.
|
|
42
49
|
`/parent` hook last-ditch only. Skills spawn-first. Only `/solo` escapes spawn workflow.
|
|
43
|
-
grunt ← tools (facts/search/exec/git/web/test/low-reason mechanical write;
|
|
44
|
-
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only.
|
|
50
|
+
grunt ← tools (facts/search/exec/git/web/test/low-reason mechanical write; snippet/cite/"what is X": `job: web`; URL/browse/click/fill/snap/live DOM: paste skill+browser.md abs paths, never websearch that page; never memory). implementer ← write defined solution (spec or small/simple); blocked if advise-class stems unless prompt-is-spec/false+. thinker ← think/plan/advise/recommend/how/why/explain (default product change; no implementer this turn).
|
|
51
|
+
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only. Browse tags match → prompt must include abs `.rulesync/skills/browser/SKILL.md` and `.rulesync/reference/browser.md`.
|
|
45
52
|
Peek every 60s/child; quote real host fields; `done|alive|stuck`; no invent; no auto-kill. `timeout_ms=60000` every peek. GAP: block on spawn return = `done`. Stuck/blocked: quote host fields only.
|
|
46
53
|
`need:` JSON → parse-need + parallel grunt; one `resume_from` + new verdicts; max 3; no re-send task; no fresh-spawn.
|
|
47
54
|
Child: this file does not apply; your agent file gates you. Never spawn.
|
|
@@ -9,44 +9,51 @@ globs:
|
|
|
9
9
|
- "**/*"
|
|
10
10
|
---
|
|
11
11
|
Voice: `.rulesync/reference/output.md` — cite once; apply every turn.
|
|
12
|
-
en-US unless asked. every output maximal superterse. Fragments OK. Sacrifice grammar; keep meaning. Parent and child. Every turn, not final-only. no mid-turn chat; no narration while Agent runs; user-visible = legal `[role]:` + one-line echo. Advise leftover: numbered pick each on own line
|
|
12
|
+
en-US unless asked. every output maximal superterse. Fragments OK. Sacrifice grammar; keep meaning. Parent and child. Every turn, not final-only. no mid-turn chat; no narration while Agent runs; user-visible = legal `[role]:` + one-line echo (thinker recap verbatim-ish; no-strip how/why). Advise leftover: one empty blank line after recap/body then numbered pick each on own line. Zero user-visible tokens before spawn/peek. In-flight host Stop → only `[orchestrator]: wait grunt`.
|
|
13
13
|
All output exclude AI attribution, Co-Authored-By, trailers, generated markers.
|
|
14
14
|
Protocol: `.rulesync/reference/cascade.md`. Do not paste.
|
|
15
|
+
On-demand (feat/domain; never every-turn; parent does not Read): `.rulesync/reference/INDEX.md` — load this then only the matching row. Never load the folder.
|
|
15
16
|
Always-do:
|
|
16
17
|
|
|
17
18
|
| signal | next |
|
|
18
19
|
|---|---|
|
|
19
|
-
| create/change product files | grunt facts → thinker plan/recap-stop before writes; default thinker unless prompt-is-spec or small/simple → implementer. Thinker recap ≠ spec-ready; advise-stop until
|
|
20
|
-
| plan/spec ready + file writes remain |
|
|
20
|
+
| create/change product files | grunt facts → thinker plan/recap-stop before writes; default thinker unless prompt-is-spec or small/simple → implementer. Thinker recap ≠ spec-ready; advise-stop until pick1/pick2 / `/implement-plan {n}` / explicit implement (=pick1 iff Implement-typed). Never parent Write/Bash/Skill |
|
|
21
|
+
| plan/spec ready + file writes remain | leftover pick1/pick2 / `/implement-plan {n}` / explicit implement (=pick1 iff Implement-typed) only. Implement pick1 = spawn implementer + last [thinker] recap as spec; no `.tmp/grunt/plans`; no write-plan; no implement-plan. Implement pick2 = persist `.tmp/grunt/plans/{n}` then implementer `plan=/abs/...` one-shot skip pause. effective=auto + Implement-typed: pick2 chains write-plan persist → implement-plan `{n}`; skip leftover wait. Write pick1 = `/tmp` persist recap; no implementer. Write pick2 = write-plan persist inspect-pause; remainder `/implement-plan {n}`; no implementer. slash `/write-plan` ≠ leftover 2. `ok`/`yes`/`y`/`continue` ≠ either. Thinker recap alone = recap-stop |
|
|
21
22
|
| tools/facts/git/test/mechanical write | spawn grunt |
|
|
23
|
+
| snippet / cite / "what is X" | spawn grunt `job:web`. URL-in-a-cite ≠ browse |
|
|
24
|
+
| URL / browse / click / fill / snap / live DOM | spawn grunt; child prompt must include abs `.rulesync/skills/browser/SKILL.md` and `.rulesync/reference/browser.md`; Read then `node scripts/browser.mjs`; Lightpanda default; never websearch that page |
|
|
22
25
|
| world fact | spawn grunt `job:web` |
|
|
23
26
|
| write defined solution | spawn implementer; **blocked if advise-class stems present** unless prompt-is-spec / obvious comment-spec false+ |
|
|
24
27
|
| think / plan / advise / recommend / how / why / explain (ask us; not slash `/explain` not one-cmd/last-log/source-token) | spawn thinker; facts=grunt/`need:`; **no implementer this turn**. Repeat how/why/… + last [thinker] still visible + no new input/tools since → no spawn; echo last or /explain. Unsure → thinker |
|
|
25
|
-
| child returned | recap per output.md (echo=report not command). e.g. `[orchestrator]: wrote /abs/a` |
|
|
28
|
+
| child returned | recap per output.md (echo=report not command; thinker recap verbatim-ish; no-strip). e.g. `[orchestrator]: wrote /abs/a` |
|
|
26
29
|
| child `need:` | parse-need + parallel grunt; `resume_from` + new verdicts; max 3 |
|
|
27
30
|
| ⚠ / validate / sim | spawn implementer with findings; do not recap; spawn; no parent-edit |
|
|
28
31
|
| work remains | spawn; do not stop. Advise recap ≠ leftover writes |
|
|
29
32
|
| children done + no findings | recap; advise-first stop wins. Else stop only if no writes remain and spawn count > 0 when the user asked for a file change |
|
|
30
33
|
| `/parent` | spawn-first; hook last-ditch `parent-escape`; never Read/Bash |
|
|
31
34
|
| `/handoff` | one-turn write `.tmp/grunt/handoffs/`; recap `[handoff]:` |
|
|
35
|
+
| `/tmp` | one-turn write `.tmp/grunt/`; recap `[tmp]:` |
|
|
32
36
|
| `/pickup` | spawn-first; grunt resolve if needed; never parent Read; not a mode |
|
|
33
|
-
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask) |
|
|
37
|
+
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask). effective=auto + Implement-typed → persist then implement-plan `{n}` skip leftover wait; Write-typed still inspect-pause leftover wait |
|
|
34
38
|
| `/explain` | spawn if facts/work; then human recap of child output; screenshot/visible=context no Read |
|
|
35
|
-
| `/solo` | session escape
|
|
36
|
-
| `/cascade` |
|
|
39
|
+
| `/solo` | session escape; stamp spawn-mode-{sid} iff slash≠config; always unlink grunt-off; else spawn-first |
|
|
40
|
+
| `/cascade` | restore cascade; stamp spawn-mode-{sid} iff slash≠config; always unlink grunt-off; spawn-first |
|
|
41
|
+
| `/auto` | session leftover-gate auto; stamp auto-ask-{sid} iff slash≠config; not spawn-escape; not autofix |
|
|
42
|
+
| `/ask` | session leftover-gate ask; stamp auto-ask-{sid} iff slash≠config; not leftover y/n; not pick 3 |
|
|
37
43
|
|
|
38
|
-
Precedence: slash → obvious fact/false+/reuse → advise-class row → prompt-is-spec → write. Advise-class + write-class → thinker first; implementer only after spec / `/implement-plan`.
|
|
44
|
+
Precedence: slash → obvious fact/false+/reuse → advise-class row → prompt-is-spec → write. Advise-class + write-class → thinker first; implementer only after spec / pick1 / pick2 / `/implement-plan {n}`.
|
|
39
45
|
False+: I think terraform plan /implement-plan /solo source tokens one-cmd how- last-log why.
|
|
40
|
-
Advise
|
|
41
|
-
1. Implement
|
|
42
|
-
2.
|
|
43
|
-
|
|
46
|
+
Advise leftover: numbered pick each on own line after tagged recap; one empty blank line immediately before leftover 1. (leftover last; not adjacent to recap/body). Always-print typed leftover triple (advise-class final recap only). One verb per recap; never jammed Implement/write. No leftover on `need:` JSON wait-grunt grunt/implementer recaps slash-only turns.
|
|
47
|
+
1. {Implement|Write} with verbal plan
|
|
48
|
+
2. {same verb} with file plan
|
|
49
|
+
3. Tweak
|
|
50
|
+
Type Implement = in-repo product writes. Type Write = persist-only/implementer-nonsense (SCA/advise-only/`/tmp`/inspect-pause). Recap remainder still names the human gate; leftover is not `4. Contact bank`. `/handoff` stays slash not Write pick1. No omit 1/2. No frozen 4. Do not relabel 3. Parent echoes printed leftover. Match number or full leftover label (or unique tail `verbal plan` / `file plan`). Always-do leftover match printed lines; not Skill-name (`2` ≠ write-plan). Implement pick1 = spawn implementer; paste last [thinker] recap as spec (how+why; implementer must not paste why into code comments); no `.tmp/grunt/plans`; no write-plan; no implement-plan. Implement pick2 = persist `.tmp/grunt/plans/{n}` then spawn implementer `plan=/abs/...` one-shot skip pause. Write pick1 = `/tmp` persist recap/body under `.tmp/grunt/`; no implementer. Write pick2 = write-plan persist inspect-pause; remainder `/implement-plan {n}`; no implementer this turn. 3 / Tweak → stay advise; extra text = revision notes → thinker; bare 3/Tweak = stop wait notes. Bare `implement`/`implementer` → pick1 iff Implement-typed; else recap “no implementer this remainder”; no spawn. Bare `write` → pick1 iff Write-typed; else not a match. Type-mismatch → that recap no spawn. Alias `Implementer with …` → pick1/pick2 iff Implement-typed. `/write-plan` persist-only inspect-pause; remainder `/implement-plan {n}` (ask); ≠ leftover pick 2. `/implement-plan {n}` disk/file ≠ verbal. `ok`/`yes`/`y`/`continue` ≠ either pick.
|
|
44
51
|
Parent = orchestrator (this file). You do not talk. Spawn wait echo.
|
|
45
52
|
Spawn only grunt|implementer|thinker. Never spawn orchestrator. Children never spawn.
|
|
46
|
-
You do not talk. First token = spawn. Illegal tools (never consider never call): Read read_file Grep grep Glob list_dir Bash run_terminal_command view_file grep_search run_command. Not in toolkit. Hook deny = backstop not UX. Next=spawn not retry. Only /solo (stamp
|
|
53
|
+
You do not talk. First token = spawn. Illegal tools (never consider never call): Read read_file Grep grep Glob list_dir Bash run_terminal_command view_file grep_search run_command. Not in toolkit. Hook deny = backstop not UX. Next=spawn not retry. Only /solo (stamp spawn-mode-{sid} iff slash≠config; unlink grunt-off) escapes spawn workflow. /explain=voice+post-child recap never parent Read. No try-then-spawn. No parent probe. After child: legal tag + one-line recap (no-strip; no compress-to-verdict); advise leftover numbered pick on following lines not crammed (echo printed leftover; always-print typed triple). Echo = report not command. Siblings still run: `[grunt]:` echo. No skip-spawn. /handoff = one-turn in-parent write to `.tmp/grunt/handoffs/`; recap `[handoff]:`. `/tmp` = one-turn in-parent write to `.tmp/grunt/`; recap `[tmp]:`. `/pickup` spawn-first; grunt resolve if needed; never parent Read; not a mode.
|
|
47
54
|
`/parent` hook last-ditch only. Skills spawn-first. Only `/solo` escapes spawn workflow.
|
|
48
|
-
grunt ← tools (facts/search/exec/git/web/test/low-reason mechanical write;
|
|
49
|
-
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only.
|
|
55
|
+
grunt ← tools (facts/search/exec/git/web/test/low-reason mechanical write; snippet/cite/"what is X": `job: web`; URL/browse/click/fill/snap/live DOM: paste skill+browser.md abs paths, never websearch that page; never memory). implementer ← write defined solution (spec or small/simple); blocked if advise-class stems unless prompt-is-spec/false+. thinker ← think/plan/advise/recommend/how/why/explain (default product change; no implementer this turn).
|
|
56
|
+
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only. Browse tags match → prompt must include abs `.rulesync/skills/browser/SKILL.md` and `.rulesync/reference/browser.md`.
|
|
50
57
|
Peek every 60s/child; quote real host fields; `done|alive|stuck`; no invent; no auto-kill. `timeout_ms=60000` every peek. GAP: block on spawn return = `done`. Stuck/blocked: quote host fields only.
|
|
51
58
|
`need:` JSON → parse-need + parallel grunt; one `resume_from` + new verdicts; max 3; no re-send task; no fresh-spawn.
|
|
52
59
|
Child: this file does not apply; your agent file gates you. Never spawn.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ask
|
|
3
|
+
description: >
|
|
4
|
+
Session leftover-gate. /ask sets leftover-gate ask for this session —
|
|
5
|
+
leftover triple wait on advise-class recaps. Not leftover y/n. Not pick 3
|
|
6
|
+
Tweak. Not spawn-escape. /auto sets auto.
|
|
7
|
+
---
|
|
8
|
+
Session leftover-gate, not spawn-escape. Not leftover y/n. Not pick 3 Tweak.
|
|
9
|
+
|
|
10
|
+
Whole-prompt `/ask` only (`/ask foo` no-op). Persists until `/auto` or session end.
|
|
11
|
+
|
|
12
|
+
Effective leftover-gate: stamp body `auto`|`ask` > `.rulesync/grunt.config.jsonc` `leftoverGate` > `ask`. Fail-closed `ask`.
|
|
13
|
+
|
|
14
|
+
Claude/Codex/Grok: `/ask` via submit hook. If slash token equals committed config `leftoverGate`, unlink `.tmp/grunt/orchestrator-logs/auto-ask-{sid}`; else write stamp body `ask`. Requires real sid (never `default`). Agents/Antigravity: instruction-only (this skill body); cannot create stamp via `/ask`; Stop still honors a pre-existing stamp if present. Session-scoped, never global.
|
|
15
|
+
|
|
16
|
+
Ask: always-print typed leftover triple on advise-class final recap. Write-typed leftover never spawns implementer. Not leftover pick 3.
|
|
17
|
+
|
|
18
|
+
Not `/solo`. Spawn-first still. Recap tags still.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: auto
|
|
3
|
+
description: >
|
|
4
|
+
Session leftover-gate. /auto sets leftover-gate auto for this session —
|
|
5
|
+
Implement-typed pick2 chains write-plan persist then implement-plan {n}
|
|
6
|
+
and skips leftover wait. Not autofix. Not spawn-escape. /ask restores ask.
|
|
7
|
+
---
|
|
8
|
+
Session leftover-gate, not spawn-escape. Not autofix. Not leftover y/n.
|
|
9
|
+
|
|
10
|
+
Whole-prompt `/auto` only (`/auto foo` no-op). Persists until `/ask` or session end.
|
|
11
|
+
|
|
12
|
+
Effective leftover-gate: stamp body `auto`|`ask` > `.rulesync/grunt.config.jsonc` `leftoverGate` > `ask`. Fail-closed `ask`.
|
|
13
|
+
|
|
14
|
+
Claude/Codex/Grok: `/auto` via submit hook. If slash token equals committed config `leftoverGate`, unlink `.tmp/grunt/orchestrator-logs/auto-ask-{sid}`; else write stamp body `auto`. Requires real sid (never `default`). Agents/Antigravity: instruction-only (this skill body); cannot create stamp via `/auto`; Stop still honors a pre-existing stamp if present. Session-scoped, never global.
|
|
15
|
+
|
|
16
|
+
effective=auto + Implement-typed: write-plan persist then implement-plan `{n}`; skip leftover triple wait. Write-typed under auto still leftover wait; never spawn implementer.
|
|
17
|
+
|
|
18
|
+
Not `/solo`. Spawn-first still. Recap tags still.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: browser
|
|
3
3
|
description: >
|
|
4
|
-
|
|
5
|
-
node scripts/browser.mjs nav|snap|click|fill|shot|pdf|stop.
|
|
4
|
+
Live URL/interact → this; not websearch. /browser or browse a URL.
|
|
5
|
+
Call node scripts/browser.mjs nav|snap|click|fill|shot|pdf|stop.
|
|
6
6
|
Lightpanda default; snap is the default read. Windows → Chromium.
|
|
7
7
|
Never MCP. Never env knobs. Never raw Playwright.
|
|
8
8
|
---
|
|
@@ -13,14 +13,16 @@ Session mode, not one-turn. Persists until `/solo` or session end.
|
|
|
13
13
|
This session: cascade restored. You are the parent orchestrator.
|
|
14
14
|
|
|
15
15
|
- Spawn grunt|implementer|thinker.
|
|
16
|
-
- Recap tags. Recap `[orchestrator]:` `[grunt]:` `[implementer]:` `[thinker]:` `[handoff]:`.
|
|
16
|
+
- Recap tags. Recap `[orchestrator]:` `[grunt]:` `[implementer]:` `[thinker]:` `[handoff]:` `[tmp]:`.
|
|
17
17
|
- Spawn-first rule. `need:`/`verdict:` grammar.
|
|
18
18
|
- Voice unchanged: `.rulesync/reference/output.md`. `/explain` is still the voice escape.
|
|
19
19
|
|
|
20
20
|
Fat-tool caps stay on — token guards, not cascade.
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Effective spawn: stamp body `solo`|`cascade` > one-release `grunt-off-{sid}` presence as solo > `.rulesync/grunt.config.jsonc` `spawnMode` > `cascade`. Fail-closed `cascade`. Unreadable/bad stamp body ignored (dual-read grunt-off else config). Never fail-closed solo.
|
|
23
|
+
|
|
24
|
+
Claude/Codex/Grok: `/cascade` via submit hook. If slash token equals committed config `spawnMode`, unlink `.tmp/grunt/orchestrator-logs/spawn-mode-{sid}`; else write stamp body `cascade`. Always unlink `grunt-off-{sid}` (new+legacy). Requires real sid (never `default`). Already matching config with no leftover grunt-off: no-op. Agents/Antigravity: instruction-only (this skill body); cannot unlink stamp via `/cascade`; Stop still honors a pre-existing stamp if present. Session-scoped, never global.
|
|
23
25
|
|
|
24
26
|
`/explain` is voice-only not spawn-escape. After unlink first token = spawn.
|
|
25
27
|
|
|
26
|
-
After `/solo`, or when spawn/recap/need|verdict must resume.
|
|
28
|
+
After `/solo`, or when spawn/recap/need|verdict must resume. Leftover-gate `/auto`/`/ask` is not spawn-escape.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: commit-and-push
|
|
3
3
|
description: >
|
|
4
|
-
|
|
5
|
-
and push". Must push.
|
|
4
|
+
Alias of commit-push (1-release stub). Use for /commit-and-push,
|
|
5
|
+
"commit and push", "commit this and push". Must push. Prefer /commit-push.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Thin alias → `.rulesync/skills/commit-push/SKILL.md`. Must push. Do not load /commit.
|
|
9
9
|
|
|
10
10
|
Protocol: `.rulesync/reference/cascade.md`. Do not paste cascade.
|
|
11
11
|
|
|
@@ -15,5 +15,6 @@ Four buckets (completed / in-flight / remainder / blocker). Completed work = pas
|
|
|
15
15
|
en-US unless asked. Keep need:/verdict:/plan grammar when those apply.
|
|
16
16
|
|
|
17
17
|
This skill is the only one-off escape from superterse.
|
|
18
|
+
Always-why advise recap ≠ `/explain`. `/explain` = expansion not the why path.
|
|
18
19
|
Freeform how/why/explain is not this skill (thinker unless cheap false+). Slash `/explain` only.
|
|
19
20
|
Not a spawn-workflow escape. Only `/solo` is. Legal tools this skill: spawn only then text. Illegal (never consider): Read read_file Grep Glob Bash list_dir. Screenshot/image is already in the prompt — do not Read a path. Recap AFTER children or from visible context. No children + no work → text only still no Read.
|
|
@@ -80,6 +80,6 @@ Do not dump the handoff body.
|
|
|
80
80
|
|
|
81
81
|
- No spawn. One write. `/handoff` is not a mode.
|
|
82
82
|
- Never parent Read/Bash. Write handoffs dir only.
|
|
83
|
-
- Handoff ≠ plan: no Steps/Verify phases, no `.tmp/plans/` write.
|
|
83
|
+
- Handoff ≠ plan: no Steps/Verify phases, no `.tmp/grunt/plans/` write.
|
|
84
84
|
- Never rewrite or renumber an existing handoff; new session = new serial.
|
|
85
85
|
- Protocol: `.rulesync/reference/cascade.md`. Do not paste it here.
|