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.
- package/dist/cli.js +20 -10
- package/dist/cli.js.map +1 -1
- package/dist/extract/git-status.d.ts +4 -2
- package/dist/extract/git-status.d.ts.map +1 -1
- package/dist/extract/git-status.js +13 -2
- package/dist/extract/git-status.js.map +1 -1
- package/dist/extract/markdown.d.ts.map +1 -1
- package/dist/extract/markdown.js +1 -25
- package/dist/extract/markdown.js.map +1 -1
- package/dist/extract/marker.d.ts +6 -1
- package/dist/extract/marker.d.ts.map +1 -1
- package/dist/extract/marker.js +22 -26
- package/dist/extract/marker.js.map +1 -1
- package/dist/extract/submodules.d.ts +12 -0
- package/dist/extract/submodules.d.ts.map +1 -0
- package/dist/extract/submodules.js +234 -0
- package/dist/extract/submodules.js.map +1 -0
- package/dist/extract/submodules.test.d.ts +2 -0
- package/dist/extract/submodules.test.d.ts.map +1 -0
- package/dist/extract/submodules.test.js +84 -0
- package/dist/extract/submodules.test.js.map +1 -0
- package/dist/extract/utils.d.ts +6 -0
- package/dist/extract/utils.d.ts.map +1 -0
- package/dist/extract/utils.js +28 -0
- package/dist/extract/utils.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -6
- package/dist/index.js.map +1 -1
- package/dist/map/builder.d.ts +3 -3
- package/dist/map/builder.d.ts.map +1 -1
- package/dist/map/builder.js +41 -2
- package/dist/map/builder.js.map +1 -1
- package/dist/map/truncate.d.ts +12 -0
- package/dist/map/truncate.d.ts.map +1 -0
- package/dist/map/truncate.js +89 -0
- package/dist/map/truncate.js.map +1 -0
- package/dist/map/yaml.d.ts +1 -0
- package/dist/map/yaml.d.ts.map +1 -1
- package/dist/map/yaml.js +24 -6
- package/dist/map/yaml.js.map +1 -1
- package/dist/scanner.d.ts +9 -2
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +53 -27
- package/dist/scanner.js.map +1 -1
- package/dist/types.d.ts +30 -2
- package/dist/types.d.ts.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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
|
|
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
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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
|
|
41
|
-
|
|
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
|
|
54
|
-
if (
|
|
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(
|
|
59
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/map/builder.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/map/builder.js
CHANGED
|
@@ -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
|
*/
|
package/dist/map/builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/map/builder.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAG/B;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAqB,EAAE,QAAgB;
|
|
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"}
|