@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.
- package/LICENSE +21 -0
- package/README.md +380 -0
- package/dist/cli/commands/git.d.ts +6 -0
- package/dist/cli/commands/git.d.ts.map +1 -0
- package/dist/cli/commands/git.js +298 -0
- package/dist/cli/commands/git.js.map +1 -0
- package/dist/cli/commands/hook-session-end.d.ts +7 -0
- package/dist/cli/commands/hook-session-end.d.ts.map +1 -0
- package/dist/cli/commands/hook-session-end.js +109 -0
- package/dist/cli/commands/hook-session-end.js.map +1 -0
- package/dist/cli/commands/hook-session-start.d.ts +7 -0
- package/dist/cli/commands/hook-session-start.d.ts.map +1 -0
- package/dist/cli/commands/hook-session-start.js +116 -0
- package/dist/cli/commands/hook-session-start.js.map +1 -0
- package/dist/cli/commands/import.d.ts +14 -0
- package/dist/cli/commands/import.d.ts.map +1 -0
- package/dist/cli/commands/import.js +527 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +32 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mcp-serve.d.ts +2 -0
- package/dist/cli/commands/mcp-serve.d.ts.map +1 -0
- package/dist/cli/commands/mcp-serve.js +5 -0
- package/dist/cli/commands/mcp-serve.js.map +1 -0
- package/dist/cli/commands/query.d.ts +8 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +83 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +10 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +504 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/start.d.ts +8 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +90 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +85 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +7 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +46 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/visualize.d.ts +8 -0
- package/dist/cli/commands/visualize.d.ts.map +1 -0
- package/dist/cli/commands/visualize.js +96 -0
- package/dist/cli/commands/visualize.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +114 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/db/index.d.ts +55 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +464 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +4 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +200 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/extractor/index.d.ts +27 -0
- package/dist/extractor/index.d.ts.map +1 -0
- package/dist/extractor/index.js +227 -0
- package/dist/extractor/index.js.map +1 -0
- package/dist/git/extractor.d.ts +30 -0
- package/dist/git/extractor.d.ts.map +1 -0
- package/dist/git/extractor.js +126 -0
- package/dist/git/extractor.js.map +1 -0
- package/dist/git/hooks.d.ts +36 -0
- package/dist/git/hooks.d.ts.map +1 -0
- package/dist/git/hooks.js +142 -0
- package/dist/git/hooks.js.map +1 -0
- package/dist/git/index.d.ts +69 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +250 -0
- package/dist/git/index.js.map +1 -0
- package/dist/indexer/index.d.ts +20 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +173 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/parsers/base.d.ts +19 -0
- package/dist/indexer/parsers/base.d.ts.map +1 -0
- package/dist/indexer/parsers/base.js +46 -0
- package/dist/indexer/parsers/base.js.map +1 -0
- package/dist/indexer/parsers/cpp.d.ts +3 -0
- package/dist/indexer/parsers/cpp.d.ts.map +1 -0
- package/dist/indexer/parsers/cpp.js +180 -0
- package/dist/indexer/parsers/cpp.js.map +1 -0
- package/dist/indexer/parsers/go.d.ts +3 -0
- package/dist/indexer/parsers/go.d.ts.map +1 -0
- package/dist/indexer/parsers/go.js +98 -0
- package/dist/indexer/parsers/go.js.map +1 -0
- package/dist/indexer/parsers/java.d.ts +3 -0
- package/dist/indexer/parsers/java.d.ts.map +1 -0
- package/dist/indexer/parsers/java.js +204 -0
- package/dist/indexer/parsers/java.js.map +1 -0
- package/dist/indexer/parsers/javascript.d.ts +3 -0
- package/dist/indexer/parsers/javascript.d.ts.map +1 -0
- package/dist/indexer/parsers/javascript.js +157 -0
- package/dist/indexer/parsers/javascript.js.map +1 -0
- package/dist/indexer/parsers/kotlin.d.ts +3 -0
- package/dist/indexer/parsers/kotlin.d.ts.map +1 -0
- package/dist/indexer/parsers/kotlin.js +182 -0
- package/dist/indexer/parsers/kotlin.js.map +1 -0
- package/dist/indexer/parsers/php.d.ts +3 -0
- package/dist/indexer/parsers/php.d.ts.map +1 -0
- package/dist/indexer/parsers/php.js +190 -0
- package/dist/indexer/parsers/php.js.map +1 -0
- package/dist/indexer/parsers/python.d.ts +3 -0
- package/dist/indexer/parsers/python.d.ts.map +1 -0
- package/dist/indexer/parsers/python.js +101 -0
- package/dist/indexer/parsers/python.js.map +1 -0
- package/dist/indexer/parsers/ruby.d.ts +3 -0
- package/dist/indexer/parsers/ruby.d.ts.map +1 -0
- package/dist/indexer/parsers/ruby.js +92 -0
- package/dist/indexer/parsers/ruby.js.map +1 -0
- package/dist/indexer/parsers/rust.d.ts +3 -0
- package/dist/indexer/parsers/rust.d.ts.map +1 -0
- package/dist/indexer/parsers/rust.js +190 -0
- package/dist/indexer/parsers/rust.js.map +1 -0
- package/dist/indexer/watcher-daemon.d.ts +2 -0
- package/dist/indexer/watcher-daemon.d.ts.map +1 -0
- package/dist/indexer/watcher-daemon.js +27 -0
- package/dist/indexer/watcher-daemon.js.map +1 -0
- package/dist/indexer/watcher.d.ts +7 -0
- package/dist/indexer/watcher.d.ts.map +1 -0
- package/dist/indexer/watcher.js +77 -0
- package/dist/indexer/watcher.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +241 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/proxy/interceptor-mockttp.d.ts +27 -0
- package/dist/proxy/interceptor-mockttp.d.ts.map +1 -0
- package/dist/proxy/interceptor-mockttp.js +274 -0
- package/dist/proxy/interceptor-mockttp.js.map +1 -0
- package/dist/proxy/proxy-daemon.d.ts +5 -0
- package/dist/proxy/proxy-daemon.d.ts.map +1 -0
- package/dist/proxy/proxy-daemon.js +26 -0
- package/dist/proxy/proxy-daemon.js.map +1 -0
- package/dist/query/index.d.ts +32 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +135 -0
- package/dist/query/index.js.map +1 -0
- package/dist/types/index.d.ts +89 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/visualize/index.d.ts +144 -0
- package/dist/visualize/index.d.ts.map +1 -0
- package/dist/visualize/index.js +707 -0
- package/dist/visualize/index.js.map +1 -0
- package/dist/visualize/server.d.ts +7 -0
- package/dist/visualize/server.d.ts.map +1 -0
- package/dist/visualize/server.js +77 -0
- package/dist/visualize/server.js.map +1 -0
- package/dist/visualize/template.d.ts +3 -0
- package/dist/visualize/template.d.ts.map +1 -0
- package/dist/visualize/template.js +3465 -0
- package/dist/visualize/template.js.map +1 -0
- 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"}
|