agentmap 0.8.0 → 0.9.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 (83) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +24 -0
  3. package/dist/cli.js +37 -12
  4. package/dist/cli.js.map +1 -1
  5. package/dist/extract/definitions.js +12 -12
  6. package/dist/extract/definitions.js.map +1 -1
  7. package/dist/extract/definitions.test.js +30 -259
  8. package/dist/extract/definitions.test.js.map +1 -1
  9. package/dist/extract/git-status.d.ts +7 -2
  10. package/dist/extract/git-status.d.ts.map +1 -1
  11. package/dist/extract/git-status.js +12 -18
  12. package/dist/extract/git-status.js.map +1 -1
  13. package/dist/extract/markdown.js +1 -1
  14. package/dist/extract/markdown.test.js +3 -3
  15. package/dist/extract/markdown.test.js.map +1 -1
  16. package/dist/extract/marker.js +1 -1
  17. package/dist/extract/marker.test.js +4 -4
  18. package/dist/extract/marker.test.js.map +1 -1
  19. package/dist/index.d.ts +4 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +5 -4
  22. package/dist/index.js.map +1 -1
  23. package/dist/logger.d.ts +10 -0
  24. package/dist/logger.d.ts.map +1 -0
  25. package/dist/logger.js +41 -0
  26. package/dist/logger.js.map +1 -0
  27. package/dist/map/builder.d.ts.map +1 -1
  28. package/dist/map/builder.js +23 -12
  29. package/dist/map/builder.js.map +1 -1
  30. package/dist/map/builder.test.d.ts +2 -0
  31. package/dist/map/builder.test.d.ts.map +1 -0
  32. package/dist/map/builder.test.js +66 -0
  33. package/dist/map/builder.test.js.map +1 -0
  34. package/dist/map/truncate.d.ts +7 -3
  35. package/dist/map/truncate.d.ts.map +1 -1
  36. package/dist/map/truncate.js +80 -11
  37. package/dist/map/truncate.js.map +1 -1
  38. package/dist/scanner.d.ts.map +1 -1
  39. package/dist/scanner.js +164 -65
  40. package/dist/scanner.js.map +1 -1
  41. package/dist/scanner.test.d.ts +2 -0
  42. package/dist/scanner.test.d.ts.map +1 -0
  43. package/dist/scanner.test.js +84 -0
  44. package/dist/scanner.test.js.map +1 -0
  45. package/dist/test-helpers/git-test-helpers.d.ts +13 -0
  46. package/dist/test-helpers/git-test-helpers.d.ts.map +1 -0
  47. package/dist/test-helpers/git-test-helpers.js +48 -0
  48. package/dist/test-helpers/git-test-helpers.js.map +1 -0
  49. package/dist/types.d.ts +15 -1
  50. package/dist/types.d.ts.map +1 -1
  51. package/package.json +15 -3
  52. package/src/cli.ts +164 -0
  53. package/src/extract/definitions.test.ts +2040 -0
  54. package/src/extract/definitions.ts +379 -0
  55. package/src/extract/git-status.test.ts +507 -0
  56. package/src/extract/git-status.ts +359 -0
  57. package/src/extract/markdown.test.ts +159 -0
  58. package/src/extract/markdown.ts +202 -0
  59. package/src/extract/marker.test.ts +566 -0
  60. package/src/extract/marker.ts +398 -0
  61. package/src/extract/submodules.test.ts +95 -0
  62. package/src/extract/submodules.ts +269 -0
  63. package/src/extract/utils.ts +27 -0
  64. package/src/index.ts +106 -0
  65. package/src/languages/cpp.ts +129 -0
  66. package/src/languages/go.ts +72 -0
  67. package/src/languages/index.ts +231 -0
  68. package/src/languages/javascript.ts +33 -0
  69. package/src/languages/python.ts +41 -0
  70. package/src/languages/rust.ts +72 -0
  71. package/src/languages/typescript.ts +74 -0
  72. package/src/languages/zig.ts +106 -0
  73. package/src/logger.ts +55 -0
  74. package/src/map/builder.test.ts +72 -0
  75. package/src/map/builder.ts +175 -0
  76. package/src/map/truncate.ts +188 -0
  77. package/src/map/yaml.ts +66 -0
  78. package/src/parser/index.ts +53 -0
  79. package/src/parser/languages.ts +64 -0
  80. package/src/scanner.test.ts +95 -0
  81. package/src/scanner.ts +364 -0
  82. package/src/test-helpers/git-test-helpers.ts +62 -0
  83. package/src/types.ts +191 -0
