@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
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env bun
2
+ "use strict";
3
+ /**
4
+ * Agent Blame Cleanup Script
5
+ *
6
+ * Removes all Agent Blame data and hook configurations:
7
+ * - ~/.agentblame directory (logs, hooks)
8
+ * - Agent Blame entries from ~/.cursor/hooks.json
9
+ * - Agent Blame entries from ~/.claude/settings.json
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const fs = __importStar(require("node:fs"));
46
+ const path = __importStar(require("node:path"));
47
+ const os = __importStar(require("node:os"));
48
+ const AGENTBLAME_ROOT = path.join(os.homedir(), ".agentblame");
49
+ const CURSOR_HOOKS_CONFIG = path.join(os.homedir(), ".cursor", "hooks.json");
50
+ const CLAUDE_SETTINGS_FILE = path.join(os.homedir(), ".claude", "settings.json");
51
+ function removeAgentBlameDirectory() {
52
+ if (fs.existsSync(AGENTBLAME_ROOT)) {
53
+ fs.rmSync(AGENTBLAME_ROOT, { recursive: true, force: true });
54
+ console.log("✓ Removed ~/.agentblame directory");
55
+ return true;
56
+ }
57
+ console.log(" ~/.agentblame directory not found (already clean)");
58
+ return false;
59
+ }
60
+ function cleanCursorHooks() {
61
+ if (!fs.existsSync(CURSOR_HOOKS_CONFIG)) {
62
+ console.log(" ~/.cursor/hooks.json not found (already clean)");
63
+ return false;
64
+ }
65
+ try {
66
+ const content = fs.readFileSync(CURSOR_HOOKS_CONFIG, "utf8");
67
+ const config = JSON.parse(content);
68
+ let modified = false;
69
+ if (config.hooks?.afterFileEdit) {
70
+ const before = config.hooks.afterFileEdit.length;
71
+ config.hooks.afterFileEdit = config.hooks.afterFileEdit.filter((h) => !h?.command?.includes("agentblame"));
72
+ if (config.hooks.afterFileEdit.length < before)
73
+ modified = true;
74
+ }
75
+ if (config.hooks?.afterTabFileEdit) {
76
+ const before = config.hooks.afterTabFileEdit.length;
77
+ config.hooks.afterTabFileEdit = config.hooks.afterTabFileEdit.filter((h) => !h?.command?.includes("agentblame"));
78
+ if (config.hooks.afterTabFileEdit.length < before)
79
+ modified = true;
80
+ }
81
+ if (modified) {
82
+ fs.writeFileSync(CURSOR_HOOKS_CONFIG, JSON.stringify(config, null, 2), "utf8");
83
+ console.log("✓ Removed Agent Blame hooks from ~/.cursor/hooks.json");
84
+ return true;
85
+ }
86
+ console.log(" No Agent Blame hooks found in ~/.cursor/hooks.json");
87
+ return false;
88
+ }
89
+ catch (err) {
90
+ console.log(" Error reading ~/.cursor/hooks.json:", err);
91
+ return false;
92
+ }
93
+ }
94
+ function cleanClaudeSettings() {
95
+ if (!fs.existsSync(CLAUDE_SETTINGS_FILE)) {
96
+ console.log(" ~/.claude/settings.json not found (already clean)");
97
+ return false;
98
+ }
99
+ try {
100
+ const content = fs.readFileSync(CLAUDE_SETTINGS_FILE, "utf8");
101
+ const config = JSON.parse(content);
102
+ let modified = false;
103
+ if (config.hooks?.PostToolUse) {
104
+ const before = config.hooks.PostToolUse.length;
105
+ config.hooks.PostToolUse = config.hooks.PostToolUse.filter((h) => !h?.hooks?.some((hh) => hh?.command?.includes("agentblame")));
106
+ if (config.hooks.PostToolUse.length < before)
107
+ modified = true;
108
+ }
109
+ if (modified) {
110
+ fs.writeFileSync(CLAUDE_SETTINGS_FILE, JSON.stringify(config, null, 2), "utf8");
111
+ console.log("✓ Removed Agent Blame hooks from ~/.claude/settings.json");
112
+ return true;
113
+ }
114
+ console.log(" No Agent Blame hooks found in ~/.claude/settings.json");
115
+ return false;
116
+ }
117
+ catch (err) {
118
+ console.log(" Error reading ~/.claude/settings.json:", err);
119
+ return false;
120
+ }
121
+ }
122
+ function main() {
123
+ console.log(`\nAgent Blame Cleanup\n${"=".repeat(40)}`);
124
+ removeAgentBlameDirectory();
125
+ cleanCursorHooks();
126
+ cleanClaudeSettings();
127
+ console.log(`\n${"=".repeat(40)}`);
128
+ console.log("Cleanup complete!");
129
+ console.log("\nNext steps:");
130
+ console.log(" 1. Restart Cursor for hook changes to take effect");
131
+ console.log(" 2. Run 'bun run compile' to rebuild");
132
+ console.log(" 3. Press F5 to launch extension (will reinstall hooks)");
133
+ console.log("");
134
+ }
135
+ main();
136
+ //# sourceMappingURL=cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../src/cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Agent Blame CLI
4
+ *
5
+ * Commands:
6
+ * agentblame init - Set up hooks and configuration
7
+ * agentblame blame <file> - Show attribution for a file
8
+ * agentblame status - Show current attribution status
9
+ */
10
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,240 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Agent Blame CLI
5
+ *
6
+ * Commands:
7
+ * agentblame init - Set up hooks and configuration
8
+ * agentblame blame <file> - Show attribution for a file
9
+ * agentblame status - Show current attribution status
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const path = __importStar(require("node:path"));
46
+ const blame_1 = require("./blame");
47
+ const sync_1 = require("./sync");
48
+ const process_1 = require("./process");
49
+ const lib_1 = require("./lib");
50
+ const args = process.argv.slice(2);
51
+ const command = args[0];
52
+ async function main() {
53
+ switch (command) {
54
+ case "install":
55
+ await runInstall(args.slice(1));
56
+ break;
57
+ case "uninstall":
58
+ await runUninstall(args.slice(1));
59
+ break;
60
+ case "blame":
61
+ await runBlame(args.slice(1));
62
+ break;
63
+ case "process":
64
+ await (0, process_1.runProcess)(args[1]);
65
+ break;
66
+ case "sync":
67
+ await runSync(args.slice(1));
68
+ break;
69
+ case "status":
70
+ await runStatus();
71
+ break;
72
+ case "--help":
73
+ case "-h":
74
+ case undefined:
75
+ printHelp();
76
+ break;
77
+ default:
78
+ console.error(`Unknown command: ${command}`);
79
+ printHelp();
80
+ process.exit(1);
81
+ }
82
+ }
83
+ function printHelp() {
84
+ console.log(`
85
+ Agent Blame - Track AI-generated code in your commits
86
+
87
+ Usage:
88
+ agentblame install Set up hooks for current repo
89
+ agentblame install --global Set up hooks for all repos
90
+ agentblame uninstall Remove hooks from current repo
91
+ agentblame uninstall --global Remove global hooks
92
+ agentblame blame <file> Show AI attribution for a file
93
+ agentblame blame --summary Show summary only
94
+ agentblame blame --json Output as JSON
95
+
96
+ Examples:
97
+ agentblame install # Current repo only (recommended)
98
+ agentblame install --global # All repos (overrides repo-specific hooks)
99
+ agentblame blame src/index.ts
100
+ `);
101
+ }
102
+ async function runInstall(args) {
103
+ const isGlobal = args.includes("--global");
104
+ console.log(`Agent Blame Setup${isGlobal ? " (Global)" : ""}\n`);
105
+ // Find capture script relative to CLI (now in same package)
106
+ const captureScript = path.resolve(__dirname, "capture.ts");
107
+ // Always install/reinstall editor hooks
108
+ const cursorSuccess = await (0, lib_1.installCursorHooks)(captureScript);
109
+ console.log(cursorSuccess ? " Cursor hooks: installed" : " Cursor hooks: failed");
110
+ const claudeSuccess = await (0, lib_1.installClaudeHooks)(captureScript);
111
+ console.log(claudeSuccess ? " Claude Code hooks: installed" : " Claude Code hooks: failed");
112
+ if (isGlobal) {
113
+ // Install global git hook (works for all repos)
114
+ const gitHookSuccess = await (0, lib_1.installGlobalGitHook)();
115
+ if (gitHookSuccess) {
116
+ console.log(" Git post-commit hook: installed (global)");
117
+ console.log(" Notes auto-push: auto-configures per repo on first commit");
118
+ }
119
+ else {
120
+ console.log(" Git post-commit hook: failed");
121
+ }
122
+ }
123
+ else {
124
+ // Per-repo installation
125
+ const repoRoot = await (0, lib_1.getRepoRoot)(process.cwd());
126
+ if (!repoRoot) {
127
+ console.error("\nError: Not in a git repository. Use --global for system-wide setup.");
128
+ process.exit(1);
129
+ }
130
+ const gitHookSuccess = await (0, lib_1.installGitHook)(repoRoot);
131
+ console.log(gitHookSuccess ? " Git post-commit hook: installed" : " Git post-commit hook: failed");
132
+ const notesPushSuccess = await (0, lib_1.configureNotesSync)(repoRoot);
133
+ console.log(notesPushSuccess ? " Notes auto-push: configured" : " Notes auto-push: failed");
134
+ }
135
+ console.log("\nSetup complete!");
136
+ console.log("\nIMPORTANT: Restart Cursor/Claude Code for hooks to take effect.");
137
+ console.log("\nHow it works:");
138
+ console.log(" 1. Make AI edits in Cursor or Claude Code");
139
+ console.log(" 2. Commit your changes (attribution attached automatically)");
140
+ console.log(" 3. Run 'agentblame blame <file>' to see attribution");
141
+ }
142
+ async function runUninstall(args) {
143
+ const isGlobal = args.includes("--global");
144
+ console.log(`Removing Agent Blame${isGlobal ? " (Global)" : ""}...\n`);
145
+ // Always remove editor hooks
146
+ const cursorSuccess = await (0, lib_1.uninstallCursorHooks)();
147
+ console.log(cursorSuccess ? " Cursor hooks: removed" : " Cursor hooks: failed");
148
+ const claudeSuccess = await (0, lib_1.uninstallClaudeHooks)();
149
+ console.log(claudeSuccess ? " Claude Code hooks: removed" : " Claude Code hooks: failed");
150
+ if (isGlobal) {
151
+ // Remove global git hook
152
+ const gitHookSuccess = await (0, lib_1.uninstallGlobalGitHook)();
153
+ console.log(gitHookSuccess ? " Git post-commit hook: removed (global)" : " Git post-commit hook: failed");
154
+ // Remove ~/.agentblame directory
155
+ const fs = await Promise.resolve().then(() => __importStar(require("node:fs")));
156
+ const os = await Promise.resolve().then(() => __importStar(require("node:os")));
157
+ const agentblameDir = path.join(os.homedir(), ".agentblame");
158
+ try {
159
+ if (fs.existsSync(agentblameDir)) {
160
+ await fs.promises.rm(agentblameDir, { recursive: true, force: true });
161
+ console.log(" Data directory: removed");
162
+ }
163
+ else {
164
+ console.log(" Data directory: not found");
165
+ }
166
+ }
167
+ catch {
168
+ console.log(" Data directory: failed to remove");
169
+ }
170
+ }
171
+ else {
172
+ // Per-repo uninstallation
173
+ const repoRoot = await (0, lib_1.getRepoRoot)(process.cwd());
174
+ if (!repoRoot) {
175
+ console.error("\nError: Not in a git repository. Use --global to remove global hooks.");
176
+ process.exit(1);
177
+ }
178
+ const gitHookSuccess = await (0, lib_1.uninstallGitHook)(repoRoot);
179
+ console.log(gitHookSuccess ? " Git post-commit hook: removed" : " Git post-commit hook: failed");
180
+ const notesPushSuccess = await (0, lib_1.removeNotesSync)(repoRoot);
181
+ console.log(notesPushSuccess ? " Notes auto-push: removed" : " Notes auto-push: failed");
182
+ }
183
+ console.log("\nUninstall complete!");
184
+ }
185
+ async function runBlame(args) {
186
+ // Parse options
187
+ const options = {};
188
+ let filePath;
189
+ for (const arg of args) {
190
+ if (arg === "--json") {
191
+ options.json = true;
192
+ }
193
+ else if (arg === "--summary") {
194
+ options.summary = true;
195
+ }
196
+ else if (!arg.startsWith("-")) {
197
+ filePath = arg;
198
+ }
199
+ }
200
+ if (!filePath) {
201
+ console.error("Usage: agentblame blame [--json|--summary] <file>");
202
+ process.exit(1);
203
+ }
204
+ await (0, blame_1.blame)(filePath, options);
205
+ }
206
+ async function runSync(args) {
207
+ const options = {};
208
+ for (const arg of args) {
209
+ if (arg === "--dry-run") {
210
+ options.dryRun = true;
211
+ }
212
+ else if (arg === "--verbose" || arg === "-v") {
213
+ options.verbose = true;
214
+ }
215
+ }
216
+ await (0, sync_1.sync)(options);
217
+ }
218
+ async function runStatus() {
219
+ console.log("\nAgent Blame Status\n");
220
+ const pendingEdits = (0, lib_1.readPendingEdits)();
221
+ console.log(`Pending AI edits: ${pendingEdits.length}`);
222
+ if (pendingEdits.length > 0) {
223
+ console.log("\nRecent pending edits:");
224
+ const recent = pendingEdits.slice(-5);
225
+ for (const edit of recent) {
226
+ const time = new Date(edit.timestamp).toLocaleTimeString();
227
+ const file = edit.file_path.split("/").pop();
228
+ console.log(` [${edit.provider}] ${file} at ${time}`);
229
+ }
230
+ if (pendingEdits.length > 5) {
231
+ console.log(` ... and ${pendingEdits.length - 5} more`);
232
+ }
233
+ }
234
+ console.log("");
235
+ }
236
+ main().catch((err) => {
237
+ console.error(err);
238
+ process.exit(1);
239
+ });
240
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Pending Edits Store
3
+ *
4
+ * Reads AI edit logs from ~/.agentblame/logs/ (JSON lines format)
5
+ * Supports line-level matching for precise attribution.
6
+ */
7
+ import type { CapturedLine, PendingEdit, MatchType } from "./types";
8
+ import { computeContentHash, computeNormalizedHash } from "./util";
9
+ /**
10
+ * Read all pending edits from log files
11
+ */
12
+ export declare function readPendingEdits(): PendingEdit[];
13
+ /**
14
+ * Build a hash index from pending edits for fast line lookup
15
+ */
16
+ export declare function buildLineHashIndex(edits: PendingEdit[]): {
17
+ exactHash: Map<string, {
18
+ edit: PendingEdit;
19
+ line: CapturedLine;
20
+ }[]>;
21
+ normalizedHash: Map<string, {
22
+ edit: PendingEdit;
23
+ line: CapturedLine;
24
+ }[]>;
25
+ };
26
+ export interface LineMatchResult {
27
+ edit: PendingEdit;
28
+ line: CapturedLine;
29
+ matchType: MatchType;
30
+ confidence: number;
31
+ }
32
+ /**
33
+ * Find a line match using the priority strategy:
34
+ * 1. Exact hash match (1.0)
35
+ * 2. Normalized hash match (0.95)
36
+ * 3. Line contained in AI content (0.9)
37
+ * 4. AI content contained in line (0.85)
38
+ */
39
+ export declare function findLineMatch(lineContent: string, lineHash: string, lineHashNormalized: string, filePath: string, hashIndex: ReturnType<typeof buildLineHashIndex>, edits: PendingEdit[]): LineMatchResult | null;
40
+ /**
41
+ * Mark entries as matched in the log file
42
+ */
43
+ export declare function markEditsAsMatched(sourceLog: string, lineNumbers: number[], commitSha: string): void;
44
+ /**
45
+ * Clean up old log entries
46
+ * - Removes matched entries older than maxAgeDays
47
+ * - Removes unmatched entries older than expireDays
48
+ */
49
+ export declare function cleanupOldEntries(maxAgeDays?: number, expireDays?: number): {
50
+ removed: number;
51
+ kept: number;
52
+ };
53
+ export { computeContentHash, computeNormalizedHash };