@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.
Files changed (176) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.mcp.json +1 -1
  4. package/README.de.md +2 -5
  5. package/README.es.md +5 -8
  6. package/README.fr.md +3 -6
  7. package/README.ja.md +5 -8
  8. package/README.ko.md +5 -8
  9. package/README.md +28 -10
  10. package/README.pt.md +3 -6
  11. package/README.th.md +3 -6
  12. package/README.vi.md +3 -6
  13. package/README.zh-CN.md +5 -8
  14. package/README.zh-TW.md +5 -8
  15. package/dashboard/dist/index.html +9 -9
  16. package/dist/cli/view.d.ts.map +1 -1
  17. package/dist/cli/view.js +2 -2
  18. package/dist/cli/view.js.map +1 -1
  19. package/dist/core/analytics.d.ts +3 -3
  20. package/dist/core/analytics.d.ts.map +1 -1
  21. package/dist/core/analytics.js.map +1 -1
  22. package/dist/core/config.d.ts +0 -1
  23. package/dist/core/config.d.ts.map +1 -1
  24. package/dist/core/config.js +2 -1
  25. package/dist/core/config.js.map +1 -1
  26. package/dist/core/demo.d.ts +2 -2
  27. package/dist/core/demo.d.ts.map +1 -1
  28. package/dist/core/demo.js.map +1 -1
  29. package/dist/core/doctor.d.ts +1 -0
  30. package/dist/core/doctor.d.ts.map +1 -1
  31. package/dist/core/doctor.js +191 -47
  32. package/dist/core/doctor.js.map +1 -1
  33. package/dist/core/dreamer.d.ts +15 -7
  34. package/dist/core/dreamer.d.ts.map +1 -1
  35. package/dist/core/dreamer.js +310 -35
  36. package/dist/core/dreamer.js.map +1 -1
  37. package/dist/core/embedder.d.ts +2 -1
  38. package/dist/core/embedder.d.ts.map +1 -1
  39. package/dist/core/embedder.js +22 -1
  40. package/dist/core/embedder.js.map +1 -1
  41. package/dist/core/extractor.d.ts.map +1 -1
  42. package/dist/core/extractor.js +2 -1
  43. package/dist/core/extractor.js.map +1 -1
  44. package/dist/core/graph.d.ts +4 -4
  45. package/dist/core/graph.d.ts.map +1 -1
  46. package/dist/core/graph.js.map +1 -1
  47. package/dist/core/install-hooks.d.ts +1 -0
  48. package/dist/core/install-hooks.d.ts.map +1 -1
  49. package/dist/core/install-hooks.js +0 -0
  50. package/dist/core/install-hooks.js.map +1 -1
  51. package/dist/core/kg-backfill.d.ts +4 -4
  52. package/dist/core/kg-backfill.d.ts.map +1 -1
  53. package/dist/core/kg-backfill.js +1 -1
  54. package/dist/core/kg-backfill.js.map +1 -1
  55. package/dist/core/lesson-engine.d.ts +1 -0
  56. package/dist/core/lesson-engine.d.ts.map +1 -1
  57. package/dist/core/lesson-engine.js +1 -0
  58. package/dist/core/lesson-engine.js.map +1 -1
  59. package/dist/core/lifecycle.d.ts +4 -4
  60. package/dist/core/lifecycle.d.ts.map +1 -1
  61. package/dist/core/lifecycle.js +1 -1
  62. package/dist/core/lifecycle.js.map +1 -1
  63. package/dist/core/llm-client.d.ts.map +1 -1
  64. package/dist/core/llm-client.js +3 -6
  65. package/dist/core/llm-client.js.map +1 -1
  66. package/dist/core/llm-telemetry.d.ts +4 -4
  67. package/dist/core/llm-telemetry.d.ts.map +1 -1
  68. package/dist/core/llm-telemetry.js +1 -1
  69. package/dist/core/llm-telemetry.js.map +1 -1
  70. package/dist/core/memory-tool.d.ts.map +1 -1
  71. package/dist/core/memory-tool.js +4 -0
  72. package/dist/core/memory-tool.js.map +1 -1
  73. package/dist/core/operations.d.ts.map +1 -1
  74. package/dist/core/operations.js +22 -7
  75. package/dist/core/operations.js.map +1 -1
  76. package/dist/core/paths.d.ts +3 -0
  77. package/dist/core/paths.d.ts.map +1 -1
  78. package/dist/core/paths.js +67 -1
  79. package/dist/core/paths.js.map +1 -1
  80. package/dist/core/patterns.d.ts +2 -2
  81. package/dist/core/patterns.d.ts.map +1 -1
  82. package/dist/core/patterns.js.map +1 -1
  83. package/dist/core/project-tags.d.ts +3 -3
  84. package/dist/core/project-tags.d.ts.map +1 -1
  85. package/dist/core/project-tags.js.map +1 -1
  86. package/dist/core/projects.d.ts +2 -2
  87. package/dist/core/projects.d.ts.map +1 -1
  88. package/dist/core/projects.js.map +1 -1
  89. package/dist/core/schema-export.d.ts.map +1 -1
  90. package/dist/core/schema-export.js +0 -34
  91. package/dist/core/schema-export.js.map +1 -1
  92. package/dist/core/serializer.d.ts.map +1 -1
  93. package/dist/core/serializer.js +45 -4
  94. package/dist/core/serializer.js.map +1 -1
  95. package/dist/core/stats.d.ts +2 -2
  96. package/dist/core/stats.d.ts.map +1 -1
  97. package/dist/core/stats.js.map +1 -1
  98. package/dist/core/transcript-extractor.d.ts +5 -6
  99. package/dist/core/transcript-extractor.d.ts.map +1 -1
  100. package/dist/core/transcript-extractor.js +4 -24
  101. package/dist/core/transcript-extractor.js.map +1 -1
  102. package/dist/core/transcript-source.d.ts.map +1 -1
  103. package/dist/core/transcript-source.js.map +1 -1
  104. package/dist/core/types.d.ts +17 -7
  105. package/dist/core/types.d.ts.map +1 -1
  106. package/dist/core/types.js +2 -0
  107. package/dist/core/types.js.map +1 -1
  108. package/dist/db.d.ts +5 -5
  109. package/dist/db.d.ts.map +1 -1
  110. package/dist/db.js +155 -17
  111. package/dist/db.js.map +1 -1
  112. package/dist/knowledge-graph.d.ts +3 -2
  113. package/dist/knowledge-graph.d.ts.map +1 -1
  114. package/dist/knowledge-graph.js +19 -10
  115. package/dist/knowledge-graph.js.map +1 -1
  116. package/dist/mcp/server.js +2 -1
  117. package/dist/mcp/server.js.map +1 -1
  118. package/dist/skills-manifest.json +28 -33
  119. package/dist/storage/conflicts.d.ts +3 -3
  120. package/dist/storage/conflicts.d.ts.map +1 -1
  121. package/dist/storage/conflicts.js.map +1 -1
  122. package/dist/storage/fts-index.d.ts +4 -4
  123. package/dist/storage/fts-index.d.ts.map +1 -1
  124. package/dist/storage/fts-index.js.map +1 -1
  125. package/dist/storage/sqlite.d.ts +20 -0
  126. package/dist/storage/sqlite.d.ts.map +1 -0
  127. package/dist/storage/sqlite.js +64 -0
  128. package/dist/storage/sqlite.js.map +1 -0
  129. package/dist/storage/vector-index.d.ts +3 -0
  130. package/dist/storage/vector-index.d.ts.map +1 -0
  131. package/dist/storage/vector-index.js +7 -0
  132. package/dist/storage/vector-index.js.map +1 -0
  133. package/dist/transports/cli/cli.d.ts.map +1 -1
  134. package/dist/transports/cli/cli.js +126 -84
  135. package/dist/transports/cli/cli.js.map +1 -1
  136. package/dist/transports/http/retired-routes.d.ts.map +1 -1
  137. package/dist/transports/http/retired-routes.js +1 -0
  138. package/dist/transports/http/retired-routes.js.map +1 -1
  139. package/dist/transports/http/server.d.ts.map +1 -1
  140. package/dist/transports/http/server.js +48 -29
  141. package/dist/transports/http/server.js.map +1 -1
  142. package/dist/transports/mcp/handlers.d.ts +4 -96
  143. package/dist/transports/mcp/handlers.d.ts.map +1 -1
  144. package/dist/transports/mcp/handlers.js +24 -58
  145. package/dist/transports/mcp/handlers.js.map +1 -1
  146. package/dist/transports/schemas.d.ts +10 -30
  147. package/dist/transports/schemas.d.ts.map +1 -1
  148. package/dist/transports/schemas.js +5 -29
  149. package/dist/transports/schemas.js.map +1 -1
  150. package/hooks/hooks.json +0 -10
  151. package/package.json +6 -10
  152. package/scripts/hooks/_generated/core-paths.js +67 -1
  153. package/scripts/hooks/_generated/sqlite.js +71 -0
  154. package/scripts/hooks/_shared.js +286 -195
  155. package/scripts/hooks/post-commit.js +52 -10
  156. package/scripts/hooks/pre-compact.js +10 -7
  157. package/scripts/hooks/pre-edit-recall.js +4 -8
  158. package/scripts/hooks/session-start.js +95 -47
  159. package/scripts/hooks/session-summary.js +120 -52
  160. package/scripts/hooks/user-prompt-intent.js +3 -2
  161. package/skills/memesh/SKILL.md +1 -2
  162. package/dist/core/skill-usage-log.d.ts +0 -11
  163. package/dist/core/skill-usage-log.d.ts.map +0 -1
  164. package/dist/core/skill-usage-log.js +0 -125
  165. package/dist/core/skill-usage-log.js.map +0 -1
  166. package/dist/core/verifier.d.ts +0 -40
  167. package/dist/core/verifier.d.ts.map +0 -1
  168. package/dist/core/verifier.js +0 -206
  169. package/dist/core/verifier.js.map +0 -1
  170. package/dist/mcp/launcher.d.ts +0 -3
  171. package/dist/mcp/launcher.d.ts.map +0 -1
  172. package/dist/mcp/launcher.js +0 -37
  173. package/dist/mcp/launcher.js.map +0 -1
  174. package/scripts/hooks/pre-bash-orchestration-nudge.js +0 -155
  175. package/scripts/postinstall-rebuild.mjs +0 -41
  176. package/skills/agentic-orchestration/SKILL.md +0 -399
@@ -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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"}
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=launcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/mcp/launcher.ts"],"names":[],"mappings":""}
@@ -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
@@ -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
- }