grounder 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +21 -20
  2. package/dist/agents/claude.d.ts +4 -4
  3. package/dist/agents/claude.d.ts.map +1 -1
  4. package/dist/agents/claude.js +158 -179
  5. package/dist/agents/claude.js.map +1 -1
  6. package/dist/agents/cursor.d.ts +3 -3
  7. package/dist/agents/cursor.d.ts.map +1 -1
  8. package/dist/agents/cursor.js +97 -144
  9. package/dist/agents/cursor.js.map +1 -1
  10. package/dist/agents/home-skills.d.ts +46 -0
  11. package/dist/agents/home-skills.d.ts.map +1 -0
  12. package/dist/agents/home-skills.js +83 -0
  13. package/dist/agents/home-skills.js.map +1 -0
  14. package/dist/agents/hook-fragment.d.ts +52 -0
  15. package/dist/agents/hook-fragment.d.ts.map +1 -0
  16. package/dist/agents/hook-fragment.js +76 -0
  17. package/dist/agents/hook-fragment.js.map +1 -0
  18. package/dist/agents/hook-install.d.ts +62 -0
  19. package/dist/agents/hook-install.d.ts.map +1 -0
  20. package/dist/agents/hook-install.js +74 -0
  21. package/dist/agents/hook-install.js.map +1 -0
  22. package/dist/agents/hook-runtime.d.ts +77 -10
  23. package/dist/agents/hook-runtime.d.ts.map +1 -1
  24. package/dist/agents/hook-runtime.js +274 -70
  25. package/dist/agents/hook-runtime.js.map +1 -1
  26. package/dist/agents/index.d.ts +8 -14
  27. package/dist/agents/index.d.ts.map +1 -1
  28. package/dist/agents/index.js +13 -19
  29. package/dist/agents/index.js.map +1 -1
  30. package/dist/agents/types.d.ts +56 -16
  31. package/dist/agents/types.d.ts.map +1 -1
  32. package/dist/cli.js +4 -0
  33. package/dist/cli.js.map +1 -1
  34. package/dist/commands/apply.d.ts +69 -0
  35. package/dist/commands/apply.d.ts.map +1 -0
  36. package/dist/commands/apply.js +238 -0
  37. package/dist/commands/apply.js.map +1 -0
  38. package/dist/commands/doctor.d.ts.map +1 -1
  39. package/dist/commands/doctor.js +190 -97
  40. package/dist/commands/doctor.js.map +1 -1
  41. package/dist/commands/handoff/peek.d.ts +1 -1
  42. package/dist/commands/handoff/peek.d.ts.map +1 -1
  43. package/dist/commands/handoff/peek.js +28 -12
  44. package/dist/commands/handoff/peek.js.map +1 -1
  45. package/dist/commands/install-drift.d.ts +34 -0
  46. package/dist/commands/install-drift.d.ts.map +1 -0
  47. package/dist/commands/install-drift.js +72 -0
  48. package/dist/commands/install-drift.js.map +1 -0
  49. package/dist/commands/migrate.d.ts +11 -3
  50. package/dist/commands/migrate.d.ts.map +1 -1
  51. package/dist/commands/migrate.js +67 -33
  52. package/dist/commands/migrate.js.map +1 -1
  53. package/dist/commands/overview.d.ts +33 -0
  54. package/dist/commands/overview.d.ts.map +1 -0
  55. package/dist/commands/overview.js +150 -0
  56. package/dist/commands/overview.js.map +1 -0
  57. package/dist/commands/render-artifact-table.d.ts +85 -0
  58. package/dist/commands/render-artifact-table.d.ts.map +1 -0
  59. package/dist/commands/render-artifact-table.js +232 -0
  60. package/dist/commands/render-artifact-table.js.map +1 -0
  61. package/dist/commands/search.d.ts.map +1 -1
  62. package/dist/commands/search.js +15 -4
  63. package/dist/commands/search.js.map +1 -1
  64. package/dist/commands/setup.d.ts.map +1 -1
  65. package/dist/commands/setup.js +86 -13
  66. package/dist/commands/setup.js.map +1 -1
  67. package/dist/commands/status.d.ts +7 -0
  68. package/dist/commands/status.d.ts.map +1 -1
  69. package/dist/commands/status.js +269 -88
  70. package/dist/commands/status.js.map +1 -1
  71. package/dist/connector/ledger-migrations.d.ts +55 -0
  72. package/dist/connector/ledger-migrations.d.ts.map +1 -0
  73. package/dist/connector/ledger-migrations.js +94 -0
  74. package/dist/connector/ledger-migrations.js.map +1 -0
  75. package/dist/connector/state.d.ts +96 -59
  76. package/dist/connector/state.d.ts.map +1 -1
  77. package/dist/connector/state.js +165 -107
  78. package/dist/connector/state.js.map +1 -1
  79. package/dist/help.d.ts +1 -1
  80. package/dist/help.d.ts.map +1 -1
  81. package/dist/help.js +27 -5
  82. package/dist/help.js.map +1 -1
  83. package/dist/reconcile/apply.d.ts +31 -0
  84. package/dist/reconcile/apply.d.ts.map +1 -0
  85. package/dist/reconcile/apply.js +97 -0
  86. package/dist/reconcile/apply.js.map +1 -0
  87. package/dist/reconcile/core.d.ts +82 -0
  88. package/dist/reconcile/core.d.ts.map +1 -0
  89. package/dist/reconcile/core.js +163 -0
  90. package/dist/reconcile/core.js.map +1 -0
  91. package/dist/reconcile/disk.d.ts +13 -0
  92. package/dist/reconcile/disk.d.ts.map +1 -0
  93. package/dist/reconcile/disk.js +28 -0
  94. package/dist/reconcile/disk.js.map +1 -0
  95. package/dist/util/fs.d.ts +14 -0
  96. package/dist/util/fs.d.ts.map +1 -1
  97. package/dist/util/fs.js +27 -1
  98. package/dist/util/fs.js.map +1 -1
  99. package/dist/util/merge-json.d.ts +13 -2
  100. package/dist/util/merge-json.d.ts.map +1 -1
  101. package/dist/util/merge-json.js +24 -10
  102. package/dist/util/merge-json.js.map +1 -1
  103. package/dist/vault/list-handoffs.d.ts +13 -3
  104. package/dist/vault/list-handoffs.d.ts.map +1 -1
  105. package/dist/vault/list-handoffs.js +28 -13
  106. package/dist/vault/list-handoffs.js.map +1 -1
  107. package/dist/vault/list-notes.d.ts +12 -3
  108. package/dist/vault/list-notes.d.ts.map +1 -1
  109. package/dist/vault/list-notes.js +13 -7
  110. package/dist/vault/list-notes.js.map +1 -1
  111. package/dist/vault/list-plans.d.ts +12 -3
  112. package/dist/vault/list-plans.d.ts.map +1 -1
  113. package/dist/vault/list-plans.js +13 -7
  114. package/dist/vault/list-plans.js.map +1 -1
  115. package/dist/vault/search.d.ts.map +1 -1
  116. package/dist/vault/search.js +128 -24
  117. package/dist/vault/search.js.map +1 -1
  118. package/package.json +2 -2
  119. package/templates/agents/claude/skills/grounder-handoff/SKILL.md +73 -0
  120. package/templates/agents/claude/{commands/grounder-note.md → skills/grounder-note/SKILL.md} +6 -0
  121. package/templates/agents/claude/skills/grounder-overview/SKILL.md +21 -0
  122. package/templates/agents/claude/{commands/grounder-plan.md → skills/grounder-plan/SKILL.md} +6 -0
  123. package/templates/agents/claude/skills/grounder-recall/SKILL.md +34 -0
  124. package/templates/agents/claude/{commands/grounder-search.md → skills/grounder-search/SKILL.md} +16 -8
  125. package/templates/agents/cursor/skills/grounder-handoff/SKILL.md +73 -0
  126. package/templates/agents/cursor/{commands/grounder-note.md → skills/grounder-note/SKILL.md} +6 -0
  127. package/templates/agents/cursor/skills/grounder-overview/SKILL.md +21 -0
  128. package/templates/agents/cursor/{commands/grounder-plan.md → skills/grounder-plan/SKILL.md} +6 -0
  129. package/templates/agents/cursor/skills/grounder-recall/SKILL.md +34 -0
  130. package/templates/agents/cursor/{commands/grounder-search.md → skills/grounder-search/SKILL.md} +16 -8
  131. package/templates/vault/plan.md +1 -1
  132. package/templates/vault/session-handoff.md +2 -1
  133. package/dist/agents/install-command.d.ts +0 -35
  134. package/dist/agents/install-command.d.ts.map +0 -1
  135. package/dist/agents/install-command.js +0 -65
  136. package/dist/agents/install-command.js.map +0 -1
  137. package/dist/commands/apply-agent-installs.d.ts +0 -34
  138. package/dist/commands/apply-agent-installs.d.ts.map +0 -1
  139. package/dist/commands/apply-agent-installs.js +0 -137
  140. package/dist/commands/apply-agent-installs.js.map +0 -1
  141. package/templates/agents/claude/commands/grounder-task-handoff.md +0 -58
  142. package/templates/agents/claude/commands/grounder-task.md +0 -22
  143. package/templates/agents/cursor/commands/grounder-task-handoff.md +0 -58
  144. package/templates/agents/cursor/commands/grounder-task.md +0 -22
