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/agents/claude.js
CHANGED
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
3
|
import { resolveHomeDir } from "../connector/home.js";
|
|
5
4
|
import { fileExists } from "../util/fs.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"grounder-task-handoff.md",
|
|
15
|
-
"grounder-task.md",
|
|
16
|
-
];
|
|
5
|
+
import { homeSkillsLayout } from "./home-skills.js";
|
|
6
|
+
import { readEventEntries, readHooksObject, removeMatchingEntries } from "./hook-fragment.js";
|
|
7
|
+
import { installHookFragment, removeHookFragment } from "./hook-install.js";
|
|
8
|
+
import { isGrounderPeekHookCommand, isHookRuntimeStale, peekHookCommand } from "./hook-runtime.js";
|
|
9
|
+
/** Whole-file artifacts: `~/.claude/skills/` plus the retired `~/.claude/commands/`. */
|
|
10
|
+
const layout = homeSkillsLayout({ id: "claude", agentDir: ".claude" });
|
|
11
|
+
/** Hook event Grounder owns in `settings.json`. */
|
|
12
|
+
const SESSION_START_EVENT = "SessionStart";
|
|
17
13
|
/**
|
|
18
14
|
* Canonical SessionStart command for Claude Code (home-local runtime, not `npx`).
|
|
19
|
-
* @see {@link peekHookCommand}
|
|
15
|
+
* @see {@link peekHookCommand}
|
|
20
16
|
*/
|
|
21
17
|
export function claudePeekHookCommand(homeDir) {
|
|
22
18
|
return peekHookCommand(homeDir);
|
|
@@ -26,27 +22,27 @@ export function claudePeekHookCommand(homeDir) {
|
|
|
26
22
|
* Excludes `resume` and `fork` — those sessions already carry prior context.
|
|
27
23
|
*/
|
|
28
24
|
export const CLAUDE_SESSION_START_MATCHER = "startup|clear|compact";
|
|
29
|
-
export function
|
|
30
|
-
return
|
|
25
|
+
export function claudeSkillsDir(homeDir) {
|
|
26
|
+
return layout.skillsDir(homeDir);
|
|
31
27
|
}
|
|
32
28
|
/** Absolute path to Claude Code's shared settings file (`~/.claude/settings.json`). */
|
|
33
29
|
export function claudeSettingsJsonPath(homeDir) {
|
|
34
30
|
return path.join(resolveHomeDir(homeDir), ".claude", "settings.json");
|
|
35
31
|
}
|
|
36
32
|
export function grounderNoteCommandPath(homeDir) {
|
|
37
|
-
return
|
|
33
|
+
return layout.skillPath("grounder-note", homeDir);
|
|
38
34
|
}
|
|
39
35
|
export function grounderPlanCommandPath(homeDir) {
|
|
40
|
-
return
|
|
36
|
+
return layout.skillPath("grounder-plan", homeDir);
|
|
41
37
|
}
|
|
42
|
-
export function
|
|
43
|
-
return
|
|
38
|
+
export function grounderHandoffCommandPath(homeDir) {
|
|
39
|
+
return layout.skillPath("grounder-handoff", homeDir);
|
|
44
40
|
}
|
|
45
|
-
export function
|
|
46
|
-
return
|
|
41
|
+
export function grounderRecallCommandPath(homeDir) {
|
|
42
|
+
return layout.skillPath("grounder-recall", homeDir);
|
|
47
43
|
}
|
|
48
44
|
export function expectedArtifacts(homeDir) {
|
|
49
|
-
return
|
|
45
|
+
return layout.expectedArtifacts(homeDir);
|
|
50
46
|
}
|
|
51
47
|
/** Paths of hook config this adapter touches — currently just `settings.json`. */
|
|
52
48
|
export function expectedHookArtifacts(homeDir) {
|
|
@@ -82,62 +78,86 @@ export function expectedHookArtifacts(homeDir) {
|
|
|
82
78
|
// - matcher group → { matcher, hooks: Hook[] }
|
|
83
79
|
// - hook entry → { type: "command", command: string }
|
|
84
80
|
//
|
|
85
|
-
// Idempotency: {@link isGrounderPeekHookCommand} (runtime path
|
|
81
|
+
// Idempotency / recognizer: {@link isGrounderPeekHookCommand} (runtime path
|
|
82
|
+
// or legacy npx). Always-converge (Ansible `blockinfile` / Kubernetes
|
|
83
|
+
// Server-Side Apply sole-owner model): every recognizer match — however many,
|
|
84
|
+
// wherever they live across matcher groups — is removed and replaced with
|
|
85
|
+
// exactly one canonical entry. No conflict / `--force` gate.
|
|
86
86
|
// ---------------------------------------------------------------------------
|
|
87
87
|
function peekHookEntry(homeDir) {
|
|
88
88
|
return { type: "command", command: claudePeekHookCommand(homeDir) };
|
|
89
89
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
90
|
+
function isClaudeHookEntry(hook) {
|
|
91
|
+
return (hook !== null &&
|
|
92
|
+
typeof hook === "object" &&
|
|
93
|
+
!Array.isArray(hook) &&
|
|
94
|
+
hook.type === "command" &&
|
|
95
|
+
isGrounderPeekHookCommand(hook.command));
|
|
96
|
+
}
|
|
97
|
+
function isMatcherGroup(group) {
|
|
98
|
+
return group !== null && typeof group === "object" && !Array.isArray(group);
|
|
99
|
+
}
|
|
100
|
+
/** Every Grounder hook entry across every matcher group, tagged with its group's matcher. */
|
|
101
|
+
function findAllPeekHooksPlaced(sessionStart) {
|
|
102
|
+
const found = [];
|
|
103
|
+
for (const group of sessionStart) {
|
|
104
|
+
if (!isMatcherGroup(group) || !Array.isArray(group.hooks)) {
|
|
104
105
|
continue;
|
|
105
106
|
}
|
|
106
|
-
for (
|
|
107
|
-
|
|
108
|
-
if (hook &&
|
|
109
|
-
typeof hook === "object" &&
|
|
110
|
-
!Array.isArray(hook) &&
|
|
111
|
-
isGrounderPeekHookCommand(hook.command)) {
|
|
112
|
-
return { groupIdx, hookIdx };
|
|
113
|
-
}
|
|
107
|
+
for (const hook of group.hooks.filter(isClaudeHookEntry)) {
|
|
108
|
+
found.push({ matcher: group.matcher, hook });
|
|
114
109
|
}
|
|
115
110
|
}
|
|
116
|
-
return
|
|
111
|
+
return found;
|
|
117
112
|
}
|
|
118
|
-
/**
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return false;
|
|
113
|
+
/** Every Grounder hook entry across every matcher group, flattened. */
|
|
114
|
+
function findAllPeekHooks(sessionStart) {
|
|
115
|
+
return findAllPeekHooksPlaced(sessionStart).map((placed) => placed.hook);
|
|
116
|
+
}
|
|
117
|
+
/** Remove every Grounder hook entry from every matcher group's `hooks` array. */
|
|
118
|
+
function removeAllPeekHooks(sessionStart) {
|
|
119
|
+
return sessionStart.map((group) => {
|
|
120
|
+
if (!isMatcherGroup(group) || !Array.isArray(group.hooks)) {
|
|
121
|
+
return group;
|
|
128
122
|
}
|
|
129
|
-
|
|
130
|
-
|
|
123
|
+
return { ...group, hooks: removeMatchingEntries(group.hooks, isClaudeHookEntry) };
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
function hasHooks(group) {
|
|
127
|
+
return isMatcherGroup(group) && Array.isArray(group.hooks) && group.hooks.length > 0;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Drop matcher groups that removal itself emptied — i.e. `next[i]` has no
|
|
131
|
+
* hooks left but `before[i]` (same index, pre-removal) did. A group that was
|
|
132
|
+
* already empty for reasons of its own (not something Grounder touched) is
|
|
133
|
+
* left alone: it isn't clutter Grounder created room for, so it isn't
|
|
134
|
+
* Grounder's call to delete it. `next` may be longer than `before` (a newly
|
|
135
|
+
* appended canonical group) — those extra entries always have hooks, so the
|
|
136
|
+
* length mismatch never reaches the `before[i]` lookup.
|
|
137
|
+
*/
|
|
138
|
+
function dropGroupsEmptiedByRemoval(before, next) {
|
|
139
|
+
return next.filter((group, i) => hasHooks(group) || !hasHooks(before[i]));
|
|
140
|
+
}
|
|
141
|
+
/** `hooks.SessionStart` from a settings.json on disk; `null` if absent or unreadable. */
|
|
142
|
+
async function readSessionStart(filePath) {
|
|
143
|
+
try {
|
|
144
|
+
return readEventEntries(JSON.parse(await readFile(filePath, "utf8")), SESSION_START_EVENT);
|
|
131
145
|
}
|
|
132
146
|
catch {
|
|
133
|
-
return
|
|
147
|
+
return null;
|
|
134
148
|
}
|
|
135
149
|
}
|
|
150
|
+
/** Whether `settings.json` already lists any Grounder peek command (for status labeling). */
|
|
151
|
+
async function peekHookHadGrounderEntry(filePath) {
|
|
152
|
+
return findAllPeekHooks((await readSessionStart(filePath)) ?? []).length > 0;
|
|
153
|
+
}
|
|
136
154
|
/**
|
|
137
|
-
* Skip only when
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
155
|
+
* Skip only when exactly one canonical entry is already present *under the
|
|
156
|
+
* canonical matcher group* ({@link CLAUDE_SESSION_START_MATCHER}) *and* the
|
|
157
|
+
* runtime is current for the running grounder version/source. Anything else
|
|
158
|
+
* — no entry, a legacy `npx` form, a drifted command, more than one match
|
|
159
|
+
* (however scattered across matcher groups), or the one match sitting under
|
|
160
|
+
* the wrong matcher — always converges.
|
|
141
161
|
*/
|
|
142
162
|
async function peekHookUpToDate(filePath, homeDir) {
|
|
143
163
|
if (!(await fileExists(filePath))) {
|
|
@@ -146,149 +166,109 @@ async function peekHookUpToDate(filePath, homeDir) {
|
|
|
146
166
|
if (await isHookRuntimeStale(homeDir)) {
|
|
147
167
|
return false;
|
|
148
168
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
const hooks = parsed.hooks;
|
|
155
|
-
if (!hooks || typeof hooks !== "object" || Array.isArray(hooks)) {
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
const sessionStart = hooks.SessionStart;
|
|
159
|
-
if (!Array.isArray(sessionStart)) {
|
|
160
|
-
return false;
|
|
161
|
-
}
|
|
162
|
-
const found = findPeekHook(sessionStart);
|
|
163
|
-
if (!found) {
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
const group = sessionStart[found.groupIdx];
|
|
167
|
-
return group.hooks[found.hookIdx]?.command === claudePeekHookCommand(homeDir);
|
|
169
|
+
const sessionStart = await readSessionStart(filePath);
|
|
170
|
+
if (!sessionStart) {
|
|
171
|
+
return false;
|
|
168
172
|
}
|
|
169
|
-
|
|
173
|
+
const placed = findAllPeekHooksPlaced(sessionStart);
|
|
174
|
+
if (placed.length !== 1 || placed[0].matcher !== CLAUDE_SESSION_START_MATCHER) {
|
|
170
175
|
return false;
|
|
171
176
|
}
|
|
177
|
+
return JSON.stringify(placed[0].hook) === JSON.stringify(peekHookEntry(homeDir));
|
|
172
178
|
}
|
|
173
179
|
/**
|
|
174
|
-
*
|
|
180
|
+
* Converge Grounder's SessionStart hook into an existing settings object:
|
|
181
|
+
* remove every recognizer match from every matcher group, then insert
|
|
182
|
+
* exactly one canonical entry.
|
|
183
|
+
*
|
|
184
|
+
* Preserves every key except the nested path it owns. Insertion strategy
|
|
185
|
+
* (after removal, so this always runs against a Grounder-free tree):
|
|
186
|
+
* 1. A matcher group with `matcher === CLAUDE_SESSION_START_MATCHER` exists
|
|
187
|
+
* (possibly the very one a match was just removed from) → append there.
|
|
188
|
+
* 2. Else → push a new matcher group with Grounder's hook.
|
|
175
189
|
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
* append Grounder's hook to that group's `hooks` array.
|
|
180
|
-
* 3. Else → push a new matcher group with Grounder's hook.
|
|
190
|
+
* Any matcher group the removal step emptied — e.g. a Grounder-only hook
|
|
191
|
+
* that lived under a non-canonical matcher — is dropped rather than left
|
|
192
|
+
* behind as clutter, matching {@link removeClaudeHooks}'s uninstall path.
|
|
181
193
|
*
|
|
182
194
|
* @param current - Parsed settings.json root (object). Other top-level keys untouched.
|
|
183
195
|
* @param homeDir - Home override for the canonical command path
|
|
184
196
|
* @returns New settings object with `hooks.SessionStart` updated
|
|
185
197
|
*/
|
|
186
198
|
function mergeClaudeHooks(current, homeDir) {
|
|
187
|
-
const hooks = current
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
const
|
|
191
|
-
const found = findPeekHook(sessionStart);
|
|
199
|
+
const hooks = readHooksObject(current, claudeSettingsJsonPath(homeDir));
|
|
200
|
+
const raw = hooks[SESSION_START_EVENT];
|
|
201
|
+
const sessionStart = Array.isArray(raw) ? raw : [];
|
|
202
|
+
const cleaned = removeAllPeekHooks(sessionStart);
|
|
192
203
|
const entry = peekHookEntry(homeDir);
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
204
|
+
const matcherIdx = cleaned.findIndex((group) => isMatcherGroup(group) && group.matcher === CLAUDE_SESSION_START_MATCHER);
|
|
205
|
+
let nextSessionStart;
|
|
206
|
+
if (matcherIdx >= 0) {
|
|
207
|
+
const group = { ...cleaned[matcherIdx] };
|
|
196
208
|
const groupHooks = Array.isArray(group.hooks) ? [...group.hooks] : [];
|
|
197
|
-
groupHooks
|
|
209
|
+
groupHooks.push(entry);
|
|
198
210
|
group.hooks = groupHooks;
|
|
199
|
-
|
|
211
|
+
nextSessionStart = [...cleaned];
|
|
212
|
+
nextSessionStart[matcherIdx] = group;
|
|
200
213
|
}
|
|
201
214
|
else {
|
|
202
|
-
|
|
203
|
-
typeof group === "object" &&
|
|
204
|
-
!Array.isArray(group) &&
|
|
205
|
-
group.matcher === CLAUDE_SESSION_START_MATCHER);
|
|
206
|
-
if (matcherIdx >= 0) {
|
|
207
|
-
// Path 2: same matcher group already exists (e.g. user hooks) — append ours
|
|
208
|
-
const group = { ...sessionStart[matcherIdx] };
|
|
209
|
-
const groupHooks = Array.isArray(group.hooks) ? [...group.hooks] : [];
|
|
210
|
-
groupHooks.push(entry);
|
|
211
|
-
group.hooks = groupHooks;
|
|
212
|
-
sessionStart[matcherIdx] = group;
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
// Path 3: no matching group — create the canonical SessionStart entry
|
|
216
|
-
sessionStart.push({
|
|
217
|
-
matcher: CLAUDE_SESSION_START_MATCHER,
|
|
218
|
-
hooks: [entry],
|
|
219
|
-
});
|
|
220
|
-
}
|
|
215
|
+
nextSessionStart = [...cleaned, { matcher: CLAUDE_SESSION_START_MATCHER, hooks: [entry] }];
|
|
221
216
|
}
|
|
222
|
-
|
|
217
|
+
nextSessionStart = dropGroupsEmptiedByRemoval(sessionStart, nextSessionStart);
|
|
218
|
+
return { ...current, hooks: { ...hooks, [SESSION_START_EVENT]: nextSessionStart } };
|
|
223
219
|
}
|
|
224
220
|
/**
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
* Unparseable settings.json: {@link mergeJsonFile} backs off and this throws (never clobbers).
|
|
221
|
+
* Remove every Grounder hook entry from every matcher group, touching
|
|
222
|
+
* nothing else, and drop a matcher group only when this removal is what left
|
|
223
|
+
* its `hooks` array empty (see {@link dropGroupsEmptiedByRemoval}) — clutter
|
|
224
|
+
* Grounder itself created room for, not a group that started empty for
|
|
225
|
+
* reasons of its own. Returns `current` verbatim when there's no Grounder
|
|
226
|
+
* entry to remove, so `mergeJsonFile` sees no change and leaves an unrelated
|
|
227
|
+
* `settings.json` untouched instead of reformatting it.
|
|
234
228
|
*/
|
|
235
|
-
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
if (
|
|
242
|
-
|
|
243
|
-
const hadGrounderEntry = fileExisted && (await peekHookHadGrounderEntry(dest));
|
|
244
|
-
const status = hadGrounderEntry ? "overwritten" : "created";
|
|
245
|
-
return { artifacts: { [dest]: status } };
|
|
246
|
-
}
|
|
247
|
-
await installHookRuntime({ homeDir: opts.homeDir });
|
|
248
|
-
const fileExisted = await fileExists(dest);
|
|
249
|
-
const hadGrounderEntry = fileExisted && (await peekHookHadGrounderEntry(dest));
|
|
250
|
-
const result = await mergeJsonFile(dest, (current) => mergeClaudeHooks(current, opts.homeDir));
|
|
251
|
-
if (!result.ok) {
|
|
252
|
-
throw new Error(result.message);
|
|
229
|
+
function removeClaudeHooks(current) {
|
|
230
|
+
const hooks = current.hooks && typeof current.hooks === "object" && !Array.isArray(current.hooks)
|
|
231
|
+
? current.hooks
|
|
232
|
+
: undefined;
|
|
233
|
+
const raw = hooks?.[SESSION_START_EVENT];
|
|
234
|
+
const sessionStart = Array.isArray(raw) ? raw : [];
|
|
235
|
+
if (findAllPeekHooks(sessionStart).length === 0) {
|
|
236
|
+
return current;
|
|
253
237
|
}
|
|
254
|
-
const
|
|
255
|
-
return {
|
|
238
|
+
const cleaned = dropGroupsEmptiedByRemoval(sessionStart, removeAllPeekHooks(sessionStart));
|
|
239
|
+
return { ...current, hooks: { ...hooks, [SESSION_START_EVENT]: cleaned } };
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Install (or converge) Grounder's SessionStart teaser hook into `~/.claude/settings.json`.
|
|
243
|
+
* @see {@link installHookFragment} for the shared install/report scaffolding.
|
|
244
|
+
*/
|
|
245
|
+
async function installHooks(opts) {
|
|
246
|
+
return installHookFragment({
|
|
247
|
+
dest: claudeSettingsJsonPath(opts.homeDir),
|
|
248
|
+
isUpToDate: (filePath) => peekHookUpToDate(filePath, opts.homeDir),
|
|
249
|
+
hasGrounderEntry: peekHookHadGrounderEntry,
|
|
250
|
+
merge: (current) => mergeClaudeHooks(current, opts.homeDir),
|
|
251
|
+
}, opts);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Remove Grounder's SessionStart hook entry entirely (`--no-hooks`) — the
|
|
255
|
+
* opt-out must also remove the fragment, not just flip `hooksEnabled` false,
|
|
256
|
+
* or the session hook keeps firing and the tri-state's stickiness against
|
|
257
|
+
* the next plain `migrate` would have nothing to rest on.
|
|
258
|
+
*/
|
|
259
|
+
async function removeHooks(opts) {
|
|
260
|
+
return removeHookFragment(claudeSettingsJsonPath(opts.homeDir), removeClaudeHooks, opts);
|
|
256
261
|
}
|
|
257
262
|
export const claude = {
|
|
258
263
|
id: "claude",
|
|
259
264
|
name: "Claude Code",
|
|
260
|
-
|
|
261
|
-
hooksSchema: 1,
|
|
262
|
-
async isInstalled() {
|
|
263
|
-
return fileExists(path.join(resolveHomeDir(), ".claude"));
|
|
264
|
-
},
|
|
265
|
+
isInstalled: layout.isInstalled,
|
|
265
266
|
expectedArtifacts,
|
|
266
267
|
expectedHookArtifacts,
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
for (const filename of COMMANDS) {
|
|
271
|
-
const { dest, status, hash } = await installCommandFile({
|
|
272
|
-
...opts,
|
|
273
|
-
agentId: claude.id,
|
|
274
|
-
templateDir,
|
|
275
|
-
commandsDir: claudeCommandsDir(opts.homeDir),
|
|
276
|
-
filename,
|
|
277
|
-
});
|
|
278
|
-
artifacts[dest] = status;
|
|
279
|
-
if (hash) {
|
|
280
|
-
files[dest] = { hash };
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
await recordCommandFileHashes({
|
|
284
|
-
agentId: claude.id,
|
|
285
|
-
commandsSchema: claude.commandsSchema,
|
|
286
|
-
files,
|
|
287
|
-
homeDir: opts.homeDir,
|
|
288
|
-
dryRun: opts.dryRun,
|
|
289
|
-
});
|
|
290
|
-
return { artifacts };
|
|
291
|
-
},
|
|
268
|
+
desiredArtifacts: layout.desiredArtifacts,
|
|
269
|
+
tombstones: layout.tombstones,
|
|
270
|
+
ownedPrefixes: layout.ownedPrefixes,
|
|
292
271
|
installHooks,
|
|
272
|
+
removeHooks,
|
|
293
273
|
};
|
|
294
274
|
//# sourceMappingURL=claude.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/cursor.d.ts
CHANGED
|
@@ -5,13 +5,13 @@ import type { AgentAdapter } from "./types.js";
|
|
|
5
5
|
* @see {@link peekHookCommand}
|
|
6
6
|
*/
|
|
7
7
|
export declare function cursorPeekHookCommand(homeDir?: string, extraArgs?: readonly string[]): string;
|
|
8
|
-
export declare function
|
|
8
|
+
export declare function cursorSkillsDir(homeDir?: string): string;
|
|
9
9
|
/** Absolute path to Cursor's shared hooks config (`~/.cursor/hooks.json`). */
|
|
10
10
|
export declare function cursorHooksJsonPath(homeDir?: string): string;
|
|
11
11
|
export declare function grounderNoteCommandPath(homeDir?: string): string;
|
|
12
12
|
export declare function grounderPlanCommandPath(homeDir?: string): string;
|
|
13
|
-
export declare function
|
|
14
|
-
export declare function
|
|
13
|
+
export declare function grounderHandoffCommandPath(homeDir?: string): string;
|
|
14
|
+
export declare function grounderRecallCommandPath(homeDir?: string): string;
|
|
15
15
|
export declare function expectedArtifacts(homeDir?: string): string[];
|
|
16
16
|
/** Paths of hook config this adapter touches — currently just `hooks.json`. */
|
|
17
17
|
export declare function expectedHookArtifacts(homeDir?: string): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAA2C,MAAM,YAAY,CAAC;AAQxF;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,GAAE,SAAS,MAAM,EAAe,GACxC,MAAM,CAER;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,0BAA0B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhE;AAiKD,eAAO,MAAM,MAAM,EAAE,YAapB,CAAC"}
|