@mesadev/agentblame 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 (58) hide show
  1. package/dist/blame.d.ts +14 -0
  2. package/dist/blame.js +252 -0
  3. package/dist/blame.js.map +1 -0
  4. package/dist/capture.d.ts +16 -0
  5. package/dist/capture.js +284 -0
  6. package/dist/capture.js.map +1 -0
  7. package/dist/cleanup.d.ts +10 -0
  8. package/dist/cleanup.js +136 -0
  9. package/dist/cleanup.js.map +1 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.js +240 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/db.d.ts +53 -0
  14. package/dist/lib/db.js +290 -0
  15. package/dist/lib/db.js.map +1 -0
  16. package/dist/lib/diff.d.ts +13 -0
  17. package/dist/lib/diff.js +32 -0
  18. package/dist/lib/diff.js.map +1 -0
  19. package/dist/lib/git/gitBlame.d.ts +25 -0
  20. package/dist/lib/git/gitBlame.js +87 -0
  21. package/dist/lib/git/gitBlame.js.map +1 -0
  22. package/dist/lib/git/gitCli.d.ts +17 -0
  23. package/dist/lib/git/gitCli.js +57 -0
  24. package/dist/lib/git/gitCli.js.map +1 -0
  25. package/dist/lib/git/gitConfig.d.ts +20 -0
  26. package/dist/lib/git/gitConfig.js +91 -0
  27. package/dist/lib/git/gitConfig.js.map +1 -0
  28. package/dist/lib/git/gitDiff.d.ts +42 -0
  29. package/dist/lib/git/gitDiff.js +346 -0
  30. package/dist/lib/git/gitDiff.js.map +1 -0
  31. package/dist/lib/git/gitNotes.d.ts +31 -0
  32. package/dist/lib/git/gitNotes.js +93 -0
  33. package/dist/lib/git/gitNotes.js.map +1 -0
  34. package/dist/lib/git/index.d.ts +5 -0
  35. package/dist/lib/git/index.js +22 -0
  36. package/dist/lib/git/index.js.map +1 -0
  37. package/dist/lib/hooks.d.ts +65 -0
  38. package/dist/lib/hooks.js +423 -0
  39. package/dist/lib/hooks.js.map +1 -0
  40. package/dist/lib/index.d.ts +10 -0
  41. package/dist/lib/index.js +33 -0
  42. package/dist/lib/index.js.map +1 -0
  43. package/dist/lib/types.d.ts +190 -0
  44. package/dist/lib/types.js +8 -0
  45. package/dist/lib/types.js.map +1 -0
  46. package/dist/lib/util.d.ts +24 -0
  47. package/dist/lib/util.js +82 -0
  48. package/dist/lib/util.js.map +1 -0
  49. package/dist/process.d.ts +14 -0
  50. package/dist/process.js +224 -0
  51. package/dist/process.js.map +1 -0
  52. package/dist/sync.d.ts +15 -0
  53. package/dist/sync.js +413 -0
  54. package/dist/sync.js.map +1 -0
  55. package/dist/transfer-notes.d.ts +16 -0
  56. package/dist/transfer-notes.js +426 -0
  57. package/dist/transfer-notes.js.map +1 -0
  58. package/package.json +37 -0
