agentmap 0.7.0 → 0.8.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 (48) hide show
  1. package/dist/cli.js +20 -10
  2. package/dist/cli.js.map +1 -1
  3. package/dist/extract/git-status.d.ts +4 -2
  4. package/dist/extract/git-status.d.ts.map +1 -1
  5. package/dist/extract/git-status.js +13 -2
  6. package/dist/extract/git-status.js.map +1 -1
  7. package/dist/extract/markdown.d.ts.map +1 -1
  8. package/dist/extract/markdown.js +1 -25
  9. package/dist/extract/markdown.js.map +1 -1
  10. package/dist/extract/marker.d.ts +6 -1
  11. package/dist/extract/marker.d.ts.map +1 -1
  12. package/dist/extract/marker.js +22 -26
  13. package/dist/extract/marker.js.map +1 -1
  14. package/dist/extract/submodules.d.ts +12 -0
  15. package/dist/extract/submodules.d.ts.map +1 -0
  16. package/dist/extract/submodules.js +234 -0
  17. package/dist/extract/submodules.js.map +1 -0
  18. package/dist/extract/submodules.test.d.ts +2 -0
  19. package/dist/extract/submodules.test.d.ts.map +1 -0
  20. package/dist/extract/submodules.test.js +84 -0
  21. package/dist/extract/submodules.test.js.map +1 -0
  22. package/dist/extract/utils.d.ts +6 -0
  23. package/dist/extract/utils.d.ts.map +1 -0
  24. package/dist/extract/utils.js +28 -0
  25. package/dist/extract/utils.js.map +1 -0
  26. package/dist/index.d.ts +2 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +15 -6
  29. package/dist/index.js.map +1 -1
  30. package/dist/map/builder.d.ts +3 -3
  31. package/dist/map/builder.d.ts.map +1 -1
  32. package/dist/map/builder.js +41 -2
  33. package/dist/map/builder.js.map +1 -1
  34. package/dist/map/truncate.d.ts +12 -0
  35. package/dist/map/truncate.d.ts.map +1 -0
  36. package/dist/map/truncate.js +89 -0
  37. package/dist/map/truncate.js.map +1 -0
  38. package/dist/map/yaml.d.ts +1 -0
  39. package/dist/map/yaml.d.ts.map +1 -1
  40. package/dist/map/yaml.js +24 -6
  41. package/dist/map/yaml.js.map +1 -1
  42. package/dist/scanner.d.ts +9 -2
  43. package/dist/scanner.d.ts.map +1 -1
  44. package/dist/scanner.js +53 -27
  45. package/dist/scanner.js.map +1 -1
  46. package/dist/types.d.ts +30 -2
  47. package/dist/types.d.ts.map +1 -1
  48. package/package.json +2 -1
