kratos-memory 1.0.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 (120) hide show
  1. package/AGENTS.md +25 -0
  2. package/LICENSE +21 -0
  3. package/bin/kratos-cli +7 -0
  4. package/dist/cli/capture-handler.d.ts +13 -0
  5. package/dist/cli/capture-handler.d.ts.map +1 -0
  6. package/dist/cli/capture-handler.js +112 -0
  7. package/dist/cli/capture-handler.js.map +1 -0
  8. package/dist/cli/commands/ask.d.ts +5 -0
  9. package/dist/cli/commands/ask.d.ts.map +1 -0
  10. package/dist/cli/commands/ask.js +64 -0
  11. package/dist/cli/commands/ask.js.map +1 -0
  12. package/dist/cli/commands/capture.d.ts +5 -0
  13. package/dist/cli/commands/capture.d.ts.map +1 -0
  14. package/dist/cli/commands/capture.js +31 -0
  15. package/dist/cli/commands/capture.js.map +1 -0
  16. package/dist/cli/commands/forget.d.ts +3 -0
  17. package/dist/cli/commands/forget.d.ts.map +1 -0
  18. package/dist/cli/commands/forget.js +12 -0
  19. package/dist/cli/commands/forget.js.map +1 -0
  20. package/dist/cli/commands/get.d.ts +3 -0
  21. package/dist/cli/commands/get.d.ts.map +1 -0
  22. package/dist/cli/commands/get.js +28 -0
  23. package/dist/cli/commands/get.js.map +1 -0
  24. package/dist/cli/commands/hooks.d.ts +2 -0
  25. package/dist/cli/commands/hooks.d.ts.map +1 -0
  26. package/dist/cli/commands/hooks.js +136 -0
  27. package/dist/cli/commands/hooks.js.map +1 -0
  28. package/dist/cli/commands/migrate.d.ts +5 -0
  29. package/dist/cli/commands/migrate.d.ts.map +1 -0
  30. package/dist/cli/commands/migrate.js +56 -0
  31. package/dist/cli/commands/migrate.js.map +1 -0
  32. package/dist/cli/commands/recent.d.ts +6 -0
  33. package/dist/cli/commands/recent.d.ts.map +1 -0
  34. package/dist/cli/commands/recent.js +21 -0
  35. package/dist/cli/commands/recent.js.map +1 -0
  36. package/dist/cli/commands/save.d.ts +8 -0
  37. package/dist/cli/commands/save.d.ts.map +1 -0
  38. package/dist/cli/commands/save.js +31 -0
  39. package/dist/cli/commands/save.js.map +1 -0
  40. package/dist/cli/commands/scan.d.ts +5 -0
  41. package/dist/cli/commands/scan.d.ts.map +1 -0
  42. package/dist/cli/commands/scan.js +28 -0
  43. package/dist/cli/commands/scan.js.map +1 -0
  44. package/dist/cli/commands/search.d.ts +8 -0
  45. package/dist/cli/commands/search.d.ts.map +1 -0
  46. package/dist/cli/commands/search.js +45 -0
  47. package/dist/cli/commands/search.js.map +1 -0
  48. package/dist/cli/commands/status.d.ts +3 -0
  49. package/dist/cli/commands/status.d.ts.map +1 -0
  50. package/dist/cli/commands/status.js +89 -0
  51. package/dist/cli/commands/status.js.map +1 -0
  52. package/dist/cli/commands/switch.d.ts +3 -0
  53. package/dist/cli/commands/switch.d.ts.map +1 -0
  54. package/dist/cli/commands/switch.js +18 -0
  55. package/dist/cli/commands/switch.js.map +1 -0
  56. package/dist/cli/core.d.ts +15 -0
  57. package/dist/cli/core.d.ts.map +1 -0
  58. package/dist/cli/core.js +18 -0
  59. package/dist/cli/core.js.map +1 -0
  60. package/dist/cli/index.d.ts +3 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +157 -0
  63. package/dist/cli/index.js.map +1 -0
  64. package/dist/cli/output.d.ts +22 -0
  65. package/dist/cli/output.d.ts.map +1 -0
  66. package/dist/cli/output.js +74 -0
  67. package/dist/cli/output.js.map +1 -0
  68. package/dist/compression/factory.d.ts +6 -0
  69. package/dist/compression/factory.d.ts.map +1 -0
  70. package/dist/compression/factory.js +8 -0
  71. package/dist/compression/factory.js.map +1 -0
  72. package/dist/compression/index.d.ts +10 -0
  73. package/dist/compression/index.d.ts.map +1 -0
  74. package/dist/compression/index.js +2 -0
  75. package/dist/compression/index.js.map +1 -0
  76. package/dist/compression/rule-compressor.d.ts +9 -0
  77. package/dist/compression/rule-compressor.d.ts.map +1 -0
  78. package/dist/compression/rule-compressor.js +43 -0
  79. package/dist/compression/rule-compressor.js.map +1 -0
  80. package/dist/memory-server/concept-store-enhanced.d.ts +88 -0
  81. package/dist/memory-server/concept-store-enhanced.d.ts.map +1 -0
  82. package/dist/memory-server/concept-store-enhanced.js +392 -0
  83. package/dist/memory-server/concept-store-enhanced.js.map +1 -0
  84. package/dist/memory-server/concept-store.d.ts +58 -0
  85. package/dist/memory-server/concept-store.d.ts.map +1 -0
  86. package/dist/memory-server/concept-store.js +329 -0
  87. package/dist/memory-server/concept-store.js.map +1 -0
  88. package/dist/memory-server/context-broker.d.ts +63 -0
  89. package/dist/memory-server/context-broker.d.ts.map +1 -0
  90. package/dist/memory-server/context-broker.js +340 -0
  91. package/dist/memory-server/context-broker.js.map +1 -0
  92. package/dist/memory-server/database.d.ts +108 -0
  93. package/dist/memory-server/database.d.ts.map +1 -0
  94. package/dist/memory-server/database.js +690 -0
  95. package/dist/memory-server/database.js.map +1 -0
  96. package/dist/project-manager.d.ts +77 -0
  97. package/dist/project-manager.d.ts.map +1 -0
  98. package/dist/project-manager.js +226 -0
  99. package/dist/project-manager.js.map +1 -0
  100. package/dist/security/data-retention.d.ts +104 -0
  101. package/dist/security/data-retention.d.ts.map +1 -0
  102. package/dist/security/data-retention.js +444 -0
  103. package/dist/security/data-retention.js.map +1 -0
  104. package/dist/security/encryption.d.ts +48 -0
  105. package/dist/security/encryption.d.ts.map +1 -0
  106. package/dist/security/encryption.js +131 -0
  107. package/dist/security/encryption.js.map +1 -0
  108. package/dist/security/pii-detector.d.ts +61 -0
  109. package/dist/security/pii-detector.d.ts.map +1 -0
  110. package/dist/security/pii-detector.js +220 -0
  111. package/dist/security/pii-detector.js.map +1 -0
  112. package/dist/types/index.d.ts +151 -0
  113. package/dist/types/index.d.ts.map +1 -0
  114. package/dist/types/index.js +2 -0
  115. package/dist/types/index.js.map +1 -0
  116. package/dist/utils/logger.d.ts +9 -0
  117. package/dist/utils/logger.d.ts.map +1 -0
  118. package/dist/utils/logger.js +10 -0
  119. package/dist/utils/logger.js.map +1 -0
  120. package/package.json +54 -0
