agentmap 0.7.1 → 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 (96) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +24 -0
  3. package/dist/cli.js +44 -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 +11 -4
  10. package/dist/extract/git-status.d.ts.map +1 -1
  11. package/dist/extract/git-status.js +21 -16
  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/extract/submodules.d.ts +12 -0
  20. package/dist/extract/submodules.d.ts.map +1 -0
  21. package/dist/extract/submodules.js +234 -0
  22. package/dist/extract/submodules.js.map +1 -0
  23. package/dist/extract/submodules.test.d.ts +2 -0
  24. package/dist/extract/submodules.test.d.ts.map +1 -0
  25. package/dist/extract/submodules.test.js +84 -0
  26. package/dist/extract/submodules.test.js.map +1 -0
  27. package/dist/index.d.ts +4 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +10 -9
  30. package/dist/index.js.map +1 -1
  31. package/dist/logger.d.ts +10 -0
  32. package/dist/logger.d.ts.map +1 -0
  33. package/dist/logger.js +41 -0
  34. package/dist/logger.js.map +1 -0
  35. package/dist/map/builder.d.ts +3 -3
  36. package/dist/map/builder.d.ts.map +1 -1
  37. package/dist/map/builder.js +59 -9
  38. package/dist/map/builder.js.map +1 -1
  39. package/dist/map/builder.test.d.ts +2 -0
  40. package/dist/map/builder.test.d.ts.map +1 -0
  41. package/dist/map/builder.test.js +66 -0
  42. package/dist/map/builder.test.js.map +1 -0
  43. package/dist/map/truncate.d.ts +7 -3
  44. package/dist/map/truncate.d.ts.map +1 -1
  45. package/dist/map/truncate.js +90 -9
  46. package/dist/map/truncate.js.map +1 -1
  47. package/dist/map/yaml.d.ts.map +1 -1
  48. package/dist/map/yaml.js +13 -3
  49. package/dist/map/yaml.js.map +1 -1
  50. package/dist/scanner.d.ts +9 -2
  51. package/dist/scanner.d.ts.map +1 -1
  52. package/dist/scanner.js +172 -49
  53. package/dist/scanner.js.map +1 -1
  54. package/dist/scanner.test.d.ts +2 -0
  55. package/dist/scanner.test.d.ts.map +1 -0
  56. package/dist/scanner.test.js +84 -0
  57. package/dist/scanner.test.js.map +1 -0
  58. package/dist/test-helpers/git-test-helpers.d.ts +13 -0
  59. package/dist/test-helpers/git-test-helpers.d.ts.map +1 -0
  60. package/dist/test-helpers/git-test-helpers.js +48 -0
  61. package/dist/test-helpers/git-test-helpers.js.map +1 -0
  62. package/dist/types.d.ts +42 -2
  63. package/dist/types.d.ts.map +1 -1
  64. package/package.json +15 -3
  65. package/src/cli.ts +164 -0
  66. package/src/extract/definitions.test.ts +2040 -0
  67. package/src/extract/definitions.ts +379 -0
  68. package/src/extract/git-status.test.ts +507 -0
  69. package/src/extract/git-status.ts +359 -0
  70. package/src/extract/markdown.test.ts +159 -0
  71. package/src/extract/markdown.ts +202 -0
  72. package/src/extract/marker.test.ts +566 -0
  73. package/src/extract/marker.ts +398 -0
  74. package/src/extract/submodules.test.ts +95 -0
  75. package/src/extract/submodules.ts +269 -0
  76. package/src/extract/utils.ts +27 -0
  77. package/src/index.ts +106 -0
  78. package/src/languages/cpp.ts +129 -0
  79. package/src/languages/go.ts +72 -0
  80. package/src/languages/index.ts +231 -0
  81. package/src/languages/javascript.ts +33 -0
  82. package/src/languages/python.ts +41 -0
  83. package/src/languages/rust.ts +72 -0
  84. package/src/languages/typescript.ts +74 -0
  85. package/src/languages/zig.ts +106 -0
  86. package/src/logger.ts +55 -0
  87. package/src/map/builder.test.ts +72 -0
  88. package/src/map/builder.ts +175 -0
  89. package/src/map/truncate.ts +188 -0
  90. package/src/map/yaml.ts +66 -0
  91. package/src/parser/index.ts +53 -0
  92. package/src/parser/languages.ts +64 -0
  93. package/src/scanner.test.ts +95 -0
  94. package/src/scanner.ts +364 -0
  95. package/src/test-helpers/git-test-helpers.ts +62 -0
  96. package/src/types.ts +191 -0