@@ -1,13 +1,14 @@
1
1
  import path from "node:path";
2
- import { ALL_AGENTS } from "../agents/index.js";
3
2
  import { currentBranch, findGitRoot } from "../connector/git.js";
4
3
  import { homeConfigPath, readHomeConfig, withHomeDir } from "../connector/home.js";
5
4
  import { findLinkedRepoRoot, readRepoConfig, repoConfigPath, } from "../connector/repo.js";
6
- import { isInstallSchemaStale, readGrounderState, statePath } from "../connector/state.js";
5
+ import { readGrounderState, statePath } from "../connector/state.js";
7
6
  import { isUnsupportedSchemaError } from "../connector/unsupported-schema.js";
8
7
  import { resolveLogsDir, resolveNotesDir, resolvePlansDir, resolveProjectVaultRoot, resolveVaultRoot, } from "../connector/vault.js";
9
8
  import { helpExitCode } from "../help.js";
10
9
  import { VERSION } from "../index.js";
10
+ import { flagBool, parseArgs } from "../util/parse-args.js";
11
+ import { installDriftDetected } from "./install-drift.js";
11
12
  import { writeSection } from "./output.js";
12
13
  import { packageVersionNotice } from "./package-version-notice.js";
13
14
  const LABEL_WIDTH = 12;
