@pcircle/memesh 4.0.2 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.de.md +115 -86
  2. package/README.es.md +107 -78
  3. package/README.fr.md +111 -82
  4. package/README.ja.md +117 -88
  5. package/README.ko.md +111 -82
  6. package/README.md +54 -3
  7. package/README.pt.md +103 -74
  8. package/README.th.md +117 -88
  9. package/README.vi.md +113 -84
  10. package/README.zh-CN.md +114 -85
  11. package/README.zh-TW.md +115 -86
  12. package/dashboard/dist/index.html +4 -4
  13. package/dist/core/config.d.ts.map +1 -1
  14. package/dist/core/config.js +6 -10
  15. package/dist/core/config.js.map +1 -1
  16. package/dist/core/doctor.d.ts +40 -0
  17. package/dist/core/doctor.d.ts.map +1 -0
  18. package/dist/core/doctor.js +217 -0
  19. package/dist/core/doctor.js.map +1 -0
  20. package/dist/core/embedder.js.map +1 -1
  21. package/dist/core/install-channel.d.ts +30 -0
  22. package/dist/core/install-channel.d.ts.map +1 -0
  23. package/dist/core/install-channel.js +83 -0
  24. package/dist/core/install-channel.js.map +1 -0
  25. package/dist/core/schema-export.d.ts.map +1 -1
  26. package/dist/core/schema-export.js +34 -0
  27. package/dist/core/schema-export.js.map +1 -1
  28. package/dist/core/skill-usage-log.d.ts +11 -0
  29. package/dist/core/skill-usage-log.d.ts.map +1 -0
  30. package/dist/core/skill-usage-log.js +121 -0
  31. package/dist/core/skill-usage-log.js.map +1 -0
  32. package/dist/core/updater.d.ts +11 -0
  33. package/dist/core/updater.d.ts.map +1 -0
  34. package/dist/core/updater.js +28 -0
  35. package/dist/core/updater.js.map +1 -0
  36. package/dist/core/verifier.d.ts +37 -0
  37. package/dist/core/verifier.d.ts.map +1 -0
  38. package/dist/core/verifier.js +142 -0
  39. package/dist/core/verifier.js.map +1 -0
  40. package/dist/core/version-check.d.ts +28 -4
  41. package/dist/core/version-check.d.ts.map +1 -1
  42. package/dist/core/version-check.js +167 -21
  43. package/dist/core/version-check.js.map +1 -1
  44. package/dist/transports/cli/cli.js +154 -16
  45. package/dist/transports/cli/cli.js.map +1 -1
  46. package/dist/transports/http/server.d.ts.map +1 -1
  47. package/dist/transports/http/server.js +48 -1
  48. package/dist/transports/http/server.js.map +1 -1
  49. package/dist/transports/mcp/handlers.d.ts +93 -0
  50. package/dist/transports/mcp/handlers.d.ts.map +1 -1
  51. package/dist/transports/mcp/handlers.js +51 -1
  52. package/dist/transports/mcp/handlers.js.map +1 -1
  53. package/dist/transports/schemas.d.ts +28 -0
  54. package/dist/transports/schemas.d.ts.map +1 -1
  55. package/dist/transports/schemas.js +25 -0
  56. package/dist/transports/schemas.js.map +1 -1
  57. package/hooks/hooks.json +10 -0
  58. package/package.json +5 -3
  59. package/plugin.json +2 -2
  60. package/scripts/hooks/pre-bash-orchestration-nudge.js +150 -0
  61. package/scripts/hooks/pre-edit-recall.js +0 -0
  62. package/scripts/hooks/session-start.js +55 -2
  63. package/skills/agentic-orchestration/SKILL.md +399 -0
