grounder 0.2.0 → 0.3.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/README.md +81 -32
- package/dist/agents/claude.d.ts +1 -0
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +38 -13
- package/dist/agents/claude.js.map +1 -1
- package/dist/agents/cursor.d.ts +1 -0
- package/dist/agents/cursor.d.ts.map +1 -1
- package/dist/agents/cursor.js +38 -13
- package/dist/agents/cursor.js.map +1 -1
- package/dist/agents/hook-runtime.d.ts +65 -21
- package/dist/agents/hook-runtime.d.ts.map +1 -1
- package/dist/agents/hook-runtime.js +172 -31
- package/dist/agents/hook-runtime.js.map +1 -1
- package/dist/agents/index.d.ts +18 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +27 -4
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/install-command.d.ts +37 -0
- package/dist/agents/install-command.d.ts.map +1 -0
- package/dist/agents/install-command.js +65 -0
- package/dist/agents/install-command.js.map +1 -0
- package/dist/agents/types.d.ts +19 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/cli.js +58 -60
- package/dist/cli.js.map +1 -1
- package/dist/commands/apply-agent-installs.d.ts +34 -0
- package/dist/commands/apply-agent-installs.d.ts.map +1 -0
- package/dist/commands/apply-agent-installs.js +137 -0
- package/dist/commands/apply-agent-installs.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +202 -51
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/handoff/list.d.ts.map +1 -1
- package/dist/commands/handoff/list.js +5 -0
- package/dist/commands/handoff/list.js.map +1 -1
- package/dist/commands/handoff/peek.d.ts +5 -2
- package/dist/commands/handoff/peek.d.ts.map +1 -1
- package/dist/commands/handoff/peek.js +47 -6
- package/dist/commands/handoff/peek.js.map +1 -1
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +5 -0
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/migrate.d.ts +23 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +104 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +5 -0
- package/dist/commands/note.js.map +1 -1
- package/dist/commands/package-version-notice.d.ts +18 -0
- package/dist/commands/package-version-notice.d.ts.map +1 -0
- package/dist/commands/package-version-notice.js +39 -0
- package/dist/commands/package-version-notice.js.map +1 -0
- package/dist/commands/path/logs.d.ts +1 -1
- package/dist/commands/path/logs.d.ts.map +1 -1
- package/dist/commands/path/logs.js +6 -1
- package/dist/commands/path/logs.js.map +1 -1
- package/dist/commands/path/notes.d.ts +1 -1
- package/dist/commands/path/notes.d.ts.map +1 -1
- package/dist/commands/path/notes.js +6 -1
- package/dist/commands/path/notes.js.map +1 -1
- package/dist/commands/path/plans.d.ts +7 -0
- package/dist/commands/path/plans.d.ts.map +1 -0
- package/dist/commands/path/plans.js +22 -0
- package/dist/commands/path/plans.js.map +1 -0
- package/dist/commands/plan/list.d.ts +23 -0
- package/dist/commands/plan/list.d.ts.map +1 -0
- package/dist/commands/plan/list.js +69 -0
- package/dist/commands/plan/list.js.map +1 -0
- package/dist/commands/plan.d.ts +34 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +121 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/repo/init.d.ts.map +1 -1
- package/dist/commands/repo/init.js +12 -1
- package/dist/commands/repo/init.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +52 -9
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/upgrade-banner.d.ts +9 -0
- package/dist/commands/upgrade-banner.d.ts.map +1 -0
- package/dist/commands/upgrade-banner.js +27 -0
- package/dist/commands/upgrade-banner.js.map +1 -0
- package/dist/commands/vault/init.d.ts.map +1 -1
- package/dist/commands/vault/init.js +18 -29
- package/dist/commands/vault/init.js.map +1 -1
- package/dist/connector/repo.d.ts +2 -0
- package/dist/connector/repo.d.ts.map +1 -1
- package/dist/connector/repo.js +12 -1
- package/dist/connector/repo.js.map +1 -1
- package/dist/connector/state.d.ts +95 -0
- package/dist/connector/state.d.ts.map +1 -0
- package/dist/connector/state.js +189 -0
- package/dist/connector/state.js.map +1 -0
- package/dist/connector/unsupported-schema.d.ts +9 -0
- package/dist/connector/unsupported-schema.d.ts.map +1 -0
- package/dist/connector/unsupported-schema.js +14 -0
- package/dist/connector/unsupported-schema.js.map +1 -0
- package/dist/connector/vault.d.ts +2 -0
- package/dist/connector/vault.d.ts.map +1 -1
- package/dist/connector/vault.js +6 -1
- package/dist/connector/vault.js.map +1 -1
- package/dist/help.d.ts +45 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +355 -0
- package/dist/help.js.map +1 -0
- package/dist/util/fs.d.ts +6 -0
- package/dist/util/fs.d.ts.map +1 -1
- package/dist/util/fs.js +15 -1
- package/dist/util/fs.js.map +1 -1
- package/dist/util/hash.d.ts +3 -0
- package/dist/util/hash.d.ts.map +1 -0
- package/dist/util/hash.js +6 -0
- package/dist/util/hash.js.map +1 -0
- package/dist/util/path.d.ts +10 -0
- package/dist/util/path.d.ts.map +1 -1
- package/dist/util/path.js +31 -0
- package/dist/util/path.js.map +1 -1
- package/dist/util/plan-name.d.ts +10 -0
- package/dist/util/plan-name.d.ts.map +1 -0
- package/dist/util/plan-name.js +18 -0
- package/dist/util/plan-name.js.map +1 -0
- package/dist/util/semver.d.ts +10 -0
- package/dist/util/semver.d.ts.map +1 -0
- package/dist/util/semver.js +40 -0
- package/dist/util/semver.js.map +1 -0
- package/dist/vault/layout.d.ts +2 -0
- package/dist/vault/layout.d.ts.map +1 -1
- package/dist/vault/layout.js +4 -0
- package/dist/vault/layout.js.map +1 -1
- package/dist/vault/list-plans.d.ts +11 -0
- package/dist/vault/list-plans.d.ts.map +1 -0
- package/dist/vault/list-plans.js +40 -0
- package/dist/vault/list-plans.js.map +1 -0
- package/dist/vault/write-plan.d.ts +28 -0
- package/dist/vault/write-plan.d.ts.map +1 -0
- package/dist/vault/write-plan.js +61 -0
- package/dist/vault/write-plan.js.map +1 -0
- package/package.json +1 -1
- package/templates/agents/claude/commands/grounder-note.md +1 -1
- package/templates/agents/claude/commands/grounder-plan.md +65 -0
- package/templates/agents/claude/commands/grounder-task-handoff.md +3 -3
- package/templates/agents/claude/commands/grounder-task.md +2 -2
- package/templates/agents/cursor/commands/grounder-note.md +1 -1
- package/templates/agents/cursor/commands/grounder-plan.md +65 -0
- package/templates/agents/cursor/commands/grounder-task-handoff.md +3 -3
- package/templates/agents/cursor/commands/grounder-task.md +2 -2
- package/templates/vault/plan.md +16 -0
package/README.md
CHANGED
|
@@ -3,16 +3,17 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/grounder)
|
|
4
4
|
[](../../LICENSE)
|
|
5
5
|
|
|
6
|
-
AI coding agents forget everything between sessions. Grounder gives them persistent memory in a personal Obsidian vault — notes and
|
|
6
|
+
AI coding agents forget everything between sessions. Grounder gives them persistent memory in a personal Obsidian vault — notes, handoffs, and plans live outside the repo, under your control, and never get committed.
|
|
7
7
|
|
|
8
8
|
- **Private by default** — vault notes live outside the project tree; only a small `projectId` marker is safe to commit
|
|
9
|
-
- **Built for agents** — installs `/grounder-note`, `/grounder-task`, `/grounder-task-handoff` slash commands in Cursor and Claude Code
|
|
9
|
+
- **Built for agents** — installs `/grounder-note`, `/grounder-task`, `/grounder-task-handoff`, `/grounder-plan` slash commands in Cursor and Claude Code
|
|
10
10
|
- **Structured handoffs** — end a session with a Done/Next/Blockers/Decisions checkpoint; resume next time by hydrating from it
|
|
11
|
-
- **
|
|
11
|
+
- **Named plans** — living docs under `plans/` you update in place (`--force` to overwrite; unlike dated notes/handoffs)
|
|
12
|
+
- **Zero per-project install** — slash commands run through a small per-machine runtime that `vault init` keeps current; nothing to add to the repo besides the marker file
|
|
12
13
|
|
|
13
14
|
**Requirements:** Node.js 18+ and an Obsidian vault on disk. Git is optional but used when present (project id detection and link lookup bounds).
|
|
14
15
|
|
|
15
|
-
**Contents:** [Install](#install) · [Quickstart](#quickstart) · [Setup overview](#setup-overview) · [Commands](#commands) · [Configuration](#configuration) · [Agents](#agents) · [Session-start hooks](#session-start-hooks) · [Troubleshooting](#troubleshooting)
|
|
16
|
+
**Contents:** [Install](#install) · [Upgrading](#upgrading) · [Quickstart](#quickstart) · [Setup overview](#setup-overview) · [Commands](#commands) · [Configuration](#configuration) · [Agents](#agents) · [Session-start hooks](#session-start-hooks) · [Troubleshooting](#troubleshooting)
|
|
16
17
|
|
|
17
18
|
## Install
|
|
18
19
|
|
|
@@ -26,7 +27,17 @@ Or run without installing:
|
|
|
26
27
|
npx grounder --help
|
|
27
28
|
```
|
|
28
29
|
|
|
29
|
-
`grounder -h` prints the full reference; `grounder -v` prints the installed version.
|
|
30
|
+
`grounder -h` prints a short synopsis; `grounder --help` (or `grounder help`) prints the full reference; `grounder -v` prints the installed version.
|
|
31
|
+
|
|
32
|
+
## Upgrading
|
|
33
|
+
|
|
34
|
+
After upgrading the package, refresh agent installs:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
grounder migrate
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Run `grounder doctor` if you’re unsure — it hints when plain `migrate` is enough vs `migrate --force` (needed **once** when upgrading from Grounder before 0.3, or when command files were edited locally). Most grounder commands and session-start teasers will also tell you when a migrate is due. Flag details: [Migrate flags](#migrate-flags).
|
|
30
41
|
|
|
31
42
|
## Quickstart
|
|
32
43
|
|
|
@@ -37,7 +48,7 @@ npx grounder --help
|
|
|
37
48
|
# --hooks adds an optional one-line session-start reminder (see Session-start hooks)
|
|
38
49
|
grounder vault init <path-to-your-vault> --hooks
|
|
39
50
|
|
|
40
|
-
# Once per project folder — link project id to vault notes/ + logs/
|
|
51
|
+
# Once per project folder — link project id to vault notes/ + logs/ + plans/
|
|
41
52
|
cd your-project
|
|
42
53
|
grounder init
|
|
43
54
|
```
|
|
@@ -66,13 +77,17 @@ Both commands preview what they'll write and ask to confirm; add `--yes` to skip
|
|
|
66
77
|
No agent, or want to write by hand? The same actions are plain CLI commands:
|
|
67
78
|
|
|
68
79
|
```bash
|
|
69
|
-
grounder note "Investigate auth middleware"
|
|
70
|
-
grounder handoff
|
|
71
|
-
grounder handoff list
|
|
80
|
+
grounder note "Investigate auth middleware" # ad-hoc note
|
|
81
|
+
grounder handoff $'# Handoff: ...\n\n## Next\n1. ...' # session checkpoint
|
|
82
|
+
grounder handoff list # newest handoffs, for manual hydrate
|
|
83
|
+
grounder plan $'# Goal\n\nShip it' --title phase-1 # named living plan
|
|
72
84
|
```
|
|
73
85
|
|
|
74
86
|
Notes land in `<vault>/10-Projects/{projectId}/notes/`.
|
|
75
|
-
Handoffs land in `<vault>/10-Projects/{projectId}/logs/` (one file per close; newest *usable* file wins — an empty or unreadable newest file falls back to the next one).
|
|
87
|
+
Handoffs land in `<vault>/10-Projects/{projectId}/logs/` (one file per close; newest *usable* file wins — an empty or unreadable newest file falls back to the next one).
|
|
88
|
+
Plans land in `<vault>/10-Projects/{projectId}/plans/` (one file per `--title`; overwrite only with `--force`).
|
|
89
|
+
|
|
90
|
+
Unlike `note` (one-off) and `handoff` (per-session checkpoint), `plan` is for anything spanning multiple sessions — write it once with the goal + steps, then re-run with `--force` as the work progresses to keep one file current instead of scattering updates across handoffs.
|
|
76
91
|
|
|
77
92
|
Inspect or debug setup any time with `grounder status` / `grounder doctor` — see [Troubleshooting](#troubleshooting).
|
|
78
93
|
|
|
@@ -82,19 +97,22 @@ Inspect or debug setup any time with `grounder status` / `grounder doctor` — s
|
|
|
82
97
|
(optional teaser) → /grounder-task → work → /grounder-task-handoff → next session
|
|
83
98
|
```
|
|
84
99
|
|
|
85
|
-
| Slash command | CLI | Role |
|
|
100
|
+
| Slash command | Equivalent CLI | Role |
|
|
86
101
|
| --- | --- | --- |
|
|
87
102
|
| `/grounder-note` | `grounder note` | Ad-hoc vault note |
|
|
88
103
|
| `/grounder-task-handoff` | `grounder handoff` | Write session checkpoint to `logs/` |
|
|
89
104
|
| `/grounder-task` | `grounder handoff list --head` + read it | Read-only hydrate from newest usable handoff + `AGENTS.md` |
|
|
105
|
+
| `/grounder-plan` | `grounder plan` | Named living plan under `plans/` |
|
|
106
|
+
|
|
107
|
+
The "Equivalent CLI" column is what you'd type by hand — under the hood, slash commands invoke a small runtime `vault init` maintains at `~/.grounder/runtime` (see [Agents](#agents)), not whatever `grounder` binary happens to be on your `PATH`.
|
|
90
108
|
|
|
91
109
|
With `--hooks` on `vault init`, a new Cursor/Claude session may also print a one-line teaser when a handoff exists — never the full body. See [Session-start hooks](#session-start-hooks).
|
|
92
110
|
|
|
93
111
|
## Setup overview
|
|
94
112
|
|
|
95
113
|
- **`grounder vault init <path>`** (once per machine) writes `~/.grounder/config.json`, creates `<vault>/10-Projects/`, and installs slash commands for detected agents (Cursor → `~/.cursor/commands/`, Claude Code → `~/.claude/commands/`; override with `--agent=<id>`).
|
|
96
|
-
- **`grounder init`** (once per project folder) writes `.grounder.json` (`projectId` — safe to commit) and creates `<vault>/10-Projects/{projectId}/notes
|
|
97
|
-
- **Daily use** — notes, handoffs, and recall via CLI or slash commands; no further install.
|
|
114
|
+
- **`grounder init`** (once per project folder) writes `.grounder.json` (`projectId` — safe to commit) and creates `<vault>/10-Projects/{projectId}/notes/`, `logs/`, and `plans/`.
|
|
115
|
+
- **Daily use** — notes, handoffs, plans, and recall via CLI or slash commands; no further install.
|
|
98
116
|
|
|
99
117
|
Nothing is written into the repo except the small `.grounder.json` marker. Agent artifacts stay under the user’s home directory; vault notes stay outside the project tree.
|
|
100
118
|
|
|
@@ -108,10 +126,14 @@ grounder handoff <text> Write a session handoff to vault logs/
|
|
|
108
126
|
grounder handoff list Print recent handoff paths (newest first)
|
|
109
127
|
grounder handoff list --head Print only the newest usable handoff path
|
|
110
128
|
grounder handoff peek One-line latest-handoff teaser (used by session hooks)
|
|
129
|
+
grounder plan <text> Write/update a named plan under vault plans/
|
|
130
|
+
grounder plan list Print recent plan paths (newest first)
|
|
111
131
|
grounder path notes Print resolved notes directory
|
|
112
132
|
grounder path logs Print resolved logs directory
|
|
133
|
+
grounder path plans Print resolved plans directory
|
|
113
134
|
grounder status Snapshot of machine + project link + resolved paths
|
|
114
135
|
grounder doctor Health checks with fix hints
|
|
136
|
+
grounder migrate Refresh agent install after upgrading grounder
|
|
115
137
|
```
|
|
116
138
|
|
|
117
139
|
### Init flags
|
|
@@ -119,20 +141,41 @@ grounder doctor Health checks with fix hints
|
|
|
119
141
|
| Flag | Commands | Description |
|
|
120
142
|
| --- | --- | --- |
|
|
121
143
|
| `--yes` | `vault init`, `init` | Skip confirmation prompts |
|
|
122
|
-
| `--force` | `vault init`, `init` | Overwrite existing generated files |
|
|
144
|
+
| `--force` | `vault init`, `init`, `migrate` | Overwrite existing generated / locally-modified files |
|
|
123
145
|
| `--id <id>` | `init` | Override detected project id |
|
|
124
146
|
| `--vault <path>` | `init` | Override home vault root for this run |
|
|
125
|
-
| `--agent <id>` | `vault init` | Install for a specific agent (repeatable; default: auto-detect). Supported: `cursor`, `claude` |
|
|
126
|
-
| `--hooks` | `vault init` | Also install session-start teaser hooks (opt-in; see [Session-start hooks](#session-start-hooks)) |
|
|
147
|
+
| `--agent <id>` | `vault init`, `migrate` | Install for a specific agent (repeatable; default: auto-detect). Supported: `cursor`, `claude` |
|
|
148
|
+
| `--hooks` | `vault init`, `migrate` | Also install session-start teaser hooks (opt-in; see [Session-start hooks](#session-start-hooks)) |
|
|
149
|
+
|
|
150
|
+
### Migrate flags
|
|
151
|
+
|
|
152
|
+
| Flag | Description |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| `--force` | Overwrite slash command files you edited locally; also needed **once** when upgrading from Grounder before 0.3 |
|
|
155
|
+
| `--dry-run` | Preview without writing |
|
|
156
|
+
| `--agent <id>` | Limit to a specific agent (repeatable) |
|
|
157
|
+
| `--hooks` | Install hooks even if they were never installed before |
|
|
158
|
+
|
|
159
|
+
See [Upgrading](#upgrading) for the usual post-package-upgrade flow. Untouched command files update automatically; locally edited ones (and pre-0.3 installs with no ledger) are skipped unless you pass `--force`.
|
|
127
160
|
|
|
128
161
|
### Note / handoff flags
|
|
129
162
|
|
|
130
163
|
| Flag | Commands | Description |
|
|
131
164
|
| --- | --- | --- |
|
|
132
165
|
| `--title <slug>` | `note`, `handoff` | Filename slug (default: slugified text / first line) |
|
|
133
|
-
| `--limit <n>` | `handoff list` | Max paths to print (default: 5) |
|
|
166
|
+
| `--limit <n>` | `handoff list`, `plan list` | Max paths to print (default: 5) |
|
|
134
167
|
| `--head` | `handoff list` | Print only the newest *usable* handoff path — skips empty/unreadable files, same pick as `handoff peek` |
|
|
135
168
|
|
|
169
|
+
### Plan flags
|
|
170
|
+
|
|
171
|
+
| Flag | Commands | Description |
|
|
172
|
+
| --- | --- | --- |
|
|
173
|
+
| `--title <name>` | `plan` | Filename stem when creating/updating by name (trailing `.md` ok; sanitized, max 80 chars; no auto-slug). Mutually exclusive with `--path`. |
|
|
174
|
+
| `--path <file>` | `plan` | Update an existing plan by path (must resolve under this project's `plans/`; no title sanitization; always overwrites). Mutually exclusive with `--title`. |
|
|
175
|
+
| `--force` | `plan` | With `--title`: overwrite an existing plan (preserves original `created`, sets `updated`). Not used with `--path`. |
|
|
176
|
+
|
|
177
|
+
Unlike `note` / `handoff` (always a new dated file), `plan` is living: create or collide by `--title` (use `--force` to overwrite), or update an existing file in place with `--path`.
|
|
178
|
+
|
|
136
179
|
### Doctor flags
|
|
137
180
|
|
|
138
181
|
| Flag | Description |
|
|
@@ -145,7 +188,7 @@ Run `grounder --help` for the full reference.
|
|
|
145
188
|
|
|
146
189
|
| Command | Job | When to use |
|
|
147
190
|
| --- | --- | --- |
|
|
148
|
-
| `grounder status` | Snapshot of Machine (home config + vault path) and Project (link, id, notes/logs, git) | “Am I wired?” — see paths and link state |
|
|
191
|
+
| `grounder status` | Snapshot of Machine (home config + vault path) and Project (link, id, notes/logs/plans, git) | “Am I wired?” — see paths and link state |
|
|
149
192
|
| `grounder doctor` | Health checklist (`ok` / `fail` / `warn`) with fix hints; exit `1` on any fail | “Why isn’t memory working?” — verify setup |
|
|
150
193
|
|
|
151
194
|
Both are read-only. `status` exits `0` even when unlinked; `doctor` fails when checks fail. Use `doctor --global` to check the machine without a project link.
|
|
@@ -168,7 +211,7 @@ Written by `grounder vault init`. Holds the vault path for this machine only.
|
|
|
168
211
|
|
|
169
212
|
Written by `grounder init` in the **current working directory**. Project id detection (when `--id` is omitted): `package.json` name in that folder → git `origin` remote (if inside a git repo) → folder basename.
|
|
170
213
|
|
|
171
|
-
`grounder note`, `grounder handoff`, and `grounder path *` walk up from the current directory to find the nearest `.grounder.json`, stopping at the git root when one exists (or at the filesystem root otherwise).
|
|
214
|
+
`grounder note`, `grounder handoff`, `grounder plan`, and `grounder path *` walk up from the current directory to find the nearest `.grounder.json`, stopping at the git root when one exists (or at the filesystem root otherwise).
|
|
172
215
|
|
|
173
216
|
**Environment variables**
|
|
174
217
|
|
|
@@ -183,8 +226,8 @@ The vault layout is agent-agnostic. `grounder vault init` installs thin glue art
|
|
|
183
226
|
|
|
184
227
|
| Agent | Detection | Artifacts |
|
|
185
228
|
| --- | --- | --- |
|
|
186
|
-
| Cursor | `~/.cursor` exists | `~/.cursor/commands/grounder-{note,task,task-handoff}.md` |
|
|
187
|
-
| Claude Code | `~/.claude` exists | `~/.claude/commands/grounder-{note,task,task-handoff}.md` |
|
|
229
|
+
| Cursor | `~/.cursor` exists | `~/.cursor/commands/grounder-{note,task,task-handoff,plan}.md` |
|
|
230
|
+
| Claude Code | `~/.claude` exists | `~/.claude/commands/grounder-{note,task,task-handoff,plan}.md` |
|
|
188
231
|
|
|
189
232
|
No `--agent` flag: auto-detect installed agents. Explicit install:
|
|
190
233
|
|
|
@@ -192,7 +235,9 @@ No `--agent` flag: auto-detect installed agents. Explicit install:
|
|
|
192
235
|
grounder vault init <path-to-your-vault> --agent=cursor --agent=claude
|
|
193
236
|
```
|
|
194
237
|
|
|
195
|
-
Slash commands
|
|
238
|
+
Slash commands invoke `~/.grounder/runtime/dist/cli.js` directly (not `npx`) — see [Session-start hooks](#session-start-hooks) for how that runtime stays current. Command files that still match what Grounder last wrote are refreshed by `grounder migrate` without `--force`. Locally edited files are left alone unless you pass `--force`.
|
|
239
|
+
|
|
240
|
+
After upgrading the package, see [Upgrading](#upgrading). `vault init --force` still works for scripts that already use it; it shares the same install path as `migrate`.
|
|
196
241
|
|
|
197
242
|
Templates live under `templates/agents/{id}/`. Adding another agent means one adapter file + one template directory — `vault init` stays agent-blind.
|
|
198
243
|
|
|
@@ -216,27 +261,31 @@ What hooks do **not** do:
|
|
|
216
261
|
- They never block or delay a session from starting
|
|
217
262
|
- Unlinked folders and projects with no handoffs print nothing (exit 0, silent)
|
|
218
263
|
|
|
219
|
-
`doctor` reports a `warn` (never a `fail`) when a detected agent has no Grounder hook installed, and when
|
|
264
|
+
`doctor` reports a `warn` (never a `fail`) when a detected agent has no Grounder hook installed, and when `~/.grounder/runtime` is stale or missing.
|
|
265
|
+
|
|
266
|
+
Hooks *and* slash commands both run `~/.grounder/runtime/dist/cli.js` directly (never `npx`) — `vault init` materializes it, regardless of whether `--hooks` is passed:
|
|
220
267
|
|
|
221
|
-
|
|
268
|
+
- **Real install** (`npm i -g grounder`, `pnpm add -g grounder`, or a monorepo checkout) → symlinked. Upgrading overwrites the same path in place, so both stay current with **no re-run needed**.
|
|
269
|
+
- **Bare `npx grounder vault init …`** (nothing installed) → copied, since each `npx` invocation resolves to a disposable, version-pinned cache dir that can't be symlinked durably. Re-run `grounder migrate` (or `vault init`) after upgrading grounder to refresh (no `--force` needed).
|
|
222
270
|
|
|
223
|
-
|
|
224
|
-
- **Bare `npx grounder vault init --hooks`** (nothing installed) → copied, since each `npx` invocation resolves to a disposable, version-pinned cache dir that can't be symlinked durably. Re-run the same command after upgrading grounder to refresh (no `--force` needed).
|
|
271
|
+
If you want the runtime to stay current with zero maintenance, install grounder rather than using bare `npx` for this step.
|
|
225
272
|
|
|
226
|
-
|
|
273
|
+
That refresh only touches the shared runtime, not installed command files — see [Upgrading](#upgrading) if `doctor` flags stale command schemas.
|
|
227
274
|
|
|
228
275
|
## Troubleshooting
|
|
229
276
|
|
|
230
277
|
| Symptom | Try |
|
|
231
278
|
| --- | --- |
|
|
232
279
|
| Not sure if this folder is linked | `grounder status` — check Project `Linked:` and paths |
|
|
233
|
-
| Notes / handoffs fail or slash commands missing | `grounder doctor` — follow fix hints |
|
|
280
|
+
| Notes / handoffs / plans fail or slash commands missing | `grounder doctor` — follow fix hints |
|
|
234
281
|
| Machine setup only (no project yet) | `grounder doctor --global` |
|
|
235
282
|
| Home config / vault missing | `grounder vault init <path>` |
|
|
236
|
-
| No `.grounder.json` / notes dirs | `grounder init` |
|
|
237
|
-
| Agent slash commands stale
|
|
238
|
-
| Session-start teaser missing (optional) | `grounder
|
|
239
|
-
|
|
|
283
|
+
| No `.grounder.json` / notes / logs / plans dirs | `grounder init` |
|
|
284
|
+
| Agent slash commands stale (`doctor` warns) | `grounder migrate` — if migrate skips everything as “locally modified”, use `grounder migrate --force` once (typical when upgrading from before 0.3) |
|
|
285
|
+
| Session-start teaser missing (optional) | `grounder migrate --hooks` — `doctor` warns when absent |
|
|
286
|
+
| Shared runtime stale after upgrade (bare npx install) | `grounder migrate` — `doctor` warns when `hook-runtime` is stale |
|
|
287
|
+
| Migrate skips all commands as locally modified (first run after upgrade) | `grounder migrate --force` once, then plain `migrate` on later upgrades |
|
|
288
|
+
| Node binary gone / not executable (`doctor` fails on hook or command interpreter path) | `grounder migrate` (add `--force` if command files were edited or you’re still on a pre-0.3 install) |
|
|
240
289
|
|
|
241
290
|
## Development
|
|
242
291
|
|
package/dist/agents/claude.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare function claudeCommandsDir(homeDir?: string): string;
|
|
|
13
13
|
/** Absolute path to Claude Code's shared settings file (`~/.claude/settings.json`). */
|
|
14
14
|
export declare function claudeSettingsJsonPath(homeDir?: string): string;
|
|
15
15
|
export declare function grounderNoteCommandPath(homeDir?: string): string;
|
|
16
|
+
export declare function grounderPlanCommandPath(homeDir?: string): string;
|
|
16
17
|
export declare function grounderTaskHandoffCommandPath(homeDir?: string): string;
|
|
17
18
|
export declare function grounderTaskCommandPath(homeDir?: string): string;
|
|
18
19
|
export declare function expectedArtifacts(homeDir?: string): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,YAAY,CAAC;AAYpB;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;GAGG;AACH,eAAO,MAAM,4BAA4B,0BAA0B,CAAC;AAEpE,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,8BAA8B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhE;AA+ND,eAAO,MAAM,MAAM,EAAE,YAyCpB,CAAC"}
|
package/dist/agents/claude.js
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { resolveHomeDir } from "../connector/home.js";
|
|
5
5
|
import { fileExists } from "../util/fs.js";
|
|
6
6
|
import { mergeJsonFile } from "../util/merge-json.js";
|
|
7
7
|
import { installHookRuntime, isGrounderPeekHookCommand, isHookRuntimeStale, peekHookCommand, } from "./hook-runtime.js";
|
|
8
|
+
import { installCommandFile, recordCommandFileHashes } from "./install-command.js";
|
|
8
9
|
const pkgRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
|
9
10
|
const templateDir = path.join(pkgRoot, "templates", "agents", "claude", "commands");
|
|
10
|
-
const COMMANDS = [
|
|
11
|
+
const COMMANDS = [
|
|
12
|
+
"grounder-note.md",
|
|
13
|
+
"grounder-plan.md",
|
|
14
|
+
"grounder-task-handoff.md",
|
|
15
|
+
"grounder-task.md",
|
|
16
|
+
];
|
|
11
17
|
/**
|
|
12
18
|
* Canonical SessionStart command for Claude Code (home-local runtime, not `npx`).
|
|
13
19
|
* @see {@link peekHookCommand} — REVERT: restore `"npx grounder handoff peek"` and drop runtime.
|
|
@@ -30,6 +36,9 @@ export function claudeSettingsJsonPath(homeDir) {
|
|
|
30
36
|
export function grounderNoteCommandPath(homeDir) {
|
|
31
37
|
return path.join(claudeCommandsDir(homeDir), "grounder-note.md");
|
|
32
38
|
}
|
|
39
|
+
export function grounderPlanCommandPath(homeDir) {
|
|
40
|
+
return path.join(claudeCommandsDir(homeDir), "grounder-plan.md");
|
|
41
|
+
}
|
|
33
42
|
export function grounderTaskHandoffCommandPath(homeDir) {
|
|
34
43
|
return path.join(claudeCommandsDir(homeDir), "grounder-task-handoff.md");
|
|
35
44
|
}
|
|
@@ -43,16 +52,6 @@ export function expectedArtifacts(homeDir) {
|
|
|
43
52
|
export function expectedHookArtifacts(homeDir) {
|
|
44
53
|
return [claudeSettingsJsonPath(homeDir)];
|
|
45
54
|
}
|
|
46
|
-
async function installCommand(filename, opts) {
|
|
47
|
-
const dest = path.join(claudeCommandsDir(opts.homeDir), filename);
|
|
48
|
-
const existed = await fileExists(dest);
|
|
49
|
-
if (existed && !opts.force) {
|
|
50
|
-
return { dest, status: "skipped" };
|
|
51
|
-
}
|
|
52
|
-
await mkdir(path.dirname(dest), { recursive: true });
|
|
53
|
-
await copyFile(path.join(templateDir, filename), dest);
|
|
54
|
-
return { dest, status: existed ? "overwritten" : "created" };
|
|
55
|
-
}
|
|
56
55
|
// ---------------------------------------------------------------------------
|
|
57
56
|
// Session-start hook install (~/.claude/settings.json)
|
|
58
57
|
//
|
|
@@ -239,6 +238,12 @@ async function installHooks(opts) {
|
|
|
239
238
|
if (upToDate && !opts.force) {
|
|
240
239
|
return { artifacts: { [dest]: "skipped" } };
|
|
241
240
|
}
|
|
241
|
+
if (opts.dryRun) {
|
|
242
|
+
const fileExisted = await fileExists(dest);
|
|
243
|
+
const hadGrounderEntry = fileExisted && (await peekHookHadGrounderEntry(dest));
|
|
244
|
+
const status = hadGrounderEntry ? "overwritten" : "created";
|
|
245
|
+
return { artifacts: { [dest]: status } };
|
|
246
|
+
}
|
|
242
247
|
await installHookRuntime({ homeDir: opts.homeDir });
|
|
243
248
|
const fileExisted = await fileExists(dest);
|
|
244
249
|
const hadGrounderEntry = fileExisted && (await peekHookHadGrounderEntry(dest));
|
|
@@ -252,6 +257,8 @@ async function installHooks(opts) {
|
|
|
252
257
|
export const claude = {
|
|
253
258
|
id: "claude",
|
|
254
259
|
name: "Claude Code",
|
|
260
|
+
commandsSchema: 1,
|
|
261
|
+
hooksSchema: 1,
|
|
255
262
|
async isInstalled() {
|
|
256
263
|
return fileExists(path.join(resolveHomeDir(), ".claude"));
|
|
257
264
|
},
|
|
@@ -259,10 +266,28 @@ export const claude = {
|
|
|
259
266
|
expectedHookArtifacts,
|
|
260
267
|
async install(opts) {
|
|
261
268
|
const artifacts = {};
|
|
269
|
+
const files = {};
|
|
262
270
|
for (const filename of COMMANDS) {
|
|
263
|
-
const { dest, status } = await
|
|
271
|
+
const { dest, status, hash } = await installCommandFile({
|
|
272
|
+
...opts,
|
|
273
|
+
agentId: claude.id,
|
|
274
|
+
commandsSchema: claude.commandsSchema,
|
|
275
|
+
templateDir,
|
|
276
|
+
commandsDir: claudeCommandsDir(opts.homeDir),
|
|
277
|
+
filename,
|
|
278
|
+
});
|
|
264
279
|
artifacts[dest] = status;
|
|
280
|
+
if (hash) {
|
|
281
|
+
files[dest] = { schema: claude.commandsSchema, hash };
|
|
282
|
+
}
|
|
265
283
|
}
|
|
284
|
+
await recordCommandFileHashes({
|
|
285
|
+
agentId: claude.id,
|
|
286
|
+
commandsSchema: claude.commandsSchema,
|
|
287
|
+
files,
|
|
288
|
+
homeDir: opts.homeDir,
|
|
289
|
+
dryRun: opts.dryRun,
|
|
290
|
+
});
|
|
266
291
|
return { artifacts };
|
|
267
292
|
},
|
|
268
293
|
installHooks,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/cursor.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export declare function cursorCommandsDir(homeDir?: string): string;
|
|
|
9
9
|
/** Absolute path to Cursor's shared hooks config (`~/.cursor/hooks.json`). */
|
|
10
10
|
export declare function cursorHooksJsonPath(homeDir?: string): string;
|
|
11
11
|
export declare function grounderNoteCommandPath(homeDir?: string): string;
|
|
12
|
+
export declare function grounderPlanCommandPath(homeDir?: string): string;
|
|
12
13
|
export declare function grounderTaskHandoffCommandPath(homeDir?: string): string;
|
|
13
14
|
export declare function grounderTaskCommandPath(homeDir?: string): string;
|
|
14
15
|
export declare function expectedArtifacts(homeDir?: string): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,YAAY,CAAC;AAYpB;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,GAAE,SAAS,MAAM,EAAe,GACxC,MAAM,CAER;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,8BAA8B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhE;AAkLD,eAAO,MAAM,MAAM,EAAE,YAyCpB,CAAC"}
|
package/dist/agents/cursor.js
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { resolveHomeDir } from "../connector/home.js";
|
|
5
5
|
import { fileExists } from "../util/fs.js";
|
|
6
6
|
import { mergeJsonFile } from "../util/merge-json.js";
|
|
7
7
|
import { installHookRuntime, isGrounderPeekHookCommand, isHookRuntimeStale, peekHookCommand, } from "./hook-runtime.js";
|
|
8
|
+
import { installCommandFile, recordCommandFileHashes } from "./install-command.js";
|
|
8
9
|
const pkgRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
|
|
9
10
|
const templateDir = path.join(pkgRoot, "templates", "agents", "cursor", "commands");
|
|
10
|
-
const COMMANDS = [
|
|
11
|
+
const COMMANDS = [
|
|
12
|
+
"grounder-note.md",
|
|
13
|
+
"grounder-plan.md",
|
|
14
|
+
"grounder-task-handoff.md",
|
|
15
|
+
"grounder-task.md",
|
|
16
|
+
];
|
|
11
17
|
/**
|
|
12
18
|
* Canonical sessionStart command for Cursor (home-local runtime, not `npx`).
|
|
13
19
|
* Always includes `--json` so stdout matches Cursor's `additional_context` contract.
|
|
@@ -26,6 +32,9 @@ export function cursorHooksJsonPath(homeDir) {
|
|
|
26
32
|
export function grounderNoteCommandPath(homeDir) {
|
|
27
33
|
return path.join(cursorCommandsDir(homeDir), "grounder-note.md");
|
|
28
34
|
}
|
|
35
|
+
export function grounderPlanCommandPath(homeDir) {
|
|
36
|
+
return path.join(cursorCommandsDir(homeDir), "grounder-plan.md");
|
|
37
|
+
}
|
|
29
38
|
export function grounderTaskHandoffCommandPath(homeDir) {
|
|
30
39
|
return path.join(cursorCommandsDir(homeDir), "grounder-task-handoff.md");
|
|
31
40
|
}
|
|
@@ -39,16 +48,6 @@ export function expectedArtifacts(homeDir) {
|
|
|
39
48
|
export function expectedHookArtifacts(homeDir) {
|
|
40
49
|
return [cursorHooksJsonPath(homeDir)];
|
|
41
50
|
}
|
|
42
|
-
async function installCommand(filename, opts) {
|
|
43
|
-
const dest = path.join(cursorCommandsDir(opts.homeDir), filename);
|
|
44
|
-
const existed = await fileExists(dest);
|
|
45
|
-
if (existed && !opts.force) {
|
|
46
|
-
return { dest, status: "skipped" };
|
|
47
|
-
}
|
|
48
|
-
await mkdir(path.dirname(dest), { recursive: true });
|
|
49
|
-
await copyFile(path.join(templateDir, filename), dest);
|
|
50
|
-
return { dest, status: existed ? "overwritten" : "created" };
|
|
51
|
-
}
|
|
52
51
|
// ---------------------------------------------------------------------------
|
|
53
52
|
// Session-start hook install (~/.cursor/hooks.json)
|
|
54
53
|
//
|
|
@@ -189,6 +188,12 @@ async function installHooks(opts) {
|
|
|
189
188
|
if (upToDate && !opts.force) {
|
|
190
189
|
return { artifacts: { [dest]: "skipped" } };
|
|
191
190
|
}
|
|
191
|
+
if (opts.dryRun) {
|
|
192
|
+
const fileExisted = await fileExists(dest);
|
|
193
|
+
const hadGrounderEntry = fileExisted && (await peekHookHadGrounderEntry(dest));
|
|
194
|
+
const status = hadGrounderEntry ? "overwritten" : "created";
|
|
195
|
+
return { artifacts: { [dest]: status } };
|
|
196
|
+
}
|
|
192
197
|
await installHookRuntime({ homeDir: opts.homeDir });
|
|
193
198
|
const fileExisted = await fileExists(dest);
|
|
194
199
|
const hadGrounderEntry = fileExisted && (await peekHookHadGrounderEntry(dest));
|
|
@@ -202,6 +207,8 @@ async function installHooks(opts) {
|
|
|
202
207
|
export const cursor = {
|
|
203
208
|
id: "cursor",
|
|
204
209
|
name: "Cursor",
|
|
210
|
+
commandsSchema: 1,
|
|
211
|
+
hooksSchema: 1,
|
|
205
212
|
async isInstalled() {
|
|
206
213
|
return fileExists(path.join(resolveHomeDir(), ".cursor"));
|
|
207
214
|
},
|
|
@@ -209,10 +216,28 @@ export const cursor = {
|
|
|
209
216
|
expectedHookArtifacts,
|
|
210
217
|
async install(opts) {
|
|
211
218
|
const artifacts = {};
|
|
219
|
+
const files = {};
|
|
212
220
|
for (const filename of COMMANDS) {
|
|
213
|
-
const { dest, status } = await
|
|
221
|
+
const { dest, status, hash } = await installCommandFile({
|
|
222
|
+
...opts,
|
|
223
|
+
agentId: cursor.id,
|
|
224
|
+
commandsSchema: cursor.commandsSchema,
|
|
225
|
+
templateDir,
|
|
226
|
+
commandsDir: cursorCommandsDir(opts.homeDir),
|
|
227
|
+
filename,
|
|
228
|
+
});
|
|
214
229
|
artifacts[dest] = status;
|
|
230
|
+
if (hash) {
|
|
231
|
+
files[dest] = { schema: cursor.commandsSchema, hash };
|
|
232
|
+
}
|
|
215
233
|
}
|
|
234
|
+
await recordCommandFileHashes({
|
|
235
|
+
agentId: cursor.id,
|
|
236
|
+
commandsSchema: cursor.commandsSchema,
|
|
237
|
+
files,
|
|
238
|
+
homeDir: opts.homeDir,
|
|
239
|
+
dryRun: opts.dryRun,
|
|
240
|
+
});
|
|
216
241
|
return { artifacts };
|
|
217
242
|
},
|
|
218
243
|
installHooks,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"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"}
|