@@ -0,0 +1,234 @@
1
+ // Detect git submodules, their branches, and dirty state.
2
+ // Uses multiple git commands with safeExec for cross-platform reliability.
3
+ import { execSync } from 'child_process';
4
+ import { existsSync } from 'fs';
5
+ import { join } from 'path';
6
+ /**
7
+ * Safely execute a git command, returning empty string on any error
8
+ */
9
+ function safeExec(cmd, dir) {
10
+ try {
11
+ return execSync(cmd, {
12
+ cwd: dir,
13
+ encoding: 'utf8',
14
+ maxBuffer: 1024 * 1024 * 10, // 10MB
15
+ stdio: ['pipe', 'pipe', 'pipe'],
16
+ });
17
+ }
18
+ catch {
19
+ return '';
20
+ }
21
+ }
22
+ /**
23
+ * Detect submodule paths by looking for gitlink entries (mode 160000) in git ls-files --stage.
24
+ * This is the most reliable method - works even if submodules are not initialized.
25
+ */
26
+ function detectSubmodulePaths(dir) {
27
+ const output = safeExec('git ls-files --stage', dir);
28
+ const paths = new Set();
29
+ if (!output.trim())
30
+ return paths;
31
+ for (const line of output.split('\n')) {
32
+ if (!line.trim())
33
+ continue;
34
+ // Format: <mode> <hash> <stage>\t<path>
35
+ // Submodules have mode 160000
36
+ if (line.startsWith('160000 ')) {
37
+ const tabIdx = line.indexOf('\t');
38
+ if (tabIdx !== -1) {
39
+ paths.add(line.slice(tabIdx + 1).trim());
40
+ }
41
+ }
42
+ }
43
+ return paths;
44
+ }
45
+ /**
46
+ * Parse `git submodule status --recursive` output.
47
+ * Format: " <sha> <path> (<describe>)" or "-<sha> <path>" (uninitialized) or "+<sha> <path> (<describe>)" (out of sync)
48
+ */
49
+ function parseSubmoduleStatus(dir) {
50
+ const output = safeExec('git submodule status --recursive', dir);
51
+ const result = new Map();
52
+ if (!output.trim())
53
+ return result;
54
+ for (const line of output.split('\n')) {
55
+ if (!line.trim())
56
+ continue;
57
+ // First char: ' ' = OK, '-' = uninitialized, '+' = out of sync, 'U' = merge conflict
58
+ const prefix = line[0];
59
+ const initialized = prefix !== '-';
60
+ // Rest: <sha> <path> [(<describe>)]
61
+ const rest = line.slice(1).trim();
62
+ const spaceIdx = rest.indexOf(' ');
63
+ if (spaceIdx === -1)
64
+ continue;
65
+ const commit = rest.slice(0, spaceIdx);
66
+ let path = rest.slice(spaceIdx + 1);
67
+ // Remove optional describe suffix: " (v1.2.3)" or " (heads/main)"
68
+ const parenIdx = path.lastIndexOf(' (');
69
+ if (parenIdx !== -1) {
70
+ path = path.slice(0, parenIdx);
71
+ }
72
+ result.set(path.trim(), {
73
+ commit: commit.slice(0, 7), // short SHA
74
+ initialized,
75
+ });
76
+ }
77
+ return result;
78
+ }
79
+ /**
80
+ * Get the checked-out branch for each initialized submodule.
81
+ * Returns a map of submodule path -> branch name (or undefined for detached HEAD).
82
+ */
83
+ function getSubmoduleBranches(dir) {
84
+ // Use foreach to run git symbolic-ref in each submodule
85
+ const output = safeExec('git submodule foreach --quiet --recursive \'echo "$sm_path|$(git symbolic-ref --short -q HEAD 2>/dev/null || echo __detached__)"\'', dir);
86
+ const result = new Map();
87
+ if (!output.trim())
88
+ return result;
89
+ for (const line of output.split('\n')) {
90
+ if (!line.trim())
91
+ continue;
92
+ const pipeIdx = line.indexOf('|');
93
+ if (pipeIdx === -1)
94
+ continue;
95
+ const path = line.slice(0, pipeIdx).trim();
96
+ const branch = line.slice(pipeIdx + 1).trim();
97
+ result.set(path, branch === '__detached__' || branch === '' ? undefined : branch);
98
+ }
99
+ return result;
100
+ }
101
+ /**
102
+ * Get submodule URLs from .gitmodules config.
103
+ * Returns a map of submodule path -> URL.
104
+ */
105
+ function getSubmoduleUrls(dir) {
106
+ // Check if .gitmodules exists first
107
+ if (!existsSync(join(dir, '.gitmodules'))) {
108
+ return new Map();
109
+ }
110
+ const output = safeExec('git config -f .gitmodules --get-regexp "^submodule\\..*\\.url$"', dir);
111
+ const pathOutput = safeExec('git config -f .gitmodules --get-regexp "^submodule\\..*\\.path$"', dir);
112
+ // Build name -> url map
113
+ const nameToUrl = new Map();
114
+ for (const line of output.split('\n')) {
115
+ if (!line.trim())
116
+ continue;
117
+ // Format: submodule.<name>.url <url>
118
+ const match = line.match(/^submodule\.(.+)\.url\s+(.+)$/);
119
+ if (match) {
120
+ nameToUrl.set(match[1], match[2].trim());
121
+ }
122
+ }
123
+ // Build path -> url map via name -> path mapping
124
+ const result = new Map();
125
+ for (const line of pathOutput.split('\n')) {
126
+ if (!line.trim())
127
+ continue;
128
+ // Format: submodule.<name>.path <path>
129
+ const match = line.match(/^submodule\.(.+)\.path\s+(.+)$/);
130
+ if (match) {
131
+ const name = match[1];
132
+ const path = match[2].trim();
133
+ const url = nameToUrl.get(name);
134
+ if (url) {
135
+ result.set(path, url);
136
+ }
137
+ }
138
+ }
139
+ return result;
140
+ }
141
+ /**
142
+ * Check which submodules have dirty working trees.
143
+ * Uses git status --porcelain=2 to detect modified submodule content.
144
+ *
145
+ * Porcelain v2 "changed entry" format (type 1):
146
+ * 1 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <path>
147
+ * Fields are space-separated but the path (field 9) may contain spaces,
148
+ * so we split on the first 8 spaces and take the remainder as the path.
149
+ */
150
+ function getDirtySubmodules(dir, submodulePaths) {
151
+ if (submodulePaths.size === 0)
152
+ return new Set();
153
+ const output = safeExec('git status --porcelain=2', dir);
154
+ const dirty = new Set();
155
+ if (!output.trim())
156
+ return dirty;
157
+ for (const line of output.split('\n')) {
158
+ if (!line.trim())
159
+ continue;
160
+ if (line.startsWith('1 ') || line.startsWith('2 ')) {
161
+ // Split only the first 8 spaces to preserve path with spaces
162
+ const fields = splitNFields(line, 9);
163
+ if (fields.length < 9)
164
+ continue;
165
+ // fields[2] is the sub field (N... for non-submodule, S... for submodule)
166
+ const subField = fields[2];
167
+ // fields[8] is the full path (may contain spaces)
168
+ const path = fields[8];
169
+ if (subField && subField.startsWith('S') && subField !== 'S...' && submodulePaths.has(path)) {
170
+ dirty.add(path);
171
+ }
172
+ }
173
+ }
174
+ return dirty;
175
+ }
176
+ /**
177
+ * Split a string into exactly N fields by spaces.
178
+ * The last field gets the remainder (preserving spaces in paths).
179
+ */
180
+ function splitNFields(str, n) {
181
+ const fields = [];
182
+ let pos = 0;
183
+ for (let i = 0; i < n - 1 && pos < str.length; i++) {
184
+ const spaceIdx = str.indexOf(' ', pos);
185
+ if (spaceIdx === -1)
186
+ break;
187
+ fields.push(str.slice(pos, spaceIdx));
188
+ pos = spaceIdx + 1;
189
+ }
190
+ if (pos < str.length) {
191
+ fields.push(str.slice(pos));
192
+ }
193
+ return fields;
194
+ }
195
+ /**
196
+ * Get all submodule info for a repository.
197
+ * Combines detection, status, branches, URLs, and dirty state.
198
+ */
199
+ export function getSubmodules(dir) {
200
+ // Step 1: Detect all submodule paths (works even if uninitialized)
201
+ const submodulePaths = detectSubmodulePaths(dir);
202
+ if (submodulePaths.size === 0)
203
+ return [];
204
+ // Step 2: Get status (commit SHAs and initialized state)
205
+ const statusMap = parseSubmoduleStatus(dir);
206
+ // Step 3: Get branches for initialized submodules
207
+ const branchMap = getSubmoduleBranches(dir);
208
+ // Step 4: Get URLs from .gitmodules
209
+ const urlMap = getSubmoduleUrls(dir);
210
+ // Step 5: Check dirty state
211
+ const dirtySet = getDirtySubmodules(dir, submodulePaths);
212
+ // Combine all info
213
+ const submodules = [];
214
+ for (const path of submodulePaths) {
215
+ const status = statusMap.get(path);
216
+ submodules.push({
217
+ path,
218
+ commit: status?.commit ?? 'unknown',
219
+ branch: branchMap.get(path),
220
+ url: urlMap.get(path),
221
+ dirty: dirtySet.has(path),
222
+ initialized: status?.initialized ?? false,
223
+ });
224
+ }
225
+ return submodules;
226
+ }
227
+ /**
228
+ * Get the set of submodule paths for filtering from diff output.
229
+ * Lightweight version that only detects paths without full info.
230
+ */
231
+ export function getSubmodulePaths(dir) {
232
+ return detectSubmodulePaths(dir);
233
+ }
234
+ //# sourceMappingURL=submodules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submodules.js","sourceRoot":"","sources":["../../src/extract/submodules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=submodules.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submodules.test.d.ts","sourceRoot":"","sources":["../../src/extract/submodules.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ // Tests for submodule detection and parsing logic.
2
+ import { describe, expect, test } from 'bun:test';
3
+ import { getSubmodules, getSubmodulePaths } from './submodules.js';
4
+ import { getAllDiffData, parseNumstat, parseDiff } from './git-status.js';
5
+ // ============================================================================
6
+ // Integration: submodule detection in current repo (no submodules expected)
7
+ // ============================================================================
8
+ describe('getSubmodules', () => {
9
+ test('returns empty array when repo has no submodules', () => {
10
+ const result = getSubmodules(process.cwd());
11
+ expect(result).toMatchInlineSnapshot(`[]`);
12
+ });
13
+ });
14
+ describe('getSubmodulePaths', () => {
15
+ test('returns empty set when repo has no submodules', () => {
16
+ const result = getSubmodulePaths(process.cwd());
17
+ expect(result.size).toBe(0);
18
+ });
19
+ });
20
+ // ============================================================================
21
+ // Diff filtering: submodule paths should be removed from diff output
22
+ // ============================================================================
23
+ describe('diff submodule filtering', () => {
24
+ test('parseNumstat includes submodule pointer changes as 1/1', () => {
25
+ // Simulates what git diff --numstat outputs for a submodule pointer change
26
+ const output = `1\t1\tvendor/some-lib
27
+ 10\t5\tsrc/main.ts`;
28
+ const result = parseNumstat(output);
29
+ // Without filtering, the submodule shows as 1 added / 1 deleted
30
+ expect(result.size).toBe(2);
31
+ expect(result.get('vendor/some-lib')).toMatchInlineSnapshot(`
32
+ {
33
+ "added": 1,
34
+ "deleted": 1,
35
+ }
36
+ `);
37
+ });
38
+ test('getAllDiffData filters out submodule paths', () => {
39
+ const submodulePaths = new Set(['vendor/some-lib', 'external/utils']);
40
+ // This tests the filtering logic with real git commands on the current repo.
41
+ // Since this repo has no submodules, the filter set won't match anything,
42
+ // but we verify the function accepts the parameter without error.
43
+ const result = getAllDiffData(process.cwd(), submodulePaths);
44
+ expect(result.fileStats).toBeDefined();
45
+ expect(result.fileDiffs).toBeDefined();
46
+ // Verify submodule paths are not in the results
47
+ expect(result.fileStats.has('vendor/some-lib')).toBe(false);
48
+ expect(result.fileDiffs.has('vendor/some-lib')).toBe(false);
49
+ });
50
+ test('parseDiff handles submodule pseudo-diff gracefully', () => {
51
+ // Git produces this pseudo-diff for submodule pointer changes
52
+ const diffOutput = `diff --git a/vendor/lib b/vendor/lib
53
+ index abc1234..def5678 160000
54
+ --- a/vendor/lib
55
+ +++ b/vendor/lib
56
+ @@ -1 +1 @@
57
+ -Subproject commit abc1234567890abcdef1234567890abcdef123456
58
+ +Subproject commit def5678901234567890abcdef1234567890abcdef`;
59
+ const result = parseDiff(diffOutput);
60
+ // Parser will extract a hunk but it's meaningless for submodules.
61
+ // The important thing is it doesn't crash.
62
+ expect(result.has('vendor/lib')).toBe(true);
63
+ // In practice, getAllDiffData filters this out via submodulePaths
64
+ });
65
+ });
66
+ // ============================================================================
67
+ // Builder: submodule entry formatting (tested via types)
68
+ // ============================================================================
69
+ describe('SubmoduleEntry format', () => {
70
+ test('formats initialized submodule with branch', () => {
71
+ // This tests the format that builder.ts produces
72
+ const label = 'main @ a1b2c3d';
73
+ expect(label).toMatchInlineSnapshot(`"main @ a1b2c3d"`);
74
+ });
75
+ test('formats detached HEAD submodule', () => {
76
+ const label = 'detached @ f4e5d6c';
77
+ expect(label).toMatchInlineSnapshot(`"detached @ f4e5d6c"`);
78
+ });
79
+ test('formats uninitialized submodule', () => {
80
+ const label = 'uninitialized @ abc1234';
81
+ expect(label).toMatchInlineSnapshot(`"uninitialized @ abc1234"`);
82
+ });
83
+ });
84
+ //# sourceMappingURL=submodules.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submodules.test.js","sourceRoot":"","sources":["../../src/extract/submodules.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Read the first N lines of a file.
3
+ * Returns null if file cannot be read (ENOENT, permission denied, etc.)
4
+ */
5
+ export declare function readFirstLines(filepath: string, maxLines: number): Promise<string | null>;
6
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/extract/utils.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkB/F"}
@@ -0,0 +1,28 @@
1
+ // Shared utilities for file extraction.
2
+ import { open } from 'fs/promises';
3
+ /**
4
+ * Read the first N lines of a file.
5
+ * Returns null if file cannot be read (ENOENT, permission denied, etc.)
6
+ */
7
+ export async function readFirstLines(filepath, maxLines) {
8
+ let handle;
9
+ try {
10
+ handle = await open(filepath, 'r');
11
+ }
12
+ catch {
13
+ // File doesn't exist or can't be opened - skip silently
14
+ return null;
15
+ }
16
+ try {
17
+ // Read enough bytes for ~maxLines lines (generous estimate)
18
+ const buffer = Buffer.alloc(maxLines * 200);
19
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
20
+ const content = buffer.toString('utf8', 0, bytesRead);
21
+ const lines = content.split('\n').slice(0, maxLines);
22
+ return lines.join('\n');
23
+ }
24
+ finally {
25
+ await handle.close();
26
+ }
27
+ }
28
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/extract/utils.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,QAAgB;IACrE,IAAI,MAAM,CAAA;IACV,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;QACxD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC;QACH,4DAA4D;QAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAA;QAC3C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QACpE,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QACpD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { GenerateOptions, MapNode } from './types.js';
2
2
  export { toYaml } from './map/yaml.js';
