assistant-ui 0.0.112 → 0.0.114
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codemods/v0-12/assistant-api-to-aui.d.ts.map +1 -1
- package/dist/codemods/v0-12/assistant-api-to-aui.js +87 -62
- package/dist/codemods/v0-12/assistant-api-to-aui.js.map +1 -1
- package/dist/codemods/v0-12/primitive-if-to-aui-if.d.ts.map +1 -1
- package/dist/codemods/v0-12/primitive-if-to-aui-if.js +31 -45
- package/dist/codemods/v0-12/primitive-if-to-aui-if.js.map +1 -1
- package/dist/commands/add.d.ts +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +4 -2
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +33 -10
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +2 -1
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +4 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +52 -40
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/update.js +6 -7
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +5 -2
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/index.js +2 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-skill.d.ts +1 -1
- package/dist/lib/agent-skill.d.ts.map +1 -1
- package/dist/lib/agent-skill.js.map +1 -1
- package/dist/lib/create-project.d.ts +11 -3
- package/dist/lib/create-project.d.ts.map +1 -1
- package/dist/lib/create-project.js +127 -43
- package/dist/lib/create-project.js.map +1 -1
- package/dist/lib/handle-cli-error.d.ts +5 -0
- package/dist/lib/handle-cli-error.d.ts.map +1 -0
- package/dist/lib/handle-cli-error.js +17 -0
- package/dist/lib/handle-cli-error.js.map +1 -0
- package/dist/lib/install-ai-sdk-lib.js +8 -1
- package/dist/lib/install-ai-sdk-lib.js.map +1 -1
- package/dist/lib/install-edge-lib.js +4 -8
- package/dist/lib/install-edge-lib.js.map +1 -1
- package/dist/lib/run-spawn.d.ts +16 -2
- package/dist/lib/run-spawn.d.ts.map +1 -1
- package/dist/lib/run-spawn.js +87 -9
- package/dist/lib/run-spawn.js.map +1 -1
- package/dist/lib/transform.d.ts +1 -1
- package/dist/lib/transform.d.ts.map +1 -1
- package/dist/lib/transform.js +12 -25
- package/dist/lib/transform.js.map +1 -1
- package/dist/lib/upgrade.js +20 -16
- package/dist/lib/upgrade.js.map +1 -1
- package/dist/lib/utils/file-scanner.d.ts +9 -1
- package/dist/lib/utils/file-scanner.d.ts.map +1 -1
- package/dist/lib/utils/file-scanner.js +22 -20
- package/dist/lib/utils/file-scanner.js.map +1 -1
- package/dist/lib/utils/package-installer.js +1 -1
- package/dist/lib/utils/package-manager.d.ts +3 -1
- package/dist/lib/utils/package-manager.d.ts.map +1 -1
- package/dist/lib/utils/package-manager.js +22 -10
- package/dist/lib/utils/package-manager.js.map +1 -1
- package/package.json +7 -7
- package/plugin/skills/assistant-ui/SKILL.md +4 -4
- package/src/codemods/v0-12/__tests__/assistant-api-to-aui.test.ts +370 -0
- package/src/codemods/v0-12/__tests__/primitive-if-to-aui-if.test.ts +100 -0
- package/src/codemods/v0-12/assistant-api-to-aui.ts +227 -134
- package/src/codemods/v0-12/primitive-if-to-aui-if.ts +44 -72
- package/src/commands/add.ts +5 -5
- package/src/commands/create.ts +41 -7
- package/src/commands/info.ts +1 -0
- package/src/commands/init.ts +4 -6
- package/src/commands/mcp.ts +57 -41
- package/src/commands/update.ts +6 -8
- package/src/commands/upgrade.ts +5 -2
- package/src/index.ts +2 -7
- package/src/lib/agent-skill.ts +2 -1
- package/src/lib/create-project.test.ts +175 -0
- package/src/lib/create-project.ts +189 -59
- package/src/lib/handle-cli-error.test.ts +67 -0
- package/src/lib/handle-cli-error.ts +17 -0
- package/src/lib/install-ai-sdk-lib.ts +13 -1
- package/src/lib/install-edge-lib.ts +7 -8
- package/src/lib/run-spawn.test.ts +148 -0
- package/src/lib/run-spawn.ts +121 -11
- package/src/lib/transform.test.ts +87 -0
- package/src/lib/transform.ts +21 -37
- package/src/lib/upgrade.ts +23 -19
- package/src/lib/utils/file-scanner.ts +26 -20
- package/src/lib/utils/package-manager.ts +29 -12
package/dist/commands/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","names":[],"sources":["../../src/commands/mcp.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { spawn } from \"cross-spawn\";\nimport { logger } from \"../lib/utils/logger\";\nimport * as p from \"@clack/prompts\";\n\ntype MCPTarget =\n | \"cursor\"\n | \"windsurf\"\n | \"vscode\"\n | \"zed\"\n | \"claude-code\"\n | \"claude-desktop\";\n\nconst MCP_CONFIGS: Record<\n Exclude<MCPTarget, \"claude-code\">,\n {\n name: string;\n getPath: () => string;\n config: object;\n postInstall?: string;\n }\n> = {\n cursor: {\n name: \"Cursor\",\n getPath: () => path.join(process.cwd(), \".cursor\", \"mcp.json\"),\n config: {\n mcpServers: {\n \"assistant-ui\": {\n command: \"npx\",\n args: [\"-y\", \"@assistant-ui/mcp-docs-server\"],\n },\n },\n },\n postInstall:\n \"Open Cursor Settings → MCP → find 'assistant-ui' and click enable.\",\n },\n windsurf: {\n name: \"Windsurf\",\n getPath: () =>\n path.join(os.homedir(), \".codeium\", \"windsurf\", \"mcp_config.json\"),\n config: {\n mcpServers: {\n \"assistant-ui\": {\n command: \"npx\",\n args: [\"-y\", \"@assistant-ui/mcp-docs-server\"],\n },\n },\n },\n postInstall: \"Fully quit and re-open Windsurf to activate.\",\n },\n vscode: {\n name: \"VSCode\",\n getPath: () => path.join(process.cwd(), \".vscode\", \"mcp.json\"),\n config: {\n servers: {\n \"assistant-ui\": {\n command: \"npx\",\n args: [\"-y\", \"@assistant-ui/mcp-docs-server\"],\n type: \"stdio\",\n },\n },\n },\n postInstall:\n \"Enable MCP in Settings → search 'MCP' → enable 'Chat > MCP'. Use Copilot Chat in Agent mode.\",\n },\n zed: {\n name: \"Zed\",\n getPath: () => {\n if (process.platform === \"win32\") {\n return path.join(process.env.APPDATA || \"\", \"Zed\", \"settings.json\");\n }\n if (process.platform === \"darwin\") {\n return path.join(os.homedir(), \".zed\", \"settings.json\");\n }\n return path.join(os.homedir(), \".config\", \"zed\", \"settings.json\");\n },\n config: {\n context_servers: {\n \"assistant-ui\": {\n command: {\n path: \"npx\",\n args: [\"-y\", \"@assistant-ui/mcp-docs-server\"],\n },\n },\n },\n },\n postInstall: \"The server starts automatically with the Assistant Panel.\",\n },\n \"claude-desktop\": {\n name: \"Claude Desktop\",\n getPath: () => {\n if (process.platform === \"win32\") {\n return path.join(\n process.env.APPDATA || \"\",\n \"Claude\",\n \"claude_desktop_config.json\",\n );\n }\n return path.join(\n os.homedir(),\n \"Library\",\n \"Application Support\",\n \"Claude\",\n \"claude_desktop_config.json\",\n );\n },\n config: {\n mcpServers: {\n \"assistant-ui\": {\n command: \"npx\",\n args: [\"-y\", \"@assistant-ui/mcp-docs-server\"],\n },\n },\n },\n postInstall: \"Restart Claude Desktop to activate.\",\n },\n};\n\nfunction deepMerge(target: any, source: any): any {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n if (\n source[key] &&\n typeof source[key] === \"object\" &&\n !Array.isArray(source[key])\n ) {\n result[key] = deepMerge(result[key] || {}, source[key]);\n } else {\n result[key] = source[key];\n }\n }\n return result;\n}\n\nclass McpConfigParseError extends Error {\n constructor(targetName: string, configPath: string, flag: string) {\n super(\n `Invalid ${targetName} MCP config JSON at ${configPath}. Fix the JSON syntax, then run: assistant-ui mcp ${flag}`,\n );\n this.name = \"McpConfigParseError\";\n }\n}\n\nconst getTargetFlag = (target: Exclude<MCPTarget, \"claude-code\">) =>\n `--${target}`;\n\nasync function installForTarget(target: MCPTarget): Promise<void> {\n if (target === \"claude-code\") {\n logger.info(\"Installing MCP server for Claude Code...\");\n logger.break();\n\n const child = spawn(\n \"claude\",\n [\n \"mcp\",\n \"add\",\n \"assistant-ui\",\n \"--\",\n \"npx\",\n \"-y\",\n \"@assistant-ui/mcp-docs-server\",\n ],\n {\n stdio: \"inherit\",\n },\n );\n\n return new Promise((resolve, reject) => {\n child.on(\"error\", (error) => {\n logger.error(`Failed to install: ${error.message}`);\n logger.info(\n \"Make sure Claude Code CLI is installed: https://docs.anthropic.com/en/docs/claude-code\",\n );\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n if (code !== 0) {\n logger.error(`Installation failed with code ${code}`);\n reject(new Error(`Exit code ${code}`));\n } else {\n logger.break();\n logger.success(\"MCP server installed for Claude Code!\");\n logger.info(\n \"The server starts automatically. Try asking about assistant-ui!\",\n );\n resolve();\n }\n });\n });\n }\n\n if (target === \"claude-desktop\" && process.platform === \"linux\") {\n logger.error(\"Claude Desktop is not available on Linux.\");\n logger.info(\n \"See: https://claude.ai/download for supported operating systems.\",\n );\n throw new Error(\"Unsupported platform for Claude Desktop\");\n }\n\n const targetConfig = MCP_CONFIGS[target];\n const configPath = targetConfig.getPath();\n const configDir = path.dirname(configPath);\n\n logger.info(`Installing MCP server for ${targetConfig.name}...`);\n\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n let existingConfig: any = {};\n if (fs.existsSync(configPath)) {\n const content = fs.readFileSync(configPath, \"utf-8\");\n try {\n existingConfig = JSON.parse(content);\n } catch {\n const flag = getTargetFlag(target);\n logger.error(`Could not parse ${targetConfig.name} MCP config.`);\n logger.info(`Config path: ${configPath}`);\n logger.info(\n `Fix the JSON syntax in that file, then run: assistant-ui mcp ${flag}`,\n );\n logger.info(\"No changes were written.\");\n throw new McpConfigParseError(targetConfig.name, configPath, flag);\n }\n }\n\n const newConfig = deepMerge(existingConfig, targetConfig.config);\n\n fs.writeFileSync(configPath, `${JSON.stringify(newConfig, null, 2)}\\n`);\n\n logger.break();\n logger.success(`MCP server installed for ${targetConfig.name}!`);\n logger.info(`Config written to: ${configPath}`);\n\n if (targetConfig.postInstall) {\n logger.break();\n logger.info(targetConfig.postInstall);\n }\n}\n\nexport const mcp = new Command()\n .name(\"mcp\")\n .description(\"install assistant-ui MCP docs server for your IDE\")\n .option(\"--cursor\", \"install for Cursor\")\n .option(\"--windsurf\", \"install for Windsurf\")\n .option(\"--vscode\", \"install for VSCode\")\n .option(\"--zed\", \"install for Zed\")\n .option(\"--claude-code\", \"install for Claude Code\")\n .option(\"--claude-desktop\", \"install for Claude Desktop\")\n .action(async (opts) => {\n const targets: MCPTarget[] = [];\n\n if (opts.cursor) targets.push(\"cursor\");\n if (opts.windsurf) targets.push(\"windsurf\");\n if (opts.vscode) targets.push(\"vscode\");\n if (opts.zed) targets.push(\"zed\");\n if (opts.claudeCode) targets.push(\"claude-code\");\n if (opts.claudeDesktop) targets.push(\"claude-desktop\");\n\n // If no target specified, prompt user\n if (targets.length === 0) {\n p.intro(\"assistant-ui MCP Server Installation\");\n\n const selected = await p.select({\n message: \"Select your IDE or tool:\",\n options: [\n { value: \"cursor\", label: \"Cursor\" },\n { value: \"windsurf\", label: \"Windsurf\" },\n { value: \"vscode\", label: \"VSCode\" },\n { value: \"zed\", label: \"Zed\" },\n { value: \"claude-code\", label: \"Claude Code\" },\n { value: \"claude-desktop\", label: \"Claude Desktop\" },\n ],\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Installation cancelled.\");\n process.exit(0);\n }\n\n targets.push(selected as MCPTarget);\n }\n\n for (const target of targets) {\n try {\n await installForTarget(target);\n } catch {\n process.exit(1);\n }\n }\n });\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp.js","names":[],"sources":["../../src/commands/mcp.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { logger } from \"../lib/utils/logger\";\nimport { runSpawn, SpawnExitError, SpawnSignalError } from \"../lib/run-spawn\";\nimport * as p from \"@clack/prompts\";\n\ntype MCPTarget =\n | \"cursor\"\n | \"windsurf\"\n | \"vscode\"\n | \"zed\"\n | \"claude-code\"\n | \"claude-desktop\";\n\nconst HOSTED_MCP_URL = \"https://www.assistant-ui.com/mcp\";\n\nconst MCP_CONFIGS: Record<\n Exclude<MCPTarget, \"claude-code\">,\n {\n name: string;\n getPath: () => string;\n config: object;\n replaceServerKey?: string;\n postInstall?: string;\n }\n> = {\n cursor: {\n name: \"Cursor\",\n getPath: () => path.join(process.cwd(), \".cursor\", \"mcp.json\"),\n config: {\n mcpServers: {\n \"assistant-ui\": {\n url: HOSTED_MCP_URL,\n },\n },\n },\n replaceServerKey: \"mcpServers\",\n postInstall:\n \"Open Cursor Settings → MCP → find 'assistant-ui' and click enable.\",\n },\n windsurf: {\n name: \"Windsurf\",\n getPath: () =>\n path.join(os.homedir(), \".codeium\", \"windsurf\", \"mcp_config.json\"),\n config: {\n mcpServers: {\n \"assistant-ui\": {\n serverUrl: HOSTED_MCP_URL,\n },\n },\n },\n replaceServerKey: \"mcpServers\",\n postInstall: \"Fully quit and re-open Windsurf to activate.\",\n },\n vscode: {\n name: \"VSCode\",\n getPath: () => path.join(process.cwd(), \".vscode\", \"mcp.json\"),\n config: {\n servers: {\n \"assistant-ui\": {\n type: \"http\",\n url: HOSTED_MCP_URL,\n },\n },\n },\n replaceServerKey: \"servers\",\n postInstall:\n \"Enable MCP in Settings → search 'MCP' → enable 'Chat > MCP'. Use Copilot Chat in Agent mode.\",\n },\n zed: {\n name: \"Zed\",\n getPath: () => {\n if (process.platform === \"win32\") {\n return path.join(process.env.APPDATA || \"\", \"Zed\", \"settings.json\");\n }\n if (process.platform === \"darwin\") {\n return path.join(os.homedir(), \".zed\", \"settings.json\");\n }\n return path.join(os.homedir(), \".config\", \"zed\", \"settings.json\");\n },\n config: {\n context_servers: {\n \"assistant-ui\": {\n command: {\n path: \"npx\",\n args: [\"-y\", \"@assistant-ui/mcp-docs-server\"],\n },\n },\n },\n },\n postInstall: \"The server starts automatically with the Assistant Panel.\",\n },\n \"claude-desktop\": {\n name: \"Claude Desktop\",\n getPath: () => {\n if (process.platform === \"win32\") {\n return path.join(\n process.env.APPDATA || \"\",\n \"Claude\",\n \"claude_desktop_config.json\",\n );\n }\n return path.join(\n os.homedir(),\n \"Library\",\n \"Application Support\",\n \"Claude\",\n \"claude_desktop_config.json\",\n );\n },\n config: {\n mcpServers: {\n \"assistant-ui\": {\n command: \"npx\",\n args: [\"-y\", \"@assistant-ui/mcp-docs-server\"],\n },\n },\n },\n postInstall: \"Restart Claude Desktop to activate.\",\n },\n};\n\nfunction deepMerge(target: any, source: any): any {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n if (\n source[key] &&\n typeof source[key] === \"object\" &&\n !Array.isArray(source[key])\n ) {\n result[key] = deepMerge(result[key] || {}, source[key]);\n } else {\n result[key] = source[key];\n }\n }\n return result;\n}\n\nclass McpConfigParseError extends Error {\n constructor(targetName: string, configPath: string, flag: string) {\n super(\n `Invalid ${targetName} MCP config JSON at ${configPath}. Fix the JSON syntax, then run: assistant-ui mcp ${flag}`,\n );\n this.name = \"McpConfigParseError\";\n }\n}\n\nconst getTargetFlag = (target: Exclude<MCPTarget, \"claude-code\">) =>\n `--${target}`;\n\nasync function installForTarget(target: MCPTarget): Promise<void> {\n if (target === \"claude-code\") {\n logger.info(\"Installing MCP server for Claude Code...\");\n logger.break();\n\n try {\n await runSpawn(\"claude\", [\"mcp\", \"remove\", \"assistant-ui\"]).catch(\n (error: unknown) => {\n if (error instanceof SpawnSignalError) throw error;\n },\n );\n await runSpawn(\"claude\", [\n \"mcp\",\n \"add\",\n \"--transport\",\n \"http\",\n \"assistant-ui\",\n HOSTED_MCP_URL,\n ]);\n } catch (error) {\n if (error instanceof SpawnSignalError) throw error;\n if (error instanceof SpawnExitError) {\n logger.error(`Installation failed with code ${error.code}`);\n } else if (error instanceof Error) {\n logger.error(`Failed to install: ${error.message}`);\n logger.info(\n \"Make sure Claude Code CLI is installed: https://docs.anthropic.com/en/docs/claude-code\",\n );\n }\n throw error;\n }\n\n logger.break();\n logger.success(\"MCP server installed for Claude Code!\");\n logger.info(\n `Connects to the hosted assistant-ui MCP server at ${HOSTED_MCP_URL}.`,\n );\n logger.info(\n \"The server starts automatically. Try asking about assistant-ui!\",\n );\n return;\n }\n\n if (target === \"claude-desktop\" && process.platform === \"linux\") {\n logger.error(\"Claude Desktop is not available on Linux.\");\n logger.info(\n \"See: https://claude.ai/download for supported operating systems.\",\n );\n throw new Error(\"Unsupported platform for Claude Desktop\");\n }\n\n const targetConfig = MCP_CONFIGS[target];\n const configPath = targetConfig.getPath();\n const configDir = path.dirname(configPath);\n\n logger.info(`Installing MCP server for ${targetConfig.name}...`);\n\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n\n let existingConfig: any = {};\n if (fs.existsSync(configPath)) {\n const content = fs.readFileSync(configPath, \"utf-8\");\n try {\n existingConfig = JSON.parse(content);\n } catch {\n const flag = getTargetFlag(target);\n logger.error(`Could not parse ${targetConfig.name} MCP config.`);\n logger.info(`Config path: ${configPath}`);\n logger.info(\n `Fix the JSON syntax in that file, then run: assistant-ui mcp ${flag}`,\n );\n logger.info(\"No changes were written.\");\n throw new McpConfigParseError(targetConfig.name, configPath, flag);\n }\n }\n\n const newConfig = deepMerge(existingConfig, targetConfig.config);\n\n if (targetConfig.replaceServerKey) {\n const key = targetConfig.replaceServerKey;\n newConfig[key] = {\n ...newConfig[key],\n \"assistant-ui\": (targetConfig.config as any)[key][\"assistant-ui\"],\n };\n }\n\n fs.writeFileSync(configPath, `${JSON.stringify(newConfig, null, 2)}\\n`);\n\n logger.break();\n logger.success(`MCP server installed for ${targetConfig.name}!`);\n logger.info(`Config written to: ${configPath}`);\n\n if (targetConfig.replaceServerKey) {\n logger.break();\n logger.info(\n `Connects to the hosted assistant-ui MCP server at ${HOSTED_MCP_URL}.`,\n );\n }\n\n if (targetConfig.postInstall) {\n logger.break();\n logger.info(targetConfig.postInstall);\n }\n}\n\nexport const mcp = new Command()\n .name(\"mcp\")\n .description(\"connect your IDE to the assistant-ui MCP server\")\n .option(\"--cursor\", \"install for Cursor\")\n .option(\"--windsurf\", \"install for Windsurf\")\n .option(\"--vscode\", \"install for VSCode\")\n .option(\"--zed\", \"install for Zed\")\n .option(\"--claude-code\", \"install for Claude Code\")\n .option(\"--claude-desktop\", \"install for Claude Desktop\")\n .action(async (opts) => {\n const targets: MCPTarget[] = [];\n\n if (opts.cursor) targets.push(\"cursor\");\n if (opts.windsurf) targets.push(\"windsurf\");\n if (opts.vscode) targets.push(\"vscode\");\n if (opts.zed) targets.push(\"zed\");\n if (opts.claudeCode) targets.push(\"claude-code\");\n if (opts.claudeDesktop) targets.push(\"claude-desktop\");\n\n // If no target specified, prompt user\n if (targets.length === 0) {\n p.intro(\"assistant-ui MCP Server Installation\");\n\n const selected = await p.select({\n message: \"Select your IDE or tool:\",\n options: [\n { value: \"cursor\", label: \"Cursor\" },\n { value: \"windsurf\", label: \"Windsurf\" },\n { value: \"vscode\", label: \"VSCode\" },\n { value: \"zed\", label: \"Zed\" },\n { value: \"claude-code\", label: \"Claude Code\" },\n { value: \"claude-desktop\", label: \"Claude Desktop\" },\n ],\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Installation cancelled.\");\n process.exit(0);\n }\n\n targets.push(selected as MCPTarget);\n }\n\n for (const target of targets) {\n try {\n await installForTarget(target);\n } catch (error) {\n if (error instanceof SpawnSignalError) throw error;\n process.exit(1);\n }\n }\n });\n"],"mappings":"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"}
|
package/dist/commands/update.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import { SpawnExitError, SpawnSignalError, runSpawn } from "../lib/run-spawn.js";
|
|
1
2
|
import { logger } from "../lib/utils/logger.js";
|
|
2
3
|
import { getInstallCommand } from "../lib/utils/package-manager.js";
|
|
3
4
|
import { logPackageJsonParseError } from "../lib/utils/package-json.js";
|
|
4
5
|
import { Command } from "commander";
|
|
5
6
|
import fs from "node:fs";
|
|
6
7
|
import path from "node:path";
|
|
7
|
-
import { sync } from "cross-spawn";
|
|
8
8
|
//#region src/commands/update.ts
|
|
9
9
|
const update = new Command().name("update").description("Update all '@assistant-ui/*' and 'assistant-*' packages in package.json to latest versions using your package manager.").option("--dry", "Print the package manager command instead of running it.").option("-c, --cwd <cwd>", "the working directory. defaults to the current directory.", process.cwd()).action(async (opts) => {
|
|
10
10
|
const packageJsonPath = path.join(opts.cwd, "package.json");
|
|
@@ -43,13 +43,12 @@ const update = new Command().name("update").description("Update all '@assistant-
|
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
45
45
|
logger.step("Updating packages...");
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (result.status !== 0) {
|
|
46
|
+
try {
|
|
47
|
+
await runSpawn(installCmd.command, installCmd.args, opts.cwd);
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (error instanceof SpawnSignalError) throw error;
|
|
51
50
|
logger.error("Package manager update failed.");
|
|
52
|
-
process.exit(
|
|
51
|
+
process.exit(error instanceof SpawnExitError ? error.code : 1);
|
|
53
52
|
}
|
|
54
53
|
logger.break();
|
|
55
54
|
logger.success("All packages updated to latest version!");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","names":[
|
|
1
|
+
{"version":3,"file":"update.js","names":[],"sources":["../../src/commands/update.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { logger } from \"../lib/utils/logger\";\nimport { logPackageJsonParseError } from \"../lib/utils/package-json\";\nimport { getInstallCommand } from \"../lib/utils/package-manager\";\nimport { runSpawn, SpawnExitError, SpawnSignalError } from \"../lib/run-spawn\";\n\nexport const update = new Command()\n .name(\"update\")\n .description(\n \"Update all '@assistant-ui/*' and 'assistant-*' packages in package.json to latest versions using your package manager.\",\n )\n .option(\"--dry\", \"Print the package manager command instead of running it.\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .action(async (opts) => {\n const packageJsonPath = path.join(opts.cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) {\n logger.error(\"No package.json found in the current directory.\");\n process.exit(1);\n }\n\n const packageJsonContent = fs.readFileSync(packageJsonPath, \"utf-8\");\n let pkg: Record<string, Record<string, string> | undefined>;\n try {\n pkg = JSON.parse(packageJsonContent);\n } catch {\n logPackageJsonParseError(packageJsonPath, \"update\");\n console.error(\"No changes were written.\");\n process.exit(1);\n }\n const sections = [\"dependencies\", \"devDependencies\"];\n const targets: string[] = [];\n\n for (const section of sections) {\n if (!pkg[section]) continue;\n for (const dep in pkg[section]) {\n if (\n dep.startsWith(\"@assistant-ui/\") ||\n dep === \"assistant-stream\" ||\n dep === \"assistant-cloud\"\n ) {\n targets.push(dep);\n }\n }\n }\n\n if (!targets.length) {\n logger.warn(\"No matching packages found to update.\");\n return;\n }\n\n logger.info(`Found ${targets.length} package(s) to update:`);\n targets.forEach((pkg) => {\n logger.info(` - ${pkg}`);\n });\n logger.break();\n\n // Build command using the utility\n const installCmd = await getInstallCommand(\n targets.map((d) => `${d}@latest`),\n opts.cwd,\n );\n\n if (opts.dry) {\n logger.info(\"Dry run: would run the following command:\");\n logger.info(` ${installCmd.command} ${installCmd.args.join(\" \")}`);\n return;\n }\n\n logger.step(\"Updating packages...\");\n try {\n await runSpawn(installCmd.command, installCmd.args, opts.cwd);\n } catch (error) {\n if (error instanceof SpawnSignalError) throw error;\n logger.error(\"Package manager update failed.\");\n process.exit(error instanceof SpawnExitError ? error.code : 1);\n }\n\n logger.break();\n logger.success(\"All packages updated to latest version!\");\n });\n"],"mappings":";;;;;;;;AAQA,MAAa,SAAS,IAAI,QAAQ,CAAC,CAChC,KAAK,QAAQ,CAAC,CACd,YACC,wHACF,CAAC,CACA,OAAO,SAAS,0DAA0D,CAAC,CAC3E,OACC,mBACA,6DACA,QAAQ,IAAI,CACd,CAAC,CACA,OAAO,OAAO,SAAS;CACtB,MAAM,kBAAkB,KAAK,KAAK,KAAK,KAAK,cAAc;CAC1D,IAAI,CAAC,GAAG,WAAW,eAAe,GAAG;EACnC,OAAO,MAAM,iDAAiD;EAC9D,QAAQ,KAAK,CAAC;CAChB;CAEA,MAAM,qBAAqB,GAAG,aAAa,iBAAiB,OAAO;CACnE,IAAI;CACJ,IAAI;EACF,MAAM,KAAK,MAAM,kBAAkB;CACrC,QAAQ;EACN,yBAAyB,iBAAiB,QAAQ;EAClD,QAAQ,MAAM,0BAA0B;EACxC,QAAQ,KAAK,CAAC;CAChB;CACA,MAAM,WAAW,CAAC,gBAAgB,iBAAiB;CACnD,MAAM,UAAoB,CAAC;CAE3B,KAAK,MAAM,WAAW,UAAU;EAC9B,IAAI,CAAC,IAAI,UAAU;EACnB,KAAK,MAAM,OAAO,IAAI,UACpB,IACE,IAAI,WAAW,gBAAgB,KAC/B,QAAQ,sBACR,QAAQ,mBAER,QAAQ,KAAK,GAAG;CAGtB;CAEA,IAAI,CAAC,QAAQ,QAAQ;EACnB,OAAO,KAAK,uCAAuC;EACnD;CACF;CAEA,OAAO,KAAK,SAAS,QAAQ,OAAO,uBAAuB;CAC3D,QAAQ,SAAS,QAAQ;EACvB,OAAO,KAAK,OAAO,KAAK;CAC1B,CAAC;CACD,OAAO,MAAM;CAGb,MAAM,aAAa,MAAM,kBACvB,QAAQ,KAAK,MAAM,GAAG,EAAE,QAAQ,GAChC,KAAK,GACP;CAEA,IAAI,KAAK,KAAK;EACZ,OAAO,KAAK,2CAA2C;EACvD,OAAO,KAAK,KAAK,WAAW,QAAQ,GAAG,WAAW,KAAK,KAAK,GAAG,GAAG;EAClE;CACF;CAEA,OAAO,KAAK,sBAAsB;CAClC,IAAI;EACF,MAAM,SAAS,WAAW,SAAS,WAAW,MAAM,KAAK,GAAG;CAC9D,SAAS,OAAO;EACd,IAAI,iBAAiB,kBAAkB,MAAM;EAC7C,OAAO,MAAM,gCAAgC;EAC7C,QAAQ,KAAK,iBAAiB,iBAAiB,MAAM,OAAO,CAAC;CAC/D;CAEA,OAAO,MAAM;CACb,OAAO,QAAQ,yCAAyC;AAC1D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.d.ts","names":[],"sources":["../../src/commands/upgrade.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"upgrade.d.ts","names":[],"sources":["../../src/commands/upgrade.ts"],"mappings":";;UAMiB;EACf;EACA;EACA;EACA;;cAiBW,gBAAc;cAqBd,gBAAc"}
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SpawnSignalError } from "../lib/run-spawn.js";
|
|
1
2
|
import { transform } from "../lib/transform.js";
|
|
2
3
|
import { upgrade } from "../lib/upgrade.js";
|
|
3
4
|
import { Command } from "commander";
|
|
@@ -8,10 +9,11 @@ debug.enable("codemod:*");
|
|
|
8
9
|
const addTransformOptions = (command) => {
|
|
9
10
|
return command.option("-d, --dry", "Dry run (no changes are made to files)").option("-p, --print", "Print transformed files to stdout").option("--verbose", "Show more information about the transform process").option("-j, --jscodeshift <options>", "Pass options directly to jscodeshift");
|
|
10
11
|
};
|
|
11
|
-
const codemodCommand = addTransformOptions(new Command().name("codemod").description("CLI tool for running codemods").argument("<codemod>", "Codemod to run (e.g., rewrite-framework-imports)").argument("<source>", "Path to source files or directory to transform")).action((codemod, source, options) => {
|
|
12
|
+
const codemodCommand = addTransformOptions(new Command().name("codemod").description("CLI tool for running codemods").argument("<codemod>", "Codemod to run (e.g., rewrite-framework-imports)").argument("<source>", "Path to source files or directory to transform")).action(async (codemod, source, options) => {
|
|
12
13
|
try {
|
|
13
|
-
transform(codemod, source, options);
|
|
14
|
+
await transform(codemod, source, options);
|
|
14
15
|
} catch (err) {
|
|
16
|
+
if (err instanceof SpawnSignalError) throw err;
|
|
15
17
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
16
18
|
const errorStack = err instanceof Error ? err.stack : void 0;
|
|
17
19
|
error(`Error transforming: ${errorMessage}`);
|
|
@@ -23,6 +25,7 @@ const upgradeCommand = addTransformOptions(new Command().command("upgrade").desc
|
|
|
23
25
|
try {
|
|
24
26
|
await upgrade(options);
|
|
25
27
|
} catch (err) {
|
|
28
|
+
if (err instanceof SpawnSignalError) throw err;
|
|
26
29
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
27
30
|
const errorStack = err instanceof Error ? err.stack : void 0;
|
|
28
31
|
error(`Error upgrading: ${errorMessage}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","names":[],"sources":["../../src/commands/upgrade.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { transform } from \"../lib/transform\";\nimport { upgrade } from \"../lib/upgrade\";\nimport debug from \"debug\";\n\nexport interface TransformOptions {\n dry?: boolean;\n print?: boolean;\n verbose?: boolean;\n jscodeshift?: string;\n}\n\nconst error = debug(\"codemod:error\");\ndebug.enable(\"codemod:*\");\n\nconst addTransformOptions = (command: Command): Command => {\n return command\n .option(\"-d, --dry\", \"Dry run (no changes are made to files)\")\n .option(\"-p, --print\", \"Print transformed files to stdout\")\n .option(\"--verbose\", \"Show more information about the transform process\")\n .option(\n \"-j, --jscodeshift <options>\",\n \"Pass options directly to jscodeshift\",\n );\n};\n\nexport const codemodCommand = addTransformOptions(\n new Command()\n .name(\"codemod\")\n .description(\"CLI tool for running codemods\")\n .argument(\"<codemod>\", \"Codemod to run (e.g., rewrite-framework-imports)\")\n .argument(\"<source>\", \"Path to source files or directory to transform\"),\n).action((codemod, source, options: TransformOptions) => {\n try {\n transform(codemod, source, options);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : undefined;\n error(`Error transforming: ${errorMessage}`);\n if (errorStack) {\n error(errorStack);\n }\n process.exit(1);\n }\n});\n\nexport const upgradeCommand = addTransformOptions(\n new Command()\n .command(\"upgrade\")\n .description(\"Upgrade ai package dependencies and apply codemods\"),\n).action(async (options: TransformOptions) => {\n try {\n await upgrade(options);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : undefined;\n error(`Error upgrading: ${errorMessage}`);\n if (errorStack) {\n error(errorStack);\n }\n process.exit(1);\n }\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"upgrade.js","names":[],"sources":["../../src/commands/upgrade.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { transform } from \"../lib/transform\";\nimport { upgrade } from \"../lib/upgrade\";\nimport { SpawnSignalError } from \"../lib/run-spawn\";\nimport debug from \"debug\";\n\nexport interface TransformOptions {\n dry?: boolean;\n print?: boolean;\n verbose?: boolean;\n jscodeshift?: string;\n}\n\nconst error = debug(\"codemod:error\");\ndebug.enable(\"codemod:*\");\n\nconst addTransformOptions = (command: Command): Command => {\n return command\n .option(\"-d, --dry\", \"Dry run (no changes are made to files)\")\n .option(\"-p, --print\", \"Print transformed files to stdout\")\n .option(\"--verbose\", \"Show more information about the transform process\")\n .option(\n \"-j, --jscodeshift <options>\",\n \"Pass options directly to jscodeshift\",\n );\n};\n\nexport const codemodCommand = addTransformOptions(\n new Command()\n .name(\"codemod\")\n .description(\"CLI tool for running codemods\")\n .argument(\"<codemod>\", \"Codemod to run (e.g., rewrite-framework-imports)\")\n .argument(\"<source>\", \"Path to source files or directory to transform\"),\n).action(async (codemod, source, options: TransformOptions) => {\n try {\n await transform(codemod, source, options);\n } catch (err) {\n if (err instanceof SpawnSignalError) throw err;\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : undefined;\n error(`Error transforming: ${errorMessage}`);\n if (errorStack) {\n error(errorStack);\n }\n process.exit(1);\n }\n});\n\nexport const upgradeCommand = addTransformOptions(\n new Command()\n .command(\"upgrade\")\n .description(\"Upgrade ai package dependencies and apply codemods\"),\n).action(async (options: TransformOptions) => {\n try {\n await upgrade(options);\n } catch (err) {\n if (err instanceof SpawnSignalError) throw err;\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error ? err.stack : undefined;\n error(`Error upgrading: ${errorMessage}`);\n if (errorStack) {\n error(errorStack);\n }\n process.exit(1);\n }\n});\n"],"mappings":";;;;;;AAaA,MAAM,QAAQ,MAAM,eAAe;AACnC,MAAM,OAAO,WAAW;AAExB,MAAM,uBAAuB,YAA8B;CACzD,OAAO,QACJ,OAAO,aAAa,wCAAwC,CAAC,CAC7D,OAAO,eAAe,mCAAmC,CAAC,CAC1D,OAAO,aAAa,mDAAmD,CAAC,CACxE,OACC,+BACA,sCACF;AACJ;AAEA,MAAa,iBAAiB,oBAC5B,IAAI,QAAQ,CAAC,CACV,KAAK,SAAS,CAAC,CACf,YAAY,+BAA+B,CAAC,CAC5C,SAAS,aAAa,kDAAkD,CAAC,CACzE,SAAS,YAAY,gDAAgD,CAC1E,CAAC,CAAC,OAAO,OAAO,SAAS,QAAQ,YAA8B;CAC7D,IAAI;EACF,MAAM,UAAU,SAAS,QAAQ,OAAO;CAC1C,SAAS,KAAK;EACZ,IAAI,eAAe,kBAAkB,MAAM;EAC3C,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EACpE,MAAM,aAAa,eAAe,QAAQ,IAAI,QAAQ,KAAA;EACtD,MAAM,uBAAuB,cAAc;EAC3C,IAAI,YACF,MAAM,UAAU;EAElB,QAAQ,KAAK,CAAC;CAChB;AACF,CAAC;AAED,MAAa,iBAAiB,oBAC5B,IAAI,QAAQ,CAAC,CACV,QAAQ,SAAS,CAAC,CAClB,YAAY,oDAAoD,CACrE,CAAC,CAAC,OAAO,OAAO,YAA8B;CAC5C,IAAI;EACF,MAAM,QAAQ,OAAO;CACvB,SAAS,KAAK;EACZ,IAAI,eAAe,kBAAkB,MAAM;EAC3C,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EACpE,MAAM,aAAa,eAAe,QAAQ,IAAI,QAAQ,KAAA;EACtD,MAAM,oBAAoB,cAAc;EACxC,IAAI,YACF,MAAM,UAAU;EAElB,QAAQ,KAAK,CAAC;CAChB;AACF,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { handleCliError } from "./lib/handle-cli-error.js";
|
|
2
3
|
import { runCli } from "./run.js";
|
|
3
4
|
//#region src/index.ts
|
|
4
|
-
|
|
5
|
-
process.on("SIGTERM", () => process.exit(0));
|
|
6
|
-
runCli().catch((error) => {
|
|
7
|
-
console.error(error);
|
|
8
|
-
process.exitCode = 1;
|
|
9
|
-
});
|
|
5
|
+
runCli().catch(handleCliError);
|
|
10
6
|
//#endregion
|
|
11
7
|
|
|
12
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { handleCliError } from \"./lib/handle-cli-error\";\nimport { runCli } from \"./run\";\n\nvoid runCli().catch(handleCliError);\n"],"mappings":";;;;AAKK,OAAO,CAAC,CAAC,MAAM,cAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-skill.d.ts","names":[],"sources":["../../src/lib/agent-skill.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"agent-skill.d.ts","names":[],"sources":["../../src/lib/agent-skill.ts"],"mappings":";;cAGa;iBAEG,qBAAqB;EACnC;EACA;;iBAQc,sBACd,IAAI,oBACJ;EAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-skill.js","names":[],"sources":["../../src/lib/agent-skill.ts"],"sourcesContent":["import { dlxCommand
|
|
1
|
+
{"version":3,"file":"agent-skill.js","names":[],"sources":["../../src/lib/agent-skill.ts"],"sourcesContent":["import { dlxCommand } from \"./create-project\";\nimport { type PackageManagerName } from \"./utils/package-manager\";\n\nexport const SKILLS_PACKAGE = \"assistant-ui/skills\";\n\nexport function resolveSkillsInstall(params: {\n skills?: boolean;\n stdinIsTTY?: boolean;\n}): boolean | undefined {\n const { skills, stdinIsTTY = process.stdin.isTTY } = params;\n if (skills !== undefined) return skills;\n if (!stdinIsTTY) return true;\n return undefined;\n}\n\nexport function buildSkillsAddCommand(\n pm: PackageManagerName,\n params: { stdinIsTTY?: boolean } = {},\n): [string, string[]] {\n const { stdinIsTTY = process.stdin.isTTY } = params;\n const [command, dlxArgs] = dlxCommand(pm);\n const args = [...dlxArgs, \"skills\", \"add\", SKILLS_PACKAGE];\n\n // Without a TTY the skills CLI cannot prompt for agent platforms, so skip its\n // confirmation; with a TTY it owns the platform selection interactively.\n if (!stdinIsTTY) args.push(\"--yes\");\n\n return [command, args];\n}\n"],"mappings":";;AAGA,MAAa,iBAAiB;AAE9B,SAAgB,qBAAqB,QAGb;CACtB,MAAM,EAAE,QAAQ,aAAa,QAAQ,MAAM,UAAU;CACrD,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,IAAI,CAAC,YAAY,OAAO;AAE1B;AAEA,SAAgB,sBACd,IACA,SAAmC,CAAC,GAChB;CACpB,MAAM,EAAE,aAAa,QAAQ,MAAM,UAAU;CAC7C,MAAM,CAAC,SAAS,WAAW,WAAW,EAAE;CACxC,MAAM,OAAO;EAAC,GAAG;EAAS;EAAU;EAAO;CAAc;CAIzD,IAAI,CAAC,YAAY,KAAK,KAAK,OAAO;CAElC,OAAO,CAAC,SAAS,IAAI;AACvB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { PackageManagerName } from "./utils/package-manager.js";
|
|
1
2
|
//#region src/lib/create-project.d.ts
|
|
2
|
-
type PackageManagerName = "npm" | "pnpm" | "yarn" | "bun";
|
|
3
3
|
declare function dlxCommand(pm: PackageManagerName): [string, string[]];
|
|
4
4
|
interface TransformOptions {
|
|
5
5
|
hasLocalComponents: boolean;
|
|
@@ -22,13 +22,21 @@ declare function resolvePackageManager(opts: {
|
|
|
22
22
|
declare function resolveLatestReleaseRef(): Promise<string | undefined>;
|
|
23
23
|
declare function downloadProject(repoPath: string, destDir: string, ref?: string): Promise<void>;
|
|
24
24
|
declare function scaffoldProject(repoPath: string, destDir: string, source: ProjectSource): Promise<void>;
|
|
25
|
-
declare function resolvePackageManagerForCwd(cwd: string, packageManager?: PackageManagerName): Promise<PackageManagerName>;
|
|
26
25
|
interface TransformResult {
|
|
27
26
|
registryInstallFailure?: {
|
|
28
27
|
retryCommand: string;
|
|
29
28
|
};
|
|
30
29
|
}
|
|
31
30
|
declare function transformProject(projectDir: string, opts: TransformOptions): Promise<TransformResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Example snapshots are downloaded at a release tag while the shadcn registry
|
|
33
|
+
* is live, so a snapshot may import components at the legacy flat path
|
|
34
|
+
* (`@/components/assistant-ui/<name>`) after the registry has moved the file
|
|
35
|
+
* to `components/assistant-ui/elements/<name>.aui.tsx`. Resolve each legacy
|
|
36
|
+
* specifier against the files the registry actually installed and rewrite it
|
|
37
|
+
* only when the legacy path is absent and the elements layout has it.
|
|
38
|
+
*/
|
|
39
|
+
declare function reconcileAssistantUIImportLayout(projectDir: string): Promise<void>;
|
|
32
40
|
//#endregion
|
|
33
|
-
export {
|
|
41
|
+
export { ProjectSource, TransformOptions, TransformResult, dlxCommand, downloadProject, reconcileAssistantUIImportLayout, resolveLatestReleaseRef, resolvePackageManager, scaffoldProject, transformProject };
|
|
34
42
|
//# sourceMappingURL=create-project.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-project.d.ts","names":[],"sources":["../../src/lib/create-project.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-project.d.ts","names":[],"sources":["../../src/lib/create-project.ts"],"mappings":";;iBAagB,WAAW,IAAI;UAad;EACf;EACA;EACA,gBAAgB;;KAGN;EAEN;EACA;;EAGA;EACA;;iBAcU,sBAAsB;EACpC;EACA;EACA;EACA;IACE;iBAmBkB,2BAA2B;iBAmB3B,gBACpB,kBACA,iBACA,eACC;iBAuDmB,gBACpB,kBACA,iBACA,QAAQ,gBACP;UA2Bc;EACf;IAA2B;;;iBAGP,iBACpB,oBACA,MAAM,mBACL,QAAQ;;;;;;;;;iBA8OW,iCACpB,qBACC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
+
import { SpawnExitError, SpawnSignalError, runSpawn } from "./run-spawn.js";
|
|
1
2
|
import { logger } from "./utils/logger.js";
|
|
2
|
-
import {
|
|
3
|
+
import { readProjectFiles } from "./utils/file-scanner.js";
|
|
3
4
|
import * as fs$1 from "node:fs";
|
|
4
5
|
import * as path$1 from "node:path";
|
|
5
6
|
import { downloadTemplate } from "giget";
|
|
6
|
-
import { sync } from "glob";
|
|
7
|
-
import { detect } from "detect-package-manager";
|
|
8
7
|
import { parse, printParseErrorCode } from "jsonc-parser";
|
|
9
8
|
//#region src/lib/create-project.ts
|
|
10
9
|
function dlxCommand(pm) {
|
|
@@ -92,24 +91,6 @@ async function scaffoldProject(repoPath, destDir, source) {
|
|
|
92
91
|
throw error;
|
|
93
92
|
}
|
|
94
93
|
}
|
|
95
|
-
function detectFromUserAgent() {
|
|
96
|
-
const ua = process.env.npm_config_user_agent;
|
|
97
|
-
if (!ua) return void 0;
|
|
98
|
-
if (ua.startsWith("bun/")) return "bun";
|
|
99
|
-
if (ua.startsWith("pnpm/")) return "pnpm";
|
|
100
|
-
if (ua.startsWith("yarn/")) return "yarn";
|
|
101
|
-
if (ua.startsWith("npm/")) return "npm";
|
|
102
|
-
}
|
|
103
|
-
async function resolvePackageManagerForCwd(cwd, packageManager) {
|
|
104
|
-
if (packageManager) return packageManager;
|
|
105
|
-
const fromAgent = detectFromUserAgent();
|
|
106
|
-
if (fromAgent) return fromAgent;
|
|
107
|
-
try {
|
|
108
|
-
return await detect({ cwd });
|
|
109
|
-
} catch {
|
|
110
|
-
return "npm";
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
94
|
async function transformProject(projectDir, opts) {
|
|
114
95
|
logger.step("Transforming package.json...");
|
|
115
96
|
transformPackageJson(projectDir);
|
|
@@ -129,12 +110,16 @@ async function transformProject(projectDir, opts) {
|
|
|
129
110
|
await installDependencies(projectDir, pm);
|
|
130
111
|
}
|
|
131
112
|
if (!opts.skipInstall && !opts.hasLocalComponents && shadcnUI && assistantUI) {
|
|
132
|
-
const allShadcn = shadcnUI.includes("utils") ? shadcnUI : [...shadcnUI, "utils"];
|
|
133
113
|
const auiComponents = assistantUI.map((c) => `@assistant-ui/${c}`);
|
|
134
|
-
const components = [
|
|
114
|
+
const components = [
|
|
115
|
+
"@assistant-ui/utils",
|
|
116
|
+
...shadcnUI,
|
|
117
|
+
...auiComponents
|
|
118
|
+
];
|
|
135
119
|
logger.step(`Installing components: ${components.join(", ")}...`);
|
|
136
120
|
const failure = await installShadcnRegistry(projectDir, components, "components", pm);
|
|
137
121
|
if (failure) return { registryInstallFailure: failure };
|
|
122
|
+
await reconcileAssistantUIImportLayout(projectDir);
|
|
138
123
|
}
|
|
139
124
|
return {};
|
|
140
125
|
}
|
|
@@ -208,36 +193,133 @@ function transformTsConfig(projectDir) {
|
|
|
208
193
|
fs$1.writeFileSync(tsconfigPath, `${JSON.stringify(tsconfig, null, 2)}\n`);
|
|
209
194
|
}
|
|
210
195
|
function transformCssFiles(projectDir) {
|
|
211
|
-
const
|
|
196
|
+
for (const { fullPath, content } of readProjectFiles("**/*.css", {
|
|
212
197
|
cwd: projectDir,
|
|
213
198
|
ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES
|
|
214
|
-
})
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
const newContent = content.replace(/@source\s+["'][^"']*packages\/ui\/src[^"']*["'];\s*\n?/g, "");
|
|
220
|
-
if (newContent !== content) fs$1.writeFileSync(fullPath, newContent);
|
|
221
|
-
} catch {}
|
|
199
|
+
})) try {
|
|
200
|
+
const newContent = content.replace(/@source\s+["'][^"']*packages\/ui\/src[^"']*["'];\s*\n?/g, "");
|
|
201
|
+
if (newContent !== content) fs$1.writeFileSync(fullPath, newContent);
|
|
202
|
+
} catch {
|
|
203
|
+
continue;
|
|
222
204
|
}
|
|
223
205
|
}
|
|
224
206
|
function stripImportExtension(component) {
|
|
225
207
|
return component.replace(/\.[cm]?[tj]sx?$/, "");
|
|
226
208
|
}
|
|
227
|
-
|
|
228
|
-
|
|
209
|
+
const ASSISTANT_UI_OWNED_UI = /* @__PURE__ */ new Set([
|
|
210
|
+
"accordion",
|
|
211
|
+
"badge",
|
|
212
|
+
"diff-viewer",
|
|
213
|
+
"direction",
|
|
214
|
+
"dot-matrix",
|
|
215
|
+
"number-roll",
|
|
216
|
+
"select",
|
|
217
|
+
"tabs"
|
|
218
|
+
]);
|
|
219
|
+
const BARE_ELEMENT_ITEMS = /* @__PURE__ */ new Set([
|
|
220
|
+
"file",
|
|
221
|
+
"generative-ui",
|
|
222
|
+
"heat-graph",
|
|
223
|
+
"image",
|
|
224
|
+
"logos",
|
|
225
|
+
"markdown-text",
|
|
226
|
+
"syntax-highlighter",
|
|
227
|
+
"tooltip-icon-button"
|
|
228
|
+
]);
|
|
229
|
+
function toAssistantUIItem(specifier) {
|
|
230
|
+
let name = stripImportExtension(specifier);
|
|
231
|
+
const inElements = name.startsWith("elements/");
|
|
232
|
+
if (inElements) name = name.slice(9);
|
|
233
|
+
else if (name.includes("/")) return null;
|
|
234
|
+
if (name.endsWith(".aui")) return name.slice(0, -4);
|
|
235
|
+
return inElements && !BARE_ELEMENT_ITEMS.has(name) ? `elements-${name}` : name;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Example snapshots are downloaded at a release tag while the shadcn registry
|
|
239
|
+
* is live, so a snapshot may import components at the legacy flat path
|
|
240
|
+
* (`@/components/assistant-ui/<name>`) after the registry has moved the file
|
|
241
|
+
* to `components/assistant-ui/elements/<name>.aui.tsx`. Resolve each legacy
|
|
242
|
+
* specifier against the files the registry actually installed and rewrite it
|
|
243
|
+
* only when the legacy path is absent and the elements layout has it.
|
|
244
|
+
*/
|
|
245
|
+
async function reconcileAssistantUIImportLayout(projectDir) {
|
|
246
|
+
const componentRoots = ["components", "src/components"].map((dir) => path$1.join(projectDir, dir, "assistant-ui")).filter((dir) => fs$1.existsSync(dir));
|
|
247
|
+
if (componentRoots.length === 0) return;
|
|
248
|
+
const resolvesAtLegacyPath = (name) => componentRoots.some((root) => [
|
|
249
|
+
".tsx",
|
|
250
|
+
".ts",
|
|
251
|
+
"/index.tsx",
|
|
252
|
+
"/index.ts"
|
|
253
|
+
].some((suffix) => fs$1.existsSync(path$1.join(root, `${name}${suffix}`))));
|
|
254
|
+
const installedByName = /* @__PURE__ */ new Map();
|
|
255
|
+
for (const root of componentRoots) for (const { file } of readProjectFiles("**/*.{ts,tsx}", { cwd: root })) {
|
|
256
|
+
const normalized = file.split(path$1.sep).join("/");
|
|
257
|
+
if (!normalized.includes("/")) continue;
|
|
258
|
+
const specifier = normalized.replace(/\.[cm]?[tj]sx?$/, "");
|
|
259
|
+
const name = path$1.posix.basename(specifier).replace(/\.aui$/, "");
|
|
260
|
+
const existing = installedByName.get(name);
|
|
261
|
+
if (existing === void 0 || !existing.endsWith(".aui") && specifier.endsWith(".aui")) installedByName.set(name, specifier);
|
|
262
|
+
}
|
|
263
|
+
if (installedByName.size === 0) return;
|
|
264
|
+
const { default: jscodeshift } = await import("jscodeshift");
|
|
265
|
+
const parsers = {
|
|
266
|
+
ts: jscodeshift.withParser("ts"),
|
|
267
|
+
tsx: jscodeshift.withParser("tsx")
|
|
268
|
+
};
|
|
269
|
+
for (const { fullPath, content } of readProjectFiles("**/*.{ts,tsx}", {
|
|
229
270
|
cwd: projectDir,
|
|
230
271
|
ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES
|
|
231
|
-
})
|
|
272
|
+
})) {
|
|
273
|
+
if (!content.includes("@/components/assistant-ui/")) continue;
|
|
274
|
+
const replacements = [];
|
|
275
|
+
const collectReplacement = (source) => {
|
|
276
|
+
if (typeof source.value !== "string" || source.start == null || source.end == null) return;
|
|
277
|
+
if (!source.value.startsWith("@/components/assistant-ui/")) return;
|
|
278
|
+
const specifier = source.value.slice(26);
|
|
279
|
+
if (specifier.includes("/")) return;
|
|
280
|
+
const name = stripImportExtension(specifier);
|
|
281
|
+
const installed = installedByName.get(name);
|
|
282
|
+
if (resolvesAtLegacyPath(name) || installed === void 0) return;
|
|
283
|
+
const raw = content.slice(source.start, source.end);
|
|
284
|
+
const quote = raw[0];
|
|
285
|
+
if (quote !== "\"" && quote !== "'" || raw.at(-1) !== quote) return;
|
|
286
|
+
replacements.push({
|
|
287
|
+
start: source.start,
|
|
288
|
+
end: source.end,
|
|
289
|
+
value: `${quote}@/components/assistant-ui/${installed}${quote}`
|
|
290
|
+
});
|
|
291
|
+
};
|
|
292
|
+
const j = fullPath.endsWith(".tsx") ? parsers.tsx : parsers.ts;
|
|
293
|
+
let root;
|
|
294
|
+
try {
|
|
295
|
+
root = j(content);
|
|
296
|
+
} catch {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
root.find(j.ImportDeclaration).forEach(({ node }) => collectReplacement(node.source));
|
|
300
|
+
root.find(j.ExportNamedDeclaration).forEach(({ node }) => node.source && collectReplacement(node.source));
|
|
301
|
+
root.find(j.ExportAllDeclaration).forEach(({ node }) => collectReplacement(node.source));
|
|
302
|
+
let next = content;
|
|
303
|
+
for (const replacement of replacements.sort((a, b) => b.start - a.start)) next = next.slice(0, replacement.start) + replacement.value + next.slice(replacement.end);
|
|
304
|
+
if (next !== content) fs$1.writeFileSync(fullPath, next);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function scanRequiredComponents(projectDir) {
|
|
232
308
|
const assistantUIComponents = /* @__PURE__ */ new Set();
|
|
233
309
|
const shadcnUIComponents = /* @__PURE__ */ new Set();
|
|
234
|
-
for (const
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
310
|
+
for (const { content } of readProjectFiles("**/*.{ts,tsx}", {
|
|
311
|
+
cwd: projectDir,
|
|
312
|
+
ignore: LOCAL_PROJECT_ARTIFACT_GLOB_IGNORES
|
|
313
|
+
})) {
|
|
314
|
+
for (const match of content.matchAll(/from\s+["']@\/components\/assistant-ui\/([^"']+)["']/g)) {
|
|
315
|
+
const item = toAssistantUIItem(match[1]);
|
|
316
|
+
if (item) assistantUIComponents.add(item);
|
|
317
|
+
}
|
|
318
|
+
for (const match of content.matchAll(/from\s+["']@\/components\/ui\/([^"']+)["']/g)) {
|
|
319
|
+
const name = stripImportExtension(match[1]);
|
|
320
|
+
if (ASSISTANT_UI_OWNED_UI.has(name)) assistantUIComponents.add(name);
|
|
321
|
+
else shadcnUIComponents.add(name);
|
|
322
|
+
}
|
|
241
323
|
}
|
|
242
324
|
return {
|
|
243
325
|
assistantUI: Array.from(assistantUIComponents),
|
|
@@ -249,6 +331,7 @@ async function installDependencies(projectDir, pm) {
|
|
|
249
331
|
try {
|
|
250
332
|
await runSpawn(pm, args, projectDir);
|
|
251
333
|
} catch (error) {
|
|
334
|
+
if (error instanceof SpawnSignalError) throw error;
|
|
252
335
|
if (error instanceof SpawnExitError) throw new Error(`${pm} install exited with code ${error.code}`);
|
|
253
336
|
const message = error instanceof Error ? error.message : String(error);
|
|
254
337
|
throw new Error(`Failed to install dependencies: ${message}`);
|
|
@@ -267,6 +350,7 @@ async function installShadcnRegistry(projectDir, components, label, pm) {
|
|
|
267
350
|
await runSpawn(cmd, addArgs, projectDir);
|
|
268
351
|
return;
|
|
269
352
|
} catch (error) {
|
|
353
|
+
if (error instanceof SpawnSignalError) throw error;
|
|
270
354
|
if (error instanceof SpawnExitError) {
|
|
271
355
|
logger.warn(`shadcn exited with code ${error.code}.`);
|
|
272
356
|
return { retryCommand: `${cmd} ${retryArgs.join(" ")}` };
|
|
@@ -276,6 +360,6 @@ async function installShadcnRegistry(projectDir, components, label, pm) {
|
|
|
276
360
|
}
|
|
277
361
|
}
|
|
278
362
|
//#endregion
|
|
279
|
-
export { dlxCommand, downloadProject, resolveLatestReleaseRef, resolvePackageManager,
|
|
363
|
+
export { dlxCommand, downloadProject, reconcileAssistantUIImportLayout, resolveLatestReleaseRef, resolvePackageManager, scaffoldProject, transformProject };
|
|
280
364
|
|
|
281
365
|
//# sourceMappingURL=create-project.js.map
|