@editframe/create 0.37.0-beta → 0.37.2-beta
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/detectAgent.js +76 -0
- package/dist/detectAgent.js.map +1 -0
- package/dist/index.js +22 -45
- package/dist/index.js.map +1 -1
- package/dist/templates/animejs/package.json +3 -3
- package/dist/templates/card-poetry/package.json +3 -3
- package/dist/templates/html/package.json +3 -3
- package/dist/templates/react/package.json +3 -3
- package/dist/templates/react-demo/package.json +3 -3
- package/dist/templates/simple-demo/package.json +3 -3
- package/dist/utils.js +22 -44
- package/dist/utils.js.map +1 -1
- package/package.json +2 -3
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
|
|
5
|
+
//#region src/detectAgent.ts
|
|
6
|
+
/**
|
|
7
|
+
* Detect which AI coding agents are installed on the system.
|
|
8
|
+
* Returns an array of detected agent names.
|
|
9
|
+
*/
|
|
10
|
+
async function detectInstalledAgents() {
|
|
11
|
+
const detected = [];
|
|
12
|
+
try {
|
|
13
|
+
await access(path.join(process.cwd(), ".cursor"));
|
|
14
|
+
detected.push("cursor");
|
|
15
|
+
} catch {}
|
|
16
|
+
try {
|
|
17
|
+
await access(path.join(process.cwd(), ".vscode"));
|
|
18
|
+
detected.push("vscode");
|
|
19
|
+
} catch {
|
|
20
|
+
try {
|
|
21
|
+
await access(path.join(process.cwd(), ".github/copilot"));
|
|
22
|
+
detected.push("vscode");
|
|
23
|
+
} catch {}
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
await access(path.join(os.homedir(), ".claude"));
|
|
27
|
+
detected.push("claude");
|
|
28
|
+
} catch {}
|
|
29
|
+
try {
|
|
30
|
+
await access(path.join(os.homedir(), ".windsurf"));
|
|
31
|
+
detected.push("windsurf");
|
|
32
|
+
} catch {}
|
|
33
|
+
return detected;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get agent choices sorted by detection (detected agents first, then others).
|
|
37
|
+
*/
|
|
38
|
+
async function getAgentChoices() {
|
|
39
|
+
const detected = await detectInstalledAgents();
|
|
40
|
+
return [
|
|
41
|
+
{
|
|
42
|
+
title: "Cursor",
|
|
43
|
+
value: "cursor"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
title: "VS Code Copilot",
|
|
47
|
+
value: "vscode"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
title: "Claude Code",
|
|
51
|
+
value: "claude"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
title: "Windsurf",
|
|
55
|
+
value: "windsurf"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
title: "All agents",
|
|
59
|
+
value: "all"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
title: "Skip",
|
|
63
|
+
value: "skip"
|
|
64
|
+
}
|
|
65
|
+
].sort((a, b) => {
|
|
66
|
+
const aDetected = detected.includes(a.value);
|
|
67
|
+
const bDetected = detected.includes(b.value);
|
|
68
|
+
if (aDetected && !bDetected) return -1;
|
|
69
|
+
if (!aDetected && bDetected) return 1;
|
|
70
|
+
return 0;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
//#endregion
|
|
75
|
+
export { getAgentChoices };
|
|
76
|
+
//# sourceMappingURL=detectAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectAgent.js","names":["detected: string[]"],"sources":["../src/detectAgent.ts"],"sourcesContent":["import { access } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\n/**\n * Detect which AI coding agents are installed on the system.\n * Returns an array of detected agent names.\n */\nexport async function detectInstalledAgents(): Promise<string[]> {\n const detected: string[] = [];\n\n // Check for Cursor (project-level .cursor directory)\n try {\n await access(path.join(process.cwd(), \".cursor\"));\n detected.push(\"cursor\");\n } catch {\n // Not found\n }\n\n // Check for VS Code / Copilot (.vscode directory or .github/copilot)\n try {\n await access(path.join(process.cwd(), \".vscode\"));\n detected.push(\"vscode\");\n } catch {\n try {\n await access(path.join(process.cwd(), \".github/copilot\"));\n detected.push(\"vscode\");\n } catch {\n // Not found\n }\n }\n\n // Check for Claude Code (user-level ~/.claude directory)\n try {\n await access(path.join(os.homedir(), \".claude\"));\n detected.push(\"claude\");\n } catch {\n // Not found\n }\n\n // Check for Windsurf (user-level ~/.windsurf directory)\n try {\n await access(path.join(os.homedir(), \".windsurf\"));\n detected.push(\"windsurf\");\n } catch {\n // Not found\n }\n\n return detected;\n}\n\n/**\n * Get agent choices sorted by detection (detected agents first, then others).\n */\nexport async function getAgentChoices() {\n const detected = await detectInstalledAgents();\n\n // Define all available agents\n const allAgents = [\n { title: \"Cursor\", value: \"cursor\" },\n { title: \"VS Code Copilot\", value: \"vscode\" },\n { title: \"Claude Code\", value: \"claude\" },\n { title: \"Windsurf\", value: \"windsurf\" },\n { title: \"All agents\", value: \"all\" },\n { title: \"Skip\", value: \"skip\" },\n ];\n\n // Sort: detected agents first, then others\n const sorted = allAgents.sort((a, b) => {\n const aDetected = detected.includes(a.value);\n const bDetected = detected.includes(b.value);\n\n if (aDetected && !bDetected) return -1;\n if (!aDetected && bDetected) return 1;\n return 0;\n });\n\n return sorted;\n}\n"],"mappings":";;;;;;;;;AAQA,eAAsB,wBAA2C;CAC/D,MAAMA,WAAqB,EAAE;AAG7B,KAAI;AACF,QAAM,OAAO,KAAK,KAAK,QAAQ,KAAK,EAAE,UAAU,CAAC;AACjD,WAAS,KAAK,SAAS;SACjB;AAKR,KAAI;AACF,QAAM,OAAO,KAAK,KAAK,QAAQ,KAAK,EAAE,UAAU,CAAC;AACjD,WAAS,KAAK,SAAS;SACjB;AACN,MAAI;AACF,SAAM,OAAO,KAAK,KAAK,QAAQ,KAAK,EAAE,kBAAkB,CAAC;AACzD,YAAS,KAAK,SAAS;UACjB;;AAMV,KAAI;AACF,QAAM,OAAO,KAAK,KAAK,GAAG,SAAS,EAAE,UAAU,CAAC;AAChD,WAAS,KAAK,SAAS;SACjB;AAKR,KAAI;AACF,QAAM,OAAO,KAAK,KAAK,GAAG,SAAS,EAAE,YAAY,CAAC;AAClD,WAAS,KAAK,WAAW;SACnB;AAIR,QAAO;;;;;AAMT,eAAsB,kBAAkB;CACtC,MAAM,WAAW,MAAM,uBAAuB;AAsB9C,QAnBkB;EAChB;GAAE,OAAO;GAAU,OAAO;GAAU;EACpC;GAAE,OAAO;GAAmB,OAAO;GAAU;EAC7C;GAAE,OAAO;GAAe,OAAO;GAAU;EACzC;GAAE,OAAO;GAAY,OAAO;GAAY;EACxC;GAAE,OAAO;GAAc,OAAO;GAAO;EACrC;GAAE,OAAO;GAAQ,OAAO;GAAQ;EACjC,CAGwB,MAAM,GAAG,MAAM;EACtC,MAAM,YAAY,SAAS,SAAS,EAAE,MAAM;EAC5C,MAAM,YAAY,SAAS,SAAS,EAAE,MAAM;AAE5C,MAAI,aAAa,CAAC,UAAW,QAAO;AACpC,MAAI,CAAC,aAAa,UAAW,QAAO;AACpC,SAAO;GACP"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { getStartCommand, getUserPkgManager, installAgentSkills, installDependencies } from "./utils.js";
|
|
3
|
+
import { getAgentChoices } from "./detectAgent.js";
|
|
3
4
|
import { access, cp, readdir } from "node:fs/promises";
|
|
4
5
|
import path from "node:path";
|
|
5
6
|
import { fileURLToPath } from "node:url";
|
|
@@ -112,6 +113,22 @@ async function main() {
|
|
|
112
113
|
value: template
|
|
113
114
|
}))
|
|
114
115
|
});
|
|
116
|
+
if (!skipSkills && !cliAgent && !nonInteractive) {
|
|
117
|
+
const agentChoices = await getAgentChoices();
|
|
118
|
+
promptQuestions.push({
|
|
119
|
+
type: "confirm",
|
|
120
|
+
name: "installSkills",
|
|
121
|
+
message: "Install AI agent skills for better coding assistance?",
|
|
122
|
+
initial: true
|
|
123
|
+
});
|
|
124
|
+
promptQuestions.push({
|
|
125
|
+
type: (_prev, values$1) => values$1.installSkills ? "select" : null,
|
|
126
|
+
name: "agent",
|
|
127
|
+
message: "Which AI coding agent are you using?",
|
|
128
|
+
choices: agentChoices,
|
|
129
|
+
initial: 0
|
|
130
|
+
});
|
|
131
|
+
}
|
|
115
132
|
const answers = promptQuestions.length > 0 ? await prompts(promptQuestions) : {};
|
|
116
133
|
if (!cliDirectory && !nonInteractive && !answers.directoryName || !cliTemplate && !nonInteractive && !answers.templateName) {
|
|
117
134
|
process.stderr.write(chalk.red("\nCancelled\n"));
|
|
@@ -119,6 +136,8 @@ async function main() {
|
|
|
119
136
|
}
|
|
120
137
|
const directoryName = cliDirectory || answers.directoryName || "my-project";
|
|
121
138
|
const templateName = cliTemplate || answers.templateName || templates[0];
|
|
139
|
+
let selectedAgent = cliAgent || answers.agent;
|
|
140
|
+
if (!skipSkills && !selectedAgent && nonInteractive) selectedAgent = "cursor";
|
|
122
141
|
const targetDir = path.join(process.cwd(), directoryName);
|
|
123
142
|
const templateDir = path.join(__dirname, "templates", templateName);
|
|
124
143
|
if (await checkDirectoryExists(targetDir)) {
|
|
@@ -140,50 +159,8 @@ async function main() {
|
|
|
140
159
|
const pkgManager = getUserPkgManager();
|
|
141
160
|
let depsInstalled = false;
|
|
142
161
|
let skillsInstalled = false;
|
|
143
|
-
let selectedAgent = cliAgent;
|
|
144
162
|
if (!skipInstall) depsInstalled = await installDependencies(targetDir);
|
|
145
|
-
if (!skipSkills)
|
|
146
|
-
if (!selectedAgent && !nonInteractive) selectedAgent = (await prompts([{
|
|
147
|
-
type: "confirm",
|
|
148
|
-
name: "installSkills",
|
|
149
|
-
message: "Install AI agent skills for better coding assistance?",
|
|
150
|
-
initial: true
|
|
151
|
-
}, {
|
|
152
|
-
type: (prev) => prev ? "select" : null,
|
|
153
|
-
name: "agent",
|
|
154
|
-
message: "Which AI coding agent are you using?",
|
|
155
|
-
choices: [
|
|
156
|
-
{
|
|
157
|
-
title: "Cursor",
|
|
158
|
-
value: "cursor",
|
|
159
|
-
description: "Most popular"
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
title: "VS Code Copilot",
|
|
163
|
-
value: "vscode"
|
|
164
|
-
},
|
|
165
|
-
{
|
|
166
|
-
title: "Claude Code",
|
|
167
|
-
value: "claude"
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
title: "Windsurf",
|
|
171
|
-
value: "windsurf"
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
title: "All agents",
|
|
175
|
-
value: "all"
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
title: "Skip",
|
|
179
|
-
value: "skip"
|
|
180
|
-
}
|
|
181
|
-
],
|
|
182
|
-
initial: 0
|
|
183
|
-
}])).agent;
|
|
184
|
-
if (!selectedAgent && nonInteractive) selectedAgent = "cursor";
|
|
185
|
-
if (selectedAgent && selectedAgent !== "skip") skillsInstalled = await installAgentSkills(targetDir, selectedAgent);
|
|
186
|
-
}
|
|
163
|
+
if (!skipSkills && selectedAgent && selectedAgent !== "skip") skillsInstalled = await installAgentSkills(targetDir, selectedAgent);
|
|
187
164
|
process.stderr.write(chalk.green.bold("\n✓ Project created successfully!\n"));
|
|
188
165
|
if (depsInstalled) process.stderr.write(chalk.green("✓ Dependencies installed\n"));
|
|
189
166
|
if (skillsInstalled) process.stderr.write(chalk.green(`✓ Agent skills installed (${selectedAgent})\n`));
|
|
@@ -191,7 +168,7 @@ async function main() {
|
|
|
191
168
|
process.stderr.write(chalk.bold("Next steps:\n"));
|
|
192
169
|
process.stderr.write(chalk.cyan(` cd ${directoryName}\n`));
|
|
193
170
|
if (!depsInstalled) process.stderr.write(chalk.cyan(` ${pkgManager} install\n`));
|
|
194
|
-
process.stderr.write(chalk.cyan(` ${
|
|
171
|
+
process.stderr.write(chalk.cyan(` ${getStartCommand(pkgManager)}\n`));
|
|
195
172
|
if (skillsInstalled) {
|
|
196
173
|
process.stderr.write(chalk.bold("\nAI Agent Skills installed:\n"));
|
|
197
174
|
process.stderr.write(chalk.dim(" • elements-composition - HTML/Web Components\n"));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["path","promptQuestions: prompts.PromptObject[]"],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { access, cp, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseArgs } from \"node:util\";\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport {\n getUserPkgManager,\n installDependencies,\n installAgentSkills,\n getDevCommand,\n} from \"./utils.js\";\n\nfunction showHelp(templates: string[]) {\n const usage = `\n${chalk.bold(\"Usage:\")}\n npm create @editframe -- [template] [options]\n\n${chalk.bold(\"Options:\")}\n -d, --directory <name> Project directory name\n --skip-install Skip dependency installation\n --skip-skills Skip agent skills installation\n --agent <name> Specify AI agent (cursor, claude, vscode, etc.)\n -y, --yes Skip all prompts, use defaults\n -h, --help Show this help message\n\n${chalk.bold(\"Available Templates:\")}\n${templates.map((t) => ` - ${t}`).join(\"\\n\")}\n\n${chalk.bold(\"Examples:\")}\n ${chalk.dim(\"# Interactive mode (recommended)\")}\n npm create @editframe\n\n ${chalk.dim(\"# Specify template\")}\n npm create @editframe -- react\n\n ${chalk.dim(\"# Full non-interactive\")}\n npm create @editframe -- react -d my-app --agent cursor -y\n\n ${chalk.dim(\"# Skip auto-installation\")}\n npm create @editframe -- react --skip-install --skip-skills\n`;\n\n process.stdout.write(usage);\n}\n\nasync function checkDirectoryExists(path: string) {\n try {\n await access(path);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nasync function main() {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n // List of available starter templates\n const templates = await readdir(path.join(__dirname, \"templates\"));\n\n // Parse command line arguments\n const { values, positionals } = parseArgs({\n args: process.argv.slice(2),\n options: {\n help: {\n type: \"boolean\",\n short: \"h\",\n default: false,\n },\n directory: {\n type: \"string\",\n short: \"d\",\n },\n skipInstall: {\n type: \"boolean\",\n default: false,\n },\n skipSkills: {\n type: \"boolean\",\n default: false,\n },\n agent: {\n type: \"string\",\n },\n yes: {\n type: \"boolean\",\n short: \"y\",\n default: false,\n },\n },\n allowPositionals: true,\n });\n\n // Show help if requested\n if (values.help) {\n showHelp(templates);\n process.exit(0);\n }\n\n // Extract CLI arguments\n const cliTemplate = positionals[0];\n const cliDirectory = values.directory;\n const skipInstall = values.skipInstall;\n const skipSkills = values.skipSkills;\n const cliAgent = values.agent;\n const nonInteractive = values.yes;\n\n // Validate template if provided\n if (cliTemplate && !templates.includes(cliTemplate)) {\n process.stderr.write(\n chalk.red(`Error: Template \"${cliTemplate}\" does not exist.\\n\\n`),\n );\n process.stderr.write(chalk.bold(\"Available templates:\\n\"));\n for (const t of templates) {\n process.stderr.write(` - ${t}\\n`);\n }\n process.stderr.write(\n chalk.dim(\"\\nRun with --help for more information.\\n\"),\n );\n process.exit(1);\n }\n\n // Build prompts array based on what CLI args were provided\n const promptQuestions: prompts.PromptObject[] = [];\n\n if (!cliDirectory && !nonInteractive) {\n promptQuestions.push({\n type: \"text\",\n name: \"directoryName\",\n message: \"Enter the name of the directory to generate into:\",\n initial: \"my-project\",\n });\n }\n\n if (!cliTemplate && !nonInteractive) {\n promptQuestions.push({\n type: \"select\",\n name: \"templateName\",\n message: \"Choose a starter template:\",\n choices: templates.map((template) => ({\n title: template,\n value: template,\n })),\n });\n }\n\n // Prompt for missing information\n const answers =\n promptQuestions.length > 0 ? await prompts(promptQuestions) : {};\n\n // Handle user cancellation\n if (\n (!cliDirectory && !nonInteractive && !answers.directoryName) ||\n (!cliTemplate && !nonInteractive && !answers.templateName)\n ) {\n process.stderr.write(chalk.red(\"\\nCancelled\\n\"));\n process.exit(1);\n }\n\n // Use CLI args or prompted values (with defaults for non-interactive mode)\n const directoryName =\n cliDirectory || answers.directoryName || \"my-project\";\n const templateName = cliTemplate || answers.templateName || templates[0];\n\n const targetDir = path.join(process.cwd(), directoryName);\n const templateDir = path.join(__dirname, \"templates\", templateName);\n\n const exists = await checkDirectoryExists(targetDir);\n\n if (exists) {\n process.stderr.write(\n chalk.yellow(`Directory ${targetDir} already exists.\\n`),\n );\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: \"Directory already exists. Do you want to overwrite it?\",\n initial: false,\n });\n\n if (!overwrite) {\n process.stderr.write(chalk.red(\"Aborting...\\n\"));\n process.exit(1);\n }\n }\n\n process.stderr.write(`\\nCreating project in directory: ${targetDir}\\n`);\n process.stderr.write(`Using template: ${templateName}\\n\\n`);\n\n // Copy the selected template to the target directory\n await cp(templateDir, targetDir, { recursive: true });\n\n const pkgManager = getUserPkgManager();\n let depsInstalled = false;\n let skillsInstalled = false;\n let selectedAgent = cliAgent;\n\n // Install dependencies unless skipped\n if (!skipInstall) {\n depsInstalled = await installDependencies(targetDir);\n }\n\n // Prompt for and install agent skills unless skipped\n if (!skipSkills) {\n // If agent not specified via CLI, prompt for it (unless non-interactive)\n if (!selectedAgent && !nonInteractive) {\n const skillsPrompt = await prompts([\n {\n type: \"confirm\",\n name: \"installSkills\",\n message: \"Install AI agent skills for better coding assistance?\",\n initial: true,\n },\n {\n type: (prev) => (prev ? \"select\" : null),\n name: \"agent\",\n message: \"Which AI coding agent are you using?\",\n choices: [\n {\n title: \"Cursor\",\n value: \"cursor\",\n description: \"Most popular\",\n },\n { title: \"VS Code Copilot\", value: \"vscode\" },\n { title: \"Claude Code\", value: \"claude\" },\n { title: \"Windsurf\", value: \"windsurf\" },\n { title: \"All agents\", value: \"all\" },\n { title: \"Skip\", value: \"skip\" },\n ],\n initial: 0,\n },\n ]);\n\n selectedAgent = skillsPrompt.agent;\n }\n\n // Install skills if agent was selected (default to cursor in non-interactive mode)\n if (!selectedAgent && nonInteractive) {\n selectedAgent = \"cursor\";\n }\n\n if (selectedAgent && selectedAgent !== \"skip\") {\n skillsInstalled = await installAgentSkills(targetDir, selectedAgent);\n }\n }\n\n // Success message\n process.stderr.write(chalk.green.bold(\"\\n✓ Project created successfully!\\n\"));\n\n if (depsInstalled) {\n process.stderr.write(chalk.green(\"✓ Dependencies installed\\n\"));\n }\n\n if (skillsInstalled) {\n process.stderr.write(\n chalk.green(`✓ Agent skills installed (${selectedAgent})\\n`)\n );\n }\n\n process.stderr.write(chalk.bold(\"\\nYour project is ready! 🎉\\n\\n\"));\n\n // Next steps\n process.stderr.write(chalk.bold(\"Next steps:\\n\"));\n process.stderr.write(chalk.cyan(` cd ${directoryName}\\n`));\n\n if (!depsInstalled) {\n process.stderr.write(chalk.cyan(` ${pkgManager} install\\n`));\n }\n\n process.stderr.write(chalk.cyan(` ${getDevCommand(pkgManager)}\\n`));\n\n // Skills info\n if (skillsInstalled) {\n process.stderr.write(chalk.bold(\"\\nAI Agent Skills installed:\\n\"));\n process.stderr.write(\n chalk.dim(\" • elements-composition - HTML/Web Components\\n\")\n );\n process.stderr.write(\n chalk.dim(\" • react-composition - React components\\n\")\n );\n process.stderr.write(\n chalk.dim(\" • motion-design - Animation principles\\n\")\n );\n\n process.stderr.write(chalk.bold(\"\\nTry asking your AI agent:\\n\"));\n process.stderr.write(\n chalk.dim(' \"Create a 5-second video with fade-in text\"\\n')\n );\n process.stderr.write(chalk.dim(' \"Add a waveform visualization\"\\n'));\n process.stderr.write(\n chalk.dim(' \"Animate this element with spring physics\"\\n')\n );\n }\n\n process.stderr.write(\n chalk.dim(\"\\nDocumentation: https://editframe.com/docs\\n\")\n );\n process.stderr.write(chalk.dim(\"Happy coding! 🎬\\n\\n\"));\n}\n\nmain();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["path","promptQuestions: prompts.PromptObject[]","values"],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { access, cp, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseArgs } from \"node:util\";\nimport chalk from \"chalk\";\nimport prompts from \"prompts\";\nimport {\n getUserPkgManager,\n installDependencies,\n installAgentSkills,\n getStartCommand,\n} from \"./utils.js\";\nimport { getAgentChoices } from \"./detectAgent.js\";\n\nfunction showHelp(templates: string[]) {\n const usage = `\n${chalk.bold(\"Usage:\")}\n npm create @editframe -- [template] [options]\n\n${chalk.bold(\"Options:\")}\n -d, --directory <name> Project directory name\n --skip-install Skip dependency installation\n --skip-skills Skip agent skills installation\n --agent <name> Specify AI agent (cursor, claude, vscode, etc.)\n -y, --yes Skip all prompts, use defaults\n -h, --help Show this help message\n\n${chalk.bold(\"Available Templates:\")}\n${templates.map((t) => ` - ${t}`).join(\"\\n\")}\n\n${chalk.bold(\"Examples:\")}\n ${chalk.dim(\"# Interactive mode (recommended)\")}\n npm create @editframe\n\n ${chalk.dim(\"# Specify template\")}\n npm create @editframe -- react\n\n ${chalk.dim(\"# Full non-interactive\")}\n npm create @editframe -- react -d my-app --agent cursor -y\n\n ${chalk.dim(\"# Skip auto-installation\")}\n npm create @editframe -- react --skip-install --skip-skills\n`;\n\n process.stdout.write(usage);\n}\n\nasync function checkDirectoryExists(path: string) {\n try {\n await access(path);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nasync function main() {\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n // List of available starter templates\n const templates = await readdir(path.join(__dirname, \"templates\"));\n\n // Parse command line arguments\n const { values, positionals } = parseArgs({\n args: process.argv.slice(2),\n options: {\n help: {\n type: \"boolean\",\n short: \"h\",\n default: false,\n },\n directory: {\n type: \"string\",\n short: \"d\",\n },\n skipInstall: {\n type: \"boolean\",\n default: false,\n },\n skipSkills: {\n type: \"boolean\",\n default: false,\n },\n agent: {\n type: \"string\",\n },\n yes: {\n type: \"boolean\",\n short: \"y\",\n default: false,\n },\n },\n allowPositionals: true,\n });\n\n // Show help if requested\n if (values.help) {\n showHelp(templates);\n process.exit(0);\n }\n\n // Extract CLI arguments\n const cliTemplate = positionals[0];\n const cliDirectory = values.directory;\n const skipInstall = values.skipInstall;\n const skipSkills = values.skipSkills;\n const cliAgent = values.agent;\n const nonInteractive = values.yes;\n\n // Validate template if provided\n if (cliTemplate && !templates.includes(cliTemplate)) {\n process.stderr.write(\n chalk.red(`Error: Template \"${cliTemplate}\" does not exist.\\n\\n`),\n );\n process.stderr.write(chalk.bold(\"Available templates:\\n\"));\n for (const t of templates) {\n process.stderr.write(` - ${t}\\n`);\n }\n process.stderr.write(\n chalk.dim(\"\\nRun with --help for more information.\\n\"),\n );\n process.exit(1);\n }\n\n // Build prompts array - ask ALL questions upfront before any network calls\n const promptQuestions: prompts.PromptObject[] = [];\n\n if (!cliDirectory && !nonInteractive) {\n promptQuestions.push({\n type: \"text\",\n name: \"directoryName\",\n message: \"Enter the name of the directory to generate into:\",\n initial: \"my-project\",\n });\n }\n\n if (!cliTemplate && !nonInteractive) {\n promptQuestions.push({\n type: \"select\",\n name: \"templateName\",\n message: \"Choose a starter template:\",\n choices: templates.map((template) => ({\n title: template,\n value: template,\n })),\n });\n }\n\n // Ask about agent skills upfront (unless skipped via CLI)\n if (!skipSkills && !cliAgent && !nonInteractive) {\n // Get agent choices sorted by detection\n const agentChoices = await getAgentChoices();\n \n promptQuestions.push({\n type: \"confirm\",\n name: \"installSkills\",\n message: \"Install AI agent skills for better coding assistance?\",\n initial: true,\n });\n \n promptQuestions.push({\n type: (_prev, values) => (values.installSkills ? \"select\" : null),\n name: \"agent\",\n message: \"Which AI coding agent are you using?\",\n choices: agentChoices,\n initial: 0,\n });\n }\n\n // Prompt for all missing information at once\n const answers =\n promptQuestions.length > 0 ? await prompts(promptQuestions) : {};\n\n // Handle user cancellation\n if (\n (!cliDirectory && !nonInteractive && !answers.directoryName) ||\n (!cliTemplate && !nonInteractive && !answers.templateName)\n ) {\n process.stderr.write(chalk.red(\"\\nCancelled\\n\"));\n process.exit(1);\n }\n\n // Use CLI args or prompted values (with defaults for non-interactive mode)\n const directoryName =\n cliDirectory || answers.directoryName || \"my-project\";\n const templateName = cliTemplate || answers.templateName || templates[0];\n \n // Determine agent selection from CLI or prompts\n let selectedAgent = cliAgent || answers.agent;\n \n // Default to cursor in non-interactive mode if skills not skipped\n if (!skipSkills && !selectedAgent && nonInteractive) {\n selectedAgent = \"cursor\";\n }\n\n const targetDir = path.join(process.cwd(), directoryName);\n const templateDir = path.join(__dirname, \"templates\", templateName);\n\n const exists = await checkDirectoryExists(targetDir);\n\n if (exists) {\n process.stderr.write(\n chalk.yellow(`Directory ${targetDir} already exists.\\n`),\n );\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: \"Directory already exists. Do you want to overwrite it?\",\n initial: false,\n });\n\n if (!overwrite) {\n process.stderr.write(chalk.red(\"Aborting...\\n\"));\n process.exit(1);\n }\n }\n\n process.stderr.write(`\\nCreating project in directory: ${targetDir}\\n`);\n process.stderr.write(`Using template: ${templateName}\\n\\n`);\n\n // Copy the selected template to the target directory\n await cp(templateDir, targetDir, { recursive: true });\n\n const pkgManager = getUserPkgManager();\n let depsInstalled = false;\n let skillsInstalled = false;\n\n // All questions have been asked - now do the work\n \n // Install dependencies unless skipped\n if (!skipInstall) {\n depsInstalled = await installDependencies(targetDir);\n }\n\n // Install agent skills if an agent was selected\n if (!skipSkills && selectedAgent && selectedAgent !== \"skip\") {\n skillsInstalled = await installAgentSkills(targetDir, selectedAgent);\n }\n\n // Success message\n process.stderr.write(chalk.green.bold(\"\\n✓ Project created successfully!\\n\"));\n\n if (depsInstalled) {\n process.stderr.write(chalk.green(\"✓ Dependencies installed\\n\"));\n }\n\n if (skillsInstalled) {\n process.stderr.write(\n chalk.green(`✓ Agent skills installed (${selectedAgent})\\n`)\n );\n }\n\n process.stderr.write(chalk.bold(\"\\nYour project is ready! 🎉\\n\\n\"));\n\n // Next steps\n process.stderr.write(chalk.bold(\"Next steps:\\n\"));\n process.stderr.write(chalk.cyan(` cd ${directoryName}\\n`));\n\n if (!depsInstalled) {\n process.stderr.write(chalk.cyan(` ${pkgManager} install\\n`));\n }\n\n process.stderr.write(chalk.cyan(` ${getStartCommand(pkgManager)}\\n`));\n\n // Skills info\n if (skillsInstalled) {\n process.stderr.write(chalk.bold(\"\\nAI Agent Skills installed:\\n\"));\n process.stderr.write(\n chalk.dim(\" • elements-composition - HTML/Web Components\\n\")\n );\n process.stderr.write(\n chalk.dim(\" • react-composition - React components\\n\")\n );\n process.stderr.write(\n chalk.dim(\" • motion-design - Animation principles\\n\")\n );\n\n process.stderr.write(chalk.bold(\"\\nTry asking your AI agent:\\n\"));\n process.stderr.write(\n chalk.dim(' \"Create a 5-second video with fade-in text\"\\n')\n );\n process.stderr.write(chalk.dim(' \"Add a waveform visualization\"\\n'));\n process.stderr.write(\n chalk.dim(' \"Animate this element with spring physics\"\\n')\n );\n }\n\n process.stderr.write(\n chalk.dim(\"\\nDocumentation: https://editframe.com/docs\\n\")\n );\n process.stderr.write(chalk.dim(\"Happy coding! 🎬\\n\\n\"));\n}\n\nmain();\n"],"mappings":"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"}
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
"author": "",
|
|
12
12
|
"license": "ISC",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@editframe/cli": "0.37.
|
|
15
|
-
"@editframe/elements": "0.37.
|
|
16
|
-
"@editframe/vite-plugin": "0.37.
|
|
14
|
+
"@editframe/cli": "0.37.2-beta",
|
|
15
|
+
"@editframe/elements": "0.37.2-beta",
|
|
16
|
+
"@editframe/vite-plugin": "0.37.2-beta",
|
|
17
17
|
"animejs": "^4.2.2",
|
|
18
18
|
"prismjs": "^1.30.0",
|
|
19
19
|
"tailwindcss": "^3.4.3",
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
"author": "",
|
|
12
12
|
"license": "ISC",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@editframe/cli": "0.37.
|
|
15
|
-
"@editframe/elements": "0.37.
|
|
16
|
-
"@editframe/vite-plugin": "0.37.
|
|
14
|
+
"@editframe/cli": "0.37.2-beta",
|
|
15
|
+
"@editframe/elements": "0.37.2-beta",
|
|
16
|
+
"@editframe/vite-plugin": "0.37.2-beta",
|
|
17
17
|
"tailwindcss": "^3.4.3",
|
|
18
18
|
"vite": "^6.3.5",
|
|
19
19
|
"vite-plugin-singlefile": "^2.0.1"
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
"start": "editframe preview"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@editframe/cli": "0.37.
|
|
11
|
-
"@editframe/elements": "0.37.
|
|
12
|
-
"@editframe/vite-plugin": "0.37.
|
|
10
|
+
"@editframe/cli": "0.37.2-beta",
|
|
11
|
+
"@editframe/elements": "0.37.2-beta",
|
|
12
|
+
"@editframe/vite-plugin": "0.37.2-beta",
|
|
13
13
|
"tailwindcss": "^3.4.3",
|
|
14
14
|
"vite": "^6.3.5",
|
|
15
15
|
"vite-plugin-singlefile": "^2.0.1"
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
"start": "editframe preview"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@editframe/cli": "0.37.
|
|
11
|
-
"@editframe/react": "0.37.
|
|
12
|
-
"@editframe/vite-plugin": "0.37.
|
|
10
|
+
"@editframe/cli": "0.37.2-beta",
|
|
11
|
+
"@editframe/react": "0.37.2-beta",
|
|
12
|
+
"@editframe/vite-plugin": "0.37.2-beta",
|
|
13
13
|
"@vitejs/plugin-react": "^4.3.1",
|
|
14
14
|
"tailwindcss": "^3.4.3",
|
|
15
15
|
"vite": "^6.3.5",
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
"author": "",
|
|
12
12
|
"license": "ISC",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@editframe/cli": "0.37.
|
|
15
|
-
"@editframe/react": "0.37.
|
|
16
|
-
"@editframe/vite-plugin": "0.37.
|
|
14
|
+
"@editframe/cli": "0.37.2-beta",
|
|
15
|
+
"@editframe/react": "0.37.2-beta",
|
|
16
|
+
"@editframe/vite-plugin": "0.37.2-beta",
|
|
17
17
|
"@vitejs/plugin-react": "^4.3.1",
|
|
18
18
|
"tailwindcss": "^3.4.3",
|
|
19
19
|
"vite": "^6.3.5",
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
"author": "",
|
|
12
12
|
"license": "ISC",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@editframe/cli": "0.37.
|
|
15
|
-
"@editframe/elements": "0.37.
|
|
16
|
-
"@editframe/vite-plugin": "0.37.
|
|
14
|
+
"@editframe/cli": "0.37.2-beta",
|
|
15
|
+
"@editframe/elements": "0.37.2-beta",
|
|
16
|
+
"@editframe/vite-plugin": "0.37.2-beta",
|
|
17
17
|
"tailwindcss": "^3.4.3",
|
|
18
18
|
"vite": "^6.3.5",
|
|
19
19
|
"vite-plugin-singlefile": "^2.0.1"
|
package/dist/utils.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
import { execa } from "execa";
|
|
3
|
-
import ora from "ora";
|
|
4
3
|
|
|
5
4
|
//#region src/utils.ts
|
|
6
5
|
/**
|
|
@@ -17,42 +16,15 @@ function getUserPkgManager() {
|
|
|
17
16
|
return "npm";
|
|
18
17
|
}
|
|
19
18
|
/**
|
|
20
|
-
* Execute a package manager command with a spinner for progress indication.
|
|
21
|
-
*/
|
|
22
|
-
async function execWithSpinner(projectDir, pkgManager, options) {
|
|
23
|
-
const { onDataHandle, args = ["install"], stdout = "pipe" } = options;
|
|
24
|
-
const spinner = ora(`Running ${pkgManager} install...`).start();
|
|
25
|
-
const subprocess = execa(pkgManager, args, {
|
|
26
|
-
cwd: projectDir,
|
|
27
|
-
stdout
|
|
28
|
-
});
|
|
29
|
-
await new Promise((res, rej) => {
|
|
30
|
-
if (onDataHandle) subprocess.stdout?.on("data", onDataHandle(spinner));
|
|
31
|
-
subprocess.on("error", (e) => rej(e));
|
|
32
|
-
subprocess.on("close", () => res());
|
|
33
|
-
});
|
|
34
|
-
return spinner;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
19
|
* Run the appropriate install command for the detected package manager.
|
|
20
|
+
* Shows full output to the user so they can see progress.
|
|
38
21
|
*/
|
|
39
22
|
async function runInstallCommand(pkgManager, projectDir) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
});
|
|
46
|
-
return null;
|
|
47
|
-
case "pnpm": return execWithSpinner(projectDir, pkgManager, { onDataHandle: (spinner) => (data) => {
|
|
48
|
-
const text = data.toString();
|
|
49
|
-
if (text.includes("Progress")) spinner.text = text.includes("|") ? text.split(" | ")[1] ?? "" : text;
|
|
50
|
-
} });
|
|
51
|
-
case "yarn": return execWithSpinner(projectDir, pkgManager, { onDataHandle: (spinner) => (data) => {
|
|
52
|
-
spinner.text = data.toString().trim();
|
|
53
|
-
} });
|
|
54
|
-
case "bun": return execWithSpinner(projectDir, pkgManager, { stdout: "ignore" });
|
|
55
|
-
}
|
|
23
|
+
await execa(pkgManager, ["install"], {
|
|
24
|
+
cwd: projectDir,
|
|
25
|
+
stdout: "inherit",
|
|
26
|
+
stderr: "inherit"
|
|
27
|
+
});
|
|
56
28
|
}
|
|
57
29
|
/**
|
|
58
30
|
* Install dependencies in the project directory.
|
|
@@ -60,7 +32,9 @@ async function runInstallCommand(pkgManager, projectDir) {
|
|
|
60
32
|
async function installDependencies(projectDir) {
|
|
61
33
|
const pkgManager = getUserPkgManager();
|
|
62
34
|
try {
|
|
63
|
-
|
|
35
|
+
process.stderr.write(chalk.bold(`\nInstalling dependencies with ${pkgManager}...\n\n`));
|
|
36
|
+
await runInstallCommand(pkgManager, projectDir);
|
|
37
|
+
process.stderr.write(chalk.green("\n✓ Dependencies installed successfully!\n"));
|
|
64
38
|
return true;
|
|
65
39
|
} catch (error) {
|
|
66
40
|
process.stderr.write(chalk.yellow("\n⚠ Dependency installation failed\n"));
|
|
@@ -74,30 +48,34 @@ async function installDependencies(projectDir) {
|
|
|
74
48
|
* Install AI agent skills using the ai-agent-skills CLI.
|
|
75
49
|
*/
|
|
76
50
|
async function installAgentSkills(projectDir, agent) {
|
|
77
|
-
const spinner = ora("Installing AI agent skills...").start();
|
|
78
51
|
try {
|
|
52
|
+
process.stderr.write(chalk.bold(`\nInstalling AI agent skills for ${agent}...\n\n`));
|
|
79
53
|
await execa("npx", [
|
|
80
54
|
"ai-agent-skills",
|
|
81
55
|
"install",
|
|
82
56
|
"editframe/skills",
|
|
83
57
|
...agent === "all" ? [] : ["--agent", agent]
|
|
84
|
-
], {
|
|
85
|
-
|
|
58
|
+
], {
|
|
59
|
+
cwd: projectDir,
|
|
60
|
+
stdout: "inherit",
|
|
61
|
+
stderr: "inherit"
|
|
62
|
+
});
|
|
63
|
+
process.stderr.write(chalk.green(`\n✓ Agent skills installed for ${agent}!\n`));
|
|
86
64
|
return true;
|
|
87
65
|
} catch (error) {
|
|
88
|
-
|
|
89
|
-
process.stderr.write(chalk.dim("
|
|
66
|
+
process.stderr.write(chalk.yellow("\n⚠ Failed to install agent skills\n"));
|
|
67
|
+
process.stderr.write(chalk.dim("You can install manually:\n"));
|
|
90
68
|
process.stderr.write(chalk.cyan(` npx ai-agent-skills install editframe/skills --agent ${agent}\n\n`));
|
|
91
69
|
return false;
|
|
92
70
|
}
|
|
93
71
|
}
|
|
94
72
|
/**
|
|
95
|
-
* Get the appropriate
|
|
73
|
+
* Get the appropriate start command for the package manager.
|
|
96
74
|
*/
|
|
97
|
-
function
|
|
98
|
-
return pkgManager === "npm" ? "npm
|
|
75
|
+
function getStartCommand(pkgManager) {
|
|
76
|
+
return pkgManager === "npm" ? "npm start" : `${pkgManager} start`;
|
|
99
77
|
}
|
|
100
78
|
|
|
101
79
|
//#endregion
|
|
102
|
-
export {
|
|
80
|
+
export { getStartCommand, getUserPkgManager, installAgentSkills, installDependencies };
|
|
103
81
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import { execa } from \"execa\";\nimport
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import { execa } from \"execa\";\nimport chalk from \"chalk\";\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/**\n * Detect which package manager was used to invoke the create script.\n * Uses the npm_config_user_agent environment variable set by package managers.\n */\nexport function getUserPkgManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent;\n\n if (userAgent) {\n if (userAgent.startsWith(\"yarn\")) return \"yarn\";\n if (userAgent.startsWith(\"pnpm\")) return \"pnpm\";\n if (userAgent.startsWith(\"bun\")) return \"bun\";\n }\n\n return \"npm\"; // Default fallback\n}\n\n/**\n * Run the appropriate install command for the detected package manager.\n * Shows full output to the user so they can see progress.\n */\nasync function runInstallCommand(\n pkgManager: PackageManager,\n projectDir: string\n): Promise<void> {\n // Show all output directly to user - no hiding behind spinners\n await execa(pkgManager, [\"install\"], {\n cwd: projectDir,\n stdout: \"inherit\",\n stderr: \"inherit\",\n });\n}\n\n/**\n * Install dependencies in the project directory.\n */\nexport async function installDependencies(projectDir: string): Promise<boolean> {\n const pkgManager = getUserPkgManager();\n\n try {\n process.stderr.write(chalk.bold(`\\nInstalling dependencies with ${pkgManager}...\\n\\n`));\n \n await runInstallCommand(pkgManager, projectDir);\n\n process.stderr.write(chalk.green(\"\\n✓ Dependencies installed successfully!\\n\"));\n\n return true;\n } catch (error) {\n process.stderr.write(chalk.yellow(\"\\n⚠ Dependency installation failed\\n\"));\n process.stderr.write(chalk.dim(\"You can install manually:\\n\"));\n process.stderr.write(chalk.cyan(` cd ${projectDir.split(\"/\").pop()}\\n`));\n process.stderr.write(chalk.cyan(` ${pkgManager} install\\n\\n`));\n return false;\n }\n}\n\n/**\n * Install AI agent skills using the ai-agent-skills CLI.\n */\nexport async function installAgentSkills(\n projectDir: string,\n agent: string\n): Promise<boolean> {\n try {\n process.stderr.write(chalk.bold(`\\nInstalling AI agent skills for ${agent}...\\n\\n`));\n \n const agentFlag = agent === \"all\" ? [] : [\"--agent\", agent];\n\n await execa(\n \"npx\",\n [\"ai-agent-skills\", \"install\", \"editframe/skills\", ...agentFlag],\n { \n cwd: projectDir,\n stdout: \"inherit\",\n stderr: \"inherit\",\n }\n );\n\n process.stderr.write(chalk.green(`\\n✓ Agent skills installed for ${agent}!\\n`));\n return true;\n } catch (error) {\n process.stderr.write(chalk.yellow(\"\\n⚠ Failed to install agent skills\\n\"));\n process.stderr.write(chalk.dim(\"You can install manually:\\n\"));\n process.stderr.write(\n chalk.cyan(\n ` npx ai-agent-skills install editframe/skills --agent ${agent}\\n\\n`\n )\n );\n return false;\n }\n}\n\n/**\n * Get the appropriate start command for the package manager.\n */\nexport function getStartCommand(pkgManager: PackageManager): string {\n return pkgManager === \"npm\" ? \"npm start\" : `${pkgManager} start`;\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,oBAAoC;CAClD,MAAM,YAAY,QAAQ,IAAI;AAE9B,KAAI,WAAW;AACb,MAAI,UAAU,WAAW,OAAO,CAAE,QAAO;AACzC,MAAI,UAAU,WAAW,OAAO,CAAE,QAAO;AACzC,MAAI,UAAU,WAAW,MAAM,CAAE,QAAO;;AAG1C,QAAO;;;;;;AAOT,eAAe,kBACb,YACA,YACe;AAEf,OAAM,MAAM,YAAY,CAAC,UAAU,EAAE;EACnC,KAAK;EACL,QAAQ;EACR,QAAQ;EACT,CAAC;;;;;AAMJ,eAAsB,oBAAoB,YAAsC;CAC9E,MAAM,aAAa,mBAAmB;AAEtC,KAAI;AACF,UAAQ,OAAO,MAAM,MAAM,KAAK,kCAAkC,WAAW,SAAS,CAAC;AAEvF,QAAM,kBAAkB,YAAY,WAAW;AAE/C,UAAQ,OAAO,MAAM,MAAM,MAAM,6CAA6C,CAAC;AAE/E,SAAO;UACA,OAAO;AACd,UAAQ,OAAO,MAAM,MAAM,OAAO,uCAAuC,CAAC;AAC1E,UAAQ,OAAO,MAAM,MAAM,IAAI,8BAA8B,CAAC;AAC9D,UAAQ,OAAO,MAAM,MAAM,KAAK,QAAQ,WAAW,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACzE,UAAQ,OAAO,MAAM,MAAM,KAAK,KAAK,WAAW,cAAc,CAAC;AAC/D,SAAO;;;;;;AAOX,eAAsB,mBACpB,YACA,OACkB;AAClB,KAAI;AACF,UAAQ,OAAO,MAAM,MAAM,KAAK,oCAAoC,MAAM,SAAS,CAAC;AAIpF,QAAM,MACJ,OACA;GAAC;GAAmB;GAAW;GAAoB,GAJnC,UAAU,QAAQ,EAAE,GAAG,CAAC,WAAW,MAAM;GAIO,EAChE;GACE,KAAK;GACL,QAAQ;GACR,QAAQ;GACT,CACF;AAED,UAAQ,OAAO,MAAM,MAAM,MAAM,kCAAkC,MAAM,KAAK,CAAC;AAC/E,SAAO;UACA,OAAO;AACd,UAAQ,OAAO,MAAM,MAAM,OAAO,uCAAuC,CAAC;AAC1E,UAAQ,OAAO,MAAM,MAAM,IAAI,8BAA8B,CAAC;AAC9D,UAAQ,OAAO,MACb,MAAM,KACJ,0DAA0D,MAAM,MACjE,CACF;AACD,SAAO;;;;;;AAOX,SAAgB,gBAAgB,YAAoC;AAClE,QAAO,eAAe,QAAQ,cAAc,GAAG,WAAW"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@editframe/create",
|
|
3
|
-
"version": "0.37.
|
|
3
|
+
"version": "0.37.2-beta",
|
|
4
4
|
"description": "",
|
|
5
5
|
"bin": {
|
|
6
6
|
"create-editframe": "dist/index.js"
|
|
@@ -23,8 +23,7 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"chalk": "^5.3.0",
|
|
25
25
|
"prompts": "^2.4.2",
|
|
26
|
-
"execa": "^9.5.2"
|
|
27
|
-
"ora": "^8.1.1"
|
|
26
|
+
"execa": "^9.5.2"
|
|
28
27
|
},
|
|
29
28
|
"module": "./dist/index.js",
|
|
30
29
|
"types": "./dist/index.d.ts",
|