grounder 0.2.0 → 0.4.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.
Files changed (165) hide show
  1. package/README.md +179 -66
  2. package/dist/agents/claude.d.ts +1 -0
  3. package/dist/agents/claude.d.ts.map +1 -1
  4. package/dist/agents/claude.js +37 -13
  5. package/dist/agents/claude.js.map +1 -1
  6. package/dist/agents/cursor.d.ts +1 -0
  7. package/dist/agents/cursor.d.ts.map +1 -1
  8. package/dist/agents/cursor.js +37 -13
  9. package/dist/agents/cursor.js.map +1 -1
  10. package/dist/agents/hook-runtime.d.ts +65 -21
  11. package/dist/agents/hook-runtime.d.ts.map +1 -1
  12. package/dist/agents/hook-runtime.js +172 -31
  13. package/dist/agents/hook-runtime.js.map +1 -1
  14. package/dist/agents/index.d.ts +18 -0
  15. package/dist/agents/index.d.ts.map +1 -1
  16. package/dist/agents/index.js +27 -4
  17. package/dist/agents/index.js.map +1 -1
  18. package/dist/agents/install-command.d.ts +35 -0
  19. package/dist/agents/install-command.d.ts.map +1 -0
  20. package/dist/agents/install-command.js +65 -0
  21. package/dist/agents/install-command.js.map +1 -0
  22. package/dist/agents/types.d.ts +19 -1
  23. package/dist/agents/types.d.ts.map +1 -1
  24. package/dist/cli.js +62 -60
  25. package/dist/cli.js.map +1 -1
  26. package/dist/commands/apply-agent-installs.d.ts +34 -0
  27. package/dist/commands/apply-agent-installs.d.ts.map +1 -0
  28. package/dist/commands/apply-agent-installs.js +137 -0
  29. package/dist/commands/apply-agent-installs.js.map +1 -0
  30. package/dist/commands/doctor.d.ts.map +1 -1
  31. package/dist/commands/doctor.js +278 -60
  32. package/dist/commands/doctor.js.map +1 -1
  33. package/dist/commands/handoff/list.d.ts +15 -7
  34. package/dist/commands/handoff/list.d.ts.map +1 -1
  35. package/dist/commands/handoff/list.js +21 -13
  36. package/dist/commands/handoff/list.js.map +1 -1
  37. package/dist/commands/handoff/peek.d.ts +5 -2
  38. package/dist/commands/handoff/peek.d.ts.map +1 -1
  39. package/dist/commands/handoff/peek.js +47 -6
  40. package/dist/commands/handoff/peek.js.map +1 -1
  41. package/dist/commands/handoff.d.ts.map +1 -1
  42. package/dist/commands/handoff.js +5 -0
  43. package/dist/commands/handoff.js.map +1 -1
  44. package/dist/commands/migrate.d.ts +23 -0
  45. package/dist/commands/migrate.d.ts.map +1 -0
  46. package/dist/commands/migrate.js +104 -0
  47. package/dist/commands/migrate.js.map +1 -0
  48. package/dist/commands/note/list.d.ts +28 -0
  49. package/dist/commands/note/list.d.ts.map +1 -0
  50. package/dist/commands/note/list.js +72 -0
  51. package/dist/commands/note/list.js.map +1 -0
  52. package/dist/commands/note.d.ts.map +1 -1
  53. package/dist/commands/note.js +6 -1
  54. package/dist/commands/note.js.map +1 -1
  55. package/dist/commands/output.d.ts +27 -0
  56. package/dist/commands/output.d.ts.map +1 -0
  57. package/dist/commands/output.js +51 -0
  58. package/dist/commands/output.js.map +1 -0
  59. package/dist/commands/package-version-notice.d.ts +18 -0
  60. package/dist/commands/package-version-notice.d.ts.map +1 -0
  61. package/dist/commands/package-version-notice.js +39 -0
  62. package/dist/commands/package-version-notice.js.map +1 -0
  63. package/dist/commands/path/logs.d.ts +1 -1
  64. package/dist/commands/path/logs.d.ts.map +1 -1
  65. package/dist/commands/path/logs.js +6 -1
  66. package/dist/commands/path/logs.js.map +1 -1
  67. package/dist/commands/path/notes.d.ts +1 -1
  68. package/dist/commands/path/notes.d.ts.map +1 -1
  69. package/dist/commands/path/notes.js +6 -1
  70. package/dist/commands/path/notes.js.map +1 -1
  71. package/dist/commands/path/plans.d.ts +7 -0
  72. package/dist/commands/path/plans.d.ts.map +1 -0
  73. package/dist/commands/path/plans.js +22 -0
  74. package/dist/commands/path/plans.js.map +1 -0
  75. package/dist/commands/plan/list.d.ts +31 -0
  76. package/dist/commands/plan/list.d.ts.map +1 -0
  77. package/dist/commands/plan/list.js +75 -0
  78. package/dist/commands/plan/list.js.map +1 -0
  79. package/dist/commands/plan.d.ts +34 -0
  80. package/dist/commands/plan.d.ts.map +1 -0
  81. package/dist/commands/plan.js +121 -0
  82. package/dist/commands/plan.js.map +1 -0
  83. package/dist/commands/repo/init.d.ts.map +1 -1
  84. package/dist/commands/repo/init.js +12 -1
  85. package/dist/commands/repo/init.js.map +1 -1
  86. package/dist/commands/status.d.ts +1 -1
  87. package/dist/commands/status.d.ts.map +1 -1
  88. package/dist/commands/status.js +62 -18
  89. package/dist/commands/status.js.map +1 -1
  90. package/dist/commands/upgrade-banner.d.ts +9 -0
  91. package/dist/commands/upgrade-banner.d.ts.map +1 -0
  92. package/dist/commands/upgrade-banner.js +27 -0
  93. package/dist/commands/upgrade-banner.js.map +1 -0
  94. package/dist/commands/vault/init.d.ts.map +1 -1
  95. package/dist/commands/vault/init.js +18 -29
  96. package/dist/commands/vault/init.js.map +1 -1
  97. package/dist/connector/repo.d.ts +2 -0
  98. package/dist/connector/repo.d.ts.map +1 -1
  99. package/dist/connector/repo.js +12 -1
  100. package/dist/connector/repo.js.map +1 -1
  101. package/dist/connector/state.d.ts +86 -0
  102. package/dist/connector/state.d.ts.map +1 -0
  103. package/dist/connector/state.js +171 -0
  104. package/dist/connector/state.js.map +1 -0
  105. package/dist/connector/unsupported-schema.d.ts +9 -0
  106. package/dist/connector/unsupported-schema.d.ts.map +1 -0
  107. package/dist/connector/unsupported-schema.js +14 -0
  108. package/dist/connector/unsupported-schema.js.map +1 -0
  109. package/dist/connector/vault.d.ts +2 -0
  110. package/dist/connector/vault.d.ts.map +1 -1
  111. package/dist/connector/vault.js +6 -1
  112. package/dist/connector/vault.js.map +1 -1
  113. package/dist/help.d.ts +45 -0
  114. package/dist/help.d.ts.map +1 -0
  115. package/dist/help.js +368 -0
  116. package/dist/help.js.map +1 -0
  117. package/dist/util/fs.d.ts +6 -0
  118. package/dist/util/fs.d.ts.map +1 -1
  119. package/dist/util/fs.js +15 -1
  120. package/dist/util/fs.js.map +1 -1
  121. package/dist/util/hash.d.ts +3 -0
  122. package/dist/util/hash.d.ts.map +1 -0
  123. package/dist/util/hash.js +6 -0
  124. package/dist/util/hash.js.map +1 -0
  125. package/dist/util/parse-args.d.ts.map +1 -1
  126. package/dist/util/parse-args.js +11 -2
  127. package/dist/util/parse-args.js.map +1 -1
  128. package/dist/util/path.d.ts +10 -0
  129. package/dist/util/path.d.ts.map +1 -1
  130. package/dist/util/path.js +31 -0
  131. package/dist/util/path.js.map +1 -1
  132. package/dist/util/plan-name.d.ts +10 -0
  133. package/dist/util/plan-name.d.ts.map +1 -0
  134. package/dist/util/plan-name.js +18 -0
  135. package/dist/util/plan-name.js.map +1 -0
  136. package/dist/util/semver.d.ts +10 -0
  137. package/dist/util/semver.d.ts.map +1 -0
  138. package/dist/util/semver.js +40 -0
  139. package/dist/util/semver.js.map +1 -0
  140. package/dist/vault/layout.d.ts +2 -0
  141. package/dist/vault/layout.d.ts.map +1 -1
  142. package/dist/vault/layout.js +4 -0
  143. package/dist/vault/layout.js.map +1 -1
  144. package/dist/vault/list-notes.d.ts +15 -0
  145. package/dist/vault/list-notes.d.ts.map +1 -0
  146. package/dist/vault/list-notes.js +44 -0
  147. package/dist/vault/list-notes.js.map +1 -0
  148. package/dist/vault/list-plans.d.ts +11 -0
  149. package/dist/vault/list-plans.d.ts.map +1 -0
  150. package/dist/vault/list-plans.js +40 -0
  151. package/dist/vault/list-plans.js.map +1 -0
  152. package/dist/vault/write-plan.d.ts +28 -0
  153. package/dist/vault/write-plan.d.ts.map +1 -0
  154. package/dist/vault/write-plan.js +61 -0
  155. package/dist/vault/write-plan.js.map +1 -0
  156. package/package.json +5 -3
  157. package/templates/agents/claude/commands/grounder-note.md +25 -3
  158. package/templates/agents/claude/commands/grounder-plan.md +69 -0
  159. package/templates/agents/claude/commands/grounder-task-handoff.md +3 -3
  160. package/templates/agents/claude/commands/grounder-task.md +5 -3
  161. package/templates/agents/cursor/commands/grounder-note.md +26 -4
  162. package/templates/agents/cursor/commands/grounder-plan.md +69 -0
  163. package/templates/agents/cursor/commands/grounder-task-handoff.md +4 -4
  164. package/templates/agents/cursor/commands/grounder-task.md +6 -4
  165. package/templates/vault/plan.md +16 -0
