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,15 +1,22 @@
1
1
  import path from "node:path";
2
+ import { ALL_AGENTS } from "../agents/index.js";
2
3
  import { currentBranch, findGitRoot } from "../connector/git.js";
3
4
  import { homeConfigPath, readHomeConfig, withHomeDir } from "../connector/home.js";
4
5
  import { findLinkedRepoRoot, readRepoConfig, repoConfigPath, } from "../connector/repo.js";
5
- import { resolveLogsDir, resolveNotesDir, resolveVaultRoot } from "../connector/vault.js";
6
+ import { isInstallSchemaStale, readGrounderState, statePath } from "../connector/state.js";
7
+ import { isUnsupportedSchemaError } from "../connector/unsupported-schema.js";
8
+ import { resolveLogsDir, resolveNotesDir, resolvePlansDir, resolveVaultRoot, } from "../connector/vault.js";
9
+ import { helpExitCode } from "../help.js";
10
+ import { VERSION } from "../index.js";
11
+ import { writeSection } from "./output.js";
12
+ import { packageVersionNotice } from "./package-version-notice.js";
6
13
  const LABEL_WIDTH = 12;
7
14
  const VAULT_INIT = "grounder vault init <path>";
8
15
  const REPO_INIT = "grounder init";
9
16
  const REPO_INIT_FORCE = "grounder init --force";
10
- function section(title) {
11
- return `${title}\n`;
12
- }
17
+ const MIGRATE = "grounder migrate";
18
+ const MIGRATE_FORCE = "grounder migrate --force";
19
+ const UPGRADE_GROUNDER = "upgrade grounder";
13
20
  function statusLine(label, value) {
14
21
  return ` ${label.padEnd(LABEL_WIDTH)}${value}\n`;
15
22
  }
@@ -34,13 +41,44 @@ async function tryReadHome() {
34
41
  }
35
42
  async function tryReadRepo(linkedRoot) {
36
43
  try {
37
- return { repo: await readRepoConfig(linkedRoot), invalid: null };
44
+ return { repo: await readRepoConfig(linkedRoot), invalid: null, unsupported: false };
38
45
  }
39
46
  catch (error) {
40
- return { repo: null, invalid: errorDetail(error) };
47
+ return {
48
+ repo: null,
49
+ invalid: errorDetail(error),
50
+ unsupported: isUnsupportedSchemaError(error),
51
+ };
41
52
  }
42
53
  }
