agents-reverse-engineer 0.3.2 → 0.3.4

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/generation/budget/counter.d.ts +0 -8
  2. package/dist/generation/budget/counter.d.ts.map +1 -1
  3. package/dist/generation/budget/counter.js +0 -21
  4. package/dist/generation/budget/counter.js.map +1 -1
  5. package/dist/generation/budget/index.d.ts +1 -1
  6. package/dist/generation/budget/index.d.ts.map +1 -1
  7. package/dist/generation/budget/index.js +1 -1
  8. package/dist/generation/budget/index.js.map +1 -1
  9. package/dist/generation/writers/index.d.ts +0 -3
  10. package/dist/generation/writers/index.d.ts.map +1 -1
  11. package/dist/generation/writers/index.js +0 -3
  12. package/dist/generation/writers/index.js.map +1 -1
  13. package/dist/installer/operations.d.ts +3 -2
  14. package/dist/installer/operations.d.ts.map +1 -1
  15. package/dist/installer/operations.js +118 -50
  16. package/dist/installer/operations.js.map +1 -1
  17. package/dist/installer/uninstall.d.ts +3 -3
  18. package/dist/installer/uninstall.d.ts.map +1 -1
  19. package/dist/installer/uninstall.js +83 -53
  20. package/dist/installer/uninstall.js.map +1 -1
  21. package/dist/integration/generate.d.ts.map +1 -1
  22. package/dist/integration/generate.js +32 -4
  23. package/dist/integration/generate.js.map +1 -1
  24. package/dist/integration/templates.d.ts +0 -4
  25. package/dist/integration/templates.d.ts.map +1 -1
  26. package/dist/integration/templates.js +284 -73
  27. package/dist/integration/templates.js.map +1 -1
  28. package/hooks/dist/are-check-update.js +68 -0
  29. package/hooks/dist/are-session-end.js +47 -0
  30. package/package.json +4 -3
  31. package/dist/generation/writers/claude-md.d.ts +0 -17
  32. package/dist/generation/writers/claude-md.d.ts.map +0 -1
  33. package/dist/generation/writers/claude-md.js +0 -96
  34. package/dist/generation/writers/claude-md.js.map +0 -1
  35. package/dist/generation/writers/gemini-md.d.ts +0 -17
  36. package/dist/generation/writers/gemini-md.d.ts.map +0 -1
  37. package/dist/generation/writers/gemini-md.js +0 -96
  38. package/dist/generation/writers/gemini-md.js.map +0 -1
  39. package/dist/generation/writers/opencode-md.d.ts +0 -17
  40. package/dist/generation/writers/opencode-md.d.ts.map +0 -1
  41. package/dist/generation/writers/opencode-md.js +0 -96
  42. package/dist/generation/writers/opencode-md.js.map +0 -1
  43. package/dist/state/database.d.ts +0 -9
  44. package/dist/state/database.d.ts.map +0 -1
  45. package/dist/state/database.js +0 -66
  46. package/dist/state/database.js.map +0 -1
  47. package/dist/state/index.d.ts +0 -8
  48. package/dist/state/index.d.ts.map +0 -1
  49. package/dist/state/index.js +0 -7
  50. package/dist/state/index.js.map +0 -1
  51. package/dist/state/migrations.d.ts +0 -12
  52. package/dist/state/migrations.d.ts.map +0 -1
  53. package/dist/state/migrations.js +0 -39
  54. package/dist/state/migrations.js.map +0 -1
  55. package/dist/state/types.d.ts +0 -54
  56. package/dist/state/types.d.ts.map +0 -1
  57. package/dist/state/types.js +0 -2
  58. package/dist/state/types.js.map +0 -1
@@ -101,8 +101,17 @@ For each directory (in post-order):
101
101
  Generate root documents:
102
102
 
103
103
  1. **CLAUDE.md** - Synthesize all AGENTS.md into project overview
