grounder 0.4.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.
- package/README.md +150 -271
- package/dist/agents/claude.d.ts +4 -4
- package/dist/agents/claude.d.ts.map +1 -1
- package/dist/agents/claude.js +158 -178
- package/dist/agents/claude.js.map +1 -1
- package/dist/agents/cursor.d.ts +3 -3
- package/dist/agents/cursor.d.ts.map +1 -1
- package/dist/agents/cursor.js +97 -143
- package/dist/agents/cursor.js.map +1 -1
- package/dist/agents/home-skills.d.ts +46 -0
- package/dist/agents/home-skills.d.ts.map +1 -0
- package/dist/agents/home-skills.js +83 -0
- package/dist/agents/home-skills.js.map +1 -0
- package/dist/agents/hook-fragment.d.ts +52 -0
- package/dist/agents/hook-fragment.d.ts.map +1 -0
- package/dist/agents/hook-fragment.js +76 -0
- package/dist/agents/hook-fragment.js.map +1 -0
- package/dist/agents/hook-install.d.ts +62 -0
- package/dist/agents/hook-install.d.ts.map +1 -0
- package/dist/agents/hook-install.js +74 -0
- package/dist/agents/hook-install.js.map +1 -0
- package/dist/agents/hook-runtime.d.ts +80 -13
- package/dist/agents/hook-runtime.d.ts.map +1 -1
- package/dist/agents/hook-runtime.js +278 -74
- package/dist/agents/hook-runtime.js.map +1 -1
- package/dist/agents/index.d.ts +8 -14
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +13 -19
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/types.d.ts +56 -16
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/cli.js +15 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/apply.d.ts +69 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +238 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +197 -101
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/handoff/list.d.ts +23 -13
- package/dist/commands/handoff/list.d.ts.map +1 -1
- package/dist/commands/handoff/list.js +28 -16
- package/dist/commands/handoff/list.js.map +1 -1
- package/dist/commands/handoff/peek.d.ts +1 -1
- package/dist/commands/handoff/peek.d.ts.map +1 -1
- package/dist/commands/handoff/peek.js +28 -12
- package/dist/commands/handoff/peek.js.map +1 -1
- package/dist/commands/handoff.d.ts +2 -0
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +10 -1
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/install-drift.d.ts +34 -0
- package/dist/commands/install-drift.d.ts.map +1 -0
- package/dist/commands/install-drift.js +72 -0
- package/dist/commands/install-drift.js.map +1 -0
- package/dist/commands/link.d.ts +12 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/{repo/init.js → link.js} +35 -27
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/migrate.d.ts +11 -3
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +66 -34
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/note/list.d.ts +17 -9
- package/dist/commands/note/list.d.ts.map +1 -1
- package/dist/commands/note/list.js +19 -14
- package/dist/commands/note/list.js.map +1 -1
- package/dist/commands/note.d.ts +2 -0
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +10 -1
- package/dist/commands/note.js.map +1 -1
- package/dist/commands/output.d.ts +22 -2
- package/dist/commands/output.d.ts.map +1 -1
- package/dist/commands/output.js +18 -6
- package/dist/commands/output.js.map +1 -1
- package/dist/commands/overview.d.ts +33 -0
- package/dist/commands/overview.d.ts.map +1 -0
- package/dist/commands/overview.js +150 -0
- package/dist/commands/overview.js.map +1 -0
- package/dist/commands/plan/list.d.ts +20 -12
- package/dist/commands/plan/list.d.ts.map +1 -1
- package/dist/commands/plan/list.js +22 -17
- package/dist/commands/plan/list.js.map +1 -1
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +12 -2
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/render-artifact-table.d.ts +85 -0
- package/dist/commands/render-artifact-table.d.ts.map +1 -0
- package/dist/commands/render-artifact-table.js +232 -0
- package/dist/commands/render-artifact-table.js.map +1 -0
- package/dist/commands/require-linked.js +2 -2
- package/dist/commands/require-linked.js.map +1 -1
- package/dist/commands/search.d.ts +23 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +288 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/{vault/init.d.ts → setup.d.ts} +5 -4
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +210 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +273 -83
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/upgrade-banner.d.ts +2 -2
- package/dist/commands/upgrade-banner.js +2 -2
- package/dist/connector/home.d.ts +12 -0
- package/dist/connector/home.d.ts.map +1 -1
- package/dist/connector/home.js +26 -2
- package/dist/connector/home.js.map +1 -1
- package/dist/connector/ledger-migrations.d.ts +55 -0
- package/dist/connector/ledger-migrations.d.ts.map +1 -0
- package/dist/connector/ledger-migrations.js +94 -0
- package/dist/connector/ledger-migrations.js.map +1 -0
- package/dist/connector/state.d.ts +97 -60
- package/dist/connector/state.d.ts.map +1 -1
- package/dist/connector/state.js +165 -107
- package/dist/connector/state.js.map +1 -1
- package/dist/connector/vault.d.ts +2 -0
- package/dist/connector/vault.d.ts.map +1 -1
- package/dist/connector/vault.js +6 -1
- package/dist/connector/vault.js.map +1 -1
- package/dist/help.d.ts +3 -3
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +97 -56
- package/dist/help.js.map +1 -1
- package/dist/reconcile/apply.d.ts +31 -0
- package/dist/reconcile/apply.d.ts.map +1 -0
- package/dist/reconcile/apply.js +97 -0
- package/dist/reconcile/apply.js.map +1 -0
- package/dist/reconcile/core.d.ts +82 -0
- package/dist/reconcile/core.d.ts.map +1 -0
- package/dist/reconcile/core.js +163 -0
- package/dist/reconcile/core.js.map +1 -0
- package/dist/reconcile/disk.d.ts +13 -0
- package/dist/reconcile/disk.d.ts.map +1 -0
- package/dist/reconcile/disk.js +28 -0
- package/dist/reconcile/disk.js.map +1 -0
- package/dist/util/frontmatter.d.ts +9 -7
- package/dist/util/frontmatter.d.ts.map +1 -1
- package/dist/util/frontmatter.js +29 -4
- package/dist/util/frontmatter.js.map +1 -1
- package/dist/util/fs.d.ts +14 -0
- package/dist/util/fs.d.ts.map +1 -1
- package/dist/util/fs.js +27 -1
- package/dist/util/fs.js.map +1 -1
- package/dist/util/merge-json.d.ts +13 -2
- package/dist/util/merge-json.d.ts.map +1 -1
- package/dist/util/merge-json.js +24 -10
- package/dist/util/merge-json.js.map +1 -1
- package/dist/util/path.d.ts +23 -0
- package/dist/util/path.d.ts.map +1 -1
- package/dist/util/path.js +39 -0
- package/dist/util/path.js.map +1 -1
- package/dist/vault/list-handoffs.d.ts +14 -2
- package/dist/vault/list-handoffs.d.ts.map +1 -1
- package/dist/vault/list-handoffs.js +40 -23
- package/dist/vault/list-handoffs.js.map +1 -1
- package/dist/vault/list-markdown.d.ts +8 -0
- package/dist/vault/list-markdown.d.ts.map +1 -0
- package/dist/vault/list-markdown.js +35 -0
- package/dist/vault/list-markdown.js.map +1 -0
- package/dist/vault/list-notes.d.ts +15 -6
- package/dist/vault/list-notes.d.ts.map +1 -1
- package/dist/vault/list-notes.js +23 -27
- package/dist/vault/list-notes.js.map +1 -1
- package/dist/vault/list-plans.d.ts +12 -3
- package/dist/vault/list-plans.d.ts.map +1 -1
- package/dist/vault/list-plans.js +20 -24
- package/dist/vault/list-plans.js.map +1 -1
- package/dist/vault/search.d.ts +55 -0
- package/dist/vault/search.d.ts.map +1 -0
- package/dist/vault/search.js +432 -0
- package/dist/vault/search.js.map +1 -0
- package/dist/vault/write-handoff.d.ts +2 -0
- package/dist/vault/write-handoff.d.ts.map +1 -1
- package/dist/vault/write-handoff.js +5 -0
- package/dist/vault/write-handoff.js.map +1 -1
- package/dist/vault/write-note.d.ts +2 -0
- package/dist/vault/write-note.d.ts.map +1 -1
- package/dist/vault/write-note.js +9 -1
- package/dist/vault/write-note.js.map +1 -1
- package/dist/vault/write-plan.d.ts +4 -0
- package/dist/vault/write-plan.d.ts.map +1 -1
- package/dist/vault/write-plan.js +14 -1
- package/dist/vault/write-plan.js.map +1 -1
- package/package.json +11 -4
- package/templates/agents/claude/skills/grounder-handoff/SKILL.md +73 -0
- package/templates/agents/claude/{commands/grounder-note.md → skills/grounder-note/SKILL.md} +12 -2
- package/templates/agents/claude/skills/grounder-overview/SKILL.md +21 -0
- package/templates/agents/claude/{commands/grounder-plan.md → skills/grounder-plan/SKILL.md} +13 -5
- package/templates/agents/claude/skills/grounder-recall/SKILL.md +34 -0
- package/templates/agents/claude/skills/grounder-search/SKILL.md +152 -0
- package/templates/agents/cursor/skills/grounder-handoff/SKILL.md +73 -0
- package/templates/agents/cursor/{commands/grounder-note.md → skills/grounder-note/SKILL.md} +12 -2
- package/templates/agents/cursor/skills/grounder-overview/SKILL.md +21 -0
- package/templates/agents/cursor/{commands/grounder-plan.md → skills/grounder-plan/SKILL.md} +13 -5
- package/templates/agents/cursor/skills/grounder-recall/SKILL.md +34 -0
- package/templates/agents/cursor/skills/grounder-search/SKILL.md +152 -0
- package/templates/vault/plan.md +1 -1
- package/templates/vault/session-handoff.md +2 -1
- package/dist/agents/install-command.d.ts +0 -35
- package/dist/agents/install-command.d.ts.map +0 -1
- package/dist/agents/install-command.js +0 -65
- package/dist/agents/install-command.js.map +0 -1
- package/dist/commands/apply-agent-installs.d.ts +0 -34
- package/dist/commands/apply-agent-installs.d.ts.map +0 -1
- package/dist/commands/apply-agent-installs.js +0 -137
- package/dist/commands/apply-agent-installs.js.map +0 -1
- package/dist/commands/repo/init.d.ts +0 -11
- package/dist/commands/repo/init.d.ts.map +0 -1
- package/dist/commands/repo/init.js.map +0 -1
- package/dist/commands/vault/init.d.ts.map +0 -1
- package/dist/commands/vault/init.js +0 -90
- package/dist/commands/vault/init.js.map +0 -1
- package/templates/agents/claude/commands/grounder-task-handoff.md +0 -54
- package/templates/agents/claude/commands/grounder-task.md +0 -22
- package/templates/agents/cursor/commands/grounder-task-handoff.md +0 -54
- package/templates/agents/cursor/commands/grounder-task.md +0 -22
package/dist/connector/state.js
CHANGED
|
@@ -1,14 +1,27 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { fileExists } from "../util/fs.js";
|
|
3
|
+
import { fileExists, writeFileAtomic } from "../util/fs.js";
|
|
4
|
+
import { packageVersionRelation } from "../util/semver.js";
|
|
4
5
|
import { resolveHomeDir } from "./home.js";
|
|
6
|
+
import { applyLedgerUpgrades, LEDGER_SCHEMA, MIN_SUPPORTED_LEDGER_SCHEMA, } from "./ledger-migrations.js";
|
|
5
7
|
import { UnsupportedSchemaError } from "./unsupported-schema.js";
|
|
8
|
+
export { LEDGER_SCHEMA, MIN_SUPPORTED_LEDGER_SCHEMA } from "./ledger-migrations.js";
|
|
6
9
|
export function statePath(homeDir) {
|
|
7
10
|
return path.join(resolveHomeDir(homeDir), ".grounder", "state.json");
|
|
8
11
|
}
|
|
9
12
|
/**
|
|
10
13
|
* Read `~/.grounder/state.json`. Missing file → `null` (legacy / pre-ledger
|
|
11
|
-
* install
|
|
14
|
+
* install). A `ledgerSchema` older than current (only v0.5.0's real shape —
|
|
15
|
+
* `commandsSchema`/`hooksSchema`, no `ledgerSchema` field — has ever existed
|
|
16
|
+
* on disk) is upgraded to the current shape in memory only; disk is untouched
|
|
17
|
+
* until a real ledger write (`setup`/`migrate`/`setLedgerFileHash`/etc).
|
|
18
|
+
* `status`, `doctor`, and `handoff peek` must never write `state.json` as a
|
|
19
|
+
* side effect of reading it.
|
|
20
|
+
*
|
|
21
|
+
* The gate runs immediately after `JSON.parse`, ahead of the
|
|
22
|
+
* `grounderVersion`/`agents` validation below: a schema-2 file that
|
|
23
|
+
* restructures `agents` must report "upgrade grounder", not "missing
|
|
24
|
+
* agents — fix or remove it".
|
|
12
25
|
*/
|
|
13
26
|
export async function readGrounderState(homeDir) {
|
|
14
27
|
const filePath = statePath(homeDir);
|
|
@@ -23,149 +36,194 @@ export async function readGrounderState(homeDir) {
|
|
|
23
36
|
const detail = error instanceof Error ? error.message : String(error);
|
|
24
37
|
throw new Error(`Invalid grounder state at ${filePath}: ${detail}. Fix or remove it, then run: grounder migrate --force`);
|
|
25
38
|
}
|
|
26
|
-
if (typeof raw
|
|
39
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
40
|
+
// Same "missing grounderVersion" message a non-object payload already
|
|
41
|
+
// gets further down (`raw.grounderVersion` on a boxed number/string
|
|
42
|
+
// reads as `undefined`, not a throw) — `null` is the one JSON value
|
|
43
|
+
// whose property access throws before reaching that check, so it's
|
|
44
|
+
// guarded here explicitly rather than falling through.
|
|
45
|
+
throw new Error(`Invalid grounder state at ${filePath}: missing grounderVersion. Fix or remove it, then run: grounder migrate --force`);
|
|
46
|
+
}
|
|
47
|
+
let ledgerSchema;
|
|
48
|
+
if (raw.ledgerSchema === undefined) {
|
|
49
|
+
ledgerSchema = 0;
|
|
50
|
+
}
|
|
51
|
+
else if (typeof raw.ledgerSchema === "number" && Number.isInteger(raw.ledgerSchema)) {
|
|
52
|
+
ledgerSchema = raw.ledgerSchema;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Deliberate tightening, not preserved behavior: previously a non-number
|
|
56
|
+
// silently became `0`.
|
|
57
|
+
throw new Error(`Invalid grounder state at ${filePath}: ledgerSchema must be an integer. Fix or remove it, then run: grounder migrate --force`);
|
|
58
|
+
}
|
|
59
|
+
if (ledgerSchema > LEDGER_SCHEMA) {
|
|
60
|
+
throw new UnsupportedSchemaError(`${filePath} requires ledger schema ${ledgerSchema}; this grounder supports ${LEDGER_SCHEMA}. Upgrade grounder.`);
|
|
61
|
+
}
|
|
62
|
+
if (ledgerSchema < MIN_SUPPORTED_LEDGER_SCHEMA) {
|
|
63
|
+
throw new Error(`Invalid grounder state at ${filePath}: ledger schema ${ledgerSchema} is older than this grounder supports (minimum ${MIN_SUPPORTED_LEDGER_SCHEMA}). Fix or remove it, then run: grounder migrate --force`);
|
|
64
|
+
}
|
|
65
|
+
const upgraded = applyLedgerUpgrades(raw, ledgerSchema);
|
|
66
|
+
if (typeof upgraded.grounderVersion !== "string" || upgraded.grounderVersion.length === 0) {
|
|
27
67
|
throw new Error(`Invalid grounder state at ${filePath}: missing grounderVersion. Fix or remove it, then run: grounder migrate --force`);
|
|
28
68
|
}
|
|
29
|
-
if (
|
|
69
|
+
if (upgraded.agents === null ||
|
|
70
|
+
typeof upgraded.agents !== "object" ||
|
|
71
|
+
Array.isArray(upgraded.agents)) {
|
|
30
72
|
throw new Error(`Invalid grounder state at ${filePath}: missing agents`);
|
|
31
73
|
}
|
|
74
|
+
// Explicit field-by-field construction (not a spread of `upgraded`'s agent
|
|
75
|
+
// entries) so an upgraded-but-unknown key can never round-trip back to disk
|
|
76
|
+
// through `withUpdatedAgent`'s `...existing.agents` spread.
|
|
32
77
|
const agents = {};
|
|
33
|
-
for (const [id, entry] of Object.entries(
|
|
78
|
+
for (const [id, entry] of Object.entries(upgraded.agents)) {
|
|
34
79
|
if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
|
|
35
80
|
throw new Error(`Invalid grounder state at ${filePath}: bad agent entry "${id}"`);
|
|
36
81
|
}
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
82
|
+
const e = entry;
|
|
83
|
+
const filesRaw = e.files;
|
|
84
|
+
// Drop, rather than cast through, any file entry whose `hash` isn't a
|
|
85
|
+
// string — a corrupted or hand-edited `{ hash: 123 }` / `{}` entry would
|
|
86
|
+
// otherwise persist forever via `withUpdatedAgent`'s `...prev.files`
|
|
87
|
+
// spread and compare unequal to every real hash anyway.
|
|
88
|
+
const files = {};
|
|
89
|
+
if (filesRaw && typeof filesRaw === "object" && !Array.isArray(filesRaw)) {
|
|
90
|
+
for (const [entryPath, fileEntry] of Object.entries(filesRaw)) {
|
|
91
|
+
const hash = fileEntry?.hash;
|
|
92
|
+
if (typeof hash === "string") {
|
|
93
|
+
files[entryPath] = { hash };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
40
96
|
}
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
97
|
+
const hooksEnabled = typeof e.hooksEnabled === "boolean" ? e.hooksEnabled : undefined;
|
|
98
|
+
// Empty string treated as missing, not as a real (empty) override — a
|
|
99
|
+
// hand-edited `"lastInvocation": ""` would otherwise pass `?? ` in
|
|
100
|
+
// `desiredArtifacts()`'s override check and render with no interpreter
|
|
101
|
+
// baked in at all.
|
|
102
|
+
const lastInvocation = typeof e.lastInvocation === "string" && e.lastInvocation.length > 0
|
|
103
|
+
? e.lastInvocation
|
|
104
|
+
: undefined;
|
|
48
105
|
agents[id] = {
|
|
49
|
-
commandsSchema,
|
|
50
|
-
...(hooksSchema !== undefined ? { hooksSchema } : {}),
|
|
51
106
|
files,
|
|
107
|
+
...(hooksEnabled !== undefined ? { hooksEnabled } : {}),
|
|
108
|
+
...(lastInvocation !== undefined ? { lastInvocation } : {}),
|
|
52
109
|
};
|
|
53
110
|
}
|
|
54
|
-
return { grounderVersion:
|
|
111
|
+
return { ledgerSchema: LEDGER_SCHEMA, grounderVersion: upgraded.grounderVersion, agents };
|
|
55
112
|
}
|
|
113
|
+
/** Atomic write — tmp file + rename, so a crash mid-write never leaves a truncated ledger. */
|
|
56
114
|
export async function writeGrounderState(state, homeDir) {
|
|
57
|
-
|
|
58
|
-
await mkdir(path.dirname(filePath), { recursive: true });
|
|
59
|
-
await writeFile(filePath, `${JSON.stringify(state, null, 2)}\n`, "utf8");
|
|
115
|
+
await writeFileAtomic(statePath(homeDir), `${JSON.stringify(state, null, 2)}\n`);
|
|
60
116
|
}
|
|
61
|
-
/**
|
|
62
|
-
export function
|
|
63
|
-
return state?.agents[agentId]?.
|
|
117
|
+
/** Last-recorded content hash for a managed file, or `undefined` if unknown. */
|
|
118
|
+
export function recordedFileHash(state, agentId, filePath) {
|
|
119
|
+
return state?.agents[agentId]?.files[filePath]?.hash;
|
|
64
120
|
}
|
|
65
|
-
/**
|
|
66
|
-
export function
|
|
67
|
-
return state?.agents[agentId]?.
|
|
121
|
+
/** One agent's last-applied manifest, or `undefined` when this agent has no ledger entry at all. */
|
|
122
|
+
export function ledgerFilesFor(state, agentId) {
|
|
123
|
+
return state?.agents[agentId]?.files;
|
|
68
124
|
}
|
|
69
|
-
/**
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
*/
|
|
74
|
-
export
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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,
|
|
125
|
+
/** Tri-state hooks intent for an agent: `undefined` (never recorded) / `true` / `false`. */
|
|
126
|
+
export function recordedHooksEnabled(state, agentId) {
|
|
127
|
+
return state?.agents[agentId]?.hooksEnabled;
|
|
128
|
+
}
|
|
129
|
+
/** The `{{GROUNDER_CLI}}` invocation used at this agent's last real install, or `undefined`. */
|
|
130
|
+
export function recordedInvocation(state, agentId) {
|
|
131
|
+
return state?.agents[agentId]?.lastInvocation;
|
|
132
|
+
}
|
|
133
|
+
function withUpdatedAgent(existing, agentId, updateEntry, grounderVersion) {
|
|
134
|
+
const prevAgent = existing?.agents[agentId] ?? { files: {} };
|
|
135
|
+
return {
|
|
136
|
+
ledgerSchema: LEDGER_SCHEMA,
|
|
137
|
+
grounderVersion,
|
|
92
138
|
agents: {
|
|
93
139
|
...(existing?.agents ?? {}),
|
|
94
|
-
[
|
|
140
|
+
[agentId]: updateEntry(prevAgent),
|
|
95
141
|
},
|
|
96
142
|
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Persist one file's hash for one agent, right after that file's own write
|
|
146
|
+
* succeeds — per-artifact, not batched, so a mid-run crash leaves the ledger
|
|
147
|
+
* consistent with whatever actually completed. No-op if already current.
|
|
148
|
+
*/
|
|
149
|
+
export async function setLedgerFileHash(opts) {
|
|
150
|
+
const existing = await readGrounderState(opts.homeDir);
|
|
151
|
+
if (existing?.agents[opts.agentId]?.files[opts.filePath]?.hash === opts.hash) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const next = withUpdatedAgent(existing, opts.agentId, (prev) => ({ ...prev, files: { ...prev.files, [opts.filePath]: { hash: opts.hash } } }), opts.grounderVersion);
|
|
97
155
|
await writeGrounderState(next, opts.homeDir);
|
|
98
|
-
return next;
|
|
99
156
|
}
|
|
100
157
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
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.
|
|
158
|
+
* Drop one path's ledger entry — for a file deleted outright (tombstone
|
|
159
|
+
* retirement), where there is no new hash to overwrite it with. No-op when
|
|
160
|
+
* there's no state, no such agent, or no recorded entry for that path.
|
|
113
161
|
*/
|
|
114
|
-
export function
|
|
115
|
-
|
|
116
|
-
|
|
162
|
+
export async function forgetLedgerFile(opts) {
|
|
163
|
+
const existing = await readGrounderState(opts.homeDir);
|
|
164
|
+
const prevAgent = existing?.agents[opts.agentId];
|
|
165
|
+
if (!existing || !prevAgent || !(opts.filePath in prevAgent.files)) {
|
|
166
|
+
return;
|
|
117
167
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
entry.hooksSchema !== undefined &&
|
|
128
|
-
entry.hooksSchema < agent.hooksSchema) {
|
|
129
|
-
return true;
|
|
130
|
-
}
|
|
168
|
+
const files = Object.fromEntries(Object.entries(prevAgent.files).filter(([p]) => p !== opts.filePath));
|
|
169
|
+
const next = withUpdatedAgent(existing, opts.agentId, (prev) => ({ ...prev, files }), opts.grounderVersion);
|
|
170
|
+
await writeGrounderState(next, opts.homeDir);
|
|
171
|
+
}
|
|
172
|
+
/** Persist an agent's hooks intent (tri-state). Setup/migrate only — never called from doctor. */
|
|
173
|
+
export async function setHooksEnabled(opts) {
|
|
174
|
+
const existing = await readGrounderState(opts.homeDir);
|
|
175
|
+
if (existing?.agents[opts.agentId]?.hooksEnabled === opts.enabled) {
|
|
176
|
+
return;
|
|
131
177
|
}
|
|
132
|
-
|
|
178
|
+
const next = withUpdatedAgent(existing, opts.agentId, (prev) => ({ ...prev, hooksEnabled: opts.enabled }), opts.grounderVersion);
|
|
179
|
+
await writeGrounderState(next, opts.homeDir);
|
|
133
180
|
}
|
|
134
181
|
/**
|
|
135
|
-
*
|
|
136
|
-
*
|
|
182
|
+
* Persist the exact invocation used for this agent's just-completed real
|
|
183
|
+
* install, so the cheap drift check can replay it later instead of the
|
|
184
|
+
* checking process's own `process.execPath`. No-op if already current.
|
|
137
185
|
*/
|
|
138
|
-
export function
|
|
139
|
-
|
|
140
|
-
|
|
186
|
+
export async function setLedgerInvocation(opts) {
|
|
187
|
+
const existing = await readGrounderState(opts.homeDir);
|
|
188
|
+
if (existing?.agents[opts.agentId]?.lastInvocation === opts.invocation) {
|
|
189
|
+
return;
|
|
141
190
|
}
|
|
142
|
-
|
|
191
|
+
const next = withUpdatedAgent(existing, opts.agentId, (prev) => ({ ...prev, lastInvocation: opts.invocation }), opts.grounderVersion);
|
|
192
|
+
await writeGrounderState(next, opts.homeDir);
|
|
143
193
|
}
|
|
144
|
-
/**
|
|
145
|
-
|
|
146
|
-
|
|
194
|
+
/**
|
|
195
|
+
* Shared by `touchGrounderVersion`'s own no-op guard and `migrate`/`setup`'s
|
|
196
|
+
* reported "did the ledger change" row, so the two can't independently drift
|
|
197
|
+
* on the same comparison.
|
|
198
|
+
*/
|
|
199
|
+
export function ledgerVersionChanged(existing, grounderVersion) {
|
|
200
|
+
return existing?.grounderVersion !== grounderVersion;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Stamp `grounderVersion` unconditionally — the hook for an all-noop plan
|
|
204
|
+
* (nothing else in a per-artifact write loop touches it when every entry was
|
|
205
|
+
* `noop`), so the upgrade banner still clears on a fully-current machine.
|
|
206
|
+
*/
|
|
207
|
+
export async function touchGrounderVersion(grounderVersion, homeDir) {
|
|
208
|
+
const existing = await readGrounderState(homeDir);
|
|
209
|
+
if (!ledgerVersionChanged(existing, grounderVersion)) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
await writeGrounderState({ ledgerSchema: LEDGER_SCHEMA, grounderVersion, agents: existing?.agents ?? {} }, homeDir);
|
|
147
213
|
}
|
|
148
214
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
215
|
+
* Write-path-only hard stop (gap 2): an older binary reconciling a ledger
|
|
216
|
+
* written by a newer one must refuse to write, not silently overwrite newer
|
|
217
|
+
* skill files with older ones. Never called from `doctor`/`status`/`peek` —
|
|
218
|
+
* those keep today's warning and stay fully functional against a newer
|
|
219
|
+
* ledger (see `package-version-notice.ts`'s `"behind"` branch).
|
|
151
220
|
*/
|
|
152
|
-
export function
|
|
221
|
+
export function assertVersionSupportsWrite(runningVersion, state) {
|
|
153
222
|
if (!state) {
|
|
154
223
|
return;
|
|
155
224
|
}
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
}
|
|
225
|
+
if (packageVersionRelation(runningVersion, state.grounderVersion) === "behind") {
|
|
226
|
+
throw new UnsupportedSchemaError(`This Grounder (${runningVersion}) is older than your configuration (${state.grounderVersion}). Install a newer Grounder.`);
|
|
169
227
|
}
|
|
170
228
|
}
|
|
171
229
|
//# sourceMappingURL=state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/connector/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/connector/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,8 @@ import type { RepoConfig } from "./repo.js";
|
|
|
7
7
|
export declare function resolveVaultRoot(home: HomeConfig, override?: string): string;
|
|
8
8
|
/** Project notes directory under the effective vault root. */
|
|
9
9
|
export declare function resolveNotesDir(home: HomeConfig, repo: RepoConfig, vaultOverride?: string): string;
|
|
10
|
+
/** Project vault root directory under the effective vault root. */
|
|
11
|
+
export declare function resolveProjectVaultRoot(home: HomeConfig, repo: RepoConfig, vaultOverride?: string): string;
|
|
10
12
|
/** Project logs (handoff) directory under the effective vault root. */
|
|
11
13
|
export declare function resolveLogsDir(home: HomeConfig, repo: RepoConfig, vaultOverride?: string): string;
|
|
12
14
|
/** Project plans directory under the effective vault root. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/connector/vault.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ5E;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjG;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR"}
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/connector/vault.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ5E;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR;AAED,mEAAmE;AACnE,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjG;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAGR"}
|
package/dist/connector/vault.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Config-aware vault resolution: effective vault root and artifact paths from connector state.
|
|
2
2
|
import { resolveUserPath } from "../util/path.js";
|
|
3
|
-
import { logsDir, notesDir, plansDir } from "../vault/layout.js";
|
|
3
|
+
import { logsDir, notesDir, plansDir, projectDir } from "../vault/layout.js";
|
|
4
4
|
/**
|
|
5
5
|
* Effective vault root, in order: explicit `override`, `GROUNDER_VAULT`, then home config.
|
|
6
6
|
* Expands a leading `~` so vault paths like `~/Documents/…` resolve to the user home.
|
|
@@ -19,6 +19,11 @@ export function resolveNotesDir(home, repo, vaultOverride) {
|
|
|
19
19
|
const vaultRoot = resolveVaultRoot(home, vaultOverride);
|
|
20
20
|
return notesDir(vaultRoot, repo.projectId);
|
|
21
21
|
}
|
|
22
|
+
/** Project vault root directory under the effective vault root. */
|
|
23
|
+
export function resolveProjectVaultRoot(home, repo, vaultOverride) {
|
|
24
|
+
const vaultRoot = resolveVaultRoot(home, vaultOverride);
|
|
25
|
+
return projectDir(vaultRoot, repo.projectId);
|
|
26
|
+
}
|
|
22
27
|
/** Project logs (handoff) directory under the effective vault root. */
|
|
23
28
|
export function resolveLogsDir(home, repo, vaultOverride) {
|
|
24
29
|
const vaultRoot = resolveVaultRoot(home, vaultOverride);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/connector/vault.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/connector/vault.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAI7E;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,QAAiB;IAClE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAC7B,IAAgB,EAChB,IAAgB,EAChB,aAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,uBAAuB,CACrC,IAAgB,EAChB,IAAgB,EAChB,aAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAgB,EAAE,aAAsB;IACvF,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAC7B,IAAgB,EAChB,IAAgB,EAChB,aAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/help.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Help tiers and command metadata for the grounder CLI. */
|
|
2
|
-
export type HelpGroup = "Setup" | "Write" | "Paths" | "Maintain" | "Advanced";
|
|
2
|
+
export type HelpGroup = "Setup" | "Write" | "Retrieve" | "Paths" | "Maintain" | "Advanced";
|
|
3
3
|
export interface CommandMeta {
|
|
4
|
-
/** Canonical id (`note`, `handoff list`, `
|
|
4
|
+
/** Canonical id (`note`, `handoff list`, `setup`, …). */
|
|
5
5
|
id: string;
|
|
6
6
|
group: HelpGroup;
|
|
7
7
|
/** One-line summary for synopsis / full command lists. */
|
|
@@ -24,7 +24,7 @@ export declare const COMMANDS: readonly CommandMeta[];
|
|
|
24
24
|
* Command ids the CLI dispatches (including parent topics). Keep in sync with
|
|
25
25
|
* `cli.ts` / `helpExitCode(...)` call sites — the invariant test locks this.
|
|
26
26
|
*/
|
|
27
|
-
export declare const DISPATCHED_COMMAND_IDS: readonly ["
|
|
27
|
+
export declare const DISPATCHED_COMMAND_IDS: readonly ["setup", "link", "note", "note list", "handoff", "handoff list", "handoff peek", "plan", "plan list", "search", "overview", "path", "path notes", "path logs", "path plans", "status", "doctor", "migrate", "help"];
|
|
28
28
|
/** True when argv contains an exact `-h` or `--help` token. */
|
|
29
29
|
export declare function wantsHelp(argv: string[]): boolean;
|
|
30
30
|
/**
|
package/dist/help.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;AAE3F,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAaD;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,SAAS,WAAW,EA0O1C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,+NAoBzB,CAAC;AAIX,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,SAAS,CAY9E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CASxD;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAMrD;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM7E;AAkDD,8EAA8E;AAC9E,wBAAgB,aAAa,IAAI,IAAI,CAepC;AAED,sFAAsF;AACtF,wBAAgB,aAAa,IAAI,IAAI,CAepC;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAe9C"}
|