@@ -17,32 +18,13 @@ const REPO_INIT_FORCE = "grounder link --force";
17
18
  const MIGRATE = "grounder migrate";
18
19
  const MIGRATE_FORCE = "grounder migrate --force";
19
20
  const UPGRADE_GROUNDER = "upgrade grounder";
21
+ const USAGE = "Usage: grounder status [--json]\n";
20
22
  function statusLine(label, value) {
21
23
  return ` ${label.padEnd(LABEL_WIDTH)}${value}\n`;
22
24
  }
23
- /**
24
- * `findLinkedRepoRoot` walks up to the nearest `.grounder.json`, so a
25
- * subdirectory of a linked repo inherits that link. Surface it explicitly
26
- * when `linkedRoot` isn't `cwd` itself, so callers (agents included) don't
27
- * mistake an ancestor's link for this exact folder being linked.
28
- */
29
- function writeAncestorNoteIfAny(cwd, linkedRoot) {
30
- if (linkedRoot === cwd) {
31
- return;
32
- }
33
- process.stdout.write(statusLine("Note:", `linked ancestor — ${cwd} itself is unlinked; grounder link here would create a separate project`));
34
- }
35
25
  function errorDetail(error) {
36
26
  return error instanceof Error ? error.message : String(error);
37
27
  }
38
- async function writeGitLine(gitRoot) {
39
- if (!gitRoot) {
40
- return;
41
- }
42
- const branch = await currentBranch(gitRoot);
43
- const gitValue = branch !== undefined ? `${gitRoot} (branch: ${branch})` : gitRoot;
44
- process.stdout.write(statusLine("Git:", gitValue));
45
- }
46
28
  async function tryReadHome() {
47
29
  try {
48
30
  return { home: await readHomeConfig(), invalid: null };
@@ -63,91 +45,290 @@ async function tryReadRepo(linkedRoot) {
63
45
  };
64
46
  }
65
47
  }
