@lovrozagar/grunt 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/agents/grunt.md +2 -23
- package/.agents/agents/orchestrator.md +5 -45
- package/.agents/skills/ask/SKILL.md +11 -0
- package/.agents/skills/auto/SKILL.md +13 -0
- package/.agents/skills/browser/SKILL.md +4 -7
- package/.agents/skills/clasp/SKILL.md +11 -0
- package/.agents/skills/commit/SKILL.md +3 -1
- package/.agents/skills/commit-push/SKILL.md +2 -0
- package/.agents/skills/commit-push-deploy/SKILL.md +2 -0
- package/.agents/skills/commit-push-release/SKILL.md +2 -0
- package/.agents/skills/explain/SKILL.md +7 -13
- package/.agents/skills/google-workspace/SKILL.md +13 -0
- package/.agents/skills/handoff/SKILL.md +7 -11
- package/.agents/skills/implement-plan/SKILL.md +5 -108
- package/.agents/skills/listen/SKILL.md +15 -0
- package/.agents/skills/pickup/SKILL.md +6 -12
- package/.agents/skills/speak/SKILL.md +13 -0
- package/.agents/skills/tmp/SKILL.md +54 -0
- package/.agents/skills/write-plan/SKILL.md +5 -74
- package/.claude/agents/grunt.md +2 -25
- package/.claude/agents/orchestrator.md +12 -45
- package/.claude/skills/ask/SKILL.md +11 -0
- package/.claude/skills/auto/SKILL.md +13 -0
- package/.claude/skills/browser/SKILL.md +4 -7
- package/.claude/skills/clasp/SKILL.md +11 -0
- package/.claude/skills/commit/SKILL.md +3 -1
- package/.claude/skills/commit-push/SKILL.md +2 -0
- package/.claude/skills/commit-push-deploy/SKILL.md +2 -0
- package/.claude/skills/commit-push-release/SKILL.md +2 -0
- package/.claude/skills/explain/SKILL.md +7 -13
- package/.claude/skills/google-workspace/SKILL.md +13 -0
- package/.claude/skills/handoff/SKILL.md +7 -11
- package/.claude/skills/implement-plan/SKILL.md +5 -108
- package/.claude/skills/listen/SKILL.md +15 -0
- package/.claude/skills/pickup/SKILL.md +6 -12
- package/.claude/skills/speak/SKILL.md +13 -0
- package/.claude/skills/tmp/SKILL.md +54 -0
- package/.claude/skills/write-plan/SKILL.md +5 -74
- package/.codex/agents/grunt.toml +2 -25
- package/.codex/agents/orchestrator.toml +4 -45
- package/.grok/agents/grunt.md +2 -23
- package/.grok/agents/orchestrator.md +4 -43
- package/.grok/global-settings.toml +1 -3
- package/.grok/hooks/orchestrate-parent.js +278 -228
- package/.grok/skills/ask/SKILL.md +11 -0
- package/.grok/skills/auto/SKILL.md +13 -0
- package/.grok/skills/browser/SKILL.md +4 -7
- package/.grok/skills/clasp/SKILL.md +11 -0
- package/.grok/skills/commit/SKILL.md +3 -1
- package/.grok/skills/commit-push/SKILL.md +2 -0
- package/.grok/skills/commit-push-deploy/SKILL.md +2 -0
- package/.grok/skills/commit-push-release/SKILL.md +2 -0
- package/.grok/skills/explain/SKILL.md +7 -13
- package/.grok/skills/google-workspace/SKILL.md +13 -0
- package/.grok/skills/handoff/SKILL.md +7 -11
- package/.grok/skills/implement-plan/SKILL.md +5 -108
- package/.grok/skills/listen/SKILL.md +15 -0
- package/.grok/skills/pickup/SKILL.md +6 -12
- package/.grok/skills/speak/SKILL.md +13 -0
- package/.grok/skills/tmp/SKILL.md +54 -0
- package/.grok/skills/write-plan/SKILL.md +5 -74
- package/.rulesync/hooks.jsonc +1 -1
- package/.rulesync/mcp-policy.jsonc +0 -2
- package/.rulesync/reference/INDEX.md +30 -17
- package/.rulesync/reference/browser.md +13 -6
- package/.rulesync/reference/cascade.md +6 -84
- package/.rulesync/reference/clasp.md +21 -0
- package/.rulesync/reference/google-workspace.md +79 -0
- package/.rulesync/reference/hooks.md +7 -9
- package/.rulesync/reference/implementation-format.md +113 -0
- package/.rulesync/reference/law.md +5 -3
- package/.rulesync/reference/listen.md +80 -0
- package/.rulesync/reference/map.md +39 -31
- package/.rulesync/reference/output.md +3 -41
- package/.rulesync/reference/plan-format.md +14 -12
- package/.rulesync/reference/refs-map.md +12 -5
- package/.rulesync/reference/rtk.md +3 -2
- package/.rulesync/reference/scope.md +37 -0
- package/.rulesync/reference/setup.md +27 -0
- package/.rulesync/reference/skills-map.md +13 -9
- package/.rulesync/reference/speak.md +59 -0
- package/.rulesync/rules/CLAUDE.md +3 -44
- package/.rulesync/rules/overview.md +9 -42
- package/.rulesync/skills/ask/SKILL.md +11 -0
- package/.rulesync/skills/auto/SKILL.md +11 -0
- package/.rulesync/skills/browser/SKILL.md +4 -8
- package/.rulesync/skills/clasp/SKILL.md +9 -0
- package/.rulesync/skills/commit/SKILL.md +3 -1
- package/.rulesync/skills/commit-push/SKILL.md +2 -0
- package/.rulesync/skills/commit-push-deploy/SKILL.md +2 -0
- package/.rulesync/skills/commit-push-release/SKILL.md +2 -0
- package/.rulesync/skills/explain/SKILL.md +7 -14
- package/.rulesync/skills/google-workspace/SKILL.md +11 -0
- package/.rulesync/skills/handoff/SKILL.md +7 -11
- package/.rulesync/skills/implement-plan/SKILL.md +5 -116
- package/.rulesync/skills/listen/SKILL.md +13 -0
- package/.rulesync/skills/pickup/SKILL.md +6 -12
- package/.rulesync/skills/speak/SKILL.md +13 -0
- package/.rulesync/skills/tmp/SKILL.md +54 -0
- package/.rulesync/skills/write-plan/SKILL.md +5 -80
- package/.rulesync/subagents/grunt.md +2 -23
- package/.rulesync/subagents/orchestrator.md +14 -54
- package/AGENTS.md +9 -42
- package/CHANGELOG.md +89 -0
- package/CLAUDE.md +1 -44
- package/README.md +97 -88
- package/cli/grunt.mjs +29 -13
- package/cli/grunt.test.ts +62 -20
- package/cli/init.mjs +218 -31
- package/cli/init.test.ts +669 -46
- package/cli/prompt.mjs +8 -0
- package/cli/prompt.test.ts +14 -0
- package/package.json +13 -1
- package/scripts/browser.mjs +98 -5
- package/scripts/doctor.mjs +82 -1
- package/scripts/emit-gemini.mjs +1 -1
- package/scripts/emit-mcp-policy.mjs +1 -1
- package/scripts/gate-fat-tools.mjs +223 -173
- package/scripts/google-workspace.mjs +713 -0
- package/scripts/grunt-job.mjs +453 -69
- package/scripts/listen.mjs +829 -0
- package/scripts/parse-need.mjs +21 -2
- package/scripts/persist-implementation.mjs +278 -0
- package/scripts/persist-plan.mjs +17 -2
- package/scripts/persist-tmp.mjs +123 -0
- package/scripts/scrub-spawn-prompt.mjs +4 -51
- package/scripts/setup.mjs +746 -0
- package/scripts/speak.mjs +291 -0
- package/.agents/agents/implementer.md +0 -32
- package/.agents/agents/thinker.md +0 -28
- package/.agents/skills/cascade/SKILL.md +0 -26
- package/.agents/skills/parent/SKILL.md +0 -6
- package/.agents/skills/solo/SKILL.md +0 -23
- package/.claude/agents/implementer.md +0 -37
- package/.claude/agents/thinker.md +0 -35
- package/.claude/skills/cascade/SKILL.md +0 -26
- package/.claude/skills/parent/SKILL.md +0 -6
- package/.claude/skills/solo/SKILL.md +0 -23
- package/.codex/agents/implementer.toml +0 -26
- package/.codex/agents/thinker.toml +0 -25
- package/.grok/agents/implementer.md +0 -27
- package/.grok/agents/thinker.md +0 -26
- package/.grok/parent.md +0 -1
- package/.grok/roles/implementer.toml +0 -5
- package/.grok/roles/thinker.toml +0 -5
- package/.grok/skills/cascade/SKILL.md +0 -26
- package/.grok/skills/parent/SKILL.md +0 -6
- package/.grok/skills/solo/SKILL.md +0 -23
- package/.rulesync/skills/cascade/SKILL.md +0 -26
- package/.rulesync/skills/parent/SKILL.md +0 -6
- package/.rulesync/skills/solo/SKILL.md +0 -23
- package/.rulesync/subagents/implementer.md +0 -49
- package/.rulesync/subagents/thinker.md +0 -48
|
@@ -1,75 +1,35 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: orchestrator
|
|
3
|
-
description: "
|
|
4
|
-
tier:
|
|
3
|
+
description: "Session agent. Do the work. Spawn grunt only under the hood when isolation is cheaper."
|
|
4
|
+
tier: parent
|
|
5
5
|
targets:
|
|
6
6
|
- claudecode
|
|
7
7
|
- grokcli
|
|
8
8
|
- codexcli
|
|
9
9
|
- antigravity-cli
|
|
10
10
|
claudecode:
|
|
11
|
-
model:
|
|
12
|
-
effort:
|
|
11
|
+
model: sonnet
|
|
12
|
+
effort: medium
|
|
13
13
|
permissionMode: bypassPermissions
|
|
14
|
-
tools: [Write, Agent]
|
|
14
|
+
tools: [Read, Grep, Glob, Bash, Write, Edit, WebSearch, WebFetch, Agent]
|
|
15
15
|
grokcli:
|
|
16
|
-
model: grok-4.
|
|
16
|
+
model: grok-4.6
|
|
17
17
|
permission_mode: bypassPermissions
|
|
18
18
|
agents_md: false
|
|
19
19
|
mcpInheritance: none
|
|
20
|
-
tools:
|
|
20
|
+
tools: read_file, grep, list_dir, write, search_replace, run_terminal_command, web_search, web_fetch, spawn_subagent, todo_write, get_command_or_subagent_output, kill_command_or_subagent
|
|
21
21
|
codexcli:
|
|
22
|
-
model: gpt-5.4
|
|
23
|
-
model_reasoning_effort:
|
|
22
|
+
model: gpt-5.4
|
|
23
|
+
model_reasoning_effort: medium
|
|
24
24
|
sandbox_mode: danger-full-access
|
|
25
25
|
approval_policy: never
|
|
26
26
|
antigravity-cli:
|
|
27
|
-
model:
|
|
28
|
-
subagent:
|
|
29
|
-
mainAgent:
|
|
27
|
+
model: pro
|
|
28
|
+
subagent: false
|
|
29
|
+
mainAgent: true
|
|
30
30
|
inheritMcp: false
|
|
31
31
|
commandExecutionPolicy: eager
|
|
32
|
-
tools: []
|
|
33
32
|
geminicli:
|
|
34
|
-
model: gemini-2.5-
|
|
33
|
+
model: gemini-2.5-pro
|
|
35
34
|
---
|
|
36
|
-
|
|
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
|
-
Protocol: `.rulesync/reference/cascade.md` (peek/kill table need:/resume). Do not paste.
|
|
39
|
-
Always-do:
|
|
40
|
-
|
|
41
|
-
| signal | next |
|
|
42
|
-
|---|---|
|
|
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 pick1/pick2 / `/implement-plan {n}` / explicit implement (=pick1). Never parent Write/Bash/Skill |
|
|
44
|
-
| plan/spec ready + file writes remain | leftover pick1/pick2 / `/implement-plan {n}` / explicit implement (=pick1) only. pick1 = spawn implementer + last [thinker] recap as spec; no `.tmp/plans`; no write-plan; no implement-plan. pick2 = write-plan persist then implement-plan one-shot skip pause (`plan=/abs/...`; no user slash). slash `/write-plan` ≠ pick2. `ok`/`yes`/`y`/`continue` ≠ either. Thinker recap alone = recap-stop |
|
|
45
|
-
| tools/facts/git/test/mechanical write | spawn grunt |
|
|
46
|
-
| world fact | spawn grunt `job:web` |
|
|
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
|
-
| child `need:` | parse-need + parallel grunt; `resume_from` + new verdicts; max 3 |
|
|
51
|
-
| ⚠ / validate / sim | spawn implementer with findings; do not recap; spawn; no parent-edit |
|
|
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
|
-
| `/parent` | spawn-first; hook last-ditch `parent-escape`; never Read/Bash |
|
|
55
|
-
| `/handoff` | one-turn write `.tmp/grunt/handoffs/`; recap `[handoff]:` |
|
|
56
|
-
| `/pickup` | spawn-first; grunt resolve if needed; never parent Read; not a mode |
|
|
57
|
-
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask) |
|
|
58
|
-
| `/explain` | spawn if facts/work; then human recap of child output; screenshot/visible=context no Read |
|
|
59
|
-
| `/solo` | session escape only; stamp grunt-off-{sid}; else spawn-first |
|
|
60
|
-
| `/cascade` | unlink solo stamp; spawn-first |
|
|
61
|
-
|
|
62
|
-
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}`.
|
|
63
|
-
False+: I think terraform plan /implement-plan /solo source tokens one-cmd how- last-log why.
|
|
64
|
-
Advise leftover: numbered pick each on own line after tagged recap:
|
|
65
|
-
1. Implementer with verbal plan
|
|
66
|
-
2. Implementer with file plan
|
|
67
|
-
3. Tweak
|
|
68
|
-
Match number or full leftover label (or unique tail `verbal plan` / `file plan`). Always-do leftover match; not Skill-name (`2` ≠ write-plan). 1 / that label / explicit implement → spawn implementer; paste last [thinker] recap as spec; no plan file; no write-plan; no implement-plan. Bare `implement`/`implementer` → pick1 only (shared prefix; do not substring-match both). 2 / that label → persist `.tmp/plans/{n}` then spawn implementer `plan=/abs/...` (write-plan then implement-plan one-shot; skip inspect pause; no user slash). 3 / Tweak → stay advise; extra text = revision notes → thinker; bare 3/Tweak = stop wait notes. `/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 implement path.
|
|
69
|
-
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.
|
|
70
|
-
Spawn only `grunt` | `implementer` | `thinker`. Omit `model`. Isolation `none` unless asked. Never spawn `orchestrator`. Children never spawn.
|
|
71
|
-
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).
|
|
72
|
-
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only.
|
|
73
|
-
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.
|
|
74
|
-
Child `need:` JSON → parse-need + parallel grunt; one `resume_from` + **new** verdicts only; max 3; no re-send task; no fresh-spawn.
|
|
75
|
-
`/parent` hook last-ditch only. Skills spawn-first. Only `/solo` escapes spawn workflow. `/pickup` spawn-first; grunt resolve if needed; never parent Read; not a mode.
|
|
35
|
+
Follow AGENTS.md. Do the work. Concise complete sentences with natural grammar. Scratch in `.tmp/grunt/`. Browse with `node scripts/browser.mjs`; the rail swaps to Chromium when Lightpanda is blocked. App e2e uses Playwright.
|
package/AGENTS.md
CHANGED
|
@@ -1,46 +1,13 @@
|
|
|
1
1
|
<!-- grunt:begin -->
|
|
2
|
-
|
|
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 (thinker recap verbatim-ish; no-strip how/why). 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`.
|
|
4
|
-
All output exclude AI attribution, Co-Authored-By, trailers, generated markers.
|
|
5
|
-
Protocol: `.rulesync/reference/cascade.md`. Do not paste.
|
|
6
|
-
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.
|
|
7
|
-
Always-do:
|
|
2
|
+
You are the session agent. Do the work. Use en-US unless asked. Write concise complete sentences with natural grammar. Skip filler and fluff. Ship optimal solutions only; rewrite if not. Flag blockers. Do not monkey-patch. Keep all work free of AI attribution, Co-Authored-By, trailers, and generated markers.
|
|
8
3
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
| 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). Never parent Write/Bash/Skill |
|
|
12
|
-
| plan/spec ready + file writes remain | leftover pick1/pick2 / `/implement-plan {n}` / explicit implement (=pick1) only. pick1 = spawn implementer + last [thinker] recap as spec; no `.tmp/plans`; no write-plan; no implement-plan. pick2 = write-plan persist then implement-plan one-shot skip pause (`plan=/abs/...`; no user slash). slash `/write-plan` ≠ pick2. `ok`/`yes`/`y`/`continue` ≠ either. Thinker recap alone = recap-stop |
|
|
13
|
-
| tools/facts/git/test/mechanical write | spawn grunt |
|
|
14
|
-
| world fact | spawn grunt `job:web` |
|
|
15
|
-
| write defined solution | spawn implementer; **blocked if advise-class stems present** unless prompt-is-spec / obvious comment-spec false+ |
|
|
16
|
-
| 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 |
|
|
17
|
-
| child returned | recap per output.md (echo=report not command; thinker recap verbatim-ish; no-strip). e.g. `[orchestrator]: wrote /abs/a` |
|
|
18
|
-
| child `need:` | parse-need + parallel grunt; `resume_from` + new verdicts; max 3 |
|
|
19
|
-
| ⚠ / validate / sim | spawn implementer with findings; do not recap; spawn; no parent-edit |
|
|
20
|
-
| work remains | spawn; do not stop. Advise recap ≠ leftover writes |
|
|
21
|
-
| 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 |
|
|
22
|
-
| `/parent` | spawn-first; hook last-ditch `parent-escape`; never Read/Bash |
|
|
23
|
-
| `/handoff` | one-turn write `.tmp/grunt/handoffs/`; recap `[handoff]:` |
|
|
24
|
-
| `/pickup` | spawn-first; grunt resolve if needed; never parent Read; not a mode |
|
|
25
|
-
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask) |
|
|
26
|
-
| `/explain` | spawn if facts/work; then human recap of child output; screenshot/visible=context no Read |
|
|
27
|
-
| `/solo` | session escape only; stamp grunt-off-{sid}; else spawn-first |
|
|
28
|
-
| `/cascade` | unlink solo stamp; spawn-first |
|
|
4
|
+
Size first. Straight shot: do it. Else read `.rulesync/reference/scope.md`.
|
|
5
|
+
Default `/auto`: keep going; ask on blockers. `/ask`: one step, then ask.
|
|
29
6
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
Match number or full leftover label (or unique tail `verbal plan` / `file plan`). Always-do leftover match; not Skill-name (`2` ≠ write-plan). 1 / that label / explicit implement → spawn implementer; paste last [thinker] recap as spec (how+why; implementer must not paste why into code comments); no plan file; no write-plan; no implement-plan. Bare `implement`/`implementer` → pick1 only (shared prefix; do not substring-match both). 2 / that label → persist `.tmp/plans/{n}` then spawn implementer `plan=/abs/...` (write-plan then implement-plan one-shot; skip inspect pause; no user slash). 3 / Tweak → stay advise; extra text = revision notes → thinker; bare 3/Tweak = stop wait notes. `/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 implement path.
|
|
37
|
-
Parent = orchestrator (this file). You do not talk. Spawn wait echo.
|
|
38
|
-
Spawn only grunt|implementer|thinker. Never spawn orchestrator. Children never spawn.
|
|
39
|
-
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 (no-strip; no compress-to-verdict); 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.
|
|
40
|
-
`/parent` hook last-ditch only. Skills spawn-first. Only `/solo` escapes spawn workflow.
|
|
41
|
-
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).
|
|
42
|
-
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only.
|
|
43
|
-
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.
|
|
44
|
-
`need:` JSON → parse-need + parallel grunt; one `resume_from` + new verdicts; max 3; no re-send task; no fresh-spawn.
|
|
45
|
-
Child: this file does not apply; your agent file gates you. Never spawn.
|
|
7
|
+
Read `.rulesync/reference/INDEX.md` once. When a row matches the work, read that reference in full.
|
|
8
|
+
|
|
9
|
+
Large dumps are compressed (search, test logs, snaps). Scratch and dumps live in `.tmp/grunt/` (gitignored). After a write, recap the path; edit with an offset slice when you need lines.
|
|
10
|
+
Fat dumps: `node scripts/grunt-job.mjs --job search|exec|slice|fetch|test` first; spawn grunt only when the dump needs judgment.
|
|
11
|
+
|
|
12
|
+
Browse with `node scripts/browser.mjs`. Lightpanda first; the rail swaps to Chromium when Lightpanda is blocked, empty, or client-rendered. Do not stop and say you cannot. App e2e is `playwright test`.
|
|
46
13
|
<!-- grunt:end -->
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,95 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.6.0] - 2026-09-17
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- grunt-job squeez + stash + slice + fetch: keep a better 6, write the rest under `.tmp/grunt/stash/`, retrieve with `--job slice` or Read offset
|
|
15
|
+
- Session sidecar `.tmp/grunt/sessions/{sid}/` (wrote/read/receipt); UserPromptSubmit one-line receipt
|
|
16
|
+
- Browser `scroll` `wait` `hover` `select`; `snap` stashes fat pages
|
|
17
|
+
- Optional `clasp` (doctor + skill + reference)
|
|
18
|
+
- `scripts/google-workspace.mjs` (`/google-workspace`): Sheets (create/set/get/append/clear), Docs (create/append), Drive list, Slides, Calendar, Gmail; Desktop OAuth in `~/.grunt/`
|
|
19
|
+
- `scripts/speak.mjs` (`/speak`): TTS via ElevenLabs or OpenAI; default mp3 under `.tmp/grunt/speak/`
|
|
20
|
+
- `scripts/listen.mjs` (`/listen`): STT via ffmpeg + local whisper.cpp, OpenAI fallback; `rec` prints transcript + `transcript=.tmp/grunt/listen/latest.txt`
|
|
21
|
+
- `grunt upgrade`: re-init, prune retired 0.5 names, print reserved skills
|
|
22
|
+
- Windows `npm test` CI job
|
|
23
|
+
- `/auto` `/ask` session flags: default `sessionGate=auto` keeps going and asks on blockers; `/ask` finishes one step then asks. Stamp `session-gate-{sid}`. Not the 0.5 leftover gate
|
|
24
|
+
- `/implement-plan` journal under `.tmp/grunt/implementations/` (touched files, log, blockers); `/commit` uses `## Files` as the default stage set
|
|
25
|
+
- Plan test leaves: red-green for new behavior/bugs, test-after for other behavior, skip for docs/rename/config/generated
|
|
26
|
+
- `grunt setup` / `scripts/setup.mjs`: handheld speak, listen, google-workspace, and browser setup on any OS (`~/.grunt/`; env still wins). TTY menu shows ok/missing, re-checks PATH after print-only bin hints, asks redo when already ok, prints a four-line status
|
|
27
|
+
- Tests for google-workspace verbs against mocked Google APIs
|
|
28
|
+
- Doctor reports optional google-workspace (`oauth` / `tokens` / `adc` / `clasprc`; no secrets)
|
|
29
|
+
- Init/upgrade prune retired scripts (`telemetry.mjs`), paths (`.grok/parent.md` `.grok/skills/shared`), Grok roles for retired agents, and reserved skill dirs this package no longer ships
|
|
30
|
+
- Browser rail swaps Lightpanda → Chromium on blocked/empty/client-rendered snaps and Amazon hosts
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- Session agent has tools and writes concise complete sentences
|
|
35
|
+
- Fat Read/Grep/Bash dumps rewrite to grunt-job first; spawn a grunt model only when the dump needs judgment
|
|
36
|
+
- Scratch writes at repo root rewrite into `.tmp/grunt/`
|
|
37
|
+
- Full Read of a file this session just wrote is denied; offset slice still works
|
|
38
|
+
- Playwright is the app e2e runner; Lightpanda stays the browse default
|
|
39
|
+
- Agents: orchestrator + grunt only
|
|
40
|
+
- Init prunes retired grunt-owned skills (`parent` `solo` `cascade`) and agents (`implementer` `thinker`)
|
|
41
|
+
- `grunt upgrade` no longer warns leftoverGate/spawnMode config keys
|
|
42
|
+
- Consumer-facing setup/browser docs: do not read a README unless in-tree doctor/setup/spec is missing; then https://github.com/lovrozagar/grunt#readme (not the consumer README)
|
|
43
|
+
- AGENTS.md size gate is a router: straight shot does the work; else `.rulesync/reference/scope.md` (gate + research → suggest → wait → `/write-plan` → `/implement-plan`)
|
|
44
|
+
- AGENTS.md order: identity, size + `/auto` `/ask`, INDEX, dumps, browser
|
|
45
|
+
- Keep all work free of AI attribution, Co-Authored-By, trailers, and generated markers (not commits only)
|
|
46
|
+
- Session prompt: en-US unless asked; skip filler and fluff; rewrite if the solution is not optimal
|
|
47
|
+
- AGENTS.md drops the skills inventory; INDEX once, then the matching reference in full
|
|
48
|
+
- Browser prompt is the rail plus Chromium fallback, not the verb list
|
|
49
|
+
|
|
50
|
+
### Fixed
|
|
51
|
+
|
|
52
|
+
- Windows `npm test`: `.gitattributes` keeps LF so shebang ESM scripts parse (CRLF hashbang is `SyntaxError`)
|
|
53
|
+
- `grunt setup` with no extra args (drop dead `flags.args || []`)
|
|
54
|
+
|
|
55
|
+
### Removed
|
|
56
|
+
|
|
57
|
+
- implementer and thinker subagents
|
|
58
|
+
- leftoverGate / spawnMode flags and leftover `1. 2. 3.` Stop law
|
|
59
|
+
- `/solo` `/cascade` `/parent` skills
|
|
60
|
+
- `.rulesync/grunt.config.jsonc`, local overlay, example, and `scripts/grunt-config.mjs`. `/auto` is the default; `/ask` is a per-session stamp; `/auto` unlinks it
|
|
61
|
+
|
|
62
|
+
### Migration
|
|
63
|
+
|
|
64
|
+
From 0.5.x: `npm i -D @lovrozagar/grunt@latest` then `npm exec grunt upgrade` (or `init`). `.rulesync/grunt.config.jsonc`, the local overlay, and `scripts/grunt-config.mjs` are deleted. leftoverGate/spawnMode are gone. Retired skill/agent dirs, `.grok/roles/{implementer,thinker}.toml`, `.grok/parent.md`, `.grok/skills/shared`, and `scripts/telemetry.mjs` are deleted. New skills/scripts are copied. Consumer extras and npm `grunt:*` scripts stay. Reserved skill names are listed in `.rulesync/reference/law.md`.
|
|
65
|
+
|
|
66
|
+
## [0.5.2] - 2026-09-02
|
|
67
|
+
|
|
68
|
+
### Added
|
|
69
|
+
|
|
70
|
+
- `/ask` and `/auto` session leftover-gate skills (SoT + `.agents` / `.claude` / `.grok` mirrors)
|
|
71
|
+
- `.rulesync/grunt.config.jsonc` and `scripts/grunt-config.mjs` for `leftoverGate` / `spawnMode` (fail-closed defaults)
|
|
72
|
+
- Orchestrator session stamps for auto-ask and spawn-mode under `.tmp/grunt/orchestrator-logs/`
|
|
73
|
+
- `effective=auto` + Implement-typed leftover pick2 chains write-plan persist then implement-plan `{n}` (skip leftover wait)
|
|
74
|
+
|
|
75
|
+
### Changed
|
|
76
|
+
|
|
77
|
+
- `/tmp` flatten: write under `.tmp/grunt/{serial}-{slug}-{stamp}.{ext}`; reserved dirs (`plans` `handoffs` `orchestrator-logs` …); `isUnderTmp` is root-only
|
|
78
|
+
- Advise leftover: one blank line before numbered pick `1.`
|
|
79
|
+
- Browser route: parent spawns grunt with abs `.rulesync/skills/browser/SKILL.md` + `.rulesync/reference/browser.md` (no Skill-invoke / `job:browse`)
|
|
80
|
+
- `/solo` and `/cascade` stamp `spawn-mode-{sid}` when slash ≠ config; always unlink grunt-off
|
|
81
|
+
- Package `files` include `scripts/grunt-config.mjs`; init/launch scripts (antigravity/claude/codex/gemini/grok) and host agent/skill mirrors synced
|
|
82
|
+
|
|
83
|
+
## [0.5.1] - 2026-09-01
|
|
84
|
+
|
|
85
|
+
### Added
|
|
86
|
+
|
|
87
|
+
- `/tmp` skill (host mirrors) + `scripts/persist-tmp.mjs` (+ tests): one-off convo artifacts under `.tmp/grunt/tmp/`; Grok `orchestrate-parent.js` persist rewrite; Stop tag `[tmp]:`
|
|
88
|
+
- Typed advise leftover triple: `{Implement|Write} with verbal|file plan` + `Tweak` — Implement pick1/pick2 still spawn implementer; Write pick1 = `/tmp` persist (no implementer); Write pick2 = write-plan inspect-pause then `/implement-plan {n}` (no implementer this turn); type-mismatch / bare `implement` on Write-typed = no spawn
|
|
89
|
+
- Owned-defect after grunt: in-tree/package defect → thinker `Fix {path}` leftover (not fact-stop); workaround stays why-clause
|
|
90
|
+
|
|
91
|
+
### Changed
|
|
92
|
+
|
|
93
|
+
- Consumer npm scripts prefixed `grunt:<SoT-key>` (`grunt:rulesync:generate`, `grunt:doctor`, …); init migrates owned unprefixed keys + `npm run` refs; SoT repo scripts stay unprefixed; no aliases — CI/husky must switch
|
|
94
|
+
- `package.json` `files` publishes `persist-tmp.mjs`; README documents `/tmp`, typed leftover, and consumer script rename
|
|
95
|
+
- Cascade/output/write-plan/implement-plan/orchestrator/thinker (and host mirrors) aligned to typed leftover + `/tmp`
|
|
96
|
+
|
|
8
97
|
## [0.5.0] - 2026-09-01
|
|
9
98
|
|
|
10
99
|
### Added
|
package/CLAUDE.md
CHANGED
|
@@ -1,46 +1,3 @@
|
|
|
1
1
|
<!-- grunt:begin -->
|
|
2
|
-
|
|
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 (thinker recap verbatim-ish; no-strip how/why). 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`.
|
|
4
|
-
All output exclude AI attribution, Co-Authored-By, trailers, generated markers.
|
|
5
|
-
Protocol: `.rulesync/reference/cascade.md`. Do not paste.
|
|
6
|
-
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.
|
|
7
|
-
Always-do:
|
|
8
|
-
|
|
9
|
-
| signal | next |
|
|
10
|
-
|---|---|
|
|
11
|
-
| 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). Never parent Write/Bash/Skill |
|
|
12
|
-
| plan/spec ready + file writes remain | leftover pick1/pick2 / `/implement-plan {n}` / explicit implement (=pick1) only. pick1 = spawn implementer + last [thinker] recap as spec; no `.tmp/plans`; no write-plan; no implement-plan. pick2 = write-plan persist then implement-plan one-shot skip pause (`plan=/abs/...`; no user slash). slash `/write-plan` ≠ pick2. `ok`/`yes`/`y`/`continue` ≠ either. Thinker recap alone = recap-stop |
|
|
13
|
-
| tools/facts/git/test/mechanical write | spawn grunt |
|
|
14
|
-
| world fact | spawn grunt `job:web` |
|
|
15
|
-
| write defined solution | spawn implementer; **blocked if advise-class stems present** unless prompt-is-spec / obvious comment-spec false+ |
|
|
16
|
-
| 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 |
|
|
17
|
-
| child returned | recap per output.md (echo=report not command; thinker recap verbatim-ish; no-strip). e.g. `[orchestrator]: wrote /abs/a` |
|
|
18
|
-
| child `need:` | parse-need + parallel grunt; `resume_from` + new verdicts; max 3 |
|
|
19
|
-
| ⚠ / validate / sim | spawn implementer with findings; do not recap; spawn; no parent-edit |
|
|
20
|
-
| work remains | spawn; do not stop. Advise recap ≠ leftover writes |
|
|
21
|
-
| 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 |
|
|
22
|
-
| `/parent` | spawn-first; hook last-ditch `parent-escape`; never Read/Bash |
|
|
23
|
-
| `/handoff` | one-turn write `.tmp/grunt/handoffs/`; recap `[handoff]:` |
|
|
24
|
-
| `/pickup` | spawn-first; grunt resolve if needed; never parent Read; not a mode |
|
|
25
|
-
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask) |
|
|
26
|
-
| `/explain` | spawn if facts/work; then human recap of child output; screenshot/visible=context no Read |
|
|
27
|
-
| `/solo` | session escape only; stamp grunt-off-{sid}; else spawn-first |
|
|
28
|
-
| `/cascade` | unlink solo stamp; spawn-first |
|
|
29
|
-
|
|
30
|
-
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}`.
|
|
31
|
-
False+: I think terraform plan /implement-plan /solo source tokens one-cmd how- last-log why.
|
|
32
|
-
Advise leftover: numbered pick each on own line after tagged recap:
|
|
33
|
-
1. Implementer with verbal plan
|
|
34
|
-
2. Implementer with file plan
|
|
35
|
-
3. Tweak
|
|
36
|
-
Match number or full leftover label (or unique tail `verbal plan` / `file plan`). Always-do leftover match; not Skill-name (`2` ≠ write-plan). 1 / that label / explicit implement → spawn implementer; paste last [thinker] recap as spec (how+why; implementer must not paste why into code comments); no plan file; no write-plan; no implement-plan. Bare `implement`/`implementer` → pick1 only (shared prefix; do not substring-match both). 2 / that label → persist `.tmp/plans/{n}` then spawn implementer `plan=/abs/...` (write-plan then implement-plan one-shot; skip inspect pause; no user slash). 3 / Tweak → stay advise; extra text = revision notes → thinker; bare 3/Tweak = stop wait notes. `/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 implement path.
|
|
37
|
-
Parent = orchestrator (this file). You do not talk. Spawn wait echo.
|
|
38
|
-
Spawn only grunt|implementer|thinker. Never spawn orchestrator. Children never spawn.
|
|
39
|
-
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 (no-strip; no compress-to-verdict); 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.
|
|
40
|
-
`/parent` hook last-ditch only. Skills spawn-first. Only `/solo` escapes spawn workflow.
|
|
41
|
-
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).
|
|
42
|
-
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only.
|
|
43
|
-
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.
|
|
44
|
-
`need:` JSON → parse-need + parallel grunt; one `resume_from` + new verdicts; max 3; no re-send task; no fresh-spawn.
|
|
45
|
-
Child: this file does not apply; your agent file gates you. Never spawn.
|
|
2
|
+
@AGENTS.md
|
|
46
3
|
<!-- grunt:end -->
|