@@ -1,19 +1,36 @@
1
1
  import { readFile, stat } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { isGrounderPeekHookCommand, isHookRuntimeStale } from "../agents/hook-runtime.js";
3
+ import { extractRuntimeNodePath, findRuntimeNodePathsInText, hookFileGrounderPeekCommands, isHookRuntimeStale, } from "../agents/hook-runtime.js";
4
4
  import { resolveAgents } from "../agents/index.js";
5
5
  import { findGitRoot } from "../connector/git.js";
6
6
  import { homeConfigPath, readHomeConfig, withHomeDir } from "../connector/home.js";
7
7
  import { findLinkedRepoRoot, readRepoConfig } from "../connector/repo.js";
8
- import { resolveLogsDir, resolveNotesDir, resolveVaultRoot } from "../connector/vault.js";
9
- import { fileExists } from "../util/fs.js";
8
+ import { isHooksSchemaAhead, readGrounderState, recordedCommandsSchema, recordedHooksSchema, statePath, } from "../connector/state.js";
9
+ import { isUnsupportedSchemaError } from "../connector/unsupported-schema.js";
10
+ import { resolveLogsDir, resolveNotesDir, resolvePlansDir, resolveVaultRoot, } from "../connector/vault.js";
11
+ import { helpExitCode } from "../help.js";
12
+ import { VERSION } from "../index.js";
13
+ import { fileExists, isExecutable } from "../util/fs.js";
10
14
  import { flagBool, parseArgs } from "../util/parse-args.js";