3
- export type { DefEntry, Definition, DefinitionDiff, DefinitionStatus, DiffHunk, FileDiffStats, FileEntry, FileDiff, FileResult, GenerateOptions, Language, MapNode, MarkerResult, } from './types.js';
3
+ export { truncateMap, truncateDefs } from './map/truncate.js';
4
+ export type { DefEntry, Definition, DefinitionDiff, DefinitionStatus, DiffHunk, FileDiffStats, FileEntry, FileDiff, FileResult, GenerateOptions, Language, MapNode, MarkerResult, SubmoduleEntry, SubmoduleInfo, } from './types.js';
4
5
  /**
5
6
  * Check if directory is inside a git repository
6
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,YAAY,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,SAAS,EACT,QAAQ,EACR,UAAU,EACV,eAAe,EACf,QAAQ,EACR,OAAO,EACP,YAAY,GACb,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIpD;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAWjF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBpF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAE7D,YAAY,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,SAAS,EACT,QAAQ,EACR,UAAU,EACV,eAAe,EACf,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIpD;AAID;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAejF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBpF"}
package/dist/index.js CHANGED
@@ -5,7 +5,9 @@ import { resolve } from 'path';
5
5
  import { scanDirectory } from './scanner.js';
6
6
  import { buildMap, getRootName } from './map/builder.js';
7
7
  import { toYaml } from './map/yaml.js';
8
+ import { truncateMap } from './map/truncate.js';
8
9
  export { toYaml } from './map/yaml.js';
10
+ export { truncateMap, truncateDefs } from './map/truncate.js';
9
11
  /**
10
12
  * Check if directory is inside a git repository
11
13
  */