package/AGENTS.md ADDED
@@ -0,0 +1,25 @@
1
+ # Memory System
2
+
3
+ This project uses Kratos CLI for persistent memory across coding sessions.
4
+
5
+ ## Commands
6
+ - Save: `npx kratos-cli save "description" --tags tag1,tag2 --importance 3`
7
+ - Search: `npx kratos-cli search "query"`
8
+ - Ask: `npx kratos-cli ask "question about the project"`
9
+ - Recent: `npx kratos-cli recent --limit 10`
10
+ - Status: `npx kratos-cli status`
11
+ - Get: `npx kratos-cli get <memory-id>`
12
+ - Forget: `npx kratos-cli forget <memory-id>`
13
+ - Scan: `npx kratos-cli scan "text to check" --redact`
14
+
15
+ ## When to save
16
+ - Architecture decisions
17
+ - Bug fixes (what was wrong + how you fixed it)
18
+ - Important codebase patterns
19
+ - Feature implementations
20
+ - User preferences and conventions
21
+
22
+ ## When to search
23
+ - Start of each session — get context about current work
24
+ - When asked about past decisions
25
+ - Before making changes to understand existing patterns
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 ceorkm
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/bin/kratos-cli ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { fileURLToPath } from 'url';
3
+ import { dirname, join, resolve } from 'path';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ const cliPath = resolve(join(__dirname, '..', 'dist', 'cli', 'index.js'));
7
+ await import(cliPath);
@@ -0,0 +1,13 @@
1
+ import type { CLIContext } from './core.js';
2
+ export declare class CaptureHandler {
3
+ private ctx;
4
+ private bufferPath;
5
+ private compressor;
6
+ constructor(ctx: CLIContext);
7
+ handlePostToolUse(data: any): Promise<void>;
8
+ handleSessionEnd(_data: any): Promise<void>;
9
+ private appendToBuffer;
10
+ private loadBuffer;
11
+ private clearBuffer;
12
+ }
13
+ //# sourceMappingURL=capture-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-handler.d.ts","sourceRoot":"","sources":["../../src/cli/capture-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAqB5C,qBAAa,cAAc;IACzB,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAsB;gBAE5B,GAAG,EAAE,UAAU;IAMrB,iBAAiB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAgD3C,gBAAgB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BnC,cAAc;YAgBd,UAAU;YAWV,WAAW;CAO1B"}
@@ -0,0 +1,112 @@
1
+ import { createCompressor } from '../compression/factory.js';
2
+ import path from 'path';
3
+ import fs from 'fs-extra';
4
+ const MAX_STDIN_SIZE = 1024 * 1024; // 1MB limit on captured data
5
+ export class CaptureHandler {
6
+ ctx;
7
+ bufferPath;
8
+ compressor = createCompressor();
9
+ constructor(ctx) {
10
+ this.ctx = ctx;
11
+ const kratosHome = path.join(process.env.HOME || process.env.USERPROFILE || '', '.kratos');
12
+ this.bufferPath = path.join(kratosHome, 'projects', ctx.project.id, 'sessions', 'current.json');
13
+ }
14
+ async handlePostToolUse(data) {
15
+ const toolName = data?.tool_name || data?.toolName || 'unknown';
16
+ const toolInput = data?.tool_input || data?.input || {};
17
+ let summary = '';
18
+ let filePaths = [];
19
+ let tags = ['auto-capture'];
20
+ if (['Edit', 'Write', 'MultiEdit'].includes(toolName)) {
21
+ const filePath = toolInput.file_path || toolInput.path || '';
22
+ summary = `Edited file: ${path.basename(filePath)}`;
23
+ filePaths = filePath ? [filePath] : [];
24
+ tags.push('file-edit');
25
+ }
26
+ else if (toolName === 'Bash') {
27
+ const cmd = toolInput.command || '';
28
+ summary = `Ran command: ${cmd.substring(0, 80)}`;
29
+ tags.push('command');
30
+ }
31
+ else {
32
+ summary = `Used tool: ${toolName}`;
33
+ tags.push('tool-use');
34
+ }
35
+ // Compress with rule-based compressor
36
+ const compressed = await this.compressor.compress(summary);
37
+ // Truncate raw data to prevent DB bloat
38
+ const rawText = JSON.stringify(data, null, 2);
39
+ const text = rawText.length > MAX_STDIN_SIZE
40
+ ? rawText.substring(0, MAX_STDIN_SIZE) + '\n... (truncated)'
41
+ : rawText;
42
+ this.ctx.memoryDb.save({
43
+ summary: compressed.summary,
44
+ text,
45
+ tags,
46
+ paths: filePaths,
47
+ importance: 2,
48
+ });
49
+ await this.appendToBuffer({
50
+ timestamp: Date.now(),
51
+ type: toolName,
52
+ summary,
53
+ paths: filePaths,
54
+ tags,
55
+ });
56
+ }
57
+ async handleSessionEnd(_data) {
58
+ const buffer = await this.loadBuffer();
59
+ if (!buffer || buffer.events.length === 0)
60
+ return;
61
+ const duration = Math.round((Date.now() - buffer.startedAt) / 1000 / 60);
62
+ const fileEdits = buffer.events.filter(e => e.tags.includes('file-edit'));
63
+ const commands = buffer.events.filter(e => e.tags.includes('command'));
64
+ const uniqueFiles = [...new Set(fileEdits.flatMap(e => e.paths))];
65
+ let summaryText = `Session (${duration}min): ${buffer.events.length} actions, ${fileEdits.length} edits, ${commands.length} commands`;
66
+ let detailText = summaryText + '\n\n';
67
+ detailText += `Files modified:\n${uniqueFiles.map(f => ` - ${f}`).join('\n')}\n\n`;
68
+ detailText += `Actions:\n${buffer.events.map(e => ` - ${e.summary}`).join('\n')}`;
69
+ const compressed = await this.compressor.compress(detailText);
70
+ this.ctx.memoryDb.save({
71
+ summary: compressed.summary,
72
+ text: detailText,
73
+ tags: ['auto-capture', 'session-summary'],
74
+ paths: uniqueFiles,
75
+ importance: 4,
76
+ });
77
+ await this.clearBuffer();
78
+ }
79
+ async appendToBuffer(event) {
80
+ let buffer = await this.loadBuffer();
81
+ if (!buffer) {
82
+ buffer = {
83
+ sessionId: `sess_${Date.now()}`,
84
+ startedAt: Date.now(),
85
+ events: [],
86
+ };
87
+ }
88
+ buffer.events.push(event);
89
+ await fs.ensureDir(path.dirname(this.bufferPath));
90
+ await fs.writeJson(this.bufferPath, buffer, { spaces: 2 });
91
+ }
92
+ async loadBuffer() {
93
+ try {
94
+ if (await fs.pathExists(this.bufferPath)) {
95
+ return await fs.readJson(this.bufferPath);
96
+ }
97
+ }
98
+ catch {
99
+ // Corrupted buffer
100
+ }
101
+ return null;
102
+ }
103
+ async clearBuffer() {
104
+ try {
105
+ await fs.remove(this.bufferPath);
106
+ }
107
+ catch {
108
+ // Ignore
109
+ }
110
+ }
111
+ }
112
+ //# sourceMappingURL=capture-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-handler.js","sourceRoot":"","sources":["../../src/cli/capture-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { CLIContext } from '../core.js';
2
+ export declare function askCommand(ctx: CLIContext, question: string, opts: {
3
+ limit?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=ask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkChB"}
@@ -0,0 +1,64 @@
1
+ import { Output } from '../output.js';
2
+ export async function askCommand(ctx, question, opts) {
3
+ const limit = opts.limit ? parseInt(opts.limit, 10) : 10;
4
+ // Parse natural language query
5
+ const parsed = parseNaturalLanguageQuery(question);
6
+ const searchQuery = parsed.searchTerms.join(' ');
7
+ if (!searchQuery) {
8
+ Output.warn('Could not extract search terms from your question. Try rephrasing.');
9
+ return;
10
+ }
11
+ const enhanced = ctx.memoryDb.searchWithDebug({
12
+ q: searchQuery,
13
+ k: limit,
14
+ tags: parsed.tags.length > 0 ? parsed.tags : undefined,
15
+ });
16
+ Output.header(`Answer for: "${question}"`);
17
+ Output.dim(`Understood as: ${parsed.intent} → "${searchQuery}"${parsed.tags.length > 0 ? ` [tags: ${parsed.tags.join(', ')}]` : ''}`);
18
+ Output.dim(`Found ${enhanced.results.length} relevant memories`);
19
+ for (const r of enhanced.results) {
20
+ Output.memoryCard({
21
+ id: r.memory.id,
22
+ summary: r.memory.summary,
23
+ tags: r.memory.tags,
24
+ paths: r.memory.paths,
25
+ importance: r.memory.importance,
26
+ created_at: r.memory.created_at,
27
+ score: r.score,
28
+ snippet: r.snippet,
29
+ });
30
+ }
31
+ }
32
+ function parseNaturalLanguageQuery(question) {
33
+ const lowerQ = question.toLowerCase();
34
+ const stopWords = new Set([
35
+ 'show', 'me', 'all', 'the', 'what', 'how', 'when', 'where', 'why',
36
+ 'find', 'get', 'about', 'in', 'on', 'at', 'to', 'for', 'with',
37
+ 'by', 'from', 'did', 'do', 'does', 'is', 'are', 'was', 'were',
38
+ 'have', 'has', 'had', 'can', 'could', 'would', 'should', 'will',
39
+ 'know', 'tell', 'give', 'learned', 'remember', 'recall',
40
+ ]);
41
+ const words = question.split(/\s+/).filter(word => word.length > 2 && !stopWords.has(word.toLowerCase()));
42
+ let intent = 'search';
43
+ if (lowerQ.includes('show me') || lowerQ.includes('list'))
44
+ intent = 'list';
45
+ else if (lowerQ.includes('explain') || lowerQ.includes('what is'))
46
+ intent = 'explain';
47
+ else if (lowerQ.includes('find') || lowerQ.includes('where'))
48
+ intent = 'find';
49
+ let timeframe;
50
+ if (lowerQ.includes('today'))
51
+ timeframe = 'today';
52
+ else if (lowerQ.includes('yesterday'))
53
+ timeframe = 'yesterday';
54
+ else if (lowerQ.includes('this week'))
55
+ timeframe = 'week';
56
+ const tags = [];
57
+ const techTerms = ['bug', 'error', 'fix', 'debug', 'feature', 'api', 'database', 'auth', 'ui', 'frontend', 'backend'];
58
+ for (const term of techTerms) {
59
+ if (lowerQ.includes(term))
60
+ tags.push(term);
61
+ }
62
+ return { searchTerms: words, tags, timeframe, intent };
63
+ }
64
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../../src/cli/commands/ask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { CLIContext } from '../core.js';
2
+ export declare function captureCommand(ctx: CLIContext, opts: {
3
+ event?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAsB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhB"}
@@ -0,0 +1,31 @@
1
+ import { CaptureHandler } from '../capture-handler.js';
2
+ export async function captureCommand(ctx, opts) {
3
+ const handler = new CaptureHandler(ctx);
4
+ // Read event data from stdin
5
+ let inputData = {};
6
+ try {
7
+ const chunks = [];
8
+ for await (const chunk of process.stdin) {
9
+ chunks.push(chunk);
10
+ }
11
+ const raw = Buffer.concat(chunks).toString('utf-8').trim();
12
+ if (raw) {
13
+ inputData = JSON.parse(raw);
14
+ }
15
+ }
16
+ catch {
17
+ // No stdin data or invalid JSON — that's okay
18
+ }
19
+ switch (opts.event) {
20
+ case 'post-tool-use':
21
+ await handler.handlePostToolUse(inputData);
22
+ break;
23
+ case 'session-end':
24
+ await handler.handleSessionEnd(inputData);
25
+ break;
26
+ default:
27
+ // Unknown event type — ignore silently (hooks should not produce errors)
28
+ break;
29
+ }
30
+ }
31
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../src/cli/commands/capture.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAe,EAAE,IAErD;IACC,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IAExC,6BAA6B;IAC7B,IAAI,SAAS,GAAQ,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,IAAI,GAAG,EAAE,CAAC;YACR,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IAED,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,eAAe;YAClB,MAAM,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM;QACR,KAAK,aAAa;YAChB,MAAM,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM;QACR;YACE,yEAAyE;YACzE,MAAM;IACV,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CLIContext } from '../core.js';
2
+ export declare function forgetCommand(ctx: CLIContext, id: string): Promise<void>;
3
+ //# sourceMappingURL=forget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forget.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/forget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9E"}
@@ -0,0 +1,12 @@
1
+ import { Output } from '../output.js';
2
+ export async function forgetCommand(ctx, id) {
3
+ const result = ctx.memoryDb.forget(id);
4
+ if (result && result.deleted) {
5
+ Output.success(`Memory deleted: ${id}`);
6
+ }
7
+ else {
8
+ Output.error(`Memory not found or already deleted: ${id}`);
9
+ process.exit(1);
10
+ }
11
+ }
12
+ //# sourceMappingURL=forget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forget.js","sourceRoot":"","sources":["../../../src/cli/commands/forget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAe,EAAE,EAAU;IAC7D,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEvC,IAAI,MAAM,IAAK,MAAc,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CLIContext } from '../core.js';
2
+ export declare function getCommand(ctx: CLIContext, id: string): Promise<void>;
3
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/get.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B3E"}
@@ -0,0 +1,28 @@
1
+ import { Output } from '../output.js';
2
+ export async function getCommand(ctx, id) {
3
+ const memory = ctx.memoryDb.get(id);
4
+ if (!memory) {
5
+ Output.error(`Memory not found: ${id}`);
6
+ process.exit(1);
7
+ }
8
+ Output.header('Memory Details');
9
+ console.log('');
10
+ Output.info(`ID: ${memory.id}`);
11
+ Output.info(`Summary: ${memory.summary}`);
12
+ Output.info(`Importance: ${memory.importance}`);
13
+ Output.info(`Created: ${new Date(memory.created_at).toLocaleString()}`);
14
+ Output.info(`Updated: ${new Date(memory.updated_at).toLocaleString()}`);
15
+ if (memory.tags.length > 0) {
16
+ Output.info(`Tags: ${memory.tags.join(', ')}`);
17
+ }
18
+ if (memory.paths.length > 0) {
19
+ Output.info(`Paths: ${memory.paths.join(', ')}`);
20
+ }
21
+ if (memory.ttl) {
22
+ Output.info(`TTL: ${memory.ttl}s`);
23
+ }
24
+ console.log('');
25
+ Output.header('Full Text');
26
+ console.log(memory.text);
27
+ }
28
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/cli/commands/get.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAe,EAAE,EAAU;IAC1D,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAE3E,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function hooksCommand(action: string): Promise<void>;
2
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/hooks.ts"],"names":[],"mappings":"AAoBA,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE"}
@@ -0,0 +1,136 @@
1
+ import { Output } from '../output.js';
2
+ import path from 'path';
3
+ import fs from 'fs-extra';
4
+ const HOOK_CONFIG = {
5
+ hooks: {
6
+ PostToolUse: [
7
+ {
8
+ matcher: 'Edit|Write|MultiEdit',
9
+ command: 'kratos capture --event post-tool-use',
10
+ },
11
+ ],
12
+ Stop: [
13
+ {
14
+ command: 'kratos capture --event session-end',
15
+ },
16
+ ],
17
+ },
18
+ };
19
+ export async function hooksCommand(action) {
20
+ switch (action) {
21
+ case 'install':
22
+ await installHooks();
23
+ break;
24
+ case 'uninstall':
25
+ await uninstallHooks();
26
+ break;
27
+ case 'status':
28
+ await checkHooksStatus();
29
+ break;
30
+ default:
31
+ Output.error(`Unknown action: ${action}. Use: install, uninstall, status`);
32
+ process.exit(1);
33
+ }
34
+ }
35
+ async function installHooks() {
36
+ const settingsPath = path.join(process.cwd(), '.claude', 'settings.local.json');
37
+ const settingsDir = path.dirname(settingsPath);
38
+ await fs.ensureDir(settingsDir);
39
+ let settings = {};
40
+ // Load existing settings if present
41
+ if (await fs.pathExists(settingsPath)) {
42
+ try {
43
+ settings = await fs.readJson(settingsPath);
44
+ }
45
+ catch {
46
+ settings = {};
47
+ }
48
+ }
49
+ // Check if hooks already installed
50
+ if (settings.hooks?.PostToolUse || settings.hooks?.Stop) {
51
+ // Check if our hooks are already there
52
+ const existingPostTool = settings.hooks.PostToolUse || [];
53
+ const hasKratosHook = existingPostTool.some((h) => h.command?.includes('kratos capture'));
54
+ if (hasKratosHook) {
55
+ Output.warn('Kratos auto-capture hooks are already installed');
56
+ return;
57
+ }
58
+ }
59
+ // Merge hooks into existing settings (don't overwrite other hooks)
60
+ if (!settings.hooks)
61
+ settings.hooks = {};
62
+ // Add PostToolUse hooks
63
+ if (!settings.hooks.PostToolUse)
64
+ settings.hooks.PostToolUse = [];
65
+ settings.hooks.PostToolUse.push(...HOOK_CONFIG.hooks.PostToolUse);
66
+ // Add Stop hooks
67
+ if (!settings.hooks.Stop)
68
+ settings.hooks.Stop = [];
69
+ settings.hooks.Stop.push(...HOOK_CONFIG.hooks.Stop);
70
+ await fs.writeJson(settingsPath, settings, { spaces: 2 });
71
+ Output.success('Auto-capture hooks installed!');
72
+ Output.dim(`Config written to: ${settingsPath}`);
73
+ Output.dim('Hooks will capture: file edits (Edit/Write/MultiEdit) and session summaries');
74
+ Output.dim('Captured memories are auto-compressed and project-isolated');
75
+ }
76
+ async function uninstallHooks() {
77
+ const settingsPath = path.join(process.cwd(), '.claude', 'settings.local.json');
78
+ if (!await fs.pathExists(settingsPath)) {
79
+ Output.warn('No hooks configuration found');
80
+ return;
81
+ }
82
+ try {
83
+ const settings = await fs.readJson(settingsPath);
84
+ if (!settings.hooks) {
85
+ Output.warn('No hooks found in settings');
86
+ return;
87
+ }
88
+ // Remove only kratos hooks
89
+ if (settings.hooks.PostToolUse) {
90
+ settings.hooks.PostToolUse = settings.hooks.PostToolUse.filter((h) => !h.command?.includes('kratos capture'));
91
+ if (settings.hooks.PostToolUse.length === 0) {
92
+ delete settings.hooks.PostToolUse;
93
+ }
94
+ }
95
+ if (settings.hooks.Stop) {
96
+ settings.hooks.Stop = settings.hooks.Stop.filter((h) => !h.command?.includes('kratos capture'));
97
+ if (settings.hooks.Stop.length === 0) {
98
+ delete settings.hooks.Stop;
99
+ }
100
+ }
101
+ // Clean up empty hooks object
102
+ if (Object.keys(settings.hooks).length === 0) {
103
+ delete settings.hooks;
104
+ }
105
+ await fs.writeJson(settingsPath, settings, { spaces: 2 });
106
+ Output.success('Kratos auto-capture hooks removed');
107
+ }
108
+ catch {
109
+ Output.error('Failed to read settings file');
110
+ process.exit(1);
111
+ }
112
+ }
113
+ async function checkHooksStatus() {
114
+ const settingsPath = path.join(process.cwd(), '.claude', 'settings.local.json');
115
+ if (!await fs.pathExists(settingsPath)) {
116
+ Output.info('No hooks installed (no settings file found)');
117
+ return;
118
+ }
119
+ try {
120
+ const settings = await fs.readJson(settingsPath);
121
+ const postToolHooks = (settings.hooks?.PostToolUse || []).filter((h) => h.command?.includes('kratos capture'));
122
+ const stopHooks = (settings.hooks?.Stop || []).filter((h) => h.command?.includes('kratos capture'));
123
+ if (postToolHooks.length === 0 && stopHooks.length === 0) {
124
+ Output.info('Kratos hooks are NOT installed');
125
+ }
126
+ else {
127
+ Output.success('Kratos hooks are installed');
128
+ Output.dim(`PostToolUse hooks: ${postToolHooks.length}`);
129
+ Output.dim(`Stop hooks: ${stopHooks.length}`);
130
+ }
131
+ }
132
+ catch {
133
+ Output.error('Failed to read settings file');
134
+ }
135
+ }
136
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/cli/commands/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { CLIContext } from '../core.js';
2
+ export declare function migrateCommand(ctx: CLIContext, opts: {
3
+ from?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,wBAAsB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDhB"}
@@ -0,0 +1,56 @@
1
+ import { Output } from '../output.js';
2
+ import path from 'path';
3
+ import fs from 'fs-extra';
4
+ export async function migrateCommand(ctx, opts) {
5
+ const kratosHome = opts.from || path.join(process.env.HOME || process.env.USERPROFILE || '', '.kratos');
6
+ const projectsDir = path.join(kratosHome, 'projects');
7
+ Output.header('Kratos Data Migration');
8
+ if (!await fs.pathExists(projectsDir)) {
9
+ Output.warn('No existing data found at: ' + projectsDir);
10
+ Output.dim('If your data is elsewhere, use --from <path>');
11
+ return;
12
+ }
13
+ const entries = await fs.readdir(projectsDir);
14
+ let totalMemories = 0;
15
+ let totalProjects = 0;
16
+ for (const entry of entries) {
17
+ const dbPath = path.join(projectsDir, entry, 'databases', 'memories.db');
18
+ const projectJsonPath = path.join(projectsDir, entry, 'project.json');
19
+ if (!await fs.pathExists(dbPath))
20
+ continue;
21
+ totalProjects++;
22
+ // Read project metadata
23
+ let projectName = entry;
24
+ try {
25
+ if (await fs.pathExists(projectJsonPath)) {
26
+ const meta = await fs.readJson(projectJsonPath);
27
+ projectName = meta.name || entry;
28
+ }
29
+ }
30
+ catch {
31
+ // Use directory name
32
+ }
33
+ // Count memories in the database
34
+ try {
35
+ const Database = (await import('better-sqlite3')).default;
36
+ const db = new Database(dbPath, { readonly: true });
37
+ const row = db.prepare('SELECT COUNT(*) as count FROM memories').get();
38
+ totalMemories += row.count;
39
+ db.close();
40
+ Output.success(`${projectName}: ${row.count} memories found`);
41
+ }
42
+ catch (error) {
43
+ Output.warn(`${projectName}: could not read database`);
44
+ }
45
+ }
46
+ console.log('');
47
+ Output.header('Migration Summary');
48
+ Output.info(`Projects found: ${totalProjects}`);
49
+ Output.info(`Total memories: ${totalMemories}`);
50
+ Output.info(`Data location: ${projectsDir}`);
51
+ console.log('');
52
+ Output.success('Your data is already compatible with the CLI!');
53
+ Output.dim('The CLI reads from the same database files — no data copy needed.');
54
+ Output.dim('All project isolation is preserved. Each project has its own database.');
55
+ }
56
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CLIContext } from '../core.js';
2
+ export declare function recentCommand(ctx: CLIContext, opts: {
3
+ limit?: string;
4
+ pathPrefix?: string;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=recent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recent.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/recent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhB"}