@vibe-agent-toolkit/utils 0.1.28-rc.2 → 0.1.28
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/git-utils.d.ts +10 -22
- package/dist/git-utils.d.ts.map +1 -1
- package/dist/git-utils.js +66 -24
- package/dist/git-utils.js.map +1 -1
- package/package.json +1 -1
package/dist/git-utils.d.ts
CHANGED
|
@@ -35,34 +35,22 @@ export declare function gitLsFiles(options: {
|
|
|
35
35
|
/**
|
|
36
36
|
* Check if a file path is ignored by git
|
|
37
37
|
*
|
|
38
|
-
* Uses git check-ignore which respects .gitignore, .git/info/exclude, and global gitignore
|
|
38
|
+
* Uses git check-ignore which respects .gitignore, .git/info/exclude, and global gitignore.
|
|
39
39
|
*
|
|
40
|
-
* **
|
|
41
|
-
*
|
|
40
|
+
* **Symlink handling**: When `git check-ignore` fails with exit code 128 ("beyond a symbolic
|
|
41
|
+
* link"), this function walks up ancestor directories and checks each one. If any ancestor is
|
|
42
|
+
* gitignored (e.g., `data/` is in `.gitignore`), the file is considered gitignored too. This
|
|
43
|
+
* handles the common pattern where a gitignored directory contains symlinks to external content
|
|
44
|
+
* (e.g., OneDrive, shared drives).
|
|
45
|
+
*
|
|
46
|
+
* **Performance warning**: This spawns a git subprocess for each file (plus up to N ancestor
|
|
47
|
+
* checks when the path traverses a symlink). For checking multiple files, use
|
|
48
|
+
* `gitCheckIgnoredBatch()` instead.
|
|
42
49
|
*
|
|
43
50
|
* @param filePath - Absolute or relative path to check
|
|
44
51
|
* @param cwd - Working directory (defaults to process.cwd())
|
|
45
52
|
* @returns true if file is gitignored, false otherwise
|
|
46
53
|
*/
|
|
47
54
|
export declare function isGitIgnored(filePath: string, cwd?: string): boolean;
|
|
48
|
-
/**
|
|
49
|
-
* Batch check if multiple file paths are ignored by git
|
|
50
|
-
*
|
|
51
|
-
* Much more efficient than calling `isGitIgnored()` in a loop - uses a single
|
|
52
|
-
* git subprocess with stdin instead of N subprocesses.
|
|
53
|
-
*
|
|
54
|
-
* @param filePaths - Array of absolute or relative paths to check
|
|
55
|
-
* @param cwd - Working directory (defaults to process.cwd())
|
|
56
|
-
* @returns Map of filePath -> isIgnored (true if gitignored, false otherwise)
|
|
57
|
-
*
|
|
58
|
-
* @example
|
|
59
|
-
* ```typescript
|
|
60
|
-
* const files = ['src/foo.ts', 'dist/bar.js', 'node_modules/baz.js'];
|
|
61
|
-
* const ignoreMap = gitCheckIgnoredBatch(files, '/project');
|
|
62
|
-
* // ignoreMap.get('src/foo.ts') === false
|
|
63
|
-
* // ignoreMap.get('dist/bar.js') === true
|
|
64
|
-
* // ignoreMap.get('node_modules/baz.js') === true
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
55
|
export declare function gitCheckIgnoredBatch(filePaths: string[], cwd?: string): Map<string, boolean>;
|
|
68
56
|
//# sourceMappingURL=git-utils.d.ts.map
|
package/dist/git-utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../src/git-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc3D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,MAAM,EAAE,GAAG,IAAI,CA0ClB;AAED
|
|
1
|
+
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../src/git-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc3D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,MAAM,EAAE,GAAG,IAAI,CA0ClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAmDnF;AAiDD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EAAE,EACnB,GAAG,GAAE,MAAsB,GAC1B,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CA4CtB"}
|
package/dist/git-utils.js
CHANGED
|
@@ -84,10 +84,17 @@ export function gitLsFiles(options) {
|
|
|
84
84
|
/**
|
|
85
85
|
* Check if a file path is ignored by git
|
|
86
86
|
*
|
|
87
|
-
* Uses git check-ignore which respects .gitignore, .git/info/exclude, and global gitignore
|
|
87
|
+
* Uses git check-ignore which respects .gitignore, .git/info/exclude, and global gitignore.
|
|
88
88
|
*
|
|
89
|
-
* **
|
|
90
|
-
*
|
|
89
|
+
* **Symlink handling**: When `git check-ignore` fails with exit code 128 ("beyond a symbolic
|
|
90
|
+
* link"), this function walks up ancestor directories and checks each one. If any ancestor is
|
|
91
|
+
* gitignored (e.g., `data/` is in `.gitignore`), the file is considered gitignored too. This
|
|
92
|
+
* handles the common pattern where a gitignored directory contains symlinks to external content
|
|
93
|
+
* (e.g., OneDrive, shared drives).
|
|
94
|
+
*
|
|
95
|
+
* **Performance warning**: This spawns a git subprocess for each file (plus up to N ancestor
|
|
96
|
+
* checks when the path traverses a symlink). For checking multiple files, use
|
|
97
|
+
* `gitCheckIgnoredBatch()` instead.
|
|
91
98
|
*
|
|
92
99
|
* @param filePath - Absolute or relative path to check
|
|
93
100
|
* @param cwd - Working directory (defaults to process.cwd())
|
|
@@ -97,14 +104,44 @@ export function isGitIgnored(filePath, cwd = process.cwd()) {
|
|
|
97
104
|
try {
|
|
98
105
|
// Resolve git path using which for security (avoids PATH manipulation)
|
|
99
106
|
const gitPath = which.sync('git');
|
|
107
|
+
const checkIgnoreArgs = ['check-ignore', '-q'];
|
|
100
108
|
// git check-ignore returns exit code 0 if file is ignored, 1 if not
|
|
101
|
-
const result = spawnSync(gitPath, [
|
|
109
|
+
const result = spawnSync(gitPath, [...checkIgnoreArgs, filePath], {
|
|
102
110
|
cwd,
|
|
103
111
|
encoding: 'utf-8',
|
|
104
112
|
stdio: 'pipe',
|
|
105
113
|
shell: false, // No shell interpreter for security
|
|
106
114
|
});
|
|
107
|
-
|
|
115
|
+
if (result.status === 0) {
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
// Exit code 128 = fatal error (e.g., path beyond a symbolic link).
|
|
119
|
+
// Walk up ancestor directories to check if a parent is gitignored.
|
|
120
|
+
// Example: data/ is gitignored, data/symlink/deep/file.md fails with 128,
|
|
121
|
+
// but checking data/ directly returns 0.
|
|
122
|
+
if (result.status !== 1) {
|
|
123
|
+
const resolvedCwd = safePath.resolve(cwd);
|
|
124
|
+
const resolvedFile = safePath.resolve(cwd, filePath);
|
|
125
|
+
let current = dirname(resolvedFile);
|
|
126
|
+
while (current !== resolvedCwd && !current.endsWith(parse(current).root)) {
|
|
127
|
+
const ancestorResult = spawnSync(gitPath, [...checkIgnoreArgs, current], {
|
|
128
|
+
cwd,
|
|
129
|
+
encoding: 'utf-8',
|
|
130
|
+
stdio: 'pipe',
|
|
131
|
+
shell: false,
|
|
132
|
+
});
|
|
133
|
+
if (ancestorResult.status === 0) {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
// If this ancestor check also fails fatally, keep walking up
|
|
137
|
+
// If it returns 1 (not ignored), the parent is tracked — stop walking
|
|
138
|
+
if (ancestorResult.status === 1) {
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
current = dirname(current);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
108
145
|
}
|
|
109
146
|
catch {
|
|
110
147
|
// If git is not available or other error, assume not ignored
|
|
@@ -117,6 +154,11 @@ export function isGitIgnored(filePath, cwd = process.cwd()) {
|
|
|
117
154
|
* Much more efficient than calling `isGitIgnored()` in a loop - uses a single
|
|
118
155
|
* git subprocess with stdin instead of N subprocesses.
|
|
119
156
|
*
|
|
157
|
+
* **Symlink handling**: After the batch check, any paths that were not reported as
|
|
158
|
+
* ignored are re-checked individually via `isGitIgnored()`, which handles exit code
|
|
159
|
+
* 128 ("beyond a symbolic link") by walking up ancestor directories. This ensures
|
|
160
|
+
* paths through symlinks in gitignored directories are correctly detected.
|
|
161
|
+
*
|
|
120
162
|
* @param filePaths - Array of absolute or relative paths to check
|
|
121
163
|
* @param cwd - Working directory (defaults to process.cwd())
|
|
122
164
|
* @returns Map of filePath -> isIgnored (true if gitignored, false otherwise)
|
|
@@ -130,47 +172,41 @@ export function isGitIgnored(filePath, cwd = process.cwd()) {
|
|
|
130
172
|
* // ignoreMap.get('node_modules/baz.js') === true
|
|
131
173
|
* ```
|
|
132
174
|
*/
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// No files to check
|
|
136
|
-
if (filePaths.length === 0) {
|
|
137
|
-
return result;
|
|
138
|
-
}
|
|
139
|
-
// Normalize paths to forward slashes for cross-platform consistency
|
|
140
|
-
// Git on Windows returns forward slashes, so we normalize input paths to match
|
|
175
|
+
/** Build the normalized→original path map and initialize result map. */
|
|
176
|
+
function initBatchMaps(filePaths) {
|
|
141
177
|
const normalizedPaths = filePaths.map(p => toForwardSlash(p));
|
|
142
|
-
|
|
143
|
-
const
|
|
178
|
+
const pathMap = new Map();
|
|
179
|
+
const result = new Map();
|
|
144
180
|
for (const [index, normalizedPath] of normalizedPaths.entries()) {
|
|
145
181
|
const originalPath = filePaths[index];
|
|
146
182
|
if (originalPath !== undefined) {
|
|
147
183
|
pathMap.set(normalizedPath, originalPath);
|
|
148
184
|
}
|
|
149
185
|
}
|
|
150
|
-
// Initialize all as not ignored (using original paths as keys)
|
|
151
186
|
for (const filePath of filePaths) {
|
|
152
187
|
result.set(filePath, false);
|
|
153
188
|
}
|
|
189
|
+
return { normalizedPaths, pathMap, result };
|
|
190
|
+
}
|
|
191
|
+
export function gitCheckIgnoredBatch(filePaths, cwd = process.cwd()) {
|
|
192
|
+
if (filePaths.length === 0) {
|
|
193
|
+
return new Map();
|
|
194
|
+
}
|
|
195
|
+
const { normalizedPaths, pathMap, result } = initBatchMaps(filePaths);
|
|
154
196
|
try {
|
|
155
|
-
// Resolve git path using which for security (avoids PATH manipulation)
|
|
156
197
|
const gitPath = which.sync('git');
|
|
157
|
-
// git check-ignore --stdin reads paths from stdin and outputs ignored ones
|
|
158
|
-
// Send normalized paths to git
|
|
159
198
|
const gitResult = spawnSync(gitPath, ['check-ignore', '--stdin'], {
|
|
160
199
|
cwd,
|
|
161
200
|
encoding: 'utf-8',
|
|
162
201
|
input: normalizedPaths.join('\n'),
|
|
163
202
|
stdio: 'pipe',
|
|
164
|
-
shell: false,
|
|
203
|
+
shell: false,
|
|
165
204
|
});
|
|
166
|
-
// Exit code 0 = at least one file ignored, 1 = none ignored
|
|
167
|
-
// Parse stdout to get which files are ignored
|
|
168
205
|
if (gitResult.status === 0 && gitResult.stdout) {
|
|
169
206
|
const ignoredPaths = gitResult.stdout
|
|
170
207
|
.split('\n')
|
|
171
208
|
.map((line) => line.trim())
|
|
172
209
|
.filter((line) => line.length > 0);
|
|
173
|
-
// Mark ignored files (convert back to original paths)
|
|
174
210
|
for (const ignoredPath of ignoredPaths) {
|
|
175
211
|
const originalPath = pathMap.get(ignoredPath);
|
|
176
212
|
if (originalPath !== undefined) {
|
|
@@ -178,10 +214,16 @@ export function gitCheckIgnoredBatch(filePaths, cwd = process.cwd()) {
|
|
|
178
214
|
}
|
|
179
215
|
}
|
|
180
216
|
}
|
|
217
|
+
// Fallback: re-check paths that batch reported as not-ignored using isGitIgnored(),
|
|
218
|
+
// which handles symlink traversal (exit code 128) via ancestor walk.
|
|
219
|
+
for (const [filePath, ignored] of result) {
|
|
220
|
+
if (!ignored && isGitIgnored(filePath, cwd)) {
|
|
221
|
+
result.set(filePath, true);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
181
224
|
return result;
|
|
182
225
|
}
|
|
183
226
|
catch {
|
|
184
|
-
// If git is not available or other error, return all as not ignored
|
|
185
227
|
return result;
|
|
186
228
|
}
|
|
187
229
|
}
|
package/dist/git-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../src/git-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,QAAQ,EAAG,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG5D;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,IAAI,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;IAEpC,OAAO,UAAU,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACjD,yGAAyG;QACzG,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,UAAU,CAAC,OAI1B;IACC,IAAI,CAAC;QACH,uEAAuE;QACvE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAElC,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAE1B,iDAAiD;QACjD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAC1D,CAAC;QAED,2BAA2B;QAC3B,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;YACtC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,KAAK,EAAE,oCAAoC;SACnD,CAAC,CAAC;QAEH,qDAAqD;QACrD,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wCAAwC;QACxC,OAAO,MAAM,CAAC,MAAM;aACjB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../src/git-utils.ts"],"names":[],"mappings":"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"}
|