package/dist/scanner.js CHANGED
@@ -1,5 +1,6 @@
1
- // Scan directory for files with header comments/docstrings.
1
+ // Scan directory for files with header comments/docstrings and recurse into submodules.
2
2
  import { execSync } from 'child_process';
3
+ import { realpathSync } from 'fs';
3
4
  import pLimit from 'p-limit';
4
5
  import picomatch from 'picomatch';
5
6
  import { readFile } from 'fs/promises';
@@ -7,6 +8,8 @@ import { join, normalize } from 'path';
7
8
  import { extractMarkerFromCode, extractMarkdownDescription } from './extract/marker.js';
8
9
  import { extractDefinitions } from './extract/definitions.js';
9
10
  import { getAllDiffData, applyDiffToDefinitions } from './extract/git-status.js';
11
+ import { getSubmodules, getSubmodulePaths } from './extract/submodules.js';
12
+ import { createConsoleLogger } from './logger.js';
10
13
  import { parseCode, detectLanguage, LANGUAGE_EXTENSIONS } from './parser/index.js';
11
14
  /**
12
15
  * Maximum number of files to process (safety limit)
@@ -32,92 +35,212 @@ function isReadmeFile(filepath) {
32
35
  return filename === 'readme.md' || filename === 'readme';
33
36
  }
34
37
  /**
35
- * Get tracked files using git ls-files
36
- * Only returns files that are tracked by git (committed or staged)
38
+ * Get tracked files using git ls-files -z -s.
39
+ * NUL-delimited for safe cross-platform parsing of any filename.
40
+ * Filters out symlinks (mode 120000).
41
+ * Returns path + blob SHA for duplicate detection.
42
+ *
43
+ * Format per entry: "<mode> <sha> <stage>\t<path>\0"
37
44
  */
