@opencodehub/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +85 -0
  3. package/dist/agent-context.d.ts +54 -0
  4. package/dist/agent-context.d.ts.map +1 -0
  5. package/dist/agent-context.js +122 -0
  6. package/dist/agent-context.js.map +1 -0
  7. package/dist/cobol-proleap-setup.d.ts +77 -0
  8. package/dist/cobol-proleap-setup.d.ts.map +1 -0
  9. package/dist/cobol-proleap-setup.js +289 -0
  10. package/dist/cobol-proleap-setup.js.map +1 -0
  11. package/dist/commands/analyze.d.ts +234 -0
  12. package/dist/commands/analyze.d.ts.map +1 -0
  13. package/dist/commands/analyze.js +1096 -0
  14. package/dist/commands/analyze.js.map +1 -0
  15. package/dist/commands/augment.d.ts +48 -0
  16. package/dist/commands/augment.d.ts.map +1 -0
  17. package/dist/commands/augment.js +249 -0
  18. package/dist/commands/augment.js.map +1 -0
  19. package/dist/commands/baseline.d.ts +68 -0
  20. package/dist/commands/baseline.d.ts.map +1 -0
  21. package/dist/commands/baseline.js +110 -0
  22. package/dist/commands/baseline.js.map +1 -0
  23. package/dist/commands/bench.d.ts +54 -0
  24. package/dist/commands/bench.d.ts.map +1 -0
  25. package/dist/commands/bench.js +283 -0
  26. package/dist/commands/bench.js.map +1 -0
  27. package/dist/commands/ci-init.d.ts +37 -0
  28. package/dist/commands/ci-init.d.ts.map +1 -0
  29. package/dist/commands/ci-init.js +115 -0
  30. package/dist/commands/ci-init.js.map +1 -0
  31. package/dist/commands/clean.d.ts +13 -0
  32. package/dist/commands/clean.d.ts.map +1 -0
  33. package/dist/commands/clean.js +38 -0
  34. package/dist/commands/clean.js.map +1 -0
  35. package/dist/commands/code-pack.d.ts +105 -0
  36. package/dist/commands/code-pack.d.ts.map +1 -0
  37. package/dist/commands/code-pack.js +187 -0
  38. package/dist/commands/code-pack.js.map +1 -0
  39. package/dist/commands/context.d.ts +30 -0
  40. package/dist/commands/context.d.ts.map +1 -0
  41. package/dist/commands/context.js +237 -0
  42. package/dist/commands/context.js.map +1 -0
  43. package/dist/commands/detect-changes.d.ts +26 -0
  44. package/dist/commands/detect-changes.d.ts.map +1 -0
  45. package/dist/commands/detect-changes.js +73 -0
  46. package/dist/commands/detect-changes.js.map +1 -0
  47. package/dist/commands/doctor.d.ts +52 -0
  48. package/dist/commands/doctor.d.ts.map +1 -0
  49. package/dist/commands/doctor.js +472 -0
  50. package/dist/commands/doctor.js.map +1 -0
  51. package/dist/commands/find-enclosing-symbol.d.ts +67 -0
  52. package/dist/commands/find-enclosing-symbol.d.ts.map +1 -0
  53. package/dist/commands/find-enclosing-symbol.js +106 -0
  54. package/dist/commands/find-enclosing-symbol.js.map +1 -0
  55. package/dist/commands/group.d.ts +123 -0
  56. package/dist/commands/group.d.ts.map +1 -0
  57. package/dist/commands/group.js +448 -0
  58. package/dist/commands/group.js.map +1 -0
  59. package/dist/commands/impact.d.ts +23 -0
  60. package/dist/commands/impact.d.ts.map +1 -0
  61. package/dist/commands/impact.js +91 -0
  62. package/dist/commands/impact.js.map +1 -0
  63. package/dist/commands/index-repo.d.ts +39 -0
  64. package/dist/commands/index-repo.d.ts.map +1 -0
  65. package/dist/commands/index-repo.js +148 -0
  66. package/dist/commands/index-repo.js.map +1 -0
  67. package/dist/commands/ingest-sarif.d.ts +64 -0
  68. package/dist/commands/ingest-sarif.d.ts.map +1 -0
  69. package/dist/commands/ingest-sarif.js +381 -0
  70. package/dist/commands/ingest-sarif.js.map +1 -0
  71. package/dist/commands/init.d.ts +75 -0
  72. package/dist/commands/init.d.ts.map +1 -0
  73. package/dist/commands/init.js +315 -0
  74. package/dist/commands/init.js.map +1 -0
  75. package/dist/commands/list.d.ts +17 -0
  76. package/dist/commands/list.d.ts.map +1 -0
  77. package/dist/commands/list.js +79 -0
  78. package/dist/commands/list.js.map +1 -0
  79. package/dist/commands/mcp.d.ts +8 -0
  80. package/dist/commands/mcp.d.ts.map +1 -0
  81. package/dist/commands/mcp.js +28 -0
  82. package/dist/commands/mcp.js.map +1 -0
  83. package/dist/commands/open-store.d.ts +25 -0
  84. package/dist/commands/open-store.d.ts.map +1 -0
  85. package/dist/commands/open-store.js +47 -0
  86. package/dist/commands/open-store.js.map +1 -0
  87. package/dist/commands/pack.d.ts +35 -0
  88. package/dist/commands/pack.d.ts.map +1 -0
  89. package/dist/commands/pack.js +83 -0
  90. package/dist/commands/pack.js.map +1 -0
  91. package/dist/commands/query.d.ts +85 -0
  92. package/dist/commands/query.d.ts.map +1 -0
  93. package/dist/commands/query.js +309 -0
  94. package/dist/commands/query.js.map +1 -0
  95. package/dist/commands/scan.d.ts +81 -0
  96. package/dist/commands/scan.d.ts.map +1 -0
  97. package/dist/commands/scan.js +407 -0
  98. package/dist/commands/scan.js.map +1 -0
  99. package/dist/commands/setup.d.ts +178 -0
  100. package/dist/commands/setup.d.ts.map +1 -0
  101. package/dist/commands/setup.js +370 -0
  102. package/dist/commands/setup.js.map +1 -0
  103. package/dist/commands/sql.d.ts +19 -0
  104. package/dist/commands/sql.d.ts.map +1 -0
  105. package/dist/commands/sql.js +51 -0
  106. package/dist/commands/sql.js.map +1 -0
  107. package/dist/commands/status.d.ts +13 -0
  108. package/dist/commands/status.d.ts.map +1 -0
  109. package/dist/commands/status.js +66 -0
  110. package/dist/commands/status.js.map +1 -0
  111. package/dist/commands/verdict-render.d.ts +33 -0
  112. package/dist/commands/verdict-render.d.ts.map +1 -0
  113. package/dist/commands/verdict-render.js +123 -0
  114. package/dist/commands/verdict-render.js.map +1 -0
  115. package/dist/commands/verdict.d.ts +61 -0
  116. package/dist/commands/verdict.d.ts.map +1 -0
  117. package/dist/commands/verdict.js +146 -0
  118. package/dist/commands/verdict.js.map +1 -0
  119. package/dist/commands/wiki.d.ts +26 -0
  120. package/dist/commands/wiki.d.ts.map +1 -0
  121. package/dist/commands/wiki.js +74 -0
  122. package/dist/commands/wiki.js.map +1 -0
  123. package/dist/editors/claude-code.d.ts +23 -0
  124. package/dist/editors/claude-code.d.ts.map +1 -0
  125. package/dist/editors/claude-code.js +58 -0
  126. package/dist/editors/claude-code.js.map +1 -0
  127. package/dist/editors/codex.d.ts +22 -0
  128. package/dist/editors/codex.d.ts.map +1 -0
  129. package/dist/editors/codex.js +59 -0
  130. package/dist/editors/codex.js.map +1 -0
  131. package/dist/editors/cursor.d.ts +13 -0
  132. package/dist/editors/cursor.d.ts.map +1 -0
  133. package/dist/editors/cursor.js +21 -0
  134. package/dist/editors/cursor.js.map +1 -0
  135. package/dist/editors/index.d.ts +12 -0
  136. package/dist/editors/index.d.ts.map +1 -0
  137. package/dist/editors/index.js +11 -0
  138. package/dist/editors/index.js.map +1 -0
  139. package/dist/editors/opencode.d.ts +23 -0
  140. package/dist/editors/opencode.d.ts.map +1 -0
  141. package/dist/editors/opencode.js +61 -0
  142. package/dist/editors/opencode.js.map +1 -0
  143. package/dist/editors/types.d.ts +33 -0
  144. package/dist/editors/types.d.ts.map +1 -0
  145. package/dist/editors/types.js +19 -0
  146. package/dist/editors/types.js.map +1 -0
  147. package/dist/editors/windows-wrap.d.ts +19 -0
  148. package/dist/editors/windows-wrap.d.ts.map +1 -0
  149. package/dist/editors/windows-wrap.js +28 -0
  150. package/dist/editors/windows-wrap.js.map +1 -0
  151. package/dist/editors/windsurf.d.ts +12 -0
  152. package/dist/editors/windsurf.d.ts.map +1 -0
  153. package/dist/editors/windsurf.js +21 -0
  154. package/dist/editors/windsurf.js.map +1 -0
  155. package/dist/embedder-downloader.d.ts +87 -0
  156. package/dist/embedder-downloader.d.ts.map +1 -0
  157. package/dist/embedder-downloader.js +261 -0
  158. package/dist/embedder-downloader.js.map +1 -0
  159. package/dist/fs-atomic.d.ts +22 -0
  160. package/dist/fs-atomic.d.ts.map +1 -0
  161. package/dist/fs-atomic.js +28 -0
  162. package/dist/fs-atomic.js.map +1 -0
  163. package/dist/groups.d.ts +64 -0
  164. package/dist/groups.d.ts.map +1 -0
  165. package/dist/groups.js +172 -0
  166. package/dist/groups.js.map +1 -0
  167. package/dist/index.d.ts +11 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +703 -0
  170. package/dist/index.js.map +1 -0
  171. package/dist/lib/is-indexed.d.ts +20 -0
  172. package/dist/lib/is-indexed.d.ts.map +1 -0
  173. package/dist/lib/is-indexed.js +35 -0
  174. package/dist/lib/is-indexed.js.map +1 -0
  175. package/dist/registry.d.ts +64 -0
  176. package/dist/registry.d.ts.map +1 -0
  177. package/dist/registry.js +145 -0
  178. package/dist/registry.js.map +1 -0
  179. package/dist/scip-downloader.d.ts +138 -0
  180. package/dist/scip-downloader.d.ts.map +1 -0
  181. package/dist/scip-downloader.js +372 -0
  182. package/dist/scip-downloader.js.map +1 -0
  183. package/dist/scip-pins.d.ts +99 -0
  184. package/dist/scip-pins.d.ts.map +1 -0
  185. package/dist/scip-pins.js +195 -0
  186. package/dist/scip-pins.js.map +1 -0
  187. package/dist/skills-gen.d.ts +47 -0
  188. package/dist/skills-gen.d.ts.map +1 -0
  189. package/dist/skills-gen.js +292 -0
  190. package/dist/skills-gen.js.map +1 -0
  191. package/package.json +81 -0
