@mnemonik/shared 7.97.2 → 7.98.1
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/ambientPointer.d.ts.map +1 -1
- package/dist/ambientPointer.js +2 -1
- package/dist/ambientPointer.js.map +1 -1
- package/dist/apiOrigin.d.ts +3 -0
- package/dist/apiOrigin.d.ts.map +1 -0
- package/dist/apiOrigin.js +5 -0
- package/dist/apiOrigin.js.map +1 -0
- package/dist/ast/astChunker.d.ts +12 -12
- package/dist/ast/astChunker.js +32 -32
- package/dist/ast/grammars.d.ts +9 -9
- package/dist/ast/grammars.js +15 -15
- package/dist/codeScanner.d.ts +56 -43
- package/dist/codeScanner.d.ts.map +1 -1
- package/dist/codeScanner.js +262 -143
- package/dist/codeScanner.js.map +1 -1
- package/dist/contextBudget.js +2 -2
- package/dist/contextBudget.js.map +1 -1
- package/dist/gitEditDetector.d.ts +6 -6
- package/dist/gitEditDetector.js +7 -7
- package/dist/hookRuntime.d.ts +35 -2
- package/dist/hookRuntime.d.ts.map +1 -1
- package/dist/hookRuntime.js +127 -33
- package/dist/hookRuntime.js.map +1 -1
- package/dist/hookTimeouts.d.ts +6 -6
- package/dist/hookTimeouts.js +6 -6
- package/dist/hostAdapter.d.ts +135 -0
- package/dist/hostAdapter.d.ts.map +1 -0
- package/dist/hostAdapter.js +323 -0
- package/dist/hostAdapter.js.map +1 -0
- package/dist/hostBinary.d.ts +29 -0
- package/dist/hostBinary.d.ts.map +1 -0
- package/dist/hostBinary.js +179 -0
- package/dist/hostBinary.js.map +1 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +26 -26
- package/dist/instructions.js +26 -26
- package/dist/jitDeliveryAck.d.ts.map +1 -1
- package/dist/jitDeliveryAck.js +2 -0
- package/dist/jitDeliveryAck.js.map +1 -1
- package/dist/projectIdentityFile.d.ts +25 -0
- package/dist/projectIdentityFile.d.ts.map +1 -0
- package/dist/projectIdentityFile.js +87 -0
- package/dist/projectIdentityFile.js.map +1 -0
- package/dist/projectSetupHandoff.d.ts +24 -0
- package/dist/projectSetupHandoff.d.ts.map +1 -0
- package/dist/projectSetupHandoff.js +249 -0
- package/dist/projectSetupHandoff.js.map +1 -0
- package/dist/protectedPaths.d.ts +9 -0
- package/dist/protectedPaths.d.ts.map +1 -0
- package/dist/protectedPaths.js +66 -0
- package/dist/protectedPaths.js.map +1 -0
- package/dist/readiness.d.ts +143 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +304 -0
- package/dist/readiness.js.map +1 -0
- package/dist/repositoryFingerprint.d.ts +50 -0
- package/dist/repositoryFingerprint.d.ts.map +1 -0
- package/dist/repositoryFingerprint.js +160 -0
- package/dist/repositoryFingerprint.js.map +1 -0
- package/dist/repositoryRoot.d.ts +56 -0
- package/dist/repositoryRoot.d.ts.map +1 -0
- package/dist/repositoryRoot.js +226 -0
- package/dist/repositoryRoot.js.map +1 -0
- package/dist/runtimeReader.d.ts +102 -0
- package/dist/runtimeReader.d.ts.map +1 -0
- package/dist/runtimeReader.js +408 -0
- package/dist/runtimeReader.js.map +1 -0
- package/dist/runtimeSigners.d.ts +37 -0
- package/dist/runtimeSigners.d.ts.map +1 -0
- package/dist/runtimeSigners.js +507 -0
- package/dist/runtimeSigners.js.map +1 -0
- package/dist/scannerSupervisor.d.ts +35 -0
- package/dist/scannerSupervisor.d.ts.map +1 -0
- package/dist/scannerSupervisor.js +2 -0
- package/dist/scannerSupervisor.js.map +1 -0
- package/dist/secretPatterns.d.ts +9 -9
- package/dist/secretPatterns.d.ts.map +1 -1
- package/dist/secretPatterns.js +27 -25
- package/dist/secretPatterns.js.map +1 -1
- package/dist/testing/hostAdapterConformance.d.ts +17 -0
- package/dist/testing/hostAdapterConformance.d.ts.map +1 -0
- package/dist/testing/hostAdapterConformance.js +477 -0
- package/dist/testing/hostAdapterConformance.js.map +1 -0
- package/dist/usageGuide.d.ts +1 -1
- package/dist/usageGuide.d.ts.map +1 -1
- package/dist/usageGuide.js +4 -4
- package/package.json +7 -2
- package/queries/bash.tags.scm +1 -1
- package/queries/groovy.tags.scm +1 -1
- package/scripts/vendor-grammars.ts +13 -13
- package/src/ambientPointer.ts +2 -1
- package/src/apiOrigin.ts +4 -0
- package/src/ast/astChunker.ts +39 -39
- package/src/ast/grammars.ts +16 -16
- package/src/codeScanner.ts +274 -149
- package/src/contextBudget.ts +2 -2
- package/src/gitEditDetector.ts +7 -7
- package/src/hookRuntime.ts +162 -34
- package/src/hookTimeouts.ts +6 -6
- package/src/hostAdapter.ts +468 -0
- package/src/hostBinary.ts +205 -0
- package/src/index.ts +20 -0
- package/src/instructions.ts +26 -26
- package/src/jitDeliveryAck.ts +2 -0
- package/src/projectIdentityFile.ts +100 -0
- package/src/projectSetupHandoff.ts +275 -0
- package/src/protectedPaths.ts +88 -0
- package/src/readiness.ts +516 -0
- package/src/repositoryFingerprint.ts +199 -0
- package/src/repositoryRoot.ts +261 -0
- package/src/runtimeReader.ts +495 -0
- package/src/runtimeSigners.ts +577 -0
- package/src/scannerSupervisor.ts +26 -0
- package/src/secretPatterns.ts +27 -25
- package/src/testing/hostAdapterConformance.ts +538 -0
- package/src/usageGuide.ts +4 -4
- package/test-fixtures/identity/runner.d.mts +12 -0
- package/test-fixtures/identity/runner.mjs +282 -0
- package/tests/fixtures/repository-fingerprint-v1.golden.json +834 -0
- package/tests/projectIdentity.test.ts +56 -0
- package/tests/readiness.test.ts +158 -0
- package/tests/repositoryFingerprint.test.ts +26 -0
- package/tsconfig.test.json +9 -0
- package/wasm/bash.tags.scm +1 -1
- package/wasm/groovy.tags.scm +1 -1
- package/wasm/javascript.tags.scm +2 -2
- package/wasm/solidity.tags.scm +1 -1
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdir, mkdtemp, readFile, readdir, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, win32 } from 'node:path';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
export async function writeChanges(changes) {
|
|
6
|
+
for (const change of changes) {
|
|
7
|
+
if (change.remove) {
|
|
8
|
+
await rm(change.path, { force: true });
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
await mkdir(dirname(change.path), { recursive: true });
|
|
12
|
+
await writeFile(change.path, change.content, { mode: change.mode });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function snapshot(root) {
|
|
16
|
+
const files = {};
|
|
17
|
+
for (const entry of await readdir(root, { recursive: true, withFileTypes: true })) {
|
|
18
|
+
const path = join(entry.parentPath, entry.name);
|
|
19
|
+
files[path] = entry.isDirectory() ? '<directory>' : (await readFile(path)).toString('base64');
|
|
20
|
+
}
|
|
21
|
+
return files;
|
|
22
|
+
}
|
|
23
|
+
/** Named, isolated checks that any package test runner can register. No test-framework dependency. */
|
|
24
|
+
export function hostAdapterConformance(create, options) {
|
|
25
|
+
const foreign = { type: 'command', command: 'node /foreign/hook.js', custom: ' keep exactly ' };
|
|
26
|
+
const event = options.flat ? 'preToolUse' : 'PreToolUse';
|
|
27
|
+
const foreignEntry = options.flat ? foreign : { matcher: '.*', hooks: [foreign], custom: 'keep' };
|
|
28
|
+
const fixture = async () => {
|
|
29
|
+
const root = await mkdtemp(join(tmpdir(), 'mnemonik-adapter-'));
|
|
30
|
+
const home = join(root, 'home');
|
|
31
|
+
const project = join(root, 'project');
|
|
32
|
+
await mkdir(home);
|
|
33
|
+
await mkdir(project);
|
|
34
|
+
await mkdir(join(root, 'empty-bin'));
|
|
35
|
+
const runtimeRoot = join(home, '.mnemonik', 'runtimes', options.name);
|
|
36
|
+
const target = {
|
|
37
|
+
component: 'hooks',
|
|
38
|
+
scope: 'user',
|
|
39
|
+
projectRoot: project,
|
|
40
|
+
runtimeRoot,
|
|
41
|
+
credentialFamily: 'hook-family',
|
|
42
|
+
runtimeEntry: join(runtimeRoot, '1.0.0', 'dist', 'hook.js'),
|
|
43
|
+
};
|
|
44
|
+
const deps = {
|
|
45
|
+
target,
|
|
46
|
+
platform: 'linux',
|
|
47
|
+
env: { HOME: home, USERPROFILE: home, PATH: join(root, 'empty-bin') },
|
|
48
|
+
version: '1.0.0',
|
|
49
|
+
artifactDigest: 'verified-receipt',
|
|
50
|
+
};
|
|
51
|
+
return {
|
|
52
|
+
root,
|
|
53
|
+
project,
|
|
54
|
+
target,
|
|
55
|
+
deps,
|
|
56
|
+
adapter: create(deps),
|
|
57
|
+
configPath: (scope) => join(scope === 'user' ? home : project, options.config),
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
const checks = {};
|
|
61
|
+
const check = (name, run) => {
|
|
62
|
+
checks[`${options.name}: ${name}`] = async () => {
|
|
63
|
+
const f = await fixture();
|
|
64
|
+
try {
|
|
65
|
+
await run(f);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
await rm(f.root, { recursive: true, force: true });
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
const assertForeign = async (path) => {
|
|
73
|
+
const raw = await readFile(path, 'utf8');
|
|
74
|
+
const config = JSON.parse(raw);
|
|
75
|
+
assert.equal(JSON.stringify(config.hooks[event][0]), JSON.stringify(foreignEntry));
|
|
76
|
+
const fragment = JSON.stringify(foreignEntry, null, 2)
|
|
77
|
+
.split('\n')
|
|
78
|
+
.map((line, index) => (index ? ` ${line}` : line))
|
|
79
|
+
.join('\n');
|
|
80
|
+
assert.ok(raw.includes(fragment), 'foreign entry bytes must survive');
|
|
81
|
+
};
|
|
82
|
+
check('detect reports every searched location and writes nothing with host binaries absent', async ({ root, adapter }) => {
|
|
83
|
+
const before = await snapshot(root);
|
|
84
|
+
const { resolvedPath: _resolvedPath, ...detected } = await adapter.detect();
|
|
85
|
+
assert.deepEqual(detected, {
|
|
86
|
+
supported: false,
|
|
87
|
+
version: '',
|
|
88
|
+
reason: options.deferred ? 'deferred' : 'not_found',
|
|
89
|
+
...(options.deferred
|
|
90
|
+
? {}
|
|
91
|
+
: {
|
|
92
|
+
searchedLocations: [
|
|
93
|
+
...(options.name === 'cursor'
|
|
94
|
+
? ['/usr/share/cursor/bin/cursor', '/opt/Cursor/resources/app/bin/cursor']
|
|
95
|
+
: []),
|
|
96
|
+
],
|
|
97
|
+
}),
|
|
98
|
+
});
|
|
99
|
+
assert.deepEqual(await snapshot(root), before);
|
|
100
|
+
});
|
|
101
|
+
if (options.deferred) {
|
|
102
|
+
check('defers every other operation', async ({ adapter, target }) => {
|
|
103
|
+
for (const operation of [
|
|
104
|
+
() => adapter.capabilities(),
|
|
105
|
+
() => adapter.inspect(),
|
|
106
|
+
() => adapter.plan(),
|
|
107
|
+
() => adapter.install({ stage: async () => { } }, target),
|
|
108
|
+
() => adapter.update({ stage: async () => { } }, target),
|
|
109
|
+
() => adapter.repair({ stage: async () => { } }, target),
|
|
110
|
+
() => adapter.launch(),
|
|
111
|
+
() => adapter.verify(),
|
|
112
|
+
() => adapter.uninstall({ stage: async () => { } }, target),
|
|
113
|
+
() => adapter.revoke?.({ id: 'grant', account: 'account', scopes: [] }),
|
|
114
|
+
])
|
|
115
|
+
await assert.rejects(async () => operation(), /not_supported/);
|
|
116
|
+
});
|
|
117
|
+
return checks;
|
|
118
|
+
}
|
|
119
|
+
const versionOutput = {
|
|
120
|
+
cursor: '3.20.17',
|
|
121
|
+
grok: 'grok 1.0.25',
|
|
122
|
+
'claude-code': '2.1.268 (Claude Code)',
|
|
123
|
+
codex: 'codex-cli 0.145.0',
|
|
124
|
+
}[options.name];
|
|
125
|
+
assert.ok(versionOutput);
|
|
126
|
+
check('distinguishes wrong vendor output from an absent binary', async ({ deps }) => {
|
|
127
|
+
const adapter = create({
|
|
128
|
+
...deps,
|
|
129
|
+
execFile: async () => ({ stdout: 'another-product 1.2.3', stderr: '' }),
|
|
130
|
+
});
|
|
131
|
+
assert.deepEqual(await adapter.detect(), {
|
|
132
|
+
supported: false,
|
|
133
|
+
version: '1.2.3',
|
|
134
|
+
reason: 'wrong_vendor',
|
|
135
|
+
resolvedPath: options.name === 'claude-code' ? 'claude' : options.name,
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
check('keeps unrecognised vendor output as an unverified version', async ({ deps }) => {
|
|
139
|
+
const adapter = create({
|
|
140
|
+
...deps,
|
|
141
|
+
execFile: async () => ({ stdout: '', stderr: '' }),
|
|
142
|
+
});
|
|
143
|
+
assert.deepEqual(await adapter.detect(), {
|
|
144
|
+
supported: false,
|
|
145
|
+
version: '',
|
|
146
|
+
reason: 'unverified_version',
|
|
147
|
+
resolvedPath: options.name === 'claude-code' ? 'claude' : options.name,
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
check('Windows prefers vendor installation, then filters ordered where candidates and caches the result', async ({ deps, target }) => {
|
|
151
|
+
const name = options.name === 'claude-code' ? 'claude' : options.name;
|
|
152
|
+
const extension = options.name === 'grok' ? '.exe' : '.cmd';
|
|
153
|
+
const preferred = options.name === 'cursor'
|
|
154
|
+
? 'C:/Local/Programs/cursor/resources/app/bin/cursor.cmd'
|
|
155
|
+
: options.name === 'grok'
|
|
156
|
+
? 'C:/User/.grok/bin/grok.exe'
|
|
157
|
+
: `C:/Roaming/npm/${name}.cmd`;
|
|
158
|
+
const normalize = win32.normalize;
|
|
159
|
+
for (const installed of [true, false]) {
|
|
160
|
+
const fallback = normalize(`C:/First Bin/${name}${extension}`);
|
|
161
|
+
const expected = installed ? normalize(preferred) : fallback;
|
|
162
|
+
const calls = [];
|
|
163
|
+
const host = create({
|
|
164
|
+
...deps,
|
|
165
|
+
platform: 'win32',
|
|
166
|
+
target: { ...target, component: 'mcp' },
|
|
167
|
+
env: {
|
|
168
|
+
...deps.env,
|
|
169
|
+
LOCALAPPDATA: 'C:/Local',
|
|
170
|
+
USERPROFILE: 'C:/User',
|
|
171
|
+
APPDATA: 'C:/Roaming',
|
|
172
|
+
ComSpec: 'C:/Windows/System32/cmd.exe',
|
|
173
|
+
},
|
|
174
|
+
binaryExists: async (file) => installed || file === fallback || file.includes('Second'),
|
|
175
|
+
execFile: async (file, args) => {
|
|
176
|
+
calls.push([file, ...args]);
|
|
177
|
+
return {
|
|
178
|
+
stdout: file.endsWith('where.exe')
|
|
179
|
+
? `${name}${extension}\r\nC:\\Wrong\\${name}.ps1\r\n${fallback}\r\nC:\\Second\\${name}${extension}`
|
|
180
|
+
: args.join(' ').includes('--version')
|
|
181
|
+
? versionOutput
|
|
182
|
+
: 'mnemonik: Connected',
|
|
183
|
+
stderr: '',
|
|
184
|
+
};
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
const [first, second] = await Promise.all([host.detect(), host.detect()]);
|
|
188
|
+
assert.equal(first.supported, true);
|
|
189
|
+
assert.equal(second.resolvedPath, expected);
|
|
190
|
+
assert.equal((await host.inspect()).resolvedPath, expected);
|
|
191
|
+
assert.equal(calls.filter(([file]) => file.endsWith('where.exe')).length, installed ? 0 : 1);
|
|
192
|
+
assert.equal(calls.filter((call) => call.join(' ').includes('--version')).length, 1);
|
|
193
|
+
for (const [file, ...args] of calls.filter(([file]) => !file.endsWith('where.exe'))) {
|
|
194
|
+
if (extension === '.exe')
|
|
195
|
+
assert.equal(file, expected);
|
|
196
|
+
else {
|
|
197
|
+
assert.equal(file, 'C:/Windows/System32/cmd.exe');
|
|
198
|
+
assert.deepEqual(args.slice(0, 4), ['/d', '/s', '/c', `""${expected}"`]);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
check('reports real scopes and leaves unobserved grants absent', async ({ adapter }) => {
|
|
204
|
+
assert.deepEqual(adapter.capabilities(), {
|
|
205
|
+
scopes: options.scopes,
|
|
206
|
+
revoke: ['claude-code', 'codex'].includes(options.name),
|
|
207
|
+
components: ['hooks', 'mcp'],
|
|
208
|
+
nativeConnect: !['grok', 'claude-code', 'cursor'].includes(options.name),
|
|
209
|
+
...(options.name === 'cursor' ? { nativeListing: false } : {}),
|
|
210
|
+
});
|
|
211
|
+
const inspection = await adapter.verify();
|
|
212
|
+
assert.equal(inspection.declarationPresent, false);
|
|
213
|
+
assert.equal(inspection.authenticatedTools, false);
|
|
214
|
+
assert.equal(inspection.grant, undefined);
|
|
215
|
+
assert.match(await adapter.launch(), /mnemonik/i);
|
|
216
|
+
});
|
|
217
|
+
check('rejects shell metacharacters in the configured origin', async ({ deps }) => {
|
|
218
|
+
const adapter = create({
|
|
219
|
+
...deps,
|
|
220
|
+
env: { ...deps.env, MNEMONIK_API_RESOURCE: 'https://x;calc.test' },
|
|
221
|
+
});
|
|
222
|
+
await assert.rejects(() => adapter.plan(), /invalid_server_origin/);
|
|
223
|
+
});
|
|
224
|
+
for (const scope of options.scopes)
|
|
225
|
+
check(`${scope}: deterministic plan; install stages and does not write; uninstall preserves foreign bytes`, async ({ root, target: base, deps, configPath }) => {
|
|
226
|
+
const adapter = create({
|
|
227
|
+
...deps,
|
|
228
|
+
env: { ...deps.env, MNEMONIK_API_RESOURCE: 'https://staging.example.test/api' },
|
|
229
|
+
});
|
|
230
|
+
const target = { ...base, scope };
|
|
231
|
+
await writeChanges([
|
|
232
|
+
{
|
|
233
|
+
path: configPath(scope),
|
|
234
|
+
content: Buffer.from(`${JSON.stringify({ hooks: { [event]: [foreignEntry] } }, null, 2)}\n`),
|
|
235
|
+
},
|
|
236
|
+
]);
|
|
237
|
+
const before = await snapshot(root);
|
|
238
|
+
const plan = await adapter.plan(target);
|
|
239
|
+
assert.deepEqual(await adapter.plan(target), plan);
|
|
240
|
+
assert.equal(plan.requestedScope, scope);
|
|
241
|
+
assert.equal(plan.effectiveScope, scope);
|
|
242
|
+
assert.equal(plan.version, '1.0.0');
|
|
243
|
+
assert.equal(plan.artifactDigest, 'verified-receipt');
|
|
244
|
+
assert.ok(plan.changes.some((change) => change.content.includes('--credential-family ' + target.credentialFamily)));
|
|
245
|
+
const configuration = plan.changes.at(-1);
|
|
246
|
+
assert.ok(configuration);
|
|
247
|
+
const config = JSON.parse(configuration.content.toString());
|
|
248
|
+
const commands = [];
|
|
249
|
+
const collect = (value) => {
|
|
250
|
+
if (!value || typeof value !== 'object')
|
|
251
|
+
return;
|
|
252
|
+
for (const [key, child] of Object.entries(value)) {
|
|
253
|
+
if (key === 'command' &&
|
|
254
|
+
typeof child === 'string' &&
|
|
255
|
+
child.includes('--mnemonik-owner='))
|
|
256
|
+
commands.push(child);
|
|
257
|
+
else
|
|
258
|
+
collect(child);
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
collect(config);
|
|
262
|
+
assert.ok(commands.length > 0);
|
|
263
|
+
for (const command of commands)
|
|
264
|
+
assert.ok(command.includes(' --server https://staging.example.test '), command);
|
|
265
|
+
if (options.name !== 'codex') {
|
|
266
|
+
const config = plan.changes.at(-1);
|
|
267
|
+
assert.ok(config);
|
|
268
|
+
const hooks = JSON.parse(config.content.toString()).hooks;
|
|
269
|
+
const event = options.name === 'cursor' ? 'afterMCPExecution' : 'PostToolUse';
|
|
270
|
+
assert.ok(hooks[event]
|
|
271
|
+
.flatMap((entry) => entry.hooks ?? [entry])
|
|
272
|
+
.some((entry) => entry.command?.includes('--credential-family ' + target.credentialFamily) &&
|
|
273
|
+
(entry.timeout ?? 0) >= 40));
|
|
274
|
+
}
|
|
275
|
+
if (options.name !== 'codex')
|
|
276
|
+
assert.ok(plan.changes.some((c) => c.content.includes(target.runtimeEntry)));
|
|
277
|
+
else
|
|
278
|
+
assert.ok(plan.changes.some((c) => c.path === join(target.runtimeRoot, 'launcher.mjs')));
|
|
279
|
+
assert.deepEqual(await snapshot(root), before);
|
|
280
|
+
const staged = [];
|
|
281
|
+
const writer = {
|
|
282
|
+
stage: async (change) => {
|
|
283
|
+
staged.push(change);
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
await adapter.install(writer, target);
|
|
287
|
+
assert.deepEqual(staged, plan.changes);
|
|
288
|
+
assert.deepEqual(await snapshot(root), before, 'install must not write');
|
|
289
|
+
await writeChanges(staged);
|
|
290
|
+
assert.equal((await adapter.inspect(target)).declarationPresent, true);
|
|
291
|
+
await assertForeign(configPath(scope));
|
|
292
|
+
const installed = await snapshot(root);
|
|
293
|
+
for (const operation of [adapter.update, adapter.repair]) {
|
|
294
|
+
staged.length = 0;
|
|
295
|
+
await operation(writer, target);
|
|
296
|
+
assert.deepEqual(staged, plan.changes);
|
|
297
|
+
assert.deepEqual(await snapshot(root), installed);
|
|
298
|
+
}
|
|
299
|
+
staged.length = 0;
|
|
300
|
+
await adapter.uninstall(writer, target);
|
|
301
|
+
assert.deepEqual(await snapshot(root), installed);
|
|
302
|
+
await writeChanges(staged);
|
|
303
|
+
assert.equal((await adapter.inspect(target)).declarationPresent, false);
|
|
304
|
+
assert.ok(!(await readFile(configPath(scope), 'utf8')).includes('mnemonik'));
|
|
305
|
+
await assertForeign(configPath(scope));
|
|
306
|
+
});
|
|
307
|
+
for (const scope of options.scopes)
|
|
308
|
+
for (const component of options.mcpConfig ? ['hooks', 'mcp'] : ['hooks'])
|
|
309
|
+
check(`${scope} ${component}: uninstall removes only a config created by install`, async ({ target: base, deps, project, configPath }) => {
|
|
310
|
+
const target = { ...base, component, scope };
|
|
311
|
+
const path = component === 'hooks'
|
|
312
|
+
? configPath(scope)
|
|
313
|
+
: join(scope === 'user' ? (deps.env?.HOME ?? '') : project, options.mcpConfig?.[scope] ?? '');
|
|
314
|
+
target.createdFiles = [path];
|
|
315
|
+
const adapter = create({ ...deps, target });
|
|
316
|
+
await writeChanges((await adapter.plan()).changes);
|
|
317
|
+
const staged = [];
|
|
318
|
+
await adapter.uninstall({ stage: async (change) => void staged.push(change) }, target);
|
|
319
|
+
await writeChanges(staged);
|
|
320
|
+
await assert.rejects(readFile(path), { code: 'ENOENT' });
|
|
321
|
+
const empty = component === 'mcp' && options.mcpConfig?.toml ? '\n' : '{}\n';
|
|
322
|
+
await writeFile(path, empty);
|
|
323
|
+
const preExistingTarget = { ...base, component, scope };
|
|
324
|
+
const preExisting = create({ ...deps, target: preExistingTarget });
|
|
325
|
+
await writeChanges((await preExisting.plan()).changes);
|
|
326
|
+
staged.length = 0;
|
|
327
|
+
await preExisting.uninstall({ stage: async (change) => void staged.push(change) }, preExistingTarget);
|
|
328
|
+
await writeChanges(staged);
|
|
329
|
+
assert.ok(!(await readFile(path, 'utf8')).includes('mnemonik'));
|
|
330
|
+
});
|
|
331
|
+
check('replacement rule: reports alternate-scope entries and never stages that config', async ({ adapter, target, configPath }) => {
|
|
332
|
+
await writeChanges((await adapter.plan(target)).changes);
|
|
333
|
+
const before = await readFile(configPath('user'));
|
|
334
|
+
const projectTarget = { ...target, scope: 'project' };
|
|
335
|
+
assert.deepEqual((await adapter.inspect(projectTarget)).otherScopes, [
|
|
336
|
+
{ scope: 'user', path: configPath('user') },
|
|
337
|
+
]);
|
|
338
|
+
assert.ok(!(await adapter.plan(projectTarget)).changes.some((c) => c.path === configPath('user')));
|
|
339
|
+
await writeChanges((await adapter.plan(projectTarget)).changes);
|
|
340
|
+
assert.deepEqual(await readFile(configPath('user')), before);
|
|
341
|
+
});
|
|
342
|
+
check('parses connected listings without inferring account and uses execFile arguments', async ({ deps, project, target }) => {
|
|
343
|
+
let stdout = 'mnemonik: https://api.mnemonik.dev/mcp - ✔ Connected\n';
|
|
344
|
+
const calls = [];
|
|
345
|
+
const host = create({
|
|
346
|
+
...deps,
|
|
347
|
+
target: { ...target, component: 'mcp' },
|
|
348
|
+
execFile: async (...args) => {
|
|
349
|
+
if (args[1][0] === '--version')
|
|
350
|
+
return { stdout: versionOutput, stderr: '' };
|
|
351
|
+
calls.push(args);
|
|
352
|
+
return { stdout, stderr: '' };
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
const inspection = await host.verify();
|
|
356
|
+
if (options.name === 'cursor') {
|
|
357
|
+
assert.equal(inspection.authenticatedTools, false);
|
|
358
|
+
assert.equal(inspection.grant, undefined);
|
|
359
|
+
assert.deepEqual(calls, []);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
assert.equal(inspection.authenticatedTools, true);
|
|
363
|
+
assert.equal(inspection.grant, undefined);
|
|
364
|
+
assert.deepEqual(calls[0], [
|
|
365
|
+
options.name === 'claude-code'
|
|
366
|
+
? 'claude'
|
|
367
|
+
: options.name === 'cursor'
|
|
368
|
+
? 'agent'
|
|
369
|
+
: options.name,
|
|
370
|
+
['mcp', 'list'],
|
|
371
|
+
{ env: deps.env, cwd: project, timeout: 5000, maxBuffer: 64 * 1024, windowsHide: true },
|
|
372
|
+
]);
|
|
373
|
+
for (const listing of [
|
|
374
|
+
'mnemonik: not connected',
|
|
375
|
+
'foreign: ✔ Connected',
|
|
376
|
+
'mnemonik: enabled OAuth',
|
|
377
|
+
'mnemonik-foreign: Connected',
|
|
378
|
+
'mnemonik: warning: was previously connected',
|
|
379
|
+
'unrecognized format',
|
|
380
|
+
]) {
|
|
381
|
+
stdout = listing;
|
|
382
|
+
assert.equal((await host.verify()).authenticatedTools, false);
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
if (options.mcpConfig)
|
|
386
|
+
for (const scope of options.scopes)
|
|
387
|
+
check(`${scope}: MCP URL only, foreign server preserved, staged lifecycle`, async ({ root, project, deps, target: base }) => {
|
|
388
|
+
const target = { ...base, component: 'mcp', scope };
|
|
389
|
+
const adapter = create({ ...deps, target });
|
|
390
|
+
const config = options.mcpConfig;
|
|
391
|
+
assert.ok(config);
|
|
392
|
+
const path = join(scope === 'user' ? (deps.env?.HOME ?? '') : project, config[scope]);
|
|
393
|
+
const foreign = { url: 'https://foreign.example/mcp', custom: ' keep exactly ' };
|
|
394
|
+
const original = config.toml
|
|
395
|
+
? '[mcp_servers.foreign]\nurl = "https://foreign.example/mcp"\ncustom = " keep exactly "\n'
|
|
396
|
+
: JSON.stringify({ mcpServers: { foreign }, setting: 'keep' }, null, 2) + '\n';
|
|
397
|
+
await writeChanges([{ path, content: Buffer.from(original) }]);
|
|
398
|
+
const before = await snapshot(root);
|
|
399
|
+
const plan = await adapter.plan();
|
|
400
|
+
assert.equal(plan.changes.length, 1);
|
|
401
|
+
assert.equal(plan.changes[0]?.path, path);
|
|
402
|
+
const raw = plan.changes[0]?.content.toString();
|
|
403
|
+
assert.ok(raw);
|
|
404
|
+
assert.ok(raw.includes('https://api.mnemonik.dev/mcp'));
|
|
405
|
+
const sessionHeader = 'headers = { "x-mcp-session-id" = "{{session_id}}" }\n';
|
|
406
|
+
const withoutSessionHeader = options.name === 'grok' && config.toml ? raw.replace(sessionHeader, '') : raw;
|
|
407
|
+
if (options.name === 'grok')
|
|
408
|
+
assert.ok(raw.includes(sessionHeader));
|
|
409
|
+
assert.doesNotMatch(withoutSessionHeader, /token|secret|headers|credential|bearer|runtime|client.?id/i);
|
|
410
|
+
if (config.toml)
|
|
411
|
+
assert.ok(raw.startsWith(original));
|
|
412
|
+
else {
|
|
413
|
+
const parsed = JSON.parse(raw);
|
|
414
|
+
assert.deepEqual(parsed.mcpServers.foreign, foreign);
|
|
415
|
+
assert.deepEqual(parsed.mcpServers.mnemonik, {
|
|
416
|
+
...(config.type ? { type: config.type } : {}),
|
|
417
|
+
url: 'https://api.mnemonik.dev/mcp',
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
const staged = [];
|
|
421
|
+
const writer = {
|
|
422
|
+
stage: async (change) => {
|
|
423
|
+
staged.push(change);
|
|
424
|
+
},
|
|
425
|
+
};
|
|
426
|
+
await adapter.install(writer, target);
|
|
427
|
+
assert.deepEqual(staged, plan.changes);
|
|
428
|
+
assert.deepEqual(await snapshot(root), before);
|
|
429
|
+
await writeChanges(staged);
|
|
430
|
+
assert.equal((await adapter.inspect()).declarationPresent, true);
|
|
431
|
+
assert.deepEqual((await adapter.plan()).changes, plan.changes);
|
|
432
|
+
staged.length = 0;
|
|
433
|
+
await adapter.uninstall(writer, target);
|
|
434
|
+
await writeChanges(staged);
|
|
435
|
+
const removed = await readFile(path, 'utf8');
|
|
436
|
+
assert.ok(!removed.includes('mnemonik'));
|
|
437
|
+
if (config.toml)
|
|
438
|
+
assert.equal(removed, original);
|
|
439
|
+
else
|
|
440
|
+
assert.deepEqual(JSON.parse(removed).mcpServers.foreign, foreign);
|
|
441
|
+
const sameName = config.toml
|
|
442
|
+
? '[mcp_servers.mnemonik]\nurl = "https://foreign.example/mcp"\ncustom = "keep"\n'
|
|
443
|
+
: JSON.stringify({ mcpServers: { mnemonik: foreign }, setting: 'keep' }, null, 2) +
|
|
444
|
+
'\n';
|
|
445
|
+
await writeFile(path, sameName);
|
|
446
|
+
const conflicted = await snapshot(root);
|
|
447
|
+
await assert.rejects(adapter.plan(), /mcp_name_conflict/);
|
|
448
|
+
await assert.rejects(adapter.uninstall({ stage: async () => assert.fail('must not stage') }, target), /mcp_name_conflict/);
|
|
449
|
+
assert.deepEqual(await snapshot(root), conflicted);
|
|
450
|
+
});
|
|
451
|
+
check('native login/logout use the named server; missing executable returns manual instruction without writes', async ({ root, deps }) => {
|
|
452
|
+
const calls = [];
|
|
453
|
+
const adapter = create({
|
|
454
|
+
...deps,
|
|
455
|
+
execFile: async (_file, args) => {
|
|
456
|
+
if (args[0] === '--version')
|
|
457
|
+
return { stdout: versionOutput, stderr: '' };
|
|
458
|
+
calls.push(args);
|
|
459
|
+
return { stdout: '', stderr: '' };
|
|
460
|
+
},
|
|
461
|
+
});
|
|
462
|
+
await adapter.launch();
|
|
463
|
+
if (adapter.capabilities().nativeConnect)
|
|
464
|
+
assert.deepEqual(calls.shift(), ['mcp', 'login', 'mnemonik']);
|
|
465
|
+
else
|
|
466
|
+
assert.deepEqual(calls, []);
|
|
467
|
+
if (adapter.revoke) {
|
|
468
|
+
assert.equal(await adapter.revoke({ id: 'grant', account: 'owner', scopes: [] }), true);
|
|
469
|
+
assert.deepEqual(calls.shift(), ['mcp', 'logout', 'mnemonik']);
|
|
470
|
+
}
|
|
471
|
+
const before = await snapshot(root);
|
|
472
|
+
assert.match(await create(deps).launch(), /mnemonik/i);
|
|
473
|
+
assert.deepEqual(await snapshot(root), before);
|
|
474
|
+
});
|
|
475
|
+
return checks;
|
|
476
|
+
}
|
|
477
|
+
//# sourceMappingURL=hostAdapterConformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostAdapterConformance.js","sourceRoot":"","sources":["../../src/testing/hostAdapterConformance.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QACD,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AACD,KAAK,UAAU,QAAQ,CAAC,IAAY;IAClC,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,sBAAsB,CACpC,MAAmD,EACnD,OAOC;IAED,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAClG,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAClG,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,MAAM,GAAW;YACrB,SAAS,EAAE,OAAO;YAClB,KAAK,EAAE,MAAM;YACb,WAAW,EAAE,OAAO;YACpB,WAAW;YACX,gBAAgB,EAAE,aAAa;YAC/B,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC;SAC5D,CAAC;QACF,MAAM,IAAI,GAAwB;YAChC,MAAM;YACN,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE;YACrE,OAAO,EAAE,OAAO;YAChB,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,OAAO;YACL,IAAI;YACJ,OAAO;YACP,MAAM;YACN,IAAI;YACJ,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;YACrB,UAAU,EAAE,CAAC,KAAsB,EAAE,EAAE,CACrC,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;SAC1D,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,MAAM,GAAwC,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,GAA8D,EAAE,EAAE;QAC7F,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE;YAC9C,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;oBAAS,CAAC;gBACT,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;QAC3C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;QACnF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;aACnD,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACtD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,kCAAkC,CAAC,CAAC;IACxE,CAAC,CAAC;IACF,KAAK,CACH,qFAAqF,EACrF,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5E,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;YACzB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;YACnD,GAAG,CAAC,OAAO,CAAC,QAAQ;gBAClB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,iBAAiB,EAAE;wBACjB,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;4BAC3B,CAAC,CAAC,CAAC,8BAA8B,EAAE,sCAAsC,CAAC;4BAC1E,CAAC,CAAC,EAAE,CAAC;qBACR;iBACF,CAAC;SACP,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC,CACF,CAAC;IACF,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,8BAA8B,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;YAClE,KAAK,MAAM,SAAS,IAAI;gBACtB,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE;gBAC5B,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;gBACvB,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE;gBACpB,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,EAAE,MAAM,CAAC;gBACxD,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,EAAE,MAAM,CAAC;gBACvD,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,EAAE,MAAM,CAAC;gBACvD,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE;gBACtB,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE;gBACtB,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,EAAE,MAAM,CAAC;gBAC1D,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aACxE;gBACC,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,IAAsB,EAAE,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,aAAa,GAAG;QACpB,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,aAAa;QACnB,aAAa,EAAE,uBAAuB;QACtC,KAAK,EAAE,mBAAmB;KAC3B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;IACzB,KAAK,CAAC,yDAAyD,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QAClF,MAAM,OAAO,GAAG,MAAM,CAAC;YACrB,GAAG,IAAI;YACP,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;SACxE,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE;YACvC,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,cAAc;YACtB,YAAY,EAAE,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;SACvE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,2DAA2D,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACpF,MAAM,OAAO,GAAG,MAAM,CAAC;YACrB,GAAG,IAAI;YACP,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE;YACvC,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,oBAAoB;YAC5B,YAAY,EAAE,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI;SACvE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,KAAK,CACH,kGAAkG,EAClG,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACtE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5D,MAAM,SAAS,GACb,OAAO,CAAC,IAAI,KAAK,QAAQ;YACvB,CAAC,CAAC,uDAAuD;YACzD,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;gBACvB,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,kBAAkB,IAAI,MAAM,CAAC;QACrC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,KAAK,MAAM,SAAS,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC7D,MAAM,KAAK,GAAe,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC;gBAClB,GAAG,IAAI;gBACP,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;gBACvC,GAAG,EAAE;oBACH,GAAG,IAAI,CAAC,GAAG;oBACX,YAAY,EAAE,UAAU;oBACxB,WAAW,EAAE,SAAS;oBACtB,OAAO,EAAE,YAAY;oBACrB,OAAO,EAAE,6BAA6B;iBACvC;gBACD,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACvF,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;oBAC7B,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;oBAC5B,OAAO;wBACL,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;4BAChC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,kBAAkB,IAAI,WAAW,QAAQ,mBAAmB,IAAI,GAAG,SAAS,EAAE;4BACnG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;gCACpC,CAAC,CAAC,aAAa;gCACf,CAAC,CAAC,qBAAqB;wBAC3B,MAAM,EAAE,EAAE;qBACX,CAAC;gBACJ,CAAC;aACF,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1E,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CACV,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAC3D,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAClB,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrF,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;gBACpF,IAAI,SAAS,KAAK,MAAM;oBAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;qBAClD,CAAC;oBACJ,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,6BAA6B,CAAC,CAAC;oBAClD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAC3E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CACF,CAAC;IACF,KAAK,CAAC,yDAAyD,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACrF,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE;YACvC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;YACvD,UAAU,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;YAC5B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;YACxE,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,uDAAuD,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QAChF,MAAM,OAAO,GAAG,MAAM,CAAC;YACrB,GAAG,IAAI;YACP,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,qBAAqB,EAAE,qBAAqB,EAAE;SACnE,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,uBAAuB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM;QAChC,KAAK,CACH,GAAG,KAAK,4FAA4F,EACpG,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;YACjD,MAAM,OAAO,GAAG,MAAM,CAAC;gBACrB,GAAG,IAAI;gBACP,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,qBAAqB,EAAE,kCAAkC,EAAE;aAChF,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC;YAClC,MAAM,YAAY,CAAC;gBACjB;oBACE,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC;oBACvB,OAAO,EAAE,MAAM,CAAC,IAAI,CAClB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE;iBACF;aACF,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YACtD,MAAM,CAAC,EAAE,CACP,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAC1E,CACF,CAAC;YACF,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,CAAC,KAAc,EAAQ,EAAE;gBACvC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAAE,OAAO;gBAChD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjD,IACE,GAAG,KAAK,SAAS;wBACjB,OAAO,KAAK,KAAK,QAAQ;wBACzB,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;wBAEnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;wBAClB,OAAO,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC;YACF,OAAO,CAAC,MAAM,CAAC,CAAC;YAChB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ;gBAC5B,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,yCAAyC,CAAC,EAAE,OAAO,CAAC,CAAC;YAClF,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;gBAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC;gBAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC9E,MAAM,CAAC,EAAE,CACP,KAAK,CAAC,KAAK,CAAC;qBACT,OAAO,CAAC,CAAC,KAA4B,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;qBACjE,IAAI,CACH,CAAC,KAA6C,EAAE,EAAE,CAChD,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,sBAAsB,GAAG,MAAM,CAAC,gBAAgB,CAAC;oBACzE,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,EAAE,CAC7B,CACJ,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;gBAC1B,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;;gBAE7E,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;YAC3F,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAiB,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG;gBACb,KAAK,EAAE,KAAK,EAAE,MAAkB,EAAE,EAAE;oBAClC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;aACF,CAAC;YACF,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC;YACzE,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;YACvE,MAAM,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;YACvC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACvC,KAAK,MAAM,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClB,MAAM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAChC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvC,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAClB,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;YAClD,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;YAC7E,MAAM,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC,CACF,CAAC;IACJ,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM;QAChC,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,KAAK,CAAW,CAAC,CAAC,CAAE,CAAC,OAAO,CAAW;YAC5F,KAAK,CACH,GAAG,KAAK,IAAI,SAAS,sDAAsD,EAC3E,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;gBACpD,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAC7C,MAAM,IAAI,GACR,SAAS,KAAK,OAAO;oBACnB,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;oBACnB,CAAC,CAAC,IAAI,CACF,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EACnD,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CACjC,CAAC;gBACR,MAAM,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5C,MAAM,YAAY,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;gBACnD,MAAM,MAAM,GAAiB,EAAE,CAAC;gBAChC,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBACvF,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAEzD,MAAM,KAAK,GAAG,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC7E,MAAM,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC7B,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACxD,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBACnE,MAAM,YAAY,CAAC,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;gBACvD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClB,MAAM,WAAW,CAAC,SAAS,CACzB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EACrD,iBAAiB,CAClB,CAAC;gBACF,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;YAClE,CAAC,CACF,CAAC;IACN,KAAK,CACH,gFAAgF,EAChF,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE;QACxC,MAAM,YAAY,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,SAAkB,EAAE,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE;YACnE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;SAC5C,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CACP,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC,CAAC,CACxF,CAAC;QACF,MAAM,YAAY,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC,CACF,CAAC;IACF,KAAK,CACH,iFAAiF,EACjF,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,IAAI,MAAM,GAAG,wDAAwD,CAAC;QACtE,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC;YAClB,GAAG,IAAI;YACP,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE;YACvC,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;gBAC1B,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW;oBAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBAC7E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAChC,CAAC;SACF,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACzB,OAAO,CAAC,IAAI,KAAK,aAAa;gBAC5B,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;oBACzB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,OAAO,CAAC,IAAI;YAClB,CAAC,KAAK,EAAE,MAAM,CAAC;YACf,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;SACxF,CAAC,CAAC;QACH,KAAK,MAAM,OAAO,IAAI;YACpB,yBAAyB;YACzB,sBAAsB;YACtB,yBAAyB;YACzB,6BAA6B;YAC7B,6CAA6C;YAC7C,qBAAqB;SACtB,EAAE,CAAC;YACF,MAAM,GAAG,OAAO,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CACF,CAAC;IACF,IAAI,OAAO,CAAC,SAAS;QACnB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM;YAChC,KAAK,CACH,GAAG,KAAK,4DAA4D,EACpE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;gBAC9C,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAc,EAAE,KAAK,EAAE,CAAC;gBAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;gBACjC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;gBAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtF,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,6BAA6B,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;gBACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI;oBAC1B,CAAC,CAAC,2FAA2F;oBAC7F,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;gBACjF,MAAM,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAChD,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBACf,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACxD,MAAM,aAAa,GAAG,uDAAuD,CAAC;gBAC9E,MAAM,oBAAoB,GACxB,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAChF,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;oBAAE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;gBACpE,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB,4DAA4D,CAC7D,CAAC;gBACF,IAAI,MAAM,CAAC,IAAI;oBAAE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;qBAChD,CAAC;oBACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC/B,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACrD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE;wBAC3C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7C,GAAG,EAAE,8BAA8B;qBACpC,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,MAAM,GAAiB,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG;oBACb,KAAK,EAAE,KAAK,EAAE,MAAkB,EAAE,EAAE;wBAClC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACtB,CAAC;iBACF,CAAC;gBACF,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACtC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvC,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC/C,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBACjE,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/D,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAClB,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACxC,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC7C,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;gBACzC,IAAI,MAAM,CAAC,IAAI;oBAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;;oBAC5C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAEvE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI;oBAC1B,CAAC,CAAC,gFAAgF;oBAClF,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC/E,IAAI,CAAC;gBACT,MAAM,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAChC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,mBAAmB,CAAC,CAAC;gBAC1D,MAAM,MAAM,CAAC,OAAO,CAClB,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,EAC/E,mBAAmB,CACpB,CAAC;gBACF,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;YACrD,CAAC,CACF,CAAC;IACN,KAAK,CACH,wGAAwG,EACxG,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACvB,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC;YACrB,GAAG,IAAI;YACP,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC9B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW;oBAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;gBAC1E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YACpC,CAAC;SACF,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,aAAa;YACtC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;;YAC3D,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACxF,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC,CACF,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/usageGuide.d.ts
CHANGED
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
* This guide focuses on HOW to use Mnemonik effectively, not WHAT tools exist.
|
|
11
11
|
* Tool schemas already tell agents what's available - they need the workflow.
|
|
12
12
|
*/
|
|
13
|
-
export declare const USAGE_GUIDE = "# Mnemonik Workflow Guide (v2.85)\n\n## Workflow\n\nsession_bootstrap
|
|
13
|
+
export declare const USAGE_GUIDE = "# Mnemonik Workflow Guide (v2.85)\n\n## Workflow\n\nsession_bootstrap -> memory_search -> file_context -> [work] -> memory_add -> memory_state\n\n## Tool Selection by Stage\n\n### Session start\n- session_bootstrap: loads context, policies, pending tasks (call once, first thing)\n- memory_search: search by task domain; set workflowContext (feature_implementation, debugging, exploration, policy_review)\n- projects: resolve project IDs if context unclear\n- policy: review safety rules\n\n### Before editing files\n- file_context: fetch memories for the file - call for EVERY file you edit\n- memory_search: second search scoped to file/module if needed\n- mnemonik.docs({ action: 'drift', scopePath }): check doc-truth findings for the file\n\n### During implementation\n- memory_get: retrieve specific memory by id\n- memory_update: refine memory created this session\n- memory_info: query history, provenance, confidence breakdown, links, graph\n- assist: get tool guidance if uncertain\n\n### Documentation drift\n- An unscoped mnemonik.docs({ action: 'drift' }) call defaults to the schema-v3 affected-document inventory; a scoped call defaults to its detailed packet. Each document is an independent work unit. Recommended default: delegate each affected document to a subagent and start available document workers together; pass docPath and the compact retrieve call instead of copying finding bodies. This is advisory orchestration, not a host-enforced ownership rule.\n- Detailed retrieval defaults to one document and returns at most 8 findings within 16 KiB. Each packet carries compact causal triggers plus current Markdown and code locations resolved from stable identities; line numbers are display metadata and may move.\n- Complete every finding in the document: edit update_doc/regenerate_doc items, submit mnemonik.docs({ action: 'verdicts', scopePath, items: [...] }) with independently cited evidence for settled verify_and_report items, or call mnemonik.docs({ action: 'flag_for_review', scopePath, findingId, evidence }) when inspected evidence cannot settle a claim.\n- The document under review cannot confirm or refute its own claim. Verdict evidence must cite an independent source; route a rejected circular verdict to flag_for_review.\n- Absence of repository evidence is not refutation. Claims about human intent, plans, positioning, or external facts require affirmative contradictory evidence to refute; otherwise flag them for review.\n- Follow the document-local retrieveMore call until that document is complete, and follow inventory cursors until every affected document has a terminal disposition.\n\n### After significant work\n- memory_add: save decisions, outcomes, patterns, bug root causes\n- memory_state: reinforce (memory helped), supersede (replace outdated), deprecate, penalize, dispute\n- tasks: mark tasks in progress or complete\n- mnemonik.docs({ action: 'status' }): view doc-truth health (legacy coupling counts are diagnostic only - do not act on them as drift)\n\n### Diagnostics\n- doctor: when tool calls fail or behavior is inconsistent\n- scanner: metrics (is the indexing daemon alive), history, drift. Nothing here starts indexing - the daemon owns it\n\n## Skip conditions\n\nSkip memory tools for: formatting-only edits, trivial one-line changes, mechanical refactors, git operations, running tests.\n\n## Completion gate\n\nNever tell the user significant work is done without calling memory_add first in the same response. Changes made + responding next = completion. \"Progress updates\" count.\n\n## Memory search tips\n\n- Query should include task intent + key entities\n- Set workflowContext when you know the phase\n- Use currentFile to boost file-linked memories\n- Use filterOnly:true only for narrow filters (no embedding, requires >=1 filter)\n\n## Proactive heuristics\n\n- Long sessions: re-run memory_search after switching topics\n- Conflicting info: use memory_state to supersede/dispute\n- High-impact changes: save memory immediately after verification\n- Treat each affected document in docTruthFindings/_docDrift as an independent work unit. Complete its scoped packet with edits, supported verdicts, or an evidenced review disposition. linkedDocs and stale-coupling counts alone remain legacy diagnostics\n\n## Anti-fade (every ~10 tool calls)\n\nCheck: (1) memory_search before work? (2) file_context before edit? (3) memory_add after completing? No session_bootstrap? Call it now.\n";
|
|
14
14
|
//# sourceMappingURL=usageGuide.d.ts.map
|
package/dist/usageGuide.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usageGuide.d.ts","sourceRoot":"","sources":["../src/usageGuide.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"usageGuide.d.ts","sourceRoot":"","sources":["../src/usageGuide.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,WAAW,43IAoEvB,CAAC"}
|
package/dist/usageGuide.js
CHANGED
|
@@ -14,7 +14,7 @@ export const USAGE_GUIDE = `# Mnemonik Workflow Guide (v2.85)
|
|
|
14
14
|
|
|
15
15
|
## Workflow
|
|
16
16
|
|
|
17
|
-
session_bootstrap
|
|
17
|
+
session_bootstrap -> memory_search -> file_context -> [work] -> memory_add -> memory_state
|
|
18
18
|
|
|
19
19
|
## Tool Selection by Stage
|
|
20
20
|
|
|
@@ -25,7 +25,7 @@ session_bootstrap → memory_search → file_context → [work] → memory_add
|
|
|
25
25
|
- policy: review safety rules
|
|
26
26
|
|
|
27
27
|
### Before editing files
|
|
28
|
-
- file_context: fetch memories for the file
|
|
28
|
+
- file_context: fetch memories for the file - call for EVERY file you edit
|
|
29
29
|
- memory_search: second search scoped to file/module if needed
|
|
30
30
|
- mnemonik.docs({ action: 'drift', scopePath }): check doc-truth findings for the file
|
|
31
31
|
|
|
@@ -47,11 +47,11 @@ session_bootstrap → memory_search → file_context → [work] → memory_add
|
|
|
47
47
|
- memory_add: save decisions, outcomes, patterns, bug root causes
|
|
48
48
|
- memory_state: reinforce (memory helped), supersede (replace outdated), deprecate, penalize, dispute
|
|
49
49
|
- tasks: mark tasks in progress or complete
|
|
50
|
-
- mnemonik.docs({ action: 'status' }): view doc-truth health (legacy coupling counts are diagnostic only
|
|
50
|
+
- mnemonik.docs({ action: 'status' }): view doc-truth health (legacy coupling counts are diagnostic only - do not act on them as drift)
|
|
51
51
|
|
|
52
52
|
### Diagnostics
|
|
53
53
|
- doctor: when tool calls fail or behavior is inconsistent
|
|
54
|
-
- scanner: metrics (is the indexing daemon alive), history, drift. Nothing here starts indexing
|
|
54
|
+
- scanner: metrics (is the indexing daemon alive), history, drift. Nothing here starts indexing - the daemon owns it
|
|
55
55
|
|
|
56
56
|
## Skip conditions
|
|
57
57
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mnemonik/shared",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.98.1",
|
|
4
4
|
"description": "Shared constants and utilities for Mnemonik packages",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
"import": "./dist/index.js",
|
|
16
16
|
"types": "./dist/index.d.ts"
|
|
17
17
|
},
|
|
18
|
+
"./testing/host-adapter-conformance": {
|
|
19
|
+
"import": "./dist/testing/hostAdapterConformance.js",
|
|
20
|
+
"types": "./dist/testing/hostAdapterConformance.d.ts"
|
|
21
|
+
},
|
|
18
22
|
"./hook-timeouts": {
|
|
19
23
|
"import": "./dist/hookTimeouts.js",
|
|
20
24
|
"types": "./dist/hookTimeouts.d.ts"
|
|
@@ -41,8 +45,9 @@
|
|
|
41
45
|
}
|
|
42
46
|
},
|
|
43
47
|
"scripts": {
|
|
48
|
+
"test": "tsx --test --test-concurrency=2 tests/repositoryFingerprint.test.ts tests/projectIdentity.test.ts tests/readiness.test.ts",
|
|
44
49
|
"build": "node ../../node_modules/@typescript/native/bin/tsc",
|
|
45
|
-
"typecheck": "node ../../node_modules/@typescript/native/bin/tsc --noEmit",
|
|
50
|
+
"typecheck": "node ../../node_modules/@typescript/native/bin/tsc --noEmit -p tsconfig.test.json",
|
|
46
51
|
"prepublishOnly": "npm run build"
|
|
47
52
|
},
|
|
48
53
|
"keywords": [
|
package/queries/bash.tags.scm
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
; Hand-written: tree-sitter-bash ships no queries/tags.scm.
|
|
2
2
|
;
|
|
3
3
|
; Node names verified by parsing a sample with the vendored bash.wasm rather than
|
|
4
|
-
; taken from documentation
|
|
4
|
+
; taken from documentation - `function_definition` carries its name in a `name`
|
|
5
5
|
; field typed `word`, covering both `foo() { }` and `function foo { }`.
|
|
6
6
|
(function_definition
|
|
7
7
|
name: (word) @name) @definition.function
|
package/queries/groovy.tags.scm
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
;
|
|
3
3
|
; Node names verified against the vendored groovy.wasm. Groovy distinguishes a
|
|
4
4
|
; top-level `function_definition` from a `method_declaration` inside a
|
|
5
|
-
; `class_body`, and both name via an `identifier` field
|
|
5
|
+
; `class_body`, and both name via an `identifier` field - so methods get
|
|
6
6
|
; definition.method and keep their own name, which is the defect this plan
|
|
7
7
|
; exists to fix for every language.
|
|
8
8
|
(class_declaration
|