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.
- package/dist/generation/budget/counter.d.ts +0 -8
- package/dist/generation/budget/counter.d.ts.map +1 -1
- package/dist/generation/budget/counter.js +0 -21
- package/dist/generation/budget/counter.js.map +1 -1
- package/dist/generation/budget/index.d.ts +1 -1
- package/dist/generation/budget/index.d.ts.map +1 -1
- package/dist/generation/budget/index.js +1 -1
- package/dist/generation/budget/index.js.map +1 -1
- package/dist/generation/writers/index.d.ts +0 -3
- package/dist/generation/writers/index.d.ts.map +1 -1
- package/dist/generation/writers/index.js +0 -3
- package/dist/generation/writers/index.js.map +1 -1
- package/dist/installer/operations.d.ts +3 -2
- package/dist/installer/operations.d.ts.map +1 -1
- package/dist/installer/operations.js +118 -50
- package/dist/installer/operations.js.map +1 -1
- package/dist/installer/uninstall.d.ts +3 -3
- package/dist/installer/uninstall.d.ts.map +1 -1
- package/dist/installer/uninstall.js +83 -53
- package/dist/installer/uninstall.js.map +1 -1
- package/dist/integration/generate.d.ts.map +1 -1
- package/dist/integration/generate.js +32 -4
- package/dist/integration/generate.js.map +1 -1
- package/dist/integration/templates.d.ts +0 -4
- package/dist/integration/templates.d.ts.map +1 -1
- package/dist/integration/templates.js +284 -73
- package/dist/integration/templates.js.map +1 -1
- package/hooks/dist/are-check-update.js +68 -0
- package/hooks/dist/are-session-end.js +47 -0
- package/package.json +4 -3
- package/dist/generation/writers/claude-md.d.ts +0 -17
- package/dist/generation/writers/claude-md.d.ts.map +0 -1
- package/dist/generation/writers/claude-md.js +0 -96
- package/dist/generation/writers/claude-md.js.map +0 -1
- package/dist/generation/writers/gemini-md.d.ts +0 -17
- package/dist/generation/writers/gemini-md.d.ts.map +0 -1
- package/dist/generation/writers/gemini-md.js +0 -96
- package/dist/generation/writers/gemini-md.js.map +0 -1
- package/dist/generation/writers/opencode-md.d.ts +0 -17
- package/dist/generation/writers/opencode-md.d.ts.map +0 -1
- package/dist/generation/writers/opencode-md.js +0 -96
- package/dist/generation/writers/opencode-md.js.map +0 -1
- package/dist/state/database.d.ts +0 -9
- package/dist/state/database.d.ts.map +0 -1
- package/dist/state/database.js +0 -66
- package/dist/state/database.js.map +0 -1
- package/dist/state/index.d.ts +0 -8
- package/dist/state/index.d.ts.map +0 -1
- package/dist/state/index.js +0 -7
- package/dist/state/index.js.map +0 -1
- package/dist/state/migrations.d.ts +0 -12
- package/dist/state/migrations.d.ts.map +0 -1
- package/dist/state/migrations.js +0 -39
- package/dist/state/migrations.js.map +0 -1
- package/dist/state/types.d.ts +0 -54
- package/dist/state/types.d.ts.map +0 -1
- package/dist/state/types.js +0 -2
- 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
|
-
|
|
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:
|
|
238
|
+
content: `<objective>
|
|
239
|
+
Display the complete ARE command reference.
|
|
230
240
|
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
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
|
-
|
|
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
|
-
|
|
440
|
+
**\`*.sum\`** — File summaries with YAML frontmatter + detailed prose.
|
|
261
441
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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":"AAAA;;;;GAIG;AAIH,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE;QACR,WAAW,EAAE,4DAA4D;QACzE,YAAY,EAAE,0BAA0B;QACxC,OAAO,EAAE
|
|
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.
|
|
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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"}
|