@@ -0,0 +1,372 @@
1
+ /**
2
+ * SHA256-pinned downloader for external SCIP adapter binaries.
3
+ *
4
+ * Mirrors the shape of `embedder-downloader.ts` but is scoped per-tool rather
5
+ * than per-variant. Each call installs one tool into `~/.codehub/bin/`:
6
+ *
7
+ * 1. Detect the running platform (`process.platform` + `process.arch`).
8
+ * Unsupported combinations throw a clear "unsupported platform" error.
9
+ * 2. Resolve the per-platform pin from `SCIP_PINS`.
10
+ * 3. If the target path already exists and its SHA256 matches the pin, skip.
11
+ * 4. Otherwise stream-download to `<target>.tmp`, hash during write, verify,
12
+ * `chmod +x`, and atomic-rename into place.
13
+ *
14
+ * `scip-dotnet` is a special case: upstream does NOT ship a self-contained
15
+ * binary — it is installed via `dotnet tool install --global scip-dotnet` and
16
+ * needs .NET SDK 8+. The downloader probes `dotnet --version` first; if the
17
+ * SDK is missing or too old, it surfaces the specific install hint instead of
18
+ * attempting a binary download.
19
+ *
20
+ * Concurrency: concurrent calls for the same tool on the same process are
21
+ * serialized via an in-memory promise map keyed by `(tool, destDir)`. This
22
+ * avoids two parallel `installScipTool("clang")` invocations each writing the
23
+ * same `<target>.tmp` and corrupting each other's output. Cross-process
24
+ * concurrent setup is out of scope — the atomic-rename still means no half-
25
+ * written binary ever appears at the final path.
26
+ *
27
+ * Placeholder SHA256 handling: some pins ship with all-zero placeholder
28
+ * hashes in `scip-pins.ts`. We refuse to verify against placeholder hashes
29
+ * at runtime. Each adapter's first-install smoke test passes
30
+ * `allowPlaceholder: true` so it can compute the real hash and substitute
31
+ * it back into the pin file.
32
+ */
33
+ import { execFile as execFileCb } from "node:child_process";
34
+ import { createHash } from "node:crypto";
35
+ import { createReadStream, createWriteStream } from "node:fs";
36
+ import { chmod, mkdir, rename, stat, unlink } from "node:fs/promises";
37
+ import { homedir } from "node:os";
38
+ import { dirname, join } from "node:path";
39
+ import { Readable, Writable } from "node:stream";
40
+ import { pipeline as streamPipeline } from "node:stream/promises";
41
+ import { promisify } from "node:util";
42
+ import { SCIP_PINS, SCIP_TOOL_ORDER, } from "./scip-pins.js";
43
+ export { isScipTool, SCIP_PINS, SCIP_TOOL_ORDER } from "./scip-pins.js";
44
+ const execFile = promisify(execFileCb);
45
+ /**
46
+ * Thrown when a downloaded file's SHA256 doesn't match the pinned value.
47
+ * The temp file is deleted before this throws so partial payloads never
48
+ * linger on disk.
49
+ */
50
+ export class ScipSha256MismatchError extends Error {
51
+ code = "SCIP_SHA256_MISMATCH";
52
+ tool;
53
+ expected;
54
+ actual;
55
+ constructor(tool, expected, actual) {
56
+ super(`SHA256 mismatch for scip-${tool}: expected ${expected}, got ${actual}`);
57
+ this.name = "ScipSha256MismatchError";
58
+ this.tool = tool;
59
+ this.expected = expected;
60
+ this.actual = actual;
61
+ }
62
+ }
63
+ /** Thrown for all non-hash download failures (404, network, etc.). */
64
+ export class ScipDownloadError extends Error {
65
+ code = "SCIP_DOWNLOAD_FAILED";
66
+ url;
67
+ constructor(url, message, options) {
68
+ super(`Download failed for ${url}: ${message}`, options);
69
+ this.name = "ScipDownloadError";
70
+ this.url = url;
71
+ }
72
+ }
73
+ /** Thrown when the current platform is not covered by a pin. */
74
+ export class UnsupportedPlatformError extends Error {
75
+ code = "SCIP_UNSUPPORTED_PLATFORM";
76
+ os;
77
+ arch;
78
+ constructor(os, arch, toolHint) {
79
+ super(`Unsupported platform for ${toolHint ?? "scip tool"}: ${os}-${arch}. ` +
80
+ `Supported: linux-x64, linux-arm64, darwin-x64, darwin-arm64.`);
81
+ this.name = "UnsupportedPlatformError";
82
+ this.os = os;
83
+ this.arch = arch;
84
+ }
85
+ }
86
+ /** Thrown when a pin still has placeholder SHA256 digests. */
87
+ export class PlaceholderHashError extends Error {
88
+ code = "SCIP_PLACEHOLDER_HASH";
89
+ tool;
90
+ constructor(tool) {
91
+ super(`scip-${tool} pin still carries placeholder SHA256 digests. ` +
92
+ `The real hash is computed at adapter first-install time. ` +
93
+ `Pass allowPlaceholder: true from a smoke test, or wait for the adapter to land.`);
94
+ this.name = "PlaceholderHashError";
95
+ this.tool = tool;
96
+ }
97
+ }
98
+ /** Thrown when `scip-dotnet` requires `dotnet` SDK >= N and it is missing or older. */
99
+ export class DotnetSdkMissingError extends Error {
100
+ code = "SCIP_DOTNET_SDK_MISSING";
101
+ minMajor;
102
+ detectedVersion;
103
+ constructor(minMajor, detectedVersion) {
104
+ const detected = detectedVersion === undefined
105
+ ? "dotnet is not on PATH"
106
+ : `detected dotnet --version: ${detectedVersion}`;
107
+ super(`scip-dotnet requires .NET SDK ${minMajor}.0+ on PATH (${detected}). ` +
108
+ `Install from https://dotnet.microsoft.com/download, then retry ` +
109
+ `\`codehub setup --scip=dotnet\` (which runs ` +
110
+ `\`dotnet tool install --global scip-dotnet\`).`);
111
+ this.name = "DotnetSdkMissingError";
112
+ this.minMajor = minMajor;
113
+ this.detectedVersion = detectedVersion;
114
+ }
115
+ }
116
+ /**
117
+ * Detect the running platform. Normalizes `process.arch` values into the
118
+ * `x64` / `arm64` discriminator the pin file uses.
119
+ */
120
+ export function detectPlatform(platform = process.platform, arch = process.arch) {
121
+ let normalizedArch;
122
+ if (arch === "x64") {
123
+ normalizedArch = "x64";
124
+ }
125
+ else if (arch === "arm64") {
126
+ normalizedArch = "arm64";
127
+ }
128
+ else {
129
+ throw new UnsupportedPlatformError(platform, arch);
130
+ }
131
+ if (platform === "linux") {
132
+ return { os: "linux", arch: normalizedArch };
133
+ }
134
+ if (platform === "darwin") {
135
+ return { os: "darwin", arch: normalizedArch };
136
+ }
137
+ throw new UnsupportedPlatformError(platform, arch);
138
+ }
139
+ /** Resolve the default install dir: `~/.codehub/bin`. */
140
+ export function defaultScipBinDir(home = homedir()) {
141
+ return join(home, ".codehub", "bin");
142
+ }
143
+ /**
144
+ * Default `dotnet --version` probe. Returns the version string on success or
145
+ * undefined when the binary isn't on PATH / fails to execute.
146
+ */
147
+ const defaultDotnetProbe = async () => {
148
+ try {
149
+ const { stdout } = await execFile("dotnet", ["--version"], { timeout: 5000 });
150
+ return stdout.trim();
151
+ }
152
+ catch {
153
+ return undefined;
154
+ }
155
+ };
156
+ /** Parse `dotnet --version` output and extract the major version number. */
157
+ function parseDotnetMajor(version) {
158
+ if (version === undefined)
159
+ return undefined;
160
+ const match = version.match(/^(\d+)\./);
161
+ if (match === null)
162
+ return undefined;
163
+ const parsed = Number.parseInt(match[1] ?? "", 10);
164
+ return Number.isFinite(parsed) ? parsed : undefined;
165
+ }
166
+ /** Lookup the platform-specific pin for a tool. Throws on unsupported combos. */
167
+ function resolvePlatformPin(pin, platform) {
168
+ const hit = pin.platforms.find((p) => p.os === platform.os && p.arch === platform.arch);
169
+ if (hit === undefined) {
170
+ throw new UnsupportedPlatformError(platform.os, platform.arch, `scip-${pin.tool}`);
171
+ }
172
+ if (hit.platformUnavailable === true) {
173
+ throw new UnsupportedPlatformError(platform.os, platform.arch, `scip-${pin.tool} v${pin.version} (upstream does not ship a release asset for this platform)`);
174
+ }
175
+ return hit;
176
+ }
177
+ /**
178
+ * Hash an existing file in streaming fashion. Returns `undefined` if the file
179
+ * does not exist — callers use that as the "not yet downloaded" signal.
180
+ */
181
+ async function hashFileIfExists(path) {
182
+ try {
183
+ await stat(path);
184
+ }
185
+ catch {
186
+ return undefined;
187
+ }
188
+ const hasher = createHash("sha256");
189
+ const rs = createReadStream(path);
190
+ await streamPipeline(rs, new Writable({
191
+ write(chunk, _enc, cb) {
192
+ hasher.update(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));
193
+ cb();
194
+ },
195
+ }));
196
+ return hasher.digest("hex");
197
+ }
198
+ /**
199
+ * Stream one binary to disk: hash-as-we-write, verify, chmod +x, atomic
200
+ * rename. Does NOT retry — the embedder downloader's retry ladder is
201
+ * overkill for a single-binary install; a failed download surfaces directly.
202
+ */
203
+ async function downloadBinary(tool, platformPin, targetPath, fetchImpl) {
204
+ const tmpPath = `${targetPath}.tmp`;
205
+ try {
206
+ await unlink(tmpPath);
207
+ }
208
+ catch {
209
+ // Doesn't exist — fine.
210
+ }
211
+ let res;
212
+ try {
213
+ res = await fetchImpl(platformPin.url, { redirect: "follow" });
214
+ }
215
+ catch (err) {
216
+ throw new ScipDownloadError(platformPin.url, err instanceof Error ? err.message : String(err), err instanceof Error ? { cause: err } : undefined);
217
+ }
218
+ if (!res.ok) {
219
+ throw new ScipDownloadError(platformPin.url, `HTTP ${res.status} ${res.statusText}`);
220
+ }
221
+ if (res.body === null) {
222
+ throw new ScipDownloadError(platformPin.url, "response body is null");
223
+ }
224
+ const hasher = createHash("sha256");
225
+ let bytesWritten = 0;
226
+ const writeStream = createWriteStream(tmpPath);
227
+ const bodyAsNode = Readable.fromWeb(res.body);
228
+ try {
229
+ await streamPipeline(bodyAsNode, new Writable({
230
+ write(chunk, _enc, cb) {
231
+ const view = new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);
232
+ hasher.update(view);
233
+ bytesWritten += chunk.byteLength;
234
+ if (!writeStream.write(chunk)) {
235
+ writeStream.once("drain", () => cb());
236
+ }
237
+ else {
238
+ cb();
239
+ }
240
+ },
241
+ final(cb) {
242
+ writeStream.end(() => cb());
243
+ },
244
+ }));
245
+ }
246
+ catch (err) {
247
+ try {
248
+ await unlink(tmpPath);
249
+ }
250
+ catch {
251
+ // Nothing to do.
252
+ }
253
+ throw new ScipDownloadError(platformPin.url, err instanceof Error ? err.message : String(err), err instanceof Error ? { cause: err } : undefined);
254
+ }
255
+ const actual = hasher.digest("hex");
256
+ if (actual !== platformPin.sha256) {
257
+ try {
258
+ await unlink(tmpPath);
259
+ }
260
+ catch {
261
+ // Nothing to do.
262
+ }
263
+ throw new ScipSha256MismatchError(tool, platformPin.sha256, actual);
264
+ }
265
+ // 0o755 — owner rwx, everyone rx. Matches what a release tarball extraction
266
+ // would produce.
267
+ await chmod(tmpPath, 0o755);
268
+ await rename(tmpPath, targetPath);
269
+ return bytesWritten;
270
+ }
271
+ /**
272
+ * In-memory guard against concurrent installs of the same tool in the same
273
+ * process. Keyed by `${tool}:${destDir}` so parallel tests with distinct
274
+ * temp dirs don't serialize against each other.
275
+ */
276
+ const inFlight = new Map();
277
+ /**
278
+ * Install one SCIP tool. Returns immediately with `skipped: true` when the
279
+ * on-disk binary already matches the pin; downloads otherwise.
280
+ */
281
+ export async function installScipTool(tool, opts = {}) {
282
+ const destDir = opts.destDir ?? defaultScipBinDir();
283
+ const key = `${tool}:${destDir}`;
284
+ const existing = inFlight.get(key);
285
+ if (existing !== undefined) {
286
+ return existing;
287
+ }
288
+ const task = installScipToolInner(tool, destDir, opts).finally(() => {
289
+ inFlight.delete(key);
290
+ });
291
+ inFlight.set(key, task);
292
+ return task;
293
+ }
294
+ async function installScipToolInner(tool, destDir, opts) {
295
+ const pin = SCIP_PINS[tool];
296
+ const log = opts.log ?? (() => undefined);
297
+ if (pin.installerKind === "dotnet-tool") {
298
+ const probe = opts.dotnetProbe ?? defaultDotnetProbe;
299
+ const version = await probe();
300
+ const major = parseDotnetMajor(version);
301
+ const minMajor = pin.minDotnetMajor ?? 8;
302
+ if (major === undefined || major < minMajor) {
303
+ throw new DotnetSdkMissingError(minMajor, version);
304
+ }
305
+ // We do NOT actually run `dotnet tool install` here — that is a
306
+ // side-effectful system install the user should run explicitly. We
307
+ // return the hint string so the setup command can print it.
308
+ const hint = `dotnet tool install --global scip-${tool}`;
309
+ log(`codehub setup --scip=${tool}: SDK ${major} detected; run \`${hint}\` to install`);
310
+ return {
311
+ tool,
312
+ installed: false,
313
+ skipped: true,
314
+ version: pin.version,
315
+ path: hint,
316
+ dotnetToolHint: hint,
317
+ };
318
+ }
319
+ if (pin.placeholder && opts.allowPlaceholder !== true) {
320
+ throw new PlaceholderHashError(tool);
321
+ }
322
+ const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
323
+ if (typeof fetchImpl !== "function") {
324
+ throw new Error("Global fetch is not available. Node >= 18 required; supply opts.fetchImpl otherwise.");
325
+ }
326
+ const platform = opts.platform ?? detectPlatform();
327
+ const platformPin = resolvePlatformPin(pin, platform);
328
+ const targetPath = join(destDir, pin.binName);
329
+ await mkdir(dirname(targetPath), { recursive: true });
330
+ if (opts.force !== true) {
331
+ const existingHash = await hashFileIfExists(targetPath);
332
+ if (existingHash !== undefined && existingHash === platformPin.sha256) {
333
+ log(`codehub setup --scip=${tool}: already installed at ${targetPath} (version ${pin.version})`);
334
+ return {
335
+ tool,
336
+ installed: false,
337
+ skipped: true,
338
+ version: pin.version,
339
+ path: targetPath,
340
+ };
341
+ }
342
+ }
343
+ log(`codehub setup --scip=${tool}: downloading ${platformPin.url}`);
344
+ const bytes = await downloadBinary(tool, platformPin, targetPath, fetchImpl);
345
+ log(`codehub setup --scip=${tool}: installed ${bytes} bytes → ${targetPath}`);
346
+ return {
347
+ tool,
348
+ installed: true,
349
+ skipped: false,
350
+ version: pin.version,
351
+ path: targetPath,
352
+ };
353
+ }
354
+ /**
355
+ * Install every known SCIP tool in declaration order. Collects successes and
356
+ * failures without short-circuiting — `scip-dotnet` missing `dotnet` on PATH
357
+ * must not prevent the clang/ruby/kotlin installs from running. Returns the
358
+ * per-tool result array; caller decides how to surface errors.
359
+ */
360
+ export async function installAllScipTools(opts = {}) {
361
+ const results = [];
362
+ for (const tool of SCIP_TOOL_ORDER) {
363
+ try {
364
+ results.push(await installScipTool(tool, opts));
365
+ }
366
+ catch (err) {
367
+ results.push({ tool, error: err instanceof Error ? err : new Error(String(err)) });
368
+ }
369
+ }
370
+ return results;
371
+ }
372
+ //# sourceMappingURL=scip-downloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scip-downloader.js","sourceRoot":"","sources":["../src/scip-downloader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Pinned external SCIP adapter binaries.
3
+ *
4
+ * This is the single source of truth for every downloadable SCIP indexer we
5
+ * ship via `codehub setup --scip=<tool>`. Each entry carries:
6
+ *
7
+ * - `tool`: the indexer family.
8
+ * - `version`: upstream release tag (no `v` prefix).
9
+ * - `platforms[]`: per-platform download metadata. Each lists the target
10
+ * `{os, arch}`, the direct release URL, the expected SHA256
11
+ * digest, and (optionally) the binary's executable name on
12
+ * disk.
13
+ *
14
+ * Some pins ship PLACEHOLDER SHA256 hashes (64 zeros) for standalone
15
+ * binaries until each adapter's first-install smoke test computes and
16
+ * substitutes the real digest against the upstream release asset. The
17
+ * `placeholder: true` flag is the canonical "do NOT trust this hash at
18
+ * runtime" marker — `installScipTool()` refuses to run when the selected pin
19
+ * has `placeholder: true` unless the caller sets `opts.allowPlaceholder`
20
+ * (reserved for adapter first-install smoke tests).
21
+ *
22
+ * `scip-kotlin` ships a real SHA256 computed against Maven Central: upstream
23
+ * publishes the plugin as a Maven Central JAR
24
+ * (`com.sourcegraph:semanticdb-kotlinc:0.6.0`) whose SHA256 is stable and
25
+ * publicly verifiable — no first-install smoke test needed.
26
+ *
27
+ * `scip-dotnet` is the odd one out: upstream does NOT ship a self-contained
28
+ * release binary, so its install path goes through
29
+ * `dotnet tool install --global scip-dotnet`. Its entry therefore carries an
30
+ * empty `platforms` array and a sentinel `installerKind: "dotnet-tool"`. The
31
+ * downloader dispatches on that kind and skips the fetch/verify path entirely.
32
+ */
33
+ /** Platform = `${os}-${arch}`. Matches what we read from `process.platform` + `process.arch`. */
34
+ export type ScipOs = "linux" | "darwin";
35
+ export type ScipArch = "x64" | "arm64";
36
+ /** The four binary-backed SCIP tools plus the .NET tool-sourced adapter. */
37
+ export type ScipTool = "clang" | "ruby" | "dotnet" | "kotlin";
38
+ /** Per-platform download descriptor. */
39
+ export interface ScipPlatformPin {
40
+ readonly os: ScipOs;
41
+ readonly arch: ScipArch;
42
+ readonly url: string;
43
+ /** Hex-encoded SHA256 (64 chars). PLACEHOLDER when `placeholder` is true. */
44
+ readonly sha256: string;
45
+ /**
46
+ * Optional: name of the archive entry that contains the binary. When absent
47
+ * the downloader treats the URL's payload as the binary itself.
48
+ *
49
+ * We currently download raw binaries (the Sourcegraph release artifacts are
50
+ * standalone executables), so this stays undefined for now. Reserved for
51
+ * future tools that publish tarballs or zips.
52
+ */
53
+ readonly archiveEntry?: string;
54
+ /**
55
+ * True when upstream does NOT publish a release asset for this `{os, arch}`
56
+ * pair. The entry is retained so the pin documents the gap explicitly
57
+ * (vs. silently omitting the row, which would leave callers guessing).
58
+ * The downloader refuses to install against an unavailable platform and
59
+ * surfaces a specific "upstream does not ship this platform" error. The
60
+ * `sha256` and `url` stay for traceability but must never be fetched.
61
+ */
62
+ readonly platformUnavailable?: boolean;
63
+ }
64
+ /** Canonical pin shape shared by every tool. */
65
+ export interface ScipToolPin {
66
+ readonly tool: ScipTool;
67
+ readonly version: string;
68
+ /** How the installer should source the binary. */
69
+ readonly installerKind: "download" | "dotnet-tool";
70
+ /**
71
+ * True while the per-platform SHA256 digests are placeholders (all zeros).
72
+ * Downloader refuses to verify against placeholder hashes unless the caller
73
+ * opts in with `allowPlaceholder: true` (used by the first-install smoke
74
+ * test in each adapter PR).
75
+ */
76
+ readonly placeholder: boolean;
77
+ /**
78
+ * Platforms covered by this tool. Empty for `installerKind === "dotnet-tool"`.
79
+ */
80
+ readonly platforms: readonly ScipPlatformPin[];
81
+ /**
82
+ * Name the binary is installed under inside `~/.codehub/bin/`. Usually
83
+ * `scip-<tool>`. Set explicitly so each pin is self-describing.
84
+ */
85
+ readonly binName: string;
86
+ /**
87
+ * `dotnet tool install --global scip-dotnet` runtime requirement — minimum
88
+ * .NET SDK major version (probed via `dotnet --version`). Only consulted
89
+ * when `installerKind === "dotnet-tool"`.
90
+ */
91
+ readonly minDotnetMajor?: number;
92
+ }
93
+ /** Single source of truth. Keep insertion order stable for `--scip=all`. */
94
+ export declare const SCIP_PINS: Readonly<Record<ScipTool, ScipToolPin>>;
95
+ /** Ordered list used by `--scip=all`. */
96
+ export declare const SCIP_TOOL_ORDER: readonly ScipTool[];
97
+ /** True when `value` is a known SCIP tool name. Used to validate CLI input. */
98
+ export declare function isScipTool(value: string): value is ScipTool;
99
+ //# sourceMappingURL=scip-pins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scip-pins.d.ts","sourceRoot":"","sources":["../src/scip-pins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,iGAAiG;AACjG,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AACxC,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;AAEvC,4EAA4E;AAC5E,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9D,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAClD,QAAQ,CAAC,aAAa,EAAE,UAAU,GAAG,aAAa,CAAC;IACnD;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AA8JD,4EAA4E;AAC5E,eAAO,MAAM,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAK7D,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,eAAe,EAAE,SAAS,QAAQ,EAA0C,CAAC;AAE1F,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D"}