@@ -26,6 +28,7 @@ export function isHomeDirectory(dir) {
26
28
  const resolved = resolve(dir);
27
29
  return resolved === home;
28
30
  }
31
+ const DEFAULT_MAX_DEFS = 25;
29
32
  /**
30
33
  * Generate a map object from a directory
31
34
  * Returns empty map if not in a git repo or if directory is home
@@ -37,8 +40,11 @@ export async function generateMap(options = {}) {
37
40
  if (!isGitRepo(dir) || isHomeDirectory(dir)) {
38
41
  return { [rootName]: {} };
39
42
  }
40
- const results = await scanDirectory({ ...options, dir });
41
- return buildMap(results, rootName);
43
+ const { files, submodules } = await scanDirectory({ ...options, dir });
44
+ const map = buildMap(files, rootName, submodules);
45
+ // Apply truncation (default 25)
46
+ const maxDefs = options.maxDefs ?? DEFAULT_MAX_DEFS;
47
+ return truncateMap(map, maxDefs);
42
48
  }
43
49
  /**
44
50
  * Generate a YAML string map from a directory
@@ -50,12 +56,15 @@ export async function generateMapYaml(options = {}) {
50
56
  if (!isGitRepo(dir) || isHomeDirectory(dir)) {
51
57
  return '';
52
58
  }
53
- const results = await scanDirectory({ ...options, dir });
54
- if (results.length === 0) {
59
+ const { files, submodules } = await scanDirectory({ ...options, dir });
60
+ if (files.length === 0 && submodules.length === 0) {
55
61
  return '';
56
62
  }
57
63
  const rootName = getRootName(dir);
58
- const map = buildMap(results, rootName);
59
- return toYaml(map);
64
+ const map = buildMap(files, rootName, submodules);
65
+ // Apply truncation (default 25)
66
+ const maxDefs = options.maxDefs ?? DEFAULT_MAX_DEFS;
67
+ const truncated = truncateMap(map, maxDefs);
68
+ return toYaml(truncated);
60
69
  }
61
70
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAGtC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAkBtC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,QAAQ,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAClE,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAA;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC7B,OAAO,QAAQ,KAAK,IAAI,CAAA;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAA2B,EAAE;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAEjC,mCAAmC;IACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;IAC3B,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;IACxD,OAAO,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA2B,EAAE;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;IAEvC,+BAA+B;IAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;IAExD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACvC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;AACpB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import type { FileResult, MapNode } from '../types.js';
1
+ import type { FileResult, MapNode, SubmoduleInfo } from '../types.js';
2
2
  /**
3
- * Build a nested map object from file results
3
+ * Build a nested map object from file results and submodule info
4
4
  */
