@vibe-agent-toolkit/utils 0.1.28-rc.2 → 0.1.28-rc.3
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 +16 -3
- package/dist/git-utils.d.ts.map +1 -1
- package/dist/git-utils.js +48 -5
- package/dist/git-utils.js.map +1 -1
- package/package.json +1 -1
package/dist/git-utils.d.ts
CHANGED
|
@@ -35,10 +35,17 @@ 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())
|
|
@@ -51,6 +58,12 @@ export declare function isGitIgnored(filePath: string, cwd?: string): boolean;
|
|
|
51
58
|
* Much more efficient than calling `isGitIgnored()` in a loop - uses a single
|
|
52
59
|
* git subprocess with stdin instead of N subprocesses.
|
|
53
60
|
*
|
|
61
|
+
* **Limitation**: Unlike `isGitIgnored()`, this function does NOT handle symlink
|
|
62
|
+
* traversal (exit code 128). Paths that go through symlinks in gitignored directories
|
|
63
|
+
* will silently appear as non-ignored. If you need symlink-aware checking, use
|
|
64
|
+
* `isGitIgnored()` per-file instead. This is acceptable for discovery scanning
|
|
65
|
+
* (which typically doesn't follow symlinks), but NOT for bundling/packaging guards.
|
|
66
|
+
*
|
|
54
67
|
* @param filePaths - Array of absolute or relative paths to check
|
|
55
68
|
* @param cwd - Working directory (defaults to process.cwd())
|
|
56
69
|
* @returns Map of filePath -> isIgnored (true if gitignored, false otherwise)
|
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;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EAAE,EACnB,GAAG,GAAE,MAAsB,GAC1B,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CA8DtB"}
|
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,12 @@ 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
|
+
* **Limitation**: Unlike `isGitIgnored()`, this function does NOT handle symlink
|
|
158
|
+
* traversal (exit code 128). Paths that go through symlinks in gitignored directories
|
|
159
|
+
* will silently appear as non-ignored. If you need symlink-aware checking, use
|
|
160
|
+
* `isGitIgnored()` per-file instead. This is acceptable for discovery scanning
|
|
161
|
+
* (which typically doesn't follow symlinks), but NOT for bundling/packaging guards.
|
|
162
|
+
*
|
|
120
163
|
* @param filePaths - Array of absolute or relative paths to check
|
|
121
164
|
* @param cwd - Working directory (defaults to process.cwd())
|
|
122
165
|
* @returns Map of filePath -> isIgnored (true if gitignored, false otherwise)
|
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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"}
|