@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.
Files changed (102) hide show
  1. package/README.md +293 -208
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +2 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/__tests__/auth.team-key.test.js +16 -0
  6. package/dist/commands/__tests__/auth.team-key.test.js.map +1 -1
  7. package/dist/commands/__tests__/capture-api.test.d.ts +2 -0
  8. package/dist/commands/__tests__/capture-api.test.d.ts.map +1 -0
  9. package/dist/commands/__tests__/capture-api.test.js +88 -0
  10. package/dist/commands/__tests__/capture-api.test.js.map +1 -0
  11. package/dist/commands/__tests__/disable.test.d.ts +2 -0
  12. package/dist/commands/__tests__/disable.test.d.ts.map +1 -0
  13. package/dist/commands/__tests__/disable.test.js +103 -0
  14. package/dist/commands/__tests__/disable.test.js.map +1 -0
  15. package/dist/commands/__tests__/enable.test.d.ts +2 -0
  16. package/dist/commands/__tests__/enable.test.d.ts.map +1 -0
  17. package/dist/commands/__tests__/enable.test.js +103 -0
  18. package/dist/commands/__tests__/enable.test.js.map +1 -0
  19. package/dist/commands/__tests__/install-merge-hook.test.d.ts +2 -0
  20. package/dist/commands/__tests__/install-merge-hook.test.d.ts.map +1 -0
  21. package/dist/commands/__tests__/install-merge-hook.test.js +54 -0
  22. package/dist/commands/__tests__/install-merge-hook.test.js.map +1 -0
  23. package/dist/commands/auth/team-key.d.ts.map +1 -1
  24. package/dist/commands/auth/team-key.js +1 -1
  25. package/dist/commands/auth/team-key.js.map +1 -1
  26. package/dist/commands/memory/capture.d.ts +8 -0
  27. package/dist/commands/memory/capture.d.ts.map +1 -0
  28. package/dist/commands/memory/capture.js +173 -0
  29. package/dist/commands/memory/capture.js.map +1 -0
  30. package/dist/commands/memory/disable.d.ts +2 -0
  31. package/dist/commands/memory/disable.d.ts.map +1 -0
  32. package/dist/commands/memory/disable.js +20 -0
  33. package/dist/commands/memory/disable.js.map +1 -0
  34. package/dist/commands/memory/enable.d.ts +8 -0
  35. package/dist/commands/memory/enable.d.ts.map +1 -0
  36. package/dist/commands/memory/enable.js +81 -0
  37. package/dist/commands/memory/enable.js.map +1 -0
  38. package/dist/commands/memory/hooks.d.ts +45 -0
  39. package/dist/commands/memory/hooks.d.ts.map +1 -0
  40. package/dist/commands/memory/hooks.js +347 -0
  41. package/dist/commands/memory/hooks.js.map +1 -0
  42. package/dist/commands/memory/index.d.ts +3 -0
  43. package/dist/commands/memory/index.d.ts.map +1 -0
  44. package/dist/commands/memory/index.js +44 -0
  45. package/dist/commands/memory/index.js.map +1 -0
  46. package/dist/commands/memory/promote.d.ts +7 -0
  47. package/dist/commands/memory/promote.d.ts.map +1 -0
  48. package/dist/commands/memory/promote.js +38 -0
  49. package/dist/commands/memory/promote.js.map +1 -0
  50. package/dist/commands/memory/show.d.ts +2 -0
  51. package/dist/commands/memory/show.d.ts.map +1 -0
  52. package/dist/commands/memory/show.js +44 -0
  53. package/dist/commands/memory/show.js.map +1 -0
  54. package/dist/commands/memory/status.d.ts +2 -0
  55. package/dist/commands/memory/status.d.ts.map +1 -0
  56. package/dist/commands/memory/status.js +54 -0
  57. package/dist/commands/memory/status.js.map +1 -0
  58. package/dist/services/__tests__/memory.service.test.d.ts +2 -0
  59. package/dist/services/__tests__/memory.service.test.d.ts.map +1 -0
  60. package/dist/services/__tests__/memory.service.test.js +279 -0
  61. package/dist/services/__tests__/memory.service.test.js.map +1 -0
  62. package/dist/services/__tests__/transcript-parser.service.test.d.ts +2 -0
  63. package/dist/services/__tests__/transcript-parser.service.test.d.ts.map +1 -0
  64. package/dist/services/__tests__/transcript-parser.service.test.js +134 -0
  65. package/dist/services/__tests__/transcript-parser.service.test.js.map +1 -0
  66. package/dist/services/api/__tests__/api.real.test.js +11 -0
  67. package/dist/services/api/__tests__/api.real.test.js.map +1 -1
  68. package/dist/services/api/api.interface.d.ts +5 -1
  69. package/dist/services/api/api.interface.d.ts.map +1 -1
  70. package/dist/services/api/api.real.d.ts +2 -1
  71. package/dist/services/api/api.real.d.ts.map +1 -1
  72. package/dist/services/api/api.real.js +15 -1
  73. package/dist/services/api/api.real.js.map +1 -1
  74. package/dist/services/api/index.d.ts +1 -1
  75. package/dist/services/api/index.d.ts.map +1 -1
  76. package/dist/services/git.service.d.ts +1 -0
  77. package/dist/services/git.service.d.ts.map +1 -1
  78. package/dist/services/git.service.js +9 -0
  79. package/dist/services/git.service.js.map +1 -1
  80. package/dist/services/memory.service.d.ts +49 -0
  81. package/dist/services/memory.service.d.ts.map +1 -0
  82. package/dist/services/memory.service.js +450 -0
  83. package/dist/services/memory.service.js.map +1 -0
  84. package/dist/services/transcript-parser.service.d.ts +10 -0
  85. package/dist/services/transcript-parser.service.d.ts.map +1 -0
  86. package/dist/services/transcript-parser.service.js +96 -0
  87. package/dist/services/transcript-parser.service.js.map +1 -0
  88. package/dist/types/index.d.ts +1 -0
  89. package/dist/types/index.d.ts.map +1 -1
  90. package/dist/types/memory.d.ts +85 -0
  91. package/dist/types/memory.d.ts.map +1 -0
  92. package/dist/types/memory.js +2 -0
  93. package/dist/types/memory.js.map +1 -0
  94. package/dist/utils/__tests__/module-matcher.test.d.ts +2 -0
  95. package/dist/utils/__tests__/module-matcher.test.d.ts.map +1 -0
  96. package/dist/utils/__tests__/module-matcher.test.js +164 -0
  97. package/dist/utils/__tests__/module-matcher.test.js.map +1 -0
  98. package/dist/utils/module-matcher.d.ts +6 -0
  99. package/dist/utils/module-matcher.d.ts.map +1 -0
  100. package/dist/utils/module-matcher.js +94 -0
  101. package/dist/utils/module-matcher.js.map +1 -0
  102. 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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const decisionsCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ interface PromoteOptions {
2
+ branch?: string;
3
+ modules?: string;
4
+ }
5
+ export declare function promoteAction(options: PromoteOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=promote.d.ts.map
@@ -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,2 @@
1
+ export declare function showAction(name?: string): Promise<void>;
2
+ //# sourceMappingURL=show.d.ts.map
@@ -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,2 @@
1
+ export declare function statusAction(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory.service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.service.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/memory.service.test.ts"],"names":[],"mappings":""}