5
- export declare function buildMap(results: FileResult[], rootName: string): MapNode;
5
+ export declare function buildMap(results: FileResult[], rootName: string, submodules?: SubmoduleInfo[]): MapNode;
6
6
  /**
7
7
  * Get the root name from a directory path
8
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/map/builder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAyB,UAAU,EAAiB,OAAO,EAAE,MAAM,aAAa,CAAA;AAE5F;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CASzE;AA4FD;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM/C"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/map/builder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAyB,UAAU,EAAiB,OAAO,EAAkB,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3H;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,EAAE,GAAG,OAAO,CAgBvG;AAgID;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM/C"}
@@ -1,13 +1,19 @@
1
1
  // Build the nested map object from file results.
2
2
  import { basename } from 'path';
3
3
  /**
4
- * Build a nested map object from file results
4
+ * Build a nested map object from file results and submodule info
5
5
  */
6
- export function buildMap(results, rootName) {
6
+ export function buildMap(results, rootName, submodules) {
7
7
  const root = {};
8
8
  for (const result of results) {
9
9
  insertFile(root, result);
10
10
  }
11
+ // Insert submodule entries
12
+ if (submodules) {
13
+ for (const sub of submodules) {
14
+ insertSubmodule(root, sub);
15
+ }
16
+ }
11
17
  // Wrap in root name
12
18
  return { [rootName]: root };
13
19
  }
@@ -87,6 +93,39 @@ function insertFile(root, result) {
87
93
  }
88
94
  current[filename] = entry;
89
95
  }
