@kodus/cli 0.1.12 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +293 -208
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/auth.team-key.test.js +16 -0
- package/dist/commands/__tests__/auth.team-key.test.js.map +1 -1
- package/dist/commands/__tests__/capture-api.test.d.ts +2 -0
- package/dist/commands/__tests__/capture-api.test.d.ts.map +1 -0
- package/dist/commands/__tests__/capture-api.test.js +88 -0
- package/dist/commands/__tests__/capture-api.test.js.map +1 -0
- package/dist/commands/__tests__/disable.test.d.ts +2 -0
- package/dist/commands/__tests__/disable.test.d.ts.map +1 -0
- package/dist/commands/__tests__/disable.test.js +103 -0
- package/dist/commands/__tests__/disable.test.js.map +1 -0
- package/dist/commands/__tests__/enable.test.d.ts +2 -0
- package/dist/commands/__tests__/enable.test.d.ts.map +1 -0
- package/dist/commands/__tests__/enable.test.js +103 -0
- package/dist/commands/__tests__/enable.test.js.map +1 -0
- package/dist/commands/__tests__/install-merge-hook.test.d.ts +2 -0
- package/dist/commands/__tests__/install-merge-hook.test.d.ts.map +1 -0
- package/dist/commands/__tests__/install-merge-hook.test.js +54 -0
- package/dist/commands/__tests__/install-merge-hook.test.js.map +1 -0
- package/dist/commands/auth/team-key.d.ts.map +1 -1
- package/dist/commands/auth/team-key.js +1 -1
- package/dist/commands/auth/team-key.js.map +1 -1
- package/dist/commands/memory/capture.d.ts +8 -0
- package/dist/commands/memory/capture.d.ts.map +1 -0
- package/dist/commands/memory/capture.js +173 -0
- package/dist/commands/memory/capture.js.map +1 -0
- package/dist/commands/memory/disable.d.ts +2 -0
- package/dist/commands/memory/disable.d.ts.map +1 -0
- package/dist/commands/memory/disable.js +20 -0
- package/dist/commands/memory/disable.js.map +1 -0
- package/dist/commands/memory/enable.d.ts +8 -0
- package/dist/commands/memory/enable.d.ts.map +1 -0
- package/dist/commands/memory/enable.js +81 -0
- package/dist/commands/memory/enable.js.map +1 -0
- package/dist/commands/memory/hooks.d.ts +45 -0
- package/dist/commands/memory/hooks.d.ts.map +1 -0
- package/dist/commands/memory/hooks.js +347 -0
- package/dist/commands/memory/hooks.js.map +1 -0
- package/dist/commands/memory/index.d.ts +3 -0
- package/dist/commands/memory/index.d.ts.map +1 -0
- package/dist/commands/memory/index.js +44 -0
- package/dist/commands/memory/index.js.map +1 -0
- package/dist/commands/memory/promote.d.ts +7 -0
- package/dist/commands/memory/promote.d.ts.map +1 -0
- package/dist/commands/memory/promote.js +38 -0
- package/dist/commands/memory/promote.js.map +1 -0
- package/dist/commands/memory/show.d.ts +2 -0
- package/dist/commands/memory/show.d.ts.map +1 -0
- package/dist/commands/memory/show.js +44 -0
- package/dist/commands/memory/show.js.map +1 -0
- package/dist/commands/memory/status.d.ts +2 -0
- package/dist/commands/memory/status.d.ts.map +1 -0
- package/dist/commands/memory/status.js +54 -0
- package/dist/commands/memory/status.js.map +1 -0
- package/dist/services/__tests__/memory.service.test.d.ts +2 -0
- package/dist/services/__tests__/memory.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/memory.service.test.js +279 -0
- package/dist/services/__tests__/memory.service.test.js.map +1 -0
- package/dist/services/__tests__/transcript-parser.service.test.d.ts +2 -0
- package/dist/services/__tests__/transcript-parser.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/transcript-parser.service.test.js +134 -0
- package/dist/services/__tests__/transcript-parser.service.test.js.map +1 -0
- package/dist/services/api/__tests__/api.real.test.js +11 -0
- package/dist/services/api/__tests__/api.real.test.js.map +1 -1
- package/dist/services/api/api.interface.d.ts +5 -1
- package/dist/services/api/api.interface.d.ts.map +1 -1
- package/dist/services/api/api.real.d.ts +2 -1
- package/dist/services/api/api.real.d.ts.map +1 -1
- package/dist/services/api/api.real.js +15 -1
- package/dist/services/api/api.real.js.map +1 -1
- package/dist/services/api/index.d.ts +1 -1
- package/dist/services/api/index.d.ts.map +1 -1
- package/dist/services/git.service.d.ts +1 -0
- package/dist/services/git.service.d.ts.map +1 -1
- package/dist/services/git.service.js +9 -0
- package/dist/services/git.service.js.map +1 -1
- package/dist/services/memory.service.d.ts +49 -0
- package/dist/services/memory.service.d.ts.map +1 -0
- package/dist/services/memory.service.js +450 -0
- package/dist/services/memory.service.js.map +1 -0
- package/dist/services/transcript-parser.service.d.ts +10 -0
- package/dist/services/transcript-parser.service.d.ts.map +1 -0
- package/dist/services/transcript-parser.service.js +96 -0
- package/dist/services/transcript-parser.service.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/memory.d.ts +85 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +2 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/utils/__tests__/module-matcher.test.d.ts +2 -0
- package/dist/utils/__tests__/module-matcher.test.d.ts.map +1 -0
- package/dist/utils/__tests__/module-matcher.test.js +164 -0
- package/dist/utils/__tests__/module-matcher.test.js.map +1 -0
- package/dist/utils/module-matcher.d.ts +6 -0
- package/dist/utils/module-matcher.d.ts.map +1 -0
- package/dist/utils/module-matcher.js +94 -0
- package/dist/utils/module-matcher.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Constants
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
export const SUPPORTED_AGENTS = new Set(['claude', 'cursor', 'codex']);
|
|
8
|
+
const DECISIONS_CAPTURE_COMMAND_PREFIX = 'kodus decisions capture';
|
|
9
|
+
export const CLAUDE_CAPTURE_COMMANDS = {
|
|
10
|
+
userPromptSubmit: 'kodus decisions capture --agent claude-compatible --event user-prompt-submit',
|
|
11
|
+
stop: 'kodus decisions capture --agent claude-compatible --event stop',
|
|
12
|
+
postToolUseWrite: 'kodus decisions capture --agent claude-compatible --event post-tool-use-write',
|
|
13
|
+
postToolUseEdit: 'kodus decisions capture --agent claude-compatible --event post-tool-use-edit',
|
|
14
|
+
};
|
|
15
|
+
export const CODEX_NOTIFY_LINE = 'notify = ["kodus", "decisions", "capture", "--agent", "codex", "--event", "stop"]';
|
|
16
|
+
export const CODEX_NOTIFY_LINE_LEGACY = 'notify = ["kodus", "decisions", "capture", "--agent", "codex", "--event", "agent-turn-complete"]';
|
|
17
|
+
export const MERGE_HOOK_MARKER = '# kodus-memory-post-merge';
|
|
18
|
+
const MERGE_HOOK_END_MARKER = '# /kodus-memory-post-merge';
|
|
19
|
+
const MERGE_PROMOTE_COMMAND = 'kodus decisions promote';
|
|
20
|
+
const MERGE_HOOK_SCRIPT = `
|
|
21
|
+
${MERGE_HOOK_MARKER}
|
|
22
|
+
# Detect merged branch from the merge commit message
|
|
23
|
+
MERGED_BRANCH=$(git log -1 --merges --format=%s HEAD 2>/dev/null | sed -n "s/.*Merge branch '\\([^']*\\)'.*/\\1/p")
|
|
24
|
+
if [ -z "$MERGED_BRANCH" ]; then
|
|
25
|
+
MERGED_BRANCH=$(git log -1 --merges --format=%s HEAD 2>/dev/null | sed -n "s/.*Merge pull request .* from [^/]*\\/\\(.*\\)/\\1/p")
|
|
26
|
+
fi
|
|
27
|
+
if [ -n "$MERGED_BRANCH" ]; then
|
|
28
|
+
${MERGE_PROMOTE_COMMAND} --branch "$MERGED_BRANCH" &
|
|
29
|
+
fi
|
|
30
|
+
${MERGE_HOOK_END_MARKER}
|
|
31
|
+
`.trimStart();
|
|
32
|
+
export function parseAgents(rawAgents) {
|
|
33
|
+
const aliases = {
|
|
34
|
+
claude: 'claude',
|
|
35
|
+
'claude-code': 'claude',
|
|
36
|
+
cursor: 'cursor',
|
|
37
|
+
codex: 'codex',
|
|
38
|
+
};
|
|
39
|
+
const selected = new Set();
|
|
40
|
+
for (const token of rawAgents.split(',')) {
|
|
41
|
+
const normalized = token.trim().toLowerCase();
|
|
42
|
+
if (!normalized) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const mapped = aliases[normalized];
|
|
46
|
+
if (!mapped || !SUPPORTED_AGENTS.has(mapped)) {
|
|
47
|
+
throw new Error(`Unsupported agent: ${normalized}. Supported values: claude, cursor, codex`);
|
|
48
|
+
}
|
|
49
|
+
selected.add(mapped);
|
|
50
|
+
}
|
|
51
|
+
return selected;
|
|
52
|
+
}
|
|
53
|
+
export function resolveCodexConfigPath(rawPath) {
|
|
54
|
+
if (!rawPath) {
|
|
55
|
+
return path.join(os.homedir(), '.codex', 'config.toml');
|
|
56
|
+
}
|
|
57
|
+
if (rawPath.startsWith('~/')) {
|
|
58
|
+
return path.join(os.homedir(), rawPath.slice(2));
|
|
59
|
+
}
|
|
60
|
+
return path.resolve(rawPath);
|
|
61
|
+
}
|
|
62
|
+
async function readJsonObject(filePath) {
|
|
63
|
+
try {
|
|
64
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
65
|
+
const parsed = JSON.parse(content);
|
|
66
|
+
if (!isRecord(parsed)) {
|
|
67
|
+
throw new Error('JSON root must be an object');
|
|
68
|
+
}
|
|
69
|
+
return parsed;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (error.code === 'ENOENT') {
|
|
73
|
+
return {};
|
|
74
|
+
}
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function ensureObject(root, key) {
|
|
79
|
+
const existing = root[key];
|
|
80
|
+
if (isRecord(existing)) {
|
|
81
|
+
return existing;
|
|
82
|
+
}
|
|
83
|
+
const next = {};
|
|
84
|
+
root[key] = next;
|
|
85
|
+
return next;
|
|
86
|
+
}
|
|
87
|
+
function isRecord(value) {
|
|
88
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
89
|
+
}
|
|
90
|
+
function isKodusCaptureCommand(command) {
|
|
91
|
+
return command.includes(DECISIONS_CAPTURE_COMMAND_PREFIX);
|
|
92
|
+
}
|
|
93
|
+
function upsertHook(hooks, eventKey, matcherName, command) {
|
|
94
|
+
const existing = hooks[eventKey];
|
|
95
|
+
const matchers = Array.isArray(existing) ? existing : [];
|
|
96
|
+
if (!Array.isArray(existing)) {
|
|
97
|
+
hooks[eventKey] = matchers;
|
|
98
|
+
}
|
|
99
|
+
for (const matcherValue of matchers) {
|
|
100
|
+
if (!isRecord(matcherValue)) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const currentMatcher = typeof matcherValue.matcher === 'string' ? matcherValue.matcher : '';
|
|
104
|
+
if (currentMatcher !== matcherName) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const hooksArray = Array.isArray(matcherValue.hooks) ? matcherValue.hooks : [];
|
|
108
|
+
if (!Array.isArray(matcherValue.hooks)) {
|
|
109
|
+
matcherValue.hooks = hooksArray;
|
|
110
|
+
}
|
|
111
|
+
const alreadyExists = hooksArray.some((hookValue) => isRecord(hookValue) && hookValue.type === 'command' && hookValue.command === command);
|
|
112
|
+
if (alreadyExists) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
for (const hookValue of hooksArray) {
|
|
116
|
+
if (!isRecord(hookValue) || hookValue.type !== 'command' || typeof hookValue.command !== 'string') {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (isKodusCaptureCommand(hookValue.command)) {
|
|
120
|
+
hookValue.command = command;
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
hooksArray.push({ type: 'command', command });
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
matchers.push({
|
|
128
|
+
matcher: matcherName,
|
|
129
|
+
hooks: [
|
|
130
|
+
{
|
|
131
|
+
type: 'command',
|
|
132
|
+
command,
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
});
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
// Install functions
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
export async function installClaudeCompatibleHooks(repoRoot) {
|
|
142
|
+
const settingsPath = path.join(repoRoot, '.claude', 'settings.json');
|
|
143
|
+
const settings = await readJsonObject(settingsPath);
|
|
144
|
+
const hooks = ensureObject(settings, 'hooks');
|
|
145
|
+
let changed = false;
|
|
146
|
+
changed = upsertHook(hooks, 'UserPromptSubmit', '', CLAUDE_CAPTURE_COMMANDS.userPromptSubmit) || changed;
|
|
147
|
+
changed = upsertHook(hooks, 'Stop', '', CLAUDE_CAPTURE_COMMANDS.stop) || changed;
|
|
148
|
+
changed = upsertHook(hooks, 'PostToolUse', 'Write', CLAUDE_CAPTURE_COMMANDS.postToolUseWrite) || changed;
|
|
149
|
+
changed = upsertHook(hooks, 'PostToolUse', 'Edit', CLAUDE_CAPTURE_COMMANDS.postToolUseEdit) || changed;
|
|
150
|
+
if (changed) {
|
|
151
|
+
await fs.mkdir(path.dirname(settingsPath), { recursive: true });
|
|
152
|
+
await fs.writeFile(settingsPath, `${JSON.stringify(settings, null, 2)}\n`, 'utf-8');
|
|
153
|
+
}
|
|
154
|
+
return { settingsPath, changed };
|
|
155
|
+
}
|
|
156
|
+
export async function installCodexNotify(configPath) {
|
|
157
|
+
let content = '';
|
|
158
|
+
try {
|
|
159
|
+
content = await fs.readFile(configPath, 'utf-8');
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
if (error.code !== 'ENOENT') {
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const notifyLinePattern = /^notify\s*=\s*\[(?:[^\n]*)\]\s*$/m;
|
|
167
|
+
if (content.includes(CODEX_NOTIFY_LINE)) {
|
|
168
|
+
return { configPath, changed: false, skipped: false, reason: '' };
|
|
169
|
+
}
|
|
170
|
+
if (content.includes(CODEX_NOTIFY_LINE_LEGACY)) {
|
|
171
|
+
const nextContent = content.replace(CODEX_NOTIFY_LINE_LEGACY, CODEX_NOTIFY_LINE);
|
|
172
|
+
await fs.writeFile(configPath, nextContent, 'utf-8');
|
|
173
|
+
return { configPath, changed: true, skipped: false, reason: '' };
|
|
174
|
+
}
|
|
175
|
+
if (notifyLinePattern.test(content)) {
|
|
176
|
+
return {
|
|
177
|
+
configPath,
|
|
178
|
+
changed: false,
|
|
179
|
+
skipped: true,
|
|
180
|
+
reason: 'Existing `notify` entry found. Merge manually if you want Kodus decision capture.',
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
const nextContent = content.trim().length === 0
|
|
184
|
+
? `${CODEX_NOTIFY_LINE}\n`
|
|
185
|
+
: `${content.replace(/\s*$/, '')}\n${CODEX_NOTIFY_LINE}\n`;
|
|
186
|
+
await fs.mkdir(path.dirname(configPath), { recursive: true });
|
|
187
|
+
await fs.writeFile(configPath, nextContent, 'utf-8');
|
|
188
|
+
return { configPath, changed: true, skipped: false, reason: '' };
|
|
189
|
+
}
|
|
190
|
+
export async function installMergeHook(gitRoot) {
|
|
191
|
+
const hookPath = path.join(gitRoot, '.git', 'hooks', 'post-merge');
|
|
192
|
+
let existing = '';
|
|
193
|
+
try {
|
|
194
|
+
existing = await fs.readFile(hookPath, 'utf-8');
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
if (error.code !== 'ENOENT') {
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (existing.includes(MERGE_HOOK_MARKER)) {
|
|
202
|
+
return { hookPath, alreadyInstalled: true };
|
|
203
|
+
}
|
|
204
|
+
let content;
|
|
205
|
+
if (existing.trim().length === 0) {
|
|
206
|
+
content = `#!/bin/sh\n${MERGE_HOOK_SCRIPT}`;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
content = `${existing.replace(/\s*$/, '')}\n\n${MERGE_HOOK_SCRIPT}`;
|
|
210
|
+
}
|
|
211
|
+
await fs.mkdir(path.dirname(hookPath), { recursive: true });
|
|
212
|
+
await fs.writeFile(hookPath, content, { mode: 0o755 });
|
|
213
|
+
return { hookPath, alreadyInstalled: false };
|
|
214
|
+
}
|
|
215
|
+
export async function detectModules(srcPath) {
|
|
216
|
+
try {
|
|
217
|
+
const entries = await fs.readdir(srcPath, { withFileTypes: true });
|
|
218
|
+
const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
219
|
+
return dirs.map((dir) => ({
|
|
220
|
+
id: dir,
|
|
221
|
+
name: dir.charAt(0).toUpperCase() + dir.slice(1),
|
|
222
|
+
paths: [`src/${dir}/**`],
|
|
223
|
+
memoryFile: `.kody/memory/${dir}.md`,
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
// Remove functions (for disable)
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
export async function removeClaudeCompatibleHooks(repoRoot) {
|
|
234
|
+
const settingsPath = path.join(repoRoot, '.claude', 'settings.json');
|
|
235
|
+
let settings;
|
|
236
|
+
try {
|
|
237
|
+
settings = await readJsonObject(settingsPath);
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return { settingsPath, removed: false };
|
|
241
|
+
}
|
|
242
|
+
const hooks = settings.hooks;
|
|
243
|
+
if (!isRecord(hooks)) {
|
|
244
|
+
return { settingsPath, removed: false };
|
|
245
|
+
}
|
|
246
|
+
let removed = false;
|
|
247
|
+
for (const eventKey of Object.keys(hooks)) {
|
|
248
|
+
const matchers = hooks[eventKey];
|
|
249
|
+
if (!Array.isArray(matchers)) {
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
for (const matcher of matchers) {
|
|
253
|
+
if (!isRecord(matcher) || !Array.isArray(matcher.hooks)) {
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
const originalLength = matcher.hooks.length;
|
|
257
|
+
matcher.hooks = matcher.hooks.filter((h) => {
|
|
258
|
+
if (!isRecord(h))
|
|
259
|
+
return true;
|
|
260
|
+
return typeof h.command !== 'string' || !isKodusCaptureCommand(h.command);
|
|
261
|
+
});
|
|
262
|
+
if (matcher.hooks.length < originalLength) {
|
|
263
|
+
removed = true;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// Remove matchers with empty hooks arrays
|
|
267
|
+
hooks[eventKey] = matchers.filter((m) => {
|
|
268
|
+
if (!isRecord(m))
|
|
269
|
+
return true;
|
|
270
|
+
return Array.isArray(m.hooks) && m.hooks.length > 0;
|
|
271
|
+
});
|
|
272
|
+
// Remove event key if no matchers left
|
|
273
|
+
if (hooks[eventKey].length === 0) {
|
|
274
|
+
delete hooks[eventKey];
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Remove hooks key if empty
|
|
278
|
+
if (Object.keys(hooks).length === 0) {
|
|
279
|
+
delete settings.hooks;
|
|
280
|
+
}
|
|
281
|
+
if (removed) {
|
|
282
|
+
if (Object.keys(settings).length === 0) {
|
|
283
|
+
// If settings is now empty, write empty object
|
|
284
|
+
await fs.writeFile(settingsPath, '{}\n', 'utf-8');
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
await fs.writeFile(settingsPath, `${JSON.stringify(settings, null, 2)}\n`, 'utf-8');
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return { settingsPath, removed };
|
|
291
|
+
}
|
|
292
|
+
export async function removeCodexNotify(configPath) {
|
|
293
|
+
let content;
|
|
294
|
+
try {
|
|
295
|
+
content = await fs.readFile(configPath, 'utf-8');
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
return { configPath, removed: false };
|
|
299
|
+
}
|
|
300
|
+
if (!content.includes(CODEX_NOTIFY_LINE) && !content.includes(CODEX_NOTIFY_LINE_LEGACY)) {
|
|
301
|
+
return { configPath, removed: false };
|
|
302
|
+
}
|
|
303
|
+
const nextContent = content
|
|
304
|
+
.split('\n')
|
|
305
|
+
.filter((line) => line.trim() !== CODEX_NOTIFY_LINE && line.trim() !== CODEX_NOTIFY_LINE_LEGACY)
|
|
306
|
+
.join('\n')
|
|
307
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
308
|
+
.replace(/^\n+/, '')
|
|
309
|
+
.replace(/\n*$/, '\n');
|
|
310
|
+
await fs.writeFile(configPath, nextContent === '\n' ? '' : nextContent, 'utf-8');
|
|
311
|
+
return { configPath, removed: true };
|
|
312
|
+
}
|
|
313
|
+
export async function removeMergeHook(gitRoot) {
|
|
314
|
+
const hookPath = path.join(gitRoot, '.git', 'hooks', 'post-merge');
|
|
315
|
+
let content;
|
|
316
|
+
try {
|
|
317
|
+
content = await fs.readFile(hookPath, 'utf-8');
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return { hookPath, removed: false };
|
|
321
|
+
}
|
|
322
|
+
if (!content.includes(MERGE_HOOK_MARKER)) {
|
|
323
|
+
return { hookPath, removed: false };
|
|
324
|
+
}
|
|
325
|
+
// Remove kodus block:
|
|
326
|
+
// - Preferred: marker -> end marker (current format)
|
|
327
|
+
// - Legacy fallback: marker -> end-of-file (older format without end marker)
|
|
328
|
+
const lines = content.split('\n');
|
|
329
|
+
const startIdx = lines.findIndex((line) => line.trim() === MERGE_HOOK_MARKER);
|
|
330
|
+
if (startIdx === -1) {
|
|
331
|
+
return { hookPath, removed: false };
|
|
332
|
+
}
|
|
333
|
+
const endIdx = lines.findIndex((line, idx) => idx > startIdx && line.trim() === MERGE_HOOK_END_MARKER);
|
|
334
|
+
const filtered = endIdx === -1
|
|
335
|
+
? lines.slice(0, startIdx)
|
|
336
|
+
: [...lines.slice(0, startIdx), ...lines.slice(endIdx + 1)];
|
|
337
|
+
const remaining = filtered.join('\n').replace(/\n{3,}/g, '\n\n').replace(/\n*$/, '\n');
|
|
338
|
+
// If only shebang (or empty) remains, delete the file
|
|
339
|
+
if (remaining.trim() === '#!/bin/sh' || remaining.trim() === '') {
|
|
340
|
+
await fs.unlink(hookPath);
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
await fs.writeFile(hookPath, remaining, { mode: 0o755 });
|
|
344
|
+
}
|
|
345
|
+
return { hookPath, removed: true };
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/commands/memory/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,gBAAgB,SACiC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { enableAction } from './enable.js';
|
|
3
|
+
import { disableAction } from './disable.js';
|
|
4
|
+
import { captureAction } from './capture.js';
|
|
5
|
+
import { statusAction } from './status.js';
|
|
6
|
+
import { showAction } from './show.js';
|
|
7
|
+
import { promoteAction } from './promote.js';
|
|
8
|
+
export const decisionsCommand = new Command('decisions')
|
|
9
|
+
.description('Capture and persist coding-session decisions');
|
|
10
|
+
decisionsCommand
|
|
11
|
+
.command('enable')
|
|
12
|
+
.description('Install all hooks and initialize module config for decision capture')
|
|
13
|
+
.option('--agents <agents>', 'Comma-separated list: claude,cursor,codex', 'claude,cursor,codex')
|
|
14
|
+
.option('--codex-config <path>', 'Path to Codex config.toml (default: ~/.codex/config.toml)')
|
|
15
|
+
.option('--force', 'Overwrite existing modules.yml')
|
|
16
|
+
.action(enableAction);
|
|
17
|
+
decisionsCommand
|
|
18
|
+
.command('disable')
|
|
19
|
+
.description('Remove all decision hooks (preserves .kody/ data)')
|
|
20
|
+
.action(disableAction);
|
|
21
|
+
decisionsCommand
|
|
22
|
+
.command('capture')
|
|
23
|
+
.description('Internal hook command to persist decision capture')
|
|
24
|
+
.argument('[payload]', 'Optional payload JSON (used by Codex notify)')
|
|
25
|
+
.requiredOption('--agent <agent>', 'Agent name: claude-compatible, claude-code, cursor, codex')
|
|
26
|
+
.requiredOption('--event <event>', 'Hook event name')
|
|
27
|
+
.option('--summary <text>', 'Optional summary text')
|
|
28
|
+
.action(captureAction);
|
|
29
|
+
decisionsCommand
|
|
30
|
+
.command('status')
|
|
31
|
+
.description('Show current branch decision status')
|
|
32
|
+
.action(statusAction);
|
|
33
|
+
decisionsCommand
|
|
34
|
+
.command('show')
|
|
35
|
+
.description('Show PR decisions (current branch) or module decisions')
|
|
36
|
+
.argument('[name]', 'Module name or branch name')
|
|
37
|
+
.action(showAction);
|
|
38
|
+
decisionsCommand
|
|
39
|
+
.command('promote')
|
|
40
|
+
.description('Promote PR decisions to module decision files')
|
|
41
|
+
.option('--branch <name>', 'Branch name (default: current branch)')
|
|
42
|
+
.option('--modules <ids>', 'Comma-separated module IDs (default: all matched)')
|
|
43
|
+
.action(promoteAction);
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,8CAA8C,CAAC,CAAC;AAE/D,gBAAgB;KACb,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,EAAE,qBAAqB,CAAC;KAC/F,MAAM,CAAC,uBAAuB,EAAE,2DAA2D,CAAC;KAC5F,MAAM,CAAC,SAAS,EAAE,gCAAgC,CAAC;KACnD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,gBAAgB;KACb,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,gBAAgB;KACb,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,mDAAmD,CAAC;KAChE,QAAQ,CAAC,WAAW,EAAE,8CAA8C,CAAC;KACrE,cAAc,CAAC,iBAAiB,EAAE,2DAA2D,CAAC;KAC9F,cAAc,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;KACpD,MAAM,CAAC,kBAAkB,EAAE,uBAAuB,CAAC;KACnD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,gBAAgB;KACb,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,gBAAgB;KACb,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wDAAwD,CAAC;KACrE,QAAQ,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KAChD,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,gBAAgB;KACb,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;KAClE,MAAM,CAAC,iBAAiB,EAAE,mDAAmD,CAAC;KAC9E,MAAM,CAAC,aAAa,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/promote.ts"],"names":[],"mappings":"AAIA,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC1E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { gitService } from '../../services/git.service.js';
|
|
3
|
+
import { memoryService } from '../../services/memory.service.js';
|
|
4
|
+
export async function promoteAction(options) {
|
|
5
|
+
const isRepo = await gitService.isGitRepository();
|
|
6
|
+
if (!isRepo) {
|
|
7
|
+
console.error(chalk.red('Error: Not a git repository.'));
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
const repoRoot = (await gitService.getGitRoot()).trim();
|
|
11
|
+
let branch = options.branch;
|
|
12
|
+
if (!branch) {
|
|
13
|
+
try {
|
|
14
|
+
branch = (await gitService.getCurrentBranch()).trim();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
console.error(chalk.red('Error: Could not determine current branch. Use --branch to specify.'));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const moduleIds = options.modules
|
|
23
|
+
? options.modules.split(',').map((m) => m.trim()).filter(Boolean)
|
|
24
|
+
: undefined;
|
|
25
|
+
const result = await memoryService.promoteToModuleMemory(repoRoot, branch, moduleIds);
|
|
26
|
+
if (result.promoted === 0) {
|
|
27
|
+
console.log(chalk.dim('No decisions to promote.'));
|
|
28
|
+
if (result.modules.length === 0) {
|
|
29
|
+
console.log(chalk.dim('Check that modules.yml exists and PR memory has decisions with matching files.'));
|
|
30
|
+
}
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.log(chalk.green(`✓ Promoted ${result.promoted} decision(s) to ${result.modules.length} module(s):`));
|
|
34
|
+
for (const modId of result.modules) {
|
|
35
|
+
console.log(chalk.dim(` - .kody/memory/${modId}.md`));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=promote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../../src/commands/memory/promote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAOjE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAuB;IACzD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAExD,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;YAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO;QAC/B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACjE,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAEtF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC,CAAC;QAC3G,CAAC;QACD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,QAAQ,mBAAmB,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC;IAC7G,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,KAAK,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/show.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C7D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { gitService } from '../../services/git.service.js';
|
|
3
|
+
import { memoryService } from '../../services/memory.service.js';
|
|
4
|
+
export async function showAction(name) {
|
|
5
|
+
const isRepo = await gitService.isGitRepository();
|
|
6
|
+
if (!isRepo) {
|
|
7
|
+
console.error(chalk.red('Error: Not a git repository.'));
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
const repoRoot = (await gitService.getGitRoot()).trim();
|
|
11
|
+
if (!name) {
|
|
12
|
+
// Show current branch PR memory
|
|
13
|
+
let branch;
|
|
14
|
+
try {
|
|
15
|
+
branch = (await gitService.getCurrentBranch()).trim();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
console.error(chalk.red('Error: Could not determine current branch.'));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const prMemory = await memoryService.readPrMemory(repoRoot, branch);
|
|
23
|
+
if (!prMemory) {
|
|
24
|
+
console.log(chalk.dim(`No PR memory found for branch: ${branch}`));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
console.log(prMemory.content);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Try as module name first
|
|
31
|
+
const moduleContent = await memoryService.readModuleMemory(repoRoot, name);
|
|
32
|
+
if (moduleContent) {
|
|
33
|
+
console.log(moduleContent);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Try as branch name
|
|
37
|
+
const branchMemory = await memoryService.readPrMemory(repoRoot, name);
|
|
38
|
+
if (branchMemory) {
|
|
39
|
+
console.log(branchMemory.content);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
console.log(chalk.dim(`No memory found for: ${name}`));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/commands/memory/show.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAa;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAExD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,gCAAgC;QAChC,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,MAAM,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3E,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/status.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAoDlD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { gitService } from '../../services/git.service.js';
|
|
3
|
+
import { memoryService } from '../../services/memory.service.js';
|
|
4
|
+
import { loadConfig } from '../../utils/module-matcher.js';
|
|
5
|
+
export async function statusAction() {
|
|
6
|
+
const isRepo = await gitService.isGitRepository();
|
|
7
|
+
if (!isRepo) {
|
|
8
|
+
console.error(chalk.red('Error: Not a git repository.'));
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const repoRoot = (await gitService.getGitRoot()).trim();
|
|
12
|
+
let branch;
|
|
13
|
+
try {
|
|
14
|
+
branch = (await gitService.getCurrentBranch()).trim();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
console.error(chalk.red('Error: Could not determine current branch.'));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
console.log(chalk.bold(`Branch: ${branch}`));
|
|
22
|
+
console.log('');
|
|
23
|
+
// PR memory status
|
|
24
|
+
const prMemory = await memoryService.readPrMemory(repoRoot, branch);
|
|
25
|
+
if (prMemory && prMemory.meta) {
|
|
26
|
+
const meta = prMemory.meta;
|
|
27
|
+
console.log(chalk.green('PR Memory:'));
|
|
28
|
+
console.log(` Sessions: ${meta.sessionCount}`);
|
|
29
|
+
console.log(` Last SHA: ${meta.lastSha}`);
|
|
30
|
+
console.log(` Agent: ${meta.agent}`);
|
|
31
|
+
console.log(` Updated: ${meta.updatedAt}`);
|
|
32
|
+
// Count decisions in content
|
|
33
|
+
const decisionCount = (prMemory.content.match(/^### \[\w+\]/gm) || []).length;
|
|
34
|
+
const captureCount = (prMemory.content.match(/^### \d{4}-\d{2}-\d{2}T/gm) || []).length;
|
|
35
|
+
console.log(` Decisions: ${decisionCount}`);
|
|
36
|
+
console.log(` Captures: ${captureCount}`);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.log(chalk.dim('No PR memory for this branch yet.'));
|
|
40
|
+
}
|
|
41
|
+
console.log('');
|
|
42
|
+
// Module config status
|
|
43
|
+
const config = await loadConfig(repoRoot);
|
|
44
|
+
if (config) {
|
|
45
|
+
console.log(chalk.green(`Module config: ${config.modules.length} module(s)`));
|
|
46
|
+
for (const mod of config.modules) {
|
|
47
|
+
console.log(chalk.dim(` - ${mod.id}: ${mod.paths.join(', ')}`));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(chalk.dim('No module config found. Run `kodus decisions enable` to create one.'));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/memory/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.service.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/memory.service.test.ts"],"names":[],"mappings":""}
|