@@ -0,0 +1,48 @@
1
+ // Helpers for creating temporary git repositories in tests.
2
+ import { execSync } from 'child_process';
3
+ import { mkdtempSync, mkdirSync, writeFileSync } from 'fs';
4
+ import { tmpdir } from 'os';
5
+ import { join } from 'path';
6
+ function run(command, cwd) {
7
+ return execSync(command, {
8
+ cwd,
9
+ encoding: 'utf8',
10
+ stdio: ['pipe', 'pipe', 'pipe'],
11
+ });
12
+ }
13
+ export function createTempDir(prefix) {
14
+ return mkdtempSync(join(tmpdir(), prefix));
15
+ }
16
+ export function initRepo(dir) {
17
+ run('git init', dir);
18
+ run('git config user.name "agentmap tests"', dir);
19
+ run('git config user.email "agentmap@example.com"', dir);
20
+ return { dir };
21
+ }
22
+ export function createRepo(prefix) {
23
+ const dir = createTempDir(prefix);
24
+ mkdirSync(dir, { recursive: true });
25
+ return initRepo(dir);
26
+ }
27
+ export function writeTrackedFile(repo, relativePath, content) {
28
+ const filePath = join(repo.dir, relativePath);
29
+ mkdirSync(join(filePath, '..'), { recursive: true });
30
+ writeFileSync(filePath, content, 'utf8');
31
+ }
32
+ export function commitAll(repo, message) {
33
+ run('git add .', repo.dir);
34
+ run(`git commit -m ${JSON.stringify(message)}`, repo.dir);
35
+ }
36
+ export function shortHead(repo) {
37
+ return run('git rev-parse --short HEAD', repo.dir).trim();
38
+ }
39
+ export function addSubmodule(repo, sourceDir, targetPath) {
40
+ run(`git -c protocol.file.allow=always submodule add ${JSON.stringify(sourceDir)} ${JSON.stringify(targetPath)}`, repo.dir);
41
+ }
42
+ export function updateSubmodulesRecursive(repo) {
43
+ run('git -c protocol.file.allow=always submodule update --init --recursive', repo.dir);
44
+ }
45
+ export function deinitSubmodule(repo, targetPath) {
46
+ run(`git submodule deinit -f ${JSON.stringify(targetPath)}`, repo.dir);
47
+ }
48
+ //# sourceMappingURL=git-test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-test-helpers.js","sourceRoot":"","sources":["../../src/test-helpers/git-test-helpers.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAM3B,SAAS,GAAG,CAAC,OAAe,EAAE,GAAW;IACvC,OAAO,QAAQ,CAAC,OAAO,EAAE;QACvB,GAAG;QACH,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IACpB,GAAG,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAA;IACjD,GAAG,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAAA;IACxD,OAAO,EAAE,GAAG,EAAE,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IACjC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAc,EAAE,YAAoB,EAAE,OAAe;IACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAA;IAC7C,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc,EAAE,OAAe;IACvD,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1B,GAAG,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,OAAO,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAc,EAAE,SAAiB,EAAE,UAAkB;IAChF,GAAG,CAAC,mDAAmD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;AAC7H,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAc;IACtD,GAAG,CAAC,uEAAuE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;AACxF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAc,EAAE,UAAkB;IAChE,GAAG,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;AACxE,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type Parser from 'web-tree-sitter';
2
+ import type { Logger } from './logger.js';
2
3
  /**
3
4
  * Supported programming languages
4
5
  */
@@ -32,6 +33,13 @@ export interface SubmoduleEntry {
32
33
  submodule: string;
33
34
  dirty?: string;
34
35
  }
36
+ /**
37
+ * A submodule node in the map.
38
+ * Carries submodule metadata and can also contain nested files/directories.
39
+ */
40
+ export interface SubmoduleNode extends SubmoduleEntry {
41
+ [name: string]: MapNode | FileEntry | SubmoduleNode | string | undefined;
42
+ }
35
43
  /**
36
44
  * Info about a git submodule discovered in the repo
37
45
  */
@@ -53,7 +61,7 @@ export interface SubmoduleInfo {
53
61
  * Recursive map node - either a directory (with children), a file entry, or a submodule entry
54
62
  */
55
63
  export interface MapNode {
56
- [name: string]: MapNode | FileEntry | SubmoduleEntry;
64
+ [name: string]: MapNode | FileEntry | SubmoduleNode;
57
65
  }
58
66
  /**
59
67
  * Result of extracting marker and description from a file
@@ -98,6 +106,8 @@ export interface FileResult {
98
106
  description?: string;
99
107
  definitions: Definition[];
100
108
  diff?: FileDiffStats;
109
+ /** If set, this file is an exact duplicate of another file (by git blob SHA) */
110
+ duplicateOf?: string;
101
111
  }
