@mnemonik/copilot-hooks 0.1.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/dist/install.d.ts +35 -0
- package/dist/install.js +223 -0
- package/dist/install.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `mnemonik-copilot-hooks install` — wires Mnemonik into VS Code's native
|
|
4
|
+
* agent-hook files without disturbing unrelated hook commands.
|
|
5
|
+
*
|
|
6
|
+
* User scope: ~/.copilot/hooks/mnemonik-hooks.json
|
|
7
|
+
* Project scope: <cwd>/.github/hooks/mnemonik-hooks.json
|
|
8
|
+
*
|
|
9
|
+
* VS Code's native hook format is a flat command array and has no matchers.
|
|
10
|
+
* The shared dispatcher therefore receives every registered tool event and
|
|
11
|
+
* applies the verified VS Code tool-name/input adapter itself.
|
|
12
|
+
*/
|
|
13
|
+
declare const EVENTS: readonly ['SessionStart', 'UserPromptSubmit', 'PreToolUse', 'PostToolUse', 'PreCompact'];
|
|
14
|
+
type InstallTarget = 'host' | 'project';
|
|
15
|
+
type HookEvent = (typeof EVENTS)[number];
|
|
16
|
+
interface NativeHookEntry {
|
|
17
|
+
type: 'command';
|
|
18
|
+
command: string;
|
|
19
|
+
cwd?: string;
|
|
20
|
+
env?: Record<string, string>;
|
|
21
|
+
timeout?: number;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
interface NativeHooksFile {
|
|
25
|
+
hooks?: Partial<Record<HookEvent, NativeHookEntry[]>> & Record<string, unknown>;
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
declare function parseArgs(argv: string[]): {
|
|
29
|
+
target: InstallTarget;
|
|
30
|
+
};
|
|
31
|
+
declare function resolveTargetPath(target: InstallTarget, cwd: string, env?: Partial<Record<'HOME' | 'USERPROFILE', string | undefined>>): string;
|
|
32
|
+
declare function removeMnemonikEntries(config: NativeHooksFile, currentDispatcher?: string): boolean;
|
|
33
|
+
declare function buildHookEntry(dispatcher: string): NativeHookEntry;
|
|
34
|
+
declare function patchHooksFile(config: NativeHooksFile, dispatcher: string): NativeHooksFile;
|
|
35
|
+
export { EVENTS, buildHookEntry, parseArgs, patchHooksFile, removeMnemonikEntries, resolveTargetPath, };
|
package/dist/install.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `mnemonik-copilot-hooks install` — wires Mnemonik into VS Code's native
|
|
4
|
+
* agent-hook files without disturbing unrelated hook commands.
|
|
5
|
+
*
|
|
6
|
+
* User scope: ~/.copilot/hooks/mnemonik-hooks.json
|
|
7
|
+
* Project scope: <cwd>/.github/hooks/mnemonik-hooks.json
|
|
8
|
+
*
|
|
9
|
+
* VS Code's native hook format is a flat command array and has no matchers.
|
|
10
|
+
* The shared dispatcher therefore receives every registered tool event and
|
|
11
|
+
* applies the verified VS Code tool-name/input adapter itself.
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, realpathSync } from 'node:fs';
|
|
14
|
+
import { dirname, join, resolve } from 'node:path';
|
|
15
|
+
import { fileURLToPath } from 'node:url';
|
|
16
|
+
import { atomicWriteTransaction, buildManagedCommand, canonicalizeConfigTargets, installerConfigLockPath, installDurableRuntime, isManagedCommand, readTextIfExists, resolveRuntimeParent, withFileLocks, } from '@mnemonik/claude-code-hooks/dist/lib/installerSupport.js';
|
|
17
|
+
const HOOK_OWNER = 'copilot-hooks';
|
|
18
|
+
const PACKAGE_NAME = '@mnemonik/copilot-hooks';
|
|
19
|
+
const EVENTS = [
|
|
20
|
+
'SessionStart',
|
|
21
|
+
'UserPromptSubmit',
|
|
22
|
+
'PreToolUse',
|
|
23
|
+
'PostToolUse',
|
|
24
|
+
'PreCompact',
|
|
25
|
+
];
|
|
26
|
+
function isRecord(value) {
|
|
27
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
28
|
+
}
|
|
29
|
+
function resolveClaudeRuntimeRoot() {
|
|
30
|
+
const main = fileURLToPath(import.meta.resolve('@mnemonik/claude-code-hooks'));
|
|
31
|
+
return resolve(dirname(main), '..');
|
|
32
|
+
}
|
|
33
|
+
function validateHooksFile(value) {
|
|
34
|
+
if (!isRecord(value))
|
|
35
|
+
throw new Error('expected a top-level JSON object');
|
|
36
|
+
if (value.hooks === undefined)
|
|
37
|
+
return value;
|
|
38
|
+
if (!isRecord(value.hooks))
|
|
39
|
+
throw new Error('expected "hooks" to be a JSON object');
|
|
40
|
+
for (const [event, entries] of Object.entries(value.hooks)) {
|
|
41
|
+
if (!Array.isArray(entries) || !entries.every(isRecord)) {
|
|
42
|
+
throw new Error(`expected "hooks.${event}" to be an array of hook commands`);
|
|
43
|
+
}
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
if (entry.command !== undefined && typeof entry.command !== 'string') {
|
|
46
|
+
throw new Error(`expected "hooks.${event}[].command" to be a string`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
async function readHooksFile(path) {
|
|
53
|
+
const raw = await readTextIfExists(path);
|
|
54
|
+
if (raw === null)
|
|
55
|
+
return { config: {}, raw: null };
|
|
56
|
+
try {
|
|
57
|
+
return { config: validateHooksFile(JSON.parse(raw)), raw };
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new Error(`Could not parse ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function parseArgs(argv) {
|
|
64
|
+
let target = 'host';
|
|
65
|
+
let explicit = null;
|
|
66
|
+
let sawInstall = false;
|
|
67
|
+
for (const arg of argv) {
|
|
68
|
+
if (arg === 'install' && !sawInstall) {
|
|
69
|
+
sawInstall = true;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const parsed = arg === '--scope=project'
|
|
73
|
+
? 'project'
|
|
74
|
+
: arg === '--scope=user' || arg === '--scope=host'
|
|
75
|
+
? 'host'
|
|
76
|
+
: null;
|
|
77
|
+
if (parsed === null)
|
|
78
|
+
throw new Error(`Unknown installer argument: ${arg}`);
|
|
79
|
+
if (explicit && explicit !== parsed)
|
|
80
|
+
throw new Error('Conflicting --scope arguments');
|
|
81
|
+
explicit = parsed;
|
|
82
|
+
target = parsed;
|
|
83
|
+
}
|
|
84
|
+
return { target };
|
|
85
|
+
}
|
|
86
|
+
function resolveTargetPath(target, cwd, env = process.env) {
|
|
87
|
+
if (target === 'project')
|
|
88
|
+
return join(cwd, '.github', 'hooks', 'mnemonik-hooks.json');
|
|
89
|
+
const home = env.HOME?.trim() || env.USERPROFILE?.trim();
|
|
90
|
+
if (!home)
|
|
91
|
+
throw new Error('Could not determine home directory for VS Code hook install');
|
|
92
|
+
return join(home, '.copilot', 'hooks', 'mnemonik-hooks.json');
|
|
93
|
+
}
|
|
94
|
+
function isMnemonikCommand(command, currentDispatcher) {
|
|
95
|
+
return isManagedCommand(command, HOOK_OWNER, PACKAGE_NAME, 'hook.js', currentDispatcher);
|
|
96
|
+
}
|
|
97
|
+
function removeMnemonikEntries(config, currentDispatcher) {
|
|
98
|
+
if (!config.hooks)
|
|
99
|
+
return false;
|
|
100
|
+
let changed = false;
|
|
101
|
+
for (const [event, value] of Object.entries(config.hooks)) {
|
|
102
|
+
if (!Array.isArray(value))
|
|
103
|
+
continue;
|
|
104
|
+
const remaining = value.filter((entry) => !isRecord(entry) ||
|
|
105
|
+
typeof entry.command !== 'string' ||
|
|
106
|
+
!isMnemonikCommand(entry.command, currentDispatcher));
|
|
107
|
+
if (remaining.length === value.length)
|
|
108
|
+
continue;
|
|
109
|
+
changed = true;
|
|
110
|
+
if (remaining.length === 0)
|
|
111
|
+
delete config.hooks[event];
|
|
112
|
+
else
|
|
113
|
+
config.hooks[event] = remaining;
|
|
114
|
+
}
|
|
115
|
+
return changed;
|
|
116
|
+
}
|
|
117
|
+
function buildHookEntry(dispatcher) {
|
|
118
|
+
return {
|
|
119
|
+
type: 'command',
|
|
120
|
+
command: buildManagedCommand(dispatcher, HOOK_OWNER),
|
|
121
|
+
cwd: '.',
|
|
122
|
+
env: { MNEMONIK_HOOK_HOST: 'vscode' },
|
|
123
|
+
timeout: 5,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function patchHooksFile(config, dispatcher) {
|
|
127
|
+
removeMnemonikEntries(config, dispatcher);
|
|
128
|
+
const hooks = (config.hooks ?? {});
|
|
129
|
+
for (const event of EVENTS) {
|
|
130
|
+
const entries = Array.isArray(hooks[event]) ? hooks[event] : [];
|
|
131
|
+
hooks[event] = [...entries, buildHookEntry(dispatcher)];
|
|
132
|
+
}
|
|
133
|
+
config.hooks = hooks;
|
|
134
|
+
return config;
|
|
135
|
+
}
|
|
136
|
+
async function main(argv) {
|
|
137
|
+
const { target } = parseArgs(argv);
|
|
138
|
+
const cwd = process.cwd();
|
|
139
|
+
const requestedPath = resolveTargetPath(target, cwd);
|
|
140
|
+
const requestedAlternate = resolveTargetPath(target === 'host' ? 'project' : 'host', cwd);
|
|
141
|
+
const [configPath, alternatePath] = await canonicalizeConfigTargets([
|
|
142
|
+
requestedPath,
|
|
143
|
+
requestedAlternate,
|
|
144
|
+
]);
|
|
145
|
+
const runtimeParent = resolveRuntimeParent();
|
|
146
|
+
const sourceRuntimeRoot = resolveClaudeRuntimeRoot();
|
|
147
|
+
const sourceDispatcher = join(sourceRuntimeRoot, 'dist', 'hook.js');
|
|
148
|
+
if (!existsSync(sourceDispatcher)) {
|
|
149
|
+
console.error(`mnemonik-copilot-hooks: compatible dispatcher not found at ${sourceDispatcher}. Did the package install correctly?`);
|
|
150
|
+
return 1;
|
|
151
|
+
}
|
|
152
|
+
let installedDispatcher = sourceDispatcher;
|
|
153
|
+
let alternateMigrated = false;
|
|
154
|
+
await withFileLocks([
|
|
155
|
+
installerConfigLockPath(configPath, runtimeParent),
|
|
156
|
+
installerConfigLockPath(alternatePath, runtimeParent),
|
|
157
|
+
], async () => {
|
|
158
|
+
const current = await readHooksFile(configPath);
|
|
159
|
+
const alternate = alternatePath === configPath ? null : await readHooksFile(alternatePath);
|
|
160
|
+
// Parse both scopes before creating the runtime or changing either file.
|
|
161
|
+
const runtime = await installDurableRuntime({
|
|
162
|
+
sourcePackageRoot: sourceRuntimeRoot,
|
|
163
|
+
runtimeParent,
|
|
164
|
+
runtimeName: HOOK_OWNER,
|
|
165
|
+
entrypoints: ['hook.js'],
|
|
166
|
+
});
|
|
167
|
+
installedDispatcher = runtime.entrypoints['hook.js'];
|
|
168
|
+
patchHooksFile(current.config, installedDispatcher);
|
|
169
|
+
const changes = [
|
|
170
|
+
{
|
|
171
|
+
path: configPath,
|
|
172
|
+
expected: current.raw,
|
|
173
|
+
next: `${JSON.stringify(current.config, null, 2)}\n`,
|
|
174
|
+
},
|
|
175
|
+
];
|
|
176
|
+
if (alternate && alternate.raw !== null) {
|
|
177
|
+
alternateMigrated = removeMnemonikEntries(alternate.config, sourceDispatcher);
|
|
178
|
+
if (alternateMigrated) {
|
|
179
|
+
changes.push({
|
|
180
|
+
path: alternatePath,
|
|
181
|
+
expected: alternate.raw,
|
|
182
|
+
next: `${JSON.stringify(alternate.config, null, 2)}\n`,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
await atomicWriteTransaction(changes);
|
|
187
|
+
});
|
|
188
|
+
console.log([
|
|
189
|
+
`mnemonik-copilot-hooks: wired into ${requestedPath}`,
|
|
190
|
+
` target → ${target}`,
|
|
191
|
+
...(alternateMigrated
|
|
192
|
+
? [` migration → removed duplicate Mnemonik hooks from ${requestedAlternate}`]
|
|
193
|
+
: []),
|
|
194
|
+
` events → ${EVENTS.join(', ')}`,
|
|
195
|
+
` dispatcher → ${installedDispatcher}`,
|
|
196
|
+
'',
|
|
197
|
+
'VS Code agent hooks are currently Preview and can be disabled by organization policy.',
|
|
198
|
+
'The package uses native VS Code hook JSON; it does not rely on Claude matchers.',
|
|
199
|
+
'Restarting VS Code is normally unnecessary because hook files reload when saved.',
|
|
200
|
+
].join('\n'));
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
function isDirectExecution() {
|
|
204
|
+
const invoked = process.argv[1];
|
|
205
|
+
if (!invoked)
|
|
206
|
+
return false;
|
|
207
|
+
try {
|
|
208
|
+
return realpathSync(invoked) === realpathSync(fileURLToPath(import.meta.url));
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return invoked === fileURLToPath(import.meta.url);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (isDirectExecution()) {
|
|
215
|
+
main(process.argv.slice(2))
|
|
216
|
+
.then((code) => process.exit(code))
|
|
217
|
+
.catch((error) => {
|
|
218
|
+
console.error(`mnemonik-copilot-hooks: ${error instanceof Error ? error.message : String(error)}`);
|
|
219
|
+
process.exit(1);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
export { EVENTS, buildHookEntry, parseArgs, patchHooksFile, removeMnemonikEntries, resolveTargetPath, };
|
|
223
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mnemonik/copilot-hooks",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Native VS Code GitHub Copilot lifecycle hooks for Mnemonik: prompt and session recall, file grounding, shell policy gates, MCP ordering, edit tracking, and pre-compaction snapshots. Hooks only; does not install MCP, skills, rules, or project identity.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mnemonik-copilot-hooks": "dist/install.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/install.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "node ../../node_modules/@typescript/native/bin/tsc",
|
|
15
|
+
"typecheck": "node ../../node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.test.json",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=20"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"mnemonik",
|
|
25
|
+
"github-copilot",
|
|
26
|
+
"vscode",
|
|
27
|
+
"hooks"
|
|
28
|
+
],
|
|
29
|
+
"license": "UNLICENSED",
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@mnemonik/claude-code-hooks": "^0.9.38"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "^20.19.43",
|
|
35
|
+
"@typescript/native": "npm:typescript@7.0.2",
|
|
36
|
+
"vitest": "^4.1.10"
|
|
37
|
+
}
|
|
38
|
+
}
|