@cortexkit/aft-bridge 0.35.0 → 0.35.2
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/edit-summary.d.ts +35 -0
- package/dist/edit-summary.d.ts.map +1 -0
- package/dist/edit-summary.js +62 -0
- package/dist/edit-summary.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/jsonc.d.ts +21 -0
- package/dist/jsonc.d.ts.map +1 -0
- package/dist/jsonc.js +35 -0
- package/dist/jsonc.js.map +1 -0
- package/dist/npm-resolver.d.ts +42 -0
- package/dist/npm-resolver.d.ts.map +1 -0
- package/dist/npm-resolver.js +199 -0
- package/dist/npm-resolver.js.map +1 -0
- package/dist/resolver.d.ts +16 -0
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +65 -1
- package/dist/resolver.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Shape of the Rust mutation response fields this helper reads. */
|
|
2
|
+
export interface EditSummaryInput {
|
|
3
|
+
/** Files modified in a multi-file transaction (Rust `files_modified`). */
|
|
4
|
+
files_modified?: number;
|
|
5
|
+
/** Number of match replacements (find/replace, replaceAll). */
|
|
6
|
+
replacements?: number;
|
|
7
|
+
/** Number of edits applied in batch mode (Rust `edits_applied`). */
|
|
8
|
+
edits_applied?: number;
|
|
9
|
+
/** True when a new file was created (append/write create path). */
|
|
10
|
+
created?: boolean;
|
|
11
|
+
/** True when the post-write content is byte-identical to before. */
|
|
12
|
+
no_op?: boolean;
|
|
13
|
+
/** True when the write was reverted (e.g. generated invalid syntax). */
|
|
14
|
+
rolled_back?: boolean;
|
|
15
|
+
/** Whether the file was auto-formatted after the write. */
|
|
16
|
+
formatted?: boolean;
|
|
17
|
+
/** Diff counts. before/after content is intentionally ignored here. */
|
|
18
|
+
diff?: {
|
|
19
|
+
additions?: number;
|
|
20
|
+
deletions?: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Build the compact agent-facing summary line for a successful mutation.
|
|
25
|
+
*
|
|
26
|
+
* Returns just the headline sentence; callers append their own conditional
|
|
27
|
+
* notes (no-op, format-skip, LSP diagnostics, pending/exited servers) which
|
|
28
|
+
* already exist per-plugin and carry real signal.
|
|
29
|
+
*
|
|
30
|
+
* Honesty: when `rolled_back` is true the change did NOT land, so we never say
|
|
31
|
+
* "applied" — we say the file was left unchanged. This was previously buried
|
|
32
|
+
* inside a raw `"rolled_back":false` JSON field the agent had to parse.
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatEditSummary(data: EditSummaryInput): string;
|
|
35
|
+
//# sourceMappingURL=edit-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-summary.d.ts","sourceRoot":"","sources":["../src/edit-summary.ts"],"names":[],"mappings":"AAeA,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oEAAoE;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wEAAwE;IACxE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAqChE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Shared, compact agent-facing summary for file-mutation tool results
|
|
2
|
+
// (edit / write / apply_patch transaction). Both the OpenCode and Pi plugins
|
|
3
|
+
// render the SAME agent-facing text from this helper so the two harnesses stay
|
|
4
|
+
// in parity.
|
|
5
|
+
//
|
|
6
|
+
// Design (see session decision): the agent already supplied the path and the
|
|
7
|
+
// content it wants, so we do NOT echo the file path, the before/after content,
|
|
8
|
+
// or the raw Rust JSON envelope back to the model. Doing so makes the payload
|
|
9
|
+
// scale with file size, not edit size. The rich data (diff body, backup id,
|
|
10
|
+
// status-bar counts, etc.) stays in the plugin's UI `metadata`/`details`; the
|
|
11
|
+
// status-bar line is injected separately by the bridge layer.
|
|
12
|
+
//
|
|
13
|
+
// The model only needs: did it apply, how much changed (cheap confirmation),
|
|
14
|
+
// and any signal it must act on (rollback, no-op, format-skip, LSP errors).
|
|
15
|
+
/**
|
|
16
|
+
* Build the compact agent-facing summary line for a successful mutation.
|
|
17
|
+
*
|
|
18
|
+
* Returns just the headline sentence; callers append their own conditional
|
|
19
|
+
* notes (no-op, format-skip, LSP diagnostics, pending/exited servers) which
|
|
20
|
+
* already exist per-plugin and carry real signal.
|
|
21
|
+
*
|
|
22
|
+
* Honesty: when `rolled_back` is true the change did NOT land, so we never say
|
|
23
|
+
* "applied" — we say the file was left unchanged. This was previously buried
|
|
24
|
+
* inside a raw `"rolled_back":false` JSON field the agent had to parse.
|
|
25
|
+
*/
|
|
26
|
+
export function formatEditSummary(data) {
|
|
27
|
+
// Rollback is the one case where "applied" would be a lie. The write was
|
|
28
|
+
// reverted (typically because the result failed syntax validation), so the
|
|
29
|
+
// file is unchanged and the agent must retry differently.
|
|
30
|
+
if (data.rolled_back === true) {
|
|
31
|
+
return "Edit rolled back: the change produced invalid syntax, so the file was left unchanged.";
|
|
32
|
+
}
|
|
33
|
+
// Multi-file transaction (operations array): report file count, not per-file
|
|
34
|
+
// diffs (those are in the UI metadata).
|
|
35
|
+
if (typeof data.files_modified === "number") {
|
|
36
|
+
const n = data.files_modified;
|
|
37
|
+
return `Applied edits to ${n} file${n === 1 ? "" : "s"}.`;
|
|
38
|
+
}
|
|
39
|
+
const additions = data.diff?.additions ?? 0;
|
|
40
|
+
const deletions = data.diff?.deletions ?? 0;
|
|
41
|
+
const counts = `+${additions}/-${deletions}`;
|
|
42
|
+
// Append/write create path.
|
|
43
|
+
if (data.created === true) {
|
|
44
|
+
let s = `Created file (${counts}).`;
|
|
45
|
+
if (data.formatted)
|
|
46
|
+
s += " Auto-formatted.";
|
|
47
|
+
return s;
|
|
48
|
+
}
|
|
49
|
+
// Batch mode reports edits_applied; replaceAll reports replacements > 1.
|
|
50
|
+
let detail = counts;
|
|
51
|
+
if (typeof data.edits_applied === "number" && data.edits_applied > 1) {
|
|
52
|
+
detail = `${counts}, ${data.edits_applied} edits`;
|
|
53
|
+
}
|
|
54
|
+
else if (typeof data.replacements === "number" && data.replacements > 1) {
|
|
55
|
+
detail = `${counts}, ${data.replacements} replacements`;
|
|
56
|
+
}
|
|
57
|
+
let s = `Edited (${detail}).`;
|
|
58
|
+
if (data.formatted)
|
|
59
|
+
s += " Auto-formatted.";
|
|
60
|
+
return s;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=edit-summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-summary.js","sourceRoot":"","sources":["../src/edit-summary.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,6EAA6E;AAC7E,+EAA+E;AAC/E,aAAa;AACb,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,8DAA8D;AAC9D,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAsB5E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAsB;IACtD,yEAAyE;IACzE,2EAA2E;IAC3E,0DAA0D;IAC1D,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,uFAAuF,CAAC;IACjG,CAAC;IAED,6EAA6E;IAC7E,wCAAwC;IACxC,IAAI,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC;QAC9B,OAAO,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC5D,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;IAE7C,4BAA4B;IAC5B,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,iBAAiB,MAAM,IAAI,CAAC;QACpC,IAAI,IAAI,CAAC,SAAS;YAAE,CAAC,IAAI,kBAAkB,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,yEAAyE;IACzE,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QACrE,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC,aAAa,QAAQ,CAAC;IACpD,CAAC;SAAM,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC1E,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC,YAAY,eAAe,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,GAAG,WAAW,MAAM,IAAI,CAAC;IAC9B,IAAI,IAAI,CAAC,SAAS;QAAE,CAAC,IAAI,kBAAkB,CAAC;IAC5C,OAAO,CAAC,CAAC;AACX,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,17 +11,22 @@ export { maybeAppendConflictsHint, maybeAppendGrepHint } from "./bash-hints.js";
|
|
|
11
11
|
export type { BashCompletedPayload, BashLongRunningPayload, BridgeOptions, BridgeRequestOptions, ConfigureWarning, ConfigureWarningsContext, StatusSnapshot, } from "./bridge.js";
|
|
12
12
|
export { BinaryBridge, compareSemver, tagStderrLine } from "./bridge.js";
|
|
13
13
|
export { downloadBinary, ensureBinary, getBinaryName, getCacheDir, getCachedBinaryPath, } from "./downloader.js";
|
|
14
|
+
export type { EditSummaryInput } from "./edit-summary.js";
|
|
15
|
+
export { formatEditSummary } from "./edit-summary.js";
|
|
14
16
|
export { compressionSavingsPercent, formatTokenCount } from "./format.js";
|
|
17
|
+
export { stripJsoncSymbols } from "./jsonc.js";
|
|
15
18
|
export type { Logger, LogMeta } from "./logger.js";
|
|
16
19
|
export type { MigrationHarness, MigrationOptions, MigrationStatus } from "./migration.js";
|
|
17
20
|
export { ensureStorageMigrated, getMigrationStatus, resolveCortexKitStorageRoot, resolveLegacyStorageRoot, } from "./migration.js";
|
|
21
|
+
export type { ResolvedNpm } from "./npm-resolver.js";
|
|
22
|
+
export { isNpmAvailable, npmSpawnEnv, probeNpmVersion, resolveNpm, } from "./npm-resolver.js";
|
|
18
23
|
export { __test__ as __onnxTest__, cleanupOnnxRuntime, ensureOnnxRuntime, getManualInstallHint, isOrtAutoDownloadSupported, } from "./onnx-runtime.js";
|
|
19
24
|
export { markAnnouncementSeen, repairRootScopedStorageFile, resolveHarnessStoragePath, shouldShowAnnouncement, } from "./paths.js";
|
|
20
25
|
export { PLATFORM_ARCH_MAP, PLATFORM_ASSET_MAP } from "./platform.js";
|
|
21
26
|
export type { PoolOptions } from "./pool.js";
|
|
22
27
|
export { BridgePool, HomeProjectRootError, isHomeDirectoryRoot } from "./pool.js";
|
|
23
28
|
export type { AftErrorResponse, AftPushFrame, AftRequestEnvelope, AftResponse, AftSuccessResponse, BashCompletedFrame, BgCompletion, ConfigureWarningFrame, PermissionAskFrame, ProgressFrame, StatusCompression, StatusCompressionAggregate, StatusResponse, } from "./protocol.js";
|
|
24
|
-
export { findBinary, findBinarySync, platformKey } from "./resolver.js";
|
|
29
|
+
export { findBinary, findBinarySync, isNativeExecutable, platformKey } from "./resolver.js";
|
|
25
30
|
export type { StatusBarCounts, StatusBarEmitState } from "./status-bar.js";
|
|
26
31
|
export { createStatusBarEmitState, formatStatusBar, parseStatusBarCounts, STATUS_BAR_HEARTBEAT_CALLS, shouldEmitStatusBar, statusBarLine, } from "./status-bar.js";
|
|
27
32
|
export type { ZoomMultiTargetEntry, ZoomMultiTargetResult, ZoomMultiTargetSymbolResult, ZoomResponseLike, } from "./zoom-format.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAChF,YAAY,EACV,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAChF,YAAY,EACV,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE1F,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,QAAQ,IAAI,YAAY,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACtE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAElF,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,0BAA0B,EAC1B,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5F,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,2BAA2B,EAC3B,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,17 +14,21 @@ export { maybeAppendConflictsHint, maybeAppendGrepHint } from "./bash-hints.js";
|
|
|
14
14
|
export { BinaryBridge, compareSemver, tagStderrLine } from "./bridge.js";
|
|
15
15
|
// --- binary resolution ---
|
|
16
16
|
export { downloadBinary, ensureBinary, getBinaryName, getCacheDir, getCachedBinaryPath, } from "./downloader.js";
|
|
17
|
+
export { formatEditSummary } from "./edit-summary.js";
|
|
17
18
|
// --- compact UI formatting ---
|
|
18
19
|
export { compressionSavingsPercent, formatTokenCount } from "./format.js";
|
|
20
|
+
// --- jsonc helpers ---
|
|
21
|
+
export { stripJsoncSymbols } from "./jsonc.js";
|
|
19
22
|
// --- storage migration ---
|
|
20
23
|
export { ensureStorageMigrated, getMigrationStatus, resolveCortexKitStorageRoot, resolveLegacyStorageRoot, } from "./migration.js";
|
|
24
|
+
export { isNpmAvailable, npmSpawnEnv, probeNpmVersion, resolveNpm, } from "./npm-resolver.js";
|
|
21
25
|
// --- ONNX runtime ---
|
|
22
26
|
export { __test__ as __onnxTest__, cleanupOnnxRuntime, ensureOnnxRuntime, getManualInstallHint, isOrtAutoDownloadSupported, } from "./onnx-runtime.js";
|
|
23
27
|
export { markAnnouncementSeen, repairRootScopedStorageFile, resolveHarnessStoragePath, shouldShowAnnouncement, } from "./paths.js";
|
|
24
28
|
// --- platform helpers ---
|
|
25
29
|
export { PLATFORM_ARCH_MAP, PLATFORM_ASSET_MAP } from "./platform.js";
|
|
26
30
|
export { BridgePool, HomeProjectRootError, isHomeDirectoryRoot } from "./pool.js";
|
|
27
|
-
export { findBinary, findBinarySync, platformKey } from "./resolver.js";
|
|
31
|
+
export { findBinary, findBinarySync, isNativeExecutable, platformKey } from "./resolver.js";
|
|
28
32
|
export { createStatusBarEmitState, formatStatusBar, parseStatusBarCounts, STATUS_BAR_HEARTBEAT_CALLS, shouldEmitStatusBar, statusBarLine, } from "./status-bar.js";
|
|
29
33
|
export { formatZoomMultiTargetResult, formatZoomText } from "./zoom-format.js";
|
|
30
34
|
//# 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;;;;;;;GAOG;AAEH,0BAA0B;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,0DAA0D;AAC1D,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAUhF,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzE,4BAA4B;AAC5B,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,0BAA0B;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,0DAA0D;AAC1D,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAUhF,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzE,4BAA4B;AAC5B,OAAO,EACL,cAAc,EACd,YAAY,EACZ,aAAa,EACb,WAAW,EACX,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,gCAAgC;AAChC,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1E,wBAAwB;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,4BAA4B;AAC5B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,cAAc,EACd,WAAW,EACX,eAAe,EACf,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,uBAAuB;AACvB,OAAO,EACL,QAAQ,IAAI,YAAY,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,2BAA2B;AAC3B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAiBlF,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5F,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,GACd,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/jsonc.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONC parse helpers shared by host plugins.
|
|
3
|
+
*
|
|
4
|
+
* `comment-json` preserves comments by attaching `Symbol(before:<key>)` /
|
|
5
|
+
* `Symbol(after:<key>)` properties to the parsed objects. Those symbol keys are
|
|
6
|
+
* exactly what lets the migration round-trip rewrite a config without losing
|
|
7
|
+
* user comments, but they are poison for anything that walks own-property keys
|
|
8
|
+
* and stringifies them. Zod's validation builds error paths through the object
|
|
9
|
+
* and interpolates each key into a string; the instant a comment symbol lands
|
|
10
|
+
* in an error path (`path.join(".")` or a template literal), Node throws
|
|
11
|
+
* `TypeError: Cannot convert a symbol to a string`, the whole config load is
|
|
12
|
+
* caught by the outer try/catch, and every setting silently falls back to its
|
|
13
|
+
* default. See issue #88.
|
|
14
|
+
*
|
|
15
|
+
* For the in-memory load path we don't need the comments, so we deep-copy the
|
|
16
|
+
* parsed result into plain objects that carry only string-keyed enumerable
|
|
17
|
+
* properties. The disk-rewrite/migration path keeps the original symbol-bearing
|
|
18
|
+
* object so comments survive the round-trip.
|
|
19
|
+
*/
|
|
20
|
+
export declare function stripJsoncSymbols<T>(value: T): T;
|
|
21
|
+
//# sourceMappingURL=jsonc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonc.d.ts","sourceRoot":"","sources":["../src/jsonc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAchD"}
|
package/dist/jsonc.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSONC parse helpers shared by host plugins.
|
|
3
|
+
*
|
|
4
|
+
* `comment-json` preserves comments by attaching `Symbol(before:<key>)` /
|
|
5
|
+
* `Symbol(after:<key>)` properties to the parsed objects. Those symbol keys are
|
|
6
|
+
* exactly what lets the migration round-trip rewrite a config without losing
|
|
7
|
+
* user comments, but they are poison for anything that walks own-property keys
|
|
8
|
+
* and stringifies them. Zod's validation builds error paths through the object
|
|
9
|
+
* and interpolates each key into a string; the instant a comment symbol lands
|
|
10
|
+
* in an error path (`path.join(".")` or a template literal), Node throws
|
|
11
|
+
* `TypeError: Cannot convert a symbol to a string`, the whole config load is
|
|
12
|
+
* caught by the outer try/catch, and every setting silently falls back to its
|
|
13
|
+
* default. See issue #88.
|
|
14
|
+
*
|
|
15
|
+
* For the in-memory load path we don't need the comments, so we deep-copy the
|
|
16
|
+
* parsed result into plain objects that carry only string-keyed enumerable
|
|
17
|
+
* properties. The disk-rewrite/migration path keeps the original symbol-bearing
|
|
18
|
+
* object so comments survive the round-trip.
|
|
19
|
+
*/
|
|
20
|
+
export function stripJsoncSymbols(value) {
|
|
21
|
+
if (Array.isArray(value)) {
|
|
22
|
+
return value.map((item) => stripJsoncSymbols(item));
|
|
23
|
+
}
|
|
24
|
+
if (value !== null && typeof value === "object") {
|
|
25
|
+
const out = {};
|
|
26
|
+
// Object.entries only yields string-keyed enumerable own properties, so the
|
|
27
|
+
// comment symbols are dropped here by construction.
|
|
28
|
+
for (const [key, val] of Object.entries(value)) {
|
|
29
|
+
out[key] = stripJsoncSymbols(val);
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=jsonc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonc.js","sourceRoot":"","sources":["../src/jsonc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,iBAAiB,CAAI,KAAQ;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAiB,CAAC;IACtE,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,4EAA4E;QAC5E,oDAAoD;QACpD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,GAAQ,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface ResolvedNpm {
|
|
2
|
+
/** Absolute path to the npm executable (or a bare name if only PATH-resolved). */
|
|
3
|
+
command: string;
|
|
4
|
+
/** Directory containing npm, prepended to PATH at spawn time so npm's
|
|
5
|
+
* `#!/usr/bin/env node` shebang can find its sibling node. Null when the
|
|
6
|
+
* command was found via the OS PATH resolver and no augmentation is needed. */
|
|
7
|
+
binDir: string | null;
|
|
8
|
+
}
|
|
9
|
+
interface ResolveNpmDeps {
|
|
10
|
+
platform: NodeJS.Platform;
|
|
11
|
+
env: NodeJS.ProcessEnv;
|
|
12
|
+
home: string;
|
|
13
|
+
execPath: string;
|
|
14
|
+
/**
|
|
15
|
+
* Absolute system bin directories scanned last (e.g. /usr/local/bin). Defaults
|
|
16
|
+
* to the platform's well-known list. Injectable so tests can pass `[]` to stay
|
|
17
|
+
* hermetic — otherwise a real system npm (present on CI runners) leaks in and
|
|
18
|
+
* breaks the "returns null" cases.
|
|
19
|
+
*/
|
|
20
|
+
systemNpmDirs?: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve npm, preferring PATH, then node-adjacent, then well-known version
|
|
24
|
+
* manager / system locations. Returns null only when npm genuinely cannot be
|
|
25
|
+
* found anywhere we know to look.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveNpm(deps?: ResolveNpmDeps): ResolvedNpm | null;
|
|
28
|
+
/**
|
|
29
|
+
* Build a spawn env that makes a resolved npm runnable: prepend its bin dir to
|
|
30
|
+
* PATH so npm's `#!/usr/bin/env node` shebang finds its sibling node, even when
|
|
31
|
+
* the inherited PATH was stripped by a GUI launch.
|
|
32
|
+
*/
|
|
33
|
+
export declare function npmSpawnEnv(resolved: ResolvedNpm, baseEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
34
|
+
/**
|
|
35
|
+
* Quick boolean check: can we run npm at all? Used by pre-flight gating before
|
|
36
|
+
* destructive auto-update steps.
|
|
37
|
+
*/
|
|
38
|
+
export declare function isNpmAvailable(deps?: ResolveNpmDeps): boolean;
|
|
39
|
+
/** Test seam: verify a resolved npm actually executes (used by diagnostics). */
|
|
40
|
+
export declare function probeNpmVersion(resolved: ResolvedNpm): string | null;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=npm-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-resolver.d.ts","sourceRoot":"","sources":["../src/npm-resolver.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,WAAW;IAC1B,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB;;mFAE+E;IAC/E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAuHD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,cAA8B,GAAG,WAAW,GAAG,IAAI,CAkBnF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,MAAM,CAAC,UAAwB,GACvC,MAAM,CAAC,UAAU,CAKnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,GAAE,cAA8B,GAAG,OAAO,CAE5E;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAapE"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve an `npm` executable when it is not on PATH.
|
|
3
|
+
*
|
|
4
|
+
* OpenCode and Pi are frequently launched from a GUI / dock / Desktop app,
|
|
5
|
+
* which gives the process a stripped PATH that does NOT include a Node version
|
|
6
|
+
* manager's bin directory (nvm, mise, volta, fnm, asdf) or even Homebrew. When
|
|
7
|
+
* that happens, `spawn("npm", ...)` fails with "Executable not found in $PATH",
|
|
8
|
+
* so the auto-updater and LSP auto-install silently break. See issue: a user's
|
|
9
|
+
* auto-update churned every launch (rewrite package.json -> delete package ->
|
|
10
|
+
* npm install fails -> restore) and they stayed pinned to the old version.
|
|
11
|
+
*
|
|
12
|
+
* `npm` is itself a Node script (`#!/usr/bin/env node` shebang on Unix), so once
|
|
13
|
+
* we find npm's absolute path we must also make its sibling `node` reachable, or
|
|
14
|
+
* the shebang fails the same way. `resolveNpm()` returns both the command and
|
|
15
|
+
* its bin directory; `npmSpawnEnv()` prepends that directory to PATH for the
|
|
16
|
+
* spawn so npm can find its own node.
|
|
17
|
+
*/
|
|
18
|
+
import { execFileSync } from "node:child_process";
|
|
19
|
+
import { readdirSync, statSync } from "node:fs";
|
|
20
|
+
import { homedir } from "node:os";
|
|
21
|
+
import { delimiter, dirname, isAbsolute, join } from "node:path";
|
|
22
|
+
function defaultDeps() {
|
|
23
|
+
return {
|
|
24
|
+
platform: process.platform,
|
|
25
|
+
env: process.env,
|
|
26
|
+
home: homedir(),
|
|
27
|
+
execPath: process.execPath,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function npmBinaryName(platform) {
|
|
31
|
+
return platform === "win32" ? "npm.cmd" : "npm";
|
|
32
|
+
}
|
|
33
|
+
function isFile(p) {
|
|
34
|
+
try {
|
|
35
|
+
return statSync(p).isFile();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Scan the PATH env for npm. Returns the first match's directory, or null. */
|
|
42
|
+
function npmFromPath(deps) {
|
|
43
|
+
const name = npmBinaryName(deps.platform);
|
|
44
|
+
const raw = deps.env.PATH ?? deps.env.Path ?? "";
|
|
45
|
+
for (const entry of raw.split(delimiter)) {
|
|
46
|
+
const dir = entry.trim().replace(/^"|"$/g, "");
|
|
47
|
+
if (!dir || !isAbsolute(dir))
|
|
48
|
+
continue;
|
|
49
|
+
if (isFile(join(dir, name)))
|
|
50
|
+
return dir;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
/** npm ships beside node in standard installs (e.g. /opt/homebrew/bin/{node,npm}). */
|
|
55
|
+
function npmAdjacentToNode(deps) {
|
|
56
|
+
// process.execPath is the running node/bun binary. Under Node this is
|
|
57
|
+
// .../bin/node with npm as a sibling; under Bun (OpenCode TUI) there is no
|
|
58
|
+
// npm sibling, which is fine — we fall through to well-known locations.
|
|
59
|
+
const dir = dirname(deps.execPath);
|
|
60
|
+
return isFile(join(dir, npmBinaryName(deps.platform))) ? dir : null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Pick the highest-version subdirectory under a version-manager `installs`
|
|
64
|
+
* directory that actually contains npm. Used for nvm / mise layouts like
|
|
65
|
+
* `~/.nvm/versions/node/<ver>/bin/npm`.
|
|
66
|
+
*/
|
|
67
|
+
function highestVersionedNodeBin(installsDir, name) {
|
|
68
|
+
let entries;
|
|
69
|
+
try {
|
|
70
|
+
entries = readdirSync(installsDir);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const candidates = entries
|
|
76
|
+
.filter((v) => isFile(join(installsDir, v, "bin", name)))
|
|
77
|
+
.sort((a, b) => compareVersionsDesc(a, b));
|
|
78
|
+
return candidates.length > 0 ? join(installsDir, candidates[0], "bin") : null;
|
|
79
|
+
}
|
|
80
|
+
/** Descending semver-ish compare; non-numeric segments sort after numeric. */
|
|
81
|
+
function compareVersionsDesc(a, b) {
|
|
82
|
+
const pa = a
|
|
83
|
+
.replace(/^v/, "")
|
|
84
|
+
.split(".")
|
|
85
|
+
.map((n) => Number.parseInt(n, 10));
|
|
86
|
+
const pb = b
|
|
87
|
+
.replace(/^v/, "")
|
|
88
|
+
.split(".")
|
|
89
|
+
.map((n) => Number.parseInt(n, 10));
|
|
90
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
91
|
+
const na = Number.isFinite(pa[i]) ? pa[i] : -1;
|
|
92
|
+
const nb = Number.isFinite(pb[i]) ? pb[i] : -1;
|
|
93
|
+
if (na !== nb)
|
|
94
|
+
return nb - na;
|
|
95
|
+
}
|
|
96
|
+
return b.localeCompare(a);
|
|
97
|
+
}
|
|
98
|
+
/** Well-known npm bin directories, in priority order, for the current platform. */
|
|
99
|
+
function wellKnownNpmDirs(deps) {
|
|
100
|
+
const { platform, env, home } = deps;
|
|
101
|
+
const name = npmBinaryName(platform);
|
|
102
|
+
const dirs = [];
|
|
103
|
+
const push = (dir) => {
|
|
104
|
+
if (dir && !dirs.includes(dir))
|
|
105
|
+
dirs.push(dir);
|
|
106
|
+
};
|
|
107
|
+
if (platform === "win32") {
|
|
108
|
+
const programFiles = env.ProgramFiles || "C:\\Program Files";
|
|
109
|
+
const appData = env.APPDATA;
|
|
110
|
+
const localAppData = env.LOCALAPPDATA;
|
|
111
|
+
push(join(programFiles, "nodejs"));
|
|
112
|
+
if (appData)
|
|
113
|
+
push(join(appData, "npm"));
|
|
114
|
+
if (localAppData)
|
|
115
|
+
push(join(localAppData, "Volta", "bin"));
|
|
116
|
+
// nvm-windows
|
|
117
|
+
if (env.NVM_SYMLINK)
|
|
118
|
+
push(env.NVM_SYMLINK);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// Active node version manager hints (set even when PATH is otherwise stripped).
|
|
122
|
+
if (env.NVM_BIN)
|
|
123
|
+
push(env.NVM_BIN);
|
|
124
|
+
// Version-manager installs (pick highest version with npm).
|
|
125
|
+
push(highestVersionedNodeBin(join(home, ".nvm", "versions", "node"), name));
|
|
126
|
+
push(highestVersionedNodeBin(join(home, ".local", "share", "mise", "installs", "node"), name));
|
|
127
|
+
push(highestVersionedNodeBin(join(home, ".asdf", "installs", "nodejs"), name));
|
|
128
|
+
// Fixed-location managers.
|
|
129
|
+
push(join(home, ".volta", "bin"));
|
|
130
|
+
push(join(home, ".asdf", "shims"));
|
|
131
|
+
// Homebrew + system (injectable so tests stay hermetic; see ResolveNpmDeps).
|
|
132
|
+
const systemDirs = deps.systemNpmDirs ??
|
|
133
|
+
(platform === "darwin"
|
|
134
|
+
? ["/opt/homebrew/bin", "/usr/local/bin"]
|
|
135
|
+
: ["/usr/local/bin", "/usr/bin", join(home, ".local", "bin")]);
|
|
136
|
+
for (const dir of systemDirs)
|
|
137
|
+
push(dir);
|
|
138
|
+
}
|
|
139
|
+
return dirs;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Resolve npm, preferring PATH, then node-adjacent, then well-known version
|
|
143
|
+
* manager / system locations. Returns null only when npm genuinely cannot be
|
|
144
|
+
* found anywhere we know to look.
|
|
145
|
+
*/
|
|
146
|
+
export function resolveNpm(deps = defaultDeps()) {
|
|
147
|
+
const name = npmBinaryName(deps.platform);
|
|
148
|
+
// 1. PATH — respects the user's own setup when it survived to this process.
|
|
149
|
+
const onPath = npmFromPath(deps);
|
|
150
|
+
if (onPath)
|
|
151
|
+
return { command: join(onPath, name), binDir: onPath };
|
|
152
|
+
// 2. Node-adjacent (npm sits next to node in standard installs).
|
|
153
|
+
const adjacent = npmAdjacentToNode(deps);
|
|
154
|
+
if (adjacent)
|
|
155
|
+
return { command: join(adjacent, name), binDir: adjacent };
|
|
156
|
+
// 3. Well-known version-manager / system locations.
|
|
157
|
+
for (const dir of wellKnownNpmDirs(deps)) {
|
|
158
|
+
const candidate = join(dir, name);
|
|
159
|
+
if (isFile(candidate))
|
|
160
|
+
return { command: candidate, binDir: dir };
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Build a spawn env that makes a resolved npm runnable: prepend its bin dir to
|
|
166
|
+
* PATH so npm's `#!/usr/bin/env node` shebang finds its sibling node, even when
|
|
167
|
+
* the inherited PATH was stripped by a GUI launch.
|
|
168
|
+
*/
|
|
169
|
+
export function npmSpawnEnv(resolved, baseEnv = process.env) {
|
|
170
|
+
if (!resolved.binDir)
|
|
171
|
+
return { ...baseEnv };
|
|
172
|
+
const existing = baseEnv.PATH ?? baseEnv.Path ?? "";
|
|
173
|
+
const next = existing ? `${resolved.binDir}${delimiter}${existing}` : resolved.binDir;
|
|
174
|
+
return { ...baseEnv, PATH: next };
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Quick boolean check: can we run npm at all? Used by pre-flight gating before
|
|
178
|
+
* destructive auto-update steps.
|
|
179
|
+
*/
|
|
180
|
+
export function isNpmAvailable(deps = defaultDeps()) {
|
|
181
|
+
return resolveNpm(deps) !== null;
|
|
182
|
+
}
|
|
183
|
+
/** Test seam: verify a resolved npm actually executes (used by diagnostics). */
|
|
184
|
+
export function probeNpmVersion(resolved) {
|
|
185
|
+
try {
|
|
186
|
+
const out = execFileSync(resolved.command, ["--version"], {
|
|
187
|
+
env: npmSpawnEnv(resolved),
|
|
188
|
+
encoding: "utf-8",
|
|
189
|
+
timeout: 5000,
|
|
190
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
191
|
+
});
|
|
192
|
+
const v = out.trim();
|
|
193
|
+
return /^\d+\.\d+\.\d+/.test(v) ? v : null;
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=npm-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-resolver.js","sourceRoot":"","sources":["../src/npm-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAyBjE,SAAS,WAAW;IAClB,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,IAAI,EAAE,OAAO,EAAE;QACf,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAAyB;IAC9C,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAClD,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,SAAS,WAAW,CAAC,IAAoB;IACvC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACvC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sFAAsF;AACtF,SAAS,iBAAiB,CAAC,IAAoB;IAC7C,sEAAsE;IACtE,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,WAAmB,EAAE,IAAY;IAChE,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,OAAO;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;SACxD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC;AAED,8EAA8E;AAC9E,SAAS,mBAAmB,CAAC,CAAS,EAAE,CAAS;IAC/C,MAAM,EAAE,GAAG,CAAC;SACT,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,CAAC;SACT,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,mFAAmF;AACnF,SAAS,gBAAgB,CAAC,IAAoB;IAC5C,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACrC,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,CAAC,GAA8B,EAAE,EAAE;QAC9C,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,mBAAmB,CAAC;QAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnC,IAAI,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACxC,IAAI,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,cAAc;QACd,IAAI,GAAG,CAAC,WAAW;YAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,gFAAgF;QAChF,IAAI,GAAG,CAAC,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,4DAA4D;QAC5D,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/E,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACnC,6EAA6E;QAC7E,MAAM,UAAU,GACd,IAAI,CAAC,aAAa;YAClB,CAAC,QAAQ,KAAK,QAAQ;gBACpB,CAAC,CAAC,CAAC,mBAAmB,EAAE,gBAAgB,CAAC;gBACzC,CAAC,CAAC,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACnE,KAAK,MAAM,GAAG,IAAI,UAAU;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAuB,WAAW,EAAE;IAC7D,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE1C,4EAA4E;IAC5E,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAEnE,iEAAiE;IACjE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAEzE,oDAAoD;IACpD,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACpE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,QAAqB,EACrB,UAA6B,OAAO,CAAC,GAAG;IAExC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,SAAS,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IACtF,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAuB,WAAW,EAAE;IACjE,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AACnC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,QAAqB;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE;YACxD,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC;YAC1B,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/resolver.d.ts
CHANGED
|
@@ -3,6 +3,22 @@ type EnsureBinary = typeof ensureBinary;
|
|
|
3
3
|
export declare function __setEnsureBinaryForTests(impl: EnsureBinary | null): void;
|
|
4
4
|
export { readBinaryVersion };
|
|
5
5
|
declare function parsePathLookupOutput(output: string): string[];
|
|
6
|
+
/**
|
|
7
|
+
* True when `binaryPath` begins with a recognized native-executable magic
|
|
8
|
+
* number (Mach-O, ELF, or PE/`MZ`). False for script shims that start with a
|
|
9
|
+
* shebang (`#!`) or anything else.
|
|
10
|
+
*
|
|
11
|
+
* This is the guard against a `which aft` / `where aft` PATH lookup resolving to
|
|
12
|
+
* the `@cortexkit/aft` CLI's OWN node-script shim. The CLI publishes a `bin`
|
|
13
|
+
* named `aft` (same name as the native binary), and npx prepends its
|
|
14
|
+
* `node_modules/.bin` to PATH, so `which aft` can resolve to that shim. Probing
|
|
15
|
+
* it with `--version` re-enters the CLI, which probes `which aft` again, which
|
|
16
|
+
* forks `opencode --version` / `pi --version` for its harness report — an
|
|
17
|
+
* exponential fork bomb (issue: self-resolution recursion). Native binaries
|
|
18
|
+
* never start with `#!`, so a magic-number check rejects the shim regardless of
|
|
19
|
+
* where it lives (npx cache, global `npm i -g`, etc.).
|
|
20
|
+
*/
|
|
21
|
+
export declare function isNativeExecutable(binaryPath: string): boolean;
|
|
6
22
|
/**
|
|
7
23
|
* Map the current `process.platform` and `process.arch` to the npm platform
|
|
8
24
|
* package suffix (e.g. `"darwin-arm64"`, `"linux-x64"`).
|
package/dist/resolver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,YAAY,EAAe,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,KAAK,YAAY,GAAG,OAAO,YAAY,CAAC;AAIxC,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAEzE;AAID,OAAO,EAAE,iBAAiB,EAAE,CAAC;AA2G7B,iBAAS,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAKvD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAgC9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,QAAQ,GAAE,MAAyB,EACnC,IAAI,GAAE,MAAqB,GAC1B,MAAM,CAgBR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwFtE;AAED,eAAO,MAAM,QAAQ;;CAEpB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiC1E"}
|
package/dist/resolver.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
|
-
import { chmodSync, copyFileSync, existsSync, mkdirSync, renameSync, unlinkSync } from "node:fs";
|
|
2
|
+
import { chmodSync, closeSync, copyFileSync, existsSync, mkdirSync, openSync, readSync, renameSync, unlinkSync, } from "node:fs";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
4
|
import { homedir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
@@ -107,6 +107,62 @@ function parsePathLookupOutput(output) {
|
|
|
107
107
|
.map((candidate) => candidate.trim())
|
|
108
108
|
.filter(Boolean);
|
|
109
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* True when `binaryPath` begins with a recognized native-executable magic
|
|
112
|
+
* number (Mach-O, ELF, or PE/`MZ`). False for script shims that start with a
|
|
113
|
+
* shebang (`#!`) or anything else.
|
|
114
|
+
*
|
|
115
|
+
* This is the guard against a `which aft` / `where aft` PATH lookup resolving to
|
|
116
|
+
* the `@cortexkit/aft` CLI's OWN node-script shim. The CLI publishes a `bin`
|
|
117
|
+
* named `aft` (same name as the native binary), and npx prepends its
|
|
118
|
+
* `node_modules/.bin` to PATH, so `which aft` can resolve to that shim. Probing
|
|
119
|
+
* it with `--version` re-enters the CLI, which probes `which aft` again, which
|
|
120
|
+
* forks `opencode --version` / `pi --version` for its harness report — an
|
|
121
|
+
* exponential fork bomb (issue: self-resolution recursion). Native binaries
|
|
122
|
+
* never start with `#!`, so a magic-number check rejects the shim regardless of
|
|
123
|
+
* where it lives (npx cache, global `npm i -g`, etc.).
|
|
124
|
+
*/
|
|
125
|
+
export function isNativeExecutable(binaryPath) {
|
|
126
|
+
let fd = null;
|
|
127
|
+
try {
|
|
128
|
+
fd = openSync(binaryPath, "r");
|
|
129
|
+
const buf = Buffer.alloc(4);
|
|
130
|
+
const read = readSync(fd, buf, 0, 4, 0);
|
|
131
|
+
if (read < 2)
|
|
132
|
+
return false;
|
|
133
|
+
const b0 = buf[0];
|
|
134
|
+
const b1 = buf[1];
|
|
135
|
+
// Shebang script shim (`#!`) — the recursion vector. Reject outright.
|
|
136
|
+
if (b0 === 0x23 && b1 === 0x21)
|
|
137
|
+
return false;
|
|
138
|
+
const m32 = buf.readUInt32BE(0);
|
|
139
|
+
// Mach-O: feedface/feedfacf (BE) + cefaedfe/cffaedfe (LE) + cafebabe (fat).
|
|
140
|
+
const machO = new Set([0xfeedface, 0xfeedfacf, 0xcefaedfe, 0xcffaedfe, 0xcafebabe]);
|
|
141
|
+
if (read >= 4 && machO.has(m32))
|
|
142
|
+
return true;
|
|
143
|
+
// ELF: 0x7f 'E' 'L' 'F'.
|
|
144
|
+
if (read >= 4 && m32 === 0x7f454c46)
|
|
145
|
+
return true;
|
|
146
|
+
// PE (Windows .exe): 'MZ'.
|
|
147
|
+
if (b0 === 0x4d && b1 === 0x5a)
|
|
148
|
+
return true;
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// If we can't read it, don't trust it as a native binary.
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
if (fd !== null) {
|
|
157
|
+
try {
|
|
158
|
+
closeSync(fd);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// best-effort
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
110
166
|
/**
|
|
111
167
|
* Map the current `process.platform` and `process.arch` to the npm platform
|
|
112
168
|
* package suffix (e.g. `"darwin-arm64"`, `"linux-x64"`).
|
|
@@ -205,6 +261,14 @@ export function findBinarySync(expectedVersion) {
|
|
|
205
261
|
stdio: ["pipe", "pipe", "pipe"],
|
|
206
262
|
}).trim();
|
|
207
263
|
for (const candidate of parsePathLookupOutput(result)) {
|
|
264
|
+
// Guard against self-resolution: a `which aft` hit can be the
|
|
265
|
+
// @cortexkit/aft CLI's own node-script shim (npx prepends its
|
|
266
|
+
// node_modules/.bin to PATH). Probing it with --version re-enters the CLI
|
|
267
|
+
// and fork-bombs. Only accept native executables here.
|
|
268
|
+
if (!isNativeExecutable(candidate)) {
|
|
269
|
+
warn(`PATH binary at ${candidate} is not a native executable (script shim?); skipping`);
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
208
272
|
const usable = probeBinaryCandidate(candidate, "PATH", expectedVersion);
|
|
209
273
|
if (usable)
|
|
210
274
|
return usable;
|
package/dist/resolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED