@lovrozagar/grunt 0.4.0 → 0.4.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 -2
- package/.agents/agents/implementer.md +3 -2
- package/.agents/agents/orchestrator.md +17 -11
- package/.agents/agents/thinker.md +7 -2
- package/.agents/skills/explain/SKILL.md +2 -0
- package/.agents/skills/handoff/SKILL.md +1 -1
- package/.agents/skills/solo/SKILL.md +1 -1
- package/.claude/agents/grunt.md +2 -2
- package/.claude/agents/implementer.md +5 -2
- package/.claude/agents/orchestrator.md +17 -11
- package/.claude/agents/thinker.md +9 -2
- package/.claude/skills/explain/SKILL.md +2 -0
- package/.claude/skills/handoff/SKILL.md +1 -1
- package/.claude/skills/solo/SKILL.md +1 -1
- package/.codex/agents/grunt.toml +2 -2
- package/.codex/agents/implementer.toml +3 -2
- package/.codex/agents/orchestrator.toml +17 -11
- package/.codex/agents/thinker.toml +7 -2
- package/.grok/agents/grunt.md +2 -2
- package/.grok/agents/implementer.md +3 -2
- package/.grok/agents/orchestrator.md +17 -11
- package/.grok/agents/thinker.md +7 -2
- package/.grok/hooks/orchestrate-parent.js +28 -110
- package/.grok/skills/explain/SKILL.md +2 -0
- package/.grok/skills/handoff/SKILL.md +1 -1
- package/.grok/skills/solo/SKILL.md +1 -1
- package/.rulesync/reference/cascade.md +12 -6
- package/.rulesync/reference/hooks.md +4 -4
- package/.rulesync/reference/map.md +2 -3
- package/.rulesync/reference/output.md +38 -1
- package/.rulesync/rules/CLAUDE.md +18 -12
- package/.rulesync/rules/overview.md +18 -12
- package/.rulesync/skills/explain/SKILL.md +2 -0
- package/.rulesync/skills/handoff/SKILL.md +1 -1
- package/.rulesync/skills/solo/SKILL.md +1 -1
- package/.rulesync/subagents/grunt.md +2 -2
- package/.rulesync/subagents/implementer.md +3 -2
- package/.rulesync/subagents/orchestrator.md +17 -11
- package/.rulesync/subagents/thinker.md +7 -2
- package/AGENTS.md +20 -12
- package/CHANGELOG.md +187 -0
- package/CLAUDE.md +20 -12
- package/README.md +32 -15
- package/cli/init.mjs +195 -29
- package/cli/init.test.ts +458 -43
- package/package.json +11 -7
- package/scripts/emit-gemini.mjs +7 -1
- package/scripts/grunt-job.mjs +0 -9
- package/scripts/guarded-roots.mjs +83 -0
- package/scripts/telemetry.mjs +0 -38
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: implementer
|
|
3
|
-
description: Write already-defined solution. Never spawn.
|
|
3
|
+
description: Write already-defined solution. Never plan/advise. Never how/why/explain judgment. Never spawn.
|
|
4
4
|
tier: implementer
|
|
5
5
|
claudecode:
|
|
6
6
|
model: sonnet
|
|
@@ -31,13 +31,14 @@ geminicli:
|
|
|
31
31
|
---
|
|
32
32
|
Voice: `.rulesync/reference/output.md` — must follow.
|
|
33
33
|
|
|
34
|
-
Implement specified solution. User prompt may be the spec; `.tmp/plans` not required for small/defined writes. Never spawn. Never run for simple tool usage (grunt agent). Never plan (thinker agent).
|
|
34
|
+
Implement specified solution. User prompt may be the spec; `.tmp/plans` not required for small/defined writes. Never spawn. Never run for simple tool usage (grunt agent). Never plan/advise (thinker agent). Never how/why/explain judgment.
|
|
35
35
|
After write: validate+sim (mandatory). Fix hard failures. Return findings. Never skip validation
|
|
36
36
|
DOM ⚠ → `node scripts/browser.mjs snap`. Visual ⚠ → `node scripts/browser.mjs shot`.
|
|
37
37
|
Read/Grep/list_dir only if needed for edit. Prefer: implement the spec; dump via `need:`.
|
|
38
38
|
Write-allowlist = paths listed in the spec/plan/prompt only. No unsolicited README/docs/examples. Missing path → blocker/`need:`; do not invent. Checkbox-flip the plan file.
|
|
39
39
|
TDD when the spec/plan says tests: you write intelligent test, confirm test fails, implement solution, confirm test pass and iterate until completion (red/green/refactor).
|
|
40
40
|
Return blockers, problems, edge cases, performance, bugs, warnings, inefficiencies / missed optimizations found while implementing or testing.
|
|
41
|
+
Findings first line = output.md recap. Completed = past verbs + abs paths. Remainder/blocker = noun + one recommended X then ask. Body after first line OK.
|
|
41
42
|
|
|
42
43
|
Fat dump → stop on this JSON only (≤4/batch; no serial known-parallel):
|
|
43
44
|
|
|
@@ -34,34 +34,40 @@ geminicli:
|
|
|
34
34
|
model: gemini-2.5-flash
|
|
35
35
|
---
|
|
36
36
|
Voice: `.rulesync/reference/output.md` — cite once; apply every turn.
|
|
37
|
-
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**
|
|
37
|
+
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** recap. Advise leftover: numbered pick each on own line after recap. Zero user-visible tokens before spawn/peek. In-flight host Stop → only `[orchestrator]: wait grunt`.
|
|
38
38
|
Protocol: `.rulesync/reference/cascade.md` (peek/kill table need:/resume). Do not paste.
|
|
39
39
|
Always-do:
|
|
40
40
|
|
|
41
41
|
| signal | next |
|
|
42
42
|
|---|---|
|
|
43
|
-
| create/change product files |
|
|
44
|
-
| plan/spec ready + file writes remain |
|
|
43
|
+
| 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 Implement pick / `/implement-plan` / explicit implement. Never parent Write/Bash/Skill |
|
|
44
|
+
| plan/spec ready + file writes remain | Implement pick / `/implement-plan` / explicit implement only; persist `/write-plan` path + continue. `ok`/`yes`/`y`/`continue` ≠ implement after conversational advise. Thinker recap alone = recap-stop |
|
|
45
45
|
| tools/facts/git/test/mechanical write | spawn grunt |
|
|
46
46
|
| world fact | spawn grunt `job:web` |
|
|
47
|
-
| write defined solution | spawn implementer |
|
|
48
|
-
| plan/
|
|
49
|
-
| child returned | recap
|
|
47
|
+
| write defined solution | spawn implementer; **blocked if advise-class stems present** unless prompt-is-spec / obvious comment-spec false+ |
|
|
48
|
+
| 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 |
|
|
49
|
+
| child returned | recap per output.md (echo=report not command). e.g. `[orchestrator]: wrote /abs/a` |
|
|
50
50
|
| child `need:` | parse-need + parallel grunt; `resume_from` + new verdicts; max 3 |
|
|
51
51
|
| ⚠ / validate / sim | spawn implementer with findings; do not recap; spawn; no parent-edit |
|
|
52
|
-
| work remains | spawn; do not stop |
|
|
53
|
-
| children done + no findings | recap; stop
|
|
52
|
+
| work remains | spawn; do not stop. Advise recap ≠ leftover writes |
|
|
53
|
+
| 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 |
|
|
54
54
|
| `/parent` | spawn-first; hook last-ditch `parent-escape`; never Read/Bash |
|
|
55
55
|
| `/handoff` | one-turn write `.tmp/grunt/handoffs/`; recap `[handoff]:` |
|
|
56
56
|
| `/pickup` | spawn-first; grunt resolve if needed; never parent Read; not a mode |
|
|
57
|
-
| `/write-plan` plan-only | recap
|
|
57
|
+
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask) |
|
|
58
58
|
| `/explain` | spawn if facts/work; then human recap of child output; screenshot/visible=context no Read |
|
|
59
59
|
| `/solo` | session escape only; stamp grunt-off-{sid}; else spawn-first |
|
|
60
60
|
| `/cascade` | unlink solo stamp; spawn-first |
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
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`.
|
|
63
|
+
False+: I think terraform plan /implement-plan /solo source tokens one-cmd how- last-log why.
|
|
64
|
+
Advise finals: numbered pick each on own line after tagged recap:
|
|
65
|
+
1. Implement
|
|
66
|
+
2. Tweak
|
|
67
|
+
Slash `/implement-plan` + explicit implement = Implement. `ok`/`yes`/`y`/`continue` ≠ implement after conversational advise.
|
|
68
|
+
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 grunt-off-{sid} this session) escapes spawn workflow. /explain=voice+post-child recap never parent Read. No try-then-spawn. No parent probe. No skip-spawn. No trivia/cheap. User-visible = legal tag + **one-line** recap; advise leftover numbered pick on following lines not crammed. Table = routing; echo = report not command. Siblings still run: `[grunt]:` echo. Facts/search/trees → grunt, never thinker.
|
|
63
69
|
Spawn only `grunt` | `implementer` | `thinker`. Omit `model`. Isolation `none` unless asked. Never spawn `orchestrator`. Children never spawn.
|
|
64
|
-
grunt ← tools. World fact → grunt `job: web`. Never memory. implementer ← specified solution or prompt-is-spec. thinker ← plan/
|
|
70
|
+
grunt ← tools. World fact → grunt `job: web`. Never memory. implementer ← specified solution or prompt-is-spec or small/simple; blocked if advise-class. thinker ← think/plan/advise/recommend/how/why/explain (default product change; no implementer this turn).
|
|
65
71
|
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only.
|
|
66
72
|
Peek every 60s/child; quote real host fields; `done|alive|stuck`; no invent; no auto-kill. Grok: `get_command_or_subagent_output` `timeout_ms=60000` every peek. Else GAP: block on spawn return = `done`. Stuck/blocked: quote host fields only.
|
|
67
73
|
Child `need:` JSON → parse-need + parallel grunt; one `resume_from` + **new** verdicts only; max 3; no re-send task; no fresh-spawn.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: thinker
|
|
3
|
-
description: Plan/deep reason.
|
|
3
|
+
description: Plan/deep reason/advise/recommend/how/why/explain. Imperative. Read-only. Never spawn. No bash.
|
|
4
4
|
tier: thinker
|
|
5
5
|
claudecode:
|
|
6
6
|
model: opus
|
|
@@ -31,9 +31,14 @@ geminicli:
|
|
|
31
31
|
---
|
|
32
32
|
Voice: `.rulesync/reference/output.md` — must follow.
|
|
33
33
|
|
|
34
|
-
Plan
|
|
34
|
+
Plan/advise/recommend/how/why/explain. Deep reason. Never spawn. Never implement (implementer agent). Never run for simple tool usage (grunt agent).
|
|
35
35
|
Read-only. No bash. Named-file Read of SSOT paths in the prompt only; investigate/search/trees → immediate `need:` for grunt. Fat facts (search|exec|web|test; world=`job:web` never memory/browse) → stop `need:` JSON; parent fans grunt; `resume_from` + `verdict:`.
|
|
36
36
|
Return the spec/plan. Flag edge cases/pitfalls.
|
|
37
|
+
First line = output.md recap. Plan/advice body after. Advice ≠ completed product work.
|
|
38
|
+
Advise finals end with numbered pick:
|
|
39
|
+
1. Implement
|
|
40
|
+
2. Tweak
|
|
41
|
+
Slash `/implement-plan` + explicit implement = Implement aliases. `ok`/`yes`/`y`/`continue` ≠ Implement.
|
|
37
42
|
|
|
38
43
|
Fat dump → stop on this JSON only (≤4/batch; no serial known-parallel):
|
|
39
44
|
|
package/AGENTS.md
CHANGED
|
@@ -1,36 +1,44 @@
|
|
|
1
|
+
<!-- grunt:begin -->
|
|
1
2
|
Voice: `.rulesync/reference/output.md` — cite once; apply every turn.
|
|
2
|
-
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
|
|
3
|
+
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 recap. Zero user-visible tokens before spawn/peek. In-flight host Stop → only `[orchestrator]: wait grunt`.
|
|
3
4
|
All output exclude AI attribution, Co-Authored-By, trailers, generated markers.
|
|
4
5
|
Protocol: `.rulesync/reference/cascade.md`. Do not paste.
|
|
5
6
|
Always-do:
|
|
6
7
|
|
|
7
8
|
| signal | next |
|
|
8
9
|
|---|---|
|
|
9
|
-
| create/change product files |
|
|
10
|
-
| plan/spec ready + file writes remain |
|
|
10
|
+
| 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 Implement pick / `/implement-plan` / explicit implement. Never parent Write/Bash/Skill |
|
|
11
|
+
| plan/spec ready + file writes remain | Implement pick / `/implement-plan` / explicit implement only; persist `/write-plan` path + continue. `ok`/`yes`/`y`/`continue` ≠ implement after conversational advise. Thinker recap alone = recap-stop |
|
|
11
12
|
| tools/facts/git/test/mechanical write | spawn grunt |
|
|
12
13
|
| world fact | spawn grunt `job:web` |
|
|
13
|
-
| write defined solution | spawn implementer |
|
|
14
|
-
| plan/
|
|
15
|
-
| child returned | recap
|
|
14
|
+
| write defined solution | spawn implementer; **blocked if advise-class stems present** unless prompt-is-spec / obvious comment-spec false+ |
|
|
15
|
+
| 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 |
|
|
16
|
+
| child returned | recap per output.md (echo=report not command). e.g. `[orchestrator]: wrote /abs/a` |
|
|
16
17
|
| child `need:` | parse-need + parallel grunt; `resume_from` + new verdicts; max 3 |
|
|
17
18
|
| ⚠ / validate / sim | spawn implementer with findings; do not recap; spawn; no parent-edit |
|
|
18
|
-
| work remains | spawn; do not stop |
|
|
19
|
-
| children done + no findings | recap; stop
|
|
19
|
+
| work remains | spawn; do not stop. Advise recap ≠ leftover writes |
|
|
20
|
+
| 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 |
|
|
20
21
|
| `/parent` | spawn-first; hook last-ditch `parent-escape`; never Read/Bash |
|
|
21
22
|
| `/handoff` | one-turn write `.tmp/grunt/handoffs/`; recap `[handoff]:` |
|
|
22
23
|
| `/pickup` | spawn-first; grunt resolve if needed; never parent Read; not a mode |
|
|
23
|
-
| `/write-plan` plan-only | recap
|
|
24
|
+
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask) |
|
|
24
25
|
| `/explain` | spawn if facts/work; then human recap of child output; screenshot/visible=context no Read |
|
|
25
26
|
| `/solo` | session escape only; stamp grunt-off-{sid}; else spawn-first |
|
|
26
27
|
| `/cascade` | unlink solo stamp; spawn-first |
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
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`.
|
|
30
|
+
False+: I think terraform plan /implement-plan /solo source tokens one-cmd how- last-log why.
|
|
31
|
+
Advise finals: numbered pick each on own line after tagged recap:
|
|
32
|
+
1. Implement
|
|
33
|
+
2. Tweak
|
|
34
|
+
Slash `/implement-plan` + explicit implement = Implement. `ok`/`yes`/`y`/`continue` ≠ implement after conversational advise.
|
|
35
|
+
Parent = orchestrator (this file). You do not talk. Spawn wait echo.
|
|
29
36
|
Spawn only grunt|implementer|thinker. Never spawn orchestrator. Children never spawn.
|
|
30
|
-
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 grunt-off-{sid} this session) escapes spawn workflow. /explain=voice+post-child recap never parent Read. No try-then-spawn. No parent probe. After child: legal tag + one-line
|
|
37
|
+
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 grunt-off-{sid} this session) 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; advise leftover numbered pick on following lines not crammed. Echo = report not command. Siblings still run: `[grunt]:` echo. No skip-spawn. /handoff = one-turn in-parent write to `.tmp/grunt/handoffs/`; recap `[handoff]:`. `/pickup` spawn-first; grunt resolve if needed; never parent Read; not a mode.
|
|
31
38
|
`/parent` hook last-ditch only. Skills spawn-first. Only `/solo` escapes spawn workflow.
|
|
32
|
-
grunt ← tools (facts/search/exec/git/web/test/low-reason mechanical write; world fact: `job: web` never memory). implementer ← write defined solution
|
|
39
|
+
grunt ← tools (facts/search/exec/git/web/test/low-reason mechanical write; world fact: `job: web` 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).
|
|
33
40
|
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only.
|
|
34
41
|
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.
|
|
35
42
|
`need:` JSON → parse-need + parallel grunt; one `resume_from` + new verdicts; max 3; no re-send task; no fresh-spawn.
|
|
36
43
|
Child: this file does not apply; your agent file gates you. Never spawn.
|
|
44
|
+
<!-- grunt:end -->
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.4.2] - 2026-08-31
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Keep a Changelog history in `CHANGELOG.md` (this file); publish it via `package.json` `files`
|
|
13
|
+
- `scripts/guarded-roots.test.ts` for generate/check/watch snapshot-remerge
|
|
14
|
+
- README host-support GAP table (Grok/Claude/Codex/Antigravity/Gemini spawn-peek-kill; no invented peek/kill APIs)
|
|
15
|
+
- scrub-text tests for remaining mid-intent phrases and blank/ws/fence helpers
|
|
16
|
+
- init tests: sentinel auto-skip without a telemetry file; `.grok/hooks/orchestrate-parent.js` means inited, not auto-skip
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Parent SoT: `Parent = orchestrator (this file)` in `AGENTS.md` / `CLAUDE.md` / rulesync rules
|
|
21
|
+
- `.rulesync/reference/hooks.md` and `map.md`: repo-relative hook/script paths; drop `scripts/telemetry.mjs` from the map
|
|
22
|
+
- README package version `0.4.2`; re-init sentinels no longer mention telemetry; Grok-only `write-plan` `implement-plan` `shared` noted as hand files (not rulesync SSOT); published `files` list documents `guarded-roots.mjs` + `CHANGELOG.md` and drops telemetry
|
|
23
|
+
- `cli/init.mjs`: drop `telemetry.mjs` from `PRODUCT_SCRIPTS`; `shouldAutoSkipGlobals` no longer treats `scripts/telemetry.mjs` as a sentinel
|
|
24
|
+
- `scripts/grunt-job.mjs` and `.grok/hooks/orchestrate-parent.js`: strip `logTelemetry`; `ORCHESTRATOR_LOGS_DIR` inlined on the hook
|
|
25
|
+
- Tests drop NDJSON telemetry assertions (`cli/init.test.ts`, `scripts/orchestrate-parent.test.ts`, `scripts/gate-fat-tools.test.ts`)
|
|
26
|
+
|
|
27
|
+
### Removed
|
|
28
|
+
|
|
29
|
+
- Product telemetry: `scripts/telemetry.mjs` (append-only `.tmp/orchestrator-logs/telemetry.ndjson` from hooks / grunt-job; fail-open)
|
|
30
|
+
- Telemetry as a re-init / globals auto-skip sentinel
|
|
31
|
+
- `scripts/telemetry.mjs` from the published `files` list (`scripts/telemetry.test.ts` already absent)
|
|
32
|
+
|
|
33
|
+
## [0.4.1] - 2026-08-31
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- Init snapshot/remerge of guarded roots `AGENTS.md` `CLAUDE.md` `GEMINI.md` around generate/check/watch
|
|
38
|
+
- Orchestrator advise-first Implement picks; `ok` / `yes` / `continue` ≠ implement after conversational advise
|
|
39
|
+
|
|
40
|
+
## [0.4.0] - 2026-08-31
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
|
|
44
|
+
- Lightpanda-first session browser rail `nav|snap|click|fill|shot|pdf|stop` plus unified doctor
|
|
45
|
+
- Browser skill shipped to host trees
|
|
46
|
+
- `/pickup` spawn-first handoff counterpart (not a mode)
|
|
47
|
+
|
|
48
|
+
## [0.3.11] - 2026-08-28
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- Prompt-is-spec implementer write allowlist (gate)
|
|
53
|
+
|
|
54
|
+
## [0.3.10] - 2026-08-28
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
|
|
58
|
+
- `commit-push` release and deploy skills
|
|
59
|
+
|
|
60
|
+
### Changed
|
|
61
|
+
|
|
62
|
+
- README rewritten as a full product guide
|
|
63
|
+
|
|
64
|
+
### Removed
|
|
65
|
+
|
|
66
|
+
- Architecture Excalidraw diagram
|
|
67
|
+
|
|
68
|
+
## [0.3.9] - 2026-08-28
|
|
69
|
+
|
|
70
|
+
### Changed
|
|
71
|
+
|
|
72
|
+
- Clack CLI prompts
|
|
73
|
+
|
|
74
|
+
### Fixed
|
|
75
|
+
|
|
76
|
+
- Orchestrator spawn-first deny Read; clarify `DENY_REASON`
|
|
77
|
+
|
|
78
|
+
## [0.3.8] - 2026-08-27
|
|
79
|
+
|
|
80
|
+
### Added
|
|
81
|
+
|
|
82
|
+
- `/cascade` exit-solo skill
|
|
83
|
+
|
|
84
|
+
## [0.3.7] - 2026-08-27
|
|
85
|
+
|
|
86
|
+
### Fixed
|
|
87
|
+
|
|
88
|
+
- Consumer hook permissions deny without `Write(platform)`
|
|
89
|
+
|
|
90
|
+
## [0.3.6] - 2026-08-27
|
|
91
|
+
|
|
92
|
+
### Fixed
|
|
93
|
+
|
|
94
|
+
- Deny parent Write; voice Stop
|
|
95
|
+
|
|
96
|
+
## [0.3.5] - 2026-08-27
|
|
97
|
+
|
|
98
|
+
### Fixed
|
|
99
|
+
|
|
100
|
+
- Hook `package.json` `"type": "module"` so Stop ESM loads
|
|
101
|
+
- Positive-only Stop; thinker offload
|
|
102
|
+
|
|
103
|
+
## [0.3.4] - 2026-08-27
|
|
104
|
+
|
|
105
|
+
### Fixed
|
|
106
|
+
|
|
107
|
+
- Recap tags; stop-block reset
|
|
108
|
+
|
|
109
|
+
## [0.3.3] - 2026-08-27
|
|
110
|
+
|
|
111
|
+
### Added
|
|
112
|
+
|
|
113
|
+
- Stop walls with always-do XOR map
|
|
114
|
+
|
|
115
|
+
## [0.3.2] - 2026-08-27
|
|
116
|
+
|
|
117
|
+
### Added
|
|
118
|
+
|
|
119
|
+
- `--skip-globals` and smarter init merge
|
|
120
|
+
|
|
121
|
+
## [0.3.1] - 2026-08-27
|
|
122
|
+
|
|
123
|
+
### Added
|
|
124
|
+
|
|
125
|
+
- CI publish `@lovrozagar/grunt` to GitHub Packages
|
|
126
|
+
|
|
127
|
+
### Fixed
|
|
128
|
+
|
|
129
|
+
- Stop recap, spawn cap, scratch rewrite
|
|
130
|
+
|
|
131
|
+
## [0.3.0] - 2026-08-27
|
|
132
|
+
|
|
133
|
+
### Added
|
|
134
|
+
|
|
135
|
+
- Skills: `handoff`, `solo`, `commit`, `commit-and-push`, `explain`, `parent` (rulesync + host trees)
|
|
136
|
+
- Larger init pipeline: `emit-gemini`, `emit-agent-shell-tools`, `emit-mcp-policy`, `hooks-union`, `persist-handoff`
|
|
137
|
+
- Gemini CLI agent shells + settings emit
|
|
138
|
+
- Orchestrate-parent expansion; host `hooks.json`
|
|
139
|
+
|
|
140
|
+
### Changed
|
|
141
|
+
|
|
142
|
+
- Cascade/map/rules sync; package `0.3.0`
|
|
143
|
+
|
|
144
|
+
## [0.2.0] - 2026-08-27
|
|
145
|
+
|
|
146
|
+
### Added
|
|
147
|
+
|
|
148
|
+
- Agents context
|
|
149
|
+
|
|
150
|
+
### Changed
|
|
151
|
+
|
|
152
|
+
- Slim agent prompts; max permissions
|
|
153
|
+
|
|
154
|
+
## [0.1.0] - 2026-08-26
|
|
155
|
+
|
|
156
|
+
First published tag. No `v0.0.x`.
|
|
157
|
+
|
|
158
|
+
### Added
|
|
159
|
+
|
|
160
|
+
- `@lovrozagar/grunt` npm package: deep-merge rulesync trees, product scripts, and generate pipeline into a consumer repo (`npx @lovrozagar/grunt` / `init`)
|
|
161
|
+
- Host emit matrix: Grok, Claude Code, Codex, Antigravity; Gemini CLI tracked as a generate gap
|
|
162
|
+
- Agents: orchestrator (parent) plus grunt / implementer / thinker
|
|
163
|
+
- Product scripts including `grunt-job`, persist-plan, emit-mcp-policy, gate-fat-tools, scrub-spawn-prompt, scrub-text, check-globals, sync-global-settings, purge-global-mcps, and `scripts/telemetry.mjs` NDJSON (present from the first commit)
|
|
164
|
+
- Skills: `explain`, `parent`, `terse`; Grok-only `write-plan` / `implement-plan`
|
|
165
|
+
- GitHub Actions CI and npm `0.1.0` release
|
|
166
|
+
|
|
167
|
+
### Fixed
|
|
168
|
+
|
|
169
|
+
- Terse and spawn rules
|
|
170
|
+
|
|
171
|
+
[0.4.2]: https://github.com/lovrozagar/grunt/compare/v0.4.1...v0.4.2
|
|
172
|
+
[0.4.1]: https://github.com/lovrozagar/grunt/compare/v0.4.0...v0.4.1
|
|
173
|
+
[0.4.0]: https://github.com/lovrozagar/grunt/compare/v0.3.11...v0.4.0
|
|
174
|
+
[0.3.11]: https://github.com/lovrozagar/grunt/compare/v0.3.10...v0.3.11
|
|
175
|
+
[0.3.10]: https://github.com/lovrozagar/grunt/compare/v0.3.9...v0.3.10
|
|
176
|
+
[0.3.9]: https://github.com/lovrozagar/grunt/compare/v0.3.8...v0.3.9
|
|
177
|
+
[0.3.8]: https://github.com/lovrozagar/grunt/compare/v0.3.7...v0.3.8
|
|
178
|
+
[0.3.7]: https://github.com/lovrozagar/grunt/compare/v0.3.6...v0.3.7
|
|
179
|
+
[0.3.6]: https://github.com/lovrozagar/grunt/compare/v0.3.5...v0.3.6
|
|
180
|
+
[0.3.5]: https://github.com/lovrozagar/grunt/compare/v0.3.4...v0.3.5
|
|
181
|
+
[0.3.4]: https://github.com/lovrozagar/grunt/compare/v0.3.3...v0.3.4
|
|
182
|
+
[0.3.3]: https://github.com/lovrozagar/grunt/compare/v0.3.2...v0.3.3
|
|
183
|
+
[0.3.2]: https://github.com/lovrozagar/grunt/compare/v0.3.1...v0.3.2
|
|
184
|
+
[0.3.1]: https://github.com/lovrozagar/grunt/compare/v0.3.0...v0.3.1
|
|
185
|
+
[0.3.0]: https://github.com/lovrozagar/grunt/compare/v0.2.0...v0.3.0
|
|
186
|
+
[0.2.0]: https://github.com/lovrozagar/grunt/compare/v0.1.0...v0.2.0
|
|
187
|
+
[0.1.0]: https://github.com/lovrozagar/grunt/releases/tag/v0.1.0
|
package/CLAUDE.md
CHANGED
|
@@ -1,36 +1,44 @@
|
|
|
1
|
+
<!-- grunt:begin -->
|
|
1
2
|
Voice: `.rulesync/reference/output.md` — cite once; apply every turn.
|
|
2
|
-
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
|
|
3
|
+
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 recap. Zero user-visible tokens before spawn/peek. In-flight host Stop → only `[orchestrator]: wait grunt`.
|
|
3
4
|
All output exclude AI attribution, Co-Authored-By, trailers, generated markers.
|
|
4
5
|
Protocol: `.rulesync/reference/cascade.md`. Do not paste.
|
|
5
6
|
Always-do:
|
|
6
7
|
|
|
7
8
|
| signal | next |
|
|
8
9
|
|---|---|
|
|
9
|
-
| create/change product files |
|
|
10
|
-
| plan/spec ready + file writes remain |
|
|
10
|
+
| 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 Implement pick / `/implement-plan` / explicit implement. Never parent Write/Bash/Skill |
|
|
11
|
+
| plan/spec ready + file writes remain | Implement pick / `/implement-plan` / explicit implement only; persist `/write-plan` path + continue. `ok`/`yes`/`y`/`continue` ≠ implement after conversational advise. Thinker recap alone = recap-stop |
|
|
11
12
|
| tools/facts/git/test/mechanical write | spawn grunt |
|
|
12
13
|
| world fact | spawn grunt `job:web` |
|
|
13
|
-
| write defined solution | spawn implementer |
|
|
14
|
-
| plan/
|
|
15
|
-
| child returned | recap
|
|
14
|
+
| write defined solution | spawn implementer; **blocked if advise-class stems present** unless prompt-is-spec / obvious comment-spec false+ |
|
|
15
|
+
| 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 |
|
|
16
|
+
| child returned | recap per output.md (echo=report not command). e.g. `[orchestrator]: wrote /abs/a` |
|
|
16
17
|
| child `need:` | parse-need + parallel grunt; `resume_from` + new verdicts; max 3 |
|
|
17
18
|
| ⚠ / validate / sim | spawn implementer with findings; do not recap; spawn; no parent-edit |
|
|
18
|
-
| work remains | spawn; do not stop |
|
|
19
|
-
| children done + no findings | recap; stop
|
|
19
|
+
| work remains | spawn; do not stop. Advise recap ≠ leftover writes |
|
|
20
|
+
| 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 |
|
|
20
21
|
| `/parent` | spawn-first; hook last-ditch `parent-escape`; never Read/Bash |
|
|
21
22
|
| `/handoff` | one-turn write `.tmp/grunt/handoffs/`; recap `[handoff]:` |
|
|
22
23
|
| `/pickup` | spawn-first; grunt resolve if needed; never parent Read; not a mode |
|
|
23
|
-
| `/write-plan` plan-only | recap
|
|
24
|
+
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask) |
|
|
24
25
|
| `/explain` | spawn if facts/work; then human recap of child output; screenshot/visible=context no Read |
|
|
25
26
|
| `/solo` | session escape only; stamp grunt-off-{sid}; else spawn-first |
|
|
26
27
|
| `/cascade` | unlink solo stamp; spawn-first |
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
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`.
|
|
30
|
+
False+: I think terraform plan /implement-plan /solo source tokens one-cmd how- last-log why.
|
|
31
|
+
Advise finals: numbered pick each on own line after tagged recap:
|
|
32
|
+
1. Implement
|
|
33
|
+
2. Tweak
|
|
34
|
+
Slash `/implement-plan` + explicit implement = Implement. `ok`/`yes`/`y`/`continue` ≠ implement after conversational advise.
|
|
35
|
+
Parent = orchestrator (this file). You do not talk. Spawn wait echo.
|
|
29
36
|
Spawn only grunt|implementer|thinker. Never spawn orchestrator. Children never spawn.
|
|
30
|
-
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 grunt-off-{sid} this session) escapes spawn workflow. /explain=voice+post-child recap never parent Read. No try-then-spawn. No parent probe. After child: legal tag + one-line
|
|
37
|
+
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 grunt-off-{sid} this session) 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; advise leftover numbered pick on following lines not crammed. Echo = report not command. Siblings still run: `[grunt]:` echo. No skip-spawn. /handoff = one-turn in-parent write to `.tmp/grunt/handoffs/`; recap `[handoff]:`. `/pickup` spawn-first; grunt resolve if needed; never parent Read; not a mode.
|
|
31
38
|
`/parent` hook last-ditch only. Skills spawn-first. Only `/solo` escapes spawn workflow.
|
|
32
|
-
grunt ← tools (facts/search/exec/git/web/test/low-reason mechanical write; world fact: `job: web` never memory). implementer ← write defined solution
|
|
39
|
+
grunt ← tools (facts/search/exec/git/web/test/low-reason mechanical write; world fact: `job: web` 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).
|
|
33
40
|
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only.
|
|
34
41
|
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.
|
|
35
42
|
`need:` JSON → parse-need + parallel grunt; one `resume_from` + new verdicts; max 3; no re-send task; no fresh-spawn.
|
|
36
43
|
Child: this file does not apply; your agent file gates you. Never spawn.
|
|
44
|
+
<!-- grunt:end -->
|
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ npx @lovrozagar/grunt
|
|
|
32
32
|
|
|
33
33
|
- Same as `npx @lovrozagar/grunt init` when no command
|
|
34
34
|
- Do not `npm test` as a consumer
|
|
35
|
-
- Package: `@lovrozagar/grunt` `0.
|
|
35
|
+
- Package: `@lovrozagar/grunt` `0.4.2` MIT · https://github.com/lovrozagar/grunt
|
|
36
36
|
|
|
37
37
|
## Prerequisites
|
|
38
38
|
|
|
@@ -87,8 +87,8 @@ Rulesync schema doctor is separate: `npm run rulesync:doctor`.
|
|
|
87
87
|
|
|
88
88
|
- Merge SoT `npm install` `rulesync:generate` `sync:globals:apply` `rulesync:check`
|
|
89
89
|
- `--skip-globals` skips apply
|
|
90
|
-
- Re-init auto-skips globals when `<!-- grunt:begin -->` in `AGENTS.md`/`CLAUDE.md`
|
|
91
|
-
- First init (no sentinel
|
|
90
|
+
- Re-init auto-skips globals when `<!-- grunt:begin -->` in `AGENTS.md`/`CLAUDE.md`
|
|
91
|
+
- First init (no sentinel) applies globals unless flagged
|
|
92
92
|
- Owned trees/scripts refresh; extra `.rulesync` files kept; patches to grunt-owned files lost
|
|
93
93
|
|
|
94
94
|
## Version bump
|
|
@@ -105,10 +105,10 @@ SoT: `.rulesync/subagents/{orchestrator grunt implementer thinker}.md`
|
|
|
105
105
|
|
|
106
106
|
Emit: `.claude/` `.grok/` `.agents/` `.gemini/`
|
|
107
107
|
|
|
108
|
-
- **orchestrator** (parent) — always spawn+prompt; user-facing
|
|
108
|
+
- **orchestrator** (parent) — always spawn+prompt; user-facing `[orchestrator]:` (or child role tag) one-line recap; advise leftover numbered pick each on own line after that recap (do not cram `1. Implement 2. Tweak` onto the recap line). `/parent` one-turn; `/handoff` writes `.tmp/grunt/handoffs/{serial}-{slug}-{stamp}.md`; `/pickup` spawn-first pickup (inverse of `/handoff`; not a mode). `/solo` session escape; `/cascade` restores it. Small/low router. First token spawn. No parent Read/Bash/Grep. Does not implement, plan, or fetch world facts
|
|
109
109
|
- **grunt** — tools: facts/search/exec/git/web/test/low-reason mechanical write. Isolation `verdict:`. Never feature solution. Never spawn. World fact: `job: web`
|
|
110
110
|
- **implementer** — write already-defined solution on allowlisted paths. TDD when spec/plan says tests. Validate + sim after write. Fat dumps via `need:`. Never spawn. Never plan. Id is **implementer** (not Implementor)
|
|
111
|
-
- **thinker** — plan/
|
|
111
|
+
- **thinker** — think/plan/advise/recommend/how/why/explain; unsure→thinker; cheap false+; edge cases. Read-only named-file Read of prompt SSOT; trees/search/exec/web/test → `need:`. Never spawn. No bash. Never implement
|
|
112
112
|
|
|
113
113
|
Children never spawn. Spawn only grunt|implementer|thinker. Omit model on spawn; frontmatter on agent files picks haiku/sonnet/opus vs grok-4.5 / grok-4.6 / other hosts. Voice: `.rulesync/reference/output.md`. Protocol: `.rulesync/reference/cascade.md`. `AGENTS.md`/`CLAUDE.md` spawn-first. `GEMINI.md` → `@AGENTS.md`. Goals: synced configs across grok build claude code codex gemini cli antigravity; max situational speed; superterse token savings; max/min reasoning by role.
|
|
114
114
|
|
|
@@ -120,10 +120,13 @@ Lightpanda-first session CLI: `node scripts/browser.mjs nav|snap|click|fill|shot
|
|
|
120
120
|
|
|
121
121
|
## Skills
|
|
122
122
|
|
|
123
|
-
Present under `.claude` / `.rulesync` / `.agents
|
|
123
|
+
Present under `.claude` / `.rulesync` / `.agents` (`rulesync -f skills` mirrors SSOT):
|
|
124
124
|
|
|
125
125
|
- `browser` `cascade` `commit` `commit-and-push` `commit-push` `commit-push-deploy` `commit-push-release` `explain` `handoff` `pickup` `parent` `solo`
|
|
126
|
-
|
|
126
|
+
|
|
127
|
+
Grok-only (hand files under `.grok/skills/`; no `.rulesync/skills` SSOT; not mirrored):
|
|
128
|
+
|
|
129
|
+
- `write-plan` `implement-plan` `shared` (`/write-plan` plan-only → `next: /implement-plan`; advise unlock = pick **1. Implement**, not `ok`/`yes`/`go`; slash `/implement-plan` still valid alias)
|
|
127
130
|
|
|
128
131
|
## Generate
|
|
129
132
|
|
|
@@ -141,7 +144,7 @@ Emit writes other-CLI trees from `.rulesync` for the **next** process of that CL
|
|
|
141
144
|
## Config
|
|
142
145
|
|
|
143
146
|
- SoT merge into consumer repo; existing configs kept where not grunt-owned
|
|
144
|
-
- Globals: first init apply; re-init auto-skip (sentinel
|
|
147
|
+
- Globals: first init apply; re-init auto-skip (sentinel) or `--skip-globals`
|
|
145
148
|
- `sync-globals` / `purge-mcps`: dry-run default; `--apply` writes
|
|
146
149
|
- Hosts: grok claude codex gemini antigravity
|
|
147
150
|
|
|
@@ -155,6 +158,18 @@ Draw **one** CLI host bubble. That bubble is **this** session’s CLI: Grok Buil
|
|
|
155
158
|
|
|
156
159
|
User-visible conversation attaches only to the parent. Children never talk to the user. Children never spawn.
|
|
157
160
|
|
|
161
|
+
### Host support (GAP)
|
|
162
|
+
|
|
163
|
+
Not feature-parity across hosts. In-tree mapping only; do not invent peek/kill APIs. GAP rows: no fake peeks, no auto-kill; block on spawn return and classify `done`.
|
|
164
|
+
|
|
165
|
+
| Host | Spawn | Peek | Kill |
|
|
166
|
+
| --- | --- | --- | --- |
|
|
167
|
+
| Grok | `spawn_subagent` `background:true` → `task_id` | `get_command_or_subagent_output` + `timeout_ms=60000` | `kill_command_or_subagent` (user-ask only) |
|
|
168
|
+
| Claude Code | `Agent` if the parent session exposes it | GAP unless an in-tree schema names a status/output tool on that id (do not invent `TaskOutput`); else block on Agent return and classify `done`. Agent launch ≠ child done; in-flight host Stop → only `[orchestrator]: wait grunt`; no SendMessage | GAP unless in-tree; no auto-kill |
|
|
169
|
+
| Codex | host agent/call | GAP; block on host agent/call return; classify `done` | GAP; no auto-kill |
|
|
170
|
+
| Antigravity | main-session parent | GAP peek/kill; main-session parent | GAP; no auto-kill |
|
|
171
|
+
| Gemini | not emitted; tracked gap | GAP; no fake peeks | GAP; no auto-kill |
|
|
172
|
+
|
|
158
173
|
### Nested diagram
|
|
159
174
|
|
|
160
175
|
Same topology as the session recap; every legal edge labeled.
|
|
@@ -162,7 +177,7 @@ Same topology as the session recap; every legal edge labeled.
|
|
|
162
177
|
```
|
|
163
178
|
USER
|
|
164
179
|
│
|
|
165
|
-
│ session in/out (parent only; tagged one-line recap)
|
|
180
|
+
│ session in/out (parent only; tagged one-line recap; advise leftover 1./2. own lines)
|
|
166
181
|
│ TUI local; completion tokens from Model API (mixed)
|
|
167
182
|
▼
|
|
168
183
|
┌──────────────────────── CLI HOST (this process) ────────────────────────┐
|
|
@@ -251,7 +266,7 @@ Implementer or thinker that still needs a fat dump **stops** on a `need:` JSON l
|
|
|
251
266
|
| node | inside host? | local vs AI-server | notes |
|
|
252
267
|
| --- | --- | --- | --- |
|
|
253
268
|
| User | no | mixed | Speaks only to parent session. Never a child edge. |
|
|
254
|
-
| Session in/out / TUI | yes | mixed | TUI is local; recap tokens come from the model. Legal `[role]:` one-line
|
|
269
|
+
| Session in/out / TUI | yes | mixed | TUI is local; recap tokens come from the model. Legal `[role]:` one-line recap; advise leftover numbered pick each on own line after (not crammed onto the recap line). |
|
|
255
270
|
| CLI host process | yes (is the box) | local process | Grok Build / Claude Code / Codex / Gemini / Antigravity. Not a peer of another CLI. |
|
|
256
271
|
| Parent orchestrator | yes | AI-server **turn** | Spawn-first low router. No parent Read/Bash/Grep. Lives in this session, not a sidecar. |
|
|
257
272
|
| `grunt` sibling | yes | AI-server **turn** | Facts/tools/mechanical write. Never spawn. Never feature solution. |
|
|
@@ -318,15 +333,17 @@ Repo-relative (repository root):
|
|
|
318
333
|
|
|
319
334
|
## Layout
|
|
320
335
|
|
|
321
|
-
Published (`package.json` `files`): `bin/grunt.js` `cli` `scripts/check-globals.mjs` `scripts/emit-agent-shell-tools.mjs` `scripts/emit-gemini.mjs` `scripts/emit-mcp-policy.mjs` `scripts/gate-fat-tools.mjs` `scripts/hooks-union.mjs` `scripts/grunt-job.mjs` `scripts/parse-need.mjs` `scripts/persist-handoff.mjs` `scripts/persist-plan.mjs` `scripts/purge-global-mcps.mjs` `scripts/scrub-spawn-prompt.mjs` `scripts/scrub-text-lib.mjs` `scripts/sync-global-settings.mjs` `scripts/
|
|
336
|
+
Published (`package.json` `files`): `bin/grunt.js` `cli` `scripts/check-globals.mjs` `scripts/emit-agent-shell-tools.mjs` `scripts/emit-gemini.mjs` `scripts/guarded-roots.mjs` `scripts/emit-mcp-policy.mjs` `scripts/gate-fat-tools.mjs` `scripts/hooks-union.mjs` `scripts/grunt-job.mjs` `scripts/parse-need.mjs` `scripts/persist-handoff.mjs` `scripts/persist-plan.mjs` `scripts/purge-global-mcps.mjs` `scripts/scrub-spawn-prompt.mjs` `scripts/scrub-text-lib.mjs` `scripts/sync-global-settings.mjs` `scripts/browser.mjs` `scripts/doctor.mjs` `scripts/scrub-text` `.rulesync` `.grok` `.codex` `.claude` `.agents` `AGENTS.md` `CLAUDE.md` `.mcp.json` `README.md` `LICENSE` `CHANGELOG.md`
|
|
337
|
+
|
|
338
|
+
No `scripts/*.test.ts` `scripts/fixtures/` `docs/` `coverage/` `vitest.config.ts` in `files`. `cli` dir ships whole (includes `cli/*.test.ts`).
|
|
322
339
|
|
|
323
|
-
|
|
340
|
+
Not packed: `GEMINI.md` `.gemini/` — `emit-gemini.mjs` writes them on `generate` / `init` (`GEMINI.md` → `@AGENTS.md`). Not in `files`.
|
|
324
341
|
|
|
325
|
-
Repo root (also): `coverage/` `.gemini/` — no `src/` no `CONTRIBUTING` no `docs/`
|
|
342
|
+
Repo root (also): `coverage/` `.gemini/` `GEMINI.md` — no `src/` no `CONTRIBUTING` no `docs/`
|
|
326
343
|
|
|
327
344
|
- `bin/grunt.js` — CLI bin
|
|
328
345
|
- `cli/grunt.mjs` — commands
|
|
329
|
-
- `scripts/` —
|
|
346
|
+
- `scripts/` — init copies product scripts (`grunt-job.mjs` `scrub-text` …). Re-init sentinels: `.grok/hooks/orchestrate-parent.js` `.rulesync` `<!-- grunt:begin -->`
|
|
330
347
|
- `.rulesync/` — SoT (subagents skills reference)
|
|
331
348
|
- `.claude/` `.grok/` `.codex/` `.agents/` `.gemini/` — host emit
|
|
332
349
|
- `coverage/` — vitest local not published
|
|
@@ -349,7 +366,7 @@ npm i && npm test
|
|
|
349
366
|
|
|
350
367
|
Keep these four flows only:
|
|
351
368
|
|
|
352
|
-
1. “Create me a react weather app” → thinker plan → implementer write →
|
|
369
|
+
1. “Create me a react weather app” → thinker plan/recap-stop + pick 1.Implement 2.Tweak → user picks 1 or `/implement-plan` → implementer write → recap
|
|
353
370
|
2. “What is 2+2” → grunt → `[grunt]:` echo
|
|
354
371
|
3. Marvel theatrical next → grunt `job:web` → recap
|
|
355
372
|
4. `.logs` 3/6/2021 tag `framework bug` → grunt local search → recap
|