@rangerchaz/aimem 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +380 -0
  3. package/dist/cli/commands/git.d.ts +6 -0
  4. package/dist/cli/commands/git.d.ts.map +1 -0
  5. package/dist/cli/commands/git.js +298 -0
  6. package/dist/cli/commands/git.js.map +1 -0
  7. package/dist/cli/commands/hook-session-end.d.ts +7 -0
  8. package/dist/cli/commands/hook-session-end.d.ts.map +1 -0
  9. package/dist/cli/commands/hook-session-end.js +109 -0
  10. package/dist/cli/commands/hook-session-end.js.map +1 -0
  11. package/dist/cli/commands/hook-session-start.d.ts +7 -0
  12. package/dist/cli/commands/hook-session-start.d.ts.map +1 -0
  13. package/dist/cli/commands/hook-session-start.js +116 -0
  14. package/dist/cli/commands/hook-session-start.js.map +1 -0
  15. package/dist/cli/commands/import.d.ts +14 -0
  16. package/dist/cli/commands/import.d.ts.map +1 -0
  17. package/dist/cli/commands/import.js +527 -0
  18. package/dist/cli/commands/import.js.map +1 -0
  19. package/dist/cli/commands/init.d.ts +2 -0
  20. package/dist/cli/commands/init.d.ts.map +1 -0
  21. package/dist/cli/commands/init.js +32 -0
  22. package/dist/cli/commands/init.js.map +1 -0
  23. package/dist/cli/commands/mcp-serve.d.ts +2 -0
  24. package/dist/cli/commands/mcp-serve.d.ts.map +1 -0
  25. package/dist/cli/commands/mcp-serve.js +5 -0
  26. package/dist/cli/commands/mcp-serve.js.map +1 -0
  27. package/dist/cli/commands/query.d.ts +8 -0
  28. package/dist/cli/commands/query.d.ts.map +1 -0
  29. package/dist/cli/commands/query.js +83 -0
  30. package/dist/cli/commands/query.js.map +1 -0
  31. package/dist/cli/commands/setup.d.ts +10 -0
  32. package/dist/cli/commands/setup.d.ts.map +1 -0
  33. package/dist/cli/commands/setup.js +504 -0
  34. package/dist/cli/commands/setup.js.map +1 -0
  35. package/dist/cli/commands/start.d.ts +8 -0
  36. package/dist/cli/commands/start.d.ts.map +1 -0
  37. package/dist/cli/commands/start.js +90 -0
  38. package/dist/cli/commands/start.js.map +1 -0
  39. package/dist/cli/commands/status.d.ts +2 -0
  40. package/dist/cli/commands/status.d.ts.map +1 -0
  41. package/dist/cli/commands/status.js +85 -0
  42. package/dist/cli/commands/status.js.map +1 -0
  43. package/dist/cli/commands/stop.d.ts +7 -0
  44. package/dist/cli/commands/stop.d.ts.map +1 -0
  45. package/dist/cli/commands/stop.js +46 -0
  46. package/dist/cli/commands/stop.js.map +1 -0
  47. package/dist/cli/commands/visualize.d.ts +8 -0
  48. package/dist/cli/commands/visualize.d.ts.map +1 -0
  49. package/dist/cli/commands/visualize.js +96 -0
  50. package/dist/cli/commands/visualize.js.map +1 -0
  51. package/dist/cli/index.d.ts +3 -0
  52. package/dist/cli/index.d.ts.map +1 -0
  53. package/dist/cli/index.js +114 -0
  54. package/dist/cli/index.js.map +1 -0
  55. package/dist/db/index.d.ts +55 -0
  56. package/dist/db/index.d.ts.map +1 -0
  57. package/dist/db/index.js +464 -0
  58. package/dist/db/index.js.map +1 -0
  59. package/dist/db/schema.d.ts +4 -0
  60. package/dist/db/schema.d.ts.map +1 -0
  61. package/dist/db/schema.js +200 -0
  62. package/dist/db/schema.js.map +1 -0
  63. package/dist/extractor/index.d.ts +27 -0
  64. package/dist/extractor/index.d.ts.map +1 -0
  65. package/dist/extractor/index.js +227 -0
  66. package/dist/extractor/index.js.map +1 -0
  67. package/dist/git/extractor.d.ts +30 -0
  68. package/dist/git/extractor.d.ts.map +1 -0
  69. package/dist/git/extractor.js +126 -0
  70. package/dist/git/extractor.js.map +1 -0
  71. package/dist/git/hooks.d.ts +36 -0
  72. package/dist/git/hooks.d.ts.map +1 -0
  73. package/dist/git/hooks.js +142 -0
  74. package/dist/git/hooks.js.map +1 -0
  75. package/dist/git/index.d.ts +69 -0
  76. package/dist/git/index.d.ts.map +1 -0
  77. package/dist/git/index.js +250 -0
  78. package/dist/git/index.js.map +1 -0
  79. package/dist/indexer/index.d.ts +20 -0
  80. package/dist/indexer/index.d.ts.map +1 -0
  81. package/dist/indexer/index.js +173 -0
  82. package/dist/indexer/index.js.map +1 -0
  83. package/dist/indexer/parsers/base.d.ts +19 -0
  84. package/dist/indexer/parsers/base.d.ts.map +1 -0
  85. package/dist/indexer/parsers/base.js +46 -0
  86. package/dist/indexer/parsers/base.js.map +1 -0
  87. package/dist/indexer/parsers/cpp.d.ts +3 -0
  88. package/dist/indexer/parsers/cpp.d.ts.map +1 -0
  89. package/dist/indexer/parsers/cpp.js +180 -0
  90. package/dist/indexer/parsers/cpp.js.map +1 -0
  91. package/dist/indexer/parsers/go.d.ts +3 -0
  92. package/dist/indexer/parsers/go.d.ts.map +1 -0
  93. package/dist/indexer/parsers/go.js +98 -0
  94. package/dist/indexer/parsers/go.js.map +1 -0
  95. package/dist/indexer/parsers/java.d.ts +3 -0
  96. package/dist/indexer/parsers/java.d.ts.map +1 -0
  97. package/dist/indexer/parsers/java.js +204 -0
  98. package/dist/indexer/parsers/java.js.map +1 -0
  99. package/dist/indexer/parsers/javascript.d.ts +3 -0
  100. package/dist/indexer/parsers/javascript.d.ts.map +1 -0
  101. package/dist/indexer/parsers/javascript.js +157 -0
  102. package/dist/indexer/parsers/javascript.js.map +1 -0
  103. package/dist/indexer/parsers/kotlin.d.ts +3 -0
  104. package/dist/indexer/parsers/kotlin.d.ts.map +1 -0
  105. package/dist/indexer/parsers/kotlin.js +182 -0
  106. package/dist/indexer/parsers/kotlin.js.map +1 -0
  107. package/dist/indexer/parsers/php.d.ts +3 -0
  108. package/dist/indexer/parsers/php.d.ts.map +1 -0
  109. package/dist/indexer/parsers/php.js +190 -0
  110. package/dist/indexer/parsers/php.js.map +1 -0
  111. package/dist/indexer/parsers/python.d.ts +3 -0
  112. package/dist/indexer/parsers/python.d.ts.map +1 -0
  113. package/dist/indexer/parsers/python.js +101 -0
  114. package/dist/indexer/parsers/python.js.map +1 -0
  115. package/dist/indexer/parsers/ruby.d.ts +3 -0
  116. package/dist/indexer/parsers/ruby.d.ts.map +1 -0
  117. package/dist/indexer/parsers/ruby.js +92 -0
  118. package/dist/indexer/parsers/ruby.js.map +1 -0
  119. package/dist/indexer/parsers/rust.d.ts +3 -0
  120. package/dist/indexer/parsers/rust.d.ts.map +1 -0
  121. package/dist/indexer/parsers/rust.js +190 -0
  122. package/dist/indexer/parsers/rust.js.map +1 -0
  123. package/dist/indexer/watcher-daemon.d.ts +2 -0
  124. package/dist/indexer/watcher-daemon.d.ts.map +1 -0
  125. package/dist/indexer/watcher-daemon.js +27 -0
  126. package/dist/indexer/watcher-daemon.js.map +1 -0
  127. package/dist/indexer/watcher.d.ts +7 -0
  128. package/dist/indexer/watcher.d.ts.map +1 -0
  129. package/dist/indexer/watcher.js +77 -0
  130. package/dist/indexer/watcher.js.map +1 -0
  131. package/dist/mcp/server.d.ts +2 -0
  132. package/dist/mcp/server.d.ts.map +1 -0
  133. package/dist/mcp/server.js +241 -0
  134. package/dist/mcp/server.js.map +1 -0
  135. package/dist/proxy/interceptor-mockttp.d.ts +27 -0
  136. package/dist/proxy/interceptor-mockttp.d.ts.map +1 -0
  137. package/dist/proxy/interceptor-mockttp.js +274 -0
  138. package/dist/proxy/interceptor-mockttp.js.map +1 -0
  139. package/dist/proxy/proxy-daemon.d.ts +5 -0
  140. package/dist/proxy/proxy-daemon.d.ts.map +1 -0
  141. package/dist/proxy/proxy-daemon.js +26 -0
  142. package/dist/proxy/proxy-daemon.js.map +1 -0
  143. package/dist/query/index.d.ts +32 -0
  144. package/dist/query/index.d.ts.map +1 -0
  145. package/dist/query/index.js +135 -0
  146. package/dist/query/index.js.map +1 -0
  147. package/dist/types/index.d.ts +89 -0
  148. package/dist/types/index.d.ts.map +1 -0
  149. package/dist/types/index.js +3 -0
  150. package/dist/types/index.js.map +1 -0
  151. package/dist/visualize/index.d.ts +144 -0
  152. package/dist/visualize/index.d.ts.map +1 -0
  153. package/dist/visualize/index.js +707 -0
  154. package/dist/visualize/index.js.map +1 -0
  155. package/dist/visualize/server.d.ts +7 -0
  156. package/dist/visualize/server.d.ts.map +1 -0
  157. package/dist/visualize/server.js +77 -0
  158. package/dist/visualize/server.js.map +1 -0
  159. package/dist/visualize/template.d.ts +3 -0
  160. package/dist/visualize/template.d.ts.map +1 -0
  161. package/dist/visualize/template.js +3465 -0
  162. package/dist/visualize/template.js.map +1 -0
  163. package/package.json +56 -0
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Git integration commands for aimem
3
+ */
4
+ import { Command } from 'commander';
5
+ import chalk from 'chalk';
6
+ import { getProjectByPath, upsertCommit, createCommitLink, getUncommittedExtractions, getCommitByHash, searchCommits, getRecentCommits } from '../../db/index.js';
7
+ import { isGitRepo, getCommits, getHeadCommit, getBlame } from '../../git/index.js';
8
+ import { extractFromCommit, hasDecisionContent } from '../../git/extractor.js';
9
+ import { installHook, removeHook, getHooksStatus } from '../../git/hooks.js';
10
+ export const gitCommand = new Command('git')
11
+ .description('Git integration commands');
12
+ // aimem git import
13
+ gitCommand
14
+ .command('import')
15
+ .description('Import git commit history')
16
+ .option('-n, --limit <count>', 'Maximum commits to import', '100')
17
+ .option('-s, --since <date>', 'Import commits since date')
18
+ .option('--dry-run', 'Show what would be imported')
19
+ .action(async (options) => {
20
+ const cwd = process.cwd();
21
+ if (!isGitRepo(cwd)) {
22
+ console.log(chalk.red('Not a git repository'));
23
+ process.exit(1);
24
+ }
25
+ const project = getProjectByPath(cwd);
26
+ if (!project) {
27
+ console.log(chalk.red('Not an aimem project. Run `aimem init` first.'));
28
+ process.exit(1);
29
+ }
30
+ console.log(chalk.bold('Importing git history...\n'));
31
+ const commits = await getCommits(cwd, {
32
+ limit: parseInt(options.limit, 10),
33
+ since: options.since,
34
+ });
35
+ if (commits.length === 0) {
36
+ console.log(chalk.yellow('No commits found'));
37
+ return;
38
+ }
39
+ let imported = 0;
40
+ let extracted = 0;
41
+ for (const commit of commits) {
42
+ if (options.dryRun) {
43
+ const hasContent = hasDecisionContent(commit);
44
+ console.log(`${commit.shortHash} ${commit.subject.slice(0, 60)}${hasContent ? chalk.green(' [decision]') : ''}`);
45
+ if (hasContent)
46
+ extracted++;
47
+ imported++;
48
+ continue;
49
+ }
50
+ // Upsert commit
51
+ const dbCommit = upsertCommit(project.id, commit.hash, commit.shortHash, commit.authorName, commit.authorEmail, commit.timestamp, commit.subject, commit.body, commit.parentHashes);
52
+ // Extract decisions from commit message
53
+ const extractions = extractFromCommit(commit);
54
+ if (extractions.length > 0) {
55
+ extracted += extractions.length;
56
+ console.log(`${chalk.green('✓')} ${commit.shortHash} - ${extractions.length} extraction(s)`);
57
+ }
58
+ imported++;
59
+ }
60
+ console.log(chalk.gray(`\nImported ${imported} commits, found ${extracted} extractions`));
61
+ if (options.dryRun) {
62
+ console.log(chalk.yellow('\nDry run - no changes made'));
63
+ }
64
+ });
65
+ // aimem git link
66
+ gitCommand
67
+ .command('link')
68
+ .description('Link decisions to commits')
69
+ .option('-c, --commit <hash>', 'Link to specific commit')
70
+ .option('-r, --recent <n>', 'Link last N uncommitted decisions to HEAD')
71
+ .option('--auto', 'Auto-detect uncommitted decisions and link to HEAD')
72
+ .action(async (options) => {
73
+ const cwd = process.cwd();
74
+ if (!isGitRepo(cwd)) {
75
+ console.log(chalk.red('Not a git repository'));
76
+ process.exit(1);
77
+ }
78
+ const project = getProjectByPath(cwd);
79
+ if (!project) {
80
+ console.log(chalk.red('Not an aimem project. Run `aimem init` first.'));
81
+ process.exit(1);
82
+ }
83
+ const headHash = getHeadCommit(cwd);
84
+ if (!headHash) {
85
+ console.log(chalk.red('No commits in repository'));
86
+ process.exit(1);
87
+ }
88
+ const targetHash = options.commit || headHash;
89
+ let commit = getCommitByHash(project.id, targetHash);
90
+ // Import commit if not in DB
91
+ if (!commit) {
92
+ const gitCommit = (await getCommits(cwd, { limit: 1 }))[0];
93
+ if (!gitCommit || gitCommit.hash !== targetHash) {
94
+ console.log(chalk.red(`Commit ${targetHash} not found`));
95
+ process.exit(1);
96
+ }
97
+ commit = upsertCommit(project.id, gitCommit.hash, gitCommit.shortHash, gitCommit.authorName, gitCommit.authorEmail, gitCommit.timestamp, gitCommit.subject, gitCommit.body, gitCommit.parentHashes);
98
+ }
99
+ // Get uncommitted extractions
100
+ const extractions = getUncommittedExtractions(project.id);
101
+ if (extractions.length === 0) {
102
+ console.log(chalk.yellow('No uncommitted decisions to link'));
103
+ return;
104
+ }
105
+ const limit = options.recent ? parseInt(options.recent, 10) : extractions.length;
106
+ const toLink = extractions.slice(0, limit);
107
+ console.log(chalk.bold(`Linking ${toLink.length} decision(s) to ${commit.short_hash}...\n`));
108
+ let linked = 0;
109
+ for (const ext of toLink) {
110
+ const link = createCommitLink(commit.id, 'extraction', ext.id, 'committed_in');
111
+ if (link) {
112
+ console.log(`${chalk.green('✓')} ${ext.content.slice(0, 60)}...`);
113
+ linked++;
114
+ }
115
+ }
116
+ console.log(chalk.gray(`\nLinked ${linked} decisions to commit ${commit.short_hash}`));
117
+ });
118
+ // aimem git search
119
+ gitCommand
120
+ .command('search <query>')
121
+ .description('Search commit history')
122
+ .option('-n, --limit <count>', 'Maximum results', '20')
123
+ .action(async (query, options) => {
124
+ const cwd = process.cwd();
125
+ const project = getProjectByPath(cwd);
126
+ const projectId = project?.id;
127
+ const commits = searchCommits(query, parseInt(options.limit, 10), projectId);
128
+ if (commits.length === 0) {
129
+ console.log(chalk.yellow('No commits found'));
130
+ return;
131
+ }
132
+ for (const commit of commits) {
133
+ console.log(`${chalk.cyan(commit.short_hash || commit.hash.slice(0, 7))} ${commit.subject}`);
134
+ console.log(chalk.gray(` ${commit.author_name} <${commit.author_email}> - ${commit.timestamp}`));
135
+ }
136
+ });
137
+ // aimem git recent
138
+ gitCommand
139
+ .command('recent')
140
+ .description('Show recent commits')
141
+ .option('-n, --limit <count>', 'Number of commits', '10')
142
+ .action(async (options) => {
143
+ const cwd = process.cwd();
144
+ const project = getProjectByPath(cwd);
145
+ if (!project) {
146
+ console.log(chalk.red('Not an aimem project'));
147
+ process.exit(1);
148
+ }
149
+ const commits = getRecentCommits(project.id, parseInt(options.limit, 10));
150
+ if (commits.length === 0) {
151
+ console.log(chalk.yellow('No commits in database. Run `aimem git import` first.'));
152
+ return;
153
+ }
154
+ for (const commit of commits) {
155
+ console.log(`${chalk.cyan(commit.short_hash || commit.hash.slice(0, 7))} ${commit.subject}`);
156
+ }
157
+ });
158
+ // aimem git blame <file>
159
+ gitCommand
160
+ .command('blame <file>')
161
+ .description('Show git blame with aimem context')
162
+ .option('-L, --lines <range>', 'Line range (e.g., 10,20)')
163
+ .action(async (file, options) => {
164
+ const cwd = process.cwd();
165
+ if (!isGitRepo(cwd)) {
166
+ console.log(chalk.red('Not a git repository'));
167
+ process.exit(1);
168
+ }
169
+ const blameData = await getBlame(cwd, file);
170
+ if (blameData.length === 0) {
171
+ console.log(chalk.yellow('No blame data available'));
172
+ return;
173
+ }
174
+ // Group consecutive lines by the same commit
175
+ let currentHash = '';
176
+ let count = 0;
177
+ for (const blame of blameData) {
178
+ if (blame.hash !== currentHash) {
179
+ if (currentHash)
180
+ console.log();
181
+ currentHash = blame.hash;
182
+ count = 1;
183
+ console.log(chalk.cyan(`${blame.hash.slice(0, 7)} (${blame.author}, ${blame.timestamp.split('T')[0]})`));
184
+ }
185
+ else {
186
+ count++;
187
+ }
188
+ // Only show first few lines per commit
189
+ if (count <= 3) {
190
+ console.log(chalk.gray(` ${blame.lineNumber}`));
191
+ }
192
+ else if (count === 4) {
193
+ console.log(chalk.gray(` ... more lines`));
194
+ }
195
+ }
196
+ });
197
+ // aimem git hooks
198
+ const hooksCommand = new Command('hooks')
199
+ .description('Manage git hooks');
200
+ hooksCommand
201
+ .command('install')
202
+ .description('Install git hooks')
203
+ .option('--post-commit', 'Install post-commit hook (auto-link decisions)')
204
+ .option('--pre-push', 'Install pre-push hook (auto-import commits)')
205
+ .option('-a, --all', 'Install all hooks')
206
+ .option('-f, --force', 'Overwrite existing hooks')
207
+ .action((options) => {
208
+ const cwd = process.cwd();
209
+ if (!isGitRepo(cwd)) {
210
+ console.log(chalk.red('Not a git repository'));
211
+ process.exit(1);
212
+ }
213
+ const hooks = [];
214
+ if (options.all || options.postCommit)
215
+ hooks.push('post-commit');
216
+ if (options.all || options.prePush)
217
+ hooks.push('pre-push');
218
+ if (hooks.length === 0) {
219
+ hooks.push('post-commit'); // Default to post-commit
220
+ }
221
+ for (const hook of hooks) {
222
+ const result = installHook(cwd, hook, { force: options.force });
223
+ if (result.success) {
224
+ console.log(chalk.green(`✓ ${result.message}`));
225
+ }
226
+ else {
227
+ console.log(chalk.red(`✗ ${result.message}`));
228
+ }
229
+ }
230
+ });
231
+ hooksCommand
232
+ .command('remove')
233
+ .description('Remove git hooks')
234
+ .option('--post-commit', 'Remove post-commit hook')
235
+ .option('--pre-push', 'Remove pre-push hook')
236
+ .option('-a, --all', 'Remove all hooks')
237
+ .action((options) => {
238
+ const cwd = process.cwd();
239
+ if (!isGitRepo(cwd)) {
240
+ console.log(chalk.red('Not a git repository'));
241
+ process.exit(1);
242
+ }
243
+ const hooks = [];
244
+ if (options.all) {
245
+ hooks.push('post-commit', 'pre-push');
246
+ }
247
+ else {
248
+ if (options.postCommit)
249
+ hooks.push('post-commit');
250
+ if (options.prePush)
251
+ hooks.push('pre-push');
252
+ }
253
+ if (hooks.length === 0) {
254
+ console.log(chalk.yellow('Specify a hook to remove (--post-commit, --pre-push, or --all)'));
255
+ return;
256
+ }
257
+ for (const hook of hooks) {
258
+ const result = removeHook(cwd, hook);
259
+ if (result.success) {
260
+ console.log(chalk.green(`✓ ${result.message}`));
261
+ }
262
+ else {
263
+ console.log(chalk.red(`✗ ${result.message}`));
264
+ }
265
+ }
266
+ });
267
+ hooksCommand
268
+ .command('status')
269
+ .description('Show status of installed hooks')
270
+ .action(() => {
271
+ const cwd = process.cwd();
272
+ if (!isGitRepo(cwd)) {
273
+ console.log(chalk.red('Not a git repository'));
274
+ process.exit(1);
275
+ }
276
+ const status = getHooksStatus(cwd);
277
+ console.log(chalk.bold('Git hooks status:\n'));
278
+ for (const [hook, state] of Object.entries(status)) {
279
+ let icon;
280
+ let color;
281
+ switch (state) {
282
+ case 'installed':
283
+ icon = '✓';
284
+ color = chalk.green;
285
+ break;
286
+ case 'other':
287
+ icon = '?';
288
+ color = chalk.yellow;
289
+ break;
290
+ default:
291
+ icon = '✗';
292
+ color = chalk.gray;
293
+ }
294
+ console.log(`${color(icon)} ${hook}: ${state}`);
295
+ }
296
+ });
297
+ gitCommand.addCommand(hooksCommand);
298
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/cli/commands/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Hook: SessionEnd
3
+ * Called by Claude Code at the end of each session.
4
+ * Reads the conversation transcript, extracts decisions/patterns, and stores them.
5
+ */
6
+ export declare function hookSessionEndCommand(): Promise<void>;
7
+ //# sourceMappingURL=hook-session-end.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-session-end.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/hook-session-end.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiCH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgI3D"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Hook: SessionEnd
3
+ * Called by Claude Code at the end of each session.
4
+ * Reads the conversation transcript, extracts decisions/patterns, and stores them.
5
+ */
6
+ import { readFileSync, existsSync } from 'fs';
7
+ import { findProjectForPath, insertConversation, insertExtraction, createLink, getStructuresByName, ensureDataDir, isDuplicateExtraction, } from '../../db/index.js';
8
+ import { extractDecisions, generateSummary, } from '../../extractor/index.js';
9
+ export async function hookSessionEndCommand() {
10
+ try {
11
+ ensureDataDir();
12
+ // Read hook input from stdin
13
+ let inputRaw = '';
14
+ try {
15
+ inputRaw = readFileSync(0, 'utf-8');
16
+ }
17
+ catch {
18
+ outputResult({ success: false, error: 'No input provided' });
19
+ return;
20
+ }
21
+ if (!inputRaw.trim()) {
22
+ outputResult({ success: false, error: 'Empty input' });
23
+ return;
24
+ }
25
+ const input = JSON.parse(inputRaw);
26
+ const { cwd, transcript_path, session_id } = input;
27
+ // Find project for current directory
28
+ const project = findProjectForPath(cwd);
29
+ // Read transcript file (JSONL format - one JSON object per line)
30
+ if (!transcript_path || !existsSync(transcript_path)) {
31
+ outputResult({ success: false, error: 'Transcript file not found' });
32
+ return;
33
+ }
34
+ const transcriptRaw = readFileSync(transcript_path, 'utf-8');
35
+ const lines = transcriptRaw.split('\n').filter(line => line.trim());
36
+ if (lines.length === 0) {
37
+ outputResult({ success: false, error: 'Empty transcript' });
38
+ return;
39
+ }
40
+ // Parse JSONL
41
+ const messages = [];
42
+ for (const line of lines) {
43
+ try {
44
+ messages.push(JSON.parse(line));
45
+ }
46
+ catch {
47
+ // Skip malformed lines
48
+ continue;
49
+ }
50
+ }
51
+ if (messages.length === 0) {
52
+ outputResult({ success: false, error: 'No valid messages in transcript' });
53
+ return;
54
+ }
55
+ // Generate summary
56
+ const summary = generateSummary(messages);
57
+ // Store conversation
58
+ const conversation = insertConversation(transcriptRaw, project?.id || null, 'claude', 'claude-code', `[${session_id}] ${summary}`);
59
+ // Extract decisions and patterns
60
+ const extractions = extractDecisions(messages);
61
+ let linkedCount = 0;
62
+ let storedCount = 0;
63
+ let skippedCount = 0;
64
+ // Store extractions and link to code structures (with deduplication)
65
+ for (const ext of extractions) {
66
+ // Check for duplicates before storing
67
+ if (isDuplicateExtraction(ext.content, project?.id || null)) {
68
+ skippedCount++;
69
+ continue;
70
+ }
71
+ const extraction = insertExtraction(conversation.id, ext.type, ext.content, ext.metadata);
72
+ storedCount++;
73
+ // Link to mentioned code structures (if project is indexed)
74
+ if (project) {
75
+ for (const entityName of ext.mentionedEntities) {
76
+ const structures = getStructuresByName(entityName, project.id);
77
+ for (const structure of structures) {
78
+ try {
79
+ // Link extraction to structure
80
+ createLink('extraction', extraction.id, 'structure', structure.id, ext.type === 'decision' ? 'decision' : 'rejected');
81
+ linkedCount++;
82
+ }
83
+ catch {
84
+ // Ignore duplicate link errors
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ outputResult({
91
+ success: true,
92
+ conversationId: conversation.id,
93
+ extractionsCount: storedCount,
94
+ });
95
+ // Log to stderr for debugging (won't interfere with JSON output)
96
+ const dupeInfo = skippedCount > 0 ? ` (${skippedCount} duplicates skipped)` : '';
97
+ console.error(`[aimem] SessionEnd: Stored conversation #${conversation.id}, ${storedCount} extractions${dupeInfo}, ${linkedCount} links`);
98
+ }
99
+ catch (error) {
100
+ outputResult({
101
+ success: false,
102
+ error: error.message
103
+ });
104
+ }
105
+ }
106
+ function outputResult(result) {
107
+ console.log(JSON.stringify(result));
108
+ }
109
+ //# sourceMappingURL=hook-session-end.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-session-end.js","sourceRoot":"","sources":["../../../src/cli/commands/hook-session-end.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Hook: SessionStart
3
+ * Called by Claude Code at the start of each session.
4
+ * Loads relevant context from aimem and injects it into the conversation.
5
+ */
6
+ export declare function hookSessionStartCommand(): Promise<void>;
7
+ //# sourceMappingURL=hook-session-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-session-start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/hook-session-start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoCH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiH7D"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Hook: SessionStart
3
+ * Called by Claude Code at the start of each session.
4
+ * Loads relevant context from aimem and injects it into the conversation.
5
+ */
6
+ import { readFileSync, appendFileSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { homedir } from 'os';
9
+ import { findProjectForPath, getDb, ensureDataDir, } from '../../db/index.js';
10
+ function debugLog(message) {
11
+ try {
12
+ const logPath = join(homedir(), '.aimem', 'hook-debug.log');
13
+ appendFileSync(logPath, `[${new Date().toISOString()}] ${message}\n`);
14
+ }
15
+ catch {
16
+ // Ignore logging errors
17
+ }
18
+ }
19
+ export async function hookSessionStartCommand() {
20
+ try {
21
+ ensureDataDir();
22
+ debugLog('SessionStart hook invoked');
23
+ // Read hook input from stdin
24
+ let inputRaw = '';
25
+ try {
26
+ inputRaw = readFileSync(0, 'utf-8');
27
+ debugLog(`Input received: ${inputRaw.slice(0, 200)}`);
28
+ }
29
+ catch (e) {
30
+ // No stdin provided - this is OK, just return empty
31
+ debugLog(`No stdin: ${e.message}`);
32
+ outputResult({});
33
+ return;
34
+ }
35
+ if (!inputRaw.trim()) {
36
+ debugLog('Empty input');
37
+ outputResult({});
38
+ return;
39
+ }
40
+ let input;
41
+ try {
42
+ input = JSON.parse(inputRaw);
43
+ }
44
+ catch (e) {
45
+ debugLog(`JSON parse error: ${e.message}`);
46
+ outputResult({});
47
+ return;
48
+ }
49
+ const { cwd } = input;
50
+ debugLog(`CWD: ${cwd}`);
51
+ // Find project for current directory
52
+ const project = findProjectForPath(cwd);
53
+ if (!project) {
54
+ debugLog('No project found for path');
55
+ outputResult({});
56
+ return;
57
+ }
58
+ debugLog(`Found project: ${project.name} (id: ${project.id})`);
59
+ // Query recent decisions and rejections for this project
60
+ const db = getDb();
61
+ // Get recent extractions (decisions and rejections)
62
+ const recentExtractions = db.prepare(`
63
+ SELECT e.content, e.type, c.timestamp, e.metadata
64
+ FROM extractions e
65
+ JOIN conversations c ON e.conversation_id = c.id
66
+ WHERE c.project_id = ?
67
+ AND e.type IN ('decision', 'rejection')
68
+ ORDER BY c.timestamp DESC
69
+ LIMIT 15
70
+ `).all(project.id);
71
+ debugLog(`Found ${recentExtractions.length} extractions`);
72
+ if (recentExtractions.length === 0) {
73
+ outputResult({});
74
+ return;
75
+ }
76
+ // Group by type
77
+ const decisions = recentExtractions.filter(e => e.type === 'decision');
78
+ const rejections = recentExtractions.filter(e => e.type === 'rejection');
79
+ // Format context for injection
80
+ let context = `## Previous Context (from aimem)\n\n`;
81
+ context += `Project: ${project.name}\n\n`;
82
+ if (decisions.length > 0) {
83
+ context += `### Decisions Made\n`;
84
+ for (const d of decisions.slice(0, 8)) {
85
+ context += `- ${d.content}\n`;
86
+ }
87
+ context += '\n';
88
+ }
89
+ if (rejections.length > 0) {
90
+ context += `### Approaches Rejected\n`;
91
+ for (const r of rejections.slice(0, 5)) {
92
+ context += `- ${r.content}\n`;
93
+ }
94
+ context += '\n';
95
+ }
96
+ context += `_Context loaded from ${recentExtractions.length} previous conversation extractions._\n`;
97
+ debugLog('Outputting context');
98
+ // Output with additionalContext for Claude Code to inject
99
+ outputResult({
100
+ hookSpecificOutput: {
101
+ hookEventName: 'SessionStart',
102
+ additionalContext: context
103
+ }
104
+ });
105
+ }
106
+ catch (error) {
107
+ // On error, output empty result (don't block session start)
108
+ // DO NOT use console.error - it causes Claude Code to think there was an error
109
+ debugLog(`Error: ${error.message}`);
110
+ outputResult({});
111
+ }
112
+ }
113
+ function outputResult(result) {
114
+ console.log(JSON.stringify(result));
115
+ }
116
+ //# sourceMappingURL=hook-session-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-session-start.js","sourceRoot":"","sources":["../../../src/cli/commands/hook-session-start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Import command: Import old conversations from various AI coding tools
3
+ */
4
+ type ImportSource = 'claude' | 'aider' | 'continue' | 'all';
5
+ interface ImportOptions {
6
+ project?: string;
7
+ source?: ImportSource;
8
+ dryRun?: boolean;
9
+ limit?: number;
10
+ full?: boolean;
11
+ }
12
+ export declare function importCommand(options: ImportOptions): Promise<void>;
13
+ export {};
14
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/import.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH,KAAK,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC;AAE5D,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAohBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FzE"}