38
45
  function getGitFiles(dir) {
39
46
  const maxBuffer = 1024 * 10000000;
40
47
  try {
41
- // Get only tracked files
42
- const stdout = execSync('git ls-files', {
48
+ const stdout = execSync('git ls-files -z -s', {
43
49
  cwd: dir,
44
50
  maxBuffer,
45
51
  encoding: 'utf8',
46
52
  });
47
- return stdout
48
- .split(/\r?\n/)
49
- .map(x => x.trim())
50
- .filter(Boolean)
51
- .map(normalize);
53
+ const results = [];
54
+ // Split on NUL byte, filter empty trailing entry
55
+ const entries = stdout.split('\0').filter(Boolean);
56
+ for (const entry of entries) {
57
+ // Format: "<mode> <sha> <stage>\t<path>"
58
+ const tabIdx = entry.indexOf('\t');
59
+ if (tabIdx === -1)
60
+ continue;
61
+ const meta = entry.slice(0, tabIdx);
62
+ const path = entry.slice(tabIdx + 1);
63
+ const spaceIdx = meta.indexOf(' ');
64
+ if (spaceIdx === -1)
65
+ continue;
66
+ const mode = meta.slice(0, spaceIdx);
67
+ const sha = meta.slice(spaceIdx + 1, meta.indexOf(' ', spaceIdx + 1));
68
+ // Skip symlinks (mode 120000)
69
+ if (mode === '120000')
70
+ continue;
71
+ results.push({ path: normalize(path), sha });
72
+ }
73
+ return results;
52
74
  }
53
75
  catch {
54
76
  return [];
55
77
  }
56
78
  }
57
79
  /**
58
- * Scan directory and process files with header comments
80
+ * Build a map of blob SHA shortest path for duplicate detection.
81
+ * Files sharing the same blob SHA are exact duplicates in git.
59
82
  */
60
- export async function scanDirectory(options = {}) {
61
- const dir = options.dir ?? process.cwd();
62
- // Filter out null/undefined/empty patterns (cac can pass [null] when option not used)
63
- const ignorePatterns = (options.ignore ?? []).filter((p) => !!p);
64
- const filterPatterns = (options.filter ?? []).filter((p) => !!p);
65
- const includeDiff = options.diff ?? false;
66
- // Get file list from git (caller should ensure we're in a git repo)
67
- let files = getGitFiles(dir);
68
- // Filter by supported extensions or README files
69
- files = files.filter(f => isSupportedFile(f) || isReadmeFile(f));
70
- // Filter by filter patterns (only include matching files)
71
- if (filterPatterns.length > 0) {
72
- const isIncluded = picomatch(filterPatterns);
73
- files = files.filter(f => isIncluded(f));
74
- }
75
- // Filter by ignore patterns
76
- if (ignorePatterns.length > 0) {
77
- const isIgnored = picomatch(ignorePatterns);
78
- files = files.filter(f => !isIgnored(f));
79
- }
80
- // Safety check: bail if too many files to avoid scanning huge directories
81
- if (files.length > MAX_FILES) {
82
- console.error(`Warning: Too many files (${files.length} > ${MAX_FILES}), skipping scan`);
83
- return [];
83
+ function buildDuplicateMap(files, pathPrefix) {
84
+ // Group paths by SHA
85
+ const shaToEntries = new Map();
86
+ for (const { path, sha } of files) {
87
+ const prefixed = joinRelativePath(pathPrefix, path);
88
+ const existing = shaToEntries.get(sha);
89
+ if (existing) {
90
+ existing.push(prefixed);
91
+ }
92
+ else {
93
+ shaToEntries.set(sha, [prefixed]);
94
+ }
95
+ }
96
+ // For each group with >1 file, shortest path is the original
97
+ const duplicateOf = new Map();
98
+ for (const paths of shaToEntries.values()) {
99
+ if (paths.length < 2)
100
+ continue;
101
+ paths.sort((a, b) => a.length - b.length || a.localeCompare(b));
102
+ const original = paths[0];
103
+ for (let i = 1; i < paths.length; i++) {
104
+ duplicateOf.set(paths[i], original);
105
+ }
106
+ }
107
+ return duplicateOf;
108
+ }
109
+ function normalizeRelativePath(path) {
110
+ return path.replace(/\\/g, '/');
111
+ }
112
+ function joinRelativePath(prefix, path) {
113
+ const normalizedPath = normalizeRelativePath(path);
114
+ return prefix ? `${prefix}/${normalizedPath}` : normalizedPath;
115
+ }
116
+ function getCanonicalRepoDir(dir) {
117
+ try {
118
+ return realpathSync(dir);
119
+ }
120
+ catch {
121
+ return dir;
122
+ }
123
+ }
124
+ async function scanRepo(options) {
125
+ const canonicalRepoDir = getCanonicalRepoDir(options.repoDir);
126
+ if (options.visitedRepoDirs.has(canonicalRepoDir)) {
127
+ return { files: [], submodules: [] };
128
+ }
129
+ options.visitedRepoDirs.add(canonicalRepoDir);
130
+ let submodules = [];
131
+ const directSubmodules = options.includeSubmodules ? getSubmodules(options.repoDir) : [];
132
+ const directSubmodulePathSet = options.includeSubmodules
133
+ ? new Set(directSubmodules.map(submodule => submodule.path))
134
+ : getSubmodulePaths(options.repoDir);
135
+ if (options.includeSubmodules) {
136
+ submodules = directSubmodules.map(submodule => ({
137
+ ...submodule,
138
+ path: joinRelativePath(options.pathPrefix, submodule.path),
139
+ }));
140
+ }
141
+ const normalizedSubmodulePaths = new Set();
142
+ for (const path of directSubmodulePathSet) {
143
+ normalizedSubmodulePaths.add(normalize(path));
144
+ }
145
+ const allGitFiles = getGitFiles(options.repoDir);
146
+ // Build duplicate map before filtering (needs all files to detect dupes)
147
+ const duplicateOf = buildDuplicateMap(allGitFiles, options.pathPrefix);
148
+ let gitFiles = allGitFiles.filter(f => !normalizedSubmodulePaths.has(f.path));
149
+ gitFiles = gitFiles.filter(f => isSupportedFile(f.path) || isReadmeFile(f.path));
150
+ gitFiles = gitFiles.filter(f => {
151
+ const relativePath = joinRelativePath(options.pathPrefix, f.path);
152
+ if (options.isIncluded && !options.isIncluded(relativePath)) {
153
+ return false;
154
+ }
155
+ if (options.isIgnored && options.isIgnored(relativePath)) {
156
+ return false;
157
+ }
158
+ return true;
159
+ });
160
+ if (gitFiles.length > MAX_FILES) {
161
+ options.logger?.warn(`Warning: Too many files (${gitFiles.length} > ${MAX_FILES}), skipping scan`);
162
+ return { files: [], submodules };
84
163
  }
85
- // Get git diff data if needed (isolated from main processing)
86
164
  let fileStats = null;
87
165
  let fileDiffs = null;
88
- if (includeDiff) {
166
+ if (options.includeDiff) {
89
167
  try {
90
- const diffData = getAllDiffData(dir);
168
+ const diffData = getAllDiffData(options.repoDir, directSubmodulePathSet, options.logger);
91
169
  fileStats = diffData.fileStats;
92
170
  fileDiffs = diffData.fileDiffs;
93
171
  }
94
172
  catch {
95
- // Diff failed - continue without diff info
96
173
  fileStats = null;
97
174
  fileDiffs = null;
98
175
  }
99
176
  }
100
- // Process files in parallel with concurrency limit
101
177
  const limit = pLimit(20);
102
- const resultPromises = files.map(relativePath => {
103
- const fullPath = join(dir, relativePath);
104
- // Normalize path for lookup (handle Windows backslashes)
105
- const normalizedPath = relativePath.replace(/\\/g, '/');
178
+ const resultPromises = gitFiles.map(({ path: relativePath }) => {
179
+ const fullPath = join(options.repoDir, relativePath);
180
+ const normalizedPath = normalizeRelativePath(relativePath);
181
+ const prefixedRelativePath = joinRelativePath(options.pathPrefix, relativePath);
106
182
  const fileDiff = fileDiffs?.get(normalizedPath);
107
183
  const stats = fileStats?.get(normalizedPath);
184
+ const dupOriginal = duplicateOf.get(prefixedRelativePath);
108
185
  return limit(async () => {
109
186
  try {
110
- return await processFile(fullPath, relativePath, fileDiff, stats);
187
+ // If this file is a duplicate, return a stub pointing to the original
188
+ if (dupOriginal) {
189
+ return {
190
+ relativePath: prefixedRelativePath,
191
+ duplicateOf: dupOriginal,
192
+ definitions: [],
193
+ };
194
+ }
195
+ return await processFile(fullPath, prefixedRelativePath, fileDiff, stats);
111
196
  }
112
- catch (err) {
113
- // Skip files that fail to process
114
- console.error(`Warning: Failed to process ${relativePath}:`, err);
197
+ catch {
115
198
  return null;
116
199
  }
117
200
  });
118
201
  });
202
+ const nestedResults = options.includeSubmodules
203
+ ? await Promise.all(directSubmodules.map(async (submodule) => {
204
+ if (!submodule.initialized) {
205
+ return { files: [], submodules: [] };
206
+ }
207
+ return scanRepo({
208
+ ...options,
209
+ repoDir: join(options.repoDir, submodule.path),
210
+ pathPrefix: joinRelativePath(options.pathPrefix, submodule.path),
211
+ });
212
+ }))
213
+ : [];
119
214
  const results = await Promise.all(resultPromises);
120
- return results.filter((r) => r !== null);
215
+ for (const nested of nestedResults) {
216
+ submodules.push(...nested.submodules);
217
+ }
218
+ return {
219
+ files: [
220
+ ...results.filter((result) => result !== null),
221
+ ...nestedResults.flatMap(result => result.files),
222
+ ],
223
+ submodules,
224
+ };
225
+ }
226
+ /**
227
+ * Scan directory and process files with header comments
228
+ */
229
+ export async function scanDirectory(options = {}) {
230
+ const dir = options.dir ?? process.cwd();
231
+ const logger = options.logger ?? createConsoleLogger();
232
+ const ignorePatterns = (options.ignore ?? []).filter((p) => !!p);
233
+ const filterPatterns = (options.filter ?? []).filter((p) => !!p);
234
+ return scanRepo({
235
+ repoDir: dir,
236
+ pathPrefix: '',
237
+ includeDiff: options.diff ?? false,
238
+ includeSubmodules: options.submodules !== false,
239
+ logger,
240
+ isIncluded: filterPatterns.length > 0 ? picomatch(filterPatterns) : undefined,
241
+ isIgnored: ignorePatterns.length > 0 ? picomatch(ignorePatterns) : undefined,
242
+ visitedRepoDirs: new Set(),
243
+ });
121
244
  }
122
245
  /**
123
246
  * Process a single file - check for marker and extract definitions
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scanner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.test.d.ts","sourceRoot":"","sources":["../src/scanner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ // Tests for recursive scanning across initialized git submodules.
2
+ import { describe, expect, test } from 'bun:test';
3
+ import { scanDirectory } from './scanner.js';
4
+ import { addSubmodule, commitAll, createRepo, deinitSubmodule, updateSubmodulesRecursive, writeTrackedFile } from './test-helpers/git-test-helpers.js';
5
+ describe('scanDirectory submodule recursion', () => {
6
+ test('includes files from initialized nested submodules under prefixed paths', async () => {
7
+ const nestedRepo = createRepo('agentmap-submodule-nested-');
8
+ writeTrackedFile(nestedRepo, 'README.md', '# Nested repo\n\nNested submodule README.');
9
+ commitAll(nestedRepo, 'Add nested repo README');
10
+ const childRepo = createRepo('agentmap-submodule-child-');
11
+ writeTrackedFile(childRepo, 'README.md', '# Child repo\n\nChild submodule README.');
12
+ commitAll(childRepo, 'Add child repo README');
13
+ addSubmodule(childRepo, nestedRepo.dir, 'deps/nested-lib');
14
+ commitAll(childRepo, 'Add nested submodule');
15
+ const rootRepo = createRepo('agentmap-submodule-root-');
16
+ writeTrackedFile(rootRepo, 'README.md', '# Root repo\n\nRoot repo README.');
17
+ commitAll(rootRepo, 'Add root README');
18
+ addSubmodule(rootRepo, childRepo.dir, 'vendor/child-lib');
19
+ commitAll(rootRepo, 'Add child submodule');
20
+ updateSubmodulesRecursive(rootRepo);
21
+ const result = await scanDirectory({ dir: rootRepo.dir });
22
+ expect(result.files.map(file => file.relativePath).sort()).toMatchInlineSnapshot(`
23
+ [
24
+ "README.md",
25
+ "vendor/child-lib/README.md",
26
+ "vendor/child-lib/deps/nested-lib/README.md",
27
+ ]
28
+ `);
29
+ expect(result.submodules.map(submodule => ({
30
+ path: submodule.path,
31
+ initialized: submodule.initialized,
32
+ dirty: submodule.dirty,
33
+ commitLength: submodule.commit.length,
34
+ }))).toMatchInlineSnapshot(`
35
+ [
36
+ {
37
+ "commitLength": 7,
38
+ "dirty": false,
39
+ "initialized": true,
40
+ "path": "vendor/child-lib",
41
+ },
42
+ {
43
+ "commitLength": 7,
44
+ "dirty": false,
45
+ "initialized": true,
46
+ "path": "vendor/child-lib/deps/nested-lib",
47
+ },
48
+ ]
49
+ `);
50
+ });
51
+ test('keeps uninitialized submodules as metadata-only nodes', async () => {
52
+ const childRepo = createRepo('agentmap-submodule-uninit-child-');
53
+ writeTrackedFile(childRepo, 'README.md', '# Child repo\n\nChild submodule README.');
54
+ commitAll(childRepo, 'Add child repo README');
55
+ const rootRepo = createRepo('agentmap-submodule-uninit-root-');
56
+ writeTrackedFile(rootRepo, 'README.md', '# Root repo\n\nRoot repo README.');
57
+ commitAll(rootRepo, 'Add root README');
58
+ addSubmodule(rootRepo, childRepo.dir, 'vendor/child-lib');
59
+ commitAll(rootRepo, 'Add child submodule');
60
+ deinitSubmodule(rootRepo, 'vendor/child-lib');
61
+ const result = await scanDirectory({ dir: rootRepo.dir });
62
+ expect(result.files.map(file => file.relativePath).sort()).toMatchInlineSnapshot(`
63
+ [
64
+ "README.md",
65
+ ]
66
+ `);
67
+ expect(result.submodules.map(submodule => ({
68
+ path: submodule.path,
69
+ initialized: submodule.initialized,
70
+ dirty: submodule.dirty,
71
+ commitLength: submodule.commit.length,
72
+ }))).toMatchInlineSnapshot(`
73
+ [
74
+ {
75
+ "commitLength": 7,
76
+ "dirty": false,
77
+ "initialized": false,
78
+ "path": "vendor/child-lib",
79
+ },
80
+ ]
81
+ `);
82
+ });
83
+ });
84
+ //# sourceMappingURL=scanner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.test.js","sourceRoot":"","sources":["../src/scanner.test.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAEtJ,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,IAAI,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,UAAU,GAAG,UAAU,CAAC,4BAA4B,CAAC,CAAA;QAC3D,gBAAgB,CAAC,UAAU,EAAE,WAAW,EAAE,2CAA2C,CAAC,CAAA;QACtF,SAAS,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAA;QAE/C,MAAM,SAAS,GAAG,UAAU,CAAC,2BAA2B,CAAC,CAAA;QACzD,gBAAgB,CAAC,SAAS,EAAE,WAAW,EAAE,yCAAyC,CAAC,CAAA;QACnF,SAAS,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAA;QAC7C,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAA;QAC1D,SAAS,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAA;QAE5C,MAAM,QAAQ,GAAG,UAAU,CAAC,0BAA0B,CAAC,CAAA;QACvD,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,kCAAkC,CAAC,CAAA;QAC3E,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;QACtC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;QACzD,SAAS,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAA;QAC1C,yBAAyB,CAAC,QAAQ,CAAC,CAAA;QAEnC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;QAEzD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;;;CAMpF,CAAC,CAAA;QAEE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;SACtC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;CAe9B,CAAC,CAAA;IACA,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,SAAS,GAAG,UAAU,CAAC,kCAAkC,CAAC,CAAA;QAChE,gBAAgB,CAAC,SAAS,EAAE,WAAW,EAAE,yCAAyC,CAAC,CAAA;QACnF,SAAS,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAA;QAE7C,MAAM,QAAQ,GAAG,UAAU,CAAC,iCAAiC,CAAC,CAAA;QAC9D,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,kCAAkC,CAAC,CAAA;QAC3E,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;QACtC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAA;QACzD,SAAS,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAA;QAC1C,eAAe,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAA;QAE7C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;QAEzD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,qBAAqB,CAAC;;;;CAIpF,CAAC,CAAA;QAEE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;SACtC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;CAS9B,CAAC,CAAA;IACA,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,13 @@
1
+ export interface TempRepo {
2
+ dir: string;
3
+ }
4
+ export declare function createTempDir(prefix: string): string;
5
+ export declare function initRepo(dir: string): TempRepo;
6
+ export declare function createRepo(prefix: string): TempRepo;
7
+ export declare function writeTrackedFile(repo: TempRepo, relativePath: string, content: string): void;
8
+ export declare function commitAll(repo: TempRepo, message: string): void;
9
+ export declare function shortHead(repo: TempRepo): string;
10
+ export declare function addSubmodule(repo: TempRepo, sourceDir: string, targetPath: string): void;
11
+ export declare function updateSubmodulesRecursive(repo: TempRepo): void;
12
+ export declare function deinitSubmodule(repo: TempRepo, targetPath: string): void;
13
+ //# sourceMappingURL=git-test-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-test-helpers.d.ts","sourceRoot":"","sources":["../../src/test-helpers/git-test-helpers.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAA;CACZ;AAUD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAK9C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAInD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI5F;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAG/D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAEhD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAExF;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAE9D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAExE"}
@@ -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
  */
@@ -26,10 +27,41 @@ export interface FileEntry {
26
27
  exports?: DefEntry;
27
28
  }
28
29
  /**
29
- * Recursive map node - either a directory (with children) or a file entry
30
+ * A submodule entry in the map
31
+ */
32
+ export interface SubmoduleEntry {
33
+ submodule: string;
34
+ dirty?: string;
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
+ }
43
+ /**
44
+ * Info about a git submodule discovered in the repo
45
+ */
46
+ export interface SubmoduleInfo {
47
+ /** Relative path of the submodule in the parent repo */
48
+ path: string;
49
+ /** Current HEAD commit SHA (short) */
50
+ commit: string;
51
+ /** Checked-out branch name, or undefined if detached HEAD */
52
+ branch?: string;
53
+ /** Remote URL from .gitmodules */
54
+ url?: string;
55
+ /** Whether the submodule has uncommitted changes */
56
+ dirty?: boolean;
57
+ /** Whether the submodule is initialized */
58
+ initialized: boolean;
59
+ }
60
+ /**
61
+ * Recursive map node - either a directory (with children), a file entry, or a submodule entry
30
62
  */
31
63
  export interface MapNode {
32
- [name: string]: MapNode | FileEntry;
64
+ [name: string]: MapNode | FileEntry | SubmoduleNode;
33
65
  }
34
66
  /**
35
67
  * Result of extracting marker and description from a file
@@ -74,6 +106,8 @@ export interface FileResult {
74
106
  description?: string;
75
107
  definitions: Definition[];
76
108
  diff?: FileDiffStats;
109
+ /** If set, this file is an exact duplicate of another file (by git blob SHA) */
110
+ duplicateOf?: string;
77
111
  }
78
112
  /**
79
113
  * Options for generating the map
@@ -91,6 +125,12 @@ export interface GenerateOptions {
91
125
  diffBase?: string;
92
126
  /** Max definitions per file before truncation (default: 25) */
93
127
  maxDefs?: number;
128
+ /** Max characters for file descriptions before truncation (default: 300). Rounds up to full line. */
129
+ maxDescChars?: number;
130
+ /** Include submodule info in the map (default: true) */
131
+ submodules?: boolean;
132
+ /** Logger implementation (default: console logger) */
133
+ logger?: Logger;
94
134
  }
95
135
  /**
96
136
  * A hunk from git diff output
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAA;AAEzC;;GAEG;AACH,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,IAAI,GACJ,KAAK,GACL,KAAK,CAAA;AAET;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,OAAO,CAAC,EAAE,QAAQ,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,UAAU,GACV,OAAO,GACP,QAAQ,GACR,OAAO,GACP,OAAO,GACP,MAAM,GACN,WAAW,GACX,OAAO,GACP,MAAM,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAA;AAElD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,gBAAgB,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,cAAc,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,cAAc,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,IAAI,CAAC,EAAE,aAAa,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAA;AAC1C,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAA"}
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.7.1",
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",