package/dist/sync.js ADDED
@@ -0,0 +1,413 @@
1
+ "use strict";
2
+ /**
3
+ * Agent Blame Sync Command
4
+ *
5
+ * Transfers attribution notes after squash/rebase merges.
6
+ * Detects recent merges, fetches original PR commits, and transfers notes.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.sync = sync;
10
+ const node_child_process_1 = require("node:child_process");
11
+ const lib_1 = require("./lib");
12
+ function run(cmd, cwd) {
13
+ try {
14
+ return (0, node_child_process_1.execSync)(cmd, { encoding: "utf8", cwd }).trim();
15
+ }
16
+ catch {
17
+ return "";
18
+ }
19
+ }
20
+ function vlog(msg, options) {
21
+ if (options.verbose) {
22
+ console.log(` ${msg}`);
23
+ }
24
+ }
25
+ /**
26
+ * Find recent commits that look like squash/rebase merges without notes
27
+ */
28
+ function findMergeCandidates(repoRoot, options) {
29
+ const candidates = [];
30
+ // Get recent commits on current branch (last 20)
31
+ const logOutput = run(`git log --oneline -20 --format="%H %s"`, repoRoot);
32
+ if (!logOutput)
33
+ return candidates;
34
+ for (const line of logOutput.split("\n")) {
35
+ const match = line.match(/^([a-f0-9]+)\s+(.+)$/);
36
+ if (!match)
37
+ continue;
38
+ const [, sha, message] = match;
39
+ // Check if commit message has PR number pattern: (#123) or (123)
40
+ const prMatch = message.match(/\(#?(\d+)\)\s*$/);
41
+ if (!prMatch)
42
+ continue;
43
+ const prNumber = parseInt(prMatch[1], 10);
44
+ // Check if this commit already has a note
45
+ const hasNote = run(`git notes --ref=refs/notes/agentblame show ${sha} 2>/dev/null`, repoRoot);
46
+ if (hasNote) {
47
+ vlog(`Skipping ${sha.slice(0, 7)} - already has note`, options);
48
+ continue;
49
+ }
50
+ // Check if it's a single-parent commit (squash or rebase, not merge)
51
+ const parents = run(`git rev-list --parents -n 1 ${sha}`, repoRoot).split(" ");
52
+ if (parents.length > 2) {
53
+ vlog(`Skipping ${sha.slice(0, 7)} - merge commit (has multiple parents)`, options);
54
+ continue;
55
+ }
56
+ candidates.push({ sha, prNumber, message });
57
+ }
58
+ return candidates;
59
+ }
60
+ /**
61
+ * Fetch PR ref from remote to get original commits
62
+ */
63
+ function fetchPRRef(repoRoot, prNumber, options) {
64
+ vlog(`Fetching refs/pull/${prNumber}/head...`, options);
65
+ run(`git fetch origin refs/pull/${prNumber}/head:refs/remotes/origin/pr/${prNumber} 2>&1`, repoRoot);
66
+ // Check if fetch succeeded
67
+ const refExists = run(`git rev-parse --verify refs/remotes/origin/pr/${prNumber} 2>/dev/null`, repoRoot);
68
+ return !!refExists;
69
+ }
70
+ /**
71
+ * Get commits from a PR branch
72
+ */
73
+ function getPRCommits(repoRoot, prNumber, baseSha) {
74
+ // Find merge base between PR head and the base
75
+ const prRef = `refs/remotes/origin/pr/${prNumber}`;
76
+ // Get commits that are in PR but not in base
77
+ const output = run(`git rev-list ${baseSha}..${prRef} 2>/dev/null`, repoRoot);
78
+ if (!output)
79
+ return [];
80
+ return output.split("\n").filter(Boolean);
81
+ }
82
+ /**
83
+ * Read attribution note from a commit
84
+ */
85
+ function readNote(repoRoot, sha) {
86
+ const note = run(`git notes --ref=refs/notes/agentblame show ${sha} 2>/dev/null`, repoRoot);
87
+ if (!note)
88
+ return null;
89
+ try {
90
+ return JSON.parse(note);
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ }
96
+ /**
97
+ * Write attribution note to a commit
98
+ */
99
+ function writeNote(repoRoot, sha, attribution) {
100
+ const noteJson = JSON.stringify(attribution);
101
+ try {
102
+ // Use spawnSync with array args to avoid shell injection
103
+ const result = (0, node_child_process_1.spawnSync)("git", ["notes", "--ref=refs/notes/agentblame", "add", "-f", "-m", noteJson, sha], { encoding: "utf8", cwd: repoRoot });
104
+ if (result.status !== 0) {
105
+ console.error(`Failed to write note to ${sha}: ${result.stderr}`);
106
+ return false;
107
+ }
108
+ return true;
109
+ }
110
+ catch (err) {
111
+ console.error(`Failed to write note to ${sha}: ${err}`);
112
+ return false;
113
+ }
114
+ }
115
+ /**
116
+ * Get diff hunks from a commit
117
+ */
118
+ function getCommitHunks(repoRoot, sha) {
119
+ const diff = run(`git diff-tree -p ${sha}`, repoRoot);
120
+ if (!diff)
121
+ return [];
122
+ const hunks = [];
123
+ let currentFile = "";
124
+ let lineNumber = 0;
125
+ let addedLines = [];
126
+ let startLine = 0;
127
+ const computeHash = (content) => {
128
+ const crypto = require("node:crypto");
129
+ return `sha256:${crypto.createHash("sha256").update(content).digest("hex")}`;
130
+ };
131
+ for (const line of diff.split("\n")) {
132
+ if (line.startsWith("+++ b/")) {
133
+ if (addedLines.length > 0 && currentFile) {
134
+ const content = addedLines.join("\n");
135
+ hunks.push({
136
+ path: currentFile,
137
+ startLine,
138
+ content,
139
+ contentHash: computeHash(content),
140
+ });
141
+ addedLines = [];
142
+ }
143
+ currentFile = line.slice(6);
144
+ continue;
145
+ }
146
+ if (line.startsWith("@@")) {
147
+ if (addedLines.length > 0 && currentFile) {
148
+ const content = addedLines.join("\n");
149
+ hunks.push({
150
+ path: currentFile,
151
+ startLine,
152
+ content,
153
+ contentHash: computeHash(content),
154
+ });
155
+ addedLines = [];
156
+ }
157
+ const match = line.match(/@@ -\d+(?:,\d+)? \+(\d+)/);
158
+ if (match) {
159
+ lineNumber = parseInt(match[1], 10);
160
+ startLine = lineNumber;
161
+ }
162
+ continue;
163
+ }
164
+ if (line.startsWith("+") && !line.startsWith("+++")) {
165
+ if (addedLines.length === 0) {
166
+ startLine = lineNumber;
167
+ }
168
+ addedLines.push(line.slice(1));
169
+ lineNumber++;
170
+ continue;
171
+ }
172
+ if (!line.startsWith("-")) {
173
+ if (addedLines.length > 0 && currentFile) {
174
+ const content = addedLines.join("\n");
175
+ hunks.push({
176
+ path: currentFile,
177
+ startLine,
178
+ content,
179
+ contentHash: computeHash(content),
180
+ });
181
+ addedLines = [];
182
+ }
183
+ lineNumber++;
184
+ }
185
+ }
186
+ if (addedLines.length > 0 && currentFile) {
187
+ const content = addedLines.join("\n");
188
+ hunks.push({
189
+ path: currentFile,
190
+ startLine,
191
+ content,
192
+ contentHash: computeHash(content),
193
+ });
194
+ }
195
+ return hunks;
196
+ }
197
+ /**
198
+ * Collect attributions from PR commits with original content
199
+ */
200
+ function collectPRAttributions(repoRoot, prCommits) {
201
+ const byHash = new Map();
202
+ const withContent = [];
203
+ for (const sha of prCommits) {
204
+ const note = readNote(repoRoot, sha);
205
+ if (!note?.attributions)
206
+ continue;
207
+ const hunks = getCommitHunks(repoRoot, sha);
208
+ const hunksByHash = new Map();
209
+ for (const hunk of hunks) {
210
+ hunksByHash.set(hunk.contentHash, hunk.content);
211
+ }
212
+ for (const attr of note.attributions) {
213
+ const hash = attr.content_hash;
214
+ if (!byHash.has(hash)) {
215
+ byHash.set(hash, []);
216
+ }
217
+ byHash.get(hash)?.push(attr);
218
+ const content = hunksByHash.get(hash) || "";
219
+ if (content) {
220
+ withContent.push({ ...attr, originalContent: content });
221
+ }
222
+ }
223
+ }
224
+ return { byHash, withContent };
225
+ }
226
+ /**
227
+ * Find contained attributions with precise line numbers
228
+ */
229
+ function findContainedAttributions(hunk, attributions) {
230
+ const results = [];
231
+ for (const attr of attributions) {
232
+ const attrFileName = attr.path.split("/").pop();
233
+ const hunkFileName = hunk.path.split("/").pop();
234
+ const sameFile = attrFileName === hunkFileName ||
235
+ attr.path.endsWith(hunk.path) ||
236
+ hunk.path.endsWith(attrFileName || "");
237
+ if (!sameFile)
238
+ continue;
239
+ const aiContent = attr.originalContent.trim();
240
+ const hunkContent = hunk.content;
241
+ if (!hunkContent.includes(aiContent))
242
+ continue;
243
+ const offset = hunkContent.indexOf(aiContent);
244
+ let startLine = hunk.startLine;
245
+ if (offset > 0) {
246
+ const contentBeforeAI = hunkContent.slice(0, offset);
247
+ const linesBeforeAI = contentBeforeAI.split("\n").length - 1;
248
+ startLine = hunk.startLine + linesBeforeAI;
249
+ }
250
+ const aiLineCount = aiContent.split("\n").length;
251
+ const endLine = startLine + aiLineCount - 1;
252
+ const { originalContent: _, ...cleanAttr } = attr;
253
+ results.push({
254
+ ...cleanAttr,
255
+ path: hunk.path,
256
+ start_line: startLine,
257
+ end_line: endLine,
258
+ });
259
+ }
260
+ return results;
261
+ }
262
+ /**
263
+ * Transfer notes for a single merge candidate
264
+ */
265
+ function transferNotes(repoRoot, candidate, prCommits, options) {
266
+ const { byHash, withContent } = collectPRAttributions(repoRoot, prCommits);
267
+ if (byHash.size === 0) {
268
+ vlog(`No attributions found in PR commits`, options);
269
+ return 0;
270
+ }
271
+ vlog(`Found ${byHash.size} unique content hashes`, options);
272
+ const hunks = getCommitHunks(repoRoot, candidate.sha);
273
+ vlog(`Merge commit has ${hunks.length} hunks`, options);
274
+ const newAttributions = [];
275
+ const matchedHashes = new Set();
276
+ for (const hunk of hunks) {
277
+ // Try exact hash match
278
+ const attrs = byHash.get(hunk.contentHash);
279
+ if (attrs && attrs.length > 0) {
280
+ const attr = attrs[0];
281
+ newAttributions.push({
282
+ ...attr,
283
+ path: hunk.path,
284
+ start_line: hunk.startLine,
285
+ end_line: hunk.startLine + hunk.content.split("\n").length - 1,
286
+ });
287
+ matchedHashes.add(attr.content_hash);
288
+ vlog(` Exact match: ${hunk.path}:${hunk.startLine}`, options);
289
+ continue;
290
+ }
291
+ // Fallback: containment matching
292
+ const unmatchedAttrs = withContent.filter((a) => !matchedHashes.has(a.content_hash));
293
+ const containedMatches = findContainedAttributions(hunk, unmatchedAttrs);
294
+ for (const match of containedMatches) {
295
+ newAttributions.push(match);
296
+ matchedHashes.add(match.content_hash);
297
+ vlog(` Contained match: ${match.path}:${match.start_line}-${match.end_line}`, options);
298
+ }
299
+ }
300
+ if (newAttributions.length === 0) {
301
+ return 0;
302
+ }
303
+ if (options.dryRun) {
304
+ console.log(` Would attach ${newAttributions.length} attribution(s)`);
305
+ return newAttributions.length;
306
+ }
307
+ const note = {
308
+ version: 1,
309
+ timestamp: new Date().toISOString(),
310
+ attributions: newAttributions,
311
+ };
312
+ if (writeNote(repoRoot, candidate.sha, note)) {
313
+ return newAttributions.length;
314
+ }
315
+ return 0;
316
+ }
317
+ /**
318
+ * Find the base commit (parent of merge commit)
319
+ */
320
+ function findBaseSha(repoRoot, mergeSha) {
321
+ const parent = run(`git rev-parse ${mergeSha}^`, repoRoot);
322
+ return parent || "";
323
+ }
324
+ /**
325
+ * Push notes to remote
326
+ */
327
+ function pushNotes(repoRoot, options) {
328
+ if (options.dryRun) {
329
+ console.log("\nWould push notes to origin");
330
+ return true;
331
+ }
332
+ console.log("\nPushing notes to origin...");
333
+ try {
334
+ (0, node_child_process_1.execSync)("git push origin refs/notes/agentblame", {
335
+ encoding: "utf8",
336
+ cwd: repoRoot,
337
+ stdio: "inherit",
338
+ });
339
+ return true;
340
+ }
341
+ catch {
342
+ console.error("Failed to push notes");
343
+ return false;
344
+ }
345
+ }
346
+ /**
347
+ * Main sync function
348
+ */
349
+ async function sync(options = {}) {
350
+ const repoRoot = await (0, lib_1.getRepoRoot)(process.cwd());
351
+ if (!repoRoot) {
352
+ console.error("Error: Not in a git repository");
353
+ process.exit(1);
354
+ }
355
+ console.log("Agent Blame Sync - Transferring attribution notes\n");
356
+ if (options.dryRun) {
357
+ console.log("[DRY RUN - no changes will be made]\n");
358
+ }
359
+ // Fetch latest notes from remote (silent, ignores errors)
360
+ await (0, lib_1.fetchNotesQuiet)(repoRoot, "origin", options.verbose);
361
+ // Find merge candidates
362
+ const candidates = findMergeCandidates(repoRoot, options);
363
+ if (candidates.length === 0) {
364
+ console.log("No squash/rebase merges found that need notes transferred.");
365
+ console.log("(Looking for commits with PR numbers like '#123' that don't have notes)");
366
+ return;
367
+ }
368
+ console.log(`Found ${candidates.length} merge(s) that may need notes:\n`);
369
+ let totalTransferred = 0;
370
+ let successCount = 0;
371
+ for (const candidate of candidates) {
372
+ console.log(`PR #${candidate.prNumber}: ${candidate.message.slice(0, 50)}...`);
373
+ console.log(` Commit: ${candidate.sha.slice(0, 7)}`);
374
+ // Fetch PR ref
375
+ if (!fetchPRRef(repoRoot, candidate.prNumber, options)) {
376
+ console.log(` Skipped: Could not fetch PR #${candidate.prNumber} refs`);
377
+ continue;
378
+ }
379
+ // Find base and get PR commits
380
+ const baseSha = findBaseSha(repoRoot, candidate.sha);
381
+ if (!baseSha) {
382
+ console.log(` Skipped: Could not find base commit`);
383
+ continue;
384
+ }
385
+ const prCommits = getPRCommits(repoRoot, candidate.prNumber, baseSha);
386
+ if (prCommits.length === 0) {
387
+ console.log(` Skipped: No PR commits found`);
388
+ continue;
389
+ }
390
+ vlog(`Found ${prCommits.length} PR commits`, options);
391
+ // Transfer notes
392
+ const transferred = transferNotes(repoRoot, candidate, prCommits, options);
393
+ if (transferred > 0) {
394
+ console.log(` Transferred ${transferred} attribution(s)`);
395
+ totalTransferred += transferred;
396
+ successCount++;
397
+ }
398
+ else {
399
+ console.log(` No attributions to transfer`);
400
+ }
401
+ console.log("");
402
+ }
403
+ // Summary
404
+ if (totalTransferred > 0) {
405
+ console.log(`\nSummary: Transferred ${totalTransferred} attribution(s) for ${successCount} merge(s)`);
406
+ // Push notes
407
+ pushNotes(repoRoot, options);
408
+ }
409
+ else {
410
+ console.log("\nNo attributions were transferred.");
411
+ }
412
+ }
413
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Agent Blame - Transfer Notes Action
4
+ *
5
+ * Transfers git notes from PR commits to merge/squash/rebase commits.
6
+ * Runs as part of GitHub Actions workflow after PR merge.
7
+ *
8
+ * Environment variables (set by GitHub Actions):
9
+ * PR_NUMBER - The PR number
10
+ * PR_TITLE - The PR title
11
+ * BASE_REF - Target branch (e.g., main)
12
+ * BASE_SHA - Base commit SHA before merge
13
+ * HEAD_SHA - Last commit SHA on feature branch
14
+ * MERGE_SHA - The merge commit SHA (for merge/squash)
15
+ */
16
+ export {};