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/help.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/** Help tiers and command metadata for the grounder CLI. */
|
|
2
|
-
const GROUP_ORDER = ["Setup", "Write", "Paths", "Maintain", "Advanced"];
|
|
2
|
+
const GROUP_ORDER = ["Setup", "Write", "Retrieve", "Paths", "Maintain", "Advanced"];
|
|
3
3
|
const QUICKSTART = `Quickstart:
|
|
4
|
-
grounder
|
|
5
|
-
grounder
|
|
4
|
+
grounder setup <path-to-your-vault>
|
|
5
|
+
grounder link
|
|
6
6
|
grounder note "my first note"
|
|
7
7
|
grounder handoff $'# Handoff\\n\\n## Next\\n1. …'
|
|
8
8
|
grounder handoff list
|
|
@@ -14,109 +14,139 @@ const QUICKSTART = `Quickstart:
|
|
|
14
14
|
*/
|
|
15
15
|
export const COMMANDS = [
|
|
16
16
|
{
|
|
17
|
-
id: "
|
|
17
|
+
id: "setup",
|
|
18
18
|
group: "Setup",
|
|
19
|
-
summary: "
|
|
20
|
-
listUsage: "
|
|
21
|
-
usage: "grounder
|
|
22
|
-
list: false,
|
|
23
|
-
flags: `Subcommands:
|
|
24
|
-
vault init Initialize vault + home config (once per machine)`,
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
id: "vault init",
|
|
28
|
-
group: "Setup",
|
|
29
|
-
summary: "Initialize vault + home config (once per machine)",
|
|
30
|
-
listUsage: "vault init <path>",
|
|
31
|
-
usage: "grounder vault init <path> [--yes] [--force] [--agent <id>] [--hooks]",
|
|
19
|
+
summary: "Connect to a markdown vault (once per machine)",
|
|
20
|
+
listUsage: "setup <path>",
|
|
21
|
+
usage: "grounder setup <path> [--yes] [--force] [--agent <id>] [--hooks] [--dry-run]",
|
|
32
22
|
flags: `Flags:
|
|
33
23
|
--yes Skip confirmation prompts
|
|
34
24
|
--force Overwrite existing home config / generated files
|
|
35
25
|
--agent <id> Install for a specific agent (repeatable; default: auto-detect)
|
|
36
26
|
Supported: cursor, claude
|
|
37
|
-
--hooks Also install session-start teaser hooks
|
|
27
|
+
--hooks Also install session-start teaser hooks
|
|
28
|
+
--dry-run Preview without writing`,
|
|
38
29
|
},
|
|
39
30
|
{
|
|
40
|
-
id: "
|
|
31
|
+
id: "link",
|
|
41
32
|
group: "Setup",
|
|
42
|
-
summary: "
|
|
43
|
-
listUsage: "
|
|
44
|
-
usage: "grounder
|
|
33
|
+
summary: "Link this project inside the markdown vault (once per project)",
|
|
34
|
+
listUsage: "link",
|
|
35
|
+
usage: "grounder link [--yes] [--force] [--id <id>] [--vault <path>] [--dry-run]",
|
|
45
36
|
flags: `Flags:
|
|
46
37
|
--yes Skip confirmation prompts
|
|
47
38
|
--force Overwrite an existing link marker
|
|
48
39
|
--id <id> Override detected project id
|
|
49
|
-
--vault <path> Override home vault root for this run
|
|
40
|
+
--vault <path> Override home vault root for this run
|
|
41
|
+
--dry-run Preview without writing`,
|
|
50
42
|
},
|
|
51
43
|
{
|
|
52
44
|
id: "note",
|
|
53
45
|
group: "Write",
|
|
54
46
|
summary: "Write a note to the vault",
|
|
55
47
|
listUsage: "note <text>",
|
|
56
|
-
usage: "grounder note <text> [--title <slug>]",
|
|
48
|
+
usage: "grounder note <text> [--title <slug>] [--topics <list>]",
|
|
57
49
|
flags: `Flags:
|
|
58
|
-
--title <slug>
|
|
50
|
+
--title <slug> Short slug in filename (default: slugified first line)
|
|
51
|
+
--topics <list> Comma-separated keywords for search (e.g. "auth,jwt,session")
|
|
59
52
|
|
|
60
53
|
Subcommands:
|
|
61
|
-
note list Print recent notes
|
|
54
|
+
note list Print recent notes under notes/** (bucket-relative titles, newest first)`,
|
|
62
55
|
},
|
|
63
56
|
{
|
|
64
57
|
id: "note list",
|
|
65
58
|
group: "Write",
|
|
66
|
-
summary: "Print recent notes
|
|
59
|
+
summary: "Print recent notes under notes/** (bucket-relative titles, newest first)",
|
|
67
60
|
listUsage: "note list",
|
|
68
|
-
usage: "grounder note list [--limit <n>]",
|
|
61
|
+
usage: "grounder note list [--limit <n>] [--markdown]",
|
|
69
62
|
flags: `Flags:
|
|
70
|
-
--limit <n> Max notes to print (default: 5)
|
|
63
|
+
--limit <n> Max notes to print (default: 5)
|
|
64
|
+
--markdown Agent relay: [bucketRelativePath](fileUri) title lines
|
|
65
|
+
(lists notes/**; nested e.g. feature/name.md)`,
|
|
71
66
|
},
|
|
72
67
|
{
|
|
73
68
|
id: "handoff",
|
|
74
69
|
group: "Write",
|
|
75
70
|
summary: "Write a session handoff to vault logs/",
|
|
76
71
|
listUsage: "handoff <text>",
|
|
77
|
-
usage: "grounder handoff <text> [--title <slug>]",
|
|
72
|
+
usage: "grounder handoff <text> [--title <slug>] [--topics <list>]",
|
|
78
73
|
flags: `Flags:
|
|
79
|
-
--title <slug>
|
|
74
|
+
--title <slug> Short slug in filename (default: slugified first line)
|
|
75
|
+
--topics <list> Comma-separated keywords for search (e.g. "auth,jwt,session")
|
|
80
76
|
|
|
81
77
|
Subcommands:
|
|
82
|
-
handoff list Print recent handoffs
|
|
78
|
+
handoff list Print recent handoffs under logs/** (bucket-relative titles, newest first)
|
|
83
79
|
handoff peek One-line latest-handoff teaser (session hooks)`,
|
|
84
80
|
},
|
|
85
81
|
{
|
|
86
82
|
id: "handoff list",
|
|
87
83
|
group: "Write",
|
|
88
|
-
summary: "Print recent handoffs
|
|
84
|
+
summary: "Print recent handoffs under logs/** (bucket-relative titles, newest first)",
|
|
89
85
|
listUsage: "handoff list",
|
|
90
|
-
usage: "grounder handoff list [--limit <n>] [--head]",
|
|
86
|
+
usage: "grounder handoff list [--limit <n>] [--head] [--markdown]",
|
|
91
87
|
flags: `Flags:
|
|
92
88
|
--limit <n> Max handoffs to print (default: 5)
|
|
93
89
|
--head Print only the newest usable path
|
|
94
|
-
(skips empty/unreadable files; same pick as handoff peek)
|
|
90
|
+
(skips empty/unreadable files; same pick as handoff peek)
|
|
91
|
+
--markdown Agent relay: [bucketRelativePath](fileUri) title lines
|
|
92
|
+
(lists logs/**; nested e.g. feature/name.md; not with --head)`,
|
|
95
93
|
},
|
|
96
94
|
{
|
|
97
95
|
id: "plan",
|
|
98
96
|
group: "Write",
|
|
99
97
|
summary: "Write/update a named plan under vault plans/",
|
|
100
98
|
listUsage: "plan <text>",
|
|
101
|
-
usage: "grounder plan <text> (--title <name> [--force] | --path <file>)",
|
|
99
|
+
usage: "grounder plan <text> (--title <name> [--force] | --path <file>) [--topics <list>]",
|
|
102
100
|
flags: `Flags:
|
|
103
|
-
--title <name>
|
|
104
|
-
|
|
105
|
-
--path <file>
|
|
106
|
-
|
|
107
|
-
--force
|
|
101
|
+
--title <name> Required filename stem when creating/updating by name
|
|
102
|
+
(trailing .md ok; sanitized, max 80 chars)
|
|
103
|
+
--path <file> Update an existing plan by path (must resolve under this
|
|
104
|
+
project's plans/; no title sanitization; always overwrites)
|
|
105
|
+
--force With --title: overwrite an existing plan (preserves created)
|
|
106
|
+
--topics <list> Comma-separated keywords for search (e.g. "caching,redis,api").
|
|
107
|
+
On update, omit to keep existing topics.
|
|
108
108
|
|
|
109
109
|
Subcommands:
|
|
110
|
-
plan list Print recent plans
|
|
110
|
+
plan list Print recent plans under plans/** (bucket-relative titles, newest first)`,
|
|
111
111
|
},
|
|
112
112
|
{
|
|
113
113
|
id: "plan list",
|
|
114
114
|
group: "Write",
|
|
115
|
-
summary: "Print recent plans
|
|
115
|
+
summary: "Print recent plans under plans/** (bucket-relative titles, newest first)",
|
|
116
116
|
listUsage: "plan list",
|
|
117
|
-
usage: "grounder plan list [--limit <n>]",
|
|
117
|
+
usage: "grounder plan list [--limit <n>] [--markdown]",
|
|
118
118
|
flags: `Flags:
|
|
119
|
-
--limit <n> Max plans to print (default: 5)
|
|
119
|
+
--limit <n> Max plans to print (default: 5)
|
|
120
|
+
--markdown Agent relay: [bucketRelativePath](fileUri) title lines
|
|
121
|
+
(lists plans/**; nested e.g. migration/cutover.md)`,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
id: "search",
|
|
125
|
+
group: "Retrieve",
|
|
126
|
+
summary: "Search linked project vault for keywords (scoped retrieval)",
|
|
127
|
+
listUsage: "search <query>",
|
|
128
|
+
usage: "grounder search <query> [--terms <csv>] [--limit <n>] [--max-hits <n>] [--context <n>] [--since <date>] [--markdown] [--json]",
|
|
129
|
+
flags: `Flags:
|
|
130
|
+
--terms <csv> Extra keyword variants (comma-separated)
|
|
131
|
+
--limit <n> Max files to print (default: 10)
|
|
132
|
+
--max-hits <n> Max stored line snippets per file during scan (default: 50)
|
|
133
|
+
--context <n> Context lines around each snippet (default: 1)
|
|
134
|
+
--since <date> Only files modified on or after date (YYYY-MM-DD local midnight, or Nd, e.g. 7d)
|
|
135
|
+
--after <date> Alias for --since
|
|
136
|
+
--markdown Agent relay: file:// links + fenced snippets
|
|
137
|
+
--json Structured output (relativePath, fileUri, alsoMatchedHint per hit)`,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: "overview",
|
|
141
|
+
group: "Retrieve",
|
|
142
|
+
summary: "Bird's-eye view: counts + recent titles across notes/handoffs/plans",
|
|
143
|
+
listUsage: "overview",
|
|
144
|
+
usage: "grounder overview [--limit <n>] [--markdown] [--json]",
|
|
145
|
+
flags: `Flags:
|
|
146
|
+
--limit <n> Max recent titles to print per bucket (default: 3)
|
|
147
|
+
--markdown Agent relay: [bucketRelativePath](fileUri) title lines
|
|
148
|
+
--json Structured output (total, count, truncated, items per bucket;
|
|
149
|
+
each item includes mtimeMs)`,
|
|
120
150
|
},
|
|
121
151
|
{
|
|
122
152
|
id: "path notes",
|
|
@@ -156,7 +186,9 @@ Subcommands:
|
|
|
156
186
|
group: "Maintain",
|
|
157
187
|
summary: "Snapshot of machine + project link + resolved paths",
|
|
158
188
|
listUsage: "status",
|
|
159
|
-
usage: "grounder status",
|
|
189
|
+
usage: "grounder status [--json]",
|
|
190
|
+
flags: `Flags:
|
|
191
|
+
--json Print a single-line JSON payload instead of formatted text`,
|
|
160
192
|
},
|
|
161
193
|
{
|
|
162
194
|
id: "doctor",
|
|
@@ -172,13 +204,20 @@ Subcommands:
|
|
|
172
204
|
group: "Maintain",
|
|
173
205
|
summary: "Refresh agent install after upgrading grounder",
|
|
174
206
|
listUsage: "migrate",
|
|
175
|
-
usage: "grounder migrate [--force] [--dry-run] [--agent <id>] [--hooks]",
|
|
207
|
+
usage: "grounder migrate [--force] [--dry-run] [--agent <id>] [--hooks | --no-hooks]",
|
|
176
208
|
flags: `Flags:
|
|
177
|
-
--force Overwrite
|
|
178
|
-
once when upgrading from Grounder before 0.3
|
|
209
|
+
--force Overwrite skill files you edited locally; also needed
|
|
210
|
+
once when upgrading from Grounder before 0.3. Also
|
|
211
|
+
deletes locally-edited pre-skill grounder-*.md command
|
|
212
|
+
files left over from before 0.6 (edits are not ported)
|
|
179
213
|
--dry-run Preview without writing
|
|
180
214
|
--agent <id> Limit to a specific agent (repeatable)
|
|
181
|
-
--hooks Also install hooks if not previously installed
|
|
215
|
+
--hooks Also install hooks if not previously installed
|
|
216
|
+
--no-hooks Turn hooks off and remove the installed hook entry
|
|
217
|
+
(sticky — a later plain migrate will not re-enable it)
|
|
218
|
+
|
|
219
|
+
Also retires pre-skill grounder-*.md command files superseded by
|
|
220
|
+
SKILL.md packaging (safe ones automatically; edited ones need --force).`,
|
|
182
221
|
},
|
|
183
222
|
{
|
|
184
223
|
id: "handoff peek",
|
|
@@ -204,7 +243,7 @@ Examples:
|
|
|
204
243
|
grounder help
|
|
205
244
|
grounder help note
|
|
206
245
|
grounder help handoff list
|
|
207
|
-
grounder help
|
|
246
|
+
grounder help setup`,
|
|
208
247
|
},
|
|
209
248
|
];
|
|
210
249
|
/**
|
|
@@ -212,9 +251,8 @@ Examples:
|
|
|
212
251
|
* `cli.ts` / `helpExitCode(...)` call sites — the invariant test locks this.
|
|
213
252
|
*/
|
|
214
253
|
export const DISPATCHED_COMMAND_IDS = [
|
|
215
|
-
"
|
|
216
|
-
"
|
|
217
|
-
"init",
|
|
254
|
+
"setup",
|
|
255
|
+
"link",
|
|
218
256
|
"note",
|
|
219
257
|
"note list",
|
|
220
258
|
"handoff",
|
|
@@ -222,6 +260,8 @@ export const DISPATCHED_COMMAND_IDS = [
|
|
|
222
260
|
"handoff peek",
|
|
223
261
|
"plan",
|
|
224
262
|
"plan list",
|
|
263
|
+
"search",
|
|
264
|
+
"overview",
|
|
225
265
|
"path",
|
|
226
266
|
"path notes",
|
|
227
267
|
"path logs",
|
|
@@ -316,9 +356,10 @@ function formatFullCommandDetails() {
|
|
|
316
356
|
}
|
|
317
357
|
return blocks.join("\n\n");
|
|
318
358
|
}
|
|
359
|
+
const BANNER = "grounder — markdown-native memory for AI agents";
|
|
319
360
|
/** Bare `grounder` / `-h` — short grouped synopsis (no flag encyclopedia). */
|
|
320
361
|
export function printSynopsis() {
|
|
321
|
-
process.stdout.write(
|
|
362
|
+
process.stdout.write(`${BANNER}
|
|
322
363
|
|
|
323
364
|
${formatGroupedLists()}
|
|
324
365
|
|
|
@@ -335,7 +376,7 @@ ${QUICKSTART}
|
|
|
335
376
|
}
|
|
336
377
|
/** `--help` / `grounder help` with no args — one-shot reference for humans/agents. */
|
|
337
378
|
export function printFullHelp() {
|
|
338
|
-
process.stdout.write(
|
|
379
|
+
process.stdout.write(`${BANNER}
|
|
339
380
|
|
|
340
381
|
${formatGroupedLists()}
|
|
341
382
|
|
package/dist/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAoB5D,MAAM,WAAW,GAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type PlanEntry } from "./core.js";
|
|
2
|
+
export interface ApplyPlanOptions {
|
|
3
|
+
agentId: string;
|
|
4
|
+
plan: readonly PlanEntry[];
|
|
5
|
+
/** Desired content for `create`/`update`/`noop` entries — path → rendered bytes. */
|
|
6
|
+
content: Record<string, string>;
|
|
7
|
+
grounderVersion: string;
|
|
8
|
+
homeDir?: string;
|
|
9
|
+
/**
|
|
10
|
+
* Directories this agent is allowed to write into / delete from (its own
|
|
11
|
+
* `AgentAdapter#ownedPrefixes`) — re-checked here via
|
|
12
|
+
* {@link isUnderOwnedPrefix}, not trusted solely from the caller, so a plan
|
|
13
|
+
* built from a stray/corrupted ledger entry can never be applied as a
|
|
14
|
+
* filesystem write outside the agent's own tree.
|
|
15
|
+
*/
|
|
16
|
+
ownedPrefixes: readonly string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Execute a whole-file plan: write/delete each path, and persist that path's
|
|
20
|
+
* ledger hash right after its own file write succeeds (per-artifact, not
|
|
21
|
+
* batched) — a mid-run crash leaves the ledger consistent with whatever
|
|
22
|
+
* actually completed.
|
|
23
|
+
*
|
|
24
|
+
* Returns nothing: callers render their tables from the `PlanEntry[]` they
|
|
25
|
+
* passed in (see `commands/render-artifact-table.ts`'s
|
|
26
|
+
* `rowStatusFromPlanAction`), so a second per-path outcome vocabulary here
|
|
27
|
+
* would only be a chance for the two to disagree. Failure is a throw, not a
|
|
28
|
+
* status — every entry that doesn't throw did exactly what its action says.
|
|
29
|
+
*/
|
|
30
|
+
export declare function applyPlan(opts: ApplyPlanOptions): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/reconcile/apply.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IAC3B,oFAAoF;IACpF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFrE"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { unlink } from "node:fs/promises";
|
|
2
|
+
import { forgetLedgerFile, setLedgerFileHash } from "../connector/state.js";
|
|
3
|
+
import { writeFileAtomic } from "../util/fs.js";
|
|
4
|
+
import { hashContent } from "../util/hash.js";
|
|
5
|
+
import { isUnderOwnedPrefix } from "./core.js";
|
|
6
|
+
/**
|
|
7
|
+
* Execute a whole-file plan: write/delete each path, and persist that path's
|
|
8
|
+
* ledger hash right after its own file write succeeds (per-artifact, not
|
|
9
|
+
* batched) — a mid-run crash leaves the ledger consistent with whatever
|
|
10
|
+
* actually completed.
|
|
11
|
+
*
|
|
12
|
+
* Returns nothing: callers render their tables from the `PlanEntry[]` they
|
|
13
|
+
* passed in (see `commands/render-artifact-table.ts`'s
|
|
14
|
+
* `rowStatusFromPlanAction`), so a second per-path outcome vocabulary here
|
|
15
|
+
* would only be a chance for the two to disagree. Failure is a throw, not a
|
|
16
|
+
* status — every entry that doesn't throw did exactly what its action says.
|
|
17
|
+
*/
|
|
18
|
+
export async function applyPlan(opts) {
|
|
19
|
+
for (const entry of opts.plan) {
|
|
20
|
+
if ((entry.action === "create" || entry.action === "update" || entry.action === "delete") &&
|
|
21
|
+
!isUnderOwnedPrefix(entry.path, opts.ownedPrefixes)) {
|
|
22
|
+
throw new Error(`Refusing to ${entry.action} ${entry.path}: outside ${opts.agentId}'s owned prefixes`);
|
|
23
|
+
}
|
|
24
|
+
switch (entry.action) {
|
|
25
|
+
case "create":
|
|
26
|
+
case "update": {
|
|
27
|
+
const content = opts.content[entry.path];
|
|
28
|
+
if (content === undefined) {
|
|
29
|
+
throw new Error(`No desired content for ${entry.path} (action: ${entry.action})`);
|
|
30
|
+
}
|
|
31
|
+
await writeFileAtomic(entry.path, content);
|
|
32
|
+
await setLedgerFileHash({
|
|
33
|
+
agentId: opts.agentId,
|
|
34
|
+
filePath: entry.path,
|
|
35
|
+
hash: hashContent(content),
|
|
36
|
+
grounderVersion: opts.grounderVersion,
|
|
37
|
+
homeDir: opts.homeDir,
|
|
38
|
+
});
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
case "noop": {
|
|
42
|
+
// A desired path already matching on disk — hydrate the ledger hash
|
|
43
|
+
// when it wasn't recorded yet (or recorded stale), so a manually
|
|
44
|
+
// correct file becomes safely Grounder-managed going forward.
|
|
45
|
+
const content = opts.content[entry.path];
|
|
46
|
+
if (content !== undefined) {
|
|
47
|
+
await setLedgerFileHash({
|
|
48
|
+
agentId: opts.agentId,
|
|
49
|
+
filePath: entry.path,
|
|
50
|
+
hash: hashContent(content),
|
|
51
|
+
grounderVersion: opts.grounderVersion,
|
|
52
|
+
homeDir: opts.homeDir,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case "delete": {
|
|
58
|
+
try {
|
|
59
|
+
await unlink(entry.path);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error.code !== "ENOENT") {
|
|
63
|
+
// A real failure (EACCES, EISDIR, …) — propagate rather than
|
|
64
|
+
// forgetting the ledger hash for a file that's still on disk;
|
|
65
|
+
// swallowing it here would leave the ledger and disk permanently
|
|
66
|
+
// disagreeing, with no way for a future run to notice and retry.
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
await forgetLedgerFile({
|
|
71
|
+
agentId: opts.agentId,
|
|
72
|
+
filePath: entry.path,
|
|
73
|
+
grounderVersion: opts.grounderVersion,
|
|
74
|
+
homeDir: opts.homeDir,
|
|
75
|
+
});
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case "forget": {
|
|
79
|
+
// Already gone from disk, but the ledger still holds a stale hash
|
|
80
|
+
// (removed outside `migrate`) — drop it so it doesn't linger forever.
|
|
81
|
+
await forgetLedgerFile({
|
|
82
|
+
agentId: opts.agentId,
|
|
83
|
+
filePath: entry.path,
|
|
84
|
+
grounderVersion: opts.grounderVersion,
|
|
85
|
+
homeDir: opts.homeDir,
|
|
86
|
+
});
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
case "conflict":
|
|
90
|
+
// Left alone on purpose — on-disk content Grounder can't confirm it
|
|
91
|
+
// wrote. `--force` is what turns this into an `update`/`delete`
|
|
92
|
+
// upstream in `reconcile()`, so there is nothing to do here.
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/reconcile/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure reconciliation core — no I/O anywhere in this file.
|
|
3
|
+
*
|
|
4
|
+
* Two shapes, per the design: {@link desiredDrift} answers "would migrate
|
|
5
|
+
* change something" cheaply (ledger vs. rendered template hashes only, no
|
|
6
|
+
* disk read) for `peek`/`status`; {@link reconcile} is the full three-way
|
|
7
|
+
* (desired vs. ledger vs. on-disk) plan `setup`/`migrate`/`doctor` execute or
|
|
8
|
+
* preview. Modeled on chezmoi's source/destination/target state and dpkg's
|
|
9
|
+
* old-pristine/new-pristine/on-disk compare.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* True when `filePath` sits under one of `prefixes` (a directory, matched
|
|
13
|
+
* exactly or via a `prefix + separator` boundary — never a bare substring
|
|
14
|
+
* match, and never a `..`-segment escape). Callers use this to keep a
|
|
15
|
+
* ledger's extra/stray entries — a hand-edited or corrupted `state.json`,
|
|
16
|
+
* say — from ever being treated as delete candidates for paths outside the
|
|
17
|
+
* directories an adapter actually manages. Comparison is lexical
|
|
18
|
+
* (`path.resolve` + `path.relative`, no symlink following): both sides are
|
|
19
|
+
* resolved to absolute form first, so a `../` segment in `filePath` cannot
|
|
20
|
+
* walk back out of a prefix it superficially starts with.
|
|
21
|
+
* `reconcile()` itself stays agnostic to this (see its own docs); callers
|
|
22
|
+
* filter `ledger` before passing it in.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isUnderOwnedPrefix(filePath: string, prefixes: readonly string[]): boolean;
|
|
25
|
+
export type DriftKind = "create" | "update";
|
|
26
|
+
export interface DriftEntry {
|
|
27
|
+
path: string;
|
|
28
|
+
kind: DriftKind;
|
|
29
|
+
}
|
|
30
|
+
/** One agent's last-applied manifest — path → hash of the bytes Grounder wrote. */
|
|
31
|
+
export type LedgerManifest = Record<string, {
|
|
32
|
+
hash?: string;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Compare desired (rendered template) hashes against one agent's last-applied
|
|
36
|
+
* ledger manifest. No disk I/O — the caller renders + hashes templates, and
|
|
37
|
+
* passes in the ledger's `files` map already read from `state.json`.
|
|
38
|
+
*
|
|
39
|
+
* `ledger === undefined` means this agent has no ledger entry at all (never
|
|
40
|
+
* installed) — returns no drift. Scoping to ledger-recorded agents lives
|
|
41
|
+
* here, not in every caller: otherwise a detected-but-never-installed agent
|
|
42
|
+
* would tease `migrate` forever with no command able to silence it.
|
|
43
|
+
*
|
|
44
|
+
* Within a ledger-recorded agent, a desired path missing from its `files` map
|
|
45
|
+
* IS drift (`"create"`) — that's how a newly added skill file surfaces here.
|
|
46
|
+
*/
|
|
47
|
+
export declare function desiredDrift(desired: Record<string, string>, ledger: LedgerManifest | undefined): DriftEntry[];
|
|
48
|
+
export type PlanAction = "create" | "update" | "delete" | "conflict" | "noop" | "forget";
|
|
49
|
+
export interface PlanEntry {
|
|
50
|
+
path: string;
|
|
51
|
+
action: PlanAction;
|
|
52
|
+
/** Only set when `action === "conflict"` — which action `--force` would take. */
|
|
53
|
+
blockedAction?: "overwrite" | "delete";
|
|
54
|
+
}
|
|
55
|
+
/** path → on-disk content hash, `undefined` when the path does not exist. */
|
|
56
|
+
export type DiskHashes = Record<string, string | undefined>;
|
|
57
|
+
/**
|
|
58
|
+
* Full three-way reconcile for one agent's whole-file artifacts: desired
|
|
59
|
+
* (current templates) vs. ledger (last-applied) vs. disk (actual). Pure —
|
|
60
|
+
* `disk`/`ledger` are already-read snapshots, not live filesystem access.
|
|
61
|
+
*
|
|
62
|
+
* `tombstones` are extra "previously desired, no longer desired" paths
|
|
63
|
+
* (pre-skill command files, etc.) unioned into the retirement side of the
|
|
64
|
+
* diff even when the ledger never recorded them — the case a pure
|
|
65
|
+
* ledger-manifest diff is blind to (pre-hash-tracking installs).
|
|
66
|
+
*
|
|
67
|
+
* Safety: only ever call this for a known agent id whose `desired` this
|
|
68
|
+
* binary can actually compute — never for an unrecognized ledger entry,
|
|
69
|
+
* which would treat its entire recorded file set as delete candidates.
|
|
70
|
+
*/
|
|
71
|
+
export declare function reconcile(desired: Record<string, string>, tombstones: readonly string[], ledger: LedgerManifest | undefined, disk: DiskHashes, force: boolean): PlanEntry[];
|
|
72
|
+
/**
|
|
73
|
+
* Would applying `plan` actually change the ledger? Pure — mirrors exactly
|
|
74
|
+
* what `applyPlan()`'s per-artifact writes do (each has its own no-op guard):
|
|
75
|
+
* `create`/`update`/`noop` only write when the recorded hash would actually
|
|
76
|
+
* change; `delete` only forgets an entry that exists; `forget` always writes
|
|
77
|
+
* (by construction it only exists when there's something to forget);
|
|
78
|
+
* `conflict` never touches the ledger. Used so `--dry-run` and a real run
|
|
79
|
+
* predict/report the exact same thing for the exact same reason.
|
|
80
|
+
*/
|
|
81
|
+
export declare function planChangesLedger(plan: readonly PlanEntry[], ledger: LedgerManifest | undefined, desired: Record<string, string>): boolean;
|
|
82
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/reconcile/core.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAezF;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,mFAAmF;AACnF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE/D;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,MAAM,EAAE,cAAc,GAAG,SAAS,GACjC,UAAU,EAAE,CAcd;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,iFAAiF;IACjF,aAAa,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;CACxC;AAED,6EAA6E;AAC7E,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,OAAO,GACb,SAAS,EAAE,CA4Cb;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS,SAAS,EAAE,EAC1B,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAyBT"}
|