66
- async function writeInstallStateLine(homeDir) {
48
+ async function gatherStateInfo(homeDir) {
67
49
  try {
68
50
  const state = await readGrounderState(homeDir);
69
51
  if (!state) {
70
- process.stdout.write(statusLine("State:", `missing → ${MIGRATE_FORCE}`));
71
- return;
72
- }
73
- process.stdout.write(statusLine("State:", statePath(homeDir)));
74
- const packageNotice = packageVersionNotice(VERSION, state.grounderVersion);
75
- if (packageNotice) {
76
- process.stdout.write(statusLine("Package:", packageNotice.status));
77
- }
78
- if (isInstallSchemaStale(state, ALL_AGENTS)) {
79
- process.stdout.write(statusLine("Schemas:", `ledger stale → ${MIGRATE}`));
80
- }
81
- else {
82
- process.stdout.write(statusLine("Schemas:", "current"));
52
+ return {
53
+ path: statePath(homeDir),
54
+ status: "missing",
55
+ packageNotice: null,
56
+ installCurrent: null,
57
+ };
83
58
  }
59
+ const notice = packageVersionNotice(VERSION, state.grounderVersion);
60
+ const drift = await installDriftDetected(state, homeDir);
61
+ return {
62
+ path: statePath(homeDir),
63
+ status: "ok",
64
+ packageNotice: notice,
65
+ installCurrent: !drift,
66
+ };
84
67
  }
85
- catch {
68
+ catch (error) {
69
+ return {
70
+ path: statePath(homeDir),
71
+ status: isUnsupportedSchemaError(error) ? "unsupported" : "invalid",
72
+ packageNotice: null,
73
+ installCurrent: null,
74
+ };
75
+ }
76
+ }
77
+ async function gatherMachine(homeInvalid, home, homeDir) {
78
+ const configPath = homeConfigPath(homeDir);
79
+ if (homeInvalid) {
80
+ return { configPath, configState: "invalid", vaultRoot: null, state: null };
81
+ }
82
+ if (!home) {
83
+ return { configPath, configState: "missing", vaultRoot: null, state: null };
84
+ }
85
+ return {
86
+ configPath,
87
+ configState: "ok",
88
+ vaultRoot: resolveVaultRoot(home),
89
+ state: await gatherStateInfo(homeDir),
90
+ };
91
+ }
92
+ async function gatherGit(gitRoot) {
93
+ if (!gitRoot) {
94
+ return null;
95
+ }
96
+ const branch = await currentBranch(gitRoot);
97
+ return { root: gitRoot, branch: branch ?? null };
98
+ }
99
+ async function gatherProject(params) {
100
+ const { cwd, gitRoot, linkedRoot, repo, repoInvalid, repoUnsupported, home } = params;
101
+ if (!linkedRoot) {
102
+ return {
103
+ linked: false,
104
+ folder: null,
105
+ isAncestorLink: false,
106
+ configPath: null,
107
+ configState: "missing",
108
+ projectId: null,
109
+ vaultRoot: null,
110
+ notesDir: null,
111
+ logsDir: null,
112
+ plansDir: null,
113
+ git: null,
114
+ };
115
+ }
116
+ const git = await gatherGit(gitRoot);
117
+ const isAncestorLink = linkedRoot !== cwd;
118
+ const configPath = repoConfigPath(linkedRoot);
119
+ if (repoInvalid || !repo) {
120
+ const configState = repoUnsupported
121
+ ? "unsupported"
122
+ : repoInvalid
123
+ ? "invalid"
124
+ : "missing";
125
+ return {
126
+ linked: true,
127
+ folder: linkedRoot,
128
+ isAncestorLink,
129
+ configPath,
130
+ configState,
131
+ projectId: null,
132
+ vaultRoot: null,
133
+ notesDir: null,
134
+ logsDir: null,
135
+ plansDir: null,
136
+ git,
137
+ };
138
+ }
139
+ return {
140
+ linked: true,
141
+ folder: linkedRoot,
142
+ isAncestorLink,
143
+ configPath,
144
+ configState: "ok",
145
+ projectId: repo.projectId,
146
+ vaultRoot: home ? resolveProjectVaultRoot(home, repo) : null,
147
+ notesDir: home ? resolveNotesDir(home, repo) : null,
148
+ logsDir: home ? resolveLogsDir(home, repo) : null,
149
+ plansDir: home ? resolvePlansDir(home, repo) : null,
150
+ git,
151
+ };
152
+ }
153
+ async function gatherStatus(options) {
154
+ const cwd = path.resolve(options.cwd ?? process.cwd());
155
+ const { home, invalid: homeInvalid } = await tryReadHome();
156
+ const gitRoot = await findGitRoot(cwd);
157
+ const linkedRoot = await findLinkedRepoRoot(cwd, gitRoot);
158
+ const { repo, invalid: repoInvalid, unsupported: repoUnsupported, } = linkedRoot
159
+ ? await tryReadRepo(linkedRoot)
160
+ : { repo: null, invalid: null, unsupported: false };
161
+ const machine = await gatherMachine(homeInvalid, home, options.homeDir);
162
+ const project = await gatherProject({
163
+ cwd,
164
+ gitRoot,
165
+ linkedRoot,
166
+ repo,
167
+ repoInvalid,
168
+ repoUnsupported,
169
+ home,
170
+ });
171
+ return { cwd, machine, project };
172
+ }
173
+ /**
174
+ * `findLinkedRepoRoot` walks up to the nearest `.grounder.json`, so a
175
+ * subdirectory of a linked repo inherits that link. Surface it explicitly
176
+ * when `linkedRoot` isn't `cwd` itself, so callers (agents included) don't
177
+ * mistake an ancestor's link for this exact folder being linked.
178
+ */
179
+ function writeAncestorNoteIfAny(cwd, folder) {
180
+ if (folder === cwd) {
181
+ return;
182
+ }
183
+ process.stdout.write(statusLine("Note:", `linked ancestor — ${cwd} itself is unlinked; grounder link here would create a separate project`));
184
+ }
185
+ function writeGitLine(git) {
186
+ if (!git) {
187
+ return;
188
+ }
189
+ const value = git.branch !== null ? `${git.root} (branch: ${git.branch})` : git.root;
190
+ process.stdout.write(statusLine("Git:", value));
191
+ }
192
+ function writeStateLines(state) {
193
+ if (state.status === "missing") {
194
+ process.stdout.write(statusLine("State:", `missing → ${MIGRATE_FORCE}`));
195
+ return;
196
+ }
197
+ if (state.status === "unsupported") {
198
+ process.stdout.write(statusLine("State:", `unsupported → ${UPGRADE_GROUNDER}`));
199
+ return;
200
+ }
201
+ if (state.status === "invalid") {
86
202
  process.stdout.write(statusLine("State:", `invalid → ${MIGRATE_FORCE}`));
203
+ return;
204
+ }
205
+ process.stdout.write(statusLine("State:", state.path));
206
+ if (state.packageNotice) {
207
+ process.stdout.write(statusLine("Package:", state.packageNotice.status));
87
208
  }
209
+ process.stdout.write(statusLine("Install:", state.installCurrent ? "current" : `outdated → ${MIGRATE}`));
210
+ }
211
+ function writeTextOutput(status) {
212
+ const { cwd, machine, project } = status;
213
+ writeSection("Machine");
214
+ if (machine.configState === "invalid") {
215
+ process.stdout.write(statusLine("Config:", `invalid → ${VAULT_INIT}`));
216
+ }
217
+ else if (machine.configState === "missing") {
218
+ process.stdout.write(statusLine("Config:", `missing → ${VAULT_INIT}`));
219
+ }
220
+ else {
221
+ process.stdout.write(statusLine("Config:", machine.configPath));
222
+ process.stdout.write(statusLine("Vault:", machine.vaultRoot));
223
+ writeStateLines(machine.state);
224
+ }
225
+ process.stdout.write("\n");
226
+ writeSection("Project");
227
+ if (!project.linked) {
228
+ process.stdout.write(statusLine("Linked:", "no"));
229
+ if (machine.configState === "ok") {
230
+ process.stdout.write(statusLine("Config:", `missing → ${REPO_INIT}`));
231
+ }
232
+ return;
233
+ }
234
+ const folder = project.folder;
235
+ if (project.configState !== "ok") {
236
+ const fix = project.configState === "unsupported"
237
+ ? UPGRADE_GROUNDER
238
+ : machine.configState === "ok"
239
+ ? REPO_INIT_FORCE
240
+ : VAULT_INIT;
241
+ process.stdout.write(statusLine("Linked:", project.configState === "unsupported" ? `unsupported → ${fix}` : `incomplete → ${fix}`));
242
+ process.stdout.write(statusLine("Folder:", folder));
243
+ writeAncestorNoteIfAny(cwd, folder);
244
+ process.stdout.write(statusLine("Config:", project.configState === "unsupported"
245
+ ? `unsupported → ${UPGRADE_GROUNDER}`
246
+ : project.configState === "invalid"
247
+ ? `invalid → ${REPO_INIT_FORCE}`
248
+ : `missing → ${REPO_INIT}`));
249
+ writeGitLine(project.git);
250
+ return;
251
+ }
252
+ process.stdout.write(statusLine("Linked:", "yes"));
253
+ process.stdout.write(statusLine("Folder:", folder));
254
+ writeAncestorNoteIfAny(cwd, folder);
255
+ process.stdout.write(statusLine("Config:", project.configPath));
256
+ process.stdout.write(statusLine("Id:", project.projectId));
257
+ if (project.notesDir) {
258
+ process.stdout.write(statusLine("In Vault:", project.vaultRoot));
259
+ process.stdout.write(statusLine("Notes:", project.notesDir));
260
+ process.stdout.write(statusLine("Logs:", project.logsDir));
261
+ process.stdout.write(statusLine("Plans:", project.plansDir));
262
+ }
263
+ writeGitLine(project.git);
264
+ }
265
+ /**
266
+ * Bump whenever `writeJsonOutput`'s payload shape changes (fields added,
267
+ * removed, or renamed) — consumers (the VS Code extension's `status.ts`)
268
+ * compare this directly instead of inferring compatibility structurally.
269
+ */
270
+ export const STATUS_JSON_SCHEMA_VERSION = 1;
271
+ function writeJsonOutput(status) {
272
+ const { machine, project } = status;
273
+ const payload = {
274
+ schemaVersion: STATUS_JSON_SCHEMA_VERSION,
275
+ machine: {
276
+ configPath: machine.configPath,
277
+ configState: machine.configState,
278
+ vaultRoot: machine.vaultRoot,
279
+ state: machine.state
280
+ ? {
281
+ path: machine.state.path,
282
+ status: machine.state.status,
283
+ packageVersionNotice: machine.state.packageNotice?.message ?? null,
284
+ installCurrent: machine.state.installCurrent,
285
+ }
286
+ : null,
287
+ },
288
+ project: {
289
+ linked: project.linked,
290
+ folder: project.folder,
291
+ isAncestorLink: project.isAncestorLink,
292
+ configPath: project.configPath,
293
+ configState: project.configState,
294
+ projectId: project.projectId,
295
+ vaultRoot: project.vaultRoot,
296
+ notesDir: project.notesDir,
297
+ logsDir: project.logsDir,
298
+ plansDir: project.plansDir,
299
+ git: project.git,
300
+ },
301
+ };
302
+ process.stdout.write(`${JSON.stringify(payload)}\n`);
88
303
  }
89
304
  export async function runStatus(argv) {
90
305
  const helpCode = helpExitCode(argv, "status");
91
306
  if (helpCode !== null) {
92
307
  return helpCode;
93
308
  }
94
- return runStatusWithOptions({});
309
+ const { positional, flags } = parseArgs(argv);
310
+ if (positional.length > 0) {
311
+ process.stderr.write(USAGE);
312
+ return 1;
313
+ }
314
+ const allowedFlags = new Set(["json"]);
315
+ for (const key of flags.keys()) {
316
+ if (!allowedFlags.has(key)) {
317
+ process.stderr.write(USAGE);
318
+ return 1;
319
+ }
320
+ }
321
+ return runStatusWithOptions({ json: flagBool(flags, "json") });
95
322
  }
96
323
  export async function runStatusWithOptions(options = {}) {
97
324
  return withHomeDir(options.homeDir, async () => {
98
- const cwd = path.resolve(options.cwd ?? process.cwd());
99
- const { home, invalid: homeInvalid } = await tryReadHome();
100
- const gitRoot = await findGitRoot(cwd);
101
- const linkedRoot = await findLinkedRepoRoot(cwd, gitRoot);
102
- const { repo, invalid: repoInvalid, unsupported: repoUnsupported, } = linkedRoot
103
- ? await tryReadRepo(linkedRoot)
104
- : { repo: null, invalid: null, unsupported: false };
105
- writeSection("Machine");
106
- if (homeInvalid) {
107
- process.stdout.write(statusLine("Config:", `invalid → ${VAULT_INIT}`));
108
- }
109
- else if (!home) {
110
- process.stdout.write(statusLine("Config:", `missing → ${VAULT_INIT}`));
325
+ const status = await gatherStatus(options);
326
+ if (options.json) {
327
+ writeJsonOutput(status);
111
328
  }
112
329
  else {
113
- process.stdout.write(statusLine("Config:", homeConfigPath()));
114
- process.stdout.write(statusLine("Vault:", resolveVaultRoot(home)));
115
- await writeInstallStateLine(options.homeDir);
116
- }
117
- process.stdout.write("\n");
118
- writeSection("Project");
119
- if (!linkedRoot) {
120
- process.stdout.write(statusLine("Linked:", "no"));
121
- if (home) {
122
- process.stdout.write(statusLine("Config:", `missing → ${REPO_INIT}`));
123
- }
124
- return 0;
125
- }
126
- if (repoInvalid || !repo) {
127
- const fix = repoUnsupported ? UPGRADE_GROUNDER : home ? REPO_INIT_FORCE : VAULT_INIT;
128
- process.stdout.write(statusLine("Linked:", repoUnsupported ? `unsupported → ${fix}` : `incomplete → ${fix}`));
129
- process.stdout.write(statusLine("Folder:", linkedRoot));
130
- writeAncestorNoteIfAny(cwd, linkedRoot);
131
- process.stdout.write(statusLine("Config:", repoUnsupported
132
- ? `unsupported → ${UPGRADE_GROUNDER}`
133
- : repoInvalid
134
- ? `invalid → ${REPO_INIT_FORCE}`
135
- : `missing → ${REPO_INIT}`));
136
- await writeGitLine(gitRoot);
137
- return 0;
138
- }
139
- process.stdout.write(statusLine("Linked:", "yes"));
140
- process.stdout.write(statusLine("Folder:", linkedRoot));
141
- writeAncestorNoteIfAny(cwd, linkedRoot);
142
- process.stdout.write(statusLine("Config:", repoConfigPath(linkedRoot)));
143
- process.stdout.write(statusLine("Id:", repo.projectId));
144
- if (home) {
145
- process.stdout.write(statusLine("Project Vault Root:", resolveProjectVaultRoot(home, repo)));
146
- process.stdout.write(statusLine("Notes:", resolveNotesDir(home, repo)));
147
- process.stdout.write(statusLine("Logs:", resolveLogsDir(home, repo)));
148
- process.stdout.write(statusLine("Plans:", resolvePlansDir(home, repo)));
330
+ writeTextOutput(status);
149
331
  }
150
- await writeGitLine(gitRoot);
151
332
  return 0;
152
333
  });
153
334
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * `state.json`'s own on-disk shape versioning — separate from install-content
3
+ * drift (skill files, hooks), which the reconciler already owns. Bump
4
+ * `LEDGER_SCHEMA` and add one `upgradeFromN` step whenever the file's shape
5
+ * itself changes; `readGrounderState` (in `state.ts`) is the only caller.
6
+ *
7
+ * No file I/O in this module. Every upgrade step takes raw untyped JSON in
8
+ * and returns the next version's raw JSON out — never `GrounderState`
9
+ * mid-chain, so a step can't accidentally assume a field the target shape
10
+ * doesn't have yet.
11
+ */
12
+ /** Bumped only when `state.json`'s own on-disk shape changes (not install content). */
13
+ export declare const LEDGER_SCHEMA = 1;
14
+ /** Oldest on-disk shape this binary can still upgrade from — the pre-rewrite shape
15
+ * (no `ledgerSchema` field, `commandsSchema`/`hooksSchema` instead of `hooksEnabled`)
16
+ * is the only one that has ever existed on disk. */
17
+ export declare const MIN_SUPPORTED_LEDGER_SCHEMA = 0;
18
+ export type LedgerUpgradeStep = (raw: Record<string, unknown>) => Record<string, unknown>;
19
+ export type LedgerUpgradeTable = Record<number, LedgerUpgradeStep>;
20
+ /**
21
+ * Schema 0 → 1: drop `commandsSchema` (no replacement) and fold `hooksSchema` into
22
+ * `hooksEnabled` — a positive `hooksSchema` (hooks were actually installed) maps to
23
+ * `true`; `hooksSchema: 0`, an absent `hooksSchema`, or a non-numeric value all leave
24
+ * `hooksEnabled` unset. `0` deliberately does NOT map to `false`: `false` means an
25
+ * explicit `--no-hooks` opt-out, a flag that didn't exist in v0.5.0, so there's no v0.5.0
26
+ * ledger state that should ever produce it — mapping `0` to `false` would turn a machine
27
+ * that simply never installed hooks into a sticky opt-out, silencing `shouldInstallHooks`'s
28
+ * on-disk-recognizer fallback for it forever. (In practice v0.5.0's writer only ever
29
+ * persisted `hooksSchema` as the installed schema constant or omitted it entirely, so `0`
30
+ * likely never hit a real ledger — this is a correctness fix for the mapping, not a
31
+ * reaction to an observed bad value.) No `hooksEnabled`-already-present case: `hooksEnabled`
32
+ * didn't exist before schema 1, so a schema-0 file (v0.5.0, the only released shape without
33
+ * `ledgerSchema`) can never carry it.
34
+ */
35
+ export declare function upgradeFrom0(raw: Record<string, unknown>): Record<string, unknown>;
36
+ /** One entry per version below `LEDGER_SCHEMA` — not a stub per hypothetical future version. */
37
+ export declare const REAL_LEDGER_UPGRADE_TABLE: LedgerUpgradeTable;
38
+ /**
39
+ * Walk `raw` from schema `from` up to (not including) `target`, one step per
40
+ * version. The walker owns the version counter — it stamps `v + 1` onto the
41
+ * result after each step runs, rather than trusting each step to bump it
42
+ * itself, so a step that forgets to would never cause an infinite loop here.
43
+ *
44
+ * A missing table entry or a step that throws both surface as the same
45
+ * invalid-state `Error` family the rest of `readGrounderState` uses — never a
46
+ * bare `TypeError` escaping a read.
47
+ *
48
+ * Test-only entry point for exercising multi-step chaining against a fake
49
+ * table, without bumping production `LEDGER_SCHEMA` just to test it.
50
+ * Production reads should use `applyLedgerUpgrades`.
51
+ */
52
+ export declare function applyLedgerUpgradeTable(raw: Record<string, unknown>, from: number, table: LedgerUpgradeTable, target: number): Record<string, unknown>;
53
+ /** Production entry point — thin wrapper over `applyLedgerUpgradeTable` with the real table. */
54
+ export declare function applyLedgerUpgrades(raw: Record<string, unknown>, from: number): Record<string, unknown>;
55
+ //# sourceMappingURL=ledger-migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-migrations.d.ts","sourceRoot":"","sources":["../../src/connector/ledger-migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,uFAAuF;AACvF,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B;;oDAEoD;AACpD,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1F,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAWnE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBlF;AAED,gGAAgG;AAChG,eAAO,MAAM,yBAAyB,EAAE,kBAEvC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBzB;AAED,gGAAgG;AAChG,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * `state.json`'s own on-disk shape versioning — separate from install-content
3
+ * drift (skill files, hooks), which the reconciler already owns. Bump
4
+ * `LEDGER_SCHEMA` and add one `upgradeFromN` step whenever the file's shape
5
+ * itself changes; `readGrounderState` (in `state.ts`) is the only caller.
6
+ *
7
+ * No file I/O in this module. Every upgrade step takes raw untyped JSON in
8
+ * and returns the next version's raw JSON out — never `GrounderState`
9
+ * mid-chain, so a step can't accidentally assume a field the target shape
10
+ * doesn't have yet.
11
+ */
12
+ /** Bumped only when `state.json`'s own on-disk shape changes (not install content). */
13
+ export const LEDGER_SCHEMA = 1;
14
+ /** Oldest on-disk shape this binary can still upgrade from — the pre-rewrite shape
15
+ * (no `ledgerSchema` field, `commandsSchema`/`hooksSchema` instead of `hooksEnabled`)
16
+ * is the only one that has ever existed on disk. */
17
+ export const MIN_SUPPORTED_LEDGER_SCHEMA = 0;
18
+ /**
19
+ * Schema 0 → 1: drop `commandsSchema` (no replacement) and fold `hooksSchema` into
20
+ * `hooksEnabled` — a positive `hooksSchema` (hooks were actually installed) maps to
21
+ * `true`; `hooksSchema: 0`, an absent `hooksSchema`, or a non-numeric value all leave
22
+ * `hooksEnabled` unset. `0` deliberately does NOT map to `false`: `false` means an
23
+ * explicit `--no-hooks` opt-out, a flag that didn't exist in v0.5.0, so there's no v0.5.0
24
+ * ledger state that should ever produce it — mapping `0` to `false` would turn a machine
25
+ * that simply never installed hooks into a sticky opt-out, silencing `shouldInstallHooks`'s
26
+ * on-disk-recognizer fallback for it forever. (In practice v0.5.0's writer only ever
27
+ * persisted `hooksSchema` as the installed schema constant or omitted it entirely, so `0`
28
+ * likely never hit a real ledger — this is a correctness fix for the mapping, not a
29
+ * reaction to an observed bad value.) No `hooksEnabled`-already-present case: `hooksEnabled`
30
+ * didn't exist before schema 1, so a schema-0 file (v0.5.0, the only released shape without
31
+ * `ledgerSchema`) can never carry it.
32
+ */
33
+ export function upgradeFrom0(raw) {
34
+ const rawAgents = raw.agents;
35
+ if (!rawAgents || typeof rawAgents !== "object" || Array.isArray(rawAgents)) {
36
+ return raw;
37
+ }
38
+ const agents = {};
39
+ for (const [id, entry] of Object.entries(rawAgents)) {
40
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
41
+ agents[id] = entry;
42
+ continue;
43
+ }
44
+ const e = entry;
45
+ const hooksEnabled = typeof e.hooksSchema === "number" && e.hooksSchema > 0 ? true : undefined;
46
+ agents[id] = {
47
+ files: e.files,
48
+ ...(hooksEnabled !== undefined ? { hooksEnabled } : {}),
49
+ };
50
+ }
51
+ return { ...raw, agents };
52
+ }
53
+ /** One entry per version below `LEDGER_SCHEMA` — not a stub per hypothetical future version. */
54
+ export const REAL_LEDGER_UPGRADE_TABLE = {
55
+ 0: upgradeFrom0,
56
+ };
57
+ /**
58
+ * Walk `raw` from schema `from` up to (not including) `target`, one step per
59
+ * version. The walker owns the version counter — it stamps `v + 1` onto the
60
+ * result after each step runs, rather than trusting each step to bump it
61
+ * itself, so a step that forgets to would never cause an infinite loop here.
62
+ *
63
+ * A missing table entry or a step that throws both surface as the same
64
+ * invalid-state `Error` family the rest of `readGrounderState` uses — never a
65
+ * bare `TypeError` escaping a read.
66
+ *
67
+ * Test-only entry point for exercising multi-step chaining against a fake
68
+ * table, without bumping production `LEDGER_SCHEMA` just to test it.
69
+ * Production reads should use `applyLedgerUpgrades`.
70
+ */
71
+ export function applyLedgerUpgradeTable(raw, from, table, target) {
72
+ let current = raw;
73
+ for (let v = from; v < target; v++) {
74
+ const step = table[v];
75
+ if (!step) {
76
+ throw new Error(`Invalid grounder state: no ledger upgrade from schema ${v}`);
77
+ }
78
+ let next;
79
+ try {
80
+ next = step(current);
81
+ }
82
+ catch (error) {
83
+ const detail = error instanceof Error ? error.message : String(error);
84
+ throw new Error(`Invalid grounder state: ledger upgrade from schema ${v} failed: ${detail}`);
85
+ }
86
+ current = { ...next, ledgerSchema: v + 1 };
87
+ }
88
+ return current;
89
+ }
90
+ /** Production entry point — thin wrapper over `applyLedgerUpgradeTable` with the real table. */
91
+ export function applyLedgerUpgrades(raw, from) {
92
+ return applyLedgerUpgradeTable(raw, from, REAL_LEDGER_UPGRADE_TABLE, LEDGER_SCHEMA);
93
+ }
94
+ //# sourceMappingURL=ledger-migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-migrations.js","sourceRoot":"","sources":["../../src/connector/ledger-migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,uFAAuF;AACvF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAE/B;;oDAEoD;AACpD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAc7C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,GAA4B;IACvD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7B,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAoC,CAAC,EAAE,CAAC;QAC/E,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;YACnB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,KAAwB,CAAC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,MAAM,CAAC,EAAE,CAAC,GAAG;YACX,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,MAAM,yBAAyB,GAAuB;IAC3D,CAAC,EAAE,YAAY;CAChB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CACrC,GAA4B,EAC5B,IAAY,EACZ,KAAyB,EACzB,MAAc;IAEd,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,IAA6B,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,mBAAmB,CACjC,GAA4B,EAC5B,IAAY;IAEZ,OAAO,uBAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,yBAAyB,EAAE,aAAa,CAAC,CAAC;AACtF,CAAC"}