104
- 2. **ARCHITECTURE.md** - Document system architecture
105
- 3. **STACK.md** - Document technology stack from package.json
104
+ 2. **ARCHITECTURE.md** - Document system architecture (if 20+ source files)
105
+
106
+ Generate per-package documents (at each directory containing package.json, requirements.txt, Cargo.toml, etc.):
107
+
108
+ 1. **STACK.md** - Technology stack from manifest file
109
+ 2. **STRUCTURE.md** - Codebase structure and organization
110
+ 3. **CONVENTIONS.md** - Coding conventions and patterns
111
+ 4. **TESTING.md** - Test setup and patterns
112
+ 5. **INTEGRATIONS.md** - External services and APIs
113
+
114
+ In monorepos, these appear in each package directory (e.g., \`packages/api/STACK.md\`).
106
115
 
107
116
  ## Completion
108
117
 
@@ -226,42 +235,289 @@ Suggest running \`/are:discover --plan\` to start fresh.
226
235
  description: 'Show available ARE commands and usage guide',
227
236
  argumentHint: '',
228
237
  // Content uses COMMAND_PREFIX placeholder, replaced per platform
229
- content: `Show help for agents-reverse-engineer commands.
238
+ content: `<objective>
239
+ Display the complete ARE command reference.
230
240
 
231
- <execution>
232
- Display the following help information:
241
+ Output ONLY the reference content below. Do NOT add:
242
+ - Project-specific analysis
243
+ - Git status or file context
244
+ - Next-step suggestions
245
+ - Any commentary beyond the reference
246
+ </objective>
247
+
248
+ <reference>
249
+ # agents-reverse-engineer (ARE) Command Reference
250
+
251
+ **ARE** generates AI-friendly documentation for codebases, creating structured summaries optimized for AI assistants.
252
+
253
+ ## Quick Start
233
254
 
234
- ## agents-reverse-engineer (ARE) Commands
255
+ 1. \`COMMAND_PREFIXinit\` Create configuration file
256
+ 2. \`COMMAND_PREFIXdiscover --plan\` — Scan codebase, create execution plan
257
+ 3. \`COMMAND_PREFIXgenerate\` — Generate documentation from the plan
258
+ 4. \`COMMAND_PREFIXupdate\` — Keep docs in sync after code changes
259
+
260
+ ## Commands Reference
261
+
262
+ ### \`COMMAND_PREFIXinit\`
263
+ Initialize configuration in this project.
264
+
265
+ Creates \`.agents-reverse-engineer/config.yaml\` with customizable settings.
266
+
267
+ **Usage:** \`COMMAND_PREFIXinit\`
268
+ **CLI:** \`npx are init\`
269
+
270
+ ---
235
271
 
236
- | Command | Description |
237
- |---------|-------------|
238
- | \`COMMAND_PREFIXhelp\` | Show this help message |
239
- | \`COMMAND_PREFIXinit\` | Initialize configuration file |
240
- | \`COMMAND_PREFIXdiscover\` | Discover files (use --plan for GENERATION-PLAN.md) |
241
- | \`COMMAND_PREFIXgenerate\` | Generate documentation from the plan |
242
- | \`COMMAND_PREFIXupdate\` | Update docs for changed files only |
243
- | \`COMMAND_PREFIXclean\` | Remove all generated documentation |
272
+ ### \`COMMAND_PREFIXdiscover\`
273
+ Discover files that would be analyzed for documentation.
244
274
 
245
- ## Typical Workflow
275
+ **Options:**
276
+ | Flag | Description |
277
+ |------|-------------|
278
+ | \`[path]\` | Target directory (default: current directory) |
279
+ | \`--plan\` | Generate \`GENERATION-PLAN.md\` execution plan |
280
+ | \`--show-excluded\` | List excluded files with reasons |
281
+ | \`--quiet, -q\` | Suppress output except errors |
282
+
283
+ **Usage:**
284
+ - \`COMMAND_PREFIXdiscover\` — List discoverable files
285
+ - \`COMMAND_PREFIXdiscover --plan\` — Create execution plan for generate
286
+ - \`COMMAND_PREFIXdiscover --show-excluded\` — Debug exclusion rules
287
+
288
+ **CLI:**
289
+ \`\`\`bash
290
+ npx are discover
291
+ npx are discover --plan
292
+ npx are discover ./src --show-excluded
293
+ \`\`\`
294
+
295
+ ---
296
+
297
+ ### \`COMMAND_PREFIXgenerate\`
298
+ Generate comprehensive documentation for the codebase.
299
+
300
+ **Requires:** Run \`COMMAND_PREFIXdiscover --plan\` first to create \`GENERATION-PLAN.md\`.
301
+
302
+ **Options:**
303
+ | Flag | Description |
304
+ |------|-------------|
305
+ | \`--budget N\` | Override token budget (default: from config) |
306
+ | \`--dry-run\` | Show what would be generated without writing |
307
+ | \`--execute\` | Output JSON execution plan for AI agents |
308
+ | \`--stream\` | Output tasks as streaming JSON, one per line |
309
+ | \`--verbose, -v\` | Show detailed task breakdown |
310
+ | \`--quiet, -q\` | Suppress output except errors |
311
+
312
+ **Usage:**
313
+ - \`COMMAND_PREFIXgenerate\` — Generate docs (resumes from plan)
314
+ - \`COMMAND_PREFIXgenerate --dry-run\` — Preview without writing
315
+
316
+ **CLI:**
317
+ \`\`\`bash
318
+ npx are generate
319
+ npx are generate --dry-run
320
+ npx are generate --budget 50000
321
+ npx are generate --execute # For programmatic use
322
+ \`\`\`
323
+
324
+ **How it works:**
325
+ 1. Reads \`GENERATION-PLAN.md\` and finds unchecked tasks
326
+ 2. Spawns parallel subagents to analyze each file
327
+ 3. Writes \`.sum\` summary files alongside source files
328
+ 4. Generates \`AGENTS.md\` for each directory (post-order)
329
+ 5. Creates root documents: \`CLAUDE.md\`, \`ARCHITECTURE.md\`
330
+ 6. Creates per-package documents at each manifest location: \`STACK.md\`, \`STRUCTURE.md\`, \`CONVENTIONS.md\`, \`TESTING.md\`, \`INTEGRATIONS.md\`
331
+
332
+ ---
333
+
334
+ ### \`COMMAND_PREFIXupdate\`
335
+ Incrementally update documentation for changed files.
336
+
337
+ **Options:**
338
+ | Flag | Description |
339
+ |------|-------------|
340
+ | \`--uncommitted\` | Include staged but uncommitted changes |
341
+ | \`--dry-run\` | Show what would be updated without writing |
342
+ | \`--budget N\` | Override token budget |
343
+ | \`--verbose, -v\` | Show detailed output |
344
+ | \`--quiet, -q\` | Suppress output except errors |
345
+
346
+ **Usage:**
347
+ - \`COMMAND_PREFIXupdate\` — Update docs for committed changes
348
+ - \`COMMAND_PREFIXupdate --uncommitted\` — Include uncommitted changes
349
+
350
+ **CLI:**
351
+ \`\`\`bash
352
+ npx are update
353
+ npx are update --uncommitted --verbose
354
+ npx are update --dry-run
355
+ \`\`\`
356
+
357
+ ---
358
+
359
+ ### \`COMMAND_PREFIXclean\`
360
+ Remove all generated documentation artifacts.
361
+
362
+ **Options:**
363
+ | Flag | Description |
364
+ |------|-------------|
365
+ | \`--dry-run\` | Show what would be deleted without deleting |
366
+
367
+ **What gets deleted:**
368
+ - \`.agents-reverse-engineer/GENERATION-PLAN.md\`
369
+ - All \`*.sum\` files
370
+ - All \`AGENTS.md\` files
371
+ - Root docs: \`CLAUDE.md\`, \`ARCHITECTURE.md\`
372
+ - Per-package docs: \`STACK.md\`, \`STRUCTURE.md\`, \`CONVENTIONS.md\`, \`TESTING.md\`, \`INTEGRATIONS.md\`
373
+
374
+ **Usage:**
375
+ - \`COMMAND_PREFIXclean --dry-run\` — Preview deletions
376
+ - \`COMMAND_PREFIXclean\` — Delete all artifacts
377
+
378
+ ---
379
+
380
+ ### \`COMMAND_PREFIXhelp\`
381
+ Show this command reference.
382
+
383
+ ## CLI Installation
384
+
385
+ Install ARE commands to your AI assistant:
386
+
387
+ \`\`\`bash
388
+ npx agents-reverse-engineer install # Interactive mode
389
+ npx agents-reverse-engineer install --runtime claude -g # Global Claude
390
+ npx agents-reverse-engineer install --runtime claude -l # Local project
391
+ npx agents-reverse-engineer install --runtime all -g # All runtimes
392
+ \`\`\`
246
393
 
247
- 1. **\`COMMAND_PREFIXinit\`** — Create \`.agents-reverse-engineer/config.yaml\`
248
- 2. **\`COMMAND_PREFIXdiscover --plan\`** Scan codebase, create \`GENERATION-PLAN.md\`
249
- 3. **\`COMMAND_PREFIXgenerate\`** — Execute plan, generate \`.sum\` and \`AGENTS.md\` files
250
- 4. **\`COMMAND_PREFIXupdate\`** After code changes, update only what changed
394
+ **Install/Uninstall Options:**
395
+ | Flag | Description |
396
+ |------|-------------|
397
+ | \`--runtime <name>\` | Target: \`claude\`, \`opencode\`, \`gemini\`, \`all\` |
398
+ | \`-g, --global\` | Install to global config directory |
399
+ | \`-l, --local\` | Install to current project directory |
400
+ | \`--force\` | Overwrite existing files (install only) |
401
+
402
+ ## Configuration
403
+
404
+ **File:** \`.agents-reverse-engineer/config.yaml\`
405
+
406
+ \`\`\`yaml
407
+ # Exclusion patterns
408
+ exclude:
409
+ patterns:
410
+ - "**/*.test.ts"
411
+ - "**/__mocks__/**"
412
+ vendorDirs:
413
+ - node_modules
414
+ - dist
415
+ - .git
416
+ binaryExtensions:
417
+ - .png
418
+ - .jpg
419
+ - .pdf
420
+
421
+ # Options
422
+ options:
423
+ followSymlinks: false
424
+ maxFileSize: 100000
425
+
426
+ # Output settings
427
+ output:
428
+ verbose: false
429
+ colors: true
430
+
431
+ # Generation settings
432
+ generation:
433
+ tokenBudget: 50000
434
+ \`\`\`
251
435
 
252
436
  ## Generated Files
253
437
 
254
- - \`*.sum\` — Per-file summaries (purpose, exports, dependencies)
255
- - \`AGENTS.md\` — Per-directory overviews
256
- - \`CLAUDE.md\` — Project entry point
257
- - \`ARCHITECTURE.md\` — System design overview
258
- - \`STACK.md\` — Technology stack
438
+ ### Per Source File
259
439
 
260
- ## More Info
440
+ **\`*.sum\`** File summaries with YAML frontmatter + detailed prose.
261
441
 
262
- - Docs: https://github.com/GeoloeG-IsT/agents-reverse-engineer
263
- - Update: \`npx agents-reverse-engineer@latest\`
264
- </execution>`,
442
+ \`\`\`yaml
443
+ ---
444
+ file_type: service
445
+ generated_at: 2025-01-15T10:30:00Z
446
+ content_hash: abc123...
447
+ purpose: Handles user authentication and session management
448
+ public_interface: [login(), logout(), refreshToken(), AuthService]
449
+ dependencies: [express, jsonwebtoken, ./user-model]
450
+ patterns: [singleton, factory, observer]
451
+ related_files: [./types.ts, ./middleware.ts]
452
+ ---
453
+
454
+ <300-500 word summary covering implementation, patterns, edge cases>
455
+ \`\`\`
456
+
457
+ ### Per Directory
458
+
459
+ **\`AGENTS.md\`** — Directory overview synthesized from \`.sum\` files. Groups files by purpose and links to subdirectories.
460
+
461
+ ### Root Documents
462
+
463
+ | File | Purpose |
464
+ |------|---------|
465
+ | \`CLAUDE.md\` | Project entry point — synthesizes all AGENTS.md |
466
+ | \`ARCHITECTURE.md\` | System design, layers, data flow (if 20+ files) |
467
+
468
+ ### Per-Package Documents (at each manifest file location)
469
+
470
+ Generated alongside \`package.json\`, \`requirements.txt\`, \`Cargo.toml\`, etc.:
471
+
472
+ | File | Purpose |
473
+ |------|---------|
474
+ | \`STACK.md\` | Technology stack from manifest |
475
+ | \`STRUCTURE.md\` | Codebase structure and organization |
476
+ | \`CONVENTIONS.md\` | Coding conventions and patterns |
477
+ | \`TESTING.md\` | Test setup and patterns |
478
+ | \`INTEGRATIONS.md\` | External services and APIs |
479
+
480
+ In monorepos, these appear in each package directory (e.g., \`packages/api/STACK.md\`).
481
+
482
+ ## Common Workflows
483
+
484
+ **Initial documentation:**
485
+ \`\`\`
486
+ COMMAND_PREFIXinit
487
+ COMMAND_PREFIXdiscover --plan
488
+ COMMAND_PREFIXgenerate
489
+ \`\`\`
490
+
491
+ **After code changes:**
492
+ \`\`\`
493
+ COMMAND_PREFIXupdate
494
+ \`\`\`
495
+
496
+ **Full regeneration:**
497
+ \`\`\`
498
+ COMMAND_PREFIXclean
499
+ COMMAND_PREFIXdiscover --plan
500
+ COMMAND_PREFIXgenerate
501
+ \`\`\`
502
+
503
+ **Preview before generating:**
504
+ \`\`\`
505
+ COMMAND_PREFIXdiscover --show-excluded # Check exclusions
506
+ COMMAND_PREFIXgenerate --dry-run # Preview generation
507
+ \`\`\`
508
+
509
+ ## Tips
510
+
511
+ - **Resume generation**: If interrupted, run \`COMMAND_PREFIXgenerate\` again — it resumes from unchecked tasks in \`GENERATION-PLAN.md\`
512
+ - **Large codebases**: Use \`--budget N\` to limit token usage per run
513
+ - **Custom exclusions**: Edit \`.agents-reverse-engineer/config.yaml\` to skip files
514
+ - **Hook auto-update**: Install creates a session-end hook that auto-runs update
515
+
516
+ ## Resources
517
+
518
+ - **Repository:** https://github.com/GeoloeG-IsT/agents-reverse-engineer
519
+ - **Update:** \`npx agents-reverse-engineer@latest install --force\`
520
+ </reference>`,
265
521
  },
