@helloworlkd/pam-cli 0.1.16

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 (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -0
  3. package/dist/commands/add.d.ts +3 -0
  4. package/dist/commands/add.d.ts.map +1 -0
  5. package/dist/commands/add.js +42 -0
  6. package/dist/commands/add.js.map +1 -0
  7. package/dist/commands/approve.d.ts +3 -0
  8. package/dist/commands/approve.d.ts.map +1 -0
  9. package/dist/commands/approve.js +16 -0
  10. package/dist/commands/approve.js.map +1 -0
  11. package/dist/commands/archive.d.ts +3 -0
  12. package/dist/commands/archive.d.ts.map +1 -0
  13. package/dist/commands/archive.js +16 -0
  14. package/dist/commands/archive.js.map +1 -0
  15. package/dist/commands/audit.d.ts +3 -0
  16. package/dist/commands/audit.d.ts.map +1 -0
  17. package/dist/commands/audit.js +62 -0
  18. package/dist/commands/audit.js.map +1 -0
  19. package/dist/commands/capture.d.ts +3 -0
  20. package/dist/commands/capture.d.ts.map +1 -0
  21. package/dist/commands/capture.js +39 -0
  22. package/dist/commands/capture.js.map +1 -0
  23. package/dist/commands/checkpoint.d.ts +3 -0
  24. package/dist/commands/checkpoint.d.ts.map +1 -0
  25. package/dist/commands/checkpoint.js +48 -0
  26. package/dist/commands/checkpoint.js.map +1 -0
  27. package/dist/commands/context.d.ts +3 -0
  28. package/dist/commands/context.d.ts.map +1 -0
  29. package/dist/commands/context.js +35 -0
  30. package/dist/commands/context.js.map +1 -0
  31. package/dist/commands/debug.d.ts +3 -0
  32. package/dist/commands/debug.d.ts.map +1 -0
  33. package/dist/commands/debug.js +58 -0
  34. package/dist/commands/debug.js.map +1 -0
  35. package/dist/commands/decay.d.ts +3 -0
  36. package/dist/commands/decay.d.ts.map +1 -0
  37. package/dist/commands/decay.js +73 -0
  38. package/dist/commands/decay.js.map +1 -0
  39. package/dist/commands/delete.d.ts +3 -0
  40. package/dist/commands/delete.d.ts.map +1 -0
  41. package/dist/commands/delete.js +31 -0
  42. package/dist/commands/delete.js.map +1 -0
  43. package/dist/commands/doctor.d.ts +3 -0
  44. package/dist/commands/doctor.d.ts.map +1 -0
  45. package/dist/commands/doctor.js +145 -0
  46. package/dist/commands/doctor.js.map +1 -0
  47. package/dist/commands/edit.d.ts +3 -0
  48. package/dist/commands/edit.d.ts.map +1 -0
  49. package/dist/commands/edit.js +35 -0
  50. package/dist/commands/edit.js.map +1 -0
  51. package/dist/commands/export-cmd.d.ts +3 -0
  52. package/dist/commands/export-cmd.d.ts.map +1 -0
  53. package/dist/commands/export-cmd.js +26 -0
  54. package/dist/commands/export-cmd.js.map +1 -0
  55. package/dist/commands/handoff.d.ts +3 -0
  56. package/dist/commands/handoff.d.ts.map +1 -0
  57. package/dist/commands/handoff.js +87 -0
  58. package/dist/commands/handoff.js.map +1 -0
  59. package/dist/commands/hook.d.ts +3 -0
  60. package/dist/commands/hook.d.ts.map +1 -0
  61. package/dist/commands/hook.js +92 -0
  62. package/dist/commands/hook.js.map +1 -0
  63. package/dist/commands/import-cmd.d.ts +3 -0
  64. package/dist/commands/import-cmd.d.ts.map +1 -0
  65. package/dist/commands/import-cmd.js +36 -0
  66. package/dist/commands/import-cmd.js.map +1 -0
  67. package/dist/commands/index-cmd.d.ts +3 -0
  68. package/dist/commands/index-cmd.d.ts.map +1 -0
  69. package/dist/commands/index-cmd.js +32 -0
  70. package/dist/commands/index-cmd.js.map +1 -0
  71. package/dist/commands/init.d.ts +3 -0
  72. package/dist/commands/init.d.ts.map +1 -0
  73. package/dist/commands/init.js +29 -0
  74. package/dist/commands/init.js.map +1 -0
  75. package/dist/commands/intelligence.d.ts +3 -0
  76. package/dist/commands/intelligence.d.ts.map +1 -0
  77. package/dist/commands/intelligence.js +165 -0
  78. package/dist/commands/intelligence.js.map +1 -0
  79. package/dist/commands/list.d.ts +3 -0
  80. package/dist/commands/list.d.ts.map +1 -0
  81. package/dist/commands/list.js +34 -0
  82. package/dist/commands/list.js.map +1 -0
  83. package/dist/commands/redact.d.ts +3 -0
  84. package/dist/commands/redact.d.ts.map +1 -0
  85. package/dist/commands/redact.js +25 -0
  86. package/dist/commands/redact.js.map +1 -0
  87. package/dist/commands/reject.d.ts +3 -0
  88. package/dist/commands/reject.d.ts.map +1 -0
  89. package/dist/commands/reject.js +16 -0
  90. package/dist/commands/reject.js.map +1 -0
  91. package/dist/commands/restore.d.ts +3 -0
  92. package/dist/commands/restore.d.ts.map +1 -0
  93. package/dist/commands/restore.js +16 -0
  94. package/dist/commands/restore.js.map +1 -0
  95. package/dist/commands/review.d.ts +3 -0
  96. package/dist/commands/review.d.ts.map +1 -0
  97. package/dist/commands/review.js +26 -0
  98. package/dist/commands/review.js.map +1 -0
  99. package/dist/commands/search.d.ts +3 -0
  100. package/dist/commands/search.d.ts.map +1 -0
  101. package/dist/commands/search.js +99 -0
  102. package/dist/commands/search.js.map +1 -0
  103. package/dist/commands/semantic.d.ts +3 -0
  104. package/dist/commands/semantic.d.ts.map +1 -0
  105. package/dist/commands/semantic.js +49 -0
  106. package/dist/commands/semantic.js.map +1 -0
  107. package/dist/commands/server.d.ts +3 -0
  108. package/dist/commands/server.d.ts.map +1 -0
  109. package/dist/commands/server.js +11 -0
  110. package/dist/commands/server.js.map +1 -0
  111. package/dist/commands/show.d.ts +3 -0
  112. package/dist/commands/show.d.ts.map +1 -0
  113. package/dist/commands/show.js +27 -0
  114. package/dist/commands/show.js.map +1 -0
  115. package/dist/commands/smoke-test.d.ts +3 -0
  116. package/dist/commands/smoke-test.d.ts.map +1 -0
  117. package/dist/commands/smoke-test.js +32 -0
  118. package/dist/commands/smoke-test.js.map +1 -0
  119. package/dist/commands/status.d.ts +3 -0
  120. package/dist/commands/status.d.ts.map +1 -0
  121. package/dist/commands/status.js +39 -0
  122. package/dist/commands/status.js.map +1 -0
  123. package/dist/commands/supersede.d.ts +3 -0
  124. package/dist/commands/supersede.d.ts.map +1 -0
  125. package/dist/commands/supersede.js +78 -0
  126. package/dist/commands/supersede.js.map +1 -0
  127. package/dist/commands/ui.d.ts +3 -0
  128. package/dist/commands/ui.d.ts.map +1 -0
  129. package/dist/commands/ui.js +159 -0
  130. package/dist/commands/ui.js.map +1 -0
  131. package/dist/commands/upgrade-state.d.ts +24 -0
  132. package/dist/commands/upgrade-state.d.ts.map +1 -0
  133. package/dist/commands/upgrade-state.js +52 -0
  134. package/dist/commands/upgrade-state.js.map +1 -0
  135. package/dist/commands/upgrade.d.ts +3 -0
  136. package/dist/commands/upgrade.d.ts.map +1 -0
  137. package/dist/commands/upgrade.js +78 -0
  138. package/dist/commands/upgrade.js.map +1 -0
  139. package/dist/index.d.ts +3 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +73 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/mcp/server.d.ts +2 -0
  144. package/dist/mcp/server.d.ts.map +1 -0
  145. package/dist/mcp/server.js +2 -0
  146. package/dist/mcp/server.js.map +1 -0
  147. package/dist/self-upgrade.d.ts +3 -0
  148. package/dist/self-upgrade.d.ts.map +1 -0
  149. package/dist/self-upgrade.js +203 -0
  150. package/dist/self-upgrade.js.map +1 -0
  151. package/dist/version.d.ts +2 -0
  152. package/dist/version.d.ts.map +1 -0
  153. package/dist/version.js +15 -0
  154. package/dist/version.js.map +1 -0
  155. package/package.json +61 -0
  156. package/scripts/postinstall.mjs +128 -0
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerShowCommand(program: Command): void;
3
+ //# sourceMappingURL=show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,QA2BnD"}
@@ -0,0 +1,27 @@
1
+ import { readMemory, getProjectMemoryPath } from '@helloworlkd/pam-core';
2
+ export function registerShowCommand(program) {
3
+ program
4
+ .command('show <id>')
5
+ .description('Show a memory by ID')
6
+ .action(async (id) => {
7
+ const basePath = getProjectMemoryPath(process.cwd());
8
+ const memory = await readMemory(basePath, id);
9
+ if (!memory) {
10
+ console.error(`Memory not found: ${id}`);
11
+ process.exit(1);
12
+ }
13
+ console.log('---');
14
+ console.log(`ID: ${memory.metadata.id}`);
15
+ console.log(`Type: ${memory.metadata.type}`);
16
+ console.log(`Scope: ${memory.metadata.scope}`);
17
+ console.log(`Status: ${memory.metadata.status}`);
18
+ console.log(`Created: ${memory.metadata.created_at}`);
19
+ console.log(`Updated: ${memory.metadata.updated_at}`);
20
+ console.log(`Tags: ${memory.metadata.tags.join(', ') || 'none'}`);
21
+ console.log(`Source: ${memory.metadata.source}`);
22
+ console.log('---');
23
+ console.log();
24
+ console.log(memory.content);
25
+ });
26
+ }
27
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/commands/show.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAExE,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QACnB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;QAEpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;QAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAA;YACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAClB,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;QACxC,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5C,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;QAC9C,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;QACrD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;QACrD,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC,CAAA;QACjE,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAClB,OAAO,CAAC,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSmokeTestCommand(program: Command): void;
3
+ //# sourceMappingURL=smoke-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-test.d.ts","sourceRoot":"","sources":["../../src/commands/smoke-test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,QAsCxD"}
@@ -0,0 +1,32 @@
1
+ import { compileContext, createMemory, initProjectMemory, listMemories, readMemory, } from '@helloworlkd/pam-core';
2
+ export function registerSmokeTestCommand(program) {
3
+ const smoke = program.command('smoke-test').description('Run PAM end-to-end smoke tests');
4
+ smoke
5
+ .command('agent')
6
+ .description('Create and verify an active memory as an auto-capture proof')
7
+ .action(async () => {
8
+ const cwd = process.cwd();
9
+ const basePath = await initProjectMemory(cwd);
10
+ const marker = `pam-smoke-${Date.now()}`;
11
+ const memory = await createMemory(basePath, {
12
+ type: 'knowledge',
13
+ scope: 'project',
14
+ status: 'active',
15
+ source: 'smoke-test',
16
+ tags: ['smoke-test', marker],
17
+ salience: 0.5,
18
+ content: 'PAM smoke test memory: this active memory proves the local store, index, automatic capture path, and context path are reachable.',
19
+ });
20
+ const loaded = await readMemory(basePath, memory.metadata.id);
21
+ const active = (await listMemories(basePath)).some((item) => item.metadata.id === memory.metadata.id && item.metadata.status === 'active');
22
+ const context = await compileContext(basePath, { query: marker, maxTokens: 1200 });
23
+ console.log('PAM agent smoke test\n');
24
+ console.log(`Created active memory: ${memory.metadata.id}`);
25
+ console.log(`Store: ${basePath}`);
26
+ console.log(`Visible as active memory: ${active}`);
27
+ console.log(`Readable from disk: ${Boolean(loaded)}`);
28
+ console.log(`Visible in context: ${context.sources.project.length > 0 ? 'yes' : 'no'}`);
29
+ console.log(`\nVerify recall with \`pam search ${marker}\` or \`pam context --query ${marker}\`.`);
30
+ });
31
+ }
32
+ //# sourceMappingURL=smoke-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-test.js","sourceRoot":"","sources":["../../src/commands/smoke-test.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,UAAU,GACX,MAAM,uBAAuB,CAAA;AAE9B,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,gCAAgC,CAAC,CAAA;IAEzF,KAAK;SACF,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QACzB,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;QAExC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE;YAC1C,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,YAAY;YACpB,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;YAC5B,QAAQ,EAAE,GAAG;YACb,OAAO,EACL,kIAAkI;SACrI,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC7D,MAAM,MAAM,GAAG,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAChD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,CACvF,CAAA;QACD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAElF,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QACrC,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;QAC3D,OAAO,CAAC,GAAG,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAA;QACjC,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAA;QAClD,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACvF,OAAO,CAAC,GAAG,CACT,qCAAqC,MAAM,+BAA+B,MAAM,KAAK,CACtF,CAAA;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerStatusCommand(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QA6CrD"}
@@ -0,0 +1,39 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { checkIndexConsistency, findMemoryBase, listMemories, loadAutoCaptureConfig, } from '@helloworlkd/pam-core';
4
+ export function registerStatusCommand(program) {
5
+ program
6
+ .command('status')
7
+ .description('Show current pam status')
8
+ .option('--verbose', 'Show integration, capture, and index details')
9
+ .action(async (options) => {
10
+ const cwd = process.cwd();
11
+ const memoryPath = findMemoryBase(cwd);
12
+ console.log(`Using memory: ${memoryPath ?? 'none'}`);
13
+ if (!memoryPath) {
14
+ console.log('Run `pam init` to create project memory.');
15
+ return;
16
+ }
17
+ const memories = await listMemories(memoryPath);
18
+ const active = memories.filter((m) => m.metadata.status === 'active').length;
19
+ const proposed = memories.filter((m) => m.metadata.status === 'proposed').length;
20
+ const archived = memories.filter((m) => m.metadata.status === 'archived').length;
21
+ const deleted = memories.filter((m) => m.metadata.status === 'deleted').length;
22
+ console.log(`Memories: ${active} active, ${proposed} proposed, ${archived} archived, ${deleted} deleted`);
23
+ if (proposed > 0) {
24
+ console.log(`Review-mode queue: ${proposed} proposed memories waiting (run \`pam review\` if you intentionally use assisted mode)`);
25
+ }
26
+ if (options.verbose) {
27
+ const config = await loadAutoCaptureConfig(memoryPath);
28
+ const report = await checkIndexConsistency(memoryPath);
29
+ console.log('\nVerbose status:');
30
+ console.log(` Capture mode: ${config.mode}`);
31
+ console.log(` Index: ${report.totalIndexed}/${report.totalFiles} indexed`);
32
+ console.log(` Index issues: ${report.missingInIndex.length + report.missingInFiles.length}`);
33
+ console.log(` Claude hooks: ${existsSync(join(cwd, '.claude', 'settings.json'))}`);
34
+ console.log(` MCP config: ${existsSync(join(cwd, '.mcp.json'))}`);
35
+ console.log(' UI: run `pam ui` (default http://127.0.0.1:3939)');
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSupersedeCommand(program: Command): void;
3
+ //# sourceMappingURL=supersede.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supersede.d.ts","sourceRoot":"","sources":["../../src/commands/supersede.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUnC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,QAwFxD"}
@@ -0,0 +1,78 @@
1
+ import { supersedeMemory, getSupersessionChain, getLatestVersion, getProjectMemoryPath, assertMemoryType, assertSalience, } from '@helloworlkd/pam-core';
2
+ export function registerSupersedeCommand(program) {
3
+ const supersede = program.command('supersede').description('Memory supersession management');
4
+ supersede
5
+ .command('create <old_id>')
6
+ .description('Create a new memory that supersedes an existing one')
7
+ .option('-t, --type <type>', 'Memory type (required)')
8
+ .option('-c, --content <content>', 'Memory content (required)')
9
+ .option('--tags <tags>', 'Comma-separated tags')
10
+ .option('--salience <salience>', 'Importance score (0-1)', '0.5')
11
+ .action(async (oldId, options) => {
12
+ if (!options.type || !options.content) {
13
+ console.error('Error: --type and --content are required');
14
+ process.exit(1);
15
+ }
16
+ const basePath = getProjectMemoryPath(process.cwd());
17
+ const type = assertMemoryType(options.type);
18
+ const tags = options.tags ? options.tags.split(',').map((t) => t.trim()) : [];
19
+ let salience;
20
+ try {
21
+ salience = assertSalience(options.salience);
22
+ }
23
+ catch (error) {
24
+ console.error(error instanceof Error ? error.message : String(error));
25
+ process.exit(1);
26
+ }
27
+ const result = await supersedeMemory(basePath, oldId, {
28
+ type,
29
+ scope: 'project',
30
+ content: options.content,
31
+ tags,
32
+ salience,
33
+ source: 'manual',
34
+ });
35
+ if (!result) {
36
+ console.error(`Memory not found: ${oldId}`);
37
+ process.exit(1);
38
+ }
39
+ console.log(`Superseded ${oldId} with ${result.newMemory.metadata.id}`);
40
+ console.log(`\nOld pam archived: ${result.oldMemory.metadata.id}`);
41
+ console.log(`New memory created: ${result.newMemory.metadata.id}`);
42
+ });
43
+ supersede
44
+ .command('chain <memory_id>')
45
+ .description('Show the supersession chain for a memory')
46
+ .action(async (memoryId) => {
47
+ const basePath = getProjectMemoryPath(process.cwd());
48
+ const chain = await getSupersessionChain(basePath, memoryId);
49
+ if (chain.length === 0) {
50
+ console.log(`Memory not found: ${memoryId}`);
51
+ return;
52
+ }
53
+ console.log(`Supersession chain (${chain.length} versions):\n`);
54
+ chain.forEach((memory, index) => {
55
+ const arrow = index < chain.length - 1 ? '→' : ' ';
56
+ console.log(`${arrow} ${memory.metadata.id} (${memory.metadata.status})`);
57
+ console.log(` Created: ${memory.metadata.created_at}`);
58
+ console.log(` Content: ${memory.content.substring(0, 80)}...`);
59
+ console.log('');
60
+ });
61
+ });
62
+ supersede
63
+ .command('latest <memory_id>')
64
+ .description('Get the latest version of a memory')
65
+ .action(async (memoryId) => {
66
+ const basePath = getProjectMemoryPath(process.cwd());
67
+ const latest = await getLatestVersion(basePath, memoryId);
68
+ if (!latest) {
69
+ console.log(`Memory not found: ${memoryId}`);
70
+ return;
71
+ }
72
+ console.log(`Latest version: ${latest.metadata.id}`);
73
+ console.log(`Status: ${latest.metadata.status}`);
74
+ console.log(`Created: ${latest.metadata.created_at}`);
75
+ console.log(`\nContent:\n${latest.content}`);
76
+ });
77
+ }
78
+ //# sourceMappingURL=supersede.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supersede.js","sourceRoot":"","sources":["../../src/commands/supersede.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerUiCommand(program: Command): void;
3
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAYnC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QAgEjD"}
@@ -0,0 +1,159 @@
1
+ import { createConnection } from 'node:net';
2
+ import { get, request as httpRequest } from 'node:http';
3
+ import { spawn } from 'node:child_process';
4
+ import { resolve } from 'node:path';
5
+ export function registerUiCommand(program) {
6
+ program
7
+ .command('ui')
8
+ .description('Start the local PAM web UI')
9
+ .option('--host <host>', 'Host to bind', '127.0.0.1')
10
+ .option('-p, --port <port>', 'Port to bind', '3939')
11
+ .option('--open', 'Open the UI in the default browser')
12
+ .action(async (options) => {
13
+ const port = Number.parseInt(options.port ?? '3939', 10);
14
+ if (!Number.isFinite(port)) {
15
+ console.error(`Invalid port: ${options.port}`);
16
+ process.exit(1);
17
+ }
18
+ const host = options.host ?? '127.0.0.1';
19
+ const url = `http://${host}:${port}`;
20
+ try {
21
+ const app = await startUiServer(host, port);
22
+ console.log(`PAM UI running at ${app.url}`);
23
+ console.log('Press Ctrl+C to stop.');
24
+ if (options.open) {
25
+ openBrowser(app.url);
26
+ }
27
+ }
28
+ catch (error) {
29
+ if (error.code === 'EADDRINUSE') {
30
+ const running = await probePamServer(url, process.cwd());
31
+ if (running) {
32
+ console.log(`Stopping existing PAM UI instance on port ${port}...`);
33
+ await shutdownServer(url, running.token);
34
+ const freed = await waitForPortFree(host, port, 3000);
35
+ if (!freed) {
36
+ console.error(`Existing PAM UI on port ${port} did not stop. Stop it manually or choose --port.`);
37
+ process.exit(1);
38
+ }
39
+ const app = await startUiServer(host, port);
40
+ console.log(`PAM UI running at ${app.url}`);
41
+ console.log('Press Ctrl+C to stop.');
42
+ if (options.open)
43
+ openBrowser(app.url);
44
+ return;
45
+ }
46
+ console.error(`Port ${port} is already in use by another process. Use --port to specify a different port.`);
47
+ process.exit(1);
48
+ }
49
+ if (isPamPackageMismatch(error)) {
50
+ console.error('PAM UI cannot start because the installed @helloworlkd/pam-cli, @helloworlkd/pam-api, and @helloworlkd/pam-core packages are incompatible.');
51
+ console.error('Update all published PAM packages together, or use a workspace-linked CLI build.');
52
+ console.error(error instanceof Error ? error.message : String(error));
53
+ process.exit(1);
54
+ }
55
+ throw error;
56
+ }
57
+ });
58
+ }
59
+ async function startUiServer(host, port) {
60
+ const { startLocalApiServer } = await import('@helloworlkd/pam-api');
61
+ return startLocalApiServer({
62
+ cwd: process.cwd(),
63
+ host,
64
+ port,
65
+ });
66
+ }
67
+ function isPamPackageMismatch(error) {
68
+ return (error instanceof SyntaxError &&
69
+ error.message.toLowerCase().includes('requested module') &&
70
+ error.message.includes('@helloworlkd/pam-core') &&
71
+ error.message.toLowerCase().includes('does not provide an export named'));
72
+ }
73
+ async function probePamServer(url, expectedProjectPath) {
74
+ const health = await getJson(`${url}/api/health`);
75
+ if (!health ||
76
+ health.ok !== true ||
77
+ health.name !== 'PAM' ||
78
+ !health.projectPath ||
79
+ resolve(health.projectPath) !== resolve(expectedProjectPath)) {
80
+ return null;
81
+ }
82
+ const session = await getJson(`${url}/api/session`);
83
+ if (!session?.token)
84
+ return null;
85
+ return { token: session.token };
86
+ }
87
+ function getJson(url) {
88
+ return new Promise((resolve) => {
89
+ const req = get(url, (res) => {
90
+ const chunks = [];
91
+ res.on('data', (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
92
+ res.on('end', () => {
93
+ if (res.statusCode !== 200) {
94
+ resolve(null);
95
+ return;
96
+ }
97
+ try {
98
+ resolve(JSON.parse(Buffer.concat(chunks).toString('utf-8')));
99
+ }
100
+ catch {
101
+ resolve(null);
102
+ }
103
+ });
104
+ });
105
+ req.on('error', () => resolve(null));
106
+ req.setTimeout(2000, () => {
107
+ req.destroy();
108
+ resolve(null);
109
+ });
110
+ });
111
+ }
112
+ function shutdownServer(url, token) {
113
+ return new Promise((resolve) => {
114
+ const parsed = new URL(`${url}/api/shutdown`);
115
+ const req = httpRequest({
116
+ host: parsed.hostname,
117
+ port: parsed.port,
118
+ path: parsed.pathname,
119
+ method: 'POST',
120
+ headers: { 'x-pam-session': token },
121
+ }, (res) => {
122
+ res.resume();
123
+ resolve();
124
+ });
125
+ req.on('error', () => resolve());
126
+ req.setTimeout(3000, () => {
127
+ req.destroy();
128
+ resolve();
129
+ });
130
+ req.end();
131
+ });
132
+ }
133
+ function waitForPortFree(host, port, timeoutMs = 5000) {
134
+ const deadline = Date.now() + timeoutMs;
135
+ return new Promise((resolve) => {
136
+ const check = () => {
137
+ const sock = createConnection({ host, port });
138
+ sock.once('connect', () => {
139
+ sock.destroy();
140
+ if (Date.now() < deadline)
141
+ setTimeout(check, 200);
142
+ else
143
+ resolve(false);
144
+ });
145
+ sock.once('error', () => {
146
+ sock.destroy();
147
+ resolve(true);
148
+ });
149
+ };
150
+ setTimeout(check, 300);
151
+ });
152
+ }
153
+ function openBrowser(url) {
154
+ const command = process.platform === 'win32' ? 'cmd' : process.platform === 'darwin' ? 'open' : 'xdg-open';
155
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
156
+ const child = spawn(command, args, { detached: true, stdio: 'ignore' });
157
+ child.unref();
158
+ }
159
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/commands/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type UpgradePhase = 'queued' | 'waiting' | 'stopping-services' | 'installing' | 'succeeded' | 'failed';
2
+ export interface UpgradeStatus {
3
+ runId: string;
4
+ phase: UpgradePhase;
5
+ message: string;
6
+ packageSpec: string;
7
+ npmCommand: string;
8
+ startedAt: string;
9
+ updatedAt: string;
10
+ logPath: string;
11
+ stoppedServices?: number;
12
+ exitCode?: number;
13
+ }
14
+ export interface UpgradeStatePaths {
15
+ dir: string;
16
+ statusPath: string;
17
+ logPath: string;
18
+ }
19
+ export declare function getUpgradeStatePaths(runId?: string): UpgradeStatePaths;
20
+ export declare function writeUpgradeStatus(status: UpgradeStatus): void;
21
+ export declare function readUpgradeStatus(runId?: string): UpgradeStatus | null;
22
+ export declare function appendUpgradeLog(logPath: string, message: string): void;
23
+ export declare function formatUpgradeStatus(status: UpgradeStatus | null): string;
24
+ //# sourceMappingURL=upgrade-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-state.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade-state.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,SAAS,GACT,mBAAmB,GACnB,YAAY,GACZ,WAAW,GACX,QAAQ,CAAA;AAEZ,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,SAAW,GAAG,iBAAiB,CAQxE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAK9D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,SAAW,GAAG,aAAa,GAAG,IAAI,CAIxE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGvE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAsBxE"}
@@ -0,0 +1,52 @@
1
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ export function getUpgradeStatePaths(runId = 'latest') {
5
+ const dir = process.env.PAM_UPGRADE_STATE_DIR ?? join(tmpdir(), 'pam-upgrade');
6
+ const suffix = runId === 'latest' ? 'latest' : sanitizeRunId(runId);
7
+ return {
8
+ dir,
9
+ statusPath: join(dir, `${suffix}.json`),
10
+ logPath: join(dir, `${suffix}.log`),
11
+ };
12
+ }
13
+ export function writeUpgradeStatus(status) {
14
+ mkdirSync(getUpgradeStatePaths().dir, { recursive: true });
15
+ const paths = getUpgradeStatePaths(status.runId);
16
+ writeFileSync(paths.statusPath, `${JSON.stringify(status, null, 2)}\n`, 'utf-8');
17
+ writeFileSync(getUpgradeStatePaths().statusPath, `${JSON.stringify(status, null, 2)}\n`, 'utf-8');
18
+ }
19
+ export function readUpgradeStatus(runId = 'latest') {
20
+ const path = getUpgradeStatePaths(runId).statusPath;
21
+ if (!existsSync(path))
22
+ return null;
23
+ return JSON.parse(readFileSync(path, 'utf-8'));
24
+ }
25
+ export function appendUpgradeLog(logPath, message) {
26
+ mkdirSync(getUpgradeStatePaths().dir, { recursive: true });
27
+ appendFileSync(logPath, message, 'utf-8');
28
+ }
29
+ export function formatUpgradeStatus(status) {
30
+ if (!status)
31
+ return 'No PAM upgrade status has been recorded yet.';
32
+ const lines = [
33
+ `PAM upgrade ${status.runId}`,
34
+ `Phase: ${status.phase}`,
35
+ `Package: ${status.packageSpec}`,
36
+ `npm: ${status.npmCommand}`,
37
+ `Updated: ${status.updatedAt}`,
38
+ `Message: ${status.message}`,
39
+ `Log: ${status.logPath}`,
40
+ ];
41
+ if (typeof status.stoppedServices === 'number') {
42
+ lines.push(`Stopped services: ${status.stoppedServices}`);
43
+ }
44
+ if (typeof status.exitCode === 'number') {
45
+ lines.push(`Exit code: ${status.exitCode}`);
46
+ }
47
+ return lines.join('\n');
48
+ }
49
+ function sanitizeRunId(runId) {
50
+ return runId.replace(/[^a-zA-Z0-9_.-]/g, '-');
51
+ }
52
+ //# sourceMappingURL=upgrade-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade-state.js","sourceRoot":"","sources":["../../src/commands/upgrade-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerUpgradeCommand(program: Command): void;
3
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkBnC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,QAsEtD"}
@@ -0,0 +1,78 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { appendUpgradeLog, formatUpgradeStatus, getUpgradeStatePaths, readUpgradeStatus, writeUpgradeStatus, } from './upgrade-state.js';
5
+ const CLI_DIST_DIR = dirname(fileURLToPath(import.meta.url));
6
+ export function registerUpgradeCommand(program) {
7
+ const upgrade = program
8
+ .command('upgrade')
9
+ .description('Update the global PAM CLI without leaving running services locked')
10
+ .option('--package <spec>', 'Package spec to install', '@helloworlkd/pam-cli@latest')
11
+ .option('--npm <command>', 'npm executable to use')
12
+ .option('--dry-run', 'Show the update steps without installing')
13
+ .action((options) => {
14
+ const runId = `upgrade-${Date.now()}`;
15
+ const startedAt = new Date().toISOString();
16
+ const paths = getUpgradeStatePaths(runId);
17
+ const updaterPath = join(CLI_DIST_DIR, '../self-upgrade.js');
18
+ const args = [updaterPath, '--package', options.package ?? '@helloworlkd/pam-cli@latest'];
19
+ if (options.npm)
20
+ args.push('--npm', options.npm);
21
+ if (options.dryRun)
22
+ args.push('--dry-run');
23
+ args.push('--run-id', runId, '--log-path', paths.logPath, '--started-at', startedAt);
24
+ const child = spawn(process.execPath, args, {
25
+ detached: !options.dryRun,
26
+ stdio: options.dryRun ? 'inherit' : 'ignore',
27
+ windowsHide: false,
28
+ });
29
+ if (options.dryRun) {
30
+ child.on('exit', (code) => {
31
+ process.exit(code ?? 0);
32
+ });
33
+ return;
34
+ }
35
+ const status = {
36
+ runId,
37
+ phase: 'queued',
38
+ message: 'Updater process started in the background.',
39
+ packageSpec: options.package ?? '@helloworlkd/pam-cli@latest',
40
+ npmCommand: options.npm ?? (process.platform === 'win32' ? 'npm.cmd' : 'npm'),
41
+ startedAt,
42
+ updatedAt: startedAt,
43
+ logPath: paths.logPath,
44
+ };
45
+ writeUpgradeStatus(status);
46
+ appendUpgradeLog(paths.logPath, `[${startedAt}] queued: ${status.message}\n`);
47
+ child.unref();
48
+ console.log(`PAM upgrade started in the background (${runId}).`);
49
+ console.log('Progress: queued -> stopping services -> npm install -> done.');
50
+ console.log(`Status file: ${paths.statusPath}`);
51
+ console.log(`Log file: ${paths.logPath}`);
52
+ console.log(`Follow live: ${formatLogFollowCommand(paths.logPath)}`);
53
+ });
54
+ upgrade
55
+ .command('status')
56
+ .description('Show the latest PAM upgrade status')
57
+ .action(() => {
58
+ console.log(formatUpgradeStatus(readUpgradeStatus()));
59
+ });
60
+ upgrade
61
+ .command('log')
62
+ .description('Show the latest PAM upgrade log path')
63
+ .action(() => {
64
+ const status = readUpgradeStatus();
65
+ if (!status) {
66
+ console.log('No PAM upgrade log has been recorded yet.');
67
+ return;
68
+ }
69
+ console.log(status.logPath);
70
+ });
71
+ }
72
+ function formatLogFollowCommand(logPath) {
73
+ if (process.platform === 'win32') {
74
+ return `Get-Content -Wait -LiteralPath "${logPath}"`;
75
+ }
76
+ return `tail -f "${logPath}"`;
77
+ }
78
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}