96
+ /**
97
+ * Insert a submodule entry into the map at its path location.
98
+ * Format: "branch @ sha" or "detached @ sha" or "uninitialized @ sha"
99
+ */
100
+ function insertSubmodule(root, sub) {
101
+ const parts = sub.path.split('/');
102
+ let current = root;
103
+ // Navigate/create directory structure for nested submodule paths
104
+ for (let i = 0; i < parts.length - 1; i++) {
105
+ const dir = parts[i];
106
+ if (!current[dir]) {
107
+ current[dir] = {};
108
+ }
109
+ current = current[dir];
110
+ }
111
+ // Build the submodule label
112
+ let label;
113
+ if (!sub.initialized) {
114
+ label = `uninitialized @ ${sub.commit}`;
115
+ }
116
+ else if (sub.branch) {
117
+ label = `${sub.branch} @ ${sub.commit}`;
118
+ }
119
+ else {
120
+ label = `detached @ ${sub.commit}`;
121
+ }
122
+ const entry = { submodule: label };
123
+ if (sub.dirty) {
124
+ entry.dirty = 'modified';
125
+ }
126
+ const name = parts[parts.length - 1];
127
+ current[name] = entry;
128
+ }
90
129
  /**
91
130
  * Get the root name from a directory path
92
131
  */
@@ -1 +1 @@
1
- {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/map/builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/map/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { FileEntry, MapNode } from '../types.js';
2
+ /**
3
+ * Truncate definitions in a file entry to maxDefs
4
+ * If file has exported symbols, shows only exports field instead
5
+ * Otherwise uses current truncation behavior
6
+ */
7
+ export declare function truncateDefs(entry: FileEntry, maxDefs?: number): FileEntry;
8
+ /**
9
+ * Recursively truncate defs in all files in the map
10
+ */
11
+ export declare function truncateMap(node: MapNode, maxDefs?: number): MapNode;
12
+ //# sourceMappingURL=truncate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../src/map/truncate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAY,SAAS,EAAE,OAAO,EAAkB,MAAM,aAAa,CAAA;AA4B/E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,GAAE,MAAyB,GAAG,SAAS,CA0C5F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE,MAAyB,GAAG,OAAO,CAiBtF"}