266
522
  };
267
523
  const PLATFORM_CONFIGS = {
@@ -342,49 +598,4 @@ export function getOpenCodeTemplates() {
342
598
  export function getGeminiTemplates() {
343
599
  return getTemplatesForPlatform('gemini');
344
600
  }
345
- /**
346
- * Get session-end hook template for automatic documentation updates
347
- */
348
- export function getHookTemplate() {
349
- return `#!/usr/bin/env node
350
- // .claude/hooks/are-session-end.js
351
- // Triggers are update when session ends (if there are uncommitted changes)
352
-
353
- const { execSync, spawn } = require('child_process');
354
- const fs = require('fs');
355
-
356
- // Check for disable flag
357
- if (process.env.ARE_DISABLE_HOOK === '1') {
358
- process.exit(0);
359
- }
360
-
361
- // Check config file for permanent disable
362
- const configPath = '.agents-reverse-engineer.yaml';
363
- if (fs.existsSync(configPath)) {
364
- const config = fs.readFileSync(configPath, 'utf-8');
365
- if (config.includes('hook_enabled: false')) {
366
- process.exit(0);
367
- }
368
- }
369
-
370
- // Check git status - skip if no changes
371
- try {
372
- const status = execSync('git status --porcelain', { encoding: 'utf-8' });
373
- if (!status.trim()) {
374
- // No changes since last run - exit silently
375
- process.exit(0);
376
- }
377
- } catch {
378
- // Not a git repo or git not available - exit silently
379
- process.exit(0);
380
- }
381
-
382
- // Run update in background (don't block session close)
383
- const child = spawn('npx', ['agents-reverse-engineer@latest', 'update', '--quiet'], {
384
- stdio: 'ignore',
385
- detached: true,
386
- });
387
- child.unref();
388
- `;
389
- }
390
601
  //# sourceMappingURL=templates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/integration/templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/integration/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ARE Update Check Hook
4
+ *
5
+ * Checks for ARE updates in background, writes result to cache.
6
+ * Called by SessionStart hook - runs once per session.
7
+ *
8
+ * Cache file: ~/.claude/cache/are-update-check.json
9
+ */
10
+
11
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
12
+ import { homedir } from 'os';
13
+ import { join } from 'path';
14
+ import { spawn, execSync } from 'child_process';
15
+
16
+ const homeDir = homedir();
17
+ const cwd = process.cwd();
18
+ const cacheDir = join(homeDir, '.claude', 'cache');
19
+ const cacheFile = join(cacheDir, 'are-update-check.json');
20
+
21
+ // VERSION file locations (check project first, then global)
22
+ const projectVersionFile = join(cwd, '.claude', 'VERSION');
23
+ const globalVersionFile = join(homeDir, '.claude', 'VERSION');
24
+
25
+ // Ensure cache directory exists
26
+ if (!existsSync(cacheDir)) {
27
+ mkdirSync(cacheDir, { recursive: true });
28
+ }
29
+
30
+ // Run check in background (spawn background process)
31
+ const child = spawn(process.execPath, ['-e', `
32
+ const fs = require('fs');
33
+ const { execSync } = require('child_process');
34
+
35
+ const cacheFile = ${JSON.stringify(cacheFile)};
36
+ const projectVersionFile = ${JSON.stringify(projectVersionFile)};
37
+ const globalVersionFile = ${JSON.stringify(globalVersionFile)};
38
+
39
+ // Check project directory first (local install), then global
40
+ let installed = '0.0.0';
41
+ try {
42
+ if (fs.existsSync(projectVersionFile)) {
43
+ installed = fs.readFileSync(projectVersionFile, 'utf8').trim();
44
+ } else if (fs.existsSync(globalVersionFile)) {
45
+ installed = fs.readFileSync(globalVersionFile, 'utf8').trim();
46
+ }
47
+ } catch (e) {}
48
+
49
+ let latest = null;
50
+ try {
51
+ latest = execSync('npm view agents-reverse-engineer version', { encoding: 'utf8', timeout: 10000, windowsHide: true }).trim();
52
+ } catch (e) {}
53
+
54
+ const result = {
55
+ update_available: latest && installed !== latest,
56
+ installed,
57
+ latest: latest || 'unknown',
58
+ checked: Math.floor(Date.now() / 1000)
59
+ };
60
+
61
+ fs.writeFileSync(cacheFile, JSON.stringify(result));
62
+ `], {
63
+ stdio: 'ignore',
64
+ detached: true,
65
+ windowsHide: true,
66
+ });
67
+
68
+ child.unref();
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ARE Session End Hook
4
+ *
5
+ * Triggers `are update` when session ends (if there are uncommitted changes).
6
+ * Runs in background to avoid blocking session close.
7
+ *
8
+ * Disable via:
9
+ * - Environment variable: ARE_DISABLE_HOOK=1
10
+ * - Config file: hook_enabled: false in .agents-reverse-engineer.yaml
11
+ */
12
+
13
+ import { execSync, spawn } from 'child_process';
14
+ import { existsSync, readFileSync } from 'fs';
15
+
16
+ // Check for disable flag
17
+ if (process.env.ARE_DISABLE_HOOK === '1') {
18
+ process.exit(0);
19
+ }
20
+
21
+ // Check config file for permanent disable
22
+ const configPath = '.agents-reverse-engineer.yaml';
23
+ if (existsSync(configPath)) {
24
+ const config = readFileSync(configPath, 'utf-8');
25
+ if (config.includes('hook_enabled: false')) {
26
+ process.exit(0);
27
+ }
28
+ }
29
+
30
+ // Check git status - skip if no changes
31
+ try {
32
+ const status = execSync('git status --porcelain', { encoding: 'utf-8' });
33
+ if (!status.trim()) {
34
+ // No changes since last run - exit silently
35
+ process.exit(0);
36
+ }
37
+ } catch {
38
+ // Not a git repo or git not available - exit silently
39
+ process.exit(0);
40
+ }
41
+
42
+ // Run update in background (don't block session close)
43
+ const child = spawn('npx', ['agents-reverse-engineer@latest', 'update', '--quiet'], {
44
+ stdio: 'ignore',
45
+ detached: true,
46
+ });
47
+ child.unref();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agents-reverse-engineer",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "CLI tool for reverse-engineering codebase documentation for AI agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,11 +9,12 @@
9
9
  },
10
10
  "scripts": {
11
11
  "build": "tsc",
12
+ "build:hooks": "node scripts/build-hooks.js",
13
+ "prepublishOnly": "npm run build && npm run build:hooks",
12
14
  "dev": "tsx watch src/cli/index.ts",
13
15
  "test": "vitest"
14
16
  },
15
17
  "dependencies": {
16
- "better-sqlite3": "^12.6.2",
17
18
  "fast-glob": "^3.3.3",
18
19
  "gpt-tokenizer": "^3.4.0",
19
20
  "ignore": "^7.0.3",
@@ -25,7 +26,6 @@
25
26
  "zod": "^3.24.1"
26
27
  },
27
28
  "devDependencies": {
28
- "@types/better-sqlite3": "^7.6.13",
29
29
  "@types/node": "^22.10.7",
30
30
  "tsx": "^4.19.2",
31
31
  "typescript": "^5.7.3",
@@ -46,6 +46,7 @@
46
46
  "main": "dist/cli/index.js",
47
47
  "files": [
48
48
  "dist",
49
+ "hooks/dist",
49
50
  "README.md",
50
51
  "LICENSE"
51
52
  ],
@@ -1,17 +0,0 @@
1
- /**
2
- * Write CLAUDE.md at the project root.
3
- *
4
- * Only writes if Claude Code is installed locally (`.claude` directory exists).
5
- * If a user-defined CLAUDE.md exists (not generated by us), it will be
6
- * preserved as CLAUDE.local.md and referenced in the generated file.
7
- *
8
- * @param projectRoot - Project root directory
9
- * @returns Path to written CLAUDE.md, or null if Claude Code is not installed
10
- */
11
- export declare function writeClaudeMd(projectRoot: string): Promise<string | null>;
12
- /**
13
- * Get the content that would be written to CLAUDE.md.
14
- * Useful for previewing without writing.
15
- */
16
- export declare function getClaudeMdContent(): string;
17
- //# sourceMappingURL=claude-md.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../../src/generation/writers/claude-md.ts"],"names":[],"mappings":"AA4DA;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4B/E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -1,96 +0,0 @@
1
- import { writeFile, readFile, stat, rename } from 'node:fs/promises';
2
- import * as path from 'node:path';
3
- import { isRuntimeInstalledLocally } from '../../installer/paths.js';
4
- /** Marker comment to identify generated CLAUDE.md files */
5
- const GENERATED_MARKER = '<!-- Generated by agents-reverse-engineer -->';
6
- /**
7
- * Standard CLAUDE.md content - simple pointer to AGENTS.md.
8
- *
9
- * Per CONTEXT.md: "Simple pointer to AGENTS.md for Anthropic compatibility"
10
- */
11
- function buildClaudeMdContent(hasLocalFile) {
12
- const sections = [];
13
- // Generated marker (first line)
14
- sections.push(GENERATED_MARKER);
15
- sections.push('');
16
- // Reference to user-defined local file if it exists
17
- if (hasLocalFile) {
18
- sections.push('> **Note:** This project has additional documentation in [CLAUDE.local.md](./CLAUDE.local.md)');
19
- sections.push('');
20
- }
21
- sections.push('# CLAUDE.md');
22
- sections.push('');
23
- sections.push('See [AGENTS.md](./AGENTS.md) for codebase documentation.');
24
- sections.push('');
25
- sections.push('This file exists for Anthropic compatibility. The actual documentation');
26
- sections.push('is maintained in AGENTS.md files throughout the codebase.');
27
- sections.push('');
28
- return sections.join('\n');
29
- }
30
- /**
31
- * Check if a file was generated by us (contains marker).
32
- */
33
- async function isGeneratedFile(filePath) {
34
- try {
35
- const content = await readFile(filePath, 'utf-8');
36
- return content.includes(GENERATED_MARKER);
37
- }
38
- catch {
39
- return false;
40
- }
41
- }
42
- /**
43
- * Check if a local file exists.
44
- */
45
- async function hasLocalFile(localPath) {
46
- try {
47
- await stat(localPath);
48
- return true;
49
- }
50
- catch {
51
- return false;
52
- }
53
- }
54
- /**
55
- * Write CLAUDE.md at the project root.
56
- *
57
- * Only writes if Claude Code is installed locally (`.claude` directory exists).
58
- * If a user-defined CLAUDE.md exists (not generated by us), it will be
59
- * preserved as CLAUDE.local.md and referenced in the generated file.
60
- *
61
- * @param projectRoot - Project root directory
62
- * @returns Path to written CLAUDE.md, or null if Claude Code is not installed
63
- */
64
- export async function writeClaudeMd(projectRoot) {
65
- // Only generate if Claude Code is installed locally
66
- const isInstalled = await isRuntimeInstalledLocally('claude', projectRoot);
67
- if (!isInstalled) {
68
- return null;
69
- }
70
- const claudePath = path.join(projectRoot, 'CLAUDE.md');
71
- const localPath = path.join(projectRoot, 'CLAUDE.local.md');
72
- // Check if existing CLAUDE.md is user-defined (not generated by us)
73
- let hasLocal = await hasLocalFile(localPath);
74
- try {
75
- const existingIsGenerated = await isGeneratedFile(claudePath);
76
- if (!existingIsGenerated) {
77
- // User-defined CLAUDE.md exists - preserve it
78
- await rename(claudePath, localPath);
79
- hasLocal = true;
80
- }
81
- }
82
- catch {
83
- // No existing CLAUDE.md - that's fine
84
- }
85
- const content = buildClaudeMdContent(hasLocal);
86
- await writeFile(claudePath, content, 'utf-8');
87
- return claudePath;
88
- }
89
- /**
90
- * Get the content that would be written to CLAUDE.md.
91
- * Useful for previewing without writing.
92
- */
93
- export function getClaudeMdContent() {
94
- return buildClaudeMdContent(false);
95
- }
96
- //# sourceMappingURL=claude-md.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../../src/generation/writers/claude-md.ts"],"names":[],"mappings":"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"}