11
15
  import { projectsParent } from "../vault/layout.js";
12
16
  import { failCheck, okCheck, warnCheck } from "./check.js";
17
+ import { fixArrow, writeSection } from "./output.js";
18
+ import { packageVersionNotice } from "./package-version-notice.js";
13
19
  const VAULT_INIT = "grounder vault init <path>";
14
- const VAULT_INIT_FORCE = "grounder vault init <path> --force";
15
- const VAULT_INIT_HOOKS = "grounder vault init <path> --hooks";
20
+ const MIGRATE = "grounder migrate";
21
+ const MIGRATE_FORCE = "grounder migrate --force";
22
+ const MIGRATE_HOOKS = "grounder migrate --hooks";
16
23
  const REPO_INIT = "grounder init";
24
+ const UPGRADE_GROUNDER = "upgrade grounder";
25
+ /** First baked Node path that is missing or not executable; `null` if all ok / none found. */
26
+ async function firstDanglingRuntimeNode(nodePaths) {
27
+ for (const nodePath of nodePaths) {
28
+ if (!(await isExecutable(nodePath))) {
29
+ return nodePath;
30
+ }
31
+ }
32
+ return null;
33
+ }
17
34
  async function isDirectory(dirPath) {
18
35
  try {
19
36
  const info = await stat(dirPath);
@@ -26,11 +43,10 @@ async function isDirectory(dirPath) {
26
43
  function formatCheck(check) {
27
44
  const level = check.level.padEnd(4);
28
45
  const id = check.id.padEnd(18);
29
- const fix = check.fix ? ` → ${check.fix}` : "";
30
- return ` ${level} ${id} ${check.message}${fix}\n`;
46
+ return ` ${level} ${id} ${check.message}${fixArrow(check.fix)}\n`;
31
47
  }
32
- function writeSection(title, checks) {
33
- process.stdout.write(`${title}\n`);
48
+ function writeChecks(title, checks) {
49
+ writeSection(title);
34
50
  for (const check of checks) {
35
51
  process.stdout.write(formatCheck(check));
36
52
  }
@@ -99,7 +115,113 @@ async function checkProjectsDir(vaultRoot) {
99
115
  }
100
116
  return okCheck("projects-dir", `10-Projects/ present (${projectsDir})`);
101
117
  }
102
- async function checkAgentArtifacts(homeDir) {
118
+ /**
119
+ * Load `~/.grounder/state.json` for doctor.
120
+ * Missing → warn (legacy / pre-ledger); corrupt → fail; present → ok.
121
+ */
122
+ async function loadInstallState(homeDir) {
123
+ const filePath = statePath(homeDir);
124
+ try {
125
+ const state = await readGrounderState(homeDir);
126
+ if (!state) {
127
+ return {
128
+ state: null,
129
+ check: warnCheck("install-state", "install state missing (pre-ledger / never migrated)", MIGRATE_FORCE),
130
+ };
131
+ }
132
+ return {
133
+ state,
134
+ check: okCheck("install-state", `install state present (${filePath})`),
135
+ };
136
+ }
137
+ catch (error) {
138
+ const detail = error instanceof Error ? error.message : String(error);
139
+ return {
140
+ state: null,
141
+ check: failCheck("install-state", `install state invalid: ${detail}`, `fix or remove ${filePath}, then ${MIGRATE_FORCE}`),
142
+ };
143
+ }
144
+ }
145
+ /** Warn when package version disagrees with the last migrate/vault-init ledger write. */
146
+ function checkPackageVersion(state) {
147
+ if (!state) {
148
+ return null;
149
+ }
150
+ const notice = packageVersionNotice(VERSION, state.grounderVersion);
151
+ if (!notice) {
152
+ return null;
153
+ }
154
+ return warnCheck("package-version", notice.message, notice.fix);
155
+ }
156
+ function commandsSchemaAhead(agent, state, stateReadable) {
157
+ if (!stateReadable) {
158
+ return false;
159
+ }
160
+ return recordedCommandsSchema(state, agent.id) > agent.commandsSchema;
161
+ }
162
+ function commandsSchemaBehind(agent, state, stateReadable) {
163
+ if (!stateReadable || !state?.agents[agent.id]) {
164
+ return false;
165
+ }
166
+ return recordedCommandsSchema(state, agent.id) < agent.commandsSchema;
167
+ }
168
+ function hooksSchemaAhead(agent, state, stateReadable) {
169
+ if (!stateReadable || agent.hooksSchema === undefined) {
170
+ return false;
171
+ }
172
+ return isHooksSchemaAhead(state?.agents[agent.id]?.hooksSchema, agent.hooksSchema);
173
+ }
174
+ /** Match {@link isInstallSchemaStale}: only when a hooks version was recorded. */
175
+ function hooksSchemaBehindInLedger(agent, state, stateReadable) {
176
+ if (!stateReadable || agent.hooksSchema === undefined) {
177
+ return false;
178
+ }
179
+ const recorded = state?.agents[agent.id]?.hooksSchema;
180
+ if (recorded === undefined) {
181
+ return false;
182
+ }
183
+ return recorded < agent.hooksSchema;
184
+ }
185
+ /**
186
+ * When on-disk files already match templates but `state.json` schema numbers
187
+ * lag, surface the same migrate hint `status` shows for ledger staleness.
188
+ */
189
+ function applyLedgerSchemaLag(check, opts) {
190
+ if (check.level !== "ok" || !opts.behind) {
191
+ return check;
192
+ }
193
+ return warnCheck(opts.id, `${opts.agentName}: ${opts.kind} schema behind in ledger (recorded ${opts.recorded}, current ${opts.current}; files match)`, MIGRATE);
194
+ }
195
+ /**
196
+ * Map migrate dry-run artifact statuses onto a doctor check.
197
+ * `modified` needs `--force`; `overwritten` / `created` would write on plain migrate.
198
+ * Only `skipped` counts as up to date.
199
+ */
200
+ function checkFromInstallPreview(id, agentName, kind, preview, upToDateMessage) {
201
+ const statuses = Object.values(preview.artifacts);
202
+ const modified = statuses.filter((s) => s === "modified").length;
203
+ const created = statuses.filter((s) => s === "created").length;
204
+ const overwritten = statuses.filter((s) => s === "overwritten").length;
205
+ const wouldWrite = created + overwritten;
206
+ if (modified === 0 && wouldWrite === 0) {
207
+ return okCheck(id, upToDateMessage);
208
+ }
209
+ if (modified === 0) {
210
+ return warnCheck(id, `${agentName}: ${pendingWriteMessage(kind, created, overwritten)}`, MIGRATE);
211
+ }
212
+ return warnCheck(id, `${agentName}: ${modified} ${kind} locally modified (needs --force to refresh)` +
213
+ (wouldWrite > 0 ? `, ${wouldWrite} would auto-update` : ""), MIGRATE_FORCE);
214
+ }
215
+ function pendingWriteMessage(kind, created, overwritten) {
216
+ if (created > 0 && overwritten > 0) {
217
+ return `${created + overwritten} ${kind} would install or update on next migrate`;
218
+ }
219
+ if (created > 0) {
220
+ return `${created} ${kind} would install on next migrate`;
221
+ }
222
+ return `${overwritten} ${kind} would update on next migrate`;
223
+ }
224
+ async function checkAgentArtifacts(state, stateReadable, homeDir) {
103
225
  const agents = await resolveAgents();
104
226
  const checks = [];
105
227
  for (const agent of agents) {
@@ -108,10 +230,48 @@ async function checkAgentArtifacts(homeDir) {
108
230
  const presentCount = present.filter(Boolean).length;
109
231
  const id = `agent-${agent.id}`;
110
232
  if (presentCount === expected.length) {
111
- checks.push(okCheck(id, `${agent.name} command files present`));
233
+ // Missing/non-executable baked Node in slash-command markdown → fail.
234
+ // Do not compare to process.execPath. Legacy npx / non-runtime shapes skip.
235
+ const texts = await Promise.all(expected.map(async (p) => {
236
+ try {
237
+ return await readFile(p, "utf8");
238
+ }
239
+ catch {
240
+ return "";
241
+ }
242
+ }));
243
+ const danglingNode = await firstDanglingRuntimeNode(texts.flatMap((text) => findRuntimeNodePathsInText(text)));
244
+ if (danglingNode) {
245
+ checks.push(failCheck(id, `${agent.name} command Node interpreter missing or not executable (${danglingNode})`, MIGRATE));
246
+ }
247
+ else if (commandsSchemaAhead(agent, state, stateReadable)) {
248
+ const recorded = recordedCommandsSchema(state, agent.id);
249
+ checks.push(failCheck(id, `${agent.name} commands schema newer than this grounder (recorded ${recorded}, supported ${agent.commandsSchema})`, UPGRADE_GROUNDER));
250
+ }
251
+ else if (stateReadable) {
252
+ try {
253
+ const preview = await agent.install({ force: false, dryRun: true, homeDir });
254
+ const previewCheck = checkFromInstallPreview(id, agent.name, "command file(s)", preview, `${agent.name} command files up to date`);
255
+ checks.push(applyLedgerSchemaLag(previewCheck, {
256
+ id,
257
+ agentName: agent.name,
258
+ kind: "commands",
259
+ recorded: recordedCommandsSchema(state, agent.id),
260
+ current: agent.commandsSchema,
261
+ behind: commandsSchemaBehind(agent, state, stateReadable),
262
+ }));
263
+ }
264
+ catch (error) {
265
+ const detail = error instanceof Error ? error.message : String(error);
266
+ checks.push(warnCheck(id, `${agent.name}: could not verify command drift (${detail})`, MIGRATE));
267
+ }
268
+ }
269
+ else {
270
+ checks.push(okCheck(id, `${agent.name} command files present`));
271
+ }
112
272
  continue;
113
273
  }
114
- const fix = `${VAULT_INIT_FORCE} (or --agent=${agent.id})`;
274
+ const fix = `${MIGRATE_FORCE} (or --agent=${agent.id})`;
115
275
  if (presentCount === 0) {
116
276
  checks.push(warnCheck(id, `${agent.name} detected but no Grounder command files`, fix));
117
277
  }
@@ -122,62 +282,80 @@ async function checkAgentArtifacts(homeDir) {
122
282
  }
123
283
  return checks;
124
284
  }
125
- /** True when any nested `command` field is Grounder's peek hook (Cursor or Claude shape). */
126
- function jsonContainsGrounderPeekCommand(value) {
127
- if (Array.isArray(value)) {
128
- return value.some(jsonContainsGrounderPeekCommand);
129
- }
130
- if (value && typeof value === "object") {
131
- const obj = value;
132
- if (isGrounderPeekHookCommand(obj.command)) {
133
- return true;
134
- }
135
- return Object.values(obj).some(jsonContainsGrounderPeekCommand);
136
- }
137
- return false;
138
- }
139
- async function hookFileHasGrounderEntry(filePath) {
140
- try {
141
- if (!(await fileExists(filePath))) {
142
- return false;
143
- }
144
- const parsed = JSON.parse(await readFile(filePath, "utf8"));
145
- return jsonContainsGrounderPeekCommand(parsed);
146
- }
147
- catch {
148
- return false;
149
- }
150
- }
151
285
  /**
152
286
  * Warn-only: session hooks are opt-in. Missing entry never fails doctor.
153
287
  * One check per detected agent that declares `expectedHookArtifacts`.
154
288
  *
155
- * When at least one agent has a Grounder hook installed, also check the shared
156
- * `~/.grounder/runtime` materialization stale mainly for bare-npx copy installs
157
- * after an upgrade (symlink installs stay current without re-init).
289
+ * Slash commands and session hooks both depend on the shared
290
+ * `~/.grounder/runtime` materialization, so it's checked whenever *either* is
291
+ * installed stale mainly for bare-npx copy installs after an upgrade
292
+ * (symlink installs stay current without re-init).
158
293
  */
159
- async function checkAgentHooks(homeDir) {
294
+ async function checkAgentHooks(state, stateReadable, homeDir) {
160
295
  const agents = await resolveAgents();
161
296
  const checks = [];
162
297
  let anyHooksInstalled = false;
298
+ const commandsPresent = await Promise.all(agents.map((agent) => Promise.all(agent.expectedArtifacts(homeDir).map((p) => fileExists(p)))));
299
+ const anyCommandsInstalled = commandsPresent.some((present) => present.some(Boolean));
300
+ // Shared runtime staleness alone makes installHooks dry-run report would-update;
301
+ // keep that as a single hook-runtime warn below instead of doubling up.
302
+ const runtimeStale = await isHookRuntimeStale(homeDir);
163
303
  for (const agent of agents) {
164
304
  if (!agent.expectedHookArtifacts) {
165
305
  continue;
166
306
  }
167
307
  const expected = agent.expectedHookArtifacts(homeDir);
168
- const present = await Promise.all(expected.map((p) => hookFileHasGrounderEntry(p)));
308
+ const peekCommandsByFile = await Promise.all(expected.map((p) => hookFileGrounderPeekCommands(p)));
309
+ const present = peekCommandsByFile.map((cmds) => cmds.length > 0);
169
310
  const id = `agent-${agent.id}-hooks`;
170
311
  if (present.every(Boolean) && expected.length > 0) {
171
312
  anyHooksInstalled = true;
172
- checks.push(okCheck(id, `${agent.name} session hook installed`));
313
+ // Missing/non-executable baked Node → fail. Do not compare to
314
+ // process.execPath: a different-but-still-present install is fine.
315
+ // Legacy `npx` entries have no absolute interpreter (extract → null) — skip.
316
+ const danglingNode = await firstDanglingRuntimeNode(peekCommandsByFile.flat().flatMap((cmd) => {
317
+ const nodePath = extractRuntimeNodePath(cmd);
318
+ return nodePath !== null ? [nodePath] : [];
319
+ }));
320
+ if (danglingNode) {
321
+ checks.push(failCheck(id, `${agent.name} session hook Node interpreter missing or not executable (${danglingNode})`, MIGRATE));
322
+ }
323
+ else if (hooksSchemaAhead(agent, state, stateReadable)) {
324
+ const recorded = recordedHooksSchema(state, agent.id);
325
+ checks.push(failCheck(id, `${agent.name} hooks schema newer than this grounder (recorded ${recorded}, supported ${agent.hooksSchema})`, UPGRADE_GROUNDER));
326
+ }
327
+ else if (runtimeStale) {
328
+ checks.push(okCheck(id, `${agent.name} session hook installed`));
329
+ }
330
+ else if (stateReadable && agent.installHooks) {
331
+ try {
332
+ const preview = await agent.installHooks({ force: false, dryRun: true, homeDir });
333
+ const previewCheck = checkFromInstallPreview(id, agent.name, "session hook file(s)", preview, `${agent.name} session hook up to date`);
334
+ checks.push(applyLedgerSchemaLag(previewCheck, {
335
+ id,
336
+ agentName: agent.name,
337
+ kind: "hooks",
338
+ recorded: recordedHooksSchema(state, agent.id),
339
+ current: agent.hooksSchema ?? 0,
340
+ behind: hooksSchemaBehindInLedger(agent, state, stateReadable),
341
+ }));
342
+ }
343
+ catch (error) {
344
+ const detail = error instanceof Error ? error.message : String(error);
345
+ checks.push(warnCheck(id, `${agent.name}: could not verify session hook drift (${detail})`, MIGRATE));
346
+ }
347
+ }
348
+ else {
349
+ checks.push(okCheck(id, `${agent.name} session hook installed`));
350
+ }
173
351
  }
174
352
  else {
175
- checks.push(warnCheck(id, `${agent.name} detected but no Grounder session hook`, VAULT_INIT_HOOKS));
353
+ checks.push(warnCheck(id, `${agent.name} detected but no Grounder session hook`, MIGRATE_HOOKS));
176
354
  }
177
355
  }
178
- if (anyHooksInstalled) {
179
- if (await isHookRuntimeStale(homeDir)) {
180
- checks.push(warnCheck("hook-runtime", "hook runtime stale or missing (re-run after upgrading, especially bare npx)", VAULT_INIT_HOOKS));
356
+ if (anyHooksInstalled || anyCommandsInstalled) {
357
+ if (runtimeStale) {
358
+ checks.push(warnCheck("hook-runtime", "hook runtime stale or missing (re-run after upgrading, especially bare npx)", MIGRATE));
181
359
  }
182
360
  else {
183
361
  checks.push(okCheck("hook-runtime", "hook runtime current"));
@@ -189,13 +367,28 @@ async function runMachineChecks(homeDir) {
189
367
  const { check: homeCheck, home } = await checkHomeConfig();
190
368
  const { check: vaultCheck, vaultRoot } = await checkVault(home);
191
369
  const projectsCheck = await checkProjectsDir(vaultRoot);
192
- const agentChecks = await checkAgentArtifacts(homeDir);
193
- const hookChecks = await checkAgentHooks(homeDir);
370
+ const { state, check: stateCheck } = await loadInstallState(homeDir);
371
+ // Corrupt ledger: don't invent schema-0 migrate warns on top of the fail.
372
+ const stateReadable = stateCheck.level !== "fail";
373
+ const packageVersionCheck = checkPackageVersion(state);
194
374
  return {
195
- checks: [homeCheck, vaultCheck, projectsCheck, ...agentChecks, ...hookChecks],
375
+ checks: [
376
+ homeCheck,
377
+ vaultCheck,
378
+ projectsCheck,
379
+ stateCheck,
380
+ ...(packageVersionCheck ? [packageVersionCheck] : []),
381
+ ],
382
+ state,
383
+ stateReadable,
196
384
  home,
197
385
  };
198
386
  }
387
+ async function runAgentChecks(state, stateReadable, homeDir) {
388
+ const agentChecks = await checkAgentArtifacts(state, stateReadable, homeDir);
389
+ const hookChecks = await checkAgentHooks(state, stateReadable, homeDir);
390
+ return [...agentChecks, ...hookChecks];
391
+ }
199
392
  async function runProjectChecks(cwd, home) {
200
393
  const checks = [];
201
394
  const gitRoot = await findGitRoot(cwd);
@@ -205,10 +398,12 @@ async function runProjectChecks(cwd, home) {
205
398
  checks.push(failCheck("repo-config-valid", "cannot validate projectId (no repo config)", REPO_INIT));
206
399
  checks.push(failCheck("notes-dir", "cannot resolve notes/ (no repo config)", REPO_INIT));
207
400
  checks.push(failCheck("logs-dir", "cannot resolve logs/ (no repo config)", REPO_INIT));
401
+ checks.push(failCheck("plans-dir", "cannot resolve plans/ (no repo config)", REPO_INIT));
208
402
  }
209
403
  else {
210
404
  checks.push(okCheck("repo-config", `repo config present (${path.join(linkedRoot, ".grounder.json")})`));
211
405
  let repo = null;
406
+ let repoUnsupported = false;
212
407
  try {
213
408
  repo = await readRepoConfig(linkedRoot);
214
409
  if (!repo) {
@@ -220,23 +415,39 @@ async function runProjectChecks(cwd, home) {
220
415
  }
221
416
  catch (error) {
222
417
  const detail = error instanceof Error ? error.message : String(error);
223
- checks.push(failCheck("repo-config-valid", `invalid repo config: ${detail}`, `Fix or re-run ${REPO_INIT} --force`));
418
+ if (isUnsupportedSchemaError(error)) {
419
+ repoUnsupported = true;
420
+ checks.push(failCheck("repo-config-valid", detail, UPGRADE_GROUNDER));
421
+ }
422
+ else {
423
+ checks.push(failCheck("repo-config-valid", `invalid repo config: ${detail}`, `Fix or re-run ${REPO_INIT} --force`));
424
+ }
224
425
  }
225
426
  if (!home || !repo) {
226
- const reason = !home ? "no home config" : "no valid repo config";
227
- const fix = !home ? VAULT_INIT : REPO_INIT;
427
+ const reason = !home
428
+ ? "no home config"
429
+ : repoUnsupported
430
+ ? "unsupported repo config version"
431
+ : "no valid repo config";
432
+ const fix = !home ? VAULT_INIT : repoUnsupported ? UPGRADE_GROUNDER : REPO_INIT;
228
433
  checks.push(failCheck("notes-dir", `cannot resolve notes/ (${reason})`, fix));
229
434
  checks.push(failCheck("logs-dir", `cannot resolve logs/ (${reason})`, fix));
435
+ checks.push(failCheck("plans-dir", `cannot resolve plans/ (${reason})`, fix));
230
436
  }
231
437
  else {
232
438
  const notes = resolveNotesDir(home, repo);
233
439
  const logs = resolveLogsDir(home, repo);
440
+ const plans = resolvePlansDir(home, repo);
441
+ // Missing layout dirs are warn, not fail: note/handoff/plan writers mkdir on first use.
234
442
  checks.push((await isDirectory(notes))
235
443
  ? okCheck("notes-dir", `notes/ present (${notes})`)
236
- : failCheck("notes-dir", `${notes} missing`, `${REPO_INIT} (creates dirs)`));
444
+ : warnCheck("notes-dir", `notes/ missing (${notes})`, REPO_INIT));
237
445
  checks.push((await isDirectory(logs))
238
446
  ? okCheck("logs-dir", `logs/ present (${logs})`)
239
- : failCheck("logs-dir", `${logs} missing`, REPO_INIT));
447
+ : warnCheck("logs-dir", `logs/ missing (${logs})`, REPO_INIT));
448
+ checks.push((await isDirectory(plans))
449
+ ? okCheck("plans-dir", `plans/ present (${plans})`)
450
+ : warnCheck("plans-dir", `plans/ missing (${plans})`, REPO_INIT));
240
451
  }
241
452
  }
242
453
  if (!gitRoot) {
@@ -248,19 +459,26 @@ async function runProjectChecks(cwd, home) {
248
459
  return checks;
249
460
  }
250
461
  export async function runDoctor(argv) {
462
+ const helpCode = helpExitCode(argv, "doctor");
463
+ if (helpCode !== null) {
464
+ return helpCode;
465
+ }
251
466
  const { flags } = parseArgs(argv);
252
467
  return runDoctorWithOptions({ global: flagBool(flags, "global") });
253
468
  }
254
469
  export async function runDoctorWithOptions(options = {}) {
255
470
  return withHomeDir(options.homeDir, async () => {
256
471
  const cwd = path.resolve(options.cwd ?? process.cwd());
257
- const { checks: machineChecks, home } = await runMachineChecks(options.homeDir);
472
+ const { checks: machineChecks, state, stateReadable, home, } = await runMachineChecks(options.homeDir);
473
+ const agentChecks = await runAgentChecks(state, stateReadable, options.homeDir);
258
474
  const projectChecks = options.global ? [] : await runProjectChecks(cwd, home);
259
- const checks = [...machineChecks, ...projectChecks];
260
- writeSection("Machine", machineChecks);
475
+ const checks = [...machineChecks, ...agentChecks, ...projectChecks];
476
+ writeChecks("Machine", machineChecks);
477
+ process.stdout.write("\n");
478
+ writeChecks("Agents", agentChecks);
261
479
  if (!options.global) {
262
480
  process.stdout.write("\n");
263
- writeSection("Project", projectChecks);
481
+ writeChecks("Project", projectChecks);
264
482
  }
265
483
  process.stdout.write("\n");
266
484
  process.stdout.write(summarize(checks));
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,10 @@
2
2
  export interface HandoffListOptions {
3
3
  /** Directory used to find the linked repo (default: `process.cwd()`). */
4
4
  cwd?: string;
5
- /** Max paths to print, newest first (default: 5). */
5
+ /**
6
+ * Default list: max handoffs to print, newest first (default: 5).
7
+ * With `--head`: bounds the usable-handoff fallback scan only (not output count).
8
+ */
6
9
  limit?: number;
7
10
  /**
8
11
  * Print only the single newest *usable* handoff path (skips empty/unreadable
@@ -20,12 +23,17 @@ export interface HandoffListOptions {
20
23
  */
21
24
  export declare function runHandoffList(argv: string[]): Promise<number>;
22
25
  /**
23
- * Resolves the linked project, lists recent handoff paths under `logs/` (newest first).
24
- * Prints one absolute path per line; empty when no handoffs. Same vault/link
25
- * prerequisites as `grounder handoff`.
26
- * With `head: true`, prints only the single newest *usable* handoff path — see
27
- * {@link findUsableHandoff}. This is the selection `/grounder-task` should read,
28
- * matching what `grounder handoff peek` teases.
26
+ * Resolves the linked project, lists recent handoffs under `logs/` (newest first).
27
+ * Default: prints a count header (blank line after when non-empty), then each
28
+ * handoff as a numbered two-line block — `N. ` + full filename stem (including
29
+ * timestamp prefix), then the indented absolute path separated by a blank
30
+ * line. The title line ends with two trailing spaces (a Markdown hard line
31
+ * break) so agents can relay stdout into chat and keep title and path on
32
+ * separate rendered lines. When `logs/` is empty, prints `No handoffs.` only.
33
+ * The number is positional within this listing only (not a stable identifier).
34
+ * With `head: true`, prints only the single newest *usable* handoff path (or
35
+ * empty stdout) — see {@link findUsableHandoff}. Same vault/link prerequisites
36
+ * as `grounder handoff`.
29
37
  * @returns Exit code (`0` on success, `1` when vault/link is missing).
30
38
  */
31
39
  export declare function runHandoffListWithOptions(options?: HandoffListOptions): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/handoff/list.ts"],"names":[],"mappings":"AASA,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BpE;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BjG"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/handoff/list.ts"],"names":[],"mappings":"AAWA,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AASD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCpE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBjG"}
@@ -1,8 +1,10 @@
1
1
  import { withHomeDir } from "../../connector/home.js";
2
2
  import { resolveLogsDir } from "../../connector/vault.js";
3
+ import { helpExitCode } from "../../help.js";
3
4
  import { flagBool, parseArgs } from "../../util/parse-args.js";
4
5
  import { findUsableHandoff } from "../../vault/find-usable-handoff.js";
5
6
  import { listHandoffs } from "../../vault/list-handoffs.js";
7
+ import { writeVaultItemList } from "../output.js";
6
8
  import { requireLinkedProject } from "../require-linked.js";
7
9
  const DEFAULT_LIMIT = 5;
8
10
  const USAGE = "Usage: grounder handoff list [--limit <n>] [--head]\n";
@@ -16,6 +18,10 @@ function usageError() {
16
18
  * @returns Exit code (`0` on success, `1` on usage or config errors).
17
19
  */
18
20
  export async function runHandoffList(argv) {
21
+ const helpCode = helpExitCode(argv, "handoff list");
22
+ if (helpCode !== null) {
23
+ return helpCode;
24
+ }
19
25
  const { positional, flags } = parseArgs(argv);
20
26
  if (positional.length > 0) {
21
27
  return usageError();
@@ -41,12 +47,17 @@ export async function runHandoffList(argv) {
41
47
  return runHandoffListWithOptions({ limit, head: flagBool(flags, "head") });
42
48
  }
43
49
  /**
44
- * Resolves the linked project, lists recent handoff paths under `logs/` (newest first).
45
- * Prints one absolute path per line; empty when no handoffs. Same vault/link
46
- * prerequisites as `grounder handoff`.
47
- * With `head: true`, prints only the single newest *usable* handoff path — see
48
- * {@link findUsableHandoff}. This is the selection `/grounder-task` should read,
49
- * matching what `grounder handoff peek` teases.
50
+ * Resolves the linked project, lists recent handoffs under `logs/` (newest first).
51
+ * Default: prints a count header (blank line after when non-empty), then each
52
+ * handoff as a numbered two-line block — `N. ` + full filename stem (including
53
+ * timestamp prefix), then the indented absolute path separated by a blank
54
+ * line. The title line ends with two trailing spaces (a Markdown hard line
55
+ * break) so agents can relay stdout into chat and keep title and path on
56
+ * separate rendered lines. When `logs/` is empty, prints `No handoffs.` only.
57
+ * The number is positional within this listing only (not a stable identifier).
58
+ * With `head: true`, prints only the single newest *usable* handoff path (or
59
+ * empty stdout) — see {@link findUsableHandoff}. Same vault/link prerequisites
60
+ * as `grounder handoff`.
50
61
  * @returns Exit code (`0` on success, `1` when vault/link is missing).
51
62
  */
52
63
  export async function runHandoffListWithOptions(options = {}) {
@@ -55,20 +66,17 @@ export async function runHandoffListWithOptions(options = {}) {
55
66
  if (!linked) {
56
67
  return 1;
57
68
  }
69
+ const limit = options.limit ?? DEFAULT_LIMIT;
58
70
  const logsDir = resolveLogsDir(linked.home, linked.repo);
59
71
  if (options.head) {
60
- const usable = await findUsableHandoff(logsDir, { limit: options.limit ?? DEFAULT_LIMIT });
72
+ const usable = await findUsableHandoff(logsDir, { limit });
61
73
  if (usable) {
62
74
  process.stdout.write(`${usable.path}\n`);
63
75
  }
64
76
  return 0;
65
77
  }
66
- const paths = await listHandoffs(logsDir, {
67
- limit: options.limit ?? DEFAULT_LIMIT,
68
- });
69
- for (const filePath of paths) {
70
- process.stdout.write(`${filePath}\n`);
71
- }
78
+ const paths = await listHandoffs(logsDir, { limit });
79
+ writeVaultItemList(paths, limit, { singular: "handoff", plural: "handoffs" });
72
80
  return 0;
73
81
  });
74
82
  }