102
112
  /**
103
113
  * Options for generating the map
@@ -115,8 +125,12 @@ export interface GenerateOptions {
115
125
  diffBase?: string;
116
126
  /** Max definitions per file before truncation (default: 25) */
117
127
  maxDefs?: number;
128
+ /** Max characters for file descriptions before truncation (default: 300). Rounds up to full line. */
129
+ maxDescChars?: number;
118
130
  /** Include submodule info in the map (default: true) */
119
131
  submodules?: boolean;
132
+ /** Logger implementation (default: console logger) */
133
+ logger?: Logger;
120
134
  }
121
135
  /**
122
136
  * A hunk from git diff output
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentmap",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Generate a YAML map of your codebase for AI agent context",
5
5
  "type": "module",
6
6
  "repository": {
@@ -18,13 +18,25 @@
18
18
  "main": "./dist/index.js",
19
19
  "types": "./dist/index.d.ts",
20
20
  "exports": {
21
+ "./package.json": "./package.json",
21
22
  ".": {
22
23
  "types": "./dist/index.d.ts",
23
24
  "default": "./dist/index.js"
25
+ },
26
+ "./src": {
27
+ "types": "./dist/index.d.ts",
28
+ "default": "./src/index.ts"
29
+ },
30
+ "./src/*": {
31
+ "types": "./dist/*.d.ts",
32
+ "default": "./src/*.ts"
24
33
  }
25
34
  },
26
35
  "files": [
27
- "dist"
36
+ "src",
37
+ "dist",
38
+ "README.md",
39
+ "CHANGELOG.md"
28
40
  ],
29
41
  "scripts": {
30
42
  "build": "tsc",
@@ -35,7 +47,7 @@
35
47
  },
36
48
  "dependencies": {
37
49
  "@tree-sitter-grammars/tree-sitter-zig": "^1.1.2",
38
- "cac": "^6.7.14",
50
+ "goke": "^6.2.0",
39
51
  "js-yaml": "^4.1.0",
40
52
  "marked": "^17.0.1",
41
53
  "p-limit": "^7.2.0",
package/src/cli.ts ADDED
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env node
2
+ // CLI entrypoint for generating codebase maps.
3
+
4
+ import { writeFile } from 'fs/promises'
5
+ import { resolve } from 'path'
6
+ import { goke } from 'goke'
7
+ import { generateMap, toYaml } from './index.js'
8
+ import { createConsoleLogger } from './logger.js'
9
+
10
+ const cli = goke('agentmap')
11
+ const logger = createConsoleLogger()
12
+
13
+ function normalizePatterns(value: unknown): string[] | undefined {
14
+ if (typeof value === 'string') {
15
+ const normalized = value.trim()
16
+ return normalized ? [normalized] : undefined
17
+ }
18
+
19
+ if (!Array.isArray(value)) {
20
+ return undefined
21
+ }
22
+
23
+ const normalized = value
24
+ .filter((entry): entry is string => typeof entry === 'string')
25
+ .map(entry => entry.trim())
26
+ .filter(Boolean)
27
+
28
+ return normalized.length > 0 ? normalized : undefined
29
+ }
30
+
31
+ const NO_FILES_MESSAGE = `No files found with header comments.
32
+
33
+ To include a file in the map, add a comment at the top:
34
+
35
+ // Description of this file.
36
+ // What it does and why.
37
+
38
+ export function main() { ... }
39
+
40
+ The description will appear in the 'desc' field of the output.
41
+ `
42
+
43
+ cli
44
+ .command('[dir]', 'Generate a YAML map of the codebase')
45
+ .option('-o, --output <file>', 'Write output to file (default: stdout)')
46
+ .option('-i, --ignore <pattern>', 'Ignore pattern (can be repeated)')
47
+ .option('-f, --filter <pattern>', 'Filter pattern - only include matching files (can be repeated)')
48
+ .option('--no-submodules', 'Exclude submodule info from the map')
49
+ .option('--max-desc-chars <chars>', 'Max characters for descriptions (default: 300, rounds up to full line)')
50
+ .action(async (dir, options) => {
51
+ const targetDir = resolve(dir ?? '.')
52
+
53
+ try {
54
+ const map = await generateMap({
55
+ dir: targetDir,
56
+ ignore: normalizePatterns(options.ignore),
57
+ filter: normalizePatterns(options.filter),
58
+ diff: true,
59
+ submodules: options.noSubmodules ? false : undefined,
60
+ maxDescChars: options.maxDescChars != null && Number.isFinite(Number(options.maxDescChars)) && Number(options.maxDescChars) > 0
61
+ ? Number(options.maxDescChars)
62
+ : undefined,
63
+ logger,
64
+ })
65
+
66
+ // Check if map is empty (only has root key with empty object)
67
+ const rootKey = Object.keys(map)[0]
68
+ const rootValue = map[rootKey]
69
+ if (!rootValue || Object.keys(rootValue).length === 0) {
70
+ logger.warn(NO_FILES_MESSAGE.trimEnd())
71
+ process.exit(0)
72
+ }
73
+
74
+ const yaml = toYaml(map)
75
+
76
+ if (options.output) {
77
+ await writeFile(options.output, yaml, 'utf8')
78
+ logger.info(`Wrote map to ${options.output}`)
79
+ } else {
80
+ process.stdout.write(yaml.endsWith('\n') ? yaml : `${yaml}\n`)
81
+ }
82
+ } catch (err) {
83
+ logger.error('Error:', err instanceof Error ? err.message : err)
84
+ process.exit(1)
85
+ }
86
+ })
87
+
88
+ const PROMPT_TEXT = `Analyze the repository structure first. Look for clear separation of concerns:
89
+ - Monorepo workspaces (package.json workspaces, pnpm-workspace.yaml, etc.)
90
+ - Separate packages or modules
91
+ - Different languages or technology stacks
92
+ - Independent services or apps
93
+
94
+ If you find well-separated packages, use the Task tool to process them concurrently - assign each package/workspace to a separate task agent for speed.
95
+
96
+ For each package/area, identify the most important files - entry points, core modules, main utilities, and key abstractions.
97
+
98
+ For each important file, add a descriptive comment at the top (before any imports or code). The comment should:
99
+ - Be 2-4 lines describing what the file does and why it exists
100
+ - Use the appropriate comment style for the language (// for JS/TS, # for Python, //! for Rust modules, etc.)
101
+ - If the file is an entry point (CLI, main, server start, etc.), mark it as such in the description
102
+ - If the file already has a top comment, review and update it to be accurate and descriptive - don't skip it
103
+ - If the file has a shebang (#!/...), keep it as the first line and add the description comment immediately after
104
+ - Ensure the description comment appears above any import statements in the file
105
+
106
+ Examples:
107
+
108
+ TypeScript/JavaScript:
109
+ // CLI entrypoint for the application.
110
+ // Parses command-line arguments and orchestrates the main workflow.
111
+ import { run } from "./runner"
112
+
113
+ Python:
114
+ # Database connection manager.
115
+ # Handles connection pooling and provides transaction helpers.
116
+ import asyncio
117
+
118
+ Rust:
119
+ //! HTTP server module.
120
+ //! Entry point for the web API, configures routes and middleware.
121
+ use crate::server::start
122
+
123
+ With shebang (shell scripts, node CLI, etc.):
124
+ #!/usr/bin/env node
125
+ // CLI entrypoint for the build tool.
126
+ // Handles argument parsing and runs the build pipeline.
127
+ import { build } from "./build"
128
+
129
+ After adding comments to all important files, run \`npx -y agentmap\` to verify the files appear in the generated map.
130
+
131
+ You can run this prompt again anytime to keep file descriptions up to date as the codebase evolves.
132
+
133
+ Finally, add these instructions to the project's AGENTS.md or CLAUDE.md file (create it if it doesn't exist):
134
+
135
+ \`\`\`markdown
136
+ ## Codebase Map
137
+
138
+ Run \`npx -y agentmap\` to see the repo structure with file descriptions, definitions, and git diff status.
139
+
140
+ When editing files with top-level description comments, keep them accurate and up-to-date with your changes.
141
+ \`\`\`
142
+
143
+ For OpenCode users, also set up the agentmap plugin so future sessions automatically get the codebase map:
144
+ 1. Add "@agentmap/opencode" to the plugin array in ~/.config/opencode/config.json
145
+ - Create the file if it doesn't exist
146
+ - If a plugin array already exists, append to it
147
+ - Example: { "plugin": ["@agentmap/opencode"] }
148
+ 2. Tell the user to restart OpenCode to activate the plugin.`
149
+
150
+ cli
151
+ .command('prompt', 'Generate a prompt to help AI agents add file descriptions')
152
+ .action(() => {
153
+ process.stdout.write(`${PROMPT_TEXT}\n`)
154
+ })
155
+
156
+ cli.help()
157
+ cli.version('0.8.0')
158
+
159
+ if (process.argv.slice(2).some(arg => arg === '-v' || arg === '--version')) {
160
+ cli.outputVersion()
161
+ process.exit(0)
162
+ }
163
+
164
+ cli.parse()