@mesadev/agentblame 0.1.0 → 0.1.2
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/README.md +84 -0
- package/dist/capture.js +21 -18
- package/dist/capture.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +65 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/database.d.ts +124 -0
- package/dist/lib/database.js +490 -0
- package/dist/lib/database.js.map +1 -0
- package/dist/lib/db.d.ts +2 -1
- package/dist/lib/db.js +4 -3
- package/dist/lib/db.js.map +1 -1
- package/dist/lib/git/gitConfig.d.ts +10 -9
- package/dist/lib/git/gitConfig.js +17 -51
- package/dist/lib/git/gitConfig.js.map +1 -1
- package/dist/lib/hooks.d.ts +0 -8
- package/dist/lib/hooks.js +28 -52
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.js +2 -2
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/types.d.ts +0 -64
- package/dist/lib/util.d.ts +6 -12
- package/dist/lib/util.js +18 -22
- package/dist/lib/util.js.map +1 -1
- package/dist/process.js +35 -32
- package/dist/process.js.map +1 -1
- package/package.json +5 -3
package/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Agent Blame
|
|
2
|
+
|
|
3
|
+
Track AI-generated vs human-written code. Know what the AI wrote and focus your code reviews where it matters.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @mesadev/agentblame
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Setup
|
|
12
|
+
|
|
13
|
+
For a specific repo:
|
|
14
|
+
```bash
|
|
15
|
+
cd your-repo
|
|
16
|
+
agentblame install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or for all repos (run from anywhere):
|
|
20
|
+
```bash
|
|
21
|
+
agentblame install --global
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Note:** Restart Cursor/Claude Code after running this.
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
1. Make AI edits in Cursor or Claude Code
|
|
29
|
+
2. Commit your changes (attribution attached automatically)
|
|
30
|
+
3. View attribution:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
agentblame blame <file>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Example Output
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
src/auth.ts
|
|
40
|
+
──────────────────────────────────────────────────────────────────────
|
|
41
|
+
|
|
42
|
+
a1b2c3d alice 2024-01-15 ✨ Cursor - claude-3.5-sonnet │ 1 │ export function login() {
|
|
43
|
+
a1b2c3d alice 2024-01-15 ✨ Cursor - claude-3.5-sonnet │ 2 │ const user = await db.find();
|
|
44
|
+
def456b bob 2024-01-20 │ 3 │ // Rate limiting
|
|
45
|
+
a1b2c3d alice 2024-01-15 ✨ Claude Code │ 5 │ return validate(user);
|
|
46
|
+
|
|
47
|
+
██████████████████████████████░░░░░░░░░░░░░░░░░░░░
|
|
48
|
+
✨ AI: 3 (75%) │ 👤 Human: 1 (25%)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## CLI Commands
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
agentblame install # Set up hooks (current repo)
|
|
55
|
+
agentblame install --global # Set up hooks (all repos)
|
|
56
|
+
agentblame uninstall # Remove hooks
|
|
57
|
+
agentblame blame <file> # Show AI attribution
|
|
58
|
+
agentblame blame --summary # Summary only
|
|
59
|
+
agentblame blame --json # JSON output
|
|
60
|
+
agentblame status # Show pending edits
|
|
61
|
+
agentblame sync # Transfer notes after squash/rebase
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Chrome Extension
|
|
65
|
+
|
|
66
|
+
See AI markers on GitHub PRs with our Chrome extension.
|
|
67
|
+
|
|
68
|
+
Get it from the [GitHub repository](https://github.com/mesa-dot-dev/agentblame#chrome-extension-optional).
|
|
69
|
+
|
|
70
|
+
## Troubleshooting
|
|
71
|
+
|
|
72
|
+
| Problem | Solution |
|
|
73
|
+
|---------|----------|
|
|
74
|
+
| Hooks not capturing | Restart Cursor/Claude Code |
|
|
75
|
+
| Notes not on GitHub | Run `git push origin refs/notes/agentblame` |
|
|
76
|
+
| After squash/rebase | Run `agentblame sync` |
|
|
77
|
+
|
|
78
|
+
## More Information
|
|
79
|
+
|
|
80
|
+
For developer documentation and Chrome extension installation, visit the [GitHub repository](https://github.com/mesa-dot-dev/agentblame).
|
|
81
|
+
|
|
82
|
+
## License
|
|
83
|
+
|
|
84
|
+
Apache 2.0
|
package/dist/capture.js
CHANGED
|
@@ -48,17 +48,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
48
48
|
};
|
|
49
49
|
})();
|
|
50
50
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
-
const fs = __importStar(require("node:fs"));
|
|
52
|
-
const path = __importStar(require("node:path"));
|
|
53
51
|
const crypto = __importStar(require("node:crypto"));
|
|
54
52
|
const diff_1 = require("diff");
|
|
53
|
+
const database_1 = require("./lib/database");
|
|
55
54
|
// =============================================================================
|
|
56
55
|
// Utilities
|
|
57
56
|
// =============================================================================
|
|
58
|
-
function getAgentBlameLogsDir() {
|
|
59
|
-
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
60
|
-
return path.join(home, ".agentblame", "logs");
|
|
61
|
-
}
|
|
62
57
|
function computeHash(content) {
|
|
63
58
|
return `sha256:${crypto.createHash("sha256").update(content).digest("hex")}`;
|
|
64
59
|
}
|
|
@@ -128,12 +123,22 @@ function parseArgs() {
|
|
|
128
123
|
}
|
|
129
124
|
return { provider, event };
|
|
130
125
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Save an edit to the SQLite database
|
|
128
|
+
*/
|
|
129
|
+
function saveEdit(edit) {
|
|
130
|
+
(0, database_1.insertEdit)({
|
|
131
|
+
timestamp: edit.timestamp,
|
|
132
|
+
provider: edit.provider,
|
|
133
|
+
file_path: edit.file_path,
|
|
134
|
+
model: edit.model,
|
|
135
|
+
content: edit.content,
|
|
136
|
+
content_hash: edit.content_hash,
|
|
137
|
+
content_hash_normalized: edit.content_hash_normalized,
|
|
138
|
+
edit_type: edit.edit_type,
|
|
139
|
+
old_content: edit.old_content,
|
|
140
|
+
lines: edit.lines,
|
|
141
|
+
});
|
|
137
142
|
}
|
|
138
143
|
function processCursorPayload(payload, event) {
|
|
139
144
|
const edits = [];
|
|
@@ -262,15 +267,13 @@ async function main() {
|
|
|
262
267
|
if (provider === "cursor") {
|
|
263
268
|
const eventName = event || data.hook_event_name || "afterFileEdit";
|
|
264
269
|
edits = processCursorPayload(payload, eventName);
|
|
265
|
-
for (const edit of edits) {
|
|
266
|
-
appendToLog("cursor-generated.log", edit);
|
|
267
|
-
}
|
|
268
270
|
}
|
|
269
271
|
else if (provider === "claude") {
|
|
270
272
|
edits = processClaudePayload(payload);
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
273
|
+
}
|
|
274
|
+
// Save all edits to SQLite database
|
|
275
|
+
for (const edit of edits) {
|
|
276
|
+
saveEdit(edit);
|
|
274
277
|
}
|
|
275
278
|
process.exit(0);
|
|
276
279
|
}
|
package/dist/capture.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;GAaG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
2
|
"use strict";
|
|
3
3
|
/**
|
|
4
4
|
* Agent Blame CLI
|
|
@@ -43,10 +43,23 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
43
43
|
})();
|
|
44
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
45
|
const path = __importStar(require("node:path"));
|
|
46
|
+
const node_child_process_1 = require("node:child_process");
|
|
46
47
|
const blame_1 = require("./blame");
|
|
47
48
|
const sync_1 = require("./sync");
|
|
48
49
|
const process_1 = require("./process");
|
|
49
50
|
const lib_1 = require("./lib");
|
|
51
|
+
/**
|
|
52
|
+
* Check if Bun is installed and available in PATH.
|
|
53
|
+
*/
|
|
54
|
+
function isBunInstalled() {
|
|
55
|
+
try {
|
|
56
|
+
(0, node_child_process_1.execSync)("bun --version", { stdio: "pipe" });
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
50
63
|
const args = process.argv.slice(2);
|
|
51
64
|
const command = args[0];
|
|
52
65
|
async function main() {
|
|
@@ -69,6 +82,9 @@ async function main() {
|
|
|
69
82
|
case "status":
|
|
70
83
|
await runStatus();
|
|
71
84
|
break;
|
|
85
|
+
case "cleanup":
|
|
86
|
+
await runCleanup();
|
|
87
|
+
break;
|
|
72
88
|
case "--help":
|
|
73
89
|
case "-h":
|
|
74
90
|
case undefined:
|
|
@@ -92,6 +108,8 @@ Usage:
|
|
|
92
108
|
agentblame blame <file> Show AI attribution for a file
|
|
93
109
|
agentblame blame --summary Show summary only
|
|
94
110
|
agentblame blame --json Output as JSON
|
|
111
|
+
agentblame status Show pending AI edits
|
|
112
|
+
agentblame cleanup Remove old entries from database
|
|
95
113
|
|
|
96
114
|
Examples:
|
|
97
115
|
agentblame install # Current repo only (recommended)
|
|
@@ -101,9 +119,40 @@ Examples:
|
|
|
101
119
|
}
|
|
102
120
|
async function runInstall(args) {
|
|
103
121
|
const isGlobal = args.includes("--global");
|
|
122
|
+
// Check if Bun is installed (required for hooks)
|
|
123
|
+
if (!isBunInstalled()) {
|
|
124
|
+
const installCmd = process.platform === "win32"
|
|
125
|
+
? "powershell -c \"irm bun.sh/install.ps1 | iex\""
|
|
126
|
+
: "curl -fsSL https://bun.sh/install | bash";
|
|
127
|
+
console.error("\n┌─────────────────────────────────────────────────────────────┐");
|
|
128
|
+
console.error("│ Error: Bun is required but not installed │");
|
|
129
|
+
console.error("├─────────────────────────────────────────────────────────────┤");
|
|
130
|
+
console.error("│ │");
|
|
131
|
+
console.error("│ Agent Blame uses Bun to run hooks for Cursor and Claude │");
|
|
132
|
+
console.error("│ Code. Please install Bun first: │");
|
|
133
|
+
console.error("│ │");
|
|
134
|
+
console.error(`│ ${installCmd.padEnd(55)}│`);
|
|
135
|
+
console.error("│ │");
|
|
136
|
+
console.error("│ Then restart your terminal and run this command again. │");
|
|
137
|
+
console.error("│ │");
|
|
138
|
+
console.error("│ Learn more: https://bun.sh │");
|
|
139
|
+
console.error("└─────────────────────────────────────────────────────────────┘\n");
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
104
142
|
console.log(`Agent Blame Setup${isGlobal ? " (Global)" : ""}\n`);
|
|
105
|
-
//
|
|
106
|
-
|
|
143
|
+
// Initialize SQLite database
|
|
144
|
+
try {
|
|
145
|
+
(0, lib_1.initDatabase)();
|
|
146
|
+
console.log(" Database: initialized");
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
console.log(" Database: failed to initialize");
|
|
150
|
+
console.error(err);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
// Find capture script in the dist/ directory (always run compiled .js)
|
|
154
|
+
const distDir = (0, lib_1.getDistDir)(__dirname);
|
|
155
|
+
const captureScript = path.resolve(distDir, "capture.js");
|
|
107
156
|
// Always install/reinstall editor hooks
|
|
108
157
|
const cursorSuccess = await (0, lib_1.installCursorHooks)(captureScript);
|
|
109
158
|
console.log(cursorSuccess ? " Cursor hooks: installed" : " Cursor hooks: failed");
|
|
@@ -217,22 +266,29 @@ async function runSync(args) {
|
|
|
217
266
|
}
|
|
218
267
|
async function runStatus() {
|
|
219
268
|
console.log("\nAgent Blame Status\n");
|
|
220
|
-
const
|
|
221
|
-
console.log(`Pending AI edits: ${
|
|
222
|
-
if (
|
|
269
|
+
const pendingCount = (0, lib_1.getPendingEditCount)();
|
|
270
|
+
console.log(`Pending AI edits: ${pendingCount}`);
|
|
271
|
+
if (pendingCount > 0) {
|
|
223
272
|
console.log("\nRecent pending edits:");
|
|
224
|
-
const recent =
|
|
273
|
+
const recent = (0, lib_1.getRecentPendingEdits)(5);
|
|
225
274
|
for (const edit of recent) {
|
|
226
275
|
const time = new Date(edit.timestamp).toLocaleTimeString();
|
|
227
276
|
const file = edit.file_path.split("/").pop();
|
|
228
277
|
console.log(` [${edit.provider}] ${file} at ${time}`);
|
|
229
278
|
}
|
|
230
|
-
if (
|
|
231
|
-
console.log(` ... and ${
|
|
279
|
+
if (pendingCount > 5) {
|
|
280
|
+
console.log(` ... and ${pendingCount - 5} more`);
|
|
232
281
|
}
|
|
233
282
|
}
|
|
234
283
|
console.log("");
|
|
235
284
|
}
|
|
285
|
+
async function runCleanup() {
|
|
286
|
+
console.log("\nAgent Blame Cleanup\n");
|
|
287
|
+
const result = (0, lib_1.cleanupOldEntries)();
|
|
288
|
+
console.log(` Removed: ${result.removed} old entries`);
|
|
289
|
+
console.log(` Kept: ${result.kept} entries`);
|
|
290
|
+
console.log("\nCleanup complete!");
|
|
291
|
+
}
|
|
236
292
|
main().catch((err) => {
|
|
237
293
|
console.error(err);
|
|
238
294
|
process.exit(1);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,gDAAkC;AAClC,mCAAgC;AAChC,iCAA8B;AAC9B,uCAAuC;AACvC,+
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Database Module
|
|
3
|
+
*
|
|
4
|
+
* Handles persistent storage of AI edits for attribution matching.
|
|
5
|
+
* Uses Bun's built-in SQLite for high-performance lookups.
|
|
6
|
+
*/
|
|
7
|
+
import { Database } from "bun:sqlite";
|
|
8
|
+
import type { AiProvider, MatchType, CapturedLine } from "./types";
|
|
9
|
+
export interface DbEdit {
|
|
10
|
+
id: number;
|
|
11
|
+
timestamp: string;
|
|
12
|
+
provider: AiProvider;
|
|
13
|
+
file_path: string;
|
|
14
|
+
model: string | null;
|
|
15
|
+
content: string;
|
|
16
|
+
content_hash: string;
|
|
17
|
+
content_hash_normalized: string;
|
|
18
|
+
edit_type: string;
|
|
19
|
+
old_content: string | null;
|
|
20
|
+
status: string;
|
|
21
|
+
matched_commit: string | null;
|
|
22
|
+
matched_at: string | null;
|
|
23
|
+
}
|
|
24
|
+
export interface DbLine {
|
|
25
|
+
id: number;
|
|
26
|
+
edit_id: number;
|
|
27
|
+
content: string;
|
|
28
|
+
hash: string;
|
|
29
|
+
hash_normalized: string;
|
|
30
|
+
}
|
|
31
|
+
export interface LineMatchResult {
|
|
32
|
+
edit: DbEdit;
|
|
33
|
+
line: DbLine;
|
|
34
|
+
matchType: MatchType;
|
|
35
|
+
confidence: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the database file path
|
|
39
|
+
*/
|
|
40
|
+
export declare function getDbPath(): string;
|
|
41
|
+
/**
|
|
42
|
+
* Initialize and return the database connection
|
|
43
|
+
*/
|
|
44
|
+
export declare function getDatabase(): Database;
|
|
45
|
+
/**
|
|
46
|
+
* Close the database connection
|
|
47
|
+
*/
|
|
48
|
+
export declare function closeDatabase(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Initialize database (creates file and schema if needed)
|
|
51
|
+
* Call this during install to ensure DB is ready
|
|
52
|
+
*/
|
|
53
|
+
export declare function initDatabase(): void;
|
|
54
|
+
export interface InsertEditParams {
|
|
55
|
+
timestamp: string;
|
|
56
|
+
provider: AiProvider;
|
|
57
|
+
file_path: string;
|
|
58
|
+
model: string | null;
|
|
59
|
+
content: string;
|
|
60
|
+
content_hash: string;
|
|
61
|
+
content_hash_normalized: string;
|
|
62
|
+
edit_type: string;
|
|
63
|
+
old_content?: string;
|
|
64
|
+
lines: CapturedLine[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Insert a new AI edit into the database
|
|
68
|
+
*/
|
|
69
|
+
export declare function insertEdit(params: InsertEditParams): number;
|
|
70
|
+
/**
|
|
71
|
+
* Find a line match by exact hash
|
|
72
|
+
* Returns the edit and line if found, with same-file matches preferred
|
|
73
|
+
*/
|
|
74
|
+
export declare function findByExactHash(hash: string, filePath: string): LineMatchResult | null;
|
|
75
|
+
/**
|
|
76
|
+
* Find a line match by normalized hash
|
|
77
|
+
*/
|
|
78
|
+
export declare function findByNormalizedHash(hashNormalized: string, filePath: string): LineMatchResult | null;
|
|
79
|
+
/**
|
|
80
|
+
* Find edits for a specific file (used for substring matching fallback)
|
|
81
|
+
*/
|
|
82
|
+
export declare function findEditsByFile(filePath: string): DbEdit[];
|
|
83
|
+
/**
|
|
84
|
+
* Get lines for a specific edit
|
|
85
|
+
*/
|
|
86
|
+
export declare function getEditLines(editId: number): DbLine[];
|
|
87
|
+
/**
|
|
88
|
+
* Find match using substring containment (Strategy 3 & 4)
|
|
89
|
+
* Only called when hash matches fail
|
|
90
|
+
*/
|
|
91
|
+
export declare function findBySubstring(lineContent: string, filePath: string): LineMatchResult | null;
|
|
92
|
+
/**
|
|
93
|
+
* Find a line match using the priority strategy:
|
|
94
|
+
* 1. Exact hash match (1.0)
|
|
95
|
+
* 2. Normalized hash match (0.95)
|
|
96
|
+
* 3. Line contained in AI content (0.9)
|
|
97
|
+
* 4. AI content contained in line (0.85)
|
|
98
|
+
*/
|
|
99
|
+
export declare function findLineMatch(lineContent: string, lineHash: string, lineHashNormalized: string, filePath: string): LineMatchResult | null;
|
|
100
|
+
/**
|
|
101
|
+
* Mark an edit as matched to a commit
|
|
102
|
+
*/
|
|
103
|
+
export declare function markEditAsMatched(editId: number, commitSha: string): void;
|
|
104
|
+
/**
|
|
105
|
+
* Mark multiple edits as matched
|
|
106
|
+
*/
|
|
107
|
+
export declare function markEditsAsMatched(editIds: number[], commitSha: string): void;
|
|
108
|
+
/**
|
|
109
|
+
* Clean up old entries
|
|
110
|
+
* - Removes matched entries older than maxAgeDays
|
|
111
|
+
* - Removes unmatched entries older than expireDays
|
|
112
|
+
*/
|
|
113
|
+
export declare function cleanupOldEntries(maxAgeDays?: number, expireDays?: number): {
|
|
114
|
+
removed: number;
|
|
115
|
+
kept: number;
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Get count of pending edits
|
|
119
|
+
*/
|
|
120
|
+
export declare function getPendingEditCount(): number;
|
|
121
|
+
/**
|
|
122
|
+
* Get recent pending edits for status display
|
|
123
|
+
*/
|
|
124
|
+
export declare function getRecentPendingEdits(limit?: number): DbEdit[];
|