@@ -0,0 +1,121 @@
1
+ import { appendFileSync, closeSync, existsSync, fstatSync, mkdirSync, openSync, readFileSync, readSync, renameSync, unlinkSync, writeFileSync, } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { dirname, join } from 'path';
4
+ const MAX_BYTES = 10 * 1024 * 1024;
5
+ const TRUNCATE_KEEP = 6 * 1024 * 1024;
6
+ function defaultLogPath() {
7
+ return join(homedir(), '.memesh', 'skill-usage.jsonl');
8
+ }
9
+ function ensureParent(path) {
10
+ try {
11
+ const dir = dirname(path);
12
+ if (!existsSync(dir))
13
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
14
+ }
15
+ catch {
16
+ }
17
+ }
18
+ function rotateIfNeeded(path) {
19
+ let fd = null;
20
+ let tmpPath = null;
21
+ try {
22
+ try {
23
+ fd = openSync(path, 'r');
24
+ }
25
+ catch {
26
+ return;
27
+ }
28
+ const { size } = fstatSync(fd);
29
+ if (size < MAX_BYTES * 1.2)
30
+ return;
31
+ const readLen = Math.min(TRUNCATE_KEEP, size);
32
+ const offset = size - readLen;
33
+ const buf = Buffer.alloc(readLen);
34
+ let totalRead = 0;
35
+ while (totalRead < readLen) {
36
+ const n = readSync(fd, buf, totalRead, readLen - totalRead, offset + totalRead);
37
+ if (n === 0)
38
+ break;
39
+ totalRead += n;
40
+ }
41
+ closeSync(fd);
42
+ fd = null;
43
+ const tail = buf.subarray(0, totalRead);
44
+ const firstNl = tail.indexOf(0x0a);
45
+ const aligned = firstNl >= 0 ? tail.subarray(firstNl + 1) : tail;
46
+ tmpPath = `${path}.rot.${process.pid}.${Date.now()}`;
47
+ writeFileSync(tmpPath, aligned, { mode: 0o600 });
48
+ renameSync(tmpPath, path);
49
+ tmpPath = null;
50
+ }
51
+ catch {
52
+ }
53
+ finally {
54
+ if (fd !== null) {
55
+ try {
56
+ closeSync(fd);
57
+ }
58
+ catch { }
59
+ }
60
+ if (tmpPath !== null) {
61
+ try {
62
+ unlinkSync(tmpPath);
63
+ }
64
+ catch { }
65
+ }
66
+ }
67
+ }
68
+ export function logSkillEvent(event, payload, path) {
69
+ const target = path ?? defaultLogPath();
70
+ try {
71
+ ensureParent(target);
72
+ rotateIfNeeded(target);
73
+ const line = JSON.stringify({ ts: new Date().toISOString(), event, payload }) + '\n';
74
+ appendFileSync(target, line);
75
+ }
76
+ catch {
77
+ }
78
+ }
79
+ export function summariseSkillUsage(path) {
80
+ const target = path ?? defaultLogPath();
81
+ const out = {
82
+ total_events: 0,
83
+ events_by_name: {},
84
+ log_path: target,
85
+ log_bytes: 0,
86
+ };
87
+ if (!existsSync(target))
88
+ return out;
89
+ let raw;
90
+ try {
91
+ const buf = readFileSync(target);
92
+ out.log_bytes = buf.length;
93
+ raw = buf.toString('utf8');
94
+ }
95
+ catch {
96
+ return out;
97
+ }
98
+ for (const line of raw.split('\n')) {
99
+ if (!line.trim())
100
+ continue;
101
+ let parsed;
102
+ try {
103
+ parsed = JSON.parse(line);
104
+ }
105
+ catch {
106
+ continue;
107
+ }
108
+ if (!parsed.event || typeof parsed.event !== 'string')
109
+ continue;
110
+ out.total_events += 1;
111
+ out.events_by_name[parsed.event] = (out.events_by_name[parsed.event] ?? 0) + 1;
112
+ if (parsed.ts) {
113
+ if (!out.first_event || parsed.ts < out.first_event)
114
+ out.first_event = parsed.ts;
115
+ if (!out.last_event || parsed.ts > out.last_event)
116
+ out.last_event = parsed.ts;
117
+ }
118
+ }
119
+ return out;
120
+ }
121
+ //# sourceMappingURL=skill-usage-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-usage-log.js","sourceRoot":"","sources":["../../src/core/skill-usage-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { execFileSync } from 'child_process';
2
+ type ExecFileSyncLike = typeof execFileSync;
3
+ interface RunGlobalUpdateOptions {
4
+ execFileSyncImpl?: ExecFileSyncLike;
5
+ }
6
+ export declare function getInstalledGlobalVersion(options?: RunGlobalUpdateOptions): string | null;
7
+ export declare function runGlobalUpdate(latestVersion: string, options?: RunGlobalUpdateOptions): {
8
+ installedVersion: string;
9
+ };
10
+ export {};
11
+ //# sourceMappingURL=updater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../../src/core/updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,KAAK,gBAAgB,GAAG,OAAO,YAAY,CAAC;AAE5C,UAAU,sBAAsB;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAWD,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,sBAA2B,GACnC,MAAM,GAAG,IAAI,CAaf;AAED,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,sBAA2B,GACnC;IAAE,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAkB9B"}
@@ -0,0 +1,28 @@
1
+ import { execFileSync } from 'child_process';
2
+ function parseInstalledGlobalVersion(raw) {
3
+ const parsed = JSON.parse(raw);
4
+ return parsed.dependencies?.['@pcircle/memesh']?.version ?? null;
5
+ }
6
+ export function getInstalledGlobalVersion(options = {}) {
7
+ const { execFileSyncImpl = execFileSync } = options;
8
+ try {
9
+ const raw = execFileSyncImpl('npm', ['ls', '-g', '@pcircle/memesh', '--json', '--depth=0'], { encoding: 'utf8' });
10
+ return parseInstalledGlobalVersion(raw);
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ }
16
+ export function runGlobalUpdate(latestVersion, options = {}) {
17
+ const { execFileSyncImpl = execFileSync } = options;
18
+ execFileSyncImpl('npm', ['install', '-g', `@pcircle/memesh@${latestVersion}`], { stdio: 'inherit' });
19
+ const installedVersion = getInstalledGlobalVersion({ execFileSyncImpl });
20
+ if (installedVersion !== latestVersion) {
21
+ if (installedVersion) {
22
+ throw new Error(`expected ${latestVersion}, but npm reports ${installedVersion} is installed`);
23
+ }
24
+ throw new Error('npm did not report a global @pcircle/memesh installation after update');
25
+ }
26
+ return { installedVersion };
27
+ }
28
+ //# sourceMappingURL=updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/core/updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAY7C,SAAS,2BAA2B,CAAC,GAAW;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;IACvD,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,UAAkC,EAAE;IAEpC,MAAM,EAAE,gBAAgB,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,CAC1B,KAAK,EACL,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,CAAC,EACtD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB,CAAC;QACF,OAAO,2BAA2B,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,aAAqB,EACrB,UAAkC,EAAE;IAEpC,MAAM,EAAE,gBAAgB,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAEpD,gBAAgB,CACd,KAAK,EACL,CAAC,SAAS,EAAE,IAAI,EAAE,mBAAmB,aAAa,EAAE,CAAC,EACrD,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;IAEF,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzE,IAAI,gBAAgB,KAAK,aAAa,EAAE,CAAC;QACvC,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,YAAY,aAAa,qBAAqB,gBAAgB,eAAe,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,37 @@
1
+ export interface ExternalCheck {
2
+ pass: boolean;
3
+ summary?: string;
4
+ }
5
+ export interface VerifyAgentWorkInput {
6
+ agent_id: string;
7
+ workdir: string;
8
+ base?: string;
9
+ claim?: {
10
+ expected_files?: number;
11
+ };
12
+ report?: {
13
+ pass: boolean;
14
+ typecheck?: ExternalCheck;
15
+ tests?: ExternalCheck;
16
+ lint?: ExternalCheck;
17
+ build?: ExternalCheck;
18
+ summary?: string;
19
+ };
20
+ }
21
+ export interface RealityCheckResult {
22
+ files_changed: number;
23
+ expected_files: number | null;
24
+ match: boolean | null;
25
+ base: string | null;
26
+ pass: boolean;
27
+ summary: string;
28
+ }
29
+ export interface VerifyAgentWorkResult {
30
+ entity_name: string;
31
+ pass: boolean;
32
+ reality_check: RealityCheckResult;
33
+ external_report: VerifyAgentWorkInput['report'] | null;
34
+ timestamp: string;
35
+ }
36
+ export declare function verifyAgentWork(input: VerifyAgentWorkInput): VerifyAgentWorkResult;
37
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/core/verifier.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QACN,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,OAAO,CAAC;QACd,SAAS,CAAC,EAAE,aAAa,CAAC;QAC1B,KAAK,CAAC,EAAE,aAAa,CAAC;QACtB,IAAI,CAAC,EAAE,aAAa,CAAC;QACrB,KAAK,CAAC,EAAE,aAAa,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,kBAAkB,CAAC;IAClC,eAAe,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;CACnB;AAoGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAoDlF"}
@@ -0,0 +1,142 @@
1
+ import { execFileSync } from 'child_process';
2
+ import { randomBytes } from 'crypto';
3
+ import { remember } from './operations.js';
4
+ import { logSkillEvent } from './skill-usage-log.js';
5
+ function resolveBase(workdir, explicit) {
6
+ if (explicit)
7
+ return explicit;
8
+ const candidates = ['origin/main', 'main', 'origin/develop', 'develop'];
9
+ for (const ref of candidates) {
10
+ try {
11
+ const sha = execFileSync('git', ['-C', workdir, 'merge-base', 'HEAD', ref], {
12
+ encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'],
13
+ }).trim();
14
+ if (sha)
15
+ return sha;
16
+ }
17
+ catch { }
18
+ }
19
+ try {
20
+ return execFileSync('git', ['-C', workdir, 'rev-parse', 'HEAD~1'], {
21
+ encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'],
22
+ }).trim();
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ function realityCheck(workdir, base, expectedFiles) {
29
+ if (!base) {
30
+ return {
31
+ files_changed: 0,
32
+ expected_files: expectedFiles ?? null,
33
+ match: null,
34
+ base: null,
35
+ pass: false,
36
+ summary: 'no git base discoverable; cannot reality-check',
37
+ };
38
+ }
39
+ let stat = '';
40
+ try {
41
+ stat = execFileSync('git', ['-C', workdir, 'diff', '--stat', `${base}..HEAD`], {
42
+ encoding: 'utf8', timeout: 5000, stdio: ['ignore', 'pipe', 'pipe'],
43
+ });
44
+ }
45
+ catch (err) {
46
+ return {
47
+ files_changed: 0,
48
+ expected_files: expectedFiles ?? null,
49
+ match: null,
50
+ base,
51
+ pass: false,
52
+ summary: `git diff failed: ${err?.message ?? 'unknown'}`,
53
+ };
54
+ }
55
+ const fileLines = stat
56
+ .split('\n')
57
+ .filter((l) => l.includes('|') && !l.includes('files changed'));
58
+ const filesChanged = fileLines.length;
59
+ if (expectedFiles == null) {
60
+ return {
61
+ files_changed: filesChanged,
62
+ expected_files: null,
63
+ match: null,
64
+ base,
65
+ pass: true,
66
+ summary: `${filesChanged} files changed (no claim to check against)`,
67
+ };
68
+ }
69
+ const match = filesChanged === expectedFiles;
70
+ return {
71
+ files_changed: filesChanged,
72
+ expected_files: expectedFiles,
73
+ match,
74
+ base,
75
+ pass: match,
76
+ summary: match
77
+ ? `reality OK: ${filesChanged}/${expectedFiles} files`
78
+ : `reality MISMATCH: agent claimed ${expectedFiles}, actual ${filesChanged}`,
79
+ };
80
+ }
81
+ function buildObservations(input, rc, pass) {
82
+ const obs = [];
83
+ obs.push(`Agent ${input.agent_id} verification: ${pass ? 'PASS' : 'FAIL'}`);
84
+ obs.push(`Workdir: ${input.workdir}`);
85
+ if (rc.base)
86
+ obs.push(`Base: ${rc.base}`);
87
+ obs.push(`Reality check: ${rc.summary}`);
88
+ const r = input.report;
89
+ if (r) {
90
+ if (r.typecheck)
91
+ obs.push(`Typecheck: ${r.typecheck.pass ? 'PASS' : 'FAIL'}${r.typecheck.summary ? ' — ' + r.typecheck.summary : ''}`);
92
+ if (r.tests)
93
+ obs.push(`Tests: ${r.tests.pass ? 'PASS' : 'FAIL'}${r.tests.summary ? ' — ' + r.tests.summary : ''}`);
94
+ if (r.lint)
95
+ obs.push(`Lint: ${r.lint.pass ? 'PASS' : 'FAIL'}${r.lint.summary ? ' — ' + r.lint.summary : ''}`);
96
+ if (r.build)
97
+ obs.push(`Build: ${r.build.pass ? 'PASS' : 'FAIL'}${r.build.summary ? ' — ' + r.build.summary : ''}`);
98
+ if (r.summary)
99
+ obs.push(`Hook summary: ${r.summary}`);
100
+ }
101
+ else {
102
+ obs.push('External report: not provided (reality-check only)');
103
+ }
104
+ return obs;
105
+ }
106
+ export function verifyAgentWork(input) {
107
+ const base = resolveBase(input.workdir, input.base);
108
+ const rc = realityCheck(input.workdir, base, input.claim?.expected_files);
109
+ const reportPass = input.report?.pass ?? true;
110
+ const pass = rc.pass && reportPass;
111
+ const timestamp = new Date().toISOString();
112
+ const safeAgentId = input.agent_id.replace(/[^a-zA-Z0-9_-]/g, '-');
113
+ const suffix = randomBytes(3).toString('hex');
114
+ const entityName = `verification:${safeAgentId}:${timestamp.replace(/[:.]/g, '-')}:${suffix}`;
115
+ const tags = [
116
+ 'verification',
117
+ `agent:${safeAgentId}`,
118
+ pass ? 'verification:pass' : 'verification:fail',
119
+ ];
120
+ remember({
121
+ name: entityName,
122
+ type: 'verification_record',
123
+ observations: buildObservations(input, rc, pass),
124
+ tags,
125
+ });
126
+ if (process.env.MEMESH_ENABLE_AGENTIC_ORCHESTRATION === '1') {
127
+ logSkillEvent('verify_agent_work_invoked', {
128
+ agent_id_hashed: safeAgentId.slice(0, 8),
129
+ pass,
130
+ files_changed: rc.files_changed,
131
+ has_external_report: Boolean(input.report),
132
+ });
133
+ }
134
+ return {
135
+ entity_name: entityName,
136
+ pass,
137
+ reality_check: rc,
138
+ external_report: input.report ?? null,
139
+ timestamp,
140
+ };
141
+ }
142
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/core/verifier.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,34 @@
1
- interface UpdateCheck {
1
+ import { execFile } from 'child_process';
2
+ export type UpdateCheckSource = 'fresh' | 'cache';
3
+ export type UpdateCheckFreshness = 'fresh' | 'cached' | 'stale' | 'unavailable';
4
+ export interface UpdateCheck {
2
5
  currentVersion: string;
3
6
  latestVersion: string | null;
4
- checkedAt: string;
7
+ checkedAt: string | null;
8
+ lastAttemptAt: string | null;
9
+ lastSuccessfulCheckAt: string | null;
10
+ lastError: string | null;
5
11
  updateAvailable: boolean;
12
+ checkSucceeded: boolean;
13
+ source: UpdateCheckSource;
14
+ freshness: UpdateCheckFreshness;
6
15
  }
7
- export declare function checkForUpdate(currentVersion: string): Promise<UpdateCheck>;
8
- export declare function getLastUpdateCheck(): UpdateCheck | null;
16
+ interface CheckForUpdateOptions {
17
+ execFileImpl?: typeof execFile;
18
+ now?: Date;
19
+ timeoutMs?: number;
20
+ updateCheckPath?: string;
21
+ }
22
+ interface GetUpdateCheckOptions extends CheckForUpdateOptions {
23
+ preferFresh?: boolean;
24
+ }
25
+ export declare function checkForUpdate(currentVersion: string, options?: CheckForUpdateOptions): Promise<UpdateCheck>;
26
+ export declare function getLastUpdateCheck(currentVersion: string, options?: {
27
+ updateCheckPath?: string;
28
+ now?: Date;
29
+ }): UpdateCheck | null;
30
+ export declare function getUpdateCheck(currentVersion: string, options?: GetUpdateCheckOptions): Promise<UpdateCheck | null>;
31
+ export declare function formatUpdateCheckStatus(update: UpdateCheck | null): string[];
32
+ export declare function getUpdateCheckPathForTests(): string;
9
33
  export {};
10
34
  //# sourceMappingURL=version-check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/core/version-check.ts"],"names":[],"mappings":"AAOA,UAAU,WAAW;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAMD,wBAAsB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA4BjF;AAKD,wBAAgB,kBAAkB,IAAI,WAAW,GAAG,IAAI,CAOvD"}
1
+ {"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/core/version-check.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOzC,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,OAAO,CAAC;AAClD,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,aAAa,CAAC;AAWhF,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,oBAAoB,CAAC;CACjC;AAED,UAAU,qBAAqB;IAC7B,YAAY,CAAC,EAAE,OAAO,QAAQ,CAAC;IAC/B,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,qBAAsB,SAAQ,qBAAqB;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA6GD,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,WAAW,CAAC,CAiDtB;AAOD,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GACrD,WAAW,GAAG,IAAI,CAIpB;AAMD,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAS7B;AAeD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,EAAE,CAqB5E;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD"}
@@ -3,42 +3,188 @@ import path from 'path';
3
3
  import os from 'os';
4
4
  import { execFile } from 'child_process';
5
5
  const UPDATE_CHECK_PATH = path.join(os.homedir(), '.memesh', 'update-check.json');
6
- export async function checkForUpdate(currentVersion) {
7
- const result = {
6
+ const DEFAULT_TIMEOUT_MS = 5000;
7
+ const STALE_AFTER_MS = 24 * 60 * 60 * 1000;
8
+ const MAX_ERROR_LENGTH = 160;
9
+ function getUpdateCheckPath(updateCheckPath) {
10
+ return updateCheckPath ?? process.env.MEMESH_UPDATE_CHECK_PATH ?? UPDATE_CHECK_PATH;
11
+ }
12
+ function parseIsoDate(value) {
13
+ if (!value)
14
+ return null;
15
+ const timestamp = Date.parse(value);
16
+ return Number.isNaN(timestamp) ? null : timestamp;
17
+ }
18
+ function summarizeError(err) {
19
+ const message = err instanceof Error ? err.message : String(err);
20
+ return message.slice(0, MAX_ERROR_LENGTH);
21
+ }
22
+ function determineFreshness(source, checkSucceeded, lastSuccessfulCheckAt, now) {
23
+ if (!lastSuccessfulCheckAt)
24
+ return 'unavailable';
25
+ if (source === 'fresh' && checkSucceeded)
26
+ return 'fresh';
27
+ const successfulAt = parseIsoDate(lastSuccessfulCheckAt);
28
+ if (successfulAt === null)
29
+ return 'unavailable';
30
+ return now.getTime() - successfulAt > STALE_AFTER_MS ? 'stale' : 'cached';
31
+ }
32
+ function buildResult(currentVersion, stored, source, now) {
33
+ return {
8
34
  currentVersion,
9
- latestVersion: null,
10
- checkedAt: new Date().toISOString(),
11
- updateAvailable: false,
35
+ latestVersion: stored.latestVersion,
36
+ checkedAt: stored.lastAttemptAt,
37
+ lastAttemptAt: stored.lastAttemptAt,
38
+ lastSuccessfulCheckAt: stored.lastSuccessfulCheckAt,
39
+ lastError: stored.lastError,
40
+ updateAvailable: stored.latestVersion !== null && stored.latestVersion !== currentVersion,
41
+ checkSucceeded: stored.checkSucceeded,
42
+ source,
43
+ freshness: determineFreshness(source, stored.checkSucceeded, stored.lastSuccessfulCheckAt, now),
44
+ };
45
+ }
46
+ function parseStoredUpdateCheck(raw) {
47
+ if (!raw || typeof raw !== 'object')
48
+ return null;
49
+ const candidate = raw;
50
+ const latestVersion = candidate.latestVersion;
51
+ const lastAttemptAt = 'lastAttemptAt' in candidate ? candidate.lastAttemptAt : candidate.checkedAt;
52
+ const lastSuccessfulCheckAt = 'lastSuccessfulCheckAt' in candidate ? candidate.lastSuccessfulCheckAt : candidate.checkedAt;
53
+ if (latestVersion !== null && latestVersion !== undefined && typeof latestVersion !== 'string')
54
+ return null;
55
+ if (lastAttemptAt !== null && lastAttemptAt !== undefined && typeof lastAttemptAt !== 'string')
56
+ return null;
57
+ if (lastSuccessfulCheckAt !== null && lastSuccessfulCheckAt !== undefined && typeof lastSuccessfulCheckAt !== 'string')
58
+ return null;
59
+ if ('lastError' in candidate && candidate.lastError !== null && typeof candidate.lastError !== 'string')
60
+ return null;
61
+ if ('checkSucceeded' in candidate && typeof candidate.checkSucceeded !== 'boolean')
62
+ return null;
63
+ if ('currentVersion' in candidate && candidate.currentVersion !== null && typeof candidate.currentVersion !== 'string')
64
+ return null;
65
+ const normalizedLatestVersion = latestVersion ?? null;
66
+ const normalizedLastAttemptAt = lastAttemptAt ?? null;
67
+ const normalizedLastSuccessfulCheckAt = lastSuccessfulCheckAt ?? null;
68
+ const checkSucceeded = typeof candidate.checkSucceeded === 'boolean'
69
+ ? candidate.checkSucceeded
70
+ : normalizedLatestVersion !== null;
71
+ return {
72
+ currentVersion: typeof candidate.currentVersion === 'string' ? candidate.currentVersion : null,
73
+ latestVersion: normalizedLatestVersion,
74
+ lastAttemptAt: normalizedLastAttemptAt,
75
+ lastSuccessfulCheckAt: normalizedLastSuccessfulCheckAt,
76
+ lastError: typeof candidate.lastError === 'string' ? candidate.lastError : null,
77
+ checkSucceeded,
12
78
  };
79
+ }
80
+ function readStoredUpdateCheck(updateCheckPath) {
81
+ try {
82
+ const targetPath = getUpdateCheckPath(updateCheckPath);
83
+ if (!fs.existsSync(targetPath))
84
+ return null;
85
+ return parseStoredUpdateCheck(JSON.parse(fs.readFileSync(targetPath, 'utf8')));
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ function writeStoredUpdateCheck(stored, updateCheckPath) {
92
+ try {
93
+ const targetPath = getUpdateCheckPath(updateCheckPath);
94
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
95
+ fs.writeFileSync(targetPath, JSON.stringify(stored, null, 2));
96
+ }
97
+ catch {
98
+ }
99
+ }
100
+ export async function checkForUpdate(currentVersion, options = {}) {
101
+ const { execFileImpl = execFile, now = new Date(), timeoutMs = DEFAULT_TIMEOUT_MS, updateCheckPath, } = options;
102
+ const previous = readStoredUpdateCheck(updateCheckPath);
103
+ const attemptedAt = now.toISOString();
13
104
  try {
14
105
  const latest = await new Promise((resolve, reject) => {
15
- execFile('npm', ['show', '@pcircle/memesh', 'version'], { timeout: 5000 }, (err, stdout) => {
106
+ execFileImpl('npm', ['show', '@pcircle/memesh', 'version'], { timeout: timeoutMs }, (err, stdout) => {
16
107
  if (err)
17
108
  reject(err);
18
109
  else
19
110
  resolve(stdout.trim());
20
111
  });
21
112
  });
22
- result.latestVersion = latest;
23
- result.updateAvailable = latest !== currentVersion;
113
+ const stored = {
114
+ currentVersion,
115
+ latestVersion: latest,
116
+ lastAttemptAt: attemptedAt,
117
+ lastSuccessfulCheckAt: attemptedAt,
118
+ lastError: null,
119
+ checkSucceeded: true,
120
+ };
121
+ writeStoredUpdateCheck(stored, updateCheckPath);
122
+ return buildResult(currentVersion, stored, 'fresh', now);
24
123
  }
25
- catch {
124
+ catch (err) {
125
+ const stored = {
126
+ currentVersion,
127
+ latestVersion: previous?.latestVersion ?? null,
128
+ lastAttemptAt: attemptedAt,
129
+ lastSuccessfulCheckAt: previous?.lastSuccessfulCheckAt ?? null,
130
+ lastError: summarizeError(err),
131
+ checkSucceeded: false,
132
+ };
133
+ writeStoredUpdateCheck(stored, updateCheckPath);
134
+ const source = stored.lastSuccessfulCheckAt ? 'cache' : 'fresh';
135
+ return buildResult(currentVersion, stored, source, now);
26
136
  }
27
- try {
28
- fs.mkdirSync(path.dirname(UPDATE_CHECK_PATH), { recursive: true });
29
- fs.writeFileSync(UPDATE_CHECK_PATH, JSON.stringify(result, null, 2));
137
+ }
138
+ export function getLastUpdateCheck(currentVersion, options = {}) {
139
+ const stored = readStoredUpdateCheck(options.updateCheckPath);
140
+ if (!stored)
141
+ return null;
142
+ return buildResult(currentVersion, stored, 'cache', options.now ?? new Date());
143
+ }
144
+ export async function getUpdateCheck(currentVersion, options = {}) {
145
+ if (options.preferFresh === false) {
146
+ return getLastUpdateCheck(currentVersion, {
147
+ updateCheckPath: options.updateCheckPath,
148
+ now: options.now,
149
+ });
30
150
  }
31
- catch { }
32
- return result;
151
+ return checkForUpdate(currentVersion, options);
33
152
  }
34
- export function getLastUpdateCheck() {
35
- try {
36
- if (!fs.existsSync(UPDATE_CHECK_PATH))
37
- return null;
38
- return JSON.parse(fs.readFileSync(UPDATE_CHECK_PATH, 'utf8'));
153
+ function formatFreshness(update) {
154
+ switch (update.freshness) {
155
+ case 'fresh':
156
+ return 'fresh';
157
+ case 'cached':
158
+ return `cached from ${update.lastSuccessfulCheckAt}`;
159
+ case 'stale':
160
+ return `stale cache from ${update.lastSuccessfulCheckAt}`;
161
+ default:
162
+ return 'unavailable';
39
163
  }
40
- catch {
41
- return null;
164
+ }
165
+ export function formatUpdateCheckStatus(update) {
166
+ if (!update) {
167
+ return ['Update check: unavailable'];
168
+ }
169
+ const lines = [];
170
+ if (update.freshness === 'unavailable') {
171
+ lines.push('Update check: unavailable');
42
172
  }
173
+ else if (update.updateAvailable && update.latestVersion) {
174
+ lines.push(`🔄 Update available: ${update.latestVersion} (${formatFreshness(update)}; run: memesh update)`);
175
+ }
176
+ else if (update.latestVersion) {
177
+ lines.push(`Update check: up to date (${formatFreshness(update)}; latest ${update.latestVersion})`);
178
+ }
179
+ else {
180
+ lines.push(`Update check: no version information available (${formatFreshness(update)})`);
181
+ }
182
+ if (!update.checkSucceeded && update.lastError) {
183
+ lines.push(`Last update check failed: ${update.lastError}`);
184
+ }
185
+ return lines;
186
+ }
187
+ export function getUpdateCheckPathForTests() {
188
+ return UPDATE_CHECK_PATH;
43
189
  }
44
190
  //# sourceMappingURL=version-check.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/core/version-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;AAalF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,cAAsB;IACzD,MAAM,MAAM,GAAgB;QAC1B,cAAc;QACd,aAAa,EAAE,IAAI;QACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,eAAe,EAAE,KAAK;KACvB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3D,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBACzF,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;oBAChB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC;QAC9B,MAAM,CAAC,eAAe,GAAG,MAAM,KAAK,cAAc,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;IAGD,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,MAAM,CAAC;AAChB,CAAC;AAKD,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;YAAE,OAAO,IAAI,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/core/version-check.ts"],"names":[],"mappings":"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"}