@lovrozagar/grunt 0.10.1 → 0.11.1
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/orchestrator.md +1 -1
- package/.agents/hooks.json +2 -2
- package/.agents/skills/browser/SKILL.md +3 -3
- package/.agents/skills/clasp/SKILL.md +1 -1
- package/.agents/skills/google-workspace/SKILL.md +3 -3
- package/.agents/skills/handoff/SKILL.md +2 -2
- package/.agents/skills/implement-plan/SKILL.md +2 -2
- package/.agents/skills/jev/SKILL.md +3 -3
- package/.agents/skills/listen/SKILL.md +3 -3
- package/.agents/skills/pickup/SKILL.md +1 -1
- package/.agents/skills/speak/SKILL.md +3 -3
- package/.agents/skills/tmp/SKILL.md +2 -2
- package/.agents/skills/write-plan/SKILL.md +4 -2
- package/.claude/agents/orchestrator.md +1 -1
- package/.claude/settings.json +3 -3
- package/.claude/skills/browser/SKILL.md +3 -3
- package/.claude/skills/clasp/SKILL.md +1 -1
- package/.claude/skills/google-workspace/SKILL.md +3 -3
- package/.claude/skills/handoff/SKILL.md +2 -2
- package/.claude/skills/implement-plan/SKILL.md +2 -2
- package/.claude/skills/jev/SKILL.md +3 -3
- package/.claude/skills/listen/SKILL.md +3 -3
- package/.claude/skills/pickup/SKILL.md +1 -1
- package/.claude/skills/speak/SKILL.md +3 -3
- package/.claude/skills/tmp/SKILL.md +2 -2
- package/.claude/skills/write-plan/SKILL.md +4 -2
- package/.codex/agents/orchestrator.toml +1 -1
- package/.codex/hooks.json +3 -3
- package/.grok/agents/orchestrator.md +1 -1
- package/.grok/hooks/orchestrate-parent.js +9 -9
- package/.grok/skills/browser/SKILL.md +3 -3
- package/.grok/skills/clasp/SKILL.md +1 -1
- package/.grok/skills/google-workspace/SKILL.md +3 -3
- package/.grok/skills/handoff/SKILL.md +2 -2
- package/.grok/skills/implement-plan/SKILL.md +2 -2
- package/.grok/skills/jev/SKILL.md +3 -3
- package/.grok/skills/listen/SKILL.md +3 -3
- package/.grok/skills/pickup/SKILL.md +1 -1
- package/.grok/skills/speak/SKILL.md +3 -3
- package/.grok/skills/tmp/SKILL.md +2 -2
- package/.grok/skills/write-plan/SKILL.md +4 -2
- package/.rulesync/hooks.jsonc +3 -3
- package/.rulesync/reference/INDEX.md +9 -9
- package/.rulesync/reference/browser.md +4 -4
- package/.rulesync/reference/cascade.md +2 -2
- package/.rulesync/reference/clasp.md +1 -1
- package/.rulesync/reference/google-workspace.md +29 -29
- package/.rulesync/reference/hooks.md +3 -3
- package/.rulesync/reference/implementation-format.md +2 -2
- package/.rulesync/reference/jev.md +3 -3
- package/.rulesync/reference/law.md +1 -1
- package/.rulesync/reference/listen.md +12 -12
- package/.rulesync/reference/map.md +25 -25
- package/.rulesync/reference/refs-map.md +3 -3
- package/.rulesync/reference/rtk.md +1 -1
- package/.rulesync/reference/scope.md +12 -14
- package/.rulesync/reference/setup.md +7 -7
- package/.rulesync/reference/skills-map.md +5 -5
- package/.rulesync/reference/speak.md +6 -6
- package/.rulesync/rules/overview.md +5 -5
- package/{scripts → .rulesync/scripts}/doctor.mjs +2 -2
- package/{scripts → .rulesync/scripts}/feature-packs.mjs +1 -1
- package/{scripts → .rulesync/scripts}/folder-map.mjs +7 -3
- package/{scripts → .rulesync/scripts}/gate-fat-tools.mjs +3 -3
- package/{scripts → .rulesync/scripts}/google-workspace.mjs +2 -2
- package/{scripts → .rulesync/scripts}/grunt-job.mjs +2 -0
- package/{scripts → .rulesync/scripts}/guarded-md.mjs +10 -4
- package/{scripts → .rulesync/scripts}/hooks-union.mjs +13 -8
- package/{scripts → .rulesync/scripts}/jev.mjs +2 -2
- package/{scripts → .rulesync/scripts}/listen.mjs +6 -6
- package/{scripts → .rulesync/scripts}/pipeline.mjs +14 -14
- package/{scripts → .rulesync/scripts}/session-map.mjs +1 -1
- package/{scripts → .rulesync/scripts}/setup.mjs +4 -4
- package/{scripts → .rulesync/scripts}/speak.mjs +4 -4
- package/.rulesync/skills/browser/SKILL.md +3 -3
- package/.rulesync/skills/clasp/SKILL.md +1 -1
- package/.rulesync/skills/google-workspace/SKILL.md +3 -3
- package/.rulesync/skills/handoff/SKILL.md +2 -2
- package/.rulesync/skills/implement-plan/SKILL.md +2 -2
- package/.rulesync/skills/jev/SKILL.md +3 -3
- package/.rulesync/skills/listen/SKILL.md +3 -3
- package/.rulesync/skills/pickup/SKILL.md +1 -1
- package/.rulesync/skills/speak/SKILL.md +3 -3
- package/.rulesync/skills/tmp/SKILL.md +2 -2
- package/.rulesync/skills/write-plan/SKILL.md +4 -2
- package/.rulesync/subagents/orchestrator.md +1 -1
- package/AGENTS.md +7 -5
- package/CHANGELOG.md +21 -3
- package/CLAUDE.md +2 -0
- package/README.md +23 -23
- package/cli/grunt.mjs +3 -3
- package/cli/grunt.test.ts +6 -6
- package/cli/init.mjs +67 -17
- package/cli/init.test.ts +321 -163
- package/cli/prompt.mjs +1 -1
- package/cli/self-update.mjs +1 -1
- package/package.json +15 -50
- /package/{scripts → .rulesync/scripts}/board.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/browser.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/check-globals.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/emit-agent-shell-tools.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/emit-gemini.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/emit-maps.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/emit-mcp-policy.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/guarded-roots.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/interactive.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/jsonc.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/package-manager.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/parse-need.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/persist-handoff.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/persist-implementation.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/persist-plan.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/persist-tmp.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/prompt.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/purge-global-mcps.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/scrub-spawn-prompt.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/scrub-text +0 -0
- /package/{scripts → .rulesync/scripts}/scrub-text-lib.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/skill-conflicts.mjs +0 -0
- /package/{scripts → .rulesync/scripts}/sync-global-settings.mjs +0 -0
|
@@ -7,4 +7,4 @@ model: pro
|
|
|
7
7
|
commandExecutionPolicy: eager
|
|
8
8
|
inheritMcp: false
|
|
9
9
|
---
|
|
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.
|
|
10
|
+
Follow AGENTS.md. Do the work. Concise complete sentences with natural grammar. Scratch in `.tmp/grunt/`. Browse with `node .rulesync/scripts/browser.mjs`; the rail swaps to Chromium when Lightpanda is blocked. App e2e uses Playwright.
|
package/.agents/hooks.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"hooks": [
|
|
7
7
|
{
|
|
8
8
|
"type": "command",
|
|
9
|
-
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/scripts/scrub-spawn-prompt.mjs\"",
|
|
9
|
+
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.rulesync/scripts/scrub-spawn-prompt.mjs\"",
|
|
10
10
|
"timeout": 5
|
|
11
11
|
}
|
|
12
12
|
]
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"hooks": [
|
|
17
17
|
{
|
|
18
18
|
"type": "command",
|
|
19
|
-
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/scripts/gate-fat-tools.mjs\"",
|
|
19
|
+
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.rulesync/scripts/gate-fat-tools.mjs\"",
|
|
20
20
|
"timeout": 5
|
|
21
21
|
}
|
|
22
22
|
]
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: browser
|
|
3
|
-
description: Browse via node scripts/browser.mjs (Lightpanda). App e2e uses Playwright.
|
|
3
|
+
description: Browse via node .rulesync/scripts/browser.mjs (Lightpanda). App e2e uses Playwright.
|
|
4
4
|
---
|
|
5
|
-
Zero-config. `node scripts/browser.mjs <verb>`.
|
|
5
|
+
Zero-config. `node .rulesync/scripts/browser.mjs <verb>`.
|
|
6
6
|
|
|
7
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`.
|
|
8
8
|
|
|
@@ -10,5 +10,5 @@ Verbs: `nav <url>` · `snap` · `click <ref>` · `fill <ref> <text>` · `scroll
|
|
|
10
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.
|
|
11
11
|
- Session/profile: `.tmp/grunt/browser/`. `stop` reaps; second `stop` ok.
|
|
12
12
|
- Windows: Chromium even if Lightpanda exists.
|
|
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).
|
|
13
|
+
- `doctor`/`ensure` → `node .rulesync/scripts/doctor.mjs` or `grunt doctor`. Engine hints: `node .rulesync/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).
|
|
14
14
|
- No env. No MCP. No raw Playwright. Spec: `.rulesync/reference/browser.md`.
|
|
@@ -8,4 +8,4 @@ description: >-
|
|
|
8
8
|
|
|
9
9
|
Custom Apps Script in-repo only. Spec: `.rulesync/reference/clasp.md`.
|
|
10
10
|
|
|
11
|
-
Sheets, Docs, Slides, Calendar, Gmail: `node scripts/google-workspace.mjs` and `.rulesync/reference/google-workspace.md`.
|
|
11
|
+
Sheets, Docs, Slides, Calendar, Gmail: `node .rulesync/scripts/google-workspace.mjs` and `.rulesync/reference/google-workspace.md`.
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
name: google-workspace
|
|
3
3
|
description: >-
|
|
4
4
|
Google Sheets, Docs, Slides, Calendar, Gmail via node
|
|
5
|
-
scripts/google-workspace.mjs.
|
|
5
|
+
.rulesync/scripts/google-workspace.mjs.
|
|
6
6
|
---
|
|
7
7
|
# google-workspace
|
|
8
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.
|
|
9
|
+
When the user wants a Google sheet, doc, slide, meeting, or mail, run `node .rulesync/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 .rulesync/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
10
|
|
|
11
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
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`.
|
|
13
|
+
Auth: `node .rulesync/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 .rulesync/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`.
|
|
@@ -56,9 +56,9 @@ Facts only. Absolute paths. No transcript paste, no dump, no secrets/tokens.
|
|
|
56
56
|
|
|
57
57
|
Line 1 of the body: `HANDOFF_NAME: <3-6 word name>`, then the body only.
|
|
58
58
|
|
|
59
|
-
Write under `.tmp/grunt/handoffs/` (any filename in that dir). Grok `orchestrate-parent.js` runs
|
|
59
|
+
Write under `.tmp/grunt/handoffs/` (any filename in that dir). Grok `orchestrate-parent.js` runs `.rulesync/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.
|
|
60
60
|
|
|
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`.
|
|
61
|
+
Host without that hook: name the file per **Path** yourself, or pipe the body to `node .rulesync/scripts/persist-handoff.mjs --workspace {repo}` and use its `path`.
|
|
62
62
|
|
|
63
63
|
## Report
|
|
64
64
|
|
|
@@ -4,10 +4,10 @@ description: 'Execute remaining leaves in a .tmp/grunt/plans checklist. Skip [x]
|
|
|
4
4
|
---
|
|
5
5
|
# implement-plan
|
|
6
6
|
|
|
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`.
|
|
7
|
+
You execute the plan in this session. Start only on a plan the user approved, or when the request said "plan and do it". 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`.
|
|
8
8
|
|
|
9
9
|
Arg `{n|path}` picks that file. Empty arg: unique in-progress, else unique ready, else list serials.
|
|
10
10
|
|
|
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`.
|
|
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 .rulesync/scripts/grunt-job.mjs`.
|
|
12
12
|
|
|
13
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.
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
name: jev
|
|
3
3
|
description: >-
|
|
4
4
|
Yes/no or named-option decision on text already saved. Run node
|
|
5
|
-
scripts/jev.mjs --available first. On yes, one decision call. On no, decide
|
|
5
|
+
.rulesync/scripts/jev.mjs --available first. On yes, one decision call. On no, decide
|
|
6
6
|
yourself and do not mention Jev.
|
|
7
7
|
---
|
|
8
8
|
# jev
|
|
9
9
|
|
|
10
10
|
Use this when the source text is already saved and the leftover question is a yes/no or a choice among options the research already named. Spec: `.rulesync/reference/jev.md`.
|
|
11
11
|
|
|
12
|
-
Run `node scripts/jev.mjs --available`. It prints `yes` or `no` and exits 0.
|
|
12
|
+
Run `node .rulesync/scripts/jev.mjs --available`. It prints `yes` or `no` and exits 0.
|
|
13
13
|
|
|
14
14
|
`no`: answer the question yourself. Do not run a decision call. Do not mention Jev, a missing key, or setup.
|
|
15
15
|
|
|
16
|
-
`yes`: read `.rulesync/reference/jev.md`. Write the passage and one questions file under `.tmp/grunt/jev/`. Run `node scripts/jev.mjs --state <state> --questions <questions>` once. Use the printed label and confidence. A low confidence is the result. Do not call again.
|
|
16
|
+
`yes`: read `.rulesync/reference/jev.md`. Write the passage and one questions file under `.tmp/grunt/jev/`. Run `node .rulesync/scripts/jev.mjs --state <state> --questions <questions>` once. Use the printed label and confidence. A low confidence is the result. Do not call again.
|
|
17
17
|
|
|
18
18
|
Open research, code, and grunt-job stay with the session. If the decision call exits non-zero, answer from the sources. Do not invent a label.
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: listen
|
|
3
3
|
description: >-
|
|
4
|
-
Speech-to-text via node scripts/listen.mjs (ffmpeg mic + local whisper.cpp,
|
|
4
|
+
Speech-to-text via node .rulesync/scripts/listen.mjs (ffmpeg mic + local whisper.cpp,
|
|
5
5
|
OpenAI fallback). Input only.
|
|
6
6
|
---
|
|
7
7
|
# listen
|
|
8
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`.
|
|
9
|
+
When the user wants to dictate, transcribe a recording, or toggle a mic, run `node .rulesync/scripts/listen.mjs`. Spec: `.rulesync/reference/listen.md`. Input only (audio → text). Do not speak. Do not use `/speak`.
|
|
10
10
|
|
|
11
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
12
|
|
|
13
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
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`.
|
|
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 .rulesync/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`.
|
|
@@ -18,7 +18,7 @@ Load a handoff and continue in this session. Not a mode. Not `/handoff`. Inverse
|
|
|
18
18
|
|
|
19
19
|
## Resolve
|
|
20
20
|
|
|
21
|
-
Read `.tmp/grunt/handoffs/`. Use `node scripts/grunt-job.mjs --job search|exec` when the listing is fat.
|
|
21
|
+
Read `.tmp/grunt/handoffs/`. Use `node .rulesync/scripts/grunt-job.mjs --job search|exec` when the listing is fat.
|
|
22
22
|
|
|
23
23
|
Order:
|
|
24
24
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: speak
|
|
3
|
-
description: Text-to-speech via node scripts/speak.mjs (ElevenLabs or OpenAI). Output only.
|
|
3
|
+
description: Text-to-speech via node .rulesync/scripts/speak.mjs (ElevenLabs or OpenAI). Output only.
|
|
4
4
|
---
|
|
5
5
|
# speak
|
|
6
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.
|
|
7
|
+
When the user wants spoken audio, run `node .rulesync/scripts/speak.mjs`. Spec: `.rulesync/reference/speak.md`. Output only (text → mp3). Do not record a mic. Do not transcribe.
|
|
8
8
|
|
|
9
9
|
`whoami` · `voices` · `say --text T [--provider elevenlabs|openai] [--voice ID] [--out path] [--play]`.
|
|
10
10
|
|
|
11
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
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`.
|
|
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 .rulesync/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`.
|
|
@@ -33,9 +33,9 @@ TMP_EXT: md
|
|
|
33
33
|
<artifact only>
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
`TMP_EXT` optional. Write any root filename under `.tmp/grunt/` (not `plans|handoffs|implementations|browser|orchestrator-logs`). Grok `orchestrate-parent.js` runs
|
|
36
|
+
`TMP_EXT` optional. Write any root filename under `.tmp/grunt/` (not `plans|handoffs|implementations|browser|orchestrator-logs`). Grok `orchestrate-parent.js` runs `.rulesync/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
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`.
|
|
38
|
+
Host without that hook: name the file per **Path** yourself, or pipe the body to `node .rulesync/scripts/persist-tmp.mjs --workspace {repo}` and use its `path`.
|
|
39
39
|
|
|
40
40
|
Never rewrite an existing dump; new serial. Artifact file content after hook = artifact only (no TMP_* lines no YAML frontmatter).
|
|
41
41
|
|
|
@@ -4,10 +4,12 @@ description: 'Write a local checklist under .tmp/grunt/plans/. Then /implement-p
|
|
|
4
4
|
---
|
|
5
5
|
# write-plan
|
|
6
6
|
|
|
7
|
-
You author the plan. Persist under `.tmp/grunt/plans/` via Write (hook runs
|
|
7
|
+
You author the plan. Persist under `.tmp/grunt/plans/` via Write (hook runs `.rulesync/scripts/persist-plan.mjs`). Format: `.rulesync/reference/plan-format.md`.
|
|
8
8
|
|
|
9
9
|
Empty task → ask for a task and stop.
|
|
10
10
|
|
|
11
11
|
Body starts with `PLAN_NAME: <3-6 word name>`, then Goal, Context, Constraints, Watch-outs, Steps, Verify. All boxes `[ ]`. Tests: new behavior or bug → failing test leaf before impl; other behavior → test leaf right after impl; docs/rename/config/generated → skip. Verify is the end gate.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
The plan is the proposal and caps the result (`.rulesync/reference/scope.md`). Before writing, research until every leaf is defensible; ask any plan-shaping question the user alone can answer, then research again on the answer. Do not default a plan-shaping choice. A minor open choice goes under Constraints as the chosen default plus "confirm".
|
|
14
|
+
|
|
15
|
+
Report: serial N at `.tmp/grunt/plans/{file}`, the goal, the phase list, the top risks, and any assumption to confirm. Do not dump the plan. Stop and ask for approval; on feedback, revise this file and stop again. Run `/implement-plan {n}` in the same turn only when the request said "plan and do it".
|
|
@@ -17,4 +17,4 @@ tools:
|
|
|
17
17
|
permissionMode: bypassPermissions
|
|
18
18
|
effort: medium
|
|
19
19
|
---
|
|
20
|
-
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.
|
|
20
|
+
Follow AGENTS.md. Do the work. Concise complete sentences with natural grammar. Scratch in `.tmp/grunt/`. Browse with `node .rulesync/scripts/browser.mjs`; the rail swaps to Chromium when Lightpanda is blocked. App e2e uses Playwright.
|
package/.claude/settings.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"hooks": [
|
|
16
16
|
{
|
|
17
17
|
"type": "command",
|
|
18
|
-
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/scripts/scrub-spawn-prompt.mjs\"",
|
|
18
|
+
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.rulesync/scripts/scrub-spawn-prompt.mjs\"",
|
|
19
19
|
"timeout": 5
|
|
20
20
|
}
|
|
21
21
|
]
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"hooks": [
|
|
26
26
|
{
|
|
27
27
|
"type": "command",
|
|
28
|
-
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/scripts/gate-fat-tools.mjs\"",
|
|
28
|
+
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.rulesync/scripts/gate-fat-tools.mjs\"",
|
|
29
29
|
"timeout": 5
|
|
30
30
|
}
|
|
31
31
|
]
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"hooks": [
|
|
80
80
|
{
|
|
81
81
|
"type": "command",
|
|
82
|
-
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/scripts/session-map.mjs\"",
|
|
82
|
+
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.rulesync/scripts/session-map.mjs\"",
|
|
83
83
|
"timeout": 5
|
|
84
84
|
}
|
|
85
85
|
]
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: browser
|
|
3
|
-
description: Browse via node scripts/browser.mjs (Lightpanda). App e2e uses Playwright.
|
|
3
|
+
description: Browse via node .rulesync/scripts/browser.mjs (Lightpanda). App e2e uses Playwright.
|
|
4
4
|
---
|
|
5
|
-
Zero-config. `node scripts/browser.mjs <verb>`.
|
|
5
|
+
Zero-config. `node .rulesync/scripts/browser.mjs <verb>`.
|
|
6
6
|
|
|
7
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`.
|
|
8
8
|
|
|
@@ -10,5 +10,5 @@ Verbs: `nav <url>` · `snap` · `click <ref>` · `fill <ref> <text>` · `scroll
|
|
|
10
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.
|
|
11
11
|
- Session/profile: `.tmp/grunt/browser/`. `stop` reaps; second `stop` ok.
|
|
12
12
|
- Windows: Chromium even if Lightpanda exists.
|
|
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).
|
|
13
|
+
- `doctor`/`ensure` → `node .rulesync/scripts/doctor.mjs` or `grunt doctor`. Engine hints: `node .rulesync/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).
|
|
14
14
|
- No env. No MCP. No raw Playwright. Spec: `.rulesync/reference/browser.md`.
|
|
@@ -8,4 +8,4 @@ description: >-
|
|
|
8
8
|
|
|
9
9
|
Custom Apps Script in-repo only. Spec: `.rulesync/reference/clasp.md`.
|
|
10
10
|
|
|
11
|
-
Sheets, Docs, Slides, Calendar, Gmail: `node scripts/google-workspace.mjs` and `.rulesync/reference/google-workspace.md`.
|
|
11
|
+
Sheets, Docs, Slides, Calendar, Gmail: `node .rulesync/scripts/google-workspace.mjs` and `.rulesync/reference/google-workspace.md`.
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
name: google-workspace
|
|
3
3
|
description: >-
|
|
4
4
|
Google Sheets, Docs, Slides, Calendar, Gmail via node
|
|
5
|
-
scripts/google-workspace.mjs.
|
|
5
|
+
.rulesync/scripts/google-workspace.mjs.
|
|
6
6
|
---
|
|
7
7
|
# google-workspace
|
|
8
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.
|
|
9
|
+
When the user wants a Google sheet, doc, slide, meeting, or mail, run `node .rulesync/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 .rulesync/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
10
|
|
|
11
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
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`.
|
|
13
|
+
Auth: `node .rulesync/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 .rulesync/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`.
|
|
@@ -56,9 +56,9 @@ Facts only. Absolute paths. No transcript paste, no dump, no secrets/tokens.
|
|
|
56
56
|
|
|
57
57
|
Line 1 of the body: `HANDOFF_NAME: <3-6 word name>`, then the body only.
|
|
58
58
|
|
|
59
|
-
Write under `.tmp/grunt/handoffs/` (any filename in that dir). Grok `orchestrate-parent.js` runs
|
|
59
|
+
Write under `.tmp/grunt/handoffs/` (any filename in that dir). Grok `orchestrate-parent.js` runs `.rulesync/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.
|
|
60
60
|
|
|
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`.
|
|
61
|
+
Host without that hook: name the file per **Path** yourself, or pipe the body to `node .rulesync/scripts/persist-handoff.mjs --workspace {repo}` and use its `path`.
|
|
62
62
|
|
|
63
63
|
## Report
|
|
64
64
|
|
|
@@ -4,10 +4,10 @@ description: 'Execute remaining leaves in a .tmp/grunt/plans checklist. Skip [x]
|
|
|
4
4
|
---
|
|
5
5
|
# implement-plan
|
|
6
6
|
|
|
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`.
|
|
7
|
+
You execute the plan in this session. Start only on a plan the user approved, or when the request said "plan and do it". 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`.
|
|
8
8
|
|
|
9
9
|
Arg `{n|path}` picks that file. Empty arg: unique in-progress, else unique ready, else list serials.
|
|
10
10
|
|
|
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`.
|
|
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 .rulesync/scripts/grunt-job.mjs`.
|
|
12
12
|
|
|
13
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.
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
name: jev
|
|
3
3
|
description: >-
|
|
4
4
|
Yes/no or named-option decision on text already saved. Run node
|
|
5
|
-
scripts/jev.mjs --available first. On yes, one decision call. On no, decide
|
|
5
|
+
.rulesync/scripts/jev.mjs --available first. On yes, one decision call. On no, decide
|
|
6
6
|
yourself and do not mention Jev.
|
|
7
7
|
---
|
|
8
8
|
# jev
|
|
9
9
|
|
|
10
10
|
Use this when the source text is already saved and the leftover question is a yes/no or a choice among options the research already named. Spec: `.rulesync/reference/jev.md`.
|
|
11
11
|
|
|
12
|
-
Run `node scripts/jev.mjs --available`. It prints `yes` or `no` and exits 0.
|
|
12
|
+
Run `node .rulesync/scripts/jev.mjs --available`. It prints `yes` or `no` and exits 0.
|
|
13
13
|
|
|
14
14
|
`no`: answer the question yourself. Do not run a decision call. Do not mention Jev, a missing key, or setup.
|
|
15
15
|
|
|
16
|
-
`yes`: read `.rulesync/reference/jev.md`. Write the passage and one questions file under `.tmp/grunt/jev/`. Run `node scripts/jev.mjs --state <state> --questions <questions>` once. Use the printed label and confidence. A low confidence is the result. Do not call again.
|
|
16
|
+
`yes`: read `.rulesync/reference/jev.md`. Write the passage and one questions file under `.tmp/grunt/jev/`. Run `node .rulesync/scripts/jev.mjs --state <state> --questions <questions>` once. Use the printed label and confidence. A low confidence is the result. Do not call again.
|
|
17
17
|
|
|
18
18
|
Open research, code, and grunt-job stay with the session. If the decision call exits non-zero, answer from the sources. Do not invent a label.
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: listen
|
|
3
3
|
description: >-
|
|
4
|
-
Speech-to-text via node scripts/listen.mjs (ffmpeg mic + local whisper.cpp,
|
|
4
|
+
Speech-to-text via node .rulesync/scripts/listen.mjs (ffmpeg mic + local whisper.cpp,
|
|
5
5
|
OpenAI fallback). Input only.
|
|
6
6
|
---
|
|
7
7
|
# listen
|
|
8
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`.
|
|
9
|
+
When the user wants to dictate, transcribe a recording, or toggle a mic, run `node .rulesync/scripts/listen.mjs`. Spec: `.rulesync/reference/listen.md`. Input only (audio → text). Do not speak. Do not use `/speak`.
|
|
10
10
|
|
|
11
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
12
|
|
|
13
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
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`.
|
|
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 .rulesync/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`.
|
|
@@ -18,7 +18,7 @@ Load a handoff and continue in this session. Not a mode. Not `/handoff`. Inverse
|
|
|
18
18
|
|
|
19
19
|
## Resolve
|
|
20
20
|
|
|
21
|
-
Read `.tmp/grunt/handoffs/`. Use `node scripts/grunt-job.mjs --job search|exec` when the listing is fat.
|
|
21
|
+
Read `.tmp/grunt/handoffs/`. Use `node .rulesync/scripts/grunt-job.mjs --job search|exec` when the listing is fat.
|
|
22
22
|
|
|
23
23
|
Order:
|
|
24
24
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: speak
|
|
3
|
-
description: Text-to-speech via node scripts/speak.mjs (ElevenLabs or OpenAI). Output only.
|
|
3
|
+
description: Text-to-speech via node .rulesync/scripts/speak.mjs (ElevenLabs or OpenAI). Output only.
|
|
4
4
|
---
|
|
5
5
|
# speak
|
|
6
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.
|
|
7
|
+
When the user wants spoken audio, run `node .rulesync/scripts/speak.mjs`. Spec: `.rulesync/reference/speak.md`. Output only (text → mp3). Do not record a mic. Do not transcribe.
|
|
8
8
|
|
|
9
9
|
`whoami` · `voices` · `say --text T [--provider elevenlabs|openai] [--voice ID] [--out path] [--play]`.
|
|
10
10
|
|
|
11
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
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`.
|
|
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 .rulesync/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`.
|
|
@@ -33,9 +33,9 @@ TMP_EXT: md
|
|
|
33
33
|
<artifact only>
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
`TMP_EXT` optional. Write any root filename under `.tmp/grunt/` (not `plans|handoffs|implementations|browser|orchestrator-logs`). Grok `orchestrate-parent.js` runs
|
|
36
|
+
`TMP_EXT` optional. Write any root filename under `.tmp/grunt/` (not `plans|handoffs|implementations|browser|orchestrator-logs`). Grok `orchestrate-parent.js` runs `.rulesync/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
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`.
|
|
38
|
+
Host without that hook: name the file per **Path** yourself, or pipe the body to `node .rulesync/scripts/persist-tmp.mjs --workspace {repo}` and use its `path`.
|
|
39
39
|
|
|
40
40
|
Never rewrite an existing dump; new serial. Artifact file content after hook = artifact only (no TMP_* lines no YAML frontmatter).
|
|
41
41
|
|
|
@@ -4,10 +4,12 @@ description: 'Write a local checklist under .tmp/grunt/plans/. Then /implement-p
|
|
|
4
4
|
---
|
|
5
5
|
# write-plan
|
|
6
6
|
|
|
7
|
-
You author the plan. Persist under `.tmp/grunt/plans/` via Write (hook runs
|
|
7
|
+
You author the plan. Persist under `.tmp/grunt/plans/` via Write (hook runs `.rulesync/scripts/persist-plan.mjs`). Format: `.rulesync/reference/plan-format.md`.
|
|
8
8
|
|
|
9
9
|
Empty task → ask for a task and stop.
|
|
10
10
|
|
|
11
11
|
Body starts with `PLAN_NAME: <3-6 word name>`, then Goal, Context, Constraints, Watch-outs, Steps, Verify. All boxes `[ ]`. Tests: new behavior or bug → failing test leaf before impl; other behavior → test leaf right after impl; docs/rename/config/generated → skip. Verify is the end gate.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
The plan is the proposal and caps the result (`.rulesync/reference/scope.md`). Before writing, research until every leaf is defensible; ask any plan-shaping question the user alone can answer, then research again on the answer. Do not default a plan-shaping choice. A minor open choice goes under Constraints as the chosen default plus "confirm".
|
|
14
|
+
|
|
15
|
+
Report: serial N at `.tmp/grunt/plans/{file}`, the goal, the phase list, the top risks, and any assumption to confirm. Do not dump the plan. Stop and ask for approval; on feedback, revise this file and stop again. Run `/implement-plan {n}` in the same turn only when the request said "plan and do it".
|
|
@@ -4,4 +4,4 @@ model = "gpt-5.4"
|
|
|
4
4
|
model_reasoning_effort = "medium"
|
|
5
5
|
sandbox_mode = "danger-full-access"
|
|
6
6
|
approval_policy = "never"
|
|
7
|
-
developer_instructions = "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."
|
|
7
|
+
developer_instructions = "Follow AGENTS.md. Do the work. Concise complete sentences with natural grammar. Scratch in `.tmp/grunt/`. Browse with `node .rulesync/scripts/browser.mjs`; the rail swaps to Chromium when Lightpanda is blocked. App e2e uses Playwright."
|
package/.codex/hooks.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"hooks": [
|
|
7
7
|
{
|
|
8
8
|
"type": "command",
|
|
9
|
-
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/scripts/scrub-spawn-prompt.mjs\"",
|
|
9
|
+
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.rulesync/scripts/scrub-spawn-prompt.mjs\"",
|
|
10
10
|
"timeout": 5
|
|
11
11
|
}
|
|
12
12
|
]
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"hooks": [
|
|
17
17
|
{
|
|
18
18
|
"type": "command",
|
|
19
|
-
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/scripts/gate-fat-tools.mjs\"",
|
|
19
|
+
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.rulesync/scripts/gate-fat-tools.mjs\"",
|
|
20
20
|
"timeout": 5
|
|
21
21
|
}
|
|
22
22
|
]
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"hooks": [
|
|
71
71
|
{
|
|
72
72
|
"type": "command",
|
|
73
|
-
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/scripts/session-map.mjs\"",
|
|
73
|
+
"command": "node \"${GROK_WORKSPACE_ROOT:-${CLAUDE_PROJECT_DIR:-.}}/.rulesync/scripts/session-map.mjs\"",
|
|
74
74
|
"timeout": 5
|
|
75
75
|
}
|
|
76
76
|
]
|
|
@@ -7,4 +7,4 @@ agents_md: false
|
|
|
7
7
|
mcpInheritance: none
|
|
8
8
|
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
|
|
9
9
|
---
|
|
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.
|
|
10
|
+
Follow AGENTS.md. Do the work. Concise complete sentences with natural grammar. Scratch in `.tmp/grunt/`. Browse with `node .rulesync/scripts/browser.mjs`; the rail swaps to Chromium when Lightpanda is blocked. App e2e uses Playwright.
|
|
@@ -9,20 +9,20 @@ import {
|
|
|
9
9
|
MAX_PROMPT_CHARS,
|
|
10
10
|
rewriteSpawnToolInput,
|
|
11
11
|
spawnCapReason,
|
|
12
|
-
} from "
|
|
12
|
+
} from "../../.rulesync/scripts/scrub-spawn-prompt.mjs";
|
|
13
13
|
import {
|
|
14
14
|
denyResponse,
|
|
15
15
|
fatHookOutput,
|
|
16
16
|
processFatTools,
|
|
17
17
|
rewriteGruntScratchPath,
|
|
18
|
-
} from "
|
|
19
|
-
import { persistPlan } from "
|
|
20
|
-
import { persistHandoff } from "
|
|
21
|
-
import { persistImplementation, isFullImplementationBody, validateImplementation } from "
|
|
22
|
-
import { persistTmp } from "
|
|
23
|
-
import { parseNeed } from "
|
|
24
|
-
import { resolveJobCwd, runJob } from "
|
|
25
|
-
import { otherLines, recordHook } from "
|
|
18
|
+
} from "../../.rulesync/scripts/gate-fat-tools.mjs";
|
|
19
|
+
import { persistPlan } from "../../.rulesync/scripts/persist-plan.mjs";
|
|
20
|
+
import { persistHandoff } from "../../.rulesync/scripts/persist-handoff.mjs";
|
|
21
|
+
import { persistImplementation, isFullImplementationBody, validateImplementation } from "../../.rulesync/scripts/persist-implementation.mjs";
|
|
22
|
+
import { persistTmp } from "../../.rulesync/scripts/persist-tmp.mjs";
|
|
23
|
+
import { parseNeed } from "../../.rulesync/scripts/parse-need.mjs";
|
|
24
|
+
import { resolveJobCwd, runJob } from "../../.rulesync/scripts/grunt-job.mjs";
|
|
25
|
+
import { otherLines, recordHook } from "../../.rulesync/scripts/board.mjs";
|
|
26
26
|
|
|
27
27
|
export const ORCHESTRATOR_LOGS_DIR = ".tmp/grunt/orchestrator-logs";
|
|
28
28
|
/** One-release dual-read; drop next release. */
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: browser
|
|
3
|
-
description: Browse via node scripts/browser.mjs (Lightpanda). App e2e uses Playwright.
|
|
3
|
+
description: Browse via node .rulesync/scripts/browser.mjs (Lightpanda). App e2e uses Playwright.
|
|
4
4
|
---
|
|
5
|
-
Zero-config. `node scripts/browser.mjs <verb>`.
|
|
5
|
+
Zero-config. `node .rulesync/scripts/browser.mjs <verb>`.
|
|
6
6
|
|
|
7
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`.
|
|
8
8
|
|
|
@@ -10,5 +10,5 @@ Verbs: `nav <url>` · `snap` · `click <ref>` · `fill <ref> <text>` · `scroll
|
|
|
10
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.
|
|
11
11
|
- Session/profile: `.tmp/grunt/browser/`. `stop` reaps; second `stop` ok.
|
|
12
12
|
- Windows: Chromium even if Lightpanda exists.
|
|
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).
|
|
13
|
+
- `doctor`/`ensure` → `node .rulesync/scripts/doctor.mjs` or `grunt doctor`. Engine hints: `node .rulesync/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).
|
|
14
14
|
- No env. No MCP. No raw Playwright. Spec: `.rulesync/reference/browser.md`.
|
|
@@ -8,4 +8,4 @@ description: >-
|
|
|
8
8
|
|
|
9
9
|
Custom Apps Script in-repo only. Spec: `.rulesync/reference/clasp.md`.
|
|
10
10
|
|
|
11
|
-
Sheets, Docs, Slides, Calendar, Gmail: `node scripts/google-workspace.mjs` and `.rulesync/reference/google-workspace.md`.
|
|
11
|
+
Sheets, Docs, Slides, Calendar, Gmail: `node .rulesync/scripts/google-workspace.mjs` and `.rulesync/reference/google-workspace.md`.
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
name: google-workspace
|
|
3
3
|
description: >-
|
|
4
4
|
Google Sheets, Docs, Slides, Calendar, Gmail via node
|
|
5
|
-
scripts/google-workspace.mjs.
|
|
5
|
+
.rulesync/scripts/google-workspace.mjs.
|
|
6
6
|
---
|
|
7
7
|
# google-workspace
|
|
8
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.
|
|
9
|
+
When the user wants a Google sheet, doc, slide, meeting, or mail, run `node .rulesync/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 .rulesync/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
10
|
|
|
11
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
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`.
|
|
13
|
+
Auth: `node .rulesync/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 .rulesync/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`.
|
|
@@ -56,9 +56,9 @@ Facts only. Absolute paths. No transcript paste, no dump, no secrets/tokens.
|
|
|
56
56
|
|
|
57
57
|
Line 1 of the body: `HANDOFF_NAME: <3-6 word name>`, then the body only.
|
|
58
58
|
|
|
59
|
-
Write under `.tmp/grunt/handoffs/` (any filename in that dir). Grok `orchestrate-parent.js` runs
|
|
59
|
+
Write under `.tmp/grunt/handoffs/` (any filename in that dir). Grok `orchestrate-parent.js` runs `.rulesync/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.
|
|
60
60
|
|
|
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`.
|
|
61
|
+
Host without that hook: name the file per **Path** yourself, or pipe the body to `node .rulesync/scripts/persist-handoff.mjs --workspace {repo}` and use its `path`.
|
|
62
62
|
|
|
63
63
|
## Report
|
|
64
64
|
|
|
@@ -4,10 +4,10 @@ description: 'Execute remaining leaves in a .tmp/grunt/plans checklist. Skip [x]
|
|
|
4
4
|
---
|
|
5
5
|
# implement-plan
|
|
6
6
|
|
|
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`.
|
|
7
|
+
You execute the plan in this session. Start only on a plan the user approved, or when the request said "plan and do it". 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`.
|
|
8
8
|
|
|
9
9
|
Arg `{n|path}` picks that file. Empty arg: unique in-progress, else unique ready, else list serials.
|
|
10
10
|
|
|
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`.
|
|
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 .rulesync/scripts/grunt-job.mjs`.
|
|
12
12
|
|
|
13
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.
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
name: jev
|
|
3
3
|
description: >-
|
|
4
4
|
Yes/no or named-option decision on text already saved. Run node
|
|
5
|
-
scripts/jev.mjs --available first. On yes, one decision call. On no, decide
|
|
5
|
+
.rulesync/scripts/jev.mjs --available first. On yes, one decision call. On no, decide
|
|
6
6
|
yourself and do not mention Jev.
|
|
7
7
|
---
|
|
8
8
|
# jev
|
|
9
9
|
|
|
10
10
|
Use this when the source text is already saved and the leftover question is a yes/no or a choice among options the research already named. Spec: `.rulesync/reference/jev.md`.
|
|
11
11
|
|
|
12
|
-
Run `node scripts/jev.mjs --available`. It prints `yes` or `no` and exits 0.
|
|
12
|
+
Run `node .rulesync/scripts/jev.mjs --available`. It prints `yes` or `no` and exits 0.
|
|
13
13
|
|
|
14
14
|
`no`: answer the question yourself. Do not run a decision call. Do not mention Jev, a missing key, or setup.
|
|
15
15
|
|
|
16
|
-
`yes`: read `.rulesync/reference/jev.md`. Write the passage and one questions file under `.tmp/grunt/jev/`. Run `node scripts/jev.mjs --state <state> --questions <questions>` once. Use the printed label and confidence. A low confidence is the result. Do not call again.
|
|
16
|
+
`yes`: read `.rulesync/reference/jev.md`. Write the passage and one questions file under `.tmp/grunt/jev/`. Run `node .rulesync/scripts/jev.mjs --state <state> --questions <questions>` once. Use the printed label and confidence. A low confidence is the result. Do not call again.
|
|
17
17
|
|
|
18
18
|
Open research, code, and grunt-job stay with the session. If the decision call exits non-zero, answer from the sources. Do not invent a label.
|