43
- export async function runStatus(_argv) {
54
+ async function writeInstallStateLine(homeDir) {
55
+ try {
56
+ const state = await readGrounderState(homeDir);
57
+ if (!state) {
58
+ process.stdout.write(statusLine("State:", `missing → ${MIGRATE_FORCE}`));
59
+ return;
60
+ }
61
+ process.stdout.write(statusLine("State:", statePath(homeDir)));
62
+ const packageNotice = packageVersionNotice(VERSION, state.grounderVersion);
63
+ if (packageNotice) {
64
+ process.stdout.write(statusLine("Package:", packageNotice.status));
65
+ }
66
+ if (isInstallSchemaStale(state, ALL_AGENTS)) {
67
+ process.stdout.write(statusLine("Schemas:", `ledger stale → ${MIGRATE}`));
68
+ }
69
+ else {
70
+ process.stdout.write(statusLine("Schemas:", "current"));
71
+ }
72
+ }
73
+ catch {
74
+ process.stdout.write(statusLine("State:", `invalid → ${MIGRATE_FORCE}`));
75
+ }
76
+ }
77
+ export async function runStatus(argv) {
78
+ const helpCode = helpExitCode(argv, "status");
79
+ if (helpCode !== null) {
80
+ return helpCode;
81
+ }
44
82
  return runStatusWithOptions({});
45
83
  }
46
84
  export async function runStatusWithOptions(options = {}) {
@@ -49,39 +87,44 @@ export async function runStatusWithOptions(options = {}) {
49
87
  const { home, invalid: homeInvalid } = await tryReadHome();
50
88
  const gitRoot = await findGitRoot(cwd);
51
89
  const linkedRoot = await findLinkedRepoRoot(cwd, gitRoot);
52
- const { repo, invalid: repoInvalid } = linkedRoot
90
+ const { repo, invalid: repoInvalid, unsupported: repoUnsupported, } = linkedRoot
53
91
  ? await tryReadRepo(linkedRoot)
54
- : { repo: null, invalid: null };
55
- process.stdout.write(section("Machine"));
92
+ : { repo: null, invalid: null, unsupported: false };
93
+ writeSection("Machine");
56
94
  if (homeInvalid) {
57
- process.stdout.write(statusLine("Config:", `invalid → run: ${VAULT_INIT}`));
95
+ process.stdout.write(statusLine("Config:", `invalid → ${VAULT_INIT}`));
58
96
  }
59
97
  else if (!home) {
60
- process.stdout.write(statusLine("Config:", `missing → run: ${VAULT_INIT}`));
98
+ process.stdout.write(statusLine("Config:", `missing → ${VAULT_INIT}`));
61
99
  }
62
100
  else {
63
101
  process.stdout.write(statusLine("Config:", homeConfigPath()));
64
102
  process.stdout.write(statusLine("Vault:", resolveVaultRoot(home)));
103
+ await writeInstallStateLine(options.homeDir);
65
104
  }
66
105
  process.stdout.write("\n");
67
- process.stdout.write(section("Project"));
106
+ writeSection("Project");
68
107
  if (!linkedRoot) {
69
108
  process.stdout.write(statusLine("Linked:", "no"));
70
109
  if (home) {
71
- process.stdout.write(statusLine("Config:", `missing → run: ${REPO_INIT}`));
110
+ process.stdout.write(statusLine("Config:", `missing → ${REPO_INIT}`));
72
111
  }
73
112
  return 0;
74
113
  }
75
114
  if (repoInvalid || !repo) {
76
- const fix = home ? REPO_INIT_FORCE : VAULT_INIT;
77
- process.stdout.write(statusLine("Linked:", `incompleterun: ${fix}`));
115
+ const fix = repoUnsupported ? UPGRADE_GROUNDER : home ? REPO_INIT_FORCE : VAULT_INIT;
116
+ process.stdout.write(statusLine("Linked:", repoUnsupported ? `unsupported${fix}` : `incomplete → ${fix}`));
78
117
  process.stdout.write(statusLine("Folder:", linkedRoot));
79
- process.stdout.write(statusLine("Config:", repoInvalid ? `invalid → run: ${REPO_INIT_FORCE}` : `missing → run: ${REPO_INIT}`));
118
+ process.stdout.write(statusLine("Config:", repoUnsupported
119
+ ? `unsupported → ${UPGRADE_GROUNDER}`
120
+ : repoInvalid
121
+ ? `invalid → ${REPO_INIT_FORCE}`
122
+ : `missing → ${REPO_INIT}`));
80
123
  await writeGitLine(gitRoot);
81
124
  return 0;
82
125
  }
83
126
  if (!home) {
84
- process.stdout.write(statusLine("Linked:", `incomplete → run: ${VAULT_INIT}`));
127
+ process.stdout.write(statusLine("Linked:", `incomplete → ${VAULT_INIT}`));
85
128
  process.stdout.write(statusLine("Folder:", linkedRoot));
86
129
  process.stdout.write(statusLine("Config:", repoConfigPath(linkedRoot)));
87
130
  process.stdout.write(statusLine("Id:", repo.projectId));
@@ -94,6 +137,7 @@ export async function runStatusWithOptions(options = {}) {
94
137
  process.stdout.write(statusLine("Id:", repo.projectId));
95
138
  process.stdout.write(statusLine("Notes:", resolveNotesDir(home, repo)));
96
139
  process.stdout.write(statusLine("Logs:", resolveLogsDir(home, repo)));
140
+ process.stdout.write(statusLine("Plans:", resolvePlansDir(home, repo)));
97
141
  await writeGitLine(gitRoot);
98
142
  return 0;
99
143
  });
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAmB,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,EACL,kBAAkB,EAElB,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAO1F,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,UAAU,GAAG,4BAA4B,CAAC;AAChD,MAAM,SAAS,GAAG,eAAe,CAAC;AAClC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEhD,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,GAAG,KAAK,IAAI,CAAC;AACtB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,KAAa;IAC9C,OAAO,KAAK,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,KAAK,IAAI,CAAC;AACpD,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAsB;IAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,cAAc,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IACpF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,UAAkB;IAElB,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnE,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAe;IAC7C,OAAO,oBAAoB,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAAyB,EAAE;IACpE,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU;YAC/C,CAAC,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC;YAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAElC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACzC,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,kBAAkB,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;aAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,kBAAkB,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAEzC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YAClD,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,kBAAkB,SAAS,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC;YAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,qBAAqB,GAAG,EAAE,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,CACR,SAAS,EACT,WAAW,CAAC,CAAC,CAAC,kBAAkB,eAAe,EAAE,CAAC,CAAC,CAAC,kBAAkB,SAAS,EAAE,CAClF,CACF,CAAC;YACF,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,qBAAqB,UAAU,EAAE,CAAC,CAAC,CAAC;YAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACxD,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAE5B,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Stderr notice when the running Grounder version and the version stored for
3
+ * this machine's configuration disagree (ordered by version when both look like
4
+ * x.y.z). Prints on ordinary commands until migrate or vault init updates state.
5
+ * Silent if state is missing or broken. Skip for `handoff peek` (session hooks),
6
+ * `migrate`, and `vault init` (those update state themselves).
7
+ */
8
+ export declare function notifyUpgradeIfNeeded(homeDir?: string): Promise<void>;
9
+ //# sourceMappingURL=upgrade-banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-banner.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade-banner.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3E"}
@@ -0,0 +1,27 @@
1
+ import { readGrounderState } from "../connector/state.js";
2
+ import { VERSION } from "../index.js";
3
+ import { packageVersionNotice } from "./package-version-notice.js";
4
+ /**
5
+ * Stderr notice when the running Grounder version and the version stored for
6
+ * this machine's configuration disagree (ordered by version when both look like
7
+ * x.y.z). Prints on ordinary commands until migrate or vault init updates state.
8
+ * Silent if state is missing or broken. Skip for `handoff peek` (session hooks),
9
+ * `migrate`, and `vault init` (those update state themselves).
10
+ */
11
+ export async function notifyUpgradeIfNeeded(homeDir) {
12
+ try {
13
+ const state = await readGrounderState(homeDir);
14
+ if (!state) {
15
+ return;
16
+ }
17
+ const notice = packageVersionNotice(VERSION, state.grounderVersion);
18
+ if (!notice) {
19
+ return;
20
+ }
21
+ process.stderr.write(notice.banner);
22
+ }
23
+ catch {
24
+ // Missing/corrupt state — doctor covers diagnostics.
25
+ }
26
+ }
27
+ //# sourceMappingURL=upgrade-banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-banner.js","sourceRoot":"","sources":["../../src/commands/upgrade-banner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAgB;IAC1D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/vault/init.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBlE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuFxF"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/vault/init.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBlE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiExF"}
@@ -1,12 +1,18 @@
1
1
  import { mkdir } from "node:fs/promises";
2
- import { installHookRuntime, runtimeCliPath } from "../../agents/hook-runtime.js";
2
+ import { runtimeCliPath } from "../../agents/hook-runtime.js";
3
3
  import { resolveAgents } from "../../agents/index.js";
4
4
  import { homeConfigPath, readHomeConfig, withHomeDir, writeHomeConfig, } from "../../connector/home.js";
5
+ import { helpExitCode } from "../../help.js";
5
6
  import { flagBool, flagStrings, parseArgs } from "../../util/parse-args.js";
6
7
  import { resolveUserPath } from "../../util/path.js";
7
8
  import { confirm } from "../../util/prompt.js";
8
9
  import { projectsParent } from "../../vault/layout.js";
10
+ import { applyAgentInstalls } from "../apply-agent-installs.js";
9
11
  export async function runVaultInit(argv) {
12
+ const helpCode = helpExitCode(argv, "vault init");
13
+ if (helpCode !== null) {
14
+ return helpCode;
15
+ }
10
16
  const { positional, flags, repeated } = parseArgs(argv);
11
17
  const vaultPathArg = positional[0];
12
18
  const yes = flagBool(flags, "yes", "y");
@@ -43,13 +49,14 @@ export async function runVaultInitWithOptions(options) {
43
49
  process.stdout.write("Will write:\n");
44
50
  process.stdout.write(` home ${homeConfigPath(homeDir)}\n`);
45
51
  process.stdout.write(" vault 10-Projects/ (if missing)\n");
46
- const hookAgents = hooks ? agents.filter((agent) => agent.installHooks) : [];
47
- if (hookAgents.length > 0) {
48
- // Shared across agents — list once (not under each adapter).
52
+ if (agents.length > 0) {
53
+ // Shared across agents (slash commands + optional hooks) — list once.
49
54
  process.stdout.write(` grounder runtime ${runtimeCliPath(homeDir)}\n`);
50
55
  }
51
56
  for (const agent of agents) {
52
- process.stdout.write(` ${agent.id.padEnd(8)} (${agent.name} artifacts)\n`);
57
+ for (const artifactPath of agent.expectedArtifacts(homeDir)) {
58
+ process.stdout.write(` ${agent.id.padEnd(8)} ${artifactPath}\n`);
59
+ }
53
60
  if (hooks && agent.expectedHookArtifacts) {
54
61
  for (const hookPath of agent.expectedHookArtifacts(homeDir)) {
55
62
  process.stdout.write(` ${agent.id.padEnd(8)} hook ${hookPath}\n`);
@@ -71,30 +78,12 @@ export async function runVaultInitWithOptions(options) {
71
78
  await mkdir(projectsDir, { recursive: true });
72
79
  process.stdout.write("✓ Wrote home config\n");
73
80
  process.stdout.write(`✓ Vault scaffold: ${projectsDir}\n`);
74
- if (hookAgents.length > 0) {
75
- const runtime = await installHookRuntime({ homeDir });
76
- const runtimeLabel = runtime.status === "skipped"
77
- ? "already exists (skipped)"
78
- : `installed (${runtime.mode}): ${runtime.cliPath}`;
79
- process.stdout.write(`✓ Grounder hook runtime ${runtimeLabel}\n`);
80
- }
81
- for (const agent of agents) {
82
- const result = await agent.install({ force, homeDir });
83
- for (const [artifactPath, status] of Object.entries(result.artifacts)) {
84
- const label = status === "skipped" ? "already exists (skipped)" : `installed: ${artifactPath}`;
85
- process.stdout.write(`✓ ${agent.name} command ${label}\n`);
86
- }
87
- if (Object.keys(result.artifacts).length === 0) {
88
- process.stdout.write(`✓ ${agent.name}: no artifacts to install yet\n`);
89
- }
90
- if (hooks && agent.installHooks) {
91
- const hookResult = await agent.installHooks({ force, homeDir });
92
- for (const [artifactPath, status] of Object.entries(hookResult.artifacts)) {
93
- const label = status === "skipped" ? "already exists (skipped)" : `installed: ${artifactPath}`;
94
- process.stdout.write(`✓ ${agent.name} hook ${label}\n`);
95
- }
96
- }
97
- }
81
+ await applyAgentInstalls({
82
+ agents,
83
+ force,
84
+ hooks,
85
+ homeDir,
86
+ });
98
87
  return 0;
99
88
  });
100
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/vault/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/vault/init.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ export interface RepoConfig {
2
2
  version: 1;
3
3
  projectId: string;
4
4
  }
5
+ /** Bump when `.grounder.json` shape changes; older binaries hard-stop on higher. */
6
+ export declare const SUPPORTED_REPO_VERSION: 1;
5
7
  export declare function repoConfigPath(repoRoot: string): string;
6
8
  export declare function findLinkedRepoRoot(cwd: string, gitRoot?: string | null): Promise<string | null>;
7
9
  export declare function readRepoConfig(repoRoot: string): Promise<RepoConfig | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/connector/repo.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,GAAG,IAAW,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAYjF;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzF"}
1
+ {"version":3,"file":"repo.d.ts","sourceRoot":"","sources":["../../src/connector/repo.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oFAAoF;AACpF,eAAO,MAAM,sBAAsB,EAAG,CAAU,CAAC;AAIjD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,GAAG,IAAW,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAwBjF;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzF"}
@@ -1,6 +1,9 @@
1
1
  import { readFile, writeFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { fileExists } from "../util/fs.js";
4
+ import { UnsupportedSchemaError } from "./unsupported-schema.js";
5
+ /** Bump when `.grounder.json` shape changes; older binaries hard-stop on higher. */
6
+ export const SUPPORTED_REPO_VERSION = 1;
4
7
  const REPO_MARKER_FILE = ".grounder.json";
5
8
  export function repoConfigPath(repoRoot) {
6
9
  return path.join(repoRoot, REPO_MARKER_FILE);
@@ -29,7 +32,15 @@ export async function readRepoConfig(repoRoot) {
29
32
  return null;
30
33
  }
31
34
  const raw = JSON.parse(await readFile(configPath, "utf8"));
32
- if (raw.version !== 1 || typeof raw.projectId !== "string" || raw.projectId.length === 0) {
35
+ if (typeof raw.version !== "number" || !Number.isInteger(raw.version)) {
36
+ throw new Error(`Invalid repo config at ${configPath}: bad version`);
37
+ }
38
+ if (raw.version > SUPPORTED_REPO_VERSION) {
39
+ throw new UnsupportedSchemaError(`Repo config at ${configPath} requires .grounder.json version ${raw.version}; this grounder supports ${SUPPORTED_REPO_VERSION}. Upgrade grounder.`);
40
+ }
41
+ if (raw.version !== SUPPORTED_REPO_VERSION ||
42
+ typeof raw.projectId !== "string" ||
43
+ raw.projectId.length === 0) {
33
44
  throw new Error(`Invalid repo config at ${configPath}`);
34
45
  }
35
46
  return { version: 1, projectId: raw.projectId };
@@ -1 +1 @@
1
- {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/connector/repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAE1C,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW,EACX,UAAyB,IAAI;IAE7B,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7D,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,MAAM,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,aAAa,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;YAC/C,MAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM;QACR,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAwB,CAAC;IAClF,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,MAAkB;IACxE,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"repo.js","sourceRoot":"","sources":["../../src/connector/repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /** Minimal adapter shape for forward-compat schema compares. */
2
+ export interface AgentSchemaSupport {
3
+ id: string;
4
+ name: string;
5
+ commandsSchema: number;
6
+ hooksSchema?: number;
7
+ }
8
+ /** Per-file install record for chezmoi-style drift detection on command markdown. */
9
+ export interface AgentFileState {
10
+ /** `sha256:…` of the exact bytes Grounder last wrote (see `hashContent`). */
11
+ hash?: string;
12
+ }
13
+ export interface AgentState {
14
+ commandsSchema: number;
15
+ hooksSchema?: number;
16
+ files: Record<string, AgentFileState>;
17
+ }
18
+ export interface GrounderState {
19
+ /** Package version that last wrote install artifacts (via vault init / migrate). */
20
+ grounderVersion: string;
21
+ agents: Record<string, AgentState>;
22
+ }
23
+ export declare function statePath(homeDir?: string): string;
24
+ /**
25
+ * Read `~/.grounder/state.json`. Missing file → `null` (legacy / pre-ledger
26
+ * install — callers should treat missing agent entries as schema 0).
27
+ */
28
+ export declare function readGrounderState(homeDir?: string): Promise<GrounderState | null>;
29
+ export declare function writeGrounderState(state: GrounderState, homeDir?: string): Promise<void>;
30
+ /** Recorded commands schema for an agent, or `0` when missing (legacy). */
31
+ export declare function recordedCommandsSchema(state: GrounderState | null, agentId: string): number;
32
+ /** Hooks version stored for an agent, or `0` if missing (never stored / never installed). */
33
+ export declare function recordedHooksSchema(state: GrounderState | null, agentId: string): number;
34
+ export interface RecordAgentInstallOptions {
35
+ agentId: string;
36
+ /**
37
+ * When set, updates the commands version in state; when omitted, keeps the
38
+ * existing value (or `0` for a new agent). Omit when every command file was
39
+ * skipped as locally edited or from an old install, so state does not look
40
+ * up to date when the files were not updated.
41
+ */
42
+ commandsSchema?: number;
43
+ /** When set, updates the hooks version; when omitted, keeps any existing value. */
44
+ hooksSchema?: number;
45
+ /**
46
+ * Merge into the agent's `files` map (absolute path → state). Omitting leaves
47
+ * existing entries alone; pass `{}` is a no-op merge.
48
+ */
49
+ files?: Record<string, AgentFileState>;
50
+ grounderVersion: string;
51
+ homeDir?: string;
52
+ }
53
+ /**
54
+ * Merge one agent's install info into `~/.grounder/state.json`. Creates the
55
+ * file when missing. Keeps other agents and merges any provided `files` over
56
+ * this agent's existing map.
57
+ */
58
+ export declare function recordAgentInstall(opts: RecordAgentInstallOptions): Promise<GrounderState>;
59
+ /**
60
+ * True when `state.json` says this machine's install is behind what this
61
+ * Grounder version expects. Used by peek/status — they only read `state.json`,
62
+ * they do not look at Cursor/Claude files on disk.
63
+ *
64
+ * If there is no state file, returns false (callers handle that separately).
65
+ * Only agents listed in state are checked.
66
+ *
67
+ * Session hooks: if an agent has no `hooksSchema` in state, that means hooks
68
+ * were never turned on for them. That is not "behind" — otherwise peek would
69
+ * keep telling people who never enabled hooks to run migrate. Doctor verifies
70
+ * on-disk command/hook drift via migrate dry-run, and also warns when files
71
+ * already match but these ledger schema numbers still lag.
72
+ */
73
+ export declare function isInstallSchemaStale(state: GrounderState | null, agents: ReadonlyArray<AgentSchemaSupport>): boolean;
74
+ /**
75
+ * True when state says hooks are newer than this Grounder understands.
76
+ * No stored hooks version is not "newer".
77
+ */
78
+ export declare function isHooksSchemaAhead(recorded: number | undefined, expected: number | undefined): boolean;
79
+ /** Last-recorded content hash for a managed file, or `undefined` if unknown. */
80
+ export declare function recordedFileHash(state: GrounderState | null, agentId: string, filePath: string): string | undefined;
81
+ /**
82
+ * Hard stop when `state.json` has install versions newer than this Grounder
83
+ * understands. Missing state or unknown agents are fine (older installs).
84
+ */
85
+ export declare function assertAgentSchemasSupported(state: GrounderState | null, agents: ReadonlyArray<AgentSchemaSupport>): void;
86
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/connector/state.ts"],"names":[],"mappings":"AAMA,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qFAAqF;AACrF,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACpC;AAED,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAuDvF;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9F;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAExF;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC,CA0BhG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,MAAM,EAAE,aAAa,CAAC,kBAAkB,CAAC,GACxC,OAAO,CAsBT;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAKT;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAEpB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,MAAM,EAAE,aAAa,CAAC,kBAAkB,CAAC,GACxC,IAAI,CA2BN"}
@@ -0,0 +1,171 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { fileExists } from "../util/fs.js";
4
+ import { resolveHomeDir } from "./home.js";
5
+ import { UnsupportedSchemaError } from "./unsupported-schema.js";
6
+ export function statePath(homeDir) {
7
+ return path.join(resolveHomeDir(homeDir), ".grounder", "state.json");
8
+ }
9
+ /**
10
+ * Read `~/.grounder/state.json`. Missing file → `null` (legacy / pre-ledger
11
+ * install — callers should treat missing agent entries as schema 0).
12
+ */
13
+ export async function readGrounderState(homeDir) {
14
+ const filePath = statePath(homeDir);
15
+ if (!(await fileExists(filePath))) {
16
+ return null;
17
+ }
18
+ let raw;
19
+ try {
20
+ raw = JSON.parse(await readFile(filePath, "utf8"));
21
+ }
22
+ catch (error) {
23
+ const detail = error instanceof Error ? error.message : String(error);
24
+ throw new Error(`Invalid grounder state at ${filePath}: ${detail}. Fix or remove it, then run: grounder migrate --force`);
25
+ }
26
+ if (typeof raw.grounderVersion !== "string" || raw.grounderVersion.length === 0) {
27
+ throw new Error(`Invalid grounder state at ${filePath}: missing grounderVersion. Fix or remove it, then run: grounder migrate --force`);
28
+ }
29
+ if (raw.agents === null || typeof raw.agents !== "object" || Array.isArray(raw.agents)) {
30
+ throw new Error(`Invalid grounder state at ${filePath}: missing agents`);
31
+ }
32
+ const agents = {};
33
+ for (const [id, entry] of Object.entries(raw.agents)) {
34
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
35
+ throw new Error(`Invalid grounder state at ${filePath}: bad agent entry "${id}"`);
36
+ }
37
+ const commandsSchema = entry.commandsSchema;
38
+ if (typeof commandsSchema !== "number" || !Number.isInteger(commandsSchema)) {
39
+ throw new Error(`Invalid grounder state at ${filePath}: agent "${id}" missing commandsSchema`);
40
+ }
41
+ const hooksSchema = entry.hooksSchema;
42
+ if (hooksSchema !== undefined &&
43
+ (typeof hooksSchema !== "number" || !Number.isInteger(hooksSchema))) {
44
+ throw new Error(`Invalid grounder state at ${filePath}: agent "${id}" has invalid hooksSchema`);
45
+ }
46
+ const filesRaw = entry.files;
47
+ const files = filesRaw && typeof filesRaw === "object" && !Array.isArray(filesRaw) ? { ...filesRaw } : {};
48
+ agents[id] = {
49
+ commandsSchema,
50
+ ...(hooksSchema !== undefined ? { hooksSchema } : {}),
51
+ files,
52
+ };
53
+ }
54
+ return { grounderVersion: raw.grounderVersion, agents };
55
+ }
56
+ export async function writeGrounderState(state, homeDir) {
57
+ const filePath = statePath(homeDir);
58
+ await mkdir(path.dirname(filePath), { recursive: true });
59
+ await writeFile(filePath, `${JSON.stringify(state, null, 2)}\n`, "utf8");
60
+ }
61
+ /** Recorded commands schema for an agent, or `0` when missing (legacy). */
62
+ export function recordedCommandsSchema(state, agentId) {
63
+ return state?.agents[agentId]?.commandsSchema ?? 0;
64
+ }
65
+ /** Hooks version stored for an agent, or `0` if missing (never stored / never installed). */
66
+ export function recordedHooksSchema(state, agentId) {
67
+ return state?.agents[agentId]?.hooksSchema ?? 0;
68
+ }
69
+ /**
70
+ * Merge one agent's install info into `~/.grounder/state.json`. Creates the
71
+ * file when missing. Keeps other agents and merges any provided `files` over
72
+ * this agent's existing map.
73
+ */
74
+ export async function recordAgentInstall(opts) {
75
+ const existing = await readGrounderState(opts.homeDir);
76
+ const prev = existing?.agents[opts.agentId];
77
+ const nextEntry = {
78
+ commandsSchema: opts.commandsSchema !== undefined ? opts.commandsSchema : (prev?.commandsSchema ?? 0),
79
+ files: {
80
+ ...(prev?.files ? { ...prev.files } : {}),
81
+ ...(opts.files ?? {}),
82
+ },
83
+ };
84
+ if (opts.hooksSchema !== undefined) {
85
+ nextEntry.hooksSchema = opts.hooksSchema;
86
+ }
87
+ else if (prev?.hooksSchema !== undefined) {
88
+ nextEntry.hooksSchema = prev.hooksSchema;
89
+ }
90
+ const next = {
91
+ grounderVersion: opts.grounderVersion,
92
+ agents: {
93
+ ...(existing?.agents ?? {}),
94
+ [opts.agentId]: nextEntry,
95
+ },
96
+ };
97
+ await writeGrounderState(next, opts.homeDir);
98
+ return next;
99
+ }
100
+ /**
101
+ * True when `state.json` says this machine's install is behind what this
102
+ * Grounder version expects. Used by peek/status — they only read `state.json`,
103
+ * they do not look at Cursor/Claude files on disk.
104
+ *
105
+ * If there is no state file, returns false (callers handle that separately).
106
+ * Only agents listed in state are checked.
107
+ *
108
+ * Session hooks: if an agent has no `hooksSchema` in state, that means hooks
109
+ * were never turned on for them. That is not "behind" — otherwise peek would
110
+ * keep telling people who never enabled hooks to run migrate. Doctor verifies
111
+ * on-disk command/hook drift via migrate dry-run, and also warns when files
112
+ * already match but these ledger schema numbers still lag.
113
+ */
114
+ export function isInstallSchemaStale(state, agents) {
115
+ if (!state) {
116
+ return false;
117
+ }
118
+ for (const agent of agents) {
119
+ const entry = state.agents[agent.id];
120
+ if (!entry) {
121
+ continue;
122
+ }
123
+ if (entry.commandsSchema < agent.commandsSchema) {
124
+ return true;
125
+ }
126
+ if (agent.hooksSchema !== undefined &&
127
+ entry.hooksSchema !== undefined &&
128
+ entry.hooksSchema < agent.hooksSchema) {
129
+ return true;
130
+ }
131
+ }
132
+ return false;
133
+ }
134
+ /**
135
+ * True when state says hooks are newer than this Grounder understands.
136
+ * No stored hooks version is not "newer".
137
+ */
138
+ export function isHooksSchemaAhead(recorded, expected) {
139
+ if (expected === undefined || recorded === undefined) {
140
+ return false;
141
+ }
142
+ return recorded > expected;
143
+ }
144
+ /** Last-recorded content hash for a managed file, or `undefined` if unknown. */
145
+ export function recordedFileHash(state, agentId, filePath) {
146
+ return state?.agents[agentId]?.files[filePath]?.hash;
147
+ }
148
+ /**
149
+ * Hard stop when `state.json` has install versions newer than this Grounder
150
+ * understands. Missing state or unknown agents are fine (older installs).
151
+ */
152
+ export function assertAgentSchemasSupported(state, agents) {
153
+ if (!state) {
154
+ return;
155
+ }
156
+ for (const agent of agents) {
157
+ const recorded = state.agents[agent.id];
158
+ if (!recorded) {
159
+ continue;
160
+ }
161
+ if (recorded.commandsSchema > agent.commandsSchema) {
162
+ throw new UnsupportedSchemaError(`${agent.name} commands schema ${recorded.commandsSchema} is newer than this grounder supports (${agent.commandsSchema}). Upgrade grounder.`);
163
+ }
164
+ if (recorded.hooksSchema !== undefined &&
165
+ agent.hooksSchema !== undefined &&
166
+ recorded.hooksSchema > agent.hooksSchema) {
167
+ throw new UnsupportedSchemaError(`${agent.name} hooks schema ${recorded.hooksSchema} is newer than this grounder supports (${agent.hooksSchema}). Upgrade grounder.`);
168
+ }
169
+ }
170
+ }
171
+ //# sourceMappingURL=state.js.map