assistant-ui 0.0.84 → 0.0.85
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/README.md +41 -0
- package/dist/commands/info.d.ts +3 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +366 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/commands/info.ts +455 -0
- package/src/index.ts +2 -0
package/README.md
CHANGED
|
@@ -91,6 +91,47 @@ The `upgrade` command runs codemods to transform your code and prompts to instal
|
|
|
91
91
|
npx assistant-ui@latest upgrade
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
+
## info
|
|
95
|
+
|
|
96
|
+
Use the `info` command to print your environment and package versions for bug reports.
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npx assistant-ui info
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
This command collects and prints:
|
|
103
|
+
- OS, Node.js version, package manager, and framework
|
|
104
|
+
- All installed `@assistant-ui/*` and `assistant-*` package versions
|
|
105
|
+
- Key ecosystem dependency versions (React, Next.js, AI SDK, etc.)
|
|
106
|
+
- Peer dependency warnings if any mismatches are detected
|
|
107
|
+
|
|
108
|
+
**Example output:**
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
Environment:
|
|
112
|
+
OS: macOS 15.3 (arm64)
|
|
113
|
+
Node.js: v22.14.0
|
|
114
|
+
Package Manager: pnpm 10.32.1
|
|
115
|
+
Framework: Next.js 15.3.1
|
|
116
|
+
|
|
117
|
+
Packages:
|
|
118
|
+
@assistant-ui/react 0.12.15
|
|
119
|
+
@assistant-ui/react-ai-sdk 1.3.12
|
|
120
|
+
@assistant-ui/react-markdown 0.3.8
|
|
121
|
+
assistant-stream 0.2.14
|
|
122
|
+
|
|
123
|
+
Ecosystem:
|
|
124
|
+
react 19.1.0
|
|
125
|
+
react-dom 19.1.0
|
|
126
|
+
next 15.3.1
|
|
127
|
+
ai 6.0.120
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The output includes a copy-pasteable markdown block that you can paste directly into a bug report.
|
|
131
|
+
|
|
132
|
+
**Options:**
|
|
133
|
+
- `-c, --cwd <cwd>` - the working directory. defaults to the current directory.
|
|
134
|
+
|
|
94
135
|
## Documentation
|
|
95
136
|
|
|
96
137
|
Visit https://assistant-ui.com/docs/cli to view the full documentation.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiapC,eAAO,MAAM,IAAI,SAqCb,CAAC"}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import { detect } from "detect-package-manager";
|
|
8
|
+
const ASSISTANT_UI_PACKAGES = [
|
|
9
|
+
// Distribution
|
|
10
|
+
"@assistant-ui/react",
|
|
11
|
+
"@assistant-ui/react-native",
|
|
12
|
+
"@assistant-ui/react-ink",
|
|
13
|
+
// Core (should not be installed directly)
|
|
14
|
+
"@assistant-ui/core",
|
|
15
|
+
"@assistant-ui/store",
|
|
16
|
+
"@assistant-ui/tap",
|
|
17
|
+
// Streaming & Cloud
|
|
18
|
+
"assistant-stream",
|
|
19
|
+
"assistant-cloud",
|
|
20
|
+
"@assistant-ui/cloud-ai-sdk",
|
|
21
|
+
// Adapters
|
|
22
|
+
"@assistant-ui/react-ai-sdk",
|
|
23
|
+
"@assistant-ui/react-langgraph",
|
|
24
|
+
"@assistant-ui/react-ag-ui",
|
|
25
|
+
"@assistant-ui/react-a2a",
|
|
26
|
+
"@assistant-ui/react-data-stream",
|
|
27
|
+
"@assistant-ui/react-google-adk",
|
|
28
|
+
// UI / Rendering
|
|
29
|
+
"@assistant-ui/react-markdown",
|
|
30
|
+
"@assistant-ui/react-streamdown",
|
|
31
|
+
"@assistant-ui/react-lexical",
|
|
32
|
+
"@assistant-ui/react-syntax-highlighter",
|
|
33
|
+
"@assistant-ui/react-hook-form",
|
|
34
|
+
// Observability & DevTools
|
|
35
|
+
"@assistant-ui/react-o11y",
|
|
36
|
+
"@assistant-ui/react-devtools",
|
|
37
|
+
];
|
|
38
|
+
const ECOSYSTEM_PACKAGES = [
|
|
39
|
+
"react",
|
|
40
|
+
"react-dom",
|
|
41
|
+
"react-native",
|
|
42
|
+
"next",
|
|
43
|
+
"vite",
|
|
44
|
+
"expo",
|
|
45
|
+
"ai",
|
|
46
|
+
"zod",
|
|
47
|
+
"zustand",
|
|
48
|
+
"typescript",
|
|
49
|
+
];
|
|
50
|
+
// Packages that users should NOT install directly — they are internal
|
|
51
|
+
// dependencies pulled in automatically by distribution packages.
|
|
52
|
+
const SHOULD_NOT_DIRECT_INSTALL = new Set([
|
|
53
|
+
"@assistant-ui/core",
|
|
54
|
+
"@assistant-ui/store",
|
|
55
|
+
"@assistant-ui/tap",
|
|
56
|
+
]);
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Helpers
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
function resolvePackageJson(pkg, cwd) {
|
|
61
|
+
let dir = cwd;
|
|
62
|
+
const root = path.parse(dir).root;
|
|
63
|
+
while (dir !== root) {
|
|
64
|
+
const candidate = path.join(dir, "node_modules", ...pkg.split("/"), "package.json");
|
|
65
|
+
if (fs.existsSync(candidate))
|
|
66
|
+
return candidate;
|
|
67
|
+
dir = path.dirname(dir);
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function getInstalledVersion(pkg, cwd) {
|
|
72
|
+
try {
|
|
73
|
+
const pkgJsonPath = resolvePackageJson(pkg, cwd);
|
|
74
|
+
if (pkgJsonPath) {
|
|
75
|
+
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf8"));
|
|
76
|
+
return pkgJson.version ?? null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// ignore
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
function findWorkspaceRoot(cwd) {
|
|
85
|
+
let dir = path.dirname(cwd);
|
|
86
|
+
const root = path.parse(dir).root;
|
|
87
|
+
while (dir !== root) {
|
|
88
|
+
if (fs.existsSync(path.join(dir, "pnpm-workspace.yaml")))
|
|
89
|
+
return dir;
|
|
90
|
+
const pkgPath = path.join(dir, "package.json");
|
|
91
|
+
if (fs.existsSync(pkgPath)) {
|
|
92
|
+
try {
|
|
93
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
94
|
+
if (pkg.workspaces)
|
|
95
|
+
return dir;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// ignore
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
dir = path.dirname(dir);
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
function readProjectDeps(projectPkg) {
|
|
106
|
+
return {
|
|
107
|
+
...(projectPkg.dependencies ?? {}),
|
|
108
|
+
...(projectPkg.devDependencies ?? {}),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function getSpecifiedRange(pkg, projectPkg) {
|
|
112
|
+
const deps = (projectPkg.dependencies ?? {});
|
|
113
|
+
const devDeps = (projectPkg.devDependencies ?? {});
|
|
114
|
+
return deps[pkg] ?? devDeps[pkg] ?? null;
|
|
115
|
+
}
|
|
116
|
+
function getPeerDeps(pkg, cwd) {
|
|
117
|
+
try {
|
|
118
|
+
const pkgJsonPath = resolvePackageJson(pkg, cwd);
|
|
119
|
+
if (pkgJsonPath) {
|
|
120
|
+
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf8"));
|
|
121
|
+
return pkgJson.peerDependencies ?? null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// ignore
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
function detectFramework(projectPkg, cwd) {
|
|
130
|
+
const deps = readProjectDeps(projectPkg);
|
|
131
|
+
if (deps["next"]) {
|
|
132
|
+
const v = getInstalledVersion("next", cwd);
|
|
133
|
+
return `Next.js ${v ?? deps["next"]}`;
|
|
134
|
+
}
|
|
135
|
+
if (deps["expo"]) {
|
|
136
|
+
const v = getInstalledVersion("expo", cwd);
|
|
137
|
+
return `Expo ${v ?? deps["expo"]}`;
|
|
138
|
+
}
|
|
139
|
+
if (deps["vite"]) {
|
|
140
|
+
const v = getInstalledVersion("vite", cwd);
|
|
141
|
+
return `Vite ${v ?? deps["vite"]}`;
|
|
142
|
+
}
|
|
143
|
+
if (deps["@remix-run/react"] || deps["remix"])
|
|
144
|
+
return "Remix";
|
|
145
|
+
if (deps["gatsby"])
|
|
146
|
+
return "Gatsby";
|
|
147
|
+
if (deps["astro"])
|
|
148
|
+
return "Astro";
|
|
149
|
+
return "Unknown";
|
|
150
|
+
}
|
|
151
|
+
function getOsInfo() {
|
|
152
|
+
const platform = os.platform();
|
|
153
|
+
const arch = os.arch();
|
|
154
|
+
const release = os.release();
|
|
155
|
+
switch (platform) {
|
|
156
|
+
case "darwin": {
|
|
157
|
+
const result = spawnSync("sw_vers", ["-productVersion"], {
|
|
158
|
+
encoding: "utf8",
|
|
159
|
+
});
|
|
160
|
+
const macVer = result.stdout?.trim();
|
|
161
|
+
return macVer
|
|
162
|
+
? `macOS ${macVer} (${arch})`
|
|
163
|
+
: `macOS ${release} (${arch})`;
|
|
164
|
+
}
|
|
165
|
+
case "win32":
|
|
166
|
+
return `Windows ${release} (${arch})`;
|
|
167
|
+
case "linux":
|
|
168
|
+
return `Linux ${release} (${arch})`;
|
|
169
|
+
default:
|
|
170
|
+
return `${platform} ${release} (${arch})`;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function getPackageManagerInfo(cwd) {
|
|
174
|
+
const pm = await detect({ cwd });
|
|
175
|
+
const result = spawnSync(pm, ["--version"], {
|
|
176
|
+
encoding: "utf8",
|
|
177
|
+
cwd,
|
|
178
|
+
});
|
|
179
|
+
const version = result.stdout?.trim() ?? "unknown";
|
|
180
|
+
return { name: pm, version };
|
|
181
|
+
}
|
|
182
|
+
function satisfiesRange(version, range) {
|
|
183
|
+
if (range === "*" || range === "any")
|
|
184
|
+
return true;
|
|
185
|
+
const clean = (v) => v.replace(/^[^\d]*/, "");
|
|
186
|
+
const major = (v) => parseInt(clean(v).split(".")[0], 10);
|
|
187
|
+
if (range.includes("||")) {
|
|
188
|
+
return range
|
|
189
|
+
.split("||")
|
|
190
|
+
.some((part) => satisfiesRange(version, part.trim()));
|
|
191
|
+
}
|
|
192
|
+
const rangeMajor = major(range);
|
|
193
|
+
const versionMajor = major(version);
|
|
194
|
+
if (Number.isNaN(rangeMajor) || Number.isNaN(versionMajor))
|
|
195
|
+
return true;
|
|
196
|
+
if (range.startsWith("^"))
|
|
197
|
+
return versionMajor >= rangeMajor;
|
|
198
|
+
if (range.startsWith(">="))
|
|
199
|
+
return versionMajor >= rangeMajor;
|
|
200
|
+
return versionMajor >= rangeMajor;
|
|
201
|
+
}
|
|
202
|
+
function collectPackages(names, cwd, projectPkg) {
|
|
203
|
+
const result = [];
|
|
204
|
+
const deps = readProjectDeps(projectPkg);
|
|
205
|
+
for (const name of names) {
|
|
206
|
+
const version = getInstalledVersion(name, cwd);
|
|
207
|
+
if (version) {
|
|
208
|
+
result.push({
|
|
209
|
+
name,
|
|
210
|
+
version,
|
|
211
|
+
range: getSpecifiedRange(name, projectPkg),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// Fallback: no node_modules, show range from package.json
|
|
216
|
+
const range = deps[name];
|
|
217
|
+
if (range && !range.startsWith("workspace:")) {
|
|
218
|
+
result.push({ name, version: `${range} (not installed)`, range });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
function collectWarnings(packages, cwd, projectPkg) {
|
|
225
|
+
const warnings = [];
|
|
226
|
+
const deps = readProjectDeps(projectPkg);
|
|
227
|
+
// Check peer dependency mismatches
|
|
228
|
+
for (const pkg of packages) {
|
|
229
|
+
const peerDeps = getPeerDeps(pkg.name, cwd);
|
|
230
|
+
if (!peerDeps)
|
|
231
|
+
continue;
|
|
232
|
+
for (const [peerName, peerRange] of Object.entries(peerDeps)) {
|
|
233
|
+
const peerVersion = getInstalledVersion(peerName, cwd);
|
|
234
|
+
if (!peerVersion)
|
|
235
|
+
continue;
|
|
236
|
+
if (!satisfiesRange(peerVersion, peerRange)) {
|
|
237
|
+
warnings.push(`${pkg.name} requires ${peerName} ${peerRange}, found ${peerVersion}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Check for direct install of internal packages
|
|
242
|
+
for (const name of SHOULD_NOT_DIRECT_INSTALL) {
|
|
243
|
+
if (deps[name]) {
|
|
244
|
+
warnings.push(`${name} should not be installed directly — it is an internal dependency`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return warnings;
|
|
248
|
+
}
|
|
249
|
+
async function collectInfo(cwd, projectPkg) {
|
|
250
|
+
const pm = await getPackageManagerInfo(cwd);
|
|
251
|
+
const packages = collectPackages(ASSISTANT_UI_PACKAGES, cwd, projectPkg);
|
|
252
|
+
const ecosystem = collectPackages(ECOSYSTEM_PACKAGES, cwd, projectPkg);
|
|
253
|
+
const warnings = collectWarnings(packages, cwd, projectPkg);
|
|
254
|
+
return {
|
|
255
|
+
os: getOsInfo(),
|
|
256
|
+
node: process.version,
|
|
257
|
+
pm,
|
|
258
|
+
framework: detectFramework(projectPkg, cwd),
|
|
259
|
+
isMonorepo: findWorkspaceRoot(cwd) !== null,
|
|
260
|
+
packages,
|
|
261
|
+
ecosystem,
|
|
262
|
+
warnings,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
// Rendering
|
|
267
|
+
// ---------------------------------------------------------------------------
|
|
268
|
+
function formatSection(label, items) {
|
|
269
|
+
if (items.length === 0)
|
|
270
|
+
return [];
|
|
271
|
+
const lines = [];
|
|
272
|
+
lines.push("");
|
|
273
|
+
lines.push(`${label}:`);
|
|
274
|
+
const maxLen = Math.max(...items.map((p) => p.name.length));
|
|
275
|
+
for (const pkg of items) {
|
|
276
|
+
lines.push(` ${pkg.name.padEnd(maxLen)} ${pkg.version}`);
|
|
277
|
+
}
|
|
278
|
+
return lines;
|
|
279
|
+
}
|
|
280
|
+
function renderPlain(data) {
|
|
281
|
+
const lines = [];
|
|
282
|
+
lines.push("Environment:");
|
|
283
|
+
lines.push(` OS: ${data.os}`);
|
|
284
|
+
lines.push(` Node.js: ${data.node}`);
|
|
285
|
+
lines.push(` Package Manager: ${data.pm.name} ${data.pm.version}`);
|
|
286
|
+
lines.push(` Framework: ${data.framework}`);
|
|
287
|
+
if (data.isMonorepo) {
|
|
288
|
+
lines.push(` Monorepo: yes`);
|
|
289
|
+
}
|
|
290
|
+
lines.push(...formatSection("Packages", data.packages));
|
|
291
|
+
lines.push(...formatSection("Ecosystem", data.ecosystem));
|
|
292
|
+
if (data.warnings.length > 0) {
|
|
293
|
+
lines.push("");
|
|
294
|
+
lines.push("Warnings:");
|
|
295
|
+
for (const w of data.warnings) {
|
|
296
|
+
lines.push(` ! ${w}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return lines;
|
|
300
|
+
}
|
|
301
|
+
function renderColored(data) {
|
|
302
|
+
const lines = [];
|
|
303
|
+
lines.push(chalk.bold("Environment:"));
|
|
304
|
+
lines.push(` OS: ${data.os}`);
|
|
305
|
+
lines.push(` Node.js: ${data.node}`);
|
|
306
|
+
lines.push(` Package Manager: ${data.pm.name} ${data.pm.version}`);
|
|
307
|
+
lines.push(` Framework: ${data.framework}`);
|
|
308
|
+
if (data.isMonorepo) {
|
|
309
|
+
lines.push(` Monorepo: yes`);
|
|
310
|
+
}
|
|
311
|
+
if (data.packages.length > 0) {
|
|
312
|
+
const section = formatSection("Packages", data.packages);
|
|
313
|
+
section[0] = "";
|
|
314
|
+
section[1] = chalk.bold("Packages:");
|
|
315
|
+
lines.push(...section);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
lines.push("");
|
|
319
|
+
lines.push(chalk.yellow(" No assistant-ui packages found."));
|
|
320
|
+
}
|
|
321
|
+
if (data.ecosystem.length > 0) {
|
|
322
|
+
const section = formatSection("Ecosystem", data.ecosystem);
|
|
323
|
+
section[0] = "";
|
|
324
|
+
section[1] = chalk.bold("Ecosystem:");
|
|
325
|
+
lines.push(...section);
|
|
326
|
+
}
|
|
327
|
+
if (data.warnings.length > 0) {
|
|
328
|
+
lines.push("");
|
|
329
|
+
lines.push(chalk.yellow.bold("Warnings:"));
|
|
330
|
+
for (const w of data.warnings) {
|
|
331
|
+
lines.push(chalk.yellow(` ! ${w}`));
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return lines;
|
|
335
|
+
}
|
|
336
|
+
// ---------------------------------------------------------------------------
|
|
337
|
+
// Command
|
|
338
|
+
// ---------------------------------------------------------------------------
|
|
339
|
+
export const info = new Command()
|
|
340
|
+
.name("info")
|
|
341
|
+
.description("Print environment and package information for bug reports.")
|
|
342
|
+
.option("-c, --cwd <cwd>", "the working directory. defaults to the current directory.", process.cwd())
|
|
343
|
+
.action(async (opts) => {
|
|
344
|
+
const cwd = path.resolve(opts.cwd);
|
|
345
|
+
const packageJsonPath = path.join(cwd, "package.json");
|
|
346
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
347
|
+
console.error(chalk.red("No package.json found in the current directory."));
|
|
348
|
+
process.exit(1);
|
|
349
|
+
}
|
|
350
|
+
const projectPkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
351
|
+
const data = await collectInfo(cwd, projectPkg);
|
|
352
|
+
// Colored output for terminal
|
|
353
|
+
console.log("");
|
|
354
|
+
for (const line of renderColored(data)) {
|
|
355
|
+
console.log(line);
|
|
356
|
+
}
|
|
357
|
+
console.log("");
|
|
358
|
+
// Copyable plain text
|
|
359
|
+
const plain = renderPlain(data);
|
|
360
|
+
const block = ["```", ...plain, "```"].join("\n");
|
|
361
|
+
console.log(chalk.dim("— Copy the text below into your bug report —"));
|
|
362
|
+
console.log("");
|
|
363
|
+
console.log(block);
|
|
364
|
+
console.log("");
|
|
365
|
+
});
|
|
366
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { init } from "./commands/init.js";
|
|
|
7
7
|
import { update } from "./commands/update.js";
|
|
8
8
|
import { mcp } from "./commands/mcp.js";
|
|
9
9
|
import { agent } from "./commands/agent.js";
|
|
10
|
+
import { info } from "./commands/info.js";
|
|
10
11
|
process.on("SIGINT", () => process.exit(0));
|
|
11
12
|
process.on("SIGTERM", () => process.exit(0));
|
|
12
13
|
function main() {
|
|
@@ -21,6 +22,7 @@ function main() {
|
|
|
21
22
|
program.addCommand(upgradeCommand);
|
|
22
23
|
program.addCommand(update);
|
|
23
24
|
program.addCommand(agent);
|
|
25
|
+
program.addCommand(info);
|
|
24
26
|
program.parse();
|
|
25
27
|
}
|
|
26
28
|
main();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,6BAA0B;AAC3C,OAAO,EAAE,GAAG,EAAE,0BAAuB;AACrC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,8BAA2B;AACpE,OAAO,EAAE,IAAI,EAAE,2BAAwB;AACvC,OAAO,EAAE,MAAM,EAAE,6BAA0B;AAC3C,OAAO,EAAE,GAAG,EAAE,0BAAuB;AACrC,OAAO,EAAE,KAAK,EAAE,4BAAyB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,6BAA0B;AAC3C,OAAO,EAAE,GAAG,EAAE,0BAAuB;AACrC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,8BAA2B;AACpE,OAAO,EAAE,IAAI,EAAE,2BAAwB;AACvC,OAAO,EAAE,MAAM,EAAE,6BAA0B;AAC3C,OAAO,EAAE,GAAG,EAAE,0BAAuB;AACrC,OAAO,EAAE,KAAK,EAAE,4BAAyB;AACzC,OAAO,EAAE,IAAI,EAAE,2BAAwB;AAEvC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7C,SAAS,IAAI;IACX,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,cAAc,CAAC;SACpB,WAAW,CAAC,iDAAiD,CAAC,CAAC;IAElE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IACnC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAEzB,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "assistant-ui",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.85",
|
|
4
4
|
"description": "CLI for assistant-ui",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/cli-progress": "^3.11.6",
|
|
43
43
|
"@types/cross-spawn": "^6.0.6",
|
|
44
|
-
"@types/debug": "^4.1.
|
|
44
|
+
"@types/debug": "^4.1.13",
|
|
45
45
|
"@types/jscodeshift": "^17.3.0",
|
|
46
46
|
"@types/node": "^25.5.0",
|
|
47
47
|
"@vitest/coverage-v8": "^4.1.0",
|
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import { detect } from "detect-package-manager";
|
|
8
|
+
|
|
9
|
+
const ASSISTANT_UI_PACKAGES = [
|
|
10
|
+
// Distribution
|
|
11
|
+
"@assistant-ui/react",
|
|
12
|
+
"@assistant-ui/react-native",
|
|
13
|
+
"@assistant-ui/react-ink",
|
|
14
|
+
// Core (should not be installed directly)
|
|
15
|
+
"@assistant-ui/core",
|
|
16
|
+
"@assistant-ui/store",
|
|
17
|
+
"@assistant-ui/tap",
|
|
18
|
+
// Streaming & Cloud
|
|
19
|
+
"assistant-stream",
|
|
20
|
+
"assistant-cloud",
|
|
21
|
+
"@assistant-ui/cloud-ai-sdk",
|
|
22
|
+
// Adapters
|
|
23
|
+
"@assistant-ui/react-ai-sdk",
|
|
24
|
+
"@assistant-ui/react-langgraph",
|
|
25
|
+
"@assistant-ui/react-ag-ui",
|
|
26
|
+
"@assistant-ui/react-a2a",
|
|
27
|
+
"@assistant-ui/react-data-stream",
|
|
28
|
+
"@assistant-ui/react-google-adk",
|
|
29
|
+
// UI / Rendering
|
|
30
|
+
"@assistant-ui/react-markdown",
|
|
31
|
+
"@assistant-ui/react-streamdown",
|
|
32
|
+
"@assistant-ui/react-lexical",
|
|
33
|
+
"@assistant-ui/react-syntax-highlighter",
|
|
34
|
+
"@assistant-ui/react-hook-form",
|
|
35
|
+
// Observability & DevTools
|
|
36
|
+
"@assistant-ui/react-o11y",
|
|
37
|
+
"@assistant-ui/react-devtools",
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const ECOSYSTEM_PACKAGES = [
|
|
41
|
+
"react",
|
|
42
|
+
"react-dom",
|
|
43
|
+
"react-native",
|
|
44
|
+
"next",
|
|
45
|
+
"vite",
|
|
46
|
+
"expo",
|
|
47
|
+
"ai",
|
|
48
|
+
"zod",
|
|
49
|
+
"zustand",
|
|
50
|
+
"typescript",
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
// Packages that users should NOT install directly — they are internal
|
|
54
|
+
// dependencies pulled in automatically by distribution packages.
|
|
55
|
+
const SHOULD_NOT_DIRECT_INSTALL = new Set([
|
|
56
|
+
"@assistant-ui/core",
|
|
57
|
+
"@assistant-ui/store",
|
|
58
|
+
"@assistant-ui/tap",
|
|
59
|
+
]);
|
|
60
|
+
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Helpers
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
|
|
65
|
+
function resolvePackageJson(pkg: string, cwd: string): string | null {
|
|
66
|
+
let dir = cwd;
|
|
67
|
+
const root = path.parse(dir).root;
|
|
68
|
+
while (dir !== root) {
|
|
69
|
+
const candidate = path.join(
|
|
70
|
+
dir,
|
|
71
|
+
"node_modules",
|
|
72
|
+
...pkg.split("/"),
|
|
73
|
+
"package.json",
|
|
74
|
+
);
|
|
75
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
76
|
+
dir = path.dirname(dir);
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function getInstalledVersion(pkg: string, cwd: string): string | null {
|
|
82
|
+
try {
|
|
83
|
+
const pkgJsonPath = resolvePackageJson(pkg, cwd);
|
|
84
|
+
if (pkgJsonPath) {
|
|
85
|
+
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf8"));
|
|
86
|
+
return pkgJson.version ?? null;
|
|
87
|
+
}
|
|
88
|
+
} catch {
|
|
89
|
+
// ignore
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function findWorkspaceRoot(cwd: string): string | null {
|
|
95
|
+
let dir = path.dirname(cwd);
|
|
96
|
+
const root = path.parse(dir).root;
|
|
97
|
+
while (dir !== root) {
|
|
98
|
+
if (fs.existsSync(path.join(dir, "pnpm-workspace.yaml"))) return dir;
|
|
99
|
+
const pkgPath = path.join(dir, "package.json");
|
|
100
|
+
if (fs.existsSync(pkgPath)) {
|
|
101
|
+
try {
|
|
102
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
103
|
+
if (pkg.workspaces) return dir;
|
|
104
|
+
} catch {
|
|
105
|
+
// ignore
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
dir = path.dirname(dir);
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function readProjectDeps(
|
|
114
|
+
projectPkg: Record<string, unknown>,
|
|
115
|
+
): Record<string, string> {
|
|
116
|
+
return {
|
|
117
|
+
...((projectPkg.dependencies ?? {}) as Record<string, string>),
|
|
118
|
+
...((projectPkg.devDependencies ?? {}) as Record<string, string>),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function getSpecifiedRange(
|
|
123
|
+
pkg: string,
|
|
124
|
+
projectPkg: Record<string, unknown>,
|
|
125
|
+
): string | null {
|
|
126
|
+
const deps = (projectPkg.dependencies ?? {}) as Record<string, string>;
|
|
127
|
+
const devDeps = (projectPkg.devDependencies ?? {}) as Record<string, string>;
|
|
128
|
+
return deps[pkg] ?? devDeps[pkg] ?? null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function getPeerDeps(pkg: string, cwd: string): Record<string, string> | null {
|
|
132
|
+
try {
|
|
133
|
+
const pkgJsonPath = resolvePackageJson(pkg, cwd);
|
|
134
|
+
if (pkgJsonPath) {
|
|
135
|
+
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf8"));
|
|
136
|
+
return (pkgJson.peerDependencies as Record<string, string>) ?? null;
|
|
137
|
+
}
|
|
138
|
+
} catch {
|
|
139
|
+
// ignore
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function detectFramework(
|
|
145
|
+
projectPkg: Record<string, unknown>,
|
|
146
|
+
cwd: string,
|
|
147
|
+
): string {
|
|
148
|
+
const deps = readProjectDeps(projectPkg);
|
|
149
|
+
|
|
150
|
+
if (deps["next"]) {
|
|
151
|
+
const v = getInstalledVersion("next", cwd);
|
|
152
|
+
return `Next.js ${v ?? deps["next"]}`;
|
|
153
|
+
}
|
|
154
|
+
if (deps["expo"]) {
|
|
155
|
+
const v = getInstalledVersion("expo", cwd);
|
|
156
|
+
return `Expo ${v ?? deps["expo"]}`;
|
|
157
|
+
}
|
|
158
|
+
if (deps["vite"]) {
|
|
159
|
+
const v = getInstalledVersion("vite", cwd);
|
|
160
|
+
return `Vite ${v ?? deps["vite"]}`;
|
|
161
|
+
}
|
|
162
|
+
if (deps["@remix-run/react"] || deps["remix"]) return "Remix";
|
|
163
|
+
if (deps["gatsby"]) return "Gatsby";
|
|
164
|
+
if (deps["astro"]) return "Astro";
|
|
165
|
+
return "Unknown";
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function getOsInfo(): string {
|
|
169
|
+
const platform = os.platform();
|
|
170
|
+
const arch = os.arch();
|
|
171
|
+
const release = os.release();
|
|
172
|
+
|
|
173
|
+
switch (platform) {
|
|
174
|
+
case "darwin": {
|
|
175
|
+
const result = spawnSync("sw_vers", ["-productVersion"], {
|
|
176
|
+
encoding: "utf8",
|
|
177
|
+
});
|
|
178
|
+
const macVer = result.stdout?.trim();
|
|
179
|
+
return macVer
|
|
180
|
+
? `macOS ${macVer} (${arch})`
|
|
181
|
+
: `macOS ${release} (${arch})`;
|
|
182
|
+
}
|
|
183
|
+
case "win32":
|
|
184
|
+
return `Windows ${release} (${arch})`;
|
|
185
|
+
case "linux":
|
|
186
|
+
return `Linux ${release} (${arch})`;
|
|
187
|
+
default:
|
|
188
|
+
return `${platform} ${release} (${arch})`;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
async function getPackageManagerInfo(
|
|
193
|
+
cwd: string,
|
|
194
|
+
): Promise<{ name: string; version: string }> {
|
|
195
|
+
const pm = await detect({ cwd });
|
|
196
|
+
const result = spawnSync(pm, ["--version"], {
|
|
197
|
+
encoding: "utf8",
|
|
198
|
+
cwd,
|
|
199
|
+
});
|
|
200
|
+
const version = result.stdout?.trim() ?? "unknown";
|
|
201
|
+
return { name: pm, version };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function satisfiesRange(version: string, range: string): boolean {
|
|
205
|
+
if (range === "*" || range === "any") return true;
|
|
206
|
+
|
|
207
|
+
const clean = (v: string) => v.replace(/^[^\d]*/, "");
|
|
208
|
+
const major = (v: string) => parseInt(clean(v).split(".")[0]!, 10);
|
|
209
|
+
|
|
210
|
+
if (range.includes("||")) {
|
|
211
|
+
return range
|
|
212
|
+
.split("||")
|
|
213
|
+
.some((part) => satisfiesRange(version, part.trim()));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const rangeMajor = major(range);
|
|
217
|
+
const versionMajor = major(version);
|
|
218
|
+
|
|
219
|
+
if (Number.isNaN(rangeMajor) || Number.isNaN(versionMajor)) return true;
|
|
220
|
+
|
|
221
|
+
if (range.startsWith("^")) return versionMajor >= rangeMajor;
|
|
222
|
+
if (range.startsWith(">=")) return versionMajor >= rangeMajor;
|
|
223
|
+
|
|
224
|
+
return versionMajor >= rangeMajor;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
// Data collection
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
|
|
231
|
+
interface PackageInfo {
|
|
232
|
+
name: string;
|
|
233
|
+
version: string;
|
|
234
|
+
range: string | null;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
interface InfoData {
|
|
238
|
+
os: string;
|
|
239
|
+
node: string;
|
|
240
|
+
pm: { name: string; version: string };
|
|
241
|
+
framework: string;
|
|
242
|
+
isMonorepo: boolean;
|
|
243
|
+
packages: PackageInfo[];
|
|
244
|
+
ecosystem: PackageInfo[];
|
|
245
|
+
warnings: string[];
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function collectPackages(
|
|
249
|
+
names: string[],
|
|
250
|
+
cwd: string,
|
|
251
|
+
projectPkg: Record<string, unknown>,
|
|
252
|
+
): PackageInfo[] {
|
|
253
|
+
const result: PackageInfo[] = [];
|
|
254
|
+
const deps = readProjectDeps(projectPkg);
|
|
255
|
+
|
|
256
|
+
for (const name of names) {
|
|
257
|
+
const version = getInstalledVersion(name, cwd);
|
|
258
|
+
if (version) {
|
|
259
|
+
result.push({
|
|
260
|
+
name,
|
|
261
|
+
version,
|
|
262
|
+
range: getSpecifiedRange(name, projectPkg),
|
|
263
|
+
});
|
|
264
|
+
} else {
|
|
265
|
+
// Fallback: no node_modules, show range from package.json
|
|
266
|
+
const range = deps[name];
|
|
267
|
+
if (range && !range.startsWith("workspace:")) {
|
|
268
|
+
result.push({ name, version: `${range} (not installed)`, range });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return result;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function collectWarnings(
|
|
276
|
+
packages: PackageInfo[],
|
|
277
|
+
cwd: string,
|
|
278
|
+
projectPkg: Record<string, unknown>,
|
|
279
|
+
): string[] {
|
|
280
|
+
const warnings: string[] = [];
|
|
281
|
+
const deps = readProjectDeps(projectPkg);
|
|
282
|
+
|
|
283
|
+
// Check peer dependency mismatches
|
|
284
|
+
for (const pkg of packages) {
|
|
285
|
+
const peerDeps = getPeerDeps(pkg.name, cwd);
|
|
286
|
+
if (!peerDeps) continue;
|
|
287
|
+
|
|
288
|
+
for (const [peerName, peerRange] of Object.entries(peerDeps)) {
|
|
289
|
+
const peerVersion = getInstalledVersion(peerName, cwd);
|
|
290
|
+
if (!peerVersion) continue;
|
|
291
|
+
if (!satisfiesRange(peerVersion, peerRange)) {
|
|
292
|
+
warnings.push(
|
|
293
|
+
`${pkg.name} requires ${peerName} ${peerRange}, found ${peerVersion}`,
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Check for direct install of internal packages
|
|
300
|
+
for (const name of SHOULD_NOT_DIRECT_INSTALL) {
|
|
301
|
+
if (deps[name]) {
|
|
302
|
+
warnings.push(
|
|
303
|
+
`${name} should not be installed directly — it is an internal dependency`,
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return warnings;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
async function collectInfo(
|
|
312
|
+
cwd: string,
|
|
313
|
+
projectPkg: Record<string, unknown>,
|
|
314
|
+
): Promise<InfoData> {
|
|
315
|
+
const pm = await getPackageManagerInfo(cwd);
|
|
316
|
+
const packages = collectPackages(ASSISTANT_UI_PACKAGES, cwd, projectPkg);
|
|
317
|
+
const ecosystem = collectPackages(ECOSYSTEM_PACKAGES, cwd, projectPkg);
|
|
318
|
+
const warnings = collectWarnings(packages, cwd, projectPkg);
|
|
319
|
+
|
|
320
|
+
return {
|
|
321
|
+
os: getOsInfo(),
|
|
322
|
+
node: process.version,
|
|
323
|
+
pm,
|
|
324
|
+
framework: detectFramework(projectPkg, cwd),
|
|
325
|
+
isMonorepo: findWorkspaceRoot(cwd) !== null,
|
|
326
|
+
packages,
|
|
327
|
+
ecosystem,
|
|
328
|
+
warnings,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// ---------------------------------------------------------------------------
|
|
333
|
+
// Rendering
|
|
334
|
+
// ---------------------------------------------------------------------------
|
|
335
|
+
|
|
336
|
+
function formatSection(label: string, items: PackageInfo[]): string[] {
|
|
337
|
+
if (items.length === 0) return [];
|
|
338
|
+
const lines: string[] = [];
|
|
339
|
+
lines.push("");
|
|
340
|
+
lines.push(`${label}:`);
|
|
341
|
+
const maxLen = Math.max(...items.map((p) => p.name.length));
|
|
342
|
+
for (const pkg of items) {
|
|
343
|
+
lines.push(` ${pkg.name.padEnd(maxLen)} ${pkg.version}`);
|
|
344
|
+
}
|
|
345
|
+
return lines;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
function renderPlain(data: InfoData): string[] {
|
|
349
|
+
const lines: string[] = [];
|
|
350
|
+
|
|
351
|
+
lines.push("Environment:");
|
|
352
|
+
lines.push(` OS: ${data.os}`);
|
|
353
|
+
lines.push(` Node.js: ${data.node}`);
|
|
354
|
+
lines.push(` Package Manager: ${data.pm.name} ${data.pm.version}`);
|
|
355
|
+
lines.push(` Framework: ${data.framework}`);
|
|
356
|
+
if (data.isMonorepo) {
|
|
357
|
+
lines.push(` Monorepo: yes`);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
lines.push(...formatSection("Packages", data.packages));
|
|
361
|
+
lines.push(...formatSection("Ecosystem", data.ecosystem));
|
|
362
|
+
|
|
363
|
+
if (data.warnings.length > 0) {
|
|
364
|
+
lines.push("");
|
|
365
|
+
lines.push("Warnings:");
|
|
366
|
+
for (const w of data.warnings) {
|
|
367
|
+
lines.push(` ! ${w}`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return lines;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function renderColored(data: InfoData): string[] {
|
|
375
|
+
const lines: string[] = [];
|
|
376
|
+
|
|
377
|
+
lines.push(chalk.bold("Environment:"));
|
|
378
|
+
lines.push(` OS: ${data.os}`);
|
|
379
|
+
lines.push(` Node.js: ${data.node}`);
|
|
380
|
+
lines.push(` Package Manager: ${data.pm.name} ${data.pm.version}`);
|
|
381
|
+
lines.push(` Framework: ${data.framework}`);
|
|
382
|
+
if (data.isMonorepo) {
|
|
383
|
+
lines.push(` Monorepo: yes`);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (data.packages.length > 0) {
|
|
387
|
+
const section = formatSection("Packages", data.packages);
|
|
388
|
+
section[0] = "";
|
|
389
|
+
section[1] = chalk.bold("Packages:");
|
|
390
|
+
lines.push(...section);
|
|
391
|
+
} else {
|
|
392
|
+
lines.push("");
|
|
393
|
+
lines.push(chalk.yellow(" No assistant-ui packages found."));
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
if (data.ecosystem.length > 0) {
|
|
397
|
+
const section = formatSection("Ecosystem", data.ecosystem);
|
|
398
|
+
section[0] = "";
|
|
399
|
+
section[1] = chalk.bold("Ecosystem:");
|
|
400
|
+
lines.push(...section);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
if (data.warnings.length > 0) {
|
|
404
|
+
lines.push("");
|
|
405
|
+
lines.push(chalk.yellow.bold("Warnings:"));
|
|
406
|
+
for (const w of data.warnings) {
|
|
407
|
+
lines.push(chalk.yellow(` ! ${w}`));
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
return lines;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// ---------------------------------------------------------------------------
|
|
415
|
+
// Command
|
|
416
|
+
// ---------------------------------------------------------------------------
|
|
417
|
+
|
|
418
|
+
export const info = new Command()
|
|
419
|
+
.name("info")
|
|
420
|
+
.description("Print environment and package information for bug reports.")
|
|
421
|
+
.option(
|
|
422
|
+
"-c, --cwd <cwd>",
|
|
423
|
+
"the working directory. defaults to the current directory.",
|
|
424
|
+
process.cwd(),
|
|
425
|
+
)
|
|
426
|
+
.action(async (opts) => {
|
|
427
|
+
const cwd = path.resolve(opts.cwd);
|
|
428
|
+
const packageJsonPath = path.join(cwd, "package.json");
|
|
429
|
+
|
|
430
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
431
|
+
console.error(
|
|
432
|
+
chalk.red("No package.json found in the current directory."),
|
|
433
|
+
);
|
|
434
|
+
process.exit(1);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
const projectPkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
438
|
+
const data = await collectInfo(cwd, projectPkg);
|
|
439
|
+
|
|
440
|
+
// Colored output for terminal
|
|
441
|
+
console.log("");
|
|
442
|
+
for (const line of renderColored(data)) {
|
|
443
|
+
console.log(line);
|
|
444
|
+
}
|
|
445
|
+
console.log("");
|
|
446
|
+
|
|
447
|
+
// Copyable plain text
|
|
448
|
+
const plain = renderPlain(data);
|
|
449
|
+
const block = ["```", ...plain, "```"].join("\n");
|
|
450
|
+
|
|
451
|
+
console.log(chalk.dim("— Copy the text below into your bug report —"));
|
|
452
|
+
console.log("");
|
|
453
|
+
console.log(block);
|
|
454
|
+
console.log("");
|
|
455
|
+
});
|
package/src/index.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { init } from "./commands/init";
|
|
|
8
8
|
import { update } from "./commands/update";
|
|
9
9
|
import { mcp } from "./commands/mcp";
|
|
10
10
|
import { agent } from "./commands/agent";
|
|
11
|
+
import { info } from "./commands/info";
|
|
11
12
|
|
|
12
13
|
process.on("SIGINT", () => process.exit(0));
|
|
13
14
|
process.on("SIGTERM", () => process.exit(0));
|
|
@@ -25,6 +26,7 @@ function main() {
|
|
|
25
26
|
program.addCommand(upgradeCommand);
|
|
26
27
|
program.addCommand(update);
|
|
27
28
|
program.addCommand(agent);
|
|
29
|
+
program.addCommand(info);
|
|
28
30
|
|
|
29
31
|
program.parse();
|
|
30
32
|
}
|