@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
package/.agents/agents/grunt.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: grunt
|
|
3
|
-
description:
|
|
3
|
+
description: Isolation worker. Facts only.
|
|
4
4
|
tools:
|
|
5
5
|
- view_file
|
|
6
6
|
- grep_search
|
|
@@ -12,25 +12,4 @@ model: flash
|
|
|
12
12
|
commandExecutionPolicy: eager
|
|
13
13
|
inheritMcp: false
|
|
14
14
|
---
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
Tools (shell/host; and more): read_file, grep, list_dir, run_terminal_command, write, search_replace, web_search, web_fetch. Git. Test runners (vitest, playwright, and similar). Other system tools. Commands of project dependencies. Installing and managing dependencies. Running dev, build, preview, deploys and similar.
|
|
18
|
-
You CAN run npm/git/bash via `run_terminal_command`. Do NOT wait on MCP. Do NOT request MCP for shell. `mcpInheritance: none` means no MCP — use shell/files instead.
|
|
19
|
-
|
|
20
|
-
Run tools. Return output. Never spawn. Never implement complex/feature solutions (implementer agent). Never plan/advise (thinker agent).
|
|
21
|
-
May write simple structural folders/files (scaffold/mkdir/touch/boilerplate only). Not feature solutions.
|
|
22
|
-
Low-reason write: mechanical/repetitive/obvious; volume OK.
|
|
23
|
-
Scratch/tmp → `{workspaceRoot}/.tmp/grunt/` only (mkdir as needed). Never `.tmp/` root, `.tmp/plans/`, `.tmp/grunt/handoffs/`, or `.tmp/orchestrator-logs/`. Repo scaffold/mkdir/touch/boilerplate stays in the real tree.
|
|
24
|
-
|
|
25
|
-
`job: search|exec` → first action `node scripts/grunt-job.mjs --job search|exec --query …`; whole reply = stdout.
|
|
26
|
-
`job: test` → grunt-job; `FALLBACK` (exit 2) → LLM tools.
|
|
27
|
-
`job: web` and messy test → LLM grunt (web_search/web_fetch).
|
|
28
|
-
Browser → `node scripts/browser.mjs <verb>` (`nav|snap|click|fill|shot|pdf|stop`). Lightpanda default. Never MCP. Never raw Playwright. Never env knobs.
|
|
29
|
-
Isolation/write reply ≤8 lines. Verdict grammar only — no dumps/recap/HTML/JSON/full logs:
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
verdict: ok|fail|empty
|
|
33
|
-
n: <count>
|
|
34
|
-
- path:line — fact
|
|
35
|
-
Fail: first 3 error lines.
|
|
36
|
-
```
|
|
15
|
+
Return isolation facts (≤8 lines, stash receipt when needed). A browse snap is the payload.
|
|
@@ -1,50 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: orchestrator
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
model: flash
|
|
3
|
+
description: Session agent. Do the work. Spawn grunt only under the hood when isolation is cheaper.
|
|
4
|
+
mainAgent: true
|
|
5
|
+
subagent: false
|
|
6
|
+
model: pro
|
|
8
7
|
commandExecutionPolicy: eager
|
|
9
8
|
inheritMcp: false
|
|
10
9
|
---
|
|
11
|
-
|
|
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** 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`.
|
|
13
|
-
Protocol: `.rulesync/reference/cascade.md` (peek/kill table need:/resume). Do not paste.
|
|
14
|
-
Always-do:
|
|
15
|
-
|
|
16
|
-
| signal | next |
|
|
17
|
-
|---|---|
|
|
18
|
-
| 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 |
|
|
19
|
-
| 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 |
|
|
20
|
-
| tools/facts/git/test/mechanical write | spawn grunt |
|
|
21
|
-
| world fact | spawn grunt `job:web` |
|
|
22
|
-
| write defined solution | spawn implementer; **blocked if advise-class stems present** unless prompt-is-spec / obvious comment-spec false+ |
|
|
23
|
-
| 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 |
|
|
24
|
-
| child returned | recap per output.md (echo=report not command). e.g. `[orchestrator]: wrote /abs/a` |
|
|
25
|
-
| child `need:` | parse-need + parallel grunt; `resume_from` + new verdicts; max 3 |
|
|
26
|
-
| ⚠ / validate / sim | spawn implementer with findings; do not recap; spawn; no parent-edit |
|
|
27
|
-
| work remains | spawn; do not stop. Advise recap ≠ leftover writes |
|
|
28
|
-
| 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 |
|
|
29
|
-
| `/parent` | spawn-first; hook last-ditch `parent-escape`; never Read/Bash |
|
|
30
|
-
| `/handoff` | one-turn write `.tmp/grunt/handoffs/`; recap `[handoff]:` |
|
|
31
|
-
| `/pickup` | spawn-first; grunt resolve if needed; never parent Read; not a mode |
|
|
32
|
-
| `/write-plan` plan-only | recap; remainder `/implement-plan` (ask) |
|
|
33
|
-
| `/explain` | spawn if facts/work; then human recap of child output; screenshot/visible=context no Read |
|
|
34
|
-
| `/solo` | session escape only; stamp grunt-off-{sid}; else spawn-first |
|
|
35
|
-
| `/cascade` | unlink solo stamp; spawn-first |
|
|
36
|
-
|
|
37
|
-
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}`.
|
|
38
|
-
False+: I think terraform plan /implement-plan /solo source tokens one-cmd how- last-log why.
|
|
39
|
-
Advise leftover: numbered pick each on own line after tagged recap:
|
|
40
|
-
1. Implementer with verbal plan
|
|
41
|
-
2. Implementer with file plan
|
|
42
|
-
3. Tweak
|
|
43
|
-
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.
|
|
44
|
-
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.
|
|
45
|
-
Spawn only `grunt` | `implementer` | `thinker`. Omit `model`. Isolation `none` unless asked. Never spawn `orchestrator`. Children never spawn.
|
|
46
|
-
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).
|
|
47
|
-
Child prompt first sentence only: `You are {agent} subagent.` Then task + abs paths + verdicts only.
|
|
48
|
-
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.
|
|
49
|
-
Child `need:` JSON → parse-need + parallel grunt; one `resume_from` + **new** verdicts only; max 3; no re-send task; no fresh-spawn.
|
|
50
|
-
`/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.
|
|
10
|
+
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.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ask
|
|
3
|
+
description: 'Session flag. Finish one step, recap, then ask before the next.'
|
|
4
|
+
---
|
|
5
|
+
# ask
|
|
6
|
+
|
|
7
|
+
Session flag. Slash `/ask` stamps this session.
|
|
8
|
+
|
|
9
|
+
Finish one coherent step. Recap what landed. Ask whether to continue. Wait. Do not start the next step in this turn.
|
|
10
|
+
|
|
11
|
+
`/auto` is the default: keep going; ask only on blockers. Slash `/auto` unlinks the stamp and returns this session to auto.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: auto
|
|
3
|
+
description: >-
|
|
4
|
+
Session flag. Default. Work the task through. Ask on blockers instead of
|
|
5
|
+
monkey-patching.
|
|
6
|
+
---
|
|
7
|
+
# auto
|
|
8
|
+
|
|
9
|
+
Session flag. Default. Slash `/auto` unlinks any `/ask` stamp on this session.
|
|
10
|
+
|
|
11
|
+
Work the task through. Do not stop after each step. When a blocker, missing fact, or real choice appears, stop and ask. Do not monkey-patch around a failure.
|
|
12
|
+
|
|
13
|
+
`/ask` is the other flag: one step, then ask.
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: browser
|
|
3
|
-
description:
|
|
4
|
-
Session browser rail. /browser or browse a URL. Call node scripts/browser.mjs
|
|
5
|
-
nav|snap|click|fill|shot|pdf|stop. Lightpanda default; snap is the default
|
|
6
|
-
read. Windows → Chromium. Never MCP. Never env knobs. Never raw Playwright.
|
|
3
|
+
description: Browse via node scripts/browser.mjs (Lightpanda). App e2e uses Playwright.
|
|
7
4
|
---
|
|
8
5
|
Zero-config. `node scripts/browser.mjs <verb>`.
|
|
9
6
|
|
|
10
|
-
Verbs: `nav <url>` · `snap` · `click <ref>` · `fill <ref> <text>` · `shot` · `pdf` · `stop` · `doctor` · `ensure`.
|
|
7
|
+
Verbs: `nav <url>` · `snap` · `click <ref>` · `fill <ref> <text>` · `scroll [ref|down|up|N]` · `wait [ms]` · `hover <ref>` · `select <ref> <value>` · `shot` · `pdf` · `stop` · `doctor` · `ensure`.
|
|
11
8
|
|
|
12
9
|
- **snap** = default read (markdown + numbered refs). `click`/`fill` need a prior snap.
|
|
13
|
-
- Lightpanda default. Chromium when `shot`/`pdf`/`trace`, win32, missing Lightpanda, probe-fail once,
|
|
10
|
+
- Lightpanda default. The rail swaps to Chromium when `shot`/`pdf`/`trace`, win32, missing Lightpanda, probe-fail once, Chromium-first hosts (figma docs/sheets/slides mail.google earth amazon), or a blocked/empty/client-rendered snap. One swap. Do not stop and say you cannot.
|
|
14
11
|
- Session/profile: `.tmp/grunt/browser/`. `stop` reaps; second `stop` ok.
|
|
15
12
|
- Windows: Chromium even if Lightpanda exists.
|
|
16
|
-
- `doctor`/`ensure` → `node scripts/doctor.mjs` or `grunt doctor`.
|
|
13
|
+
- `doctor`/`ensure` → `node scripts/doctor.mjs` or `grunt doctor`. Engine hints: `node scripts/setup.mjs browser`. Do not read a README unless doctor/setup is missing; then https://github.com/lovrozagar/grunt#prerequisites (not the consumer README).
|
|
17
14
|
- No env. No MCP. No raw Playwright. Spec: `.rulesync/reference/browser.md`.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clasp
|
|
3
|
+
description: >-
|
|
4
|
+
Low-level Apps Script CLI. Prefer /google-workspace for sheet, doc, meeting,
|
|
5
|
+
mail.
|
|
6
|
+
---
|
|
7
|
+
# clasp
|
|
8
|
+
|
|
9
|
+
Custom Apps Script in-repo only. Spec: `.rulesync/reference/clasp.md`.
|
|
10
|
+
|
|
11
|
+
Sheets, Docs, Slides, Calendar, Gmail: `node scripts/google-workspace.mjs` and `.rulesync/reference/google-workspace.md`.
|
|
@@ -8,6 +8,8 @@ Inspect `git status` + `git diff` (staged and unstaged) before the message.
|
|
|
8
8
|
|
|
9
9
|
Stage only user intent. Never blind `git add -A` / `git add .`. Split unrelated concerns into multiple commits.
|
|
10
10
|
|
|
11
|
+
If a unique in-progress file exists under `.tmp/grunt/implementations/`, its `## Files` is the default stage set. Still inspect `git status`.
|
|
12
|
+
|
|
11
13
|
Message = Conventional Commits **subject only**: `type(scope): subject` (scope optional).
|
|
12
14
|
|
|
13
15
|
Types: feat fix docs style refactor perf test build ci chore revert.
|
|
@@ -18,4 +20,4 @@ NO body. NO footer. NO `Co-Authored-By`. NO `Generated with`. NO 🤖. NO traile
|
|
|
18
20
|
|
|
19
21
|
Never git push. Never `git push`. This skill never pushes.
|
|
20
22
|
|
|
21
|
-
Protocol: `.rulesync/reference/cascade.md`. Do not paste
|
|
23
|
+
Protocol: `.rulesync/reference/cascade.md`. Do not paste.
|
|
@@ -8,6 +8,8 @@ Inspect `git status` + `git diff` (staged and unstaged) before the message.
|
|
|
8
8
|
|
|
9
9
|
Stage only user intent. Never blind `git add -A` / `git add .`. Split unrelated concerns into multiple commits.
|
|
10
10
|
|
|
11
|
+
If a unique in-progress file exists under `.tmp/grunt/implementations/`, its `## Files` is the default stage set. Still inspect `git status`.
|
|
12
|
+
|
|
11
13
|
Message = Conventional Commits **subject only**: `type(scope): subject` (scope optional).
|
|
12
14
|
|
|
13
15
|
Types: feat fix docs style refactor perf test build ci chore revert.
|
|
@@ -9,6 +9,8 @@ Inspect `git status` + `git diff` (staged and unstaged) before the message.
|
|
|
9
9
|
|
|
10
10
|
Stage only user intent. Never blind `git add -A` / `git add .`. Split unrelated concerns into multiple commits.
|
|
11
11
|
|
|
12
|
+
If a unique in-progress file exists under `.tmp/grunt/implementations/`, its `## Files` is the default stage set. Still inspect `git status`.
|
|
13
|
+
|
|
12
14
|
Message = Conventional Commits **subject only**: `type(scope): subject` (scope optional).
|
|
13
15
|
|
|
14
16
|
Types: feat fix docs style refactor perf test build ci chore revert.
|
|
@@ -9,6 +9,8 @@ Inspect `git status` + `git diff` (staged and unstaged) before the message.
|
|
|
9
9
|
|
|
10
10
|
Stage only user intent. Never blind `git add -A` / `git add .`. Split unrelated concerns into multiple commits.
|
|
11
11
|
|
|
12
|
+
If a unique in-progress file exists under `.tmp/grunt/implementations/`, its `## Files` is the default stage set. Still inspect `git status`.
|
|
13
|
+
|
|
12
14
|
Message = Conventional Commits **subject only**: `type(scope): subject` (scope optional).
|
|
13
15
|
|
|
14
16
|
Types: feat fix docs style refactor perf test build ci chore revert.
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: explain
|
|
3
|
-
description:
|
|
4
|
-
One-off human recap. /explain. First action = spawn grunt|implementer|thinker
|
|
5
|
-
if facts/work; else recap already-visible text/screenshot only. Never
|
|
6
|
-
Read/read_file/Grep/Glob/Bash. Not a spawn-escape. Not a mode. Voice escape
|
|
7
|
-
this reply only then revert.
|
|
3
|
+
description: Longer human recap this reply only.
|
|
8
4
|
---
|
|
9
|
-
This reply only: explain for a human. Not a mode switch or session flag. After this reply, revert to
|
|
5
|
+
This reply only: explain for a human. Not a mode switch or session flag. After this reply, revert to output.md.
|
|
10
6
|
|
|
11
|
-
Still concise. Complete sentences
|
|
12
|
-
Four buckets (completed / in-flight / remainder / blocker). Completed work = past tense.
|
|
7
|
+
Still concise. Complete sentences. Prioritize clarity over token compression. Do not dump, sprawl, or narrate process.
|
|
8
|
+
Four buckets (completed / in-flight / remainder / blocker). Completed work = past tense. Omit empty. Natural language; no key tokens. Longer expansion this reply only — not the only grammar for complete sentences.
|
|
13
9
|
|
|
14
|
-
en-US unless asked. Keep need
|
|
10
|
+
en-US unless asked. Keep need: JSON and plan grammar when those apply.
|
|
15
11
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
Freeform how/why/explain is not this skill (thinker unless cheap false+). Slash `/explain` only.
|
|
19
|
-
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.
|
|
12
|
+
Always-why advise recap ≠ `/explain`. `/explain` = longer expansion not the why path.
|
|
13
|
+
Freeform how/why/explain is not this skill. Slash `/explain` only.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: google-workspace
|
|
3
|
+
description: >-
|
|
4
|
+
Google Sheets, Docs, Slides, Calendar, Gmail via node
|
|
5
|
+
scripts/google-workspace.mjs.
|
|
6
|
+
---
|
|
7
|
+
# google-workspace
|
|
8
|
+
|
|
9
|
+
When the user wants a Google sheet, doc, slide, meeting, or mail, run `node scripts/google-workspace.mjs`. Spec: `.rulesync/reference/google-workspace.md`. If Calendar/Gmail/sheet set fail or login is missing, tell them to run `node scripts/setup.mjs google-workspace` (TTY) for the handheld walk. Do not share creds. Do not invent OAuth JSON. Do not ask them to write Apps Script.
|
|
10
|
+
|
|
11
|
+
`whoami` · `scopes` · `accounts` · `login` · `sheet create|set|get|append|clear` · `doc create|append` · `drive list` · `slide create` · `meeting create [--attendees a@b,c@d]` · `mail send|list`. `--account NAME` for a second Google user on this machine.
|
|
12
|
+
|
|
13
|
+
Auth: `node scripts/setup.mjs google-workspace` then `login` as needed. Two Google users on one machine: `--account NAME`. Creds stay in `~/.grunt/` (or `~/.grunt/workspace/NAME/`). Do not share OAuth JSON or tokens. Doctor: `node scripts/doctor.mjs` reports google-workspace as optional (`oauth` `tokens` `adc` `clasprc`; no secrets). `clasprc` is Drive-only. Spec: `.rulesync/reference/google-workspace.md` `.rulesync/reference/setup.md`.
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: handoff
|
|
3
|
-
description:
|
|
4
|
-
Parent writes a session handoff under .tmp/grunt/handoffs/ and tells the user
|
|
5
|
-
to continue in a fresh session. Use for /handoff, "context is getting long",
|
|
6
|
-
"hand this off", "start a new session". Not a plan, not a design doc.
|
|
3
|
+
description: Write a session handoff under .tmp/grunt/handoffs/. Continue with /pickup.
|
|
7
4
|
---
|
|
8
5
|
# handoff
|
|
9
6
|
|
|
10
|
-
One turn
|
|
7
|
+
One turn. Author from this session. Write once, report path, stop.
|
|
11
8
|
|
|
12
9
|
## Invocation
|
|
13
10
|
|
|
@@ -59,7 +56,7 @@ Facts only. Absolute paths. No transcript paste, no dump, no secrets/tokens.
|
|
|
59
56
|
|
|
60
57
|
Line 1 of the body: `HANDOFF_NAME: <3-6 word name>`, then the body only.
|
|
61
58
|
|
|
62
|
-
|
|
59
|
+
Write under `.tmp/grunt/handoffs/` (any filename in that dir). Grok `orchestrate-parent.js` runs `scripts/persist-handoff.mjs`: serial/slug from `HANDOFF_NAME:` / heading, injects frontmatter, rewrites path + content. Invalid handoff or a write outside that dir is denied — fix the body, do not retry elsewhere.
|
|
63
60
|
|
|
64
61
|
Host without that hook: name the file per **Path** yourself, or pipe the body to `node scripts/persist-handoff.mjs --workspace {repo}` and use its `path`.
|
|
65
62
|
|
|
@@ -67,19 +64,18 @@ Host without that hook: name the file per **Path** yourself, or pipe the body to
|
|
|
67
64
|
|
|
68
65
|
```
|
|
69
66
|
[handoff]: serial={int} path=.tmp/grunt/handoffs/{serial}-{slug}-{stamp}.md
|
|
70
|
-
next: start a new session; `/pickup {serial}`
|
|
67
|
+
next: start a new session; `/pickup {serial}`
|
|
71
68
|
```
|
|
72
69
|
|
|
73
70
|
Do not dump the handoff body.
|
|
74
71
|
|
|
75
72
|
## Picking one up
|
|
76
73
|
|
|
77
|
-
`/pickup {serial}` owns pickup
|
|
74
|
+
`/pickup {serial}` owns pickup. Load the file, set `status: resumed`, work `Next` leaves in order, flip only the box. All `[x]` → `status: done`. Do not re-plan; a stale leaf → `/write-plan` a follow-up.
|
|
78
75
|
|
|
79
76
|
## Rules
|
|
80
77
|
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
- Handoff ≠ plan: no Steps/Verify phases, no `.tmp/plans/` write.
|
|
78
|
+
- One write. `/handoff` is not a mode.
|
|
79
|
+
- Handoff ≠ plan: no Steps/Verify phases, no `.tmp/grunt/plans/` write. Handoff ≠ implementation journal.
|
|
84
80
|
- Never rewrite or renumber an existing handoff; new session = new serial.
|
|
85
81
|
- Protocol: `.rulesync/reference/cascade.md`. Do not paste it here.
|
|
@@ -1,116 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: implement-plan
|
|
3
|
-
description:
|
|
4
|
-
Implementer executes a local .tmp/plans checklist: continue, resume, or pick
|
|
5
|
-
among plans. Empty /implement-plan resumes a unique in-progress or starts a
|
|
6
|
-
unique ready plan; else lists and needs serial. Marks [x], skips completed
|
|
7
|
-
leaves. Not /implement review-loop, not /execute-plan PR DAG, not /pickup, not
|
|
8
|
-
/run-plan.
|
|
3
|
+
description: 'Execute remaining leaves in a .tmp/grunt/plans checklist. Skip [x].'
|
|
9
4
|
---
|
|
10
5
|
# implement-plan
|
|
11
6
|
|
|
12
|
-
|
|
7
|
+
You execute the plan in this session. Skip `[x]`. Start at the first open leaf. Flip only the box after each leaf. When a phase's children are `[x]`, mark the phase `[x]`. Frontmatter `in-progress` then `done`.
|
|
13
8
|
|
|
14
|
-
|
|
9
|
+
Arg `{n|path}` picks that file. Empty arg: unique in-progress, else unique ready, else list serials.
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
Format: `.rulesync/reference/plan-format.md`. Write-allowlist = paths listed in the plan. Run Verify leaves. Do not skip a test leaf. Do not flip a behavior leaf `[x]` until its test ran. Fat dumps go through `node scripts/grunt-job.mjs`.
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
`/implement-plan {serial|path}`
|
|
20
|
-
|
|
21
|
-
Todos: `resolve` → `implement` → `verify`. One serial per run. Partial progress is ok; re-run continues. Skip `[x]`. Remaining leaves only.
|
|
22
|
-
|
|
23
|
-
## Resolve
|
|
24
|
-
|
|
25
|
-
Arg = `$ARGUMENTS` stripped. Listing/validate: spawn grunt (`job:search|exec`) on `.tmp/plans/`. Do not parent Read/Grep/Bash.
|
|
26
|
-
|
|
27
|
-
Eligible auto = valid plan-format checkbox grammar (`N [ ]` / `N.M [ ]`; not `- [ ]`; not `1. [ ]`). Invalid grammar: exclude from auto. Drop `done` (all `[x]` or FM `status: done`) from auto. Never silent latest. Never auto-pick among many.
|
|
28
|
-
|
|
29
|
-
**In-progress:** some `[x]` and remaining `[ ]`, or FM `status: in-progress` with open leaves.
|
|
30
|
-
|
|
31
|
-
**Ready / none started:** FM `ready` or all boxes `[ ]`.
|
|
32
|
-
|
|
33
|
-
**Blocked + open:** list/tag `blocked`; empty-arg never auto-runs. Explicit `{n|path}` still runs (skip `[x]`).
|
|
34
|
-
|
|
35
|
-
### Empty arg (`/implement-plan`)
|
|
36
|
-
|
|
37
|
-
Grunt lists/validates `.tmp/plans/*.md`. Then:
|
|
38
|
-
|
|
39
|
-
| condition | action |
|
|
40
|
-
|---|---|
|
|
41
|
-
| exactly 1 in-progress | resume it (implementer; skip `[x]`; start first open leaf) |
|
|
42
|
-
| exactly 1 plan total, none started (ready / all open) | start it |
|
|
43
|
-
| 0 plans (dir missing / no files) | blocker; remainder `/write-plan` |
|
|
44
|
-
| N>1 in-progress | list those (`serial name status first-open-leaf`); `need serial`. No silent latest |
|
|
45
|
-
| 0 in-progress, N>1 eligible (ready / blocked-open) | list eligible (`serial name status first-open-leaf`; tag `blocked`); `need serial` |
|
|
46
|
-
| only `done` / only invalid | blocker; remainder `/write-plan` |
|
|
47
|
-
|
|
48
|
-
Unique in-progress wins even if other ready/done files exist. Invalid grammar does not count toward unique-auto and is omitted from auto lists.
|
|
49
|
-
|
|
50
|
-
### Arg `{n|path}`
|
|
51
|
-
|
|
52
|
-
That file only; skip `[x]`; remaining leaves. Write-plan remainder stays `/implement-plan {n}` (that serial). Never auto-pick among many.
|
|
53
|
-
|
|
54
|
-
| input | action |
|
|
55
|
-
|---|---|
|
|
56
|
-
| int (`1`, `0001`) | files whose leading number == that int |
|
|
57
|
-
| `{serial}-slug` or `*.md` or path | that file if under `.tmp/plans/` |
|
|
58
|
-
| slug only (`add-auth`) | unique match `*-{slug}-*.md` or `*-{slug}.md` |
|
|
59
|
-
| `.tmp/plans` missing / no files | `no plans. /write-plan first` stop |
|
|
60
|
-
| 0 matches | `no plan serial={n}. have: {list}` stop |
|
|
61
|
-
| >1 matches | `ambiguous: {paths}` stop |
|
|
62
|
-
| all boxes already `[x]` / `status: done` | `[implementer]: already done path=...` **no implementer spawn** |
|
|
63
|
-
|
|
64
|
-
Lookup: integer equality so `1` matches canonical `1-foo-20260826T143000Z.md` and legacy `1-foo.md`. `0001-foo.md` may still resolve if an old padded file exists. Normalize to abs path + int serial.
|
|
65
|
-
|
|
66
|
-
If prefetch needed: spawn grunt `job:search|exec`. Do not `resume_from` for dumps already listed in the plan leaves. Do not add a repo-wide explore. Then spawn implementer.
|
|
67
|
-
|
|
68
|
-
## Spawn implementer
|
|
69
|
-
|
|
70
|
-
`subagent_type: implementer`, `background: true`, omit `model`, `isolation: none`, `description: "implement plan {serial}"`.
|
|
71
|
-
|
|
72
|
-
Prompt:
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
You are implementer subagent. Do not spawn.
|
|
76
|
-
|
|
77
|
-
Read {abs}/.rulesync/reference/plan-format.md and the plan at {abs_plan_path}.
|
|
78
|
-
|
|
79
|
-
Implement remaining `[ ]` leaves in numeric order. Skip `[x]`. Start at the first open leaf.
|
|
80
|
-
Write-allowlist = paths listed in this plan only. Do not add README/docs/examples unless listed in the plan. Missing path → blocker/`need:`; do not invent.
|
|
81
|
-
After each leaf: flip that line to `[x]` in the plan file (only the box).
|
|
82
|
-
When a phase's children are all `[x]`, mark the phase `[x]`.
|
|
83
|
-
Frontmatter status: in-progress at start; done when all boxes `[x]`; blocked if you cannot finish.
|
|
84
|
-
Do not expand scope, add steps, or start a review loop.
|
|
85
|
-
If blocked: leave remaining `[ ]`, status: blocked, report reason + leftover ids.
|
|
86
|
-
Run Verify leaves. Report abs paths you changed.
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Wait. Spawn fail → `[implementer]: failed: {err}` stop.
|
|
90
|
-
|
|
91
|
-
## Recap
|
|
92
|
-
|
|
93
|
-
Recap from implementer output only. No parent Read/Grep/Bash.
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
[implementer]: serial={int} path=.tmp/plans/{file} status={status} done={x}/{total}
|
|
97
|
-
files: {abs paths}
|
|
98
|
-
{if leftover:}
|
|
99
|
-
leftover:
|
|
100
|
-
{up to 10 open leaf lines}
|
|
101
|
-
{if blocked:} blocked: {reason}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
## Rules
|
|
105
|
-
|
|
106
|
-
- Skip `[x]`; only flip boxes; no renumber/rewrite leaf text.
|
|
107
|
-
- No review-fix loop. Not bundled `/implement`. Leftover pick 1 (verbal plan) ≠ this skill (no `.tmp/plans`; no write-plan; no implement-plan). Bare `implement`/`implementer` → pick1, not this skill.
|
|
108
|
-
- Slash `/implement-plan {n}` = disk/file run. Empty `/implement-plan` = unique-resume / unique-start / else list. Leftover pick 2 may invoke this sequencing without user slash (after write-plan persist; `plan=/abs/...` only). Always-do leftover match; leftover `2` ≠ Skill-name. Verbal leftover ≠ implement-plan.
|
|
109
|
-
- No auto `/write-plan` chain. Escalation → tell user to `/write-plan` a follow-up.
|
|
110
|
-
- Omit `model`. `subagent_type: implementer` only for this skill.
|
|
111
|
-
- First prompt sentence: `You are implementer subagent.`
|
|
112
|
-
- Child prompt = task + abs paths + verdicts only (no pasted transcripts).
|
|
113
|
-
- Resume prompt = `You are implementer subagent.` + new verdicts only. Do not re-send the original task. Max 3 `resume_from` per child id; then report blocked/partial.
|
|
114
|
-
- Tool-call first for spawn claims.
|
|
115
|
-
- Do not re-plan. Partial = skill success (plan file is SoT).
|
|
116
|
-
- `/pickup` stays handoffs only. Do not merge.
|
|
13
|
+
On start: if this plan has no journal, Write one under `.tmp/grunt/implementations/` (`IMPL_NAME:`, `IMPL_PLAN: {n}`). Format: `.rulesync/reference/implementation-format.md`. After each leaf: append `N.M [x] …` to Log, update Files (repo-relative product paths) and Done. Blocked → `status: blocked` and Blockers. Verify done → `status: done`. Straight shots do not write a journal.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: listen
|
|
3
|
+
description: >-
|
|
4
|
+
Speech-to-text via node scripts/listen.mjs (ffmpeg mic + local whisper.cpp,
|
|
5
|
+
OpenAI fallback). Input only.
|
|
6
|
+
---
|
|
7
|
+
# listen
|
|
8
|
+
|
|
9
|
+
When the user wants to dictate, transcribe a recording, or toggle a mic, run `node scripts/listen.mjs`. Spec: `.rulesync/reference/listen.md`. Input only (audio → text). Do not speak. Do not use `/speak`.
|
|
10
|
+
|
|
11
|
+
`whoami` · `devices` · `rec [--seconds N]` · `start` · `stop` · `toggle` · `status` · `file --path P` · `latest`. `--clip` copies the transcript. `--cwd DIR` when the process is not already in the repo (hotkeys). `rec` prints the transcript and `transcript=.tmp/grunt/listen/latest.txt`.
|
|
12
|
+
|
|
13
|
+
STT: local `whisper-cli` first (mac: `brew install whisper-cpp`); first listen downloads the ggml model to `~/.grunt/whisper/`. Else `OPENAI_API_KEY`. Mic verbs need ffmpeg. Do not tell them to pip-install openai-whisper or curl the model by hand.
|
|
14
|
+
|
|
15
|
+
If the CLI exits non-zero, print its message. Lines with `setup:` are for the user — show that command. Tell them to run `node scripts/setup.mjs listen` (or `grunt setup`) in their terminal. Do not dump JSON. Do not invent a key. Spec: `.rulesync/reference/listen.md` `.rulesync/reference/setup.md`.
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pickup
|
|
3
|
-
description:
|
|
4
|
-
Pick up/continue a session handoff under .tmp/grunt/handoffs/. Use for
|
|
5
|
-
/pickup, pick up, continue handoff, serial, drag-drop path,
|
|
6
|
-
newest/last/latest, title substring. Inverse of /handoff. Not a plan. Not
|
|
7
|
-
/handoff.
|
|
3
|
+
description: Continue a handoff under .tmp/grunt/handoffs/.
|
|
8
4
|
---
|
|
9
5
|
# pickup
|
|
10
6
|
|
|
11
7
|
Voice: `.rulesync/reference/output.md`.
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
Load a handoff and continue in this session. Not a mode. Not `/handoff`. Inverse of `/handoff`.
|
|
14
10
|
|
|
15
11
|
## Invocation
|
|
16
12
|
|
|
@@ -22,7 +18,7 @@ Spawn-first pickup. Parent never Read/Bash/list the handoff. First token = spawn
|
|
|
22
18
|
|
|
23
19
|
## Resolve
|
|
24
20
|
|
|
25
|
-
|
|
21
|
+
Read `.tmp/grunt/handoffs/`. Use `node scripts/grunt-job.mjs --job search|exec` when the listing is fat.
|
|
26
22
|
|
|
27
23
|
Order:
|
|
28
24
|
|
|
@@ -40,13 +36,13 @@ Empty/missing dir: recap no handoffs; stop.
|
|
|
40
36
|
|
|
41
37
|
Drag outside handoffs dir or non-FILENAME_RE: reject; list valid.
|
|
42
38
|
|
|
43
|
-
Corrupt FM:
|
|
39
|
+
Corrupt FM: recap; do not continue on garbage.
|
|
44
40
|
|
|
45
|
-
status done + explicit serial/path: warn; still load if user named it.
|
|
41
|
+
status done + explicit serial/path: warn; still load if the user named it.
|
|
46
42
|
|
|
47
43
|
## After unique path
|
|
48
44
|
|
|
49
|
-
|
|
45
|
+
Read the file. Set `status: resumed`. Work Next leaves in order; flip only that box; all `[x]` → `status: done`; do not re-plan; stale → `/write-plan`. Edit in place. Never persist-handoff.mjs on pickup.
|
|
50
46
|
|
|
51
47
|
## Recap
|
|
52
48
|
|
|
@@ -58,7 +54,5 @@ Do not invent a new role tag.
|
|
|
58
54
|
|
|
59
55
|
## Rules
|
|
60
56
|
|
|
61
|
-
- Parent never Read/Bash/list. First token = spawn.
|
|
62
|
-
- No ask_user_question. Ask = recap list + stop.
|
|
63
57
|
- `/handoff` stays one-turn write. This skill owns pickup.
|
|
64
58
|
- Protocol: `.rulesync/reference/cascade.md`. Do not paste.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: speak
|
|
3
|
+
description: Text-to-speech via node scripts/speak.mjs (ElevenLabs or OpenAI). Output only.
|
|
4
|
+
---
|
|
5
|
+
# speak
|
|
6
|
+
|
|
7
|
+
When the user wants spoken audio, run `node scripts/speak.mjs`. Spec: `.rulesync/reference/speak.md`. Output only (text → mp3). Do not record a mic. Do not transcribe.
|
|
8
|
+
|
|
9
|
+
`whoami` · `voices` · `say --text T [--provider elevenlabs|openai] [--voice ID] [--out path] [--play]`.
|
|
10
|
+
|
|
11
|
+
Auth: `ELEVENLABS_API_KEY` or `OPENAI_API_KEY` or `~/.grunt/speak.json`. Do not commit the key. Default voices: ElevenLabs George (`JBFqnCBsd6RMkjVDRZzb`), OpenAI `coral`.
|
|
12
|
+
|
|
13
|
+
If the CLI exits non-zero, print its message. Lines with `setup:` are for the user — show that command. Tell them to run `node scripts/setup.mjs speak` (or `grunt setup`) in their terminal. Do not dump JSON. Do not invent a key. Spec: `.rulesync/reference/speak.md` `.rulesync/reference/setup.md`.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tmp
|
|
3
|
+
description: Dump a one-off convo artifact under .tmp/grunt/.
|
|
4
|
+
---
|
|
5
|
+
# tmp
|
|
6
|
+
|
|
7
|
+
One turn. Author from this session (email/script/note). Write once. Recap path. Stop.
|
|
8
|
+
|
|
9
|
+
## Invocation
|
|
10
|
+
|
|
11
|
+
`/tmp [what]`
|
|
12
|
+
|
|
13
|
+
Empty `$ARGUMENTS` + no already-visible dumpable blob → `need task`. Empty + visible blob (code fence / draft) → dump that.
|
|
14
|
+
|
|
15
|
+
## When
|
|
16
|
+
|
|
17
|
+
Dump a one-off convo artifact. Not `/handoff` (no pickup no Goal/State/Next). Not `.tmp/grunt/plans/`. Not `.tmp/grunt/implementations/`. Not product source. Not OS `/tmp`.
|
|
18
|
+
|
|
19
|
+
## Path
|
|
20
|
+
|
|
21
|
+
`.tmp/grunt/{serial}-{slug}-{YYYYMMDDTHHMMSSZ}.{ext}`
|
|
22
|
+
|
|
23
|
+
- serial: unpadded int ≥ 1, next after existing tmp dumps (own counter; not plan/handoff/implementation serials)
|
|
24
|
+
- slug: lower, non `[a-z0-9]` → `-`, collapse, trim 50
|
|
25
|
+
- stamp: UTC `YYYYMMDDTHHMMSSZ`
|
|
26
|
+
- ext: `TMP_EXT` or explicit `.{ext}` in args; else `md`
|
|
27
|
+
|
|
28
|
+
## Write
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
TMP_NAME: <3-6 word name>
|
|
32
|
+
TMP_EXT: md
|
|
33
|
+
<artifact only>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`TMP_EXT` optional. Write any root filename under `.tmp/grunt/` (not `plans|handoffs|implementations|browser|orchestrator-logs`). Grok `orchestrate-parent.js` runs `scripts/persist-tmp.mjs`: serial/slug/ext from `TMP_*`, strips those lines, no YAML frontmatter, rewrites path + content. Write outside that root or missing `TMP_NAME:` is denied.
|
|
37
|
+
|
|
38
|
+
Host without that hook: name the file per **Path** yourself, or pipe the body to `node scripts/persist-tmp.mjs --workspace {repo}` and use its `path`.
|
|
39
|
+
|
|
40
|
+
Never rewrite an existing dump; new serial. Artifact file content after hook = artifact only (no TMP_* lines no YAML frontmatter).
|
|
41
|
+
|
|
42
|
+
## Report
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
[tmp]: serial={int} path=.tmp/grunt/{serial}-{slug}-{stamp}.{ext}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Do not dump the body.
|
|
49
|
+
|
|
50
|
+
## Rules
|
|
51
|
+
|
|
52
|
+
- One write. `/tmp` is not a mode.
|
|
53
|
+
- Secrets/tokens: refuse dump. Text artifacts only; no binary.
|
|
54
|
+
- Protocol: `.rulesync/reference/cascade.md`. Do not paste it here.
|