@pcircle/memesh 4.5.0 → 4.5.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.mcp.json +1 -1
- package/README.de.md +2 -5
- package/README.es.md +5 -8
- package/README.fr.md +3 -6
- package/README.ja.md +5 -8
- package/README.ko.md +5 -8
- package/README.md +28 -10
- package/README.pt.md +3 -6
- package/README.th.md +3 -6
- package/README.vi.md +3 -6
- package/README.zh-CN.md +5 -8
- package/README.zh-TW.md +5 -8
- package/dashboard/dist/index.html +9 -9
- package/dist/cli/view.d.ts.map +1 -1
- package/dist/cli/view.js +2 -2
- package/dist/cli/view.js.map +1 -1
- package/dist/core/analytics.d.ts +3 -3
- package/dist/core/analytics.d.ts.map +1 -1
- package/dist/core/analytics.js.map +1 -1
- package/dist/core/config.d.ts +0 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +2 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/demo.d.ts +2 -2
- package/dist/core/demo.d.ts.map +1 -1
- package/dist/core/demo.js.map +1 -1
- package/dist/core/doctor.d.ts +1 -0
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +191 -47
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/dreamer.d.ts +15 -7
- package/dist/core/dreamer.d.ts.map +1 -1
- package/dist/core/dreamer.js +310 -35
- package/dist/core/dreamer.js.map +1 -1
- package/dist/core/embedder.d.ts +2 -1
- package/dist/core/embedder.d.ts.map +1 -1
- package/dist/core/embedder.js +22 -1
- package/dist/core/embedder.js.map +1 -1
- package/dist/core/extractor.d.ts.map +1 -1
- package/dist/core/extractor.js +2 -1
- package/dist/core/extractor.js.map +1 -1
- package/dist/core/graph.d.ts +4 -4
- package/dist/core/graph.d.ts.map +1 -1
- package/dist/core/graph.js.map +1 -1
- package/dist/core/install-hooks.d.ts +1 -0
- package/dist/core/install-hooks.d.ts.map +1 -1
- package/dist/core/install-hooks.js +0 -0
- package/dist/core/install-hooks.js.map +1 -1
- package/dist/core/kg-backfill.d.ts +4 -4
- package/dist/core/kg-backfill.d.ts.map +1 -1
- package/dist/core/kg-backfill.js +1 -1
- package/dist/core/kg-backfill.js.map +1 -1
- package/dist/core/lesson-engine.d.ts +1 -0
- package/dist/core/lesson-engine.d.ts.map +1 -1
- package/dist/core/lesson-engine.js +1 -0
- package/dist/core/lesson-engine.js.map +1 -1
- package/dist/core/lifecycle.d.ts +4 -4
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +1 -1
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/llm-client.d.ts.map +1 -1
- package/dist/core/llm-client.js +3 -6
- package/dist/core/llm-client.js.map +1 -1
- package/dist/core/llm-telemetry.d.ts +4 -4
- package/dist/core/llm-telemetry.d.ts.map +1 -1
- package/dist/core/llm-telemetry.js +1 -1
- package/dist/core/llm-telemetry.js.map +1 -1
- package/dist/core/memory-tool.d.ts.map +1 -1
- package/dist/core/memory-tool.js +4 -0
- package/dist/core/memory-tool.js.map +1 -1
- package/dist/core/operations.d.ts.map +1 -1
- package/dist/core/operations.js +22 -7
- package/dist/core/operations.js.map +1 -1
- package/dist/core/paths.d.ts +3 -0
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/paths.js +67 -1
- package/dist/core/paths.js.map +1 -1
- package/dist/core/patterns.d.ts +2 -2
- package/dist/core/patterns.d.ts.map +1 -1
- package/dist/core/patterns.js.map +1 -1
- package/dist/core/project-tags.d.ts +3 -3
- package/dist/core/project-tags.d.ts.map +1 -1
- package/dist/core/project-tags.js.map +1 -1
- package/dist/core/projects.d.ts +2 -2
- package/dist/core/projects.d.ts.map +1 -1
- package/dist/core/projects.js.map +1 -1
- package/dist/core/schema-export.d.ts.map +1 -1
- package/dist/core/schema-export.js +0 -34
- package/dist/core/schema-export.js.map +1 -1
- package/dist/core/serializer.d.ts.map +1 -1
- package/dist/core/serializer.js +45 -4
- package/dist/core/serializer.js.map +1 -1
- package/dist/core/stats.d.ts +2 -2
- package/dist/core/stats.d.ts.map +1 -1
- package/dist/core/stats.js.map +1 -1
- package/dist/core/transcript-extractor.d.ts +5 -6
- package/dist/core/transcript-extractor.d.ts.map +1 -1
- package/dist/core/transcript-extractor.js +4 -24
- package/dist/core/transcript-extractor.js.map +1 -1
- package/dist/core/transcript-source.d.ts.map +1 -1
- package/dist/core/transcript-source.js.map +1 -1
- package/dist/core/types.d.ts +17 -7
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -1
- package/dist/db.d.ts +5 -5
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +155 -17
- package/dist/db.js.map +1 -1
- package/dist/knowledge-graph.d.ts +3 -2
- package/dist/knowledge-graph.d.ts.map +1 -1
- package/dist/knowledge-graph.js +19 -10
- package/dist/knowledge-graph.js.map +1 -1
- package/dist/mcp/server.js +2 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills-manifest.json +28 -33
- package/dist/storage/conflicts.d.ts +3 -3
- package/dist/storage/conflicts.d.ts.map +1 -1
- package/dist/storage/conflicts.js.map +1 -1
- package/dist/storage/fts-index.d.ts +4 -4
- package/dist/storage/fts-index.d.ts.map +1 -1
- package/dist/storage/fts-index.js.map +1 -1
- package/dist/storage/sqlite.d.ts +20 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +64 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/vector-index.d.ts +3 -0
- package/dist/storage/vector-index.d.ts.map +1 -0
- package/dist/storage/vector-index.js +7 -0
- package/dist/storage/vector-index.js.map +1 -0
- package/dist/transports/cli/cli.d.ts.map +1 -1
- package/dist/transports/cli/cli.js +126 -84
- package/dist/transports/cli/cli.js.map +1 -1
- package/dist/transports/http/retired-routes.d.ts.map +1 -1
- package/dist/transports/http/retired-routes.js +1 -0
- package/dist/transports/http/retired-routes.js.map +1 -1
- package/dist/transports/http/server.d.ts.map +1 -1
- package/dist/transports/http/server.js +48 -29
- package/dist/transports/http/server.js.map +1 -1
- package/dist/transports/mcp/handlers.d.ts +4 -96
- package/dist/transports/mcp/handlers.d.ts.map +1 -1
- package/dist/transports/mcp/handlers.js +24 -58
- package/dist/transports/mcp/handlers.js.map +1 -1
- package/dist/transports/schemas.d.ts +10 -30
- package/dist/transports/schemas.d.ts.map +1 -1
- package/dist/transports/schemas.js +5 -29
- package/dist/transports/schemas.js.map +1 -1
- package/hooks/hooks.json +0 -10
- package/package.json +6 -10
- package/scripts/hooks/_generated/core-paths.js +67 -1
- package/scripts/hooks/_generated/sqlite.js +71 -0
- package/scripts/hooks/_shared.js +286 -195
- package/scripts/hooks/post-commit.js +52 -10
- package/scripts/hooks/pre-compact.js +10 -7
- package/scripts/hooks/pre-edit-recall.js +4 -8
- package/scripts/hooks/session-start.js +95 -47
- package/scripts/hooks/session-summary.js +120 -52
- package/scripts/hooks/user-prompt-intent.js +3 -2
- package/skills/memesh/SKILL.md +1 -2
- package/dist/core/skill-usage-log.d.ts +0 -11
- package/dist/core/skill-usage-log.d.ts.map +0 -1
- package/dist/core/skill-usage-log.js +0 -125
- package/dist/core/skill-usage-log.js.map +0 -1
- package/dist/core/verifier.d.ts +0 -40
- package/dist/core/verifier.d.ts.map +0 -1
- package/dist/core/verifier.js +0 -206
- package/dist/core/verifier.js.map +0 -1
- package/dist/mcp/launcher.d.ts +0 -3
- package/dist/mcp/launcher.d.ts.map +0 -1
- package/dist/mcp/launcher.js +0 -37
- package/dist/mcp/launcher.js.map +0 -1
- package/scripts/hooks/pre-bash-orchestration-nudge.js +0 -155
- package/scripts/postinstall-rebuild.mjs +0 -41
- package/skills/agentic-orchestration/SKILL.md +0 -399
package/dist/core/verifier.js
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { execFileSync } from 'child_process';
|
|
2
|
-
import { randomBytes } from 'crypto';
|
|
3
|
-
import { realpathSync, statSync } from 'fs';
|
|
4
|
-
import { isAbsolute } from 'path';
|
|
5
|
-
import { readConfig } from './config.js';
|
|
6
|
-
import { remember } from './operations.js';
|
|
7
|
-
import { logSkillEvent } from './skill-usage-log.js';
|
|
8
|
-
function isAgenticOrchestrationEnabled() {
|
|
9
|
-
const envVal = process.env.MEMESH_ENABLE_AGENTIC_ORCHESTRATION;
|
|
10
|
-
if (envVal !== undefined)
|
|
11
|
-
return envVal === '1';
|
|
12
|
-
try {
|
|
13
|
-
const cfg = readConfig();
|
|
14
|
-
return cfg.enableAgenticOrchestration === true;
|
|
15
|
-
}
|
|
16
|
-
catch {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
function validateWorkdir(workdir) {
|
|
21
|
-
if (!isAbsolute(workdir)) {
|
|
22
|
-
throw new Error(`workdir must be an absolute path, got "${workdir}"`);
|
|
23
|
-
}
|
|
24
|
-
let canonical;
|
|
25
|
-
try {
|
|
26
|
-
canonical = realpathSync(workdir);
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
throw new Error(`workdir does not exist or is not accessible: "${workdir}" (${err instanceof Error ? err.message : String(err)})`, { cause: err });
|
|
30
|
-
}
|
|
31
|
-
let stat;
|
|
32
|
-
try {
|
|
33
|
-
stat = statSync(canonical);
|
|
34
|
-
}
|
|
35
|
-
catch (err) {
|
|
36
|
-
throw new Error(`workdir not stat-able: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
37
|
-
}
|
|
38
|
-
if (!stat.isDirectory()) {
|
|
39
|
-
throw new Error(`workdir is not a directory: "${canonical}"`);
|
|
40
|
-
}
|
|
41
|
-
try {
|
|
42
|
-
const inside = execFileSync('git', ['-C', canonical, 'rev-parse', '--is-inside-work-tree'], {
|
|
43
|
-
encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'],
|
|
44
|
-
}).trim();
|
|
45
|
-
if (inside !== 'true') {
|
|
46
|
-
throw new Error('not inside work tree');
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
throw new Error(`workdir is not a git working tree: "${canonical}"`);
|
|
51
|
-
}
|
|
52
|
-
return canonical;
|
|
53
|
-
}
|
|
54
|
-
function resolveBase(workdir, explicit) {
|
|
55
|
-
if (explicit)
|
|
56
|
-
return explicit;
|
|
57
|
-
const candidates = ['origin/main', 'main', 'origin/develop', 'develop'];
|
|
58
|
-
for (const ref of candidates) {
|
|
59
|
-
try {
|
|
60
|
-
const sha = execFileSync('git', ['-C', workdir, 'merge-base', 'HEAD', ref], {
|
|
61
|
-
encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'],
|
|
62
|
-
}).trim();
|
|
63
|
-
if (sha)
|
|
64
|
-
return sha;
|
|
65
|
-
}
|
|
66
|
-
catch { }
|
|
67
|
-
}
|
|
68
|
-
try {
|
|
69
|
-
return execFileSync('git', ['-C', workdir, 'rev-parse', 'HEAD~1'], {
|
|
70
|
-
encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'],
|
|
71
|
-
}).trim();
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function withPassAlias(rc) {
|
|
78
|
-
return { ...rc, pass: rc.verdict === 'pass' };
|
|
79
|
-
}
|
|
80
|
-
function realityCheck(workdir, base, expectedFiles) {
|
|
81
|
-
return withPassAlias(computeRealityCheck(workdir, base, expectedFiles));
|
|
82
|
-
}
|
|
83
|
-
function computeRealityCheck(workdir, base, expectedFiles) {
|
|
84
|
-
if (!base) {
|
|
85
|
-
return {
|
|
86
|
-
files_changed: 0,
|
|
87
|
-
expected_files: expectedFiles ?? null,
|
|
88
|
-
match: null,
|
|
89
|
-
base: null,
|
|
90
|
-
verdict: 'unverified',
|
|
91
|
-
summary: 'no git base discoverable; cannot reality-check',
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
let stat;
|
|
95
|
-
try {
|
|
96
|
-
stat = execFileSync('git', ['-C', workdir, 'diff', '--stat', `${base}..HEAD`], {
|
|
97
|
-
encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'pipe'],
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
catch (err) {
|
|
101
|
-
return {
|
|
102
|
-
files_changed: 0,
|
|
103
|
-
expected_files: expectedFiles ?? null,
|
|
104
|
-
match: null,
|
|
105
|
-
base,
|
|
106
|
-
verdict: 'unverified',
|
|
107
|
-
summary: `git diff failed: ${err instanceof Error ? err.message : 'unknown'}`,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
const fileLines = stat
|
|
111
|
-
.split('\n')
|
|
112
|
-
.filter((l) => l.includes('|') && !l.includes('files changed'));
|
|
113
|
-
const filesChanged = fileLines.length;
|
|
114
|
-
if (expectedFiles == null) {
|
|
115
|
-
return {
|
|
116
|
-
files_changed: filesChanged,
|
|
117
|
-
expected_files: null,
|
|
118
|
-
match: null,
|
|
119
|
-
base,
|
|
120
|
-
verdict: 'unverified',
|
|
121
|
-
summary: `${filesChanged} files changed (no claim to check against)`,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
const match = filesChanged === expectedFiles;
|
|
125
|
-
return {
|
|
126
|
-
files_changed: filesChanged,
|
|
127
|
-
expected_files: expectedFiles,
|
|
128
|
-
match,
|
|
129
|
-
base,
|
|
130
|
-
verdict: match ? 'pass' : 'fail',
|
|
131
|
-
summary: match
|
|
132
|
-
? `reality OK: ${filesChanged}/${expectedFiles} files`
|
|
133
|
-
: `reality MISMATCH: agent claimed ${expectedFiles}, actual ${filesChanged} (only committed changes count — uncommitted work reads as 0; commit before verifying)`,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
function buildObservations(input, rc, verdict, canonicalWorkdir) {
|
|
137
|
-
const obs = [];
|
|
138
|
-
obs.push(`Agent ${input.agent_id} verification: ${verdict.toUpperCase()}`);
|
|
139
|
-
obs.push(`Workdir: ${canonicalWorkdir}`);
|
|
140
|
-
if (canonicalWorkdir !== input.workdir) {
|
|
141
|
-
obs.push(`Workdir input (pre-realpath): ${input.workdir}`);
|
|
142
|
-
}
|
|
143
|
-
if (rc.base)
|
|
144
|
-
obs.push(`Base: ${rc.base}`);
|
|
145
|
-
obs.push(`Reality check: ${rc.summary}`);
|
|
146
|
-
const r = input.report;
|
|
147
|
-
if (r) {
|
|
148
|
-
if (r.typecheck)
|
|
149
|
-
obs.push(`Typecheck: ${r.typecheck.pass ? 'PASS' : 'FAIL'}${r.typecheck.summary ? ' — ' + r.typecheck.summary : ''}`);
|
|
150
|
-
if (r.tests)
|
|
151
|
-
obs.push(`Tests: ${r.tests.pass ? 'PASS' : 'FAIL'}${r.tests.summary ? ' — ' + r.tests.summary : ''}`);
|
|
152
|
-
if (r.lint)
|
|
153
|
-
obs.push(`Lint: ${r.lint.pass ? 'PASS' : 'FAIL'}${r.lint.summary ? ' — ' + r.lint.summary : ''}`);
|
|
154
|
-
if (r.build)
|
|
155
|
-
obs.push(`Build: ${r.build.pass ? 'PASS' : 'FAIL'}${r.build.summary ? ' — ' + r.build.summary : ''}`);
|
|
156
|
-
if (r.summary)
|
|
157
|
-
obs.push(`Hook summary: ${r.summary}`);
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
obs.push('External report: not provided (reality-check only)');
|
|
161
|
-
}
|
|
162
|
-
return obs;
|
|
163
|
-
}
|
|
164
|
-
function combineVerdict(realityVerdict, reportPass, claimWentUnevaluated) {
|
|
165
|
-
if (realityVerdict === 'fail' || reportPass === false)
|
|
166
|
-
return 'fail';
|
|
167
|
-
if (claimWentUnevaluated)
|
|
168
|
-
return 'unverified';
|
|
169
|
-
if (realityVerdict === 'pass' || reportPass === true)
|
|
170
|
-
return 'pass';
|
|
171
|
-
return 'unverified';
|
|
172
|
-
}
|
|
173
|
-
export function verifyAgentWork(input) {
|
|
174
|
-
const canonicalWorkdir = validateWorkdir(input.workdir);
|
|
175
|
-
const base = resolveBase(canonicalWorkdir, input.base);
|
|
176
|
-
const rc = realityCheck(canonicalWorkdir, base, input.claim?.expected_files);
|
|
177
|
-
const claimWentUnevaluated = input.claim?.expected_files != null && rc.match === null;
|
|
178
|
-
const verdict = combineVerdict(rc.verdict, input.report?.pass, claimWentUnevaluated);
|
|
179
|
-
const timestamp = new Date().toISOString();
|
|
180
|
-
const safeAgentId = input.agent_id.replace(/[^a-zA-Z0-9_-]/g, '-');
|
|
181
|
-
const suffix = randomBytes(3).toString('hex');
|
|
182
|
-
const entityName = `verification:${safeAgentId}:${timestamp.replace(/[:.]/g, '-')}:${suffix}`;
|
|
183
|
-
const tags = [
|
|
184
|
-
'verification',
|
|
185
|
-
`agent:${safeAgentId}`,
|
|
186
|
-
`verification:${verdict}`,
|
|
187
|
-
];
|
|
188
|
-
remember({
|
|
189
|
-
name: entityName,
|
|
190
|
-
type: 'verification_record',
|
|
191
|
-
observations: buildObservations(input, rc, verdict, canonicalWorkdir),
|
|
192
|
-
tags,
|
|
193
|
-
});
|
|
194
|
-
if (isAgenticOrchestrationEnabled()) {
|
|
195
|
-
logSkillEvent('verify_agent_work_invoked');
|
|
196
|
-
}
|
|
197
|
-
return {
|
|
198
|
-
entity_name: entityName,
|
|
199
|
-
verdict,
|
|
200
|
-
pass: verdict === 'pass',
|
|
201
|
-
reality_check: rc,
|
|
202
|
-
external_report: input.report ?? null,
|
|
203
|
-
timestamp,
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
//# sourceMappingURL=verifier.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/core/verifier.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/launcher.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/mcp/launcher.ts"],"names":[],"mappings":""}
|
package/dist/mcp/launcher.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { createRequire } from 'module';
|
|
3
|
-
import { execFileSync, spawnSync } from 'child_process';
|
|
4
|
-
import { fileURLToPath } from 'url';
|
|
5
|
-
import { dirname, join } from 'path';
|
|
6
|
-
const _require = createRequire(import.meta.url);
|
|
7
|
-
const _dir = dirname(fileURLToPath(import.meta.url));
|
|
8
|
-
function hasBinary() {
|
|
9
|
-
try {
|
|
10
|
-
const Db = _require('better-sqlite3');
|
|
11
|
-
new Db(':memory:').close();
|
|
12
|
-
return true;
|
|
13
|
-
}
|
|
14
|
-
catch {
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
if (!hasBinary() && !process.env.MEMESH_REBUILD_ATTEMPTED) {
|
|
19
|
-
const cwd = join(_dir, '../..');
|
|
20
|
-
const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
21
|
-
try {
|
|
22
|
-
process.stderr.write('[memesh-mcp] better-sqlite3 binding missing — rebuilding native addon...\n');
|
|
23
|
-
execFileSync(npm, ['rebuild', 'better-sqlite3'], { cwd, stdio: 'pipe' });
|
|
24
|
-
process.stderr.write('[memesh-mcp] Rebuild complete — restarting server.\n');
|
|
25
|
-
}
|
|
26
|
-
catch (err) {
|
|
27
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
28
|
-
process.stderr.write(`[memesh-mcp] Rebuild failed (${msg}). Server will likely fail to start.\n`);
|
|
29
|
-
}
|
|
30
|
-
const result = spawnSync(process.execPath, [fileURLToPath(import.meta.url)], {
|
|
31
|
-
stdio: 'inherit',
|
|
32
|
-
env: { ...process.env, MEMESH_REBUILD_ATTEMPTED: '1' },
|
|
33
|
-
});
|
|
34
|
-
process.exit(result.status ?? 1);
|
|
35
|
-
}
|
|
36
|
-
await import('./server.js');
|
|
37
|
-
//# sourceMappingURL=launcher.js.map
|
package/dist/mcp/launcher.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/mcp/launcher.ts"],"names":[],"mappings":";AAiBA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAErD,SAAS,SAAS;IAKhB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC;IAE1D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QACnG,YAAY,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,wCAAwC,CAAC,CAAC;IACpG,CAAC;IAID,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;QAC3E,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,wBAAwB,EAAE,GAAG,EAAE;KACvD,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC"}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// Orchestration Nudge — PreToolUse hook for Bash
|
|
4
|
-
// When Claude is about to run a high-verifiability command (tests, builds, lint,
|
|
5
|
-
// deploys, etc.), injects a one-time-per-category advisory hint to consider
|
|
6
|
-
// dispatching it as a background agent instead of blocking the conversation.
|
|
7
|
-
//
|
|
8
|
-
// Throttle: one nudge per category per session. State is one marker file per
|
|
9
|
-
// category in ${memeshDir}/agent-nudge-flags/${category}.flag. The flag IS
|
|
10
|
-
// the lock — created with O_EXCL so concurrent hooks racing on the same
|
|
11
|
-
// category resolve atomically (winner emits the nudge, loser silently passes).
|
|
12
|
-
// session-start.js clears the directory at the start of each session.
|
|
13
|
-
|
|
14
|
-
import { join } from 'path';
|
|
15
|
-
import { openSync, closeSync } from 'fs';
|
|
16
|
-
import { ensurePrivateDir, getMemeshDirFromDbPath, isAgenticOrchestrationEnabled } from './_shared.js';
|
|
17
|
-
|
|
18
|
-
const memeshDir = getMemeshDirFromDbPath();
|
|
19
|
-
const FLAGS_DIR = join(memeshDir, 'agent-nudge-flags');
|
|
20
|
-
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
// Pattern definitions
|
|
23
|
-
// Each entry has:
|
|
24
|
-
// category: string key used for per-session throttle dedup
|
|
25
|
-
// test: RegExp that must match somewhere in the command (case-insensitive)
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
const PATTERNS = [
|
|
28
|
-
{
|
|
29
|
-
category: 'test',
|
|
30
|
-
test: /\bnpm\s+(?:run\s+)?test\b|\bvitest\b|\bjest\b|\bpytest\b|\bgo\s+test\b|\bcargo\s+test\b|\bmocha\b|\bava\b/i,
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
category: 'build',
|
|
34
|
-
test: /\bnpm\s+run\s+build\b|\btsc\b|\bnext\s+build\b|\bnest\s+build\b|\bcargo\s+build\b|\bvite\s+build\b|\bwebpack\b/i,
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
category: 'lint',
|
|
38
|
-
test: /\bnpm\s+run\s+lint\b|\beslint\b|\bprettier\b(?!\s+--version|\s+-v)|\btsc\s+--noEmit\b|\bbiome\b/i,
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
category: 'migrate',
|
|
42
|
-
test: /\bprisma\s+(?:migrate|db\s+push)\b|\bknex\s+migrate\b|\bsequelize\s+db:migrate\b/i,
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
category: 'benchmark',
|
|
46
|
-
test: /\bnpm\s+run\s+bench\b|\bbenchmark\b/i,
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
category: 'deploy',
|
|
50
|
-
test: /\bvercel\s+(?:deploy|--prod)\b|\bgh\s+(?:workflow\s+run|run)\b|\bwrangler\s+deploy\b|\bfly\s+deploy\b/i,
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
category: 'npm-run-check',
|
|
54
|
-
// Generic: `npm run <script>` where the script name suggests slow CI-like work
|
|
55
|
-
test: /\bnpm\s+run\s+(?:check|typecheck|type-check|ci|e2e|integration|coverage|storybook|compile)\b/i,
|
|
56
|
-
},
|
|
57
|
-
];
|
|
58
|
-
|
|
59
|
-
// Commands that are definitely NOT long-running, even if they somehow matched
|
|
60
|
-
// a pattern above. Short-circuit exclusions — if the command matches any of
|
|
61
|
-
// these, skip the nudge.
|
|
62
|
-
//
|
|
63
|
-
// Note: short-form `-v` was intentionally removed. In test runners (pytest,
|
|
64
|
-
// go test, cargo test, bun test) `-v` is the *verbose* flag, and those
|
|
65
|
-
// invocations are genuinely long-running. `node -v` / `npm -v` style
|
|
66
|
-
// version checks don't reach this exclusion list anyway because they
|
|
67
|
-
// never match any PATTERN entry above.
|
|
68
|
-
const NOISE_EXCLUSIONS = /--version\b|--help\b|\b-h\b|\bls\b|\bcat\b|\becho\b|\bpwd\b|\bwhich\b|\bwhere\b/i;
|
|
69
|
-
|
|
70
|
-
// ---------------------------------------------------------------------------
|
|
71
|
-
// Main
|
|
72
|
-
// ---------------------------------------------------------------------------
|
|
73
|
-
let input = '';
|
|
74
|
-
process.stdin.setEncoding('utf8');
|
|
75
|
-
process.stdin.on('data', (chunk) => { input += chunk; });
|
|
76
|
-
process.stdin.on('end', () => {
|
|
77
|
-
try {
|
|
78
|
-
// Opt-in gate: the agentic-orchestration protocol is a separable
|
|
79
|
-
// experiment from memesh's core memory features. Enable with
|
|
80
|
-
// MEMESH_ENABLE_AGENTIC_ORCHESTRATION=1. The default is OFF so users
|
|
81
|
-
// who installed memesh purely for memory don't see protocol nudges
|
|
82
|
-
// they never asked for.
|
|
83
|
-
if (!isAgenticOrchestrationEnabled(process.env)) return pass();
|
|
84
|
-
|
|
85
|
-
const data = JSON.parse(input);
|
|
86
|
-
if (!data.tool_input) {
|
|
87
|
-
// Schema-flip signal: trace so a rename surfaces day-1.
|
|
88
|
-
try { process.stderr.write(`[memesh pre-bash-nudge] tool_input absent (keys: ${Object.keys(data).join(',')}); skipping\n`); } catch {}
|
|
89
|
-
return pass();
|
|
90
|
-
}
|
|
91
|
-
const command = (data.tool_input.command ?? '').trim();
|
|
92
|
-
|
|
93
|
-
if (!command) return pass();
|
|
94
|
-
|
|
95
|
-
// Short-circuit: known noise commands never warrant a nudge
|
|
96
|
-
if (NOISE_EXCLUSIONS.test(command)) return pass();
|
|
97
|
-
|
|
98
|
-
// Find the first matching category
|
|
99
|
-
const match = PATTERNS.find((p) => p.test.test(command));
|
|
100
|
-
if (!match) return pass();
|
|
101
|
-
|
|
102
|
-
// Throttle: only nudge once per category per session.
|
|
103
|
-
//
|
|
104
|
-
// Per-category marker file with O_EXCL atomic create. The flag IS the
|
|
105
|
-
// lock — there is no shared state to read-modify-write, so concurrent
|
|
106
|
-
// hooks for *different* categories cannot clobber each other's marker
|
|
107
|
-
// (the previous shared-JSON design lost one of two parallel writes).
|
|
108
|
-
// session-start.js wipes ${FLAGS_DIR} at the top of each new session.
|
|
109
|
-
//
|
|
110
|
-
// No pre-check (existsSync) before the open — that would be a TOCTOU
|
|
111
|
-
// window. The openSync('wx') is itself the atomic check-and-create:
|
|
112
|
-
// EEXIST means already-throttled, success means we won the race.
|
|
113
|
-
const flagPath = join(FLAGS_DIR, `${match.category}.flag`);
|
|
114
|
-
|
|
115
|
-
try {
|
|
116
|
-
ensurePrivateDir(FLAGS_DIR);
|
|
117
|
-
const fd = openSync(flagPath, 'wx', 0o600);
|
|
118
|
-
closeSync(fd);
|
|
119
|
-
} catch (err) {
|
|
120
|
-
if (err && err.code === 'EEXIST') {
|
|
121
|
-
// Marker already exists — this category was already nudged in this
|
|
122
|
-
// session (either by an earlier hook invocation or a parallel one).
|
|
123
|
-
return pass();
|
|
124
|
-
}
|
|
125
|
-
// Other errors (permission, FS full, EROFS): silent degrade — without
|
|
126
|
-
// a marker we cannot honor the once-per-session contract, so emitting
|
|
127
|
-
// the nudge would spam every matching command. Better to skip the
|
|
128
|
-
// nudge entirely and let the user notice the FS issue via
|
|
129
|
-
// `memesh doctor` if they care.
|
|
130
|
-
return pass();
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Emit the advisory nudge
|
|
134
|
-
const nudge = [
|
|
135
|
-
'Orchestration hint: this looks like high-verifiability work.',
|
|
136
|
-
'If it will take >10s, consider dispatching it as a background agent',
|
|
137
|
-
'(Task tool with run_in_background:true) instead of blocking the conversation.',
|
|
138
|
-
'See the agentic-orchestration skill for the dispatch pattern.',
|
|
139
|
-
].join('\n');
|
|
140
|
-
|
|
141
|
-
console.log(JSON.stringify({
|
|
142
|
-
hookSpecificOutput: {
|
|
143
|
-
hookEventName: 'PreToolUse',
|
|
144
|
-
additionalContext: nudge,
|
|
145
|
-
},
|
|
146
|
-
}));
|
|
147
|
-
} catch {
|
|
148
|
-
// Never crash Claude Code — always exit cleanly
|
|
149
|
-
pass();
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
function pass() {
|
|
154
|
-
process.exit(0);
|
|
155
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Runs after `npm install` to ensure better-sqlite3's native binding is compiled.
|
|
3
|
-
// The plugin marketplace sometimes runs `npm install --ignore-scripts`, which
|
|
4
|
-
// skips better-sqlite3's own build step. This script is a safety net that
|
|
5
|
-
// detects a missing binary and attempts a rebuild. Errors are non-fatal —
|
|
6
|
-
// the hook and MCP server will report the missing binding at runtime.
|
|
7
|
-
import { execFileSync } from 'child_process';
|
|
8
|
-
import { createRequire } from 'module';
|
|
9
|
-
import { fileURLToPath } from 'url';
|
|
10
|
-
import { dirname } from 'path';
|
|
11
|
-
|
|
12
|
-
const require = createRequire(import.meta.url);
|
|
13
|
-
|
|
14
|
-
function isBinaryPresent() {
|
|
15
|
-
// better-sqlite3 loads its native binding lazily inside Database() —
|
|
16
|
-
// a plain require() always succeeds. Must instantiate to trigger the probe.
|
|
17
|
-
try {
|
|
18
|
-
const Db = require('better-sqlite3');
|
|
19
|
-
new Db(':memory:').close();
|
|
20
|
-
return true;
|
|
21
|
-
} catch {
|
|
22
|
-
return false;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
if (isBinaryPresent()) {
|
|
27
|
-
process.exit(0);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// dirname(fileURLToPath(...)) → scripts/ ; one more dirname → package root
|
|
31
|
-
const cwd = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
32
|
-
const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
process.stdout.write('[memesh] Compiling better-sqlite3 native addon...\n');
|
|
36
|
-
execFileSync(npm, ['rebuild', 'better-sqlite3'], { cwd, stdio: 'inherit' });
|
|
37
|
-
process.stdout.write('[memesh] better-sqlite3 compiled successfully.\n');
|
|
38
|
-
} catch (err) {
|
|
39
|
-
// Non-fatal: user can still use the CLI without the native module if no DB ops.
|
|
40
|
-
process.stderr.write(`[memesh] Warning: Could not compile better-sqlite3 (${err?.message}). Run "npm rebuild better-sqlite3" manually inside the install directory.\n`);
|
|
41
|
-
}
|