@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,370 @@
1
+ /**
2
+ * `codehub setup` — detects installed editors and writes an MCP server entry
3
+ * for `codehub` into each one's config file.
4
+ *
5
+ * We deliberately do *not* probe each editor to confirm it is "installed" —
6
+ * writing to a config path is idempotent and safe, and a user can run setup
7
+ * before installing an editor. Instead we:
8
+ * 1. Determine the invocation (`codehub mcp`) with optional Windows wrap.
9
+ * 2. For each selected editor, read the existing config, back it up, and
10
+ * atomically write the merged version that adds or replaces the
11
+ * `codehub` entry.
12
+ *
13
+ * Filesystem access goes through the `FsApi` seam so tests can run against an
14
+ * in-memory implementation.
15
+ */
16
+ import { statSync } from "node:fs";
17
+ import { copyFile as fsCopyFile, mkdir as fsMkdir, readdir as fsReaddir, readFile as fsReadFile, rename as fsRename, rm as fsRm, stat as fsStat, } from "node:fs/promises";
18
+ import { homedir } from "node:os";
19
+ import { dirname, join, resolve } from "node:path";
20
+ import { fileURLToPath } from "node:url";
21
+ import { runSetupCobolProleap, } from "../cobol-proleap-setup.js";
22
+ import { ALL_EDITOR_IDS, createClaudeCodeWriter, createCodexWriter, createCursorWriter, createOpenCodeWriter, createWindsurfWriter, maybeWrapForWindows, } from "../editors/index.js";
23
+ import { downloadEmbedderWeights, } from "../embedder-downloader.js";
24
+ import { writeFileAtomic as defaultWriteFileAtomic } from "../fs-atomic.js";
25
+ import { installAllScipTools, installScipTool, isScipTool, SCIP_TOOL_ORDER, } from "../scip-downloader.js";
26
+ export { runSetupCobolProleap };
27
+ /** Default implementation that calls through to real `fs`. */
28
+ export const DEFAULT_FS = {
29
+ async readFile(path) {
30
+ return await fsReadFile(path, "utf8");
31
+ },
32
+ async writeFileAtomic(path, contents) {
33
+ await defaultWriteFileAtomic(path, contents, { raw: true });
34
+ },
35
+ async copyFile(src, dest) {
36
+ await fsCopyFile(src, dest);
37
+ },
38
+ async mkdir(path) {
39
+ await fsMkdir(path, { recursive: true });
40
+ },
41
+ async exists(path) {
42
+ try {
43
+ await fsStat(path);
44
+ return true;
45
+ }
46
+ catch (err) {
47
+ if (err.code === "ENOENT")
48
+ return false;
49
+ throw err;
50
+ }
51
+ },
52
+ async readdir(path) {
53
+ return await fsReaddir(path);
54
+ },
55
+ async rename(src, dest) {
56
+ await fsRename(src, dest);
57
+ },
58
+ async rm(path, opts) {
59
+ await fsRm(path, { recursive: opts?.recursive ?? false, force: opts?.force ?? false });
60
+ },
61
+ async statIsDirectory(path) {
62
+ const st = await fsStat(path);
63
+ return st.isDirectory();
64
+ },
65
+ };
66
+ /** Public entry point. Returns per-editor results for programmatic callers. */
67
+ export async function runSetup(opts = {}) {
68
+ const editors = opts.editors ?? ALL_EDITOR_IDS;
69
+ const fs = opts.fs ?? DEFAULT_FS;
70
+ const log = opts.log ?? ((msg) => console.warn(msg));
71
+ const warn = opts.warn ?? ((msg) => console.warn(msg));
72
+ const invocation = maybeWrapForWindows(opts.invocation ?? defaultInvocation(), opts.platform !== undefined ? { platform: opts.platform } : {});
73
+ const writers = editors.map((id) => buildWriter(id, opts));
74
+ const results = [];
75
+ for (const writer of writers) {
76
+ try {
77
+ const result = opts.undo
78
+ ? await undoSingle(writer, fs, log)
79
+ : await writeSingle(writer, invocation, fs, log);
80
+ results.push(result);
81
+ }
82
+ catch (err) {
83
+ const message = err.message;
84
+ warn(`codehub setup (${writer.id}): ${message}`);
85
+ results.push({
86
+ editor: writer.id,
87
+ configPath: writer.configPath,
88
+ action: "skipped",
89
+ });
90
+ }
91
+ }
92
+ return results;
93
+ }
94
+ function defaultInvocation() {
95
+ return { command: "codehub", args: ["mcp"], env: {} };
96
+ }
97
+ function buildWriter(id, opts) {
98
+ const projectRoot = opts.projectRoot ?? process.cwd();
99
+ const homeOpt = opts.home !== undefined ? { home: opts.home } : {};
100
+ switch (id) {
101
+ case "claude-code":
102
+ return createClaudeCodeWriter({ projectRoot });
103
+ case "cursor":
104
+ return createCursorWriter(homeOpt);
105
+ case "codex":
106
+ return createCodexWriter(homeOpt);
107
+ case "windsurf":
108
+ return createWindsurfWriter(homeOpt);
109
+ case "opencode":
110
+ return createOpenCodeWriter({ projectRoot });
111
+ }
112
+ }
113
+ async function writeSingle(writer, invocation, fs, log) {
114
+ const target = writer.configPath;
115
+ const parent = dirname(target);
116
+ await fs.mkdir(parent);
117
+ const existing = (await fs.exists(target)) ? await fs.readFile(target) : undefined;
118
+ const merged = writer.merge(existing, invocation);
119
+ // Record a backup on every overwrite. Fresh writes don't need a .bak.
120
+ let backupPath;
121
+ if (existing !== undefined) {
122
+ backupPath = `${target}.bak`;
123
+ await fs.copyFile(target, backupPath);
124
+ }
125
+ if (existing !== undefined && existing === merged) {
126
+ log(`codehub setup (${writer.id}): already up to date at ${target}`);
127
+ return {
128
+ editor: writer.id,
129
+ configPath: target,
130
+ action: "unchanged",
131
+ ...(backupPath !== undefined ? { backupPath } : {}),
132
+ };
133
+ }
134
+ await fs.writeFileAtomic(target, merged);
135
+ log(`codehub setup (${writer.id}): wrote MCP entry to ${target}`);
136
+ return {
137
+ editor: writer.id,
138
+ configPath: target,
139
+ action: "wrote",
140
+ ...(backupPath !== undefined ? { backupPath } : {}),
141
+ };
142
+ }
143
+ /**
144
+ * Public entry point for `codehub setup --embeddings`.
145
+ *
146
+ * Downloads the five pinned gte-modernbert-base files into the target dir with
147
+ * streaming SHA256 verification and atomic rename. Returns the downloader
148
+ * summary so programmatic callers can assert on byte counts and locations.
149
+ */
150
+ export async function runSetupEmbeddings(opts = {}) {
151
+ const log = opts.log ?? ((msg) => console.warn(msg));
152
+ const warn = opts.warn ?? ((msg) => console.warn(msg));
153
+ const variant = opts.variant ?? "fp32";
154
+ log(`codehub setup --embeddings: starting ${variant} download ` +
155
+ `(${variant === "fp32" ? "~90 MB" : "~23 MB"})`);
156
+ const downloaderOpts = {
157
+ variant,
158
+ ...(opts.modelDir !== undefined ? { modelDir: opts.modelDir } : {}),
159
+ ...(opts.force !== undefined ? { force: opts.force } : {}),
160
+ ...(opts.fetchImpl !== undefined ? { fetchImpl: opts.fetchImpl } : {}),
161
+ ...(opts.onProgress !== undefined ? { onProgress: opts.onProgress } : {}),
162
+ };
163
+ try {
164
+ const result = await downloadEmbedderWeights(downloaderOpts);
165
+ const mb = (result.totalBytes / 1024 / 1024).toFixed(1);
166
+ log(`codehub setup --embeddings: downloaded ${result.downloaded} file(s), ` +
167
+ `skipped ${result.skipped} (${mb} MB new) → ${result.modelDir}`);
168
+ log("codehub setup --embeddings: Done. " + "Run `codehub analyze --embeddings` to use them.");
169
+ return result;
170
+ }
171
+ catch (err) {
172
+ const message = err instanceof Error ? err.message : String(err);
173
+ warn(`codehub setup --embeddings: ${message}`);
174
+ throw err;
175
+ }
176
+ }
177
+ /**
178
+ * Public entry point for `codehub setup --scip=<tool>` / `--scip=all`.
179
+ *
180
+ * Dispatches to {@link installScipTool} for one tool, or
181
+ * {@link installAllScipTools} for the full set. Never throws — every error is
182
+ * surfaced on `stderr` via `warn` and collected into the `failed` array so
183
+ * `--scip=all` completes the surviving tools instead of short-circuiting on
184
+ * the first missing .NET SDK.
185
+ */
186
+ export async function runSetupScip(opts) {
187
+ const log = opts.log ?? ((msg) => console.warn(msg));
188
+ const warn = opts.warn ?? ((msg) => console.warn(msg));
189
+ const installOpts = {
190
+ ...(opts.destDir !== undefined ? { destDir: opts.destDir } : {}),
191
+ ...(opts.force !== undefined ? { force: opts.force } : {}),
192
+ ...(opts.fetchImpl !== undefined ? { fetchImpl: opts.fetchImpl } : {}),
193
+ ...(opts.allowPlaceholder !== undefined ? { allowPlaceholder: opts.allowPlaceholder } : {}),
194
+ log,
195
+ };
196
+ const installed = [];
197
+ const failed = [];
198
+ if (opts.tool === "all") {
199
+ log(`codehub setup --scip=all: installing ${SCIP_TOOL_ORDER.join(", ")}`);
200
+ const results = await installAllScipTools(installOpts);
201
+ for (const r of results) {
202
+ if ("error" in r) {
203
+ warn(`codehub setup --scip=${r.tool}: ${r.error.message}`);
204
+ failed.push({ tool: r.tool, error: r.error });
205
+ }
206
+ else {
207
+ installed.push(r);
208
+ }
209
+ }
210
+ }
211
+ else {
212
+ log(`codehub setup --scip=${opts.tool}: starting`);
213
+ try {
214
+ const result = await installScipTool(opts.tool, installOpts);
215
+ installed.push(result);
216
+ }
217
+ catch (err) {
218
+ const error = err instanceof Error ? err : new Error(String(err));
219
+ warn(`codehub setup --scip=${opts.tool}: ${error.message}`);
220
+ failed.push({ tool: opts.tool, error });
221
+ }
222
+ }
223
+ const summary = installed
224
+ .map((r) => r.dotnetToolHint !== undefined
225
+ ? `scip-${r.tool} (run \`${r.dotnetToolHint}\`)`
226
+ : `scip-${r.tool} ${r.installed ? "installed" : "skipped"} at ${r.path}`)
227
+ .join(", ");
228
+ if (summary.length > 0) {
229
+ log(`codehub setup --scip: ${summary}`);
230
+ }
231
+ if (failed.length > 0) {
232
+ warn(`codehub setup --scip: ${failed.length} tool(s) failed`);
233
+ }
234
+ return { installed, failed };
235
+ }
236
+ /**
237
+ * Parse the CLI `--scip=<value>` flag. Accepts a tool name or the literal
238
+ * `"all"`. Throws on anything else so typos surface instead of silently
239
+ * defaulting.
240
+ */
241
+ export function parseScipFlag(raw) {
242
+ const trimmed = raw.trim();
243
+ if (trimmed === "all")
244
+ return "all";
245
+ if (isScipTool(trimmed))
246
+ return trimmed;
247
+ throw new Error(`Unknown --scip value: "${raw}". Expected one of: ${[...SCIP_TOOL_ORDER, "all"].join(", ")}`);
248
+ }
249
+ /**
250
+ * Public entry point for `codehub setup --plugin`.
251
+ *
252
+ * Walks `sourceDir` and mirrors it into `<home>/.claude/plugins/opencodehub/`.
253
+ * Both the temp dir and the final rename go through `FsApi` so tests can run
254
+ * against an in-memory implementation.
255
+ */
256
+ export async function runSetupPlugin(opts = {}) {
257
+ const fs = opts.fs ?? DEFAULT_FS;
258
+ const log = opts.log ?? ((msg) => console.warn(msg));
259
+ const warn = opts.warn ?? ((msg) => console.warn(msg));
260
+ const home = opts.home ?? homedir();
261
+ const sourceDir = opts.sourceDir ?? defaultPluginSourceDir();
262
+ const targetRoot = resolve(home, ".claude", "plugins");
263
+ const targetDir = resolve(targetRoot, "opencodehub");
264
+ const tempDir = `${targetDir}.tmp-${process.pid}`;
265
+ if (!(await fs.exists(sourceDir))) {
266
+ const message = `codehub setup --plugin: source not found at ${sourceDir}`;
267
+ warn(message);
268
+ throw new Error(message);
269
+ }
270
+ await fs.mkdir(targetRoot);
271
+ // Wipe any stale tmp dir from a prior crash before we start. Best-effort.
272
+ if (fs.rm && (await fs.exists(tempDir))) {
273
+ await fs.rm(tempDir, { recursive: true, force: true });
274
+ }
275
+ const filesCopied = await copyTree(fs, sourceDir, tempDir);
276
+ // Swap: remove old install, rename temp into place. This is "atomic
277
+ // enough" — the window between rm and rename is narrow and leaves no
278
+ // half-written plugin because the temp dir was fully built first.
279
+ if (fs.rm && (await fs.exists(targetDir))) {
280
+ await fs.rm(targetDir, { recursive: true, force: true });
281
+ }
282
+ if (fs.rename) {
283
+ await fs.rename(tempDir, targetDir);
284
+ }
285
+ else {
286
+ // Fallback for FsApi implementations without rename: walk the temp
287
+ // tree and copy entries into the final target. Only used by in-memory
288
+ // test doubles that don't implement rename.
289
+ await copyTree(fs, tempDir, targetDir);
290
+ if (fs.rm)
291
+ await fs.rm(tempDir, { recursive: true, force: true });
292
+ }
293
+ log(`codehub setup --plugin: installed ${filesCopied} file(s) to ${targetDir}`);
294
+ return { sourceDir, targetDir, filesCopied };
295
+ }
296
+ /**
297
+ * Resolve the default plugin source dir.
298
+ *
299
+ * When running from source (`packages/cli/src/commands/setup.ts`) or from
300
+ * `dist/commands/setup.js` inside a pnpm workspace, the repo root is three
301
+ * directories above this file. We walk up from `import.meta.url` until we
302
+ * find a `plugins/opencodehub` dir.
303
+ */
304
+ function defaultPluginSourceDir() {
305
+ const thisFile = fileURLToPath(import.meta.url);
306
+ let dir = dirname(thisFile);
307
+ for (let i = 0; i < 8; i += 1) {
308
+ const candidate = join(dir, "plugins", "opencodehub");
309
+ try {
310
+ // Sync check is fine here — this runs once per setup invocation.
311
+ const st = statSyncSafe(candidate);
312
+ if (st?.isDirectory())
313
+ return candidate;
314
+ }
315
+ catch {
316
+ // keep walking
317
+ }
318
+ const parent = dirname(dir);
319
+ if (parent === dir)
320
+ break;
321
+ dir = parent;
322
+ }
323
+ // Fall back to the conventional location relative to the compiled
324
+ // `dist/commands/setup.js`. If this doesn't exist, the caller will get a
325
+ // clean "source not found" error.
326
+ return resolve(dirname(thisFile), "..", "..", "..", "..", "plugins", "opencodehub");
327
+ }
328
+ function statSyncSafe(path) {
329
+ try {
330
+ return statSync(path);
331
+ }
332
+ catch {
333
+ return undefined;
334
+ }
335
+ }
336
+ /** Recursively copy every regular file under `src` into `dest`. Returns count. */
337
+ async function copyTree(fs, src, dest) {
338
+ await fs.mkdir(dest);
339
+ if (!fs.readdir) {
340
+ throw new Error("FsApi.readdir is required for plugin installation");
341
+ }
342
+ const entries = await fs.readdir(src);
343
+ let count = 0;
344
+ for (const name of entries) {
345
+ const from = join(src, name);
346
+ const to = join(dest, name);
347
+ const isDir = fs.statIsDirectory ? await fs.statIsDirectory(from) : false;
348
+ if (isDir) {
349
+ count += await copyTree(fs, from, to);
350
+ }
351
+ else {
352
+ await fs.copyFile(from, to);
353
+ count += 1;
354
+ }
355
+ }
356
+ return count;
357
+ }
358
+ async function undoSingle(writer, fs, log) {
359
+ const target = writer.configPath;
360
+ const backupPath = `${target}.bak`;
361
+ if (!(await fs.exists(backupPath))) {
362
+ log(`codehub setup --undo (${writer.id}): no backup found at ${backupPath}`);
363
+ return { editor: writer.id, configPath: target, action: "skipped" };
364
+ }
365
+ const backup = await fs.readFile(backupPath);
366
+ await fs.writeFileAtomic(target, backup);
367
+ log(`codehub setup --undo (${writer.id}): restored ${target} from ${backupPath}`);
368
+ return { editor: writer.id, configPath: target, action: "restored", backupPath };
369
+ }
370
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `codehub sql <query>` — run a read-only SQL statement against the local
3
+ * temporal store. The `assertReadOnlySql` guard inside the temporal adapter
4
+ * rejects any mutation, and a per-statement JS timer interrupts long
5
+ * queries.
6
+ *
7
+ * Routes through `store.temporal.exec()` rather than the graph-tier
8
+ * escape hatch — `--sql` is the one CLI surface that consumes the
9
+ * tabular view directly. Graph-only commands stay on
10
+ * `store.graph.<finder>()`.
11
+ */
12
+ export interface SqlOptions {
13
+ readonly repo?: string;
14
+ readonly home?: string;
15
+ readonly timeoutMs?: number;
16
+ readonly json?: boolean;
17
+ }
18
+ export declare function runSql(sql: string, opts?: SqlOptions): Promise<void>;
19
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/commands/sql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAY9E"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * `codehub sql <query>` — run a read-only SQL statement against the local
3
+ * temporal store. The `assertReadOnlySql` guard inside the temporal adapter
4
+ * rejects any mutation, and a per-statement JS timer interrupts long
5
+ * queries.
6
+ *
7
+ * Routes through `store.temporal.exec()` rather than the graph-tier
8
+ * escape hatch — `--sql` is the one CLI surface that consumes the
9
+ * tabular view directly. Graph-only commands stay on
10
+ * `store.graph.<finder>()`.
11
+ */
12
+ import { openStoreForCommand } from "./open-store.js";
13
+ export async function runSql(sql, opts = {}) {
14
+ const { store } = await openStoreForCommand(opts);
15
+ try {
16
+ const rows = await store.temporal.exec(sql, [], { timeoutMs: opts.timeoutMs ?? 5_000 });
17
+ if (opts.json || rows.length === 0) {
18
+ console.log(JSON.stringify(rows, null, 2));
19
+ return;
20
+ }
21
+ printTable(rows);
22
+ }
23
+ finally {
24
+ await store.close();
25
+ }
26
+ }
27
+ function printTable(rows) {
28
+ const first = rows[0];
29
+ if (!first)
30
+ return;
31
+ const cols = Object.keys(first);
32
+ const widths = cols.map((c) => c.length);
33
+ const str = (v) => {
34
+ if (v === null || v === undefined)
35
+ return "";
36
+ if (Array.isArray(v))
37
+ return `[${v.map((x) => String(x)).join(",")}]`;
38
+ return String(v);
39
+ };
40
+ for (const row of rows) {
41
+ cols.forEach((c, i) => {
42
+ widths[i] = Math.max(widths[i] ?? 0, str(row[c]).length);
43
+ });
44
+ }
45
+ const line = (vals) => vals.map((v, i) => v.padEnd(widths[i] ?? 0)).join(" ");
46
+ console.log(line(cols));
47
+ for (const row of rows) {
48
+ console.log(line(cols.map((c) => str(row[c]))));
49
+ }
50
+ }
51
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/commands/sql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAStD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAW,EAAE,OAAmB,EAAE;IAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC;QACxF,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAwC;IAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,CAAC,CAAU,EAAU,EAAE;QACjC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QACtE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpB,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,IAAuB,EAAU,EAAE,CAC/C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `codehub status [path]` — show the recorded index state for a repo.
3
+ *
4
+ * Reads `<repo>/.codehub/meta.json` and prints schemaVersion, lastCommit,
5
+ * node/edge counts, and a best-effort staleness envelope. Staleness is
6
+ * computed by `@opencodehub/analysis` when available; otherwise we fall back
7
+ * to a simple `lastCommit` / registry check.
8
+ */
9
+ export interface StatusOptions {
10
+ readonly home?: string;
11
+ }
12
+ export declare function runStatus(path: string, opts?: StatusOptions): Promise<void>;
13
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CrF"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * `codehub status [path]` — show the recorded index state for a repo.
3
+ *
4
+ * Reads `<repo>/.codehub/meta.json` and prints schemaVersion, lastCommit,
5
+ * node/edge counts, and a best-effort staleness envelope. Staleness is
6
+ * computed by `@opencodehub/analysis` when available; otherwise we fall back
7
+ * to a simple `lastCommit` / registry check.
8
+ */
9
+ import { resolve } from "node:path";
10
+ import { readStoreMeta } from "@opencodehub/storage";
11
+ import { listGroups } from "../groups.js";
12
+ import { readRegistry } from "../registry.js";
13
+ export async function runStatus(path, opts = {}) {
14
+ const repoPath = resolve(path);
15
+ const meta = await readStoreMeta(repoPath);
16
+ if (!meta) {
17
+ console.warn(`No index found at ${repoPath}. Run \`codehub analyze\`.`);
18
+ return;
19
+ }
20
+ const registryOpts = opts.home !== undefined ? { home: opts.home } : {};
21
+ const registry = await readRegistry(registryOpts);
22
+ const registryHit = Object.values(registry).find((e) => resolve(e.path) === repoPath);
23
+ console.log(`path: ${repoPath}`);
24
+ console.log(`schemaVersion: ${meta.schemaVersion}`);
25
+ console.log(`indexedAt: ${meta.indexedAt}`);
26
+ console.log(`lastCommit: ${meta.lastCommit ?? "-"}`);
27
+ console.log(`nodes: ${meta.nodeCount}`);
28
+ console.log(`edges: ${meta.edgeCount}`);
29
+ if (registryHit === undefined) {
30
+ console.log("registry: missing — run `codehub analyze` to re-register");
31
+ }
32
+ else {
33
+ console.log("registry: ok");
34
+ }
35
+ // Surface every group the current repo belongs to, alphabetically.
36
+ if (registryHit !== undefined) {
37
+ const groups = await listGroups(registryOpts);
38
+ const memberOf = groups
39
+ .filter((g) => g.repos.some((r) => r.name === registryHit.name))
40
+ .map((g) => g.name)
41
+ .sort();
42
+ console.log(`groups: ${memberOf.length > 0 ? memberOf.join(", ") : "(none)"}`);
43
+ }
44
+ // Optional deeper staleness check via @opencodehub/analysis if wired.
45
+ const staleness = await tryComputeStaleness(repoPath, meta.lastCommit);
46
+ if (staleness !== undefined) {
47
+ console.log(`stale: ${staleness.isStale ? "yes" : "no"}`);
48
+ if (staleness.hint) {
49
+ console.log(`hint: ${staleness.hint}`);
50
+ }
51
+ }
52
+ }
53
+ async function tryComputeStaleness(repoPath, lastCommit) {
54
+ try {
55
+ const specifier = "@opencodehub/analysis";
56
+ const mod = (await import(specifier));
57
+ if (typeof mod.computeStaleness === "function") {
58
+ return await mod.computeStaleness(repoPath, lastCommit);
59
+ }
60
+ }
61
+ catch {
62
+ // Analysis package not built yet or export missing; fall through.
63
+ }
64
+ return undefined;
65
+ }
66
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM9C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,OAAsB,EAAE;IACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,qBAAqB,QAAQ,4BAA4B,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC;IAEtF,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACjD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAED,mEAAmE;IACnE,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC;aAC/D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,sEAAsE;IACtE,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACvE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnE,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,QAAgB,EAChB,UAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,uBAAuB,CAAC;QAC1C,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAKnC,CAAC;QACF,IAAI,OAAO,GAAG,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;YAC/C,OAAO,MAAM,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Pure render helpers for `codehub verdict`.
3
+ *
4
+ * The CLI supports three output formats:
5
+ * - `summary` — chalk-free ANSI pretty-print for human eyes in a TTY.
6
+ * Honors `NO_COLOR` and falls back to plain text when
7
+ * stdout is not a TTY (piped or redirected).
8
+ * - `markdown` — the PR-comment markdown string already synthesized by
9
+ * the analysis module. Safe to pipe directly into
10
+ * `gh pr comment`.
11
+ * - `json` — pretty-printed JSON document of the entire response.
12
+ *
13
+ * Renderers are pure: they take a {@link VerdictResponse} and return a
14
+ * string. Side-effect output (stdout, exit code) is the caller's concern.
15
+ *
16
+ * The CLI also defines its own exit-code ladder (0/1/2/3) for the
17
+ * `--exit-code` flag. That ladder is stricter than
18
+ * `VerdictResponse.exitCode` (which maxes out at 2 per the analysis
19
+ * module's original PRD contract) so CI pipes get distinct signals for
20
+ * `single_review` vs `dual_review` vs `block`.
21
+ */
22
+ import type { VerdictResponse, VerdictTier } from "@opencodehub/analysis";
23
+ export declare function cliExitCodeForTier(tier: VerdictTier): 0 | 1 | 2 | 3;
24
+ export declare function renderJson(verdict: VerdictResponse): string;
25
+ export declare function renderMarkdown(verdict: VerdictResponse): string;
26
+ export interface RenderSummaryOptions {
27
+ /** Defaults to `process.stdout.isTTY`. */
28
+ readonly isTty?: boolean;
29
+ /** Defaults to whether `NO_COLOR` is set and non-empty. */
30
+ readonly noColor?: boolean;
31
+ }
32
+ export declare function renderSummary(verdict: VerdictResponse, opts?: RenderSummaryOptions): string;
33
+ //# sourceMappingURL=verdict-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verdict-render.d.ts","sourceRoot":"","sources":["../../src/commands/verdict-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAW1E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAEnE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAE3D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAY/D;AA+BD,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,GAAE,oBAAyB,GAAG,MAAM,CA+D/F"}