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.
- package/AGENTS.md +25 -0
- package/LICENSE +21 -0
- package/bin/kratos-cli +7 -0
- package/dist/cli/capture-handler.d.ts +13 -0
- package/dist/cli/capture-handler.d.ts.map +1 -0
- package/dist/cli/capture-handler.js +112 -0
- package/dist/cli/capture-handler.js.map +1 -0
- package/dist/cli/commands/ask.d.ts +5 -0
- package/dist/cli/commands/ask.d.ts.map +1 -0
- package/dist/cli/commands/ask.js +64 -0
- package/dist/cli/commands/ask.js.map +1 -0
- package/dist/cli/commands/capture.d.ts +5 -0
- package/dist/cli/commands/capture.d.ts.map +1 -0
- package/dist/cli/commands/capture.js +31 -0
- package/dist/cli/commands/capture.js.map +1 -0
- package/dist/cli/commands/forget.d.ts +3 -0
- package/dist/cli/commands/forget.d.ts.map +1 -0
- package/dist/cli/commands/forget.js +12 -0
- package/dist/cli/commands/forget.js.map +1 -0
- package/dist/cli/commands/get.d.ts +3 -0
- package/dist/cli/commands/get.d.ts.map +1 -0
- package/dist/cli/commands/get.js +28 -0
- package/dist/cli/commands/get.js.map +1 -0
- package/dist/cli/commands/hooks.d.ts +2 -0
- package/dist/cli/commands/hooks.d.ts.map +1 -0
- package/dist/cli/commands/hooks.js +136 -0
- package/dist/cli/commands/hooks.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +5 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +56 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/recent.d.ts +6 -0
- package/dist/cli/commands/recent.d.ts.map +1 -0
- package/dist/cli/commands/recent.js +21 -0
- package/dist/cli/commands/recent.js.map +1 -0
- package/dist/cli/commands/save.d.ts +8 -0
- package/dist/cli/commands/save.d.ts.map +1 -0
- package/dist/cli/commands/save.js +31 -0
- package/dist/cli/commands/save.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +5 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +28 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/search.d.ts +8 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +45 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +89 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/switch.d.ts +3 -0
- package/dist/cli/commands/switch.d.ts.map +1 -0
- package/dist/cli/commands/switch.js +18 -0
- package/dist/cli/commands/switch.js.map +1 -0
- package/dist/cli/core.d.ts +15 -0
- package/dist/cli/core.d.ts.map +1 -0
- package/dist/cli/core.js +18 -0
- package/dist/cli/core.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +157 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +22 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +74 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/compression/factory.d.ts +6 -0
- package/dist/compression/factory.d.ts.map +1 -0
- package/dist/compression/factory.js +8 -0
- package/dist/compression/factory.js.map +1 -0
- package/dist/compression/index.d.ts +10 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/index.js +2 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/compression/rule-compressor.d.ts +9 -0
- package/dist/compression/rule-compressor.d.ts.map +1 -0
- package/dist/compression/rule-compressor.js +43 -0
- package/dist/compression/rule-compressor.js.map +1 -0
- package/dist/memory-server/concept-store-enhanced.d.ts +88 -0
- package/dist/memory-server/concept-store-enhanced.d.ts.map +1 -0
- package/dist/memory-server/concept-store-enhanced.js +392 -0
- package/dist/memory-server/concept-store-enhanced.js.map +1 -0
- package/dist/memory-server/concept-store.d.ts +58 -0
- package/dist/memory-server/concept-store.d.ts.map +1 -0
- package/dist/memory-server/concept-store.js +329 -0
- package/dist/memory-server/concept-store.js.map +1 -0
- package/dist/memory-server/context-broker.d.ts +63 -0
- package/dist/memory-server/context-broker.d.ts.map +1 -0
- package/dist/memory-server/context-broker.js +340 -0
- package/dist/memory-server/context-broker.js.map +1 -0
- package/dist/memory-server/database.d.ts +108 -0
- package/dist/memory-server/database.d.ts.map +1 -0
- package/dist/memory-server/database.js +690 -0
- package/dist/memory-server/database.js.map +1 -0
- package/dist/project-manager.d.ts +77 -0
- package/dist/project-manager.d.ts.map +1 -0
- package/dist/project-manager.js +226 -0
- package/dist/project-manager.js.map +1 -0
- package/dist/security/data-retention.d.ts +104 -0
- package/dist/security/data-retention.d.ts.map +1 -0
- package/dist/security/data-retention.js +444 -0
- package/dist/security/data-retention.js.map +1 -0
- package/dist/security/encryption.d.ts +48 -0
- package/dist/security/encryption.d.ts.map +1 -0
- package/dist/security/encryption.js +131 -0
- package/dist/security/encryption.js.map +1 -0
- package/dist/security/pii-detector.d.ts +61 -0
- package/dist/security/pii-detector.d.ts.map +1 -0
- package/dist/security/pii-detector.js +220 -0
- package/dist/security/pii-detector.js.map +1 -0
- package/dist/types/index.d.ts +151 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +10 -0
- package/dist/utils/logger.js.map +1 -0
- 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 @@
|
|
|
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":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAe,EAAE,QAAgB,EAAE,IAEnE;IACC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEzD,+BAA+B;IAC/B,MAAM,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC5C,CAAC,EAAE,WAAW;QACd,CAAC,EAAE,KAAK;QACR,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;KACvD,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,gBAAgB,QAAQ,GAAG,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,MAAM,OAAO,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtI,MAAM,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,OAAO,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAEjE,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC;YAChB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE;YACf,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO;YACzB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;YACnB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;YACrB,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU;YAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU;YAC/B,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAgB;IAMjD,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAEtC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;QACxB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;QACjE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM;QAC7D,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;QAC7D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM;QAC/D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ;KACxD,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CACxC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAC9D,CAAC;IAEF,IAAI,MAAM,GAA2C,QAAQ,CAAC;IAC9D,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC;SACtE,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,MAAM,GAAG,SAAS,CAAC;SACjF,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC;IAE9E,IAAI,SAA6B,CAAC;IAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,SAAS,GAAG,OAAO,CAAC;SAC7C,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,SAAS,GAAG,WAAW,CAAC;SAC1D,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,SAAS,GAAG,MAAM,CAAC;IAE1D,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACtH,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AACzD,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|