assistant-ui 0.0.83 → 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/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +1 -1
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +17 -3
- package/dist/commands/create.js.map +1 -1
- 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/dist/lib/create-project.d.ts +1 -1
- package/dist/lib/create-project.d.ts.map +1 -1
- package/dist/lib/create-project.js +19 -12
- package/dist/lib/create-project.js.map +1 -1
- package/package.json +7 -7
- package/src/commands/agent.ts +3 -1
- package/src/commands/create.ts +20 -6
- package/src/commands/info.ts +455 -0
- package/src/index.ts +2 -0
- package/src/lib/create-project.ts +21 -14
|
@@ -34,9 +34,12 @@ export async function downloadProject(repoPath, destDir, ref) {
|
|
|
34
34
|
const source = ref
|
|
35
35
|
? `gh:assistant-ui/assistant-ui/${repoPath}#${ref}`
|
|
36
36
|
: `gh:assistant-ui/assistant-ui/${repoPath}`;
|
|
37
|
-
// Suppress giget's
|
|
38
|
-
|
|
39
|
-
console.debug
|
|
37
|
+
// Suppress giget's debug output. The `debug` package (used by the upgrade
|
|
38
|
+
// command) sets process.env.DEBUG at module-load time, and giget logs to
|
|
39
|
+
// console.debug whenever that env var is truthy — even for unrelated
|
|
40
|
+
// namespaces. Temporarily unsetting it targets the root cause.
|
|
41
|
+
const origDebug = process.env.DEBUG;
|
|
42
|
+
delete process.env.DEBUG;
|
|
40
43
|
try {
|
|
41
44
|
const downloadPromise = downloadTemplate(source, {
|
|
42
45
|
dir: destDir,
|
|
@@ -55,7 +58,9 @@ export async function downloadProject(repoPath, destDir, ref) {
|
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
60
|
finally {
|
|
58
|
-
|
|
61
|
+
if (origDebug !== undefined) {
|
|
62
|
+
process.env.DEBUG = origDebug;
|
|
63
|
+
}
|
|
59
64
|
}
|
|
60
65
|
}
|
|
61
66
|
export async function resolvePackageManagerName(projectDir, packageManager) {
|
|
@@ -76,19 +81,19 @@ export async function transformProject(projectDir, opts) {
|
|
|
76
81
|
let shadcnUI;
|
|
77
82
|
if (!opts.hasLocalComponents) {
|
|
78
83
|
logger.step("Transforming project files...");
|
|
79
|
-
// 2–
|
|
80
|
-
// components — all independent, run in parallel
|
|
84
|
+
// 2–4. Transform tsconfig, CSS, and scan components in parallel
|
|
81
85
|
const [, , components] = await Promise.all([
|
|
82
86
|
transformTsConfig(projectDir),
|
|
83
87
|
transformCssFiles(projectDir),
|
|
84
88
|
scanRequiredComponents(projectDir),
|
|
85
|
-
removeWorkspaceComponents(projectDir),
|
|
86
89
|
]);
|
|
87
90
|
assistantUI = components.assistantUI;
|
|
88
91
|
shadcnUI = components.shadcnUI;
|
|
92
|
+
// 5. Remove workspace components (after scan completes — scan reads these files)
|
|
93
|
+
await removeWorkspaceComponents(projectDir);
|
|
89
94
|
}
|
|
90
95
|
// 6. Install dependencies
|
|
91
|
-
const pm = opts.packageManager
|
|
96
|
+
const pm = opts.packageManager;
|
|
92
97
|
if (!opts.skipInstall) {
|
|
93
98
|
logger.step("Installing dependencies...");
|
|
94
99
|
await installDependencies(projectDir, pm);
|
|
@@ -111,7 +116,7 @@ export async function transformProject(projectDir, opts) {
|
|
|
111
116
|
async function transformPackageJson(projectDir) {
|
|
112
117
|
const pkgPath = path.join(projectDir, "package.json");
|
|
113
118
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
114
|
-
// Remove @assistant-ui/ui (workspace-only package)
|
|
119
|
+
// Remove @assistant-ui/react-ui (workspace-only package)
|
|
115
120
|
if (pkg.dependencies?.["@assistant-ui/ui"]) {
|
|
116
121
|
delete pkg.dependencies["@assistant-ui/ui"];
|
|
117
122
|
}
|
|
@@ -189,9 +194,11 @@ async function transformCssFiles(projectDir) {
|
|
|
189
194
|
for (const file of cssFiles) {
|
|
190
195
|
const fullPath = path.join(projectDir, file);
|
|
191
196
|
try {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
197
|
+
const content = fs.readFileSync(fullPath, "utf-8");
|
|
198
|
+
const newContent = content.replace(/@source\s+["'][^"']*packages\/ui\/src[^"']*["'];\s*\n?/g, "");
|
|
199
|
+
if (newContent !== content) {
|
|
200
|
+
fs.writeFileSync(fullPath, newContent);
|
|
201
|
+
}
|
|
195
202
|
}
|
|
196
203
|
catch {
|
|
197
204
|
// Ignore files that cannot be read/written
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,0BAAuB;AAIxC,MAAM,UAAU,UAAU,CAAC,EAAsB;IAC/C,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3B,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3B,KAAK,KAAK;YACR,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACtB,KAAK,KAAK;YACR,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,wEAAwE,CACzE,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC3D,OAAO,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,OAAe,EACf,GAAY;IAEZ,MAAM,MAAM,GAAG,GAAG;QAChB,CAAC,CAAC,gCAAgC,QAAQ,IAAI,GAAG,EAAE;QACnD,CAAC,CAAC,gCAAgC,QAAQ,EAAE,CAAC;IAE/C,
|
|
1
|
+
{"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/lib/create-project.ts"],"names":[],"mappings":"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"}
|
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",
|
|
@@ -36,17 +36,17 @@
|
|
|
36
36
|
"giget": "^3.1.2",
|
|
37
37
|
"glob": "^13.0.6",
|
|
38
38
|
"jscodeshift": "^17.3.0",
|
|
39
|
-
"@assistant-ui/agent-launcher": "0.1.
|
|
39
|
+
"@assistant-ui/agent-launcher": "0.1.1"
|
|
40
40
|
},
|
|
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
|
-
"@types/node": "^25.
|
|
47
|
-
"@vitest/coverage-v8": "^4.0
|
|
48
|
-
"vitest": "^4.0
|
|
49
|
-
"@assistant-ui/x-buildutils": "0.0.
|
|
46
|
+
"@types/node": "^25.5.0",
|
|
47
|
+
"@vitest/coverage-v8": "^4.1.0",
|
|
48
|
+
"vitest": "^4.1.0",
|
|
49
|
+
"@assistant-ui/x-buildutils": "0.0.3"
|
|
50
50
|
},
|
|
51
51
|
"publishConfig": {
|
|
52
52
|
"access": "public",
|
package/src/commands/agent.ts
CHANGED
|
@@ -16,7 +16,9 @@ function getPluginPath(): string {
|
|
|
16
16
|
for (const candidate of candidates) {
|
|
17
17
|
if (existsSync(candidate)) return candidate;
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
throw new Error(
|
|
20
|
+
`Could not locate the assistant-ui plugin directory. Checked:\n${candidates.map((c) => ` ${c}`).join("\n")}`,
|
|
21
|
+
);
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
export const agent = new Command()
|
package/src/commands/create.ts
CHANGED
|
@@ -82,6 +82,14 @@ export const PROJECT_METADATA: ProjectMetadata[] = [
|
|
|
82
82
|
path: "examples/with-ag-ui",
|
|
83
83
|
hasLocalComponents: false,
|
|
84
84
|
},
|
|
85
|
+
{
|
|
86
|
+
name: "with-google-adk",
|
|
87
|
+
label: "Google ADK",
|
|
88
|
+
description: "Google ADK agent integration",
|
|
89
|
+
category: "example",
|
|
90
|
+
path: "examples/with-google-adk",
|
|
91
|
+
hasLocalComponents: false,
|
|
92
|
+
},
|
|
85
93
|
{
|
|
86
94
|
name: "with-ai-sdk-v6",
|
|
87
95
|
label: "AI SDK v6",
|
|
@@ -397,12 +405,17 @@ export const create = new Command()
|
|
|
397
405
|
.option("--use-yarn", "explicitly use yarn")
|
|
398
406
|
.option("--use-bun", "explicitly use bun")
|
|
399
407
|
.option("--native", "create an Expo / React Native project")
|
|
408
|
+
.option("--ink", "create a React Ink terminal project")
|
|
400
409
|
.option("--skip-install", "skip installing packages")
|
|
401
410
|
.action(async (projectDirectory, opts) => {
|
|
402
411
|
if (opts.native) {
|
|
403
412
|
opts.example = "with-expo";
|
|
404
413
|
}
|
|
405
414
|
|
|
415
|
+
if (opts.ink) {
|
|
416
|
+
opts.example = "with-react-ink";
|
|
417
|
+
}
|
|
418
|
+
|
|
406
419
|
if (opts.example && opts.preset) {
|
|
407
420
|
logger.error("Cannot use --preset with --example.");
|
|
408
421
|
process.exit(1);
|
|
@@ -455,18 +468,19 @@ export const create = new Command()
|
|
|
455
468
|
);
|
|
456
469
|
process.exit(1);
|
|
457
470
|
}
|
|
458
|
-
} catch (err:
|
|
459
|
-
|
|
471
|
+
} catch (err: unknown) {
|
|
472
|
+
const code =
|
|
473
|
+
err instanceof Error ? (err as NodeJS.ErrnoException).code : undefined;
|
|
474
|
+
if (code === "ENOENT") {
|
|
460
475
|
// Directory doesn't exist — good, proceed
|
|
461
|
-
} else if (
|
|
476
|
+
} else if (code === "ENOTDIR") {
|
|
462
477
|
logger.error(
|
|
463
478
|
`${resolvedProjectDirectory} already exists and is not a directory`,
|
|
464
479
|
);
|
|
465
480
|
process.exit(1);
|
|
466
481
|
} else {
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
);
|
|
482
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
483
|
+
logger.error(`Cannot access ${resolvedProjectDirectory}: ${message}`);
|
|
470
484
|
process.exit(1);
|
|
471
485
|
}
|
|
472
486
|
}
|
|
@@ -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
|
+
});
|