fe-kit-cli 0.0.2 → 0.0.3
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/cli.mjs +56 -12
- package/dist/cli.mjs.map +1 -1
- package/dist/skills/using-superpowers/SKILL.md +117 -0
- package/dist/skills/using-superpowers/references/codex-tools.md +100 -0
- package/dist/skills/using-superpowers/references/copilot-tools.md +52 -0
- package/dist/skills/using-superpowers/references/gemini-tools.md +33 -0
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import { Command } from "commander";
|
|
|
6
6
|
// src/constants/meta.ts
|
|
7
7
|
var CLI_NAME = "fe-kit";
|
|
8
8
|
var META_DIR = ".fe-kit";
|
|
9
|
-
var CLI_VERSION = "0.
|
|
9
|
+
var CLI_VERSION = "0.0.3";
|
|
10
10
|
|
|
11
11
|
// src/constants/frameworks.ts
|
|
12
12
|
var FRAMEWORKS = ["vue", "react"];
|
|
@@ -228,7 +228,8 @@ async function runInitPrompts() {
|
|
|
228
228
|
name: "skills",
|
|
229
229
|
message: "Built-in Skills to enable:",
|
|
230
230
|
choices: getSkillCatalog().map((s) => ({
|
|
231
|
-
title:
|
|
231
|
+
title: s.label,
|
|
232
|
+
description: s.description,
|
|
232
233
|
value: s.id,
|
|
233
234
|
selected: false
|
|
234
235
|
}))
|
|
@@ -238,7 +239,8 @@ async function runInitPrompts() {
|
|
|
238
239
|
name: "mcpServers",
|
|
239
240
|
message: "MCP servers to enable:",
|
|
240
241
|
choices: getMcpCatalog().map((m) => ({
|
|
241
|
-
title:
|
|
242
|
+
title: m.label,
|
|
243
|
+
description: m.description,
|
|
242
244
|
value: m.id,
|
|
243
245
|
selected: false
|
|
244
246
|
}))
|
|
@@ -691,7 +693,16 @@ import { fileURLToPath as fileURLToPath3 } from "url";
|
|
|
691
693
|
import fs5 from "fs-extra";
|
|
692
694
|
var __dirname2 = path6.dirname(fileURLToPath3(import.meta.url));
|
|
693
695
|
function rulesSourceDir() {
|
|
694
|
-
|
|
696
|
+
const candidates = [
|
|
697
|
+
path6.resolve(__dirname2, "rules"),
|
|
698
|
+
path6.resolve(__dirname2, "..", "rules"),
|
|
699
|
+
path6.resolve(__dirname2, "..", "..", "src", "rules"),
|
|
700
|
+
path6.resolve(process.cwd(), "src", "rules")
|
|
701
|
+
];
|
|
702
|
+
for (const dir of candidates) {
|
|
703
|
+
if (fs5.existsSync(dir)) return dir;
|
|
704
|
+
}
|
|
705
|
+
return candidates[0];
|
|
695
706
|
}
|
|
696
707
|
async function writeRules(projectRoot, framework) {
|
|
697
708
|
const targetDir = path6.join(projectRoot, META_DIR, "rules");
|
|
@@ -922,7 +933,26 @@ import { fileURLToPath as fileURLToPath4 } from "url";
|
|
|
922
933
|
import fs8 from "fs-extra";
|
|
923
934
|
var __dirname3 = path9.dirname(fileURLToPath4(import.meta.url));
|
|
924
935
|
function rulesSourceDir2() {
|
|
925
|
-
|
|
936
|
+
const candidates = [
|
|
937
|
+
// Built output: dist/rules (when bundled into dist/cli.mjs)
|
|
938
|
+
path9.resolve(__dirname3, "rules"),
|
|
939
|
+
// Built output: dist/rules (when running from dist/core/*)
|
|
940
|
+
path9.resolve(__dirname3, "..", "rules"),
|
|
941
|
+
// Source repo: src/rules (when running from src/core/*)
|
|
942
|
+
path9.resolve(__dirname3, "..", "..", "src", "rules"),
|
|
943
|
+
// Fallback for running from repo root without a build
|
|
944
|
+
path9.resolve(process.cwd(), "src", "rules")
|
|
945
|
+
];
|
|
946
|
+
for (const dir of candidates) {
|
|
947
|
+
if (fs8.existsSync(dir)) return dir;
|
|
948
|
+
}
|
|
949
|
+
return candidates[0];
|
|
950
|
+
}
|
|
951
|
+
function stripFrontmatter(raw) {
|
|
952
|
+
if (!raw.startsWith("---")) return raw.trim();
|
|
953
|
+
const end = raw.indexOf("\n---", 3);
|
|
954
|
+
if (end === -1) return raw.trim();
|
|
955
|
+
return raw.slice(end + "\n---".length).replace(/^\s*\n+/, "").trimEnd();
|
|
926
956
|
}
|
|
927
957
|
function mapFrameworkDir(fw) {
|
|
928
958
|
if (fw === "vue" || fw === "nuxt") return "vue";
|
|
@@ -931,6 +961,10 @@ function mapFrameworkDir(fw) {
|
|
|
931
961
|
}
|
|
932
962
|
async function loadRuleSources(framework) {
|
|
933
963
|
const srcBase = rulesSourceDir2();
|
|
964
|
+
if (!await fs8.pathExists(srcBase)) {
|
|
965
|
+
logger.warn(`Rules source directory not found: ${srcBase}`);
|
|
966
|
+
return [];
|
|
967
|
+
}
|
|
934
968
|
const fwDir = mapFrameworkDir(framework);
|
|
935
969
|
const dirs = [
|
|
936
970
|
{ dir: path9.join(srcBase, "common"), category: "common" }
|
|
@@ -943,12 +977,13 @@ async function loadRuleSources(framework) {
|
|
|
943
977
|
if (!await fs8.pathExists(dir)) continue;
|
|
944
978
|
const files = await fs8.readdir(dir);
|
|
945
979
|
for (const file of files) {
|
|
946
|
-
|
|
947
|
-
|
|
980
|
+
const ext = path9.extname(file).toLowerCase();
|
|
981
|
+
if (ext !== ".md" && ext !== ".mdc") continue;
|
|
982
|
+
const raw = await fs8.readFile(path9.join(dir, file), "utf-8");
|
|
948
983
|
rules.push({
|
|
949
|
-
name: path9.basename(file,
|
|
984
|
+
name: path9.basename(file, ext),
|
|
950
985
|
category,
|
|
951
|
-
content:
|
|
986
|
+
content: stripFrontmatter(raw)
|
|
952
987
|
});
|
|
953
988
|
}
|
|
954
989
|
}
|
|
@@ -1198,7 +1233,14 @@ var ideaAdapter = {
|
|
|
1198
1233
|
async applyRules(ctx) {
|
|
1199
1234
|
const dir = path15.join(ctx.projectRoot, TOOL_CONFIG_PATHS.idea);
|
|
1200
1235
|
await fs13.ensureDir(dir);
|
|
1201
|
-
|
|
1236
|
+
const rulesDir = path15.join(dir, "fe-kit", "rules");
|
|
1237
|
+
await fs13.ensureDir(rulesDir);
|
|
1238
|
+
const rules = await loadRuleSources(ctx.framework);
|
|
1239
|
+
for (const rule of rules) {
|
|
1240
|
+
const filename = `${rule.category}-${rule.name}.md`;
|
|
1241
|
+
await fs13.writeFile(path15.join(rulesDir, filename), rule.content + "\n", "utf-8");
|
|
1242
|
+
}
|
|
1243
|
+
logger.success("IDEA: rules written to .idea/fe-kit/rules/");
|
|
1202
1244
|
}
|
|
1203
1245
|
};
|
|
1204
1246
|
|
|
@@ -1426,7 +1468,8 @@ async function runEnhancePrompts(stack) {
|
|
|
1426
1468
|
name: "skills",
|
|
1427
1469
|
message: "Skills to add:",
|
|
1428
1470
|
choices: getSkillCatalog().map((s) => ({
|
|
1429
|
-
title:
|
|
1471
|
+
title: s.label,
|
|
1472
|
+
description: s.description,
|
|
1430
1473
|
value: s.id,
|
|
1431
1474
|
selected: false
|
|
1432
1475
|
}))
|
|
@@ -1436,7 +1479,8 @@ async function runEnhancePrompts(stack) {
|
|
|
1436
1479
|
name: "mcpServers",
|
|
1437
1480
|
message: "MCP servers to add:",
|
|
1438
1481
|
choices: getMcpCatalog().map((m) => ({
|
|
1439
|
-
title:
|
|
1482
|
+
title: m.label,
|
|
1483
|
+
description: m.description,
|
|
1440
1484
|
value: m.id,
|
|
1441
1485
|
selected: false
|
|
1442
1486
|
}))
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/constants/meta.ts","../src/constants/frameworks.ts","../src/constants/bundlers.ts","../src/constants/tools.ts","../src/constants/lint.ts","../src/prompts/init-prompts.ts","../src/skills/catalog.ts","../src/mcp/catalog.ts","../src/generators/project-generator.ts","../src/utils/logger.ts","../src/generators/lint-generator.ts","../src/generators/fe-kit-meta-generator.ts","../src/utils/fs.ts","../src/core/merge-config.ts","../src/core/write-rules.ts","../src/generators/readme-generator.ts","../src/adapters/cursor.ts","../src/core/paths.ts","../src/core/rule-writers.ts","../src/adapters/claude-code.ts","../src/adapters/vscode.ts","../src/adapters/codebuddy-cn.ts","../src/adapters/trae.ts","../src/adapters/idea.ts","../src/adapters/registry.ts","../src/core/apply-adapters.ts","../src/commands/init.ts","../src/commands/enhance.ts","../src/core/detect-project.ts","../src/core/detect-stack.ts","../src/prompts/enhance-prompts.ts","../src/generators/quality-generator.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLI_NAME, CLI_VERSION } from './constants/index.js';\nimport { initCommand } from './commands/init.js';\nimport { enhanceCommand } from './commands/enhance.js';\n\nconst program = new Command();\n\nprogram\n .name(CLI_NAME)\n .description('Frontend project scaffold CLI — init, enhance, and manage your dev environment.')\n .version(CLI_VERSION);\n\nprogram\n .command('init')\n .description('Initialize a new frontend project with Vue or React + TypeScript')\n .action(async () => {\n try {\n await initCommand();\n } catch (err) {\n console.error(err);\n process.exitCode = 1;\n }\n });\n\nprogram\n .command('enhance')\n .description('Enhance an existing frontend project with dev tools, skills, MCP, and rules')\n .action(async () => {\n try {\n await enhanceCommand();\n } catch (err) {\n console.error(err);\n process.exitCode = 1;\n }\n });\n\nprogram.parse();\n","export const CLI_NAME = 'fe-kit';\nexport const META_DIR = '.fe-kit';\nexport const CLI_VERSION = '0.1.0';\n","export const FRAMEWORKS = ['vue', 'react'] as const;\nexport type Framework = (typeof FRAMEWORKS)[number];\n\nexport const ROUTERS: Record<Framework, string> = {\n vue: 'vue-router',\n react: 'react-router',\n};\n\nexport const STATE_MANAGERS: Record<Framework, readonly string[]> = {\n vue: ['pinia', 'vuex'] as const,\n react: ['redux-toolkit', 'zustand', 'mobx'] as const,\n};\n","export const BUNDLERS = ['vite', 'webpack', 'rspack'] as const;\nexport type Bundler = (typeof BUNDLERS)[number];\n","export const DEV_TOOLS = [\n 'cursor',\n 'claude-code',\n 'vscode',\n 'codebuddy-cn',\n 'trae',\n 'idea',\n] as const;\n\nexport type DevToolId = (typeof DEV_TOOLS)[number];\n","export const LINT_TOOLS = [\n 'eslint',\n 'stylelint',\n 'prettier',\n 'editorconfig',\n] as const;\n\nexport type LintTool = (typeof LINT_TOOLS)[number];\n\nexport const QUALITY_TOOLS = [\n 'eslint',\n 'stylelint',\n 'prettier',\n 'editorconfig',\n 'commitlint',\n] as const;\n\nexport type QualityTool = (typeof QUALITY_TOOLS)[number];\n","import path from 'node:path';\nimport prompts from 'prompts';\nimport type { InitAnswers } from '../types/selections.js';\nimport { FRAMEWORKS, ROUTERS, STATE_MANAGERS, type Framework } from '../constants/frameworks.js';\nimport { BUNDLERS } from '../constants/bundlers.js';\nimport { DEV_TOOLS } from '../constants/tools.js';\nimport { LINT_TOOLS } from '../constants/lint.js';\nimport { getSkillCatalog } from '../skills/catalog.js';\nimport { getMcpCatalog } from '../mcp/catalog.js';\n\n\nexport async function runInitPrompts(): Promise<InitAnswers | null> {\n const response = await prompts(\n [\n {\n type: 'text',\n name: 'projectName',\n message: 'Project name:',\n validate: (v: string) => (v.trim() ? true : 'Project name is required'),\n },\n {\n type: 'text',\n name: 'projectPath',\n message: 'Project path:',\n initial: (prev: string) => `./${prev}`,\n format: (v: string) => path.resolve(v),\n },\n {\n type: 'select',\n name: 'framework',\n message: 'Frontend framework:',\n choices: FRAMEWORKS.map((f) => ({ title: f.charAt(0).toUpperCase() + f.slice(1), value: f })),\n },\n {\n type: 'select',\n name: 'router',\n message: 'Router:',\n choices: (_prev: unknown, answers: Record<string, unknown>) => {\n const fw = answers.framework as Framework;\n return [{ title: ROUTERS[fw], value: ROUTERS[fw] }];\n },\n },\n {\n type: 'select',\n name: 'stateManagement',\n message: 'State management:',\n choices: (_prev: unknown, answers: Record<string, unknown>) => {\n const fw = answers.framework as Framework;\n return STATE_MANAGERS[fw].map((s) => ({ title: s, value: s }));\n },\n },\n {\n type: 'select',\n name: 'bundler',\n message: 'Build tool:',\n choices: BUNDLERS.map((b) => ({ title: b.charAt(0).toUpperCase() + b.slice(1), value: b })),\n },\n {\n type: 'multiselect',\n name: 'lintTools',\n message: 'Code quality tools (space to toggle):',\n choices: LINT_TOOLS.map((t) => ({\n title: t,\n value: t,\n selected: true,\n })),\n hint: 'ESLint + Prettier recommended',\n },\n {\n type: 'multiselect',\n name: 'devTools',\n message: 'Dev tools to configure:',\n choices: DEV_TOOLS.map((t) => ({ title: t, value: t, selected: t === 'cursor' })),\n min: 1,\n hint: 'Select at least one',\n },\n {\n type: 'multiselect',\n name: 'skills',\n message: 'Built-in Skills to enable:',\n choices: getSkillCatalog().map((s) => ({\n title: `${s.label} — ${s.description}`,\n value: s.id,\n selected: false,\n })),\n },\n {\n type: 'multiselect',\n name: 'mcpServers',\n message: 'MCP servers to enable:',\n choices: getMcpCatalog().map((m) => ({\n title: `${m.label} — ${m.description}`,\n value: m.id,\n selected: false,\n })),\n },\n ],\n { onCancel: () => process.exit(0) },\n );\n\n if (!response.projectName) return null;\n\n return response as InitAnswers;\n}\n","import type { SkillSelection } from '../adapters/types.js';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst { pathExistsSync, readdirSync, readFileSync } = fs;\n\nexport interface SkillDefinition {\n id: string;\n label: string;\n description: string;\n content: string;\n tags: string[];\n /** Absolute path to the original SKILL.md. */\n sourcePath: string;\n}\n\nfunction toLabel(id: string): string {\n return id\n .split(/[-_]/g)\n .filter(Boolean)\n .map((w) => w.slice(0, 1).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nfunction splitFrontmatter(raw: string): { meta: Record<string, string>; body: string } {\n if (!raw.startsWith('---\\n')) return { meta: {}, body: raw };\n\n const end = raw.indexOf('\\n---\\n', 4);\n if (end === -1) return { meta: {}, body: raw };\n\n const fm = raw.slice(4, end).trim();\n const body = raw.slice(end + '\\n---\\n'.length).replace(/^\\n+/, '');\n\n const meta: Record<string, string> = {};\n for (const line of fm.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const idx = trimmed.indexOf(':');\n if (idx <= 0) continue;\n const key = trimmed.slice(0, idx).trim();\n let value = trimmed.slice(idx + 1).trim();\n value = value.replace(/^\"(.*)\"$/, '$1').replace(/^'(.*)'$/, '$1');\n meta[key] = value;\n }\n\n return { meta, body };\n}\n\nfunction skillsDir(): string {\n return fileURLToPath(new URL('./skills/', import.meta.url));\n}\n\nfunction loadSkillsFromDir(): SkillDefinition[] {\n const dir = skillsDir();\n if (!pathExistsSync(dir)) return [];\n\n const entries = readdirSync(dir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n .sort((a, b) => a.localeCompare(b));\n\n const defs: SkillDefinition[] = [];\n for (const dirName of entries) {\n const p = path.join(dir, dirName, 'SKILL.md');\n if (!pathExistsSync(p)) continue;\n\n const raw = readFileSync(p, 'utf8');\n const { meta, body } = splitFrontmatter(raw);\n const id = meta.name?.trim() || dirName;\n const description = meta.description?.trim() || '';\n\n defs.push({\n id,\n label: toLabel(id),\n description,\n content: body.trimEnd(),\n tags: [],\n sourcePath: p,\n });\n }\n\n return defs;\n}\n\nexport function getSkillCatalog(): SkillDefinition[] {\n return loadSkillsFromDir();\n}\n\nexport function getSkillById(id: string): SkillSelection | undefined {\n const def = getSkillCatalog().find((s) => s.id === id);\n if (!def) return undefined;\n return { id: def.id, label: def.label, content: def.content, sourcePath: def.sourcePath };\n}\n","import type { McpSelection } from '../adapters/types.js';\n\nexport interface McpDefinition {\n id: string;\n label: string;\n description: string;\n config: Record<string, unknown>;\n}\n\nconst BUILTIN_MCP: McpDefinition[] = [\n {\n id: 'context7',\n label: 'Context7',\n description: 'Fetch up-to-date library documentation via Context7.',\n config: {\n command: 'npx',\n args: ['-y', '@upstash/context7-mcp@latest'],\n },\n },\n {\n id: 'sequential-thinking',\n label: 'Sequential Thinking',\n description: 'Step-by-step reasoning MCP server for complex problem solving.',\n config: {\n command: 'npx',\n args: ['-y', '@anthropic/sequential-thinking-mcp@latest'],\n },\n },\n {\n id: 'filesystem',\n label: 'Filesystem',\n description: 'Read/write project files via MCP.',\n config: {\n command: 'npx',\n args: ['-y', '@anthropic/filesystem-mcp@latest'],\n },\n },\n {\n id: 'exa-search',\n label: 'Exa Search',\n description: 'Neural web search for real-time information.',\n config: {\n command: 'npx',\n args: ['-y', 'exa-mcp-server@latest'],\n env: {\n EXA_API_KEY: '<your-exa-api-key>',\n },\n },\n },\n];\n\nexport function getMcpCatalog(): McpDefinition[] {\n return BUILTIN_MCP;\n}\n\nexport function getMcpById(id: string): McpSelection | undefined {\n const def = BUILTIN_MCP.find((m) => m.id === id);\n if (!def) return undefined;\n return { id: def.id, label: def.label, config: def.config };\n}\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\nimport type { InitAnswers } from '../types/selections.js';\nimport { logger } from '../utils/logger.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nfunction templateDir(framework: string, bundler: string): string {\n return path.resolve(__dirname, '..', 'templates', `${framework}-${bundler}-ts`);\n}\n\nexport async function generateProject(answers: InitAnswers): Promise<void> {\n const { projectPath, projectName, framework, bundler, router, stateManagement } = answers;\n\n await fs.ensureDir(projectPath);\n\n const srcTemplate = templateDir(framework, bundler);\n if (await fs.pathExists(srcTemplate)) {\n await fs.copy(srcTemplate, projectPath, { overwrite: false });\n logger.success(`Template ${framework}-${bundler}-ts copied`);\n } else {\n logger.warn(`No full template for ${framework}-${bundler}-ts. Generating minimal project.`);\n await generateMinimalProject(answers);\n }\n\n await patchPackageJson(projectPath, projectName, framework, bundler, router, stateManagement);\n logger.success('package.json configured');\n\n await ensureNextStyleScaffold(projectPath, framework);\n}\n\nasync function ensureNextStyleScaffold(projectPath: string, framework: InitAnswers['framework']): Promise<void> {\n // Next.js-like organization (no service/api). Keep it additive to avoid breaking existing templates.\n const dirs = [\n path.join(projectPath, 'public'),\n path.join(projectPath, 'src', 'app'),\n path.join(projectPath, 'src', 'components'),\n path.join(projectPath, 'src', 'hooks'),\n path.join(projectPath, 'src', 'lib'),\n path.join(projectPath, 'src', 'styles'),\n ];\n\n await Promise.all(dirs.map((d) => fs.ensureDir(d)));\n\n // Minimal placeholders to make folders visible in git and IDEs.\n const keepFiles = [\n path.join(projectPath, 'src', 'app', '.gitkeep'),\n path.join(projectPath, 'src', 'components', '.gitkeep'),\n path.join(projectPath, 'src', 'hooks', '.gitkeep'),\n path.join(projectPath, 'src', 'lib', '.gitkeep'),\n path.join(projectPath, 'src', 'styles', '.gitkeep'),\n path.join(projectPath, 'public', '.gitkeep'),\n ];\n await Promise.all(keepFiles.map((p) => fs.ensureFile(p)));\n\n // Framework-specific convention hints (purely additive).\n if (framework === 'vue') {\n await fs.ensureFile(path.join(projectPath, 'src', 'hooks', 'README.md'));\n await fs.writeFile(\n path.join(projectPath, 'src', 'hooks', 'README.md'),\n ['# hooks/', '', 'Vue 项目里这里更常放 `composables/`(可按团队习惯重命名)。', ''].join('\\n'),\n 'utf-8',\n );\n }\n}\n\nasync function generateMinimalProject(answers: InitAnswers): Promise<void> {\n const { projectPath, framework, bundler } = answers;\n const srcDir = path.join(projectPath, 'src');\n await fs.ensureDir(srcDir);\n\n const mainFile = framework === 'react' ? 'main.tsx' : 'main.ts';\n\n const mainContent = framework === 'react'\n ? [\n \"import React from 'react';\",\n \"import ReactDOM from 'react-dom/client';\",\n \"import App from './App';\",\n '',\n \"ReactDOM.createRoot(document.getElementById('root')!).render(\",\n ' <React.StrictMode>',\n ' <App />',\n ' </React.StrictMode>,',\n ');',\n ].join('\\n')\n : [\n \"import { createApp } from 'vue';\",\n \"import App from './App.vue';\",\n '',\n \"createApp(App).mount('#app');\",\n ].join('\\n');\n\n await fs.writeFile(path.join(srcDir, mainFile), mainContent, 'utf-8');\n\n if (framework === 'react') {\n await fs.writeFile(\n path.join(srcDir, 'App.tsx'),\n [\n \"import React from 'react';\",\n '',\n 'function App() {',\n ' return <div>Hello fe-kit</div>;',\n '}',\n '',\n 'export default App;',\n ].join('\\n'),\n 'utf-8',\n );\n } else {\n await fs.writeFile(\n path.join(srcDir, 'App.vue'),\n [\n '<script setup lang=\"ts\">',\n \"const msg = 'Hello fe-kit';\",\n '</script>',\n '',\n '<template>',\n ' <div>{{ msg }}</div>',\n '</template>',\n ].join('\\n'),\n 'utf-8',\n );\n }\n\n await fs.writeFile(\n path.join(projectPath, 'index.html'),\n [\n '<!DOCTYPE html>',\n '<html lang=\"en\">',\n '<head>',\n ' <meta charset=\"UTF-8\" />',\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />',\n ' <title>fe-kit project</title>',\n '</head>',\n '<body>',\n ` <div id=\"${framework === 'react' ? 'root' : 'app'}\"></div>`,\n ` <script type=\"module\" src=\"/src/${mainFile}\"></script>`,\n '</body>',\n '</html>',\n ].join('\\n'),\n 'utf-8',\n );\n\n const tsconfig = {\n compilerOptions: {\n target: 'ES2020',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n jsx: framework === 'react' ? 'react-jsx' : 'preserve',\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n isolatedModules: true,\n baseUrl: '.',\n paths: { '@/*': ['src/*'] },\n },\n include: ['src'],\n };\n await fs.writeJson(path.join(projectPath, 'tsconfig.json'), tsconfig, { spaces: 2 });\n\n await writeBundlerConfig(projectPath, framework, bundler);\n}\n\nasync function writeBundlerConfig(\n projectPath: string,\n framework: string,\n bundler: string,\n): Promise<void> {\n if (bundler === 'vite') {\n const plugin = framework === 'react'\n ? \"import react from '@vitejs/plugin-react';\"\n : \"import vue from '@vitejs/plugin-vue';\";\n const pluginCall = framework === 'react' ? 'react()' : 'vue()';\n\n await fs.writeFile(\n path.join(projectPath, 'vite.config.ts'),\n [\n \"import { defineConfig } from 'vite';\",\n plugin,\n '',\n 'export default defineConfig({',\n ` plugins: [${pluginCall}],`,\n ' resolve: {',\n \" alias: { '@': '/src' },\",\n ' },',\n '});',\n ].join('\\n'),\n 'utf-8',\n );\n } else if (bundler === 'webpack') {\n await fs.writeFile(\n path.join(projectPath, 'webpack.config.ts'),\n [\n \"// Webpack config placeholder — full template coming in P1\",\n \"import path from 'path';\",\n '',\n 'export default {',\n \" mode: 'development',\",\n \" entry: './src/main.\" + (framework === 'react' ? 'tsx' : 'ts') + \"',\",\n ' resolve: {',\n \" extensions: ['.ts', '.tsx', '.js', '.jsx', '.vue'],\",\n ' },',\n '};',\n ].join('\\n'),\n 'utf-8',\n );\n } else if (bundler === 'rspack') {\n await fs.writeFile(\n path.join(projectPath, 'rspack.config.ts'),\n [\n \"// Rspack config placeholder — full template coming in P1\",\n \"import { defineConfig } from '@rspack/cli';\",\n '',\n 'export default defineConfig({',\n \" entry: { main: './src/main.\" + (framework === 'react' ? 'tsx' : 'ts') + \"' },\",\n '});',\n ].join('\\n'),\n 'utf-8',\n );\n }\n}\n\nasync function patchPackageJson(\n projectPath: string,\n name: string,\n framework: string,\n bundler: string,\n router: string,\n stateManagement: string,\n): Promise<void> {\n const pkgPath = path.join(projectPath, 'package.json');\n const existing = (await fs.pathExists(pkgPath))\n ? await fs.readJson(pkgPath)\n : {};\n\n const deps: Record<string, string> = { ...existing.dependencies };\n const devDeps: Record<string, string> = { ...existing.devDependencies };\n\n if (framework === 'vue') {\n deps.vue = '^3.5.0';\n if (router === 'vue-router') deps['vue-router'] = '^4.5.0';\n if (stateManagement === 'pinia') deps.pinia = '^2.3.0';\n if (stateManagement === 'vuex') deps.vuex = '^4.1.0';\n } else {\n deps.react = '^19.0.0';\n deps['react-dom'] = '^19.0.0';\n devDeps['@types/react'] = '^19.0.0';\n devDeps['@types/react-dom'] = '^19.0.0';\n if (router === 'react-router') deps['react-router-dom'] = '^7.0.0';\n if (stateManagement === 'redux-toolkit') {\n deps['@reduxjs/toolkit'] = '^2.6.0';\n deps['react-redux'] = '^9.2.0';\n }\n if (stateManagement === 'zustand') deps.zustand = '^5.0.0';\n if (stateManagement === 'mobx') {\n deps.mobx = '^6.13.0';\n deps['mobx-react-lite'] = '^4.1.0';\n }\n }\n\n devDeps.typescript = '^5.8.0';\n\n if (bundler === 'vite') {\n devDeps.vite = '^6.3.0';\n if (framework === 'react') devDeps['@vitejs/plugin-react'] = '^4.4.0';\n if (framework === 'vue') devDeps['@vitejs/plugin-vue'] = '^5.2.0';\n } else if (bundler === 'webpack') {\n devDeps.webpack = '^5.99.0';\n devDeps['webpack-cli'] = '^6.0.0';\n devDeps['ts-loader'] = '^9.5.0';\n } else if (bundler === 'rspack') {\n devDeps['@rspack/core'] = '^1.3.0';\n devDeps['@rspack/cli'] = '^1.3.0';\n }\n\n const scripts: Record<string, string> = { ...existing.scripts };\n if (bundler === 'vite') {\n scripts.dev = 'vite';\n scripts.build = 'vite build';\n scripts.preview = 'vite preview';\n } else if (bundler === 'webpack') {\n scripts.dev = 'webpack serve --mode development';\n scripts.build = 'webpack --mode production';\n } else if (bundler === 'rspack') {\n scripts.dev = 'rspack serve';\n scripts.build = 'rspack build';\n }\n\n const pkg = {\n ...existing,\n name,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts,\n dependencies: deps,\n devDependencies: devDeps,\n };\n\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n}\n","import pc from 'picocolors';\n\nexport const logger = {\n info: (msg: string) => console.log(pc.cyan('ℹ'), msg),\n success: (msg: string) => console.log(pc.green('✔'), msg),\n warn: (msg: string) => console.log(pc.yellow('⚠'), msg),\n error: (msg: string) => console.error(pc.red('✖'), msg),\n step: (msg: string) => console.log(pc.blue('→'), msg),\n};\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { InitAnswers } from '../types/selections.js';\nimport type { LintTool } from '../constants/lint.js';\nimport { logger } from '../utils/logger.js';\n\nexport async function generateLintConfigs(answers: InitAnswers): Promise<void> {\n const { projectPath, lintTools, framework } = answers;\n\n for (const tool of lintTools) {\n await GENERATORS[tool]?.(projectPath, framework);\n }\n}\n\nconst GENERATORS: Record<LintTool, (root: string, fw: string) => Promise<void>> = {\n eslint: generateEslint,\n stylelint: generateStylelint,\n prettier: generatePrettier,\n editorconfig: generateEditorConfig,\n};\n\nasync function generateEslint(root: string, fw: string): Promise<void> {\n const pkgPath = path.join(root, 'package.json');\n const pkg = await fs.readJson(pkgPath);\n const devDeps = pkg.devDependencies ?? {};\n\n devDeps.eslint = '^9.25.0';\n devDeps['@eslint/js'] = '^9.25.0';\n devDeps['typescript-eslint'] = '^8.30.0';\n devDeps.globals = '^16.0.0';\n\n if (fw === 'vue') {\n devDeps['eslint-plugin-vue'] = '^10.0.0';\n } else {\n devDeps['eslint-plugin-react-hooks'] = '^5.2.0';\n devDeps['eslint-plugin-react-refresh'] = '^0.4.0';\n }\n\n pkg.devDependencies = devDeps;\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n\n const configLines = fw === 'vue'\n ? [\n \"import js from '@eslint/js';\",\n \"import tseslint from 'typescript-eslint';\",\n \"import pluginVue from 'eslint-plugin-vue';\",\n '',\n 'export default tseslint.config(',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n \" ...pluginVue.configs['flat/recommended'],\",\n ' {',\n \" files: ['**/*.vue'],\",\n ' languageOptions: {',\n ' parserOptions: { parser: tseslint.parser },',\n ' },',\n ' },',\n ');',\n ]\n : [\n \"import js from '@eslint/js';\",\n \"import tseslint from 'typescript-eslint';\",\n \"import reactHooks from 'eslint-plugin-react-hooks';\",\n \"import reactRefresh from 'eslint-plugin-react-refresh';\",\n \"import globals from 'globals';\",\n '',\n 'export default tseslint.config(',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n ' {',\n \" files: ['**/*.{ts,tsx}'],\",\n ' plugins: {',\n \" 'react-hooks': reactHooks,\",\n \" 'react-refresh': reactRefresh,\",\n ' },',\n ' languageOptions: {',\n ' globals: globals.browser,',\n ' },',\n ' rules: {',\n \" ...reactHooks.configs.recommended.rules,\",\n \" 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],\",\n ' },',\n ' },',\n ');',\n ];\n\n await fs.writeFile(path.join(root, 'eslint.config.mjs'), configLines.join('\\n'), 'utf-8');\n logger.success('ESLint 9 flat config generated');\n}\n\nasync function generateStylelint(root: string): Promise<void> {\n const pkgPath = path.join(root, 'package.json');\n const pkg = await fs.readJson(pkgPath);\n pkg.devDependencies = {\n ...pkg.devDependencies,\n stylelint: '^16.17.0',\n 'stylelint-config-standard': '^37.0.0',\n };\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n\n await fs.writeJson(\n path.join(root, '.stylelintrc.json'),\n { extends: ['stylelint-config-standard'] },\n { spaces: 2 },\n );\n logger.success('Stylelint config generated');\n}\n\nasync function generatePrettier(root: string): Promise<void> {\n const pkgPath = path.join(root, 'package.json');\n const pkg = await fs.readJson(pkgPath);\n pkg.devDependencies = { ...pkg.devDependencies, prettier: '^3.5.0' };\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n\n const config = {\n semi: true,\n singleQuote: true,\n tabWidth: 2,\n trailingComma: 'all' as const,\n printWidth: 100,\n };\n await fs.writeJson(path.join(root, '.prettierrc.json'), config, { spaces: 2 });\n logger.success('Prettier config generated');\n}\n\nasync function generateEditorConfig(root: string): Promise<void> {\n const content = [\n 'root = true',\n '',\n '[*]',\n 'indent_style = space',\n 'indent_size = 2',\n 'end_of_line = lf',\n 'charset = utf-8',\n 'trim_trailing_whitespace = true',\n 'insert_final_newline = true',\n ].join('\\n');\n\n await fs.writeFile(path.join(root, '.editorconfig'), content, 'utf-8');\n logger.success('EditorConfig generated');\n}\n\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { InitAnswers, EnhanceAnswers } from '../types/selections.js';\nimport type {\n ProjectMeta,\n SkillsMeta,\n McpMeta,\n ToolsMeta,\n SkillEntry,\n McpEntry,\n} from '../types/fe-kit-config.js';\nimport type { ProjectDetection } from '../core/detect-project.js';\nimport type { StackDetection } from '../core/detect-stack.js';\nimport { META_DIR, CLI_VERSION } from '../constants/meta.js';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { writeRules } from '../core/write-rules.js';\nimport { logger } from '../utils/logger.js';\n\nfunction metaDir(root: string): string {\n return path.join(root, META_DIR);\n}\n\n/** Called by `init` — writes fresh .fe-kit/ directory. */\nexport async function writeFeKitMeta(answers: InitAnswers): Promise<void> {\n const dir = metaDir(answers.projectPath);\n await fs.ensureDir(dir);\n\n const project: ProjectMeta = {\n name: answers.projectName,\n framework: answers.framework,\n router: answers.router,\n stateManagement: answers.stateManagement,\n bundler: answers.bundler,\n typescript: true,\n lintTools: answers.lintTools,\n templateVersion: '0.1.0',\n rulesVersion: '0.1.0',\n cliVersion: CLI_VERSION,\n };\n\n const skills: SkillsMeta = {\n enabled: answers.skills.map((id) => ({\n id,\n source: 'builtin' as const,\n targets: answers.devTools,\n version: CLI_VERSION,\n })),\n };\n\n const mcp: McpMeta = {\n enabled: answers.mcpServers.map((id) => ({\n id,\n adapterStatus: Object.fromEntries(answers.devTools.map((t) => [t, 'written' as const])),\n version: CLI_VERSION,\n })),\n configVersion: CLI_VERSION,\n };\n\n const tools: ToolsMeta = {\n selectedTools: answers.devTools,\n paths: {},\n extensionRecommendations: [],\n };\n\n await Promise.all([\n writeJsonSafe(path.join(dir, 'project.json'), project),\n writeJsonSafe(path.join(dir, 'skills.json'), skills),\n writeJsonSafe(path.join(dir, 'mcp.json'), mcp),\n writeJsonSafe(path.join(dir, 'tools.json'), tools),\n ]);\n\n await writeRules(answers.projectPath, answers.framework);\n logger.success(`.fe-kit/ metadata written`);\n}\n\n/** Called by `enhance` — merges into existing .fe-kit/ or creates it. */\nexport async function updateFeKitMeta(\n projectRoot: string,\n detection: ProjectDetection | StackDetection,\n answers: EnhanceAnswers,\n): Promise<void> {\n const dir = metaDir(projectRoot);\n await fs.ensureDir(dir);\n\n const fw = detection.framework;\n const isClassicDetection = 'router' in detection;\n\n const projectPath = path.join(dir, 'project.json');\n const existingProject = (await readJsonSafe<Record<string, unknown>>(projectPath)) ?? {\n name: detection.name,\n framework: fw,\n router: isClassicDetection ? ((detection as ProjectDetection).router ?? '') : '',\n stateManagement: isClassicDetection ? ((detection as ProjectDetection).stateManagement ?? '') : '',\n bundler: detection.bundler ?? 'vite',\n typescript: true,\n lintTools: [],\n templateVersion: '0.1.0',\n rulesVersion: '0.1.0',\n cliVersion: CLI_VERSION,\n };\n await writeJsonSafe(projectPath, { ...existingProject, cliVersion: CLI_VERSION });\n\n const skillsPath = path.join(dir, 'skills.json');\n const existingSkills = (await readJsonSafe<SkillsMeta>(skillsPath)) ?? { enabled: [] };\n const newSkillEntries: SkillEntry[] = answers.skills.map((id) => ({\n id,\n source: 'builtin' as const,\n targets: answers.devTools,\n version: CLI_VERSION,\n }));\n await writeJsonSafe(\n skillsPath,\n mergeConfig(existingSkills, { enabled: newSkillEntries }),\n );\n\n const mcpPath = path.join(dir, 'mcp.json');\n const existingMcp = (await readJsonSafe<McpMeta>(mcpPath)) ?? {\n enabled: [],\n configVersion: CLI_VERSION,\n };\n const newMcpEntries: McpEntry[] = answers.mcpServers.map((id) => ({\n id,\n adapterStatus: Object.fromEntries(answers.devTools.map((t) => [t, 'written' as const])),\n version: CLI_VERSION,\n }));\n await writeJsonSafe(\n mcpPath,\n mergeConfig(existingMcp, { enabled: newMcpEntries, configVersion: CLI_VERSION }),\n );\n\n const toolsPath = path.join(dir, 'tools.json');\n const existingTools = (await readJsonSafe<ToolsMeta>(toolsPath)) ?? {\n selectedTools: [],\n paths: {},\n extensionRecommendations: [],\n };\n await writeJsonSafe(\n toolsPath,\n mergeConfig(existingTools, { selectedTools: answers.devTools }),\n );\n\n await writeRules(projectRoot, fw);\n logger.success(`.fe-kit/ metadata updated`);\n}\n","import fs from 'fs-extra';\nimport path from 'node:path';\n\n/** Safely read a JSON file; returns undefined when file is missing or malformed. */\nexport async function readJsonSafe<T = unknown>(\n filePath: string,\n): Promise<T | undefined> {\n try {\n return (await fs.readJson(filePath)) as T;\n } catch {\n return undefined;\n }\n}\n\n/** Write JSON with consistent formatting. Creates parent dirs as needed. */\nexport async function writeJsonSafe(\n filePath: string,\n data: unknown,\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeJson(filePath, data, { spaces: 2 });\n}\n","import deepmerge from 'deepmerge';\n\n/**\n * Deep-merge two objects. Arrays of objects with `id` fields are merged\n * by id (idempotent append), plain arrays are deduplicated.\n */\nexport function mergeConfig<T>(base: T, incoming: Partial<T>): T {\n return deepmerge(base as any, incoming as any, {\n arrayMerge: idempotentArrayMerge,\n }) as T;\n}\n\nfunction idempotentArrayMerge(target: unknown[], source: unknown[]): unknown[] {\n if (isIdArray(target) || isIdArray(source)) {\n return mergeById(target as HasId[], source as HasId[]);\n }\n return [...new Set([...target, ...source])];\n}\n\ninterface HasId {\n id: string;\n [key: string]: unknown;\n}\n\nfunction isIdArray(arr: unknown[]): arr is HasId[] {\n return arr.length > 0 && typeof arr[0] === 'object' && arr[0] !== null && 'id' in arr[0];\n}\n\nfunction mergeById(target: HasId[], source: HasId[]): HasId[] {\n const map = new Map<string, HasId>();\n for (const item of target) map.set(item.id, item);\n for (const item of source) {\n const existing = map.get(item.id);\n map.set(item.id, existing ? deepmerge(existing, item) : item);\n }\n return [...map.values()];\n}\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\nimport type { Framework } from '../constants/frameworks.js';\nimport type { StackFramework } from './detect-stack.js';\nimport { META_DIR } from '../constants/meta.js';\nimport { logger } from '../utils/logger.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nfunction rulesSourceDir(): string {\n return path.resolve(__dirname, '..', 'rules');\n}\n\nexport async function writeRules(\n projectRoot: string,\n framework: Framework | StackFramework,\n): Promise<void> {\n const targetDir = path.join(projectRoot, META_DIR, 'rules');\n const srcBase = rulesSourceDir();\n\n const frameworkDir = mapFrameworkRulesDir(framework);\n const dirs = [\n ...(frameworkDir ? [path.join(srcBase, frameworkDir)] : []),\n path.join(srcBase, 'common'),\n ];\n\n for (const dir of dirs) {\n if (!(await fs.pathExists(dir))) continue;\n const relative = path.basename(dir);\n await fs.copy(dir, path.join(targetDir, relative), { overwrite: false });\n }\n\n logger.success(`Rules for ${framework} written to ${META_DIR}/rules/`);\n}\n\nfunction mapFrameworkRulesDir(fw: Framework | StackFramework): string | null {\n if (fw === 'vue' || fw === 'nuxt') return 'vue';\n if (fw === 'react' || fw === 'next') return 'react';\n return null;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { InitAnswers } from '../types/selections.js';\nimport { logger } from '../utils/logger.js';\n\nfunction scriptBlock(bundler: InitAnswers['bundler']): string {\n if (bundler === 'vite') {\n return [\n '- `pnpm dev`:启动开发服务器',\n '- `pnpm build`:构建生产产物',\n '- `pnpm preview`:本地预览生产构建',\n ].join('\\n');\n }\n\n if (bundler === 'webpack') {\n return [\n '- `pnpm dev`:启动开发服务器',\n '- `pnpm build`:构建生产产物',\n ].join('\\n');\n }\n\n // rspack\n return [\n '- `pnpm dev`:启动开发服务器',\n '- `pnpm build`:构建生产产物',\n ].join('\\n');\n}\n\nfunction structureBlock(framework: InitAnswers['framework']): string {\n const lines: string[] = [\n '```text',\n '.',\n '├─ public/ # 静态资源(不经构建直接输出)',\n '├─ src/',\n '│ ├─ app/ # “应用层”组织',\n '│ ├─ components/ # 业务/通用组件',\n '│ ├─ hooks/ # React Hooks / Vue Composables(按需放)',\n '│ ├─ lib/ # 工具函数、请求封装、纯逻辑(不直接依赖 UI)',\n '│ ├─ styles/ # 样式与设计 token(按需放)',\n '│ └─ ' + (framework === 'react' ? 'main.tsx' : 'main.ts') + ' # 入口文件',\n '├─ .fe-kit/ # fe-kit 生成的元数据与规则',\n '├─ package.json',\n '├─ tsconfig.json',\n '└─ README.md',\n '```',\n ];\n return lines.join('\\n');\n}\n\nexport async function generateReadme(answers: InitAnswers): Promise<void> {\n const outPath = path.join(answers.projectPath, 'README.md');\n\n const content = [\n `# ${answers.projectName}`,\n '',\n '一个由 **fe-kit** 初始化的前端工程骨架。',\n '',\n '## 环境要求',\n '',\n '- Node.js >= 18',\n '- pnpm(推荐)',\n '',\n '## 快速开始',\n '',\n '安装依赖:',\n '',\n '```bash',\n 'pnpm install',\n '```',\n '',\n '常用脚本:',\n '',\n scriptBlock(answers.bundler),\n '',\n '## 目录结构',\n '',\n structureBlock(answers.framework),\n '',\n '## 约定说明(重要)',\n '',\n '- **不包含 service/back-end 内容**:本骨架不生成任何服务端目录与 API 路由。',\n '- **应用层组织**:`src/app/` 仅作为代码组织约定,不强绑定具体框架运行时。',\n '',\n ].join('\\n');\n\n await fs.writeFile(outPath, content, 'utf-8');\n logger.success('README.md generated');\n}\n\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { ToolAdapter, AdapterContext, SkillSelection, McpSelection } from './types.js';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { TOOL_CONFIG_PATHS } from '../core/paths.js';\nimport { writeCursorRules } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\n\nexport const cursorAdapter: ToolAdapter = {\n id: 'cursor',\n\n async applySkills(_ctx, skills) {\n if (skills.length === 0) return;\n logger.info('Cursor: skills are applied via rules — no separate skills directory needed.');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const configPath = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.cursor, 'mcp.json');\n await fs.ensureDir(path.dirname(configPath));\n\n const existing = (await readJsonSafe<Record<string, unknown>>(configPath)) ?? {};\n const mcpSection = (existing.mcpServers as Record<string, unknown>) ?? {};\n\n for (const m of mcp) {\n mcpSection[m.id] = m.config;\n }\n\n await writeJsonSafe(configPath, mergeConfig(existing, { mcpServers: mcpSection }));\n logger.success('Cursor: MCP config written to .cursor/mcp.json');\n },\n\n async applyRules(ctx) {\n await writeCursorRules(ctx.projectRoot, ctx.framework);\n logger.success('Cursor: rules written to .cursor/rules/*.mdc');\n },\n};\n","import type { DevToolId } from '../constants/tools.js';\n\n/** Default config directories/files per IDE/tool inside a project root. */\nexport const TOOL_CONFIG_PATHS: Record<DevToolId, string> = {\n cursor: '.cursor',\n 'claude-code': '.claude',\n vscode: '.vscode',\n 'codebuddy-cn': '.codebuddy',\n trae: '.trae',\n idea: '.idea',\n};\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\nimport type { Framework } from '../constants/frameworks.js';\nimport type { StackFramework } from './detect-stack.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nfunction rulesSourceDir(): string {\n return path.resolve(__dirname, '..', 'rules');\n}\n\nexport interface RuleFile {\n /** Filename stem, e.g. \"typescript\" */\n name: string;\n /** Category: \"common\", \"react\", or \"vue\" */\n category: string;\n /** Raw markdown body (no frontmatter) */\n content: string;\n}\n\nfunction mapFrameworkDir(fw: Framework | StackFramework): string | null {\n if (fw === 'vue' || fw === 'nuxt') return 'vue';\n if (fw === 'react' || fw === 'next') return 'react';\n return null;\n}\n\nexport async function loadRuleSources(\n framework: Framework | StackFramework,\n): Promise<RuleFile[]> {\n const srcBase = rulesSourceDir();\n const fwDir = mapFrameworkDir(framework);\n const dirs: { dir: string; category: string }[] = [\n { dir: path.join(srcBase, 'common'), category: 'common' },\n ];\n if (fwDir) {\n dirs.push({ dir: path.join(srcBase, fwDir), category: fwDir });\n }\n\n const rules: RuleFile[] = [];\n for (const { dir, category } of dirs) {\n if (!(await fs.pathExists(dir))) continue;\n const files = await fs.readdir(dir);\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n const content = await fs.readFile(path.join(dir, file), 'utf-8');\n rules.push({\n name: path.basename(file, '.md'),\n category,\n content: content.trim(),\n });\n }\n }\n return rules;\n}\n\nfunction toMdcContent(rule: RuleFile, globs?: string[]): string {\n const globLine = globs ? `globs: ${JSON.stringify(globs)}` : '';\n const lines = [\n '---',\n `description: ${rule.category}/${rule.name} conventions`,\n ...(globLine ? [globLine] : []),\n 'alwaysApply: true',\n '---',\n '',\n rule.content,\n '',\n ];\n return lines.join('\\n');\n}\n\nfunction ruleGlobs(rule: RuleFile): string[] | undefined {\n if (rule.category === 'react') return ['**/*.{tsx,jsx,ts,js}'];\n if (rule.category === 'vue') return ['**/*.{vue,ts,js}'];\n return undefined;\n}\n\nexport async function writeCursorRules(\n projectRoot: string,\n framework: Framework | StackFramework,\n): Promise<void> {\n const rules = await loadRuleSources(framework);\n const dir = path.join(projectRoot, '.cursor', 'rules');\n await fs.ensureDir(dir);\n\n for (const rule of rules) {\n const filename = `${rule.category}-${rule.name}.mdc`;\n await fs.writeFile(path.join(dir, filename), toMdcContent(rule, ruleGlobs(rule)), 'utf-8');\n }\n}\n\nexport async function writeCodeBuddyRules(\n projectRoot: string,\n framework: Framework | StackFramework,\n): Promise<void> {\n const rules = await loadRuleSources(framework);\n const dir = path.join(projectRoot, '.codebuddy', 'rules');\n await fs.ensureDir(dir);\n\n for (const rule of rules) {\n const filename = `${rule.category}-${rule.name}.mdc`;\n await fs.writeFile(path.join(dir, filename), toMdcContent(rule, ruleGlobs(rule)), 'utf-8');\n }\n}\n\nexport async function writeCopilotInstructions(\n projectRoot: string,\n framework: Framework | StackFramework,\n): Promise<void> {\n const rules = await loadRuleSources(framework);\n const dir = path.join(projectRoot, '.github');\n await fs.ensureDir(dir);\n\n const sections = rules.map((r) => r.content);\n const body = [\n '# Project Coding Guidelines',\n '',\n ...sections.flatMap((s) => [s, '']),\n ].join('\\n');\n\n await fs.writeFile(path.join(dir, 'copilot-instructions.md'), body, 'utf-8');\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { ToolAdapter, AdapterContext, SkillSelection, McpSelection } from './types.js';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { TOOL_CONFIG_PATHS } from '../core/paths.js';\nimport { loadRuleSources } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\n\nexport const claudeCodeAdapter: ToolAdapter = {\n id: 'claude-code',\n\n async applySkills(ctx, skills) {\n if (skills.length === 0) return;\n const skillsRoot = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS['claude-code'], 'skills');\n await fs.ensureDir(skillsRoot);\n\n for (const skill of skills) {\n const targetDir = path.join(skillsRoot, skill.id);\n await fs.ensureDir(targetDir);\n\n if (skill.sourcePath) {\n const sourceDir = path.dirname(skill.sourcePath);\n await fs.copy(sourceDir, targetDir, { overwrite: true });\n } else {\n await fs.writeFile(path.join(targetDir, 'SKILL.md'), skill.content, 'utf-8');\n }\n }\n logger.success('Claude Code: skills copied to .claude/skills/<skill>/SKILL.md');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const configPath = path.join(ctx.projectRoot, '.mcp.json');\n const existing = (await readJsonSafe<Record<string, unknown>>(configPath)) ?? {};\n const mcpSection = (existing.mcpServers as Record<string, unknown>) ?? {};\n\n for (const m of mcp) {\n mcpSection[m.id] = m.config;\n }\n\n await writeJsonSafe(configPath, mergeConfig(existing, { mcpServers: mcpSection }));\n logger.success('Claude Code: MCP config written to .mcp.json');\n },\n\n async applyRules(ctx) {\n const rulesDir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS['claude-code'], 'rules');\n await fs.ensureDir(rulesDir);\n\n const rules = await loadRuleSources(ctx.framework);\n for (const rule of rules) {\n const filename = `${rule.category}-${rule.name}.md`;\n await fs.writeFile(path.join(rulesDir, filename), rule.content + '\\n', 'utf-8');\n }\n logger.success('Claude Code: rules written to .claude/rules/');\n },\n};\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { ToolAdapter, AdapterContext, SkillSelection, McpSelection } from './types.js';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { writeCopilotInstructions } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\nimport { TOOL_CONFIG_PATHS } from '../core/paths.js';\n\nexport const vscodeAdapter: ToolAdapter = {\n id: 'vscode',\n\n async applySkills(_ctx, skills) {\n if (skills.length === 0) return;\n logger.info('VS Code: skills are applied via Copilot instructions — no separate skills directory.');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.vscode);\n await fs.ensureDir(dir);\n\n const configPath = path.join(dir, 'mcp.json');\n const existing = (await readJsonSafe<Record<string, unknown>>(configPath)) ?? {};\n const serversSection = (existing.servers as Record<string, unknown>) ?? {};\n\n for (const m of mcp) {\n serversSection[m.id] = m.config;\n }\n\n await writeJsonSafe(configPath, mergeConfig(existing, { servers: serversSection }));\n logger.success('VS Code: MCP config written to .vscode/mcp.json (servers)');\n },\n\n async applyRules(ctx) {\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.vscode);\n await fs.ensureDir(dir);\n\n const extensionsPath = path.join(dir, 'extensions.json');\n const existing = (await readJsonSafe<{ recommendations?: string[] }>(extensionsPath)) ?? {};\n const recs = new Set(existing.recommendations ?? []);\n\n const recommended = [\n 'dbaeumer.vscode-eslint',\n 'esbenp.prettier-vscode',\n 'stylelint.vscode-stylelint',\n ];\n if (ctx.framework === 'vue') recommended.push('Vue.volar');\n for (const ext of recommended) recs.add(ext);\n\n await writeJsonSafe(extensionsPath, { recommendations: [...recs] });\n\n await writeCopilotInstructions(ctx.projectRoot, ctx.framework);\n logger.success('VS Code: extensions.json + .github/copilot-instructions.md updated');\n },\n};\n","import type { ToolAdapter, AdapterContext, SkillSelection, McpSelection } from './types.js';\nimport path from 'node:path';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { writeCodeBuddyRules } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\n\nexport const codebuddyCnAdapter: ToolAdapter = {\n id: 'codebuddy-cn',\n\n async applySkills(_ctx, skills) {\n if (skills.length === 0) return;\n logger.info('CodeBuddy: skills are applied via rules — no separate skills directory needed.');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const configPath = path.join(ctx.projectRoot, '.mcp.json');\n const existing = (await readJsonSafe<Record<string, unknown>>(configPath)) ?? {};\n const mcpSection = (existing.mcpServers as Record<string, unknown>) ?? {};\n\n for (const m of mcp) {\n mcpSection[m.id] = m.config;\n }\n\n await writeJsonSafe(configPath, mergeConfig(existing, { mcpServers: mcpSection }));\n logger.success('CodeBuddy: MCP config written to .mcp.json');\n },\n\n async applyRules(ctx) {\n await writeCodeBuddyRules(ctx.projectRoot, ctx.framework);\n logger.success('CodeBuddy: rules written to .codebuddy/rules/*.mdc');\n },\n};\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { ToolAdapter, AdapterContext, SkillSelection, McpSelection } from './types.js';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { TOOL_CONFIG_PATHS } from '../core/paths.js';\nimport { loadRuleSources } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\n\nexport const traeAdapter: ToolAdapter = {\n id: 'trae',\n\n async applySkills(ctx, skills) {\n if (skills.length === 0) return;\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.trae, 'rules');\n await fs.ensureDir(dir);\n\n for (const skill of skills) {\n const filePath = path.join(dir, `${skill.id}.md`);\n await fs.writeFile(filePath, skill.content, 'utf-8');\n }\n logger.success('Trae: skills written to .trae/rules/');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const configPath = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.trae, 'mcp.json');\n await fs.ensureDir(path.dirname(configPath));\n const existing = (await readJsonSafe<Record<string, unknown>>(configPath)) ?? {};\n const mcpSection = (existing.mcpServers as Record<string, unknown>) ?? {};\n\n for (const m of mcp) {\n mcpSection[m.id] = m.config;\n }\n\n await writeJsonSafe(configPath, mergeConfig(existing, { mcpServers: mcpSection }));\n logger.success('Trae: MCP config written to .trae/mcp.json');\n },\n\n async applyRules(ctx) {\n const rulesDir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.trae, 'rules');\n await fs.ensureDir(rulesDir);\n\n const rules = await loadRuleSources(ctx.framework);\n for (const rule of rules) {\n const filename = `${rule.category}-${rule.name}.md`;\n await fs.writeFile(path.join(rulesDir, filename), rule.content + '\\n', 'utf-8');\n }\n logger.success('Trae: rules written to .trae/rules/');\n },\n};\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { ToolAdapter, AdapterContext } from './types.js';\nimport { TOOL_CONFIG_PATHS } from '../core/paths.js';\nimport { logger } from '../utils/logger.js';\n\nexport const ideaAdapter: ToolAdapter = {\n id: 'idea',\n\n async applySkills(ctx, skills) {\n if (skills.length === 0) return;\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.idea);\n await fs.ensureDir(dir);\n logger.info('IDEA: skill integration is a placeholder — manual config may be needed.');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.idea);\n await fs.ensureDir(dir);\n logger.info('IDEA: MCP integration is a placeholder — manual config may be needed.');\n },\n\n async applyRules(ctx) {\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.idea);\n await fs.ensureDir(dir);\n logger.info('IDEA: rules integration is a placeholder.');\n },\n};\n","import type { DevToolId } from '../constants/tools.js';\nimport type { ToolAdapter } from './types.js';\nimport { cursorAdapter } from './cursor.js';\nimport { claudeCodeAdapter } from './claude-code.js';\nimport { vscodeAdapter } from './vscode.js';\nimport { codebuddyCnAdapter } from './codebuddy-cn.js';\nimport { traeAdapter } from './trae.js';\nimport { ideaAdapter } from './idea.js';\n\nconst adapters: Record<DevToolId, ToolAdapter> = {\n cursor: cursorAdapter,\n 'claude-code': claudeCodeAdapter,\n vscode: vscodeAdapter,\n 'codebuddy-cn': codebuddyCnAdapter,\n trae: traeAdapter,\n idea: ideaAdapter,\n};\n\nexport function getAdapter(id: DevToolId): ToolAdapter {\n return adapters[id];\n}\n\nexport function getAdapters(ids: DevToolId[]): ToolAdapter[] {\n return ids.map((id) => adapters[id]);\n}\n","import type { AdapterContext, SkillSelection, McpSelection } from '../adapters/types.js';\nimport type { Framework } from '../constants/frameworks.js';\nimport type { StackFramework } from './detect-stack.js';\nimport type { DevToolId } from '../constants/tools.js';\nimport { getAdapters } from '../adapters/registry.js';\nimport { getSkillById } from '../skills/catalog.js';\nimport { getMcpById } from '../mcp/catalog.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface AdapterInput {\n framework: Framework | StackFramework;\n devTools: DevToolId[];\n skills: string[];\n mcpServers: string[];\n}\n\nexport async function applyAdapters(\n projectRoot: string,\n input: AdapterInput,\n): Promise<void> {\n const adapters = getAdapters(input.devTools);\n const ctx: AdapterContext = { projectRoot, framework: input.framework };\n\n const skills: SkillSelection[] = input.skills\n .map(getSkillById)\n .filter((s): s is SkillSelection => s !== undefined);\n\n const mcp: McpSelection[] = input.mcpServers\n .map(getMcpById)\n .filter((m): m is McpSelection => m !== undefined);\n\n for (const adapter of adapters) {\n logger.step(`Applying config for ${adapter.id}...`);\n await adapter.applySkills(ctx, skills);\n await adapter.applyMcp(ctx, mcp);\n await adapter.applyRules(ctx);\n }\n}\n","import { runInitPrompts } from '../prompts/init-prompts.js';\nimport { generateProject } from '../generators/project-generator.js';\nimport { generateLintConfigs } from '../generators/lint-generator.js';\nimport { writeFeKitMeta } from '../generators/fe-kit-meta-generator.js';\nimport { generateReadme } from '../generators/readme-generator.js';\nimport { applyAdapters } from '../core/apply-adapters.js';\nimport { logger } from '../utils/index.js';\n\nexport async function initCommand(): Promise<void> {\n logger.step('Starting new project initialization...');\n\n const answers = await runInitPrompts();\n if (!answers) return;\n\n await generateProject(answers);\n await generateLintConfigs(answers);\n await writeFeKitMeta(answers);\n await generateReadme(answers);\n await applyAdapters(answers.projectPath, answers);\n\n logger.success(`Project \"${answers.projectName}\" created at ${answers.projectPath}`);\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport { detectProject } from '../core/detect-project.js';\nimport type { ProjectDetection } from '../core/detect-project.js';\nimport { detectStack, summarizeStack } from '../core/detect-stack.js';\nimport type { StackDetection } from '../core/detect-stack.js';\nimport { runEnhancePrompts } from '../prompts/enhance-prompts.js';\nimport { updateFeKitMeta } from '../generators/fe-kit-meta-generator.js';\nimport { generateQualityTooling } from '../generators/quality-generator.js';\nimport { applyAdapters } from '../core/apply-adapters.js';\nimport { logger } from '../utils/index.js';\n\nexport async function enhanceCommand(): Promise<void> {\n logger.step('Analyzing current project...');\n\n const projectRoot = process.cwd();\n\n const classicDetection = await detectProject(projectRoot);\n const stack: StackDetection | null = classicDetection\n ? await toStackDetection(projectRoot, classicDetection)\n : await detectStack(projectRoot);\n\n if (!stack) {\n logger.error(\n 'Could not detect a project in the current directory. ' +\n 'Make sure package.json exists.',\n );\n process.exitCode = 1;\n return;\n }\n\n logger.info(`Detected: ${summarizeStack(stack)}`);\n\n const answers = await runEnhancePrompts(stack);\n if (!answers) return;\n\n await updateFeKitMeta(projectRoot, classicDetection ?? stack, answers);\n\n if (answers.qualityTools.length > 0) {\n await generateQualityTooling(projectRoot, stack, answers.qualityTools);\n }\n\n await applyAdapters(projectRoot, {\n framework: stack.framework,\n ...answers,\n });\n\n logger.success('Project enhanced successfully.');\n}\n\nasync function toStackDetection(\n root: string,\n d: ProjectDetection,\n): Promise<StackDetection> {\n return {\n name: d.name,\n projectKind: 'frontend',\n framework: d.framework,\n bundler: d.bundler,\n hasTypeScript: d.hasTypeScript,\n hasGit: await fs.pathExists(path.join(root, '.git')),\n };\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Framework } from '../constants/frameworks.js';\nimport type { Bundler } from '../constants/bundlers.js';\nimport { readJsonSafe } from '../utils/fs.js';\n\nexport interface ProjectDetection {\n name: string;\n framework: Framework;\n router?: string;\n stateManagement?: string;\n bundler?: Bundler;\n hasTypeScript: boolean;\n}\n\nexport async function detectProject(\n root: string,\n): Promise<ProjectDetection | null> {\n const pkgPath = path.join(root, 'package.json');\n if (!(await fs.pathExists(pkgPath))) return null;\n\n const pkg = await readJsonSafe<Record<string, unknown>>(pkgPath);\n if (!pkg) return null;\n\n const allDeps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const framework = detectFramework(allDeps);\n if (!framework) return null;\n\n return {\n name: (pkg.name as string) ?? path.basename(root),\n framework,\n router: detectRouter(allDeps, framework),\n stateManagement: detectStateManagement(allDeps, framework),\n bundler: detectBundler(allDeps),\n hasTypeScript: 'typescript' in allDeps || (await fs.pathExists(path.join(root, 'tsconfig.json'))),\n };\n}\n\nfunction detectFramework(deps: Record<string, string>): Framework | null {\n if ('vue' in deps) return 'vue';\n if ('react' in deps) return 'react';\n return null;\n}\n\nfunction detectRouter(deps: Record<string, string>, fw: Framework): string | undefined {\n if (fw === 'vue' && 'vue-router' in deps) return 'vue-router';\n if (fw === 'react' && 'react-router' in deps) return 'react-router';\n if (fw === 'react' && 'react-router-dom' in deps) return 'react-router';\n return undefined;\n}\n\nfunction detectStateManagement(deps: Record<string, string>, fw: Framework): string | undefined {\n if (fw === 'vue') {\n if ('pinia' in deps) return 'pinia';\n if ('vuex' in deps) return 'vuex';\n }\n if (fw === 'react') {\n if ('@reduxjs/toolkit' in deps) return 'redux-toolkit';\n if ('zustand' in deps) return 'zustand';\n if ('mobx' in deps) return 'mobx';\n }\n return undefined;\n}\n\nfunction detectBundler(deps: Record<string, string>): Bundler | undefined {\n if ('vite' in deps) return 'vite';\n if ('webpack' in deps) return 'webpack';\n if ('@rspack/cli' in deps || '@rspack/core' in deps) return 'rspack';\n return undefined;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Bundler } from '../constants/bundlers.js';\nimport { readJsonSafe } from '../utils/fs.js';\n\nexport const STACK_FRAMEWORKS = ['vue', 'react', 'next', 'nuxt', 'unknown'] as const;\nexport type StackFramework = (typeof STACK_FRAMEWORKS)[number];\n\nexport const PROJECT_KINDS = ['frontend', 'node', 'unknown'] as const;\nexport type ProjectKind = (typeof PROJECT_KINDS)[number];\n\nexport interface StackDetection {\n name: string;\n projectKind: ProjectKind;\n framework: StackFramework;\n bundler: Bundler | undefined;\n hasTypeScript: boolean;\n hasGit: boolean;\n}\n\nexport async function detectStack(root: string): Promise<StackDetection | null> {\n const pkgPath = path.join(root, 'package.json');\n if (!(await fs.pathExists(pkgPath))) return null;\n\n const pkg = await readJsonSafe<Record<string, unknown>>(pkgPath);\n if (!pkg) return null;\n\n const allDeps: Record<string, string> = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const framework = inferFramework(allDeps);\n const bundler = inferBundler(allDeps);\n const hasTypeScript =\n 'typescript' in allDeps ||\n (await fs.pathExists(path.join(root, 'tsconfig.json')));\n const hasGit = await fs.pathExists(path.join(root, '.git'));\n\n return {\n name: (pkg.name as string) ?? path.basename(root),\n projectKind: inferProjectKind(pkg, allDeps, framework),\n framework,\n bundler,\n hasTypeScript,\n hasGit,\n };\n}\n\nfunction inferFramework(deps: Record<string, string>): StackFramework {\n if ('nuxt' in deps) return 'nuxt';\n if ('next' in deps) return 'next';\n if ('vue' in deps) return 'vue';\n if ('react' in deps) return 'react';\n return 'unknown';\n}\n\nfunction inferBundler(deps: Record<string, string>): Bundler | undefined {\n if ('vite' in deps) return 'vite';\n if ('webpack' in deps) return 'webpack';\n if ('@rspack/cli' in deps || '@rspack/core' in deps) return 'rspack';\n return undefined;\n}\n\nfunction inferProjectKind(\n pkg: Record<string, unknown>,\n deps: Record<string, string>,\n framework: StackFramework,\n): ProjectKind {\n if (framework !== 'unknown') return 'frontend';\n\n const hasNodeSignals =\n pkg.bin !== undefined ||\n pkg.main !== undefined ||\n pkg.exports !== undefined ||\n 'express' in deps ||\n 'fastify' in deps ||\n 'koa' in deps ||\n '@types/node' in deps;\n\n if (hasNodeSignals) return 'node';\n\n return 'unknown';\n}\n\nexport function summarizeStack(stack: StackDetection): string {\n const parts: string[] = [];\n\n if (stack.framework !== 'unknown') {\n parts.push(stack.framework.charAt(0).toUpperCase() + stack.framework.slice(1));\n } else if (stack.projectKind === 'node') {\n parts.push('Node');\n } else {\n parts.push('JavaScript/TypeScript');\n }\n\n if (stack.bundler) {\n parts.push(stack.bundler.charAt(0).toUpperCase() + stack.bundler.slice(1));\n }\n\n if (stack.hasTypeScript) parts.push('TypeScript');\n\n return parts.join(' + ');\n}\n","import prompts from 'prompts';\nimport type { EnhanceAnswers } from '../types/selections.js';\nimport type { StackDetection } from '../core/detect-stack.js';\nimport { summarizeStack } from '../core/detect-stack.js';\nimport type { QualityTool } from '../constants/lint.js';\nimport { DEV_TOOLS } from '../constants/tools.js';\nimport { getSkillCatalog } from '../skills/catalog.js';\nimport { getMcpCatalog } from '../mcp/catalog.js';\n\n\ninterface QualityToolOption {\n id: QualityTool;\n label: string;\n description: string;\n selected: boolean;\n}\n\nfunction getApplicableTools(stack: StackDetection): QualityToolOption[] {\n const tools: QualityToolOption[] = [];\n\n tools.push({\n id: 'eslint',\n label: 'ESLint',\n description: 'Linting for JavaScript / TypeScript',\n selected: true,\n });\n\n tools.push({\n id: 'prettier',\n label: 'Prettier',\n description: 'Code formatting',\n selected: true,\n });\n\n tools.push({\n id: 'editorconfig',\n label: 'EditorConfig',\n description: 'Cross-editor indentation & whitespace settings',\n selected: true,\n });\n\n if (stack.projectKind === 'frontend') {\n tools.push({\n id: 'stylelint',\n label: 'Stylelint',\n description: 'CSS / SCSS linting',\n selected: false,\n });\n }\n\n tools.push({\n id: 'commitlint',\n label: 'commitlint',\n description: 'Enforce conventional commit messages',\n selected: false,\n });\n\n return tools;\n}\n\nexport async function runEnhancePrompts(\n stack: StackDetection,\n): Promise<EnhanceAnswers | null> {\n const stackLabel = summarizeStack(stack);\n const applicableTools = getApplicableTools(stack);\n\n const response = await prompts(\n [\n {\n type: 'multiselect',\n name: 'devTools',\n message: `Dev tools to configure for this ${stackLabel} project:`,\n choices: DEV_TOOLS.map((t) => ({ title: t, value: t, selected: t === 'cursor' })),\n min: 1,\n hint: 'Select at least one',\n },\n {\n type: 'multiselect',\n name: 'qualityTools',\n message: 'Code quality tools to install & configure:',\n choices: applicableTools.map((t) => ({\n title: `${t.label} — ${t.description}`,\n value: t.id,\n selected: t.selected,\n })),\n hint: 'Space to toggle, Enter to confirm',\n },\n {\n type: 'multiselect',\n name: 'skills',\n message: 'Skills to add:',\n choices: getSkillCatalog().map((s) => ({\n title: `${s.label} — ${s.description}`,\n value: s.id,\n selected: false,\n })),\n },\n {\n type: 'multiselect',\n name: 'mcpServers',\n message: 'MCP servers to add:',\n choices: getMcpCatalog().map((m) => ({\n title: `${m.label} — ${m.description}`,\n value: m.id,\n selected: false,\n })),\n },\n ],\n { onCancel: () => process.exit(0) },\n );\n\n if (!response.devTools) return null;\n\n return {\n devTools: response.devTools,\n qualityTools: response.qualityTools ?? [],\n skills: response.skills ?? [],\n mcpServers: response.mcpServers ?? [],\n };\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { StackDetection, StackFramework } from '../core/detect-stack.js';\nimport type { QualityTool } from '../constants/lint.js';\nimport { logger } from '../utils/logger.js';\n\ntype Generator = (root: string, stack: StackDetection) => Promise<void>;\n\nconst GENERATORS: Record<QualityTool, Generator> = {\n eslint: generateEslint,\n stylelint: generateStylelint,\n prettier: generatePrettier,\n editorconfig: generateEditorConfig,\n commitlint: generateCommitlint,\n};\n\nexport async function generateQualityTooling(\n root: string,\n stack: StackDetection,\n tools: QualityTool[],\n): Promise<void> {\n for (const tool of tools) {\n await GENERATORS[tool](root, stack);\n }\n}\n\n// ---------------------------------------------------------------------------\n// ESLint — stack-aware config & optional bundler plugin\n// ---------------------------------------------------------------------------\n\nasync function generateEslint(root: string, stack: StackDetection): Promise<void> {\n const pkg = await readPkg(root);\n const devDeps: Record<string, string> = {\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n devDeps.eslint = '^9.25.0';\n devDeps['@eslint/js'] = '^9.25.0';\n devDeps.globals = '^16.0.0';\n\n if (stack.hasTypeScript) {\n devDeps['typescript-eslint'] = '^8.30.0';\n }\n\n addFrameworkEslintDeps(devDeps, stack.framework);\n addBundlerEslintPlugin(devDeps, stack);\n\n pkg.devDependencies = devDeps;\n await writePkg(root, pkg);\n\n const configContent = buildEslintConfig(stack);\n await fs.writeFile(path.join(root, 'eslint.config.mjs'), configContent, 'utf-8');\n logger.success('ESLint 9 flat config generated');\n}\n\nfunction addFrameworkEslintDeps(devDeps: Record<string, string>, fw: StackFramework): void {\n if (fw === 'vue' || fw === 'nuxt') {\n devDeps['eslint-plugin-vue'] = '^10.0.0';\n } else if (fw === 'react' || fw === 'next') {\n devDeps['eslint-plugin-react-hooks'] = '^5.2.0';\n devDeps['eslint-plugin-react-refresh'] = '^0.4.0';\n }\n}\n\nfunction addBundlerEslintPlugin(devDeps: Record<string, string>, stack: StackDetection): void {\n if (stack.projectKind !== 'frontend') return;\n\n if (stack.bundler === 'vite') {\n devDeps['vite-plugin-eslint2'] = '^5.0.0';\n } else if (stack.bundler === 'webpack' || stack.bundler === 'rspack') {\n devDeps['eslint-webpack-plugin'] = '^4.2.0';\n }\n}\n\nfunction buildEslintConfig(stack: StackDetection): string {\n const fw = stack.framework;\n\n if (fw === 'vue' || fw === 'nuxt') return buildVueEslintConfig(stack);\n if (fw === 'react' || fw === 'next') return buildReactEslintConfig(stack);\n return buildGenericEslintConfig(stack);\n}\n\nfunction buildVueEslintConfig(stack: StackDetection): string {\n const lines = [\n \"import js from '@eslint/js';\",\n ...(stack.hasTypeScript ? [\"import tseslint from 'typescript-eslint';\"] : []),\n \"import pluginVue from 'eslint-plugin-vue';\",\n '',\n ...(stack.hasTypeScript\n ? [\n 'export default tseslint.config(',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n ]\n : ['export default [', ' js.configs.recommended,']),\n \" ...pluginVue.configs['flat/recommended'],\",\n ...(stack.hasTypeScript\n ? [\n ' {',\n \" files: ['**/*.vue'],\",\n ' languageOptions: {',\n ' parserOptions: { parser: tseslint.parser },',\n ' },',\n ' },',\n ');',\n ]\n : ['];']),\n ];\n return lines.join('\\n');\n}\n\nfunction buildReactEslintConfig(stack: StackDetection): string {\n const lines = [\n \"import js from '@eslint/js';\",\n ...(stack.hasTypeScript ? [\"import tseslint from 'typescript-eslint';\"] : []),\n \"import reactHooks from 'eslint-plugin-react-hooks';\",\n \"import reactRefresh from 'eslint-plugin-react-refresh';\",\n \"import globals from 'globals';\",\n '',\n ...(stack.hasTypeScript\n ? [\n 'export default tseslint.config(',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n ]\n : ['export default [', ' js.configs.recommended,']),\n ' {',\n \" files: ['**/*.{ts,tsx,js,jsx}'],\",\n ' plugins: {',\n \" 'react-hooks': reactHooks,\",\n \" 'react-refresh': reactRefresh,\",\n ' },',\n ' languageOptions: {',\n ' globals: globals.browser,',\n ' },',\n ' rules: {',\n ' ...reactHooks.configs.recommended.rules,',\n \" 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],\",\n ' },',\n ' },',\n ...(stack.hasTypeScript ? [');'] : ['];']),\n ];\n return lines.join('\\n');\n}\n\nfunction buildGenericEslintConfig(stack: StackDetection): string {\n const lines = [\n \"import js from '@eslint/js';\",\n ...(stack.hasTypeScript ? [\"import tseslint from 'typescript-eslint';\"] : []),\n \"import globals from 'globals';\",\n '',\n ...(stack.hasTypeScript\n ? [\n 'export default tseslint.config(',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n ]\n : ['export default [', ' js.configs.recommended,']),\n ' {',\n \" files: ['**/*.{ts,js}'],\",\n ' languageOptions: {',\n ' globals: {',\n ' ...globals.node,',\n ' },',\n ' },',\n ' },',\n ...(stack.hasTypeScript ? [');'] : ['];']),\n ];\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Stylelint\n// ---------------------------------------------------------------------------\n\nasync function generateStylelint(root: string, stack: StackDetection): Promise<void> {\n const pkg = await readPkg(root);\n const devDeps: Record<string, string> = {\n ...(pkg.devDependencies as Record<string, string> | undefined),\n stylelint: '^16.17.0',\n 'stylelint-config-standard': '^37.0.0',\n };\n\n const fw = stack.framework;\n if (fw === 'vue' || fw === 'nuxt') {\n devDeps['stylelint-config-standard-vue'] = '^1.0.0';\n }\n\n pkg.devDependencies = devDeps;\n await writePkg(root, pkg);\n\n const extendsArr = ['stylelint-config-standard'];\n if (fw === 'vue' || fw === 'nuxt') {\n extendsArr.push('stylelint-config-standard-vue');\n }\n\n await fs.writeJson(\n path.join(root, '.stylelintrc.json'),\n { extends: extendsArr },\n { spaces: 2 },\n );\n logger.success('Stylelint config generated');\n}\n\n// ---------------------------------------------------------------------------\n// Prettier\n// ---------------------------------------------------------------------------\n\nasync function generatePrettier(root: string): Promise<void> {\n const pkg = await readPkg(root);\n pkg.devDependencies = {\n ...(pkg.devDependencies as Record<string, string> | undefined),\n prettier: '^3.5.0',\n };\n await writePkg(root, pkg);\n\n const config = {\n semi: true,\n singleQuote: true,\n tabWidth: 2,\n trailingComma: 'all' as const,\n printWidth: 100,\n };\n await fs.writeJson(path.join(root, '.prettierrc.json'), config, { spaces: 2 });\n logger.success('Prettier config generated');\n}\n\n// ---------------------------------------------------------------------------\n// EditorConfig\n// ---------------------------------------------------------------------------\n\nasync function generateEditorConfig(root: string): Promise<void> {\n const content = [\n 'root = true',\n '',\n '[*]',\n 'indent_style = space',\n 'indent_size = 2',\n 'end_of_line = lf',\n 'charset = utf-8',\n 'trim_trailing_whitespace = true',\n 'insert_final_newline = true',\n ].join('\\n');\n\n await fs.writeFile(path.join(root, '.editorconfig'), content, 'utf-8');\n logger.success('EditorConfig generated');\n}\n\n// ---------------------------------------------------------------------------\n// commitlint\n// ---------------------------------------------------------------------------\n\nasync function generateCommitlint(root: string, stack: StackDetection): Promise<void> {\n const pkg = await readPkg(root);\n const devDeps: Record<string, string> = {\n ...(pkg.devDependencies as Record<string, string> | undefined),\n '@commitlint/cli': '^19.8.0',\n '@commitlint/config-conventional': '^19.8.0',\n };\n\n devDeps.husky = '^9.1.0';\n\n pkg.devDependencies = devDeps;\n\n const scripts = (pkg.scripts ?? {}) as Record<string, string>;\n scripts.prepare ??= 'husky';\n pkg.scripts = scripts;\n\n await writePkg(root, pkg);\n\n const isESM = pkg.type === 'module';\n const configName = isESM ? 'commitlint.config.cjs' : 'commitlint.config.js';\n const configContent = [\n \"module.exports = { extends: ['@commitlint/config-conventional'] };\",\n '',\n ].join('\\n');\n\n await fs.writeFile(path.join(root, configName), configContent, 'utf-8');\n\n await fs.ensureDir(path.join(root, '.husky'));\n const hookContent = 'npx --no -- commitlint --edit \"$1\"\\n';\n await fs.writeFile(path.join(root, '.husky', 'commit-msg'), hookContent, 'utf-8');\n\n if (!stack.hasGit) {\n logger.warn('No .git directory detected — commitlint hooks will activate after git init.');\n }\n\n logger.success('commitlint + husky generated');\n}\n\n// ---------------------------------------------------------------------------\n// Helpers — reduce repeated readJson / writeJson boilerplate\n// ---------------------------------------------------------------------------\n\nasync function readPkg(root: string): Promise<Record<string, unknown>> {\n return fs.readJson(path.join(root, 'package.json'));\n}\n\nasync function writePkg(root: string, data: Record<string, unknown>): Promise<void> {\n await fs.writeJson(path.join(root, 'package.json'), data, { spaces: 2 });\n}\n"],"mappings":"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","names":["path","path","path","fileURLToPath","fs","path","fileURLToPath","fs","path","fs","path","fs","path","fs","fs","path","path","fileURLToPath","fs","__dirname","path","fileURLToPath","fs","path","fs","path","fs","path","fs","path","fs","path","fileURLToPath","fs","__dirname","rulesSourceDir","path","fs","path","fs","path","fs","path","fs","path","fs","path","path","path","fs","path","fs","path","fs","path","fs","adapters","path","fs","path","fs","path","fs","path","fs","path","fs","prompts","prompts","path","fs","GENERATORS","generateEslint","generateStylelint","generatePrettier","generateEditorConfig","fs","path","fs","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/constants/meta.ts","../src/constants/frameworks.ts","../src/constants/bundlers.ts","../src/constants/tools.ts","../src/constants/lint.ts","../src/prompts/init-prompts.ts","../src/skills/catalog.ts","../src/mcp/catalog.ts","../src/generators/project-generator.ts","../src/utils/logger.ts","../src/generators/lint-generator.ts","../src/generators/fe-kit-meta-generator.ts","../src/utils/fs.ts","../src/core/merge-config.ts","../src/core/write-rules.ts","../src/generators/readme-generator.ts","../src/adapters/cursor.ts","../src/core/paths.ts","../src/core/rule-writers.ts","../src/adapters/claude-code.ts","../src/adapters/vscode.ts","../src/adapters/codebuddy-cn.ts","../src/adapters/trae.ts","../src/adapters/idea.ts","../src/adapters/registry.ts","../src/core/apply-adapters.ts","../src/commands/init.ts","../src/commands/enhance.ts","../src/core/detect-project.ts","../src/core/detect-stack.ts","../src/prompts/enhance-prompts.ts","../src/generators/quality-generator.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLI_NAME, CLI_VERSION } from './constants/index.js';\nimport { initCommand } from './commands/init.js';\nimport { enhanceCommand } from './commands/enhance.js';\n\nconst program = new Command();\n\nprogram\n .name(CLI_NAME)\n .description('Frontend project scaffold CLI — init, enhance, and manage your dev environment.')\n .version(CLI_VERSION);\n\nprogram\n .command('init')\n .description('Initialize a new frontend project with Vue or React + TypeScript')\n .action(async () => {\n try {\n await initCommand();\n } catch (err) {\n console.error(err);\n process.exitCode = 1;\n }\n });\n\nprogram\n .command('enhance')\n .description('Enhance an existing frontend project with dev tools, skills, MCP, and rules')\n .action(async () => {\n try {\n await enhanceCommand();\n } catch (err) {\n console.error(err);\n process.exitCode = 1;\n }\n });\n\nprogram.parse();\n","export const CLI_NAME = 'fe-kit';\nexport const META_DIR = '.fe-kit';\ndeclare const __CLI_VERSION__: string;\nexport const CLI_VERSION = __CLI_VERSION__;\n","export const FRAMEWORKS = ['vue', 'react'] as const;\nexport type Framework = (typeof FRAMEWORKS)[number];\n\nexport const ROUTERS: Record<Framework, string> = {\n vue: 'vue-router',\n react: 'react-router',\n};\n\nexport const STATE_MANAGERS: Record<Framework, readonly string[]> = {\n vue: ['pinia', 'vuex'] as const,\n react: ['redux-toolkit', 'zustand', 'mobx'] as const,\n};\n","export const BUNDLERS = ['vite', 'webpack', 'rspack'] as const;\nexport type Bundler = (typeof BUNDLERS)[number];\n","export const DEV_TOOLS = [\n 'cursor',\n 'claude-code',\n 'vscode',\n 'codebuddy-cn',\n 'trae',\n 'idea',\n] as const;\n\nexport type DevToolId = (typeof DEV_TOOLS)[number];\n","export const LINT_TOOLS = [\n 'eslint',\n 'stylelint',\n 'prettier',\n 'editorconfig',\n] as const;\n\nexport type LintTool = (typeof LINT_TOOLS)[number];\n\nexport const QUALITY_TOOLS = [\n 'eslint',\n 'stylelint',\n 'prettier',\n 'editorconfig',\n 'commitlint',\n] as const;\n\nexport type QualityTool = (typeof QUALITY_TOOLS)[number];\n","import path from 'node:path';\nimport prompts from 'prompts';\nimport type { InitAnswers } from '../types/selections.js';\nimport { FRAMEWORKS, ROUTERS, STATE_MANAGERS, type Framework } from '../constants/frameworks.js';\nimport { BUNDLERS } from '../constants/bundlers.js';\nimport { DEV_TOOLS } from '../constants/tools.js';\nimport { LINT_TOOLS } from '../constants/lint.js';\nimport { getSkillCatalog } from '../skills/catalog.js';\nimport { getMcpCatalog } from '../mcp/catalog.js';\n\n\nexport async function runInitPrompts(): Promise<InitAnswers | null> {\n const response = await prompts(\n [\n {\n type: 'text',\n name: 'projectName',\n message: 'Project name:',\n validate: (v: string) => (v.trim() ? true : 'Project name is required'),\n },\n {\n type: 'text',\n name: 'projectPath',\n message: 'Project path:',\n initial: (prev: string) => `./${prev}`,\n format: (v: string) => path.resolve(v),\n },\n {\n type: 'select',\n name: 'framework',\n message: 'Frontend framework:',\n choices: FRAMEWORKS.map((f) => ({ title: f.charAt(0).toUpperCase() + f.slice(1), value: f })),\n },\n {\n type: 'select',\n name: 'router',\n message: 'Router:',\n choices: (_prev: unknown, answers: Record<string, unknown>) => {\n const fw = answers.framework as Framework;\n return [{ title: ROUTERS[fw], value: ROUTERS[fw] }];\n },\n },\n {\n type: 'select',\n name: 'stateManagement',\n message: 'State management:',\n choices: (_prev: unknown, answers: Record<string, unknown>) => {\n const fw = answers.framework as Framework;\n return STATE_MANAGERS[fw].map((s) => ({ title: s, value: s }));\n },\n },\n {\n type: 'select',\n name: 'bundler',\n message: 'Build tool:',\n choices: BUNDLERS.map((b) => ({ title: b.charAt(0).toUpperCase() + b.slice(1), value: b })),\n },\n {\n type: 'multiselect',\n name: 'lintTools',\n message: 'Code quality tools (space to toggle):',\n choices: LINT_TOOLS.map((t) => ({\n title: t,\n value: t,\n selected: true,\n })),\n hint: 'ESLint + Prettier recommended',\n },\n {\n type: 'multiselect',\n name: 'devTools',\n message: 'Dev tools to configure:',\n choices: DEV_TOOLS.map((t) => ({ title: t, value: t, selected: t === 'cursor' })),\n min: 1,\n hint: 'Select at least one',\n },\n {\n type: 'multiselect',\n name: 'skills',\n message: 'Built-in Skills to enable:',\n choices: getSkillCatalog().map((s) => ({\n title: s.label,\n description: s.description,\n value: s.id,\n selected: false,\n })),\n },\n {\n type: 'multiselect',\n name: 'mcpServers',\n message: 'MCP servers to enable:',\n choices: getMcpCatalog().map((m) => ({\n title: m.label,\n description: m.description,\n value: m.id,\n selected: false,\n })),\n },\n ],\n { onCancel: () => process.exit(0) },\n );\n\n if (!response.projectName) return null;\n\n return response as InitAnswers;\n}\n","import type { SkillSelection } from '../adapters/types.js';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst { pathExistsSync, readdirSync, readFileSync } = fs;\n\nexport interface SkillDefinition {\n id: string;\n label: string;\n description: string;\n content: string;\n tags: string[];\n /** Absolute path to the original SKILL.md. */\n sourcePath: string;\n}\n\nfunction toLabel(id: string): string {\n return id\n .split(/[-_]/g)\n .filter(Boolean)\n .map((w) => w.slice(0, 1).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nfunction splitFrontmatter(raw: string): { meta: Record<string, string>; body: string } {\n if (!raw.startsWith('---\\n')) return { meta: {}, body: raw };\n\n const end = raw.indexOf('\\n---\\n', 4);\n if (end === -1) return { meta: {}, body: raw };\n\n const fm = raw.slice(4, end).trim();\n const body = raw.slice(end + '\\n---\\n'.length).replace(/^\\n+/, '');\n\n const meta: Record<string, string> = {};\n for (const line of fm.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const idx = trimmed.indexOf(':');\n if (idx <= 0) continue;\n const key = trimmed.slice(0, idx).trim();\n let value = trimmed.slice(idx + 1).trim();\n value = value.replace(/^\"(.*)\"$/, '$1').replace(/^'(.*)'$/, '$1');\n meta[key] = value;\n }\n\n return { meta, body };\n}\n\nfunction skillsDir(): string {\n return fileURLToPath(new URL('./skills/', import.meta.url));\n}\n\nfunction loadSkillsFromDir(): SkillDefinition[] {\n const dir = skillsDir();\n if (!pathExistsSync(dir)) return [];\n\n const entries = readdirSync(dir, { withFileTypes: true })\n .filter((d) => d.isDirectory())\n .map((d) => d.name)\n .sort((a, b) => a.localeCompare(b));\n\n const defs: SkillDefinition[] = [];\n for (const dirName of entries) {\n const p = path.join(dir, dirName, 'SKILL.md');\n if (!pathExistsSync(p)) continue;\n\n const raw = readFileSync(p, 'utf8');\n const { meta, body } = splitFrontmatter(raw);\n const id = meta.name?.trim() || dirName;\n const description = meta.description?.trim() || '';\n\n defs.push({\n id,\n label: toLabel(id),\n description,\n content: body.trimEnd(),\n tags: [],\n sourcePath: p,\n });\n }\n\n return defs;\n}\n\nexport function getSkillCatalog(): SkillDefinition[] {\n return loadSkillsFromDir();\n}\n\nexport function getSkillById(id: string): SkillSelection | undefined {\n const def = getSkillCatalog().find((s) => s.id === id);\n if (!def) return undefined;\n return { id: def.id, label: def.label, content: def.content, sourcePath: def.sourcePath };\n}\n","import type { McpSelection } from '../adapters/types.js';\n\nexport interface McpDefinition {\n id: string;\n label: string;\n description: string;\n config: Record<string, unknown>;\n}\n\nconst BUILTIN_MCP: McpDefinition[] = [\n {\n id: 'context7',\n label: 'Context7',\n description: 'Fetch up-to-date library documentation via Context7.',\n config: {\n command: 'npx',\n args: ['-y', '@upstash/context7-mcp@latest'],\n },\n },\n {\n id: 'sequential-thinking',\n label: 'Sequential Thinking',\n description: 'Step-by-step reasoning MCP server for complex problem solving.',\n config: {\n command: 'npx',\n args: ['-y', '@anthropic/sequential-thinking-mcp@latest'],\n },\n },\n {\n id: 'filesystem',\n label: 'Filesystem',\n description: 'Read/write project files via MCP.',\n config: {\n command: 'npx',\n args: ['-y', '@anthropic/filesystem-mcp@latest'],\n },\n },\n {\n id: 'exa-search',\n label: 'Exa Search',\n description: 'Neural web search for real-time information.',\n config: {\n command: 'npx',\n args: ['-y', 'exa-mcp-server@latest'],\n env: {\n EXA_API_KEY: '<your-exa-api-key>',\n },\n },\n },\n];\n\nexport function getMcpCatalog(): McpDefinition[] {\n return BUILTIN_MCP;\n}\n\nexport function getMcpById(id: string): McpSelection | undefined {\n const def = BUILTIN_MCP.find((m) => m.id === id);\n if (!def) return undefined;\n return { id: def.id, label: def.label, config: def.config };\n}\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\nimport type { InitAnswers } from '../types/selections.js';\nimport { logger } from '../utils/logger.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nfunction templateDir(framework: string, bundler: string): string {\n return path.resolve(__dirname, '..', 'templates', `${framework}-${bundler}-ts`);\n}\n\nexport async function generateProject(answers: InitAnswers): Promise<void> {\n const { projectPath, projectName, framework, bundler, router, stateManagement } = answers;\n\n await fs.ensureDir(projectPath);\n\n const srcTemplate = templateDir(framework, bundler);\n if (await fs.pathExists(srcTemplate)) {\n await fs.copy(srcTemplate, projectPath, { overwrite: false });\n logger.success(`Template ${framework}-${bundler}-ts copied`);\n } else {\n logger.warn(`No full template for ${framework}-${bundler}-ts. Generating minimal project.`);\n await generateMinimalProject(answers);\n }\n\n await patchPackageJson(projectPath, projectName, framework, bundler, router, stateManagement);\n logger.success('package.json configured');\n\n await ensureNextStyleScaffold(projectPath, framework);\n}\n\nasync function ensureNextStyleScaffold(projectPath: string, framework: InitAnswers['framework']): Promise<void> {\n // Next.js-like organization (no service/api). Keep it additive to avoid breaking existing templates.\n const dirs = [\n path.join(projectPath, 'public'),\n path.join(projectPath, 'src', 'app'),\n path.join(projectPath, 'src', 'components'),\n path.join(projectPath, 'src', 'hooks'),\n path.join(projectPath, 'src', 'lib'),\n path.join(projectPath, 'src', 'styles'),\n ];\n\n await Promise.all(dirs.map((d) => fs.ensureDir(d)));\n\n // Minimal placeholders to make folders visible in git and IDEs.\n const keepFiles = [\n path.join(projectPath, 'src', 'app', '.gitkeep'),\n path.join(projectPath, 'src', 'components', '.gitkeep'),\n path.join(projectPath, 'src', 'hooks', '.gitkeep'),\n path.join(projectPath, 'src', 'lib', '.gitkeep'),\n path.join(projectPath, 'src', 'styles', '.gitkeep'),\n path.join(projectPath, 'public', '.gitkeep'),\n ];\n await Promise.all(keepFiles.map((p) => fs.ensureFile(p)));\n\n // Framework-specific convention hints (purely additive).\n if (framework === 'vue') {\n await fs.ensureFile(path.join(projectPath, 'src', 'hooks', 'README.md'));\n await fs.writeFile(\n path.join(projectPath, 'src', 'hooks', 'README.md'),\n ['# hooks/', '', 'Vue 项目里这里更常放 `composables/`(可按团队习惯重命名)。', ''].join('\\n'),\n 'utf-8',\n );\n }\n}\n\nasync function generateMinimalProject(answers: InitAnswers): Promise<void> {\n const { projectPath, framework, bundler } = answers;\n const srcDir = path.join(projectPath, 'src');\n await fs.ensureDir(srcDir);\n\n const mainFile = framework === 'react' ? 'main.tsx' : 'main.ts';\n\n const mainContent = framework === 'react'\n ? [\n \"import React from 'react';\",\n \"import ReactDOM from 'react-dom/client';\",\n \"import App from './App';\",\n '',\n \"ReactDOM.createRoot(document.getElementById('root')!).render(\",\n ' <React.StrictMode>',\n ' <App />',\n ' </React.StrictMode>,',\n ');',\n ].join('\\n')\n : [\n \"import { createApp } from 'vue';\",\n \"import App from './App.vue';\",\n '',\n \"createApp(App).mount('#app');\",\n ].join('\\n');\n\n await fs.writeFile(path.join(srcDir, mainFile), mainContent, 'utf-8');\n\n if (framework === 'react') {\n await fs.writeFile(\n path.join(srcDir, 'App.tsx'),\n [\n \"import React from 'react';\",\n '',\n 'function App() {',\n ' return <div>Hello fe-kit</div>;',\n '}',\n '',\n 'export default App;',\n ].join('\\n'),\n 'utf-8',\n );\n } else {\n await fs.writeFile(\n path.join(srcDir, 'App.vue'),\n [\n '<script setup lang=\"ts\">',\n \"const msg = 'Hello fe-kit';\",\n '</script>',\n '',\n '<template>',\n ' <div>{{ msg }}</div>',\n '</template>',\n ].join('\\n'),\n 'utf-8',\n );\n }\n\n await fs.writeFile(\n path.join(projectPath, 'index.html'),\n [\n '<!DOCTYPE html>',\n '<html lang=\"en\">',\n '<head>',\n ' <meta charset=\"UTF-8\" />',\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />',\n ' <title>fe-kit project</title>',\n '</head>',\n '<body>',\n ` <div id=\"${framework === 'react' ? 'root' : 'app'}\"></div>`,\n ` <script type=\"module\" src=\"/src/${mainFile}\"></script>`,\n '</body>',\n '</html>',\n ].join('\\n'),\n 'utf-8',\n );\n\n const tsconfig = {\n compilerOptions: {\n target: 'ES2020',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n jsx: framework === 'react' ? 'react-jsx' : 'preserve',\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n isolatedModules: true,\n baseUrl: '.',\n paths: { '@/*': ['src/*'] },\n },\n include: ['src'],\n };\n await fs.writeJson(path.join(projectPath, 'tsconfig.json'), tsconfig, { spaces: 2 });\n\n await writeBundlerConfig(projectPath, framework, bundler);\n}\n\nasync function writeBundlerConfig(\n projectPath: string,\n framework: string,\n bundler: string,\n): Promise<void> {\n if (bundler === 'vite') {\n const plugin = framework === 'react'\n ? \"import react from '@vitejs/plugin-react';\"\n : \"import vue from '@vitejs/plugin-vue';\";\n const pluginCall = framework === 'react' ? 'react()' : 'vue()';\n\n await fs.writeFile(\n path.join(projectPath, 'vite.config.ts'),\n [\n \"import { defineConfig } from 'vite';\",\n plugin,\n '',\n 'export default defineConfig({',\n ` plugins: [${pluginCall}],`,\n ' resolve: {',\n \" alias: { '@': '/src' },\",\n ' },',\n '});',\n ].join('\\n'),\n 'utf-8',\n );\n } else if (bundler === 'webpack') {\n await fs.writeFile(\n path.join(projectPath, 'webpack.config.ts'),\n [\n \"// Webpack config placeholder — full template coming in P1\",\n \"import path from 'path';\",\n '',\n 'export default {',\n \" mode: 'development',\",\n \" entry: './src/main.\" + (framework === 'react' ? 'tsx' : 'ts') + \"',\",\n ' resolve: {',\n \" extensions: ['.ts', '.tsx', '.js', '.jsx', '.vue'],\",\n ' },',\n '};',\n ].join('\\n'),\n 'utf-8',\n );\n } else if (bundler === 'rspack') {\n await fs.writeFile(\n path.join(projectPath, 'rspack.config.ts'),\n [\n \"// Rspack config placeholder — full template coming in P1\",\n \"import { defineConfig } from '@rspack/cli';\",\n '',\n 'export default defineConfig({',\n \" entry: { main: './src/main.\" + (framework === 'react' ? 'tsx' : 'ts') + \"' },\",\n '});',\n ].join('\\n'),\n 'utf-8',\n );\n }\n}\n\nasync function patchPackageJson(\n projectPath: string,\n name: string,\n framework: string,\n bundler: string,\n router: string,\n stateManagement: string,\n): Promise<void> {\n const pkgPath = path.join(projectPath, 'package.json');\n const existing = (await fs.pathExists(pkgPath))\n ? await fs.readJson(pkgPath)\n : {};\n\n const deps: Record<string, string> = { ...existing.dependencies };\n const devDeps: Record<string, string> = { ...existing.devDependencies };\n\n if (framework === 'vue') {\n deps.vue = '^3.5.0';\n if (router === 'vue-router') deps['vue-router'] = '^4.5.0';\n if (stateManagement === 'pinia') deps.pinia = '^2.3.0';\n if (stateManagement === 'vuex') deps.vuex = '^4.1.0';\n } else {\n deps.react = '^19.0.0';\n deps['react-dom'] = '^19.0.0';\n devDeps['@types/react'] = '^19.0.0';\n devDeps['@types/react-dom'] = '^19.0.0';\n if (router === 'react-router') deps['react-router-dom'] = '^7.0.0';\n if (stateManagement === 'redux-toolkit') {\n deps['@reduxjs/toolkit'] = '^2.6.0';\n deps['react-redux'] = '^9.2.0';\n }\n if (stateManagement === 'zustand') deps.zustand = '^5.0.0';\n if (stateManagement === 'mobx') {\n deps.mobx = '^6.13.0';\n deps['mobx-react-lite'] = '^4.1.0';\n }\n }\n\n devDeps.typescript = '^5.8.0';\n\n if (bundler === 'vite') {\n devDeps.vite = '^6.3.0';\n if (framework === 'react') devDeps['@vitejs/plugin-react'] = '^4.4.0';\n if (framework === 'vue') devDeps['@vitejs/plugin-vue'] = '^5.2.0';\n } else if (bundler === 'webpack') {\n devDeps.webpack = '^5.99.0';\n devDeps['webpack-cli'] = '^6.0.0';\n devDeps['ts-loader'] = '^9.5.0';\n } else if (bundler === 'rspack') {\n devDeps['@rspack/core'] = '^1.3.0';\n devDeps['@rspack/cli'] = '^1.3.0';\n }\n\n const scripts: Record<string, string> = { ...existing.scripts };\n if (bundler === 'vite') {\n scripts.dev = 'vite';\n scripts.build = 'vite build';\n scripts.preview = 'vite preview';\n } else if (bundler === 'webpack') {\n scripts.dev = 'webpack serve --mode development';\n scripts.build = 'webpack --mode production';\n } else if (bundler === 'rspack') {\n scripts.dev = 'rspack serve';\n scripts.build = 'rspack build';\n }\n\n const pkg = {\n ...existing,\n name,\n version: '0.1.0',\n private: true,\n type: 'module',\n scripts,\n dependencies: deps,\n devDependencies: devDeps,\n };\n\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n}\n","import pc from 'picocolors';\n\nexport const logger = {\n info: (msg: string) => console.log(pc.cyan('ℹ'), msg),\n success: (msg: string) => console.log(pc.green('✔'), msg),\n warn: (msg: string) => console.log(pc.yellow('⚠'), msg),\n error: (msg: string) => console.error(pc.red('✖'), msg),\n step: (msg: string) => console.log(pc.blue('→'), msg),\n};\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { InitAnswers } from '../types/selections.js';\nimport type { LintTool } from '../constants/lint.js';\nimport { logger } from '../utils/logger.js';\n\nexport async function generateLintConfigs(answers: InitAnswers): Promise<void> {\n const { projectPath, lintTools, framework } = answers;\n\n for (const tool of lintTools) {\n await GENERATORS[tool]?.(projectPath, framework);\n }\n}\n\nconst GENERATORS: Record<LintTool, (root: string, fw: string) => Promise<void>> = {\n eslint: generateEslint,\n stylelint: generateStylelint,\n prettier: generatePrettier,\n editorconfig: generateEditorConfig,\n};\n\nasync function generateEslint(root: string, fw: string): Promise<void> {\n const pkgPath = path.join(root, 'package.json');\n const pkg = await fs.readJson(pkgPath);\n const devDeps = pkg.devDependencies ?? {};\n\n devDeps.eslint = '^9.25.0';\n devDeps['@eslint/js'] = '^9.25.0';\n devDeps['typescript-eslint'] = '^8.30.0';\n devDeps.globals = '^16.0.0';\n\n if (fw === 'vue') {\n devDeps['eslint-plugin-vue'] = '^10.0.0';\n } else {\n devDeps['eslint-plugin-react-hooks'] = '^5.2.0';\n devDeps['eslint-plugin-react-refresh'] = '^0.4.0';\n }\n\n pkg.devDependencies = devDeps;\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n\n const configLines = fw === 'vue'\n ? [\n \"import js from '@eslint/js';\",\n \"import tseslint from 'typescript-eslint';\",\n \"import pluginVue from 'eslint-plugin-vue';\",\n '',\n 'export default tseslint.config(',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n \" ...pluginVue.configs['flat/recommended'],\",\n ' {',\n \" files: ['**/*.vue'],\",\n ' languageOptions: {',\n ' parserOptions: { parser: tseslint.parser },',\n ' },',\n ' },',\n ');',\n ]\n : [\n \"import js from '@eslint/js';\",\n \"import tseslint from 'typescript-eslint';\",\n \"import reactHooks from 'eslint-plugin-react-hooks';\",\n \"import reactRefresh from 'eslint-plugin-react-refresh';\",\n \"import globals from 'globals';\",\n '',\n 'export default tseslint.config(',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n ' {',\n \" files: ['**/*.{ts,tsx}'],\",\n ' plugins: {',\n \" 'react-hooks': reactHooks,\",\n \" 'react-refresh': reactRefresh,\",\n ' },',\n ' languageOptions: {',\n ' globals: globals.browser,',\n ' },',\n ' rules: {',\n \" ...reactHooks.configs.recommended.rules,\",\n \" 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],\",\n ' },',\n ' },',\n ');',\n ];\n\n await fs.writeFile(path.join(root, 'eslint.config.mjs'), configLines.join('\\n'), 'utf-8');\n logger.success('ESLint 9 flat config generated');\n}\n\nasync function generateStylelint(root: string): Promise<void> {\n const pkgPath = path.join(root, 'package.json');\n const pkg = await fs.readJson(pkgPath);\n pkg.devDependencies = {\n ...pkg.devDependencies,\n stylelint: '^16.17.0',\n 'stylelint-config-standard': '^37.0.0',\n };\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n\n await fs.writeJson(\n path.join(root, '.stylelintrc.json'),\n { extends: ['stylelint-config-standard'] },\n { spaces: 2 },\n );\n logger.success('Stylelint config generated');\n}\n\nasync function generatePrettier(root: string): Promise<void> {\n const pkgPath = path.join(root, 'package.json');\n const pkg = await fs.readJson(pkgPath);\n pkg.devDependencies = { ...pkg.devDependencies, prettier: '^3.5.0' };\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n\n const config = {\n semi: true,\n singleQuote: true,\n tabWidth: 2,\n trailingComma: 'all' as const,\n printWidth: 100,\n };\n await fs.writeJson(path.join(root, '.prettierrc.json'), config, { spaces: 2 });\n logger.success('Prettier config generated');\n}\n\nasync function generateEditorConfig(root: string): Promise<void> {\n const content = [\n 'root = true',\n '',\n '[*]',\n 'indent_style = space',\n 'indent_size = 2',\n 'end_of_line = lf',\n 'charset = utf-8',\n 'trim_trailing_whitespace = true',\n 'insert_final_newline = true',\n ].join('\\n');\n\n await fs.writeFile(path.join(root, '.editorconfig'), content, 'utf-8');\n logger.success('EditorConfig generated');\n}\n\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { InitAnswers, EnhanceAnswers } from '../types/selections.js';\nimport type {\n ProjectMeta,\n SkillsMeta,\n McpMeta,\n ToolsMeta,\n SkillEntry,\n McpEntry,\n} from '../types/fe-kit-config.js';\nimport type { ProjectDetection } from '../core/detect-project.js';\nimport type { StackDetection } from '../core/detect-stack.js';\nimport { META_DIR, CLI_VERSION } from '../constants/meta.js';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { writeRules } from '../core/write-rules.js';\nimport { logger } from '../utils/logger.js';\n\nfunction metaDir(root: string): string {\n return path.join(root, META_DIR);\n}\n\n/** Called by `init` — writes fresh .fe-kit/ directory. */\nexport async function writeFeKitMeta(answers: InitAnswers): Promise<void> {\n const dir = metaDir(answers.projectPath);\n await fs.ensureDir(dir);\n\n const project: ProjectMeta = {\n name: answers.projectName,\n framework: answers.framework,\n router: answers.router,\n stateManagement: answers.stateManagement,\n bundler: answers.bundler,\n typescript: true,\n lintTools: answers.lintTools,\n templateVersion: '0.1.0',\n rulesVersion: '0.1.0',\n cliVersion: CLI_VERSION,\n };\n\n const skills: SkillsMeta = {\n enabled: answers.skills.map((id) => ({\n id,\n source: 'builtin' as const,\n targets: answers.devTools,\n version: CLI_VERSION,\n })),\n };\n\n const mcp: McpMeta = {\n enabled: answers.mcpServers.map((id) => ({\n id,\n adapterStatus: Object.fromEntries(answers.devTools.map((t) => [t, 'written' as const])),\n version: CLI_VERSION,\n })),\n configVersion: CLI_VERSION,\n };\n\n const tools: ToolsMeta = {\n selectedTools: answers.devTools,\n paths: {},\n extensionRecommendations: [],\n };\n\n await Promise.all([\n writeJsonSafe(path.join(dir, 'project.json'), project),\n writeJsonSafe(path.join(dir, 'skills.json'), skills),\n writeJsonSafe(path.join(dir, 'mcp.json'), mcp),\n writeJsonSafe(path.join(dir, 'tools.json'), tools),\n ]);\n\n await writeRules(answers.projectPath, answers.framework);\n logger.success(`.fe-kit/ metadata written`);\n}\n\n/** Called by `enhance` — merges into existing .fe-kit/ or creates it. */\nexport async function updateFeKitMeta(\n projectRoot: string,\n detection: ProjectDetection | StackDetection,\n answers: EnhanceAnswers,\n): Promise<void> {\n const dir = metaDir(projectRoot);\n await fs.ensureDir(dir);\n\n const fw = detection.framework;\n const isClassicDetection = 'router' in detection;\n\n const projectPath = path.join(dir, 'project.json');\n const existingProject = (await readJsonSafe<Record<string, unknown>>(projectPath)) ?? {\n name: detection.name,\n framework: fw,\n router: isClassicDetection ? ((detection as ProjectDetection).router ?? '') : '',\n stateManagement: isClassicDetection ? ((detection as ProjectDetection).stateManagement ?? '') : '',\n bundler: detection.bundler ?? 'vite',\n typescript: true,\n lintTools: [],\n templateVersion: '0.1.0',\n rulesVersion: '0.1.0',\n cliVersion: CLI_VERSION,\n };\n await writeJsonSafe(projectPath, { ...existingProject, cliVersion: CLI_VERSION });\n\n const skillsPath = path.join(dir, 'skills.json');\n const existingSkills = (await readJsonSafe<SkillsMeta>(skillsPath)) ?? { enabled: [] };\n const newSkillEntries: SkillEntry[] = answers.skills.map((id) => ({\n id,\n source: 'builtin' as const,\n targets: answers.devTools,\n version: CLI_VERSION,\n }));\n await writeJsonSafe(\n skillsPath,\n mergeConfig(existingSkills, { enabled: newSkillEntries }),\n );\n\n const mcpPath = path.join(dir, 'mcp.json');\n const existingMcp = (await readJsonSafe<McpMeta>(mcpPath)) ?? {\n enabled: [],\n configVersion: CLI_VERSION,\n };\n const newMcpEntries: McpEntry[] = answers.mcpServers.map((id) => ({\n id,\n adapterStatus: Object.fromEntries(answers.devTools.map((t) => [t, 'written' as const])),\n version: CLI_VERSION,\n }));\n await writeJsonSafe(\n mcpPath,\n mergeConfig(existingMcp, { enabled: newMcpEntries, configVersion: CLI_VERSION }),\n );\n\n const toolsPath = path.join(dir, 'tools.json');\n const existingTools = (await readJsonSafe<ToolsMeta>(toolsPath)) ?? {\n selectedTools: [],\n paths: {},\n extensionRecommendations: [],\n };\n await writeJsonSafe(\n toolsPath,\n mergeConfig(existingTools, { selectedTools: answers.devTools }),\n );\n\n await writeRules(projectRoot, fw);\n logger.success(`.fe-kit/ metadata updated`);\n}\n","import fs from 'fs-extra';\nimport path from 'node:path';\n\n/** Safely read a JSON file; returns undefined when file is missing or malformed. */\nexport async function readJsonSafe<T = unknown>(\n filePath: string,\n): Promise<T | undefined> {\n try {\n return (await fs.readJson(filePath)) as T;\n } catch {\n return undefined;\n }\n}\n\n/** Write JSON with consistent formatting. Creates parent dirs as needed. */\nexport async function writeJsonSafe(\n filePath: string,\n data: unknown,\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeJson(filePath, data, { spaces: 2 });\n}\n","import deepmerge from 'deepmerge';\n\n/**\n * Deep-merge two objects. Arrays of objects with `id` fields are merged\n * by id (idempotent append), plain arrays are deduplicated.\n */\nexport function mergeConfig<T>(base: T, incoming: Partial<T>): T {\n return deepmerge(base as any, incoming as any, {\n arrayMerge: idempotentArrayMerge,\n }) as T;\n}\n\nfunction idempotentArrayMerge(target: unknown[], source: unknown[]): unknown[] {\n if (isIdArray(target) || isIdArray(source)) {\n return mergeById(target as HasId[], source as HasId[]);\n }\n return [...new Set([...target, ...source])];\n}\n\ninterface HasId {\n id: string;\n [key: string]: unknown;\n}\n\nfunction isIdArray(arr: unknown[]): arr is HasId[] {\n return arr.length > 0 && typeof arr[0] === 'object' && arr[0] !== null && 'id' in arr[0];\n}\n\nfunction mergeById(target: HasId[], source: HasId[]): HasId[] {\n const map = new Map<string, HasId>();\n for (const item of target) map.set(item.id, item);\n for (const item of source) {\n const existing = map.get(item.id);\n map.set(item.id, existing ? deepmerge(existing, item) : item);\n }\n return [...map.values()];\n}\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\nimport type { Framework } from '../constants/frameworks.js';\nimport type { StackFramework } from './detect-stack.js';\nimport { META_DIR } from '../constants/meta.js';\nimport { logger } from '../utils/logger.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nfunction rulesSourceDir(): string {\n const candidates = [\n path.resolve(__dirname, 'rules'),\n path.resolve(__dirname, '..', 'rules'),\n path.resolve(__dirname, '..', '..', 'src', 'rules'),\n path.resolve(process.cwd(), 'src', 'rules'),\n ];\n\n for (const dir of candidates) {\n if (fs.existsSync(dir)) return dir;\n }\n\n return candidates[0];\n}\n\nexport async function writeRules(\n projectRoot: string,\n framework: Framework | StackFramework,\n): Promise<void> {\n const targetDir = path.join(projectRoot, META_DIR, 'rules');\n const srcBase = rulesSourceDir();\n\n const frameworkDir = mapFrameworkRulesDir(framework);\n const dirs = [\n ...(frameworkDir ? [path.join(srcBase, frameworkDir)] : []),\n path.join(srcBase, 'common'),\n ];\n\n for (const dir of dirs) {\n if (!(await fs.pathExists(dir))) continue;\n const relative = path.basename(dir);\n await fs.copy(dir, path.join(targetDir, relative), { overwrite: false });\n }\n\n logger.success(`Rules for ${framework} written to ${META_DIR}/rules/`);\n}\n\nfunction mapFrameworkRulesDir(fw: Framework | StackFramework): string | null {\n if (fw === 'vue' || fw === 'nuxt') return 'vue';\n if (fw === 'react' || fw === 'next') return 'react';\n return null;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { InitAnswers } from '../types/selections.js';\nimport { logger } from '../utils/logger.js';\n\nfunction scriptBlock(bundler: InitAnswers['bundler']): string {\n if (bundler === 'vite') {\n return [\n '- `pnpm dev`:启动开发服务器',\n '- `pnpm build`:构建生产产物',\n '- `pnpm preview`:本地预览生产构建',\n ].join('\\n');\n }\n\n if (bundler === 'webpack') {\n return [\n '- `pnpm dev`:启动开发服务器',\n '- `pnpm build`:构建生产产物',\n ].join('\\n');\n }\n\n // rspack\n return [\n '- `pnpm dev`:启动开发服务器',\n '- `pnpm build`:构建生产产物',\n ].join('\\n');\n}\n\nfunction structureBlock(framework: InitAnswers['framework']): string {\n const lines: string[] = [\n '```text',\n '.',\n '├─ public/ # 静态资源(不经构建直接输出)',\n '├─ src/',\n '│ ├─ app/ # “应用层”组织',\n '│ ├─ components/ # 业务/通用组件',\n '│ ├─ hooks/ # React Hooks / Vue Composables(按需放)',\n '│ ├─ lib/ # 工具函数、请求封装、纯逻辑(不直接依赖 UI)',\n '│ ├─ styles/ # 样式与设计 token(按需放)',\n '│ └─ ' + (framework === 'react' ? 'main.tsx' : 'main.ts') + ' # 入口文件',\n '├─ .fe-kit/ # fe-kit 生成的元数据与规则',\n '├─ package.json',\n '├─ tsconfig.json',\n '└─ README.md',\n '```',\n ];\n return lines.join('\\n');\n}\n\nexport async function generateReadme(answers: InitAnswers): Promise<void> {\n const outPath = path.join(answers.projectPath, 'README.md');\n\n const content = [\n `# ${answers.projectName}`,\n '',\n '一个由 **fe-kit** 初始化的前端工程骨架。',\n '',\n '## 环境要求',\n '',\n '- Node.js >= 18',\n '- pnpm(推荐)',\n '',\n '## 快速开始',\n '',\n '安装依赖:',\n '',\n '```bash',\n 'pnpm install',\n '```',\n '',\n '常用脚本:',\n '',\n scriptBlock(answers.bundler),\n '',\n '## 目录结构',\n '',\n structureBlock(answers.framework),\n '',\n '## 约定说明(重要)',\n '',\n '- **不包含 service/back-end 内容**:本骨架不生成任何服务端目录与 API 路由。',\n '- **应用层组织**:`src/app/` 仅作为代码组织约定,不强绑定具体框架运行时。',\n '',\n ].join('\\n');\n\n await fs.writeFile(outPath, content, 'utf-8');\n logger.success('README.md generated');\n}\n\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { ToolAdapter, AdapterContext, SkillSelection, McpSelection } from './types.js';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { TOOL_CONFIG_PATHS } from '../core/paths.js';\nimport { writeCursorRules } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\n\nexport const cursorAdapter: ToolAdapter = {\n id: 'cursor',\n\n async applySkills(_ctx, skills) {\n if (skills.length === 0) return;\n logger.info('Cursor: skills are applied via rules — no separate skills directory needed.');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const configPath = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.cursor, 'mcp.json');\n await fs.ensureDir(path.dirname(configPath));\n\n const existing = (await readJsonSafe<Record<string, unknown>>(configPath)) ?? {};\n const mcpSection = (existing.mcpServers as Record<string, unknown>) ?? {};\n\n for (const m of mcp) {\n mcpSection[m.id] = m.config;\n }\n\n await writeJsonSafe(configPath, mergeConfig(existing, { mcpServers: mcpSection }));\n logger.success('Cursor: MCP config written to .cursor/mcp.json');\n },\n\n async applyRules(ctx) {\n await writeCursorRules(ctx.projectRoot, ctx.framework);\n logger.success('Cursor: rules written to .cursor/rules/*.mdc');\n },\n};\n","import type { DevToolId } from '../constants/tools.js';\n\n/** Default config directories/files per IDE/tool inside a project root. */\nexport const TOOL_CONFIG_PATHS: Record<DevToolId, string> = {\n cursor: '.cursor',\n 'claude-code': '.claude',\n vscode: '.vscode',\n 'codebuddy-cn': '.codebuddy',\n trae: '.trae',\n idea: '.idea',\n};\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\nimport type { Framework } from '../constants/frameworks.js';\nimport type { StackFramework } from './detect-stack.js';\nimport { logger } from '../utils/logger.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nfunction rulesSourceDir(): string {\n const candidates = [\n // Built output: dist/rules (when bundled into dist/cli.mjs)\n path.resolve(__dirname, 'rules'),\n // Built output: dist/rules (when running from dist/core/*)\n path.resolve(__dirname, '..', 'rules'),\n // Source repo: src/rules (when running from src/core/*)\n path.resolve(__dirname, '..', '..', 'src', 'rules'),\n // Fallback for running from repo root without a build\n path.resolve(process.cwd(), 'src', 'rules'),\n ];\n\n for (const dir of candidates) {\n if (fs.existsSync(dir)) return dir;\n }\n\n return candidates[0];\n}\n\nexport interface RuleFile {\n /** Filename stem, e.g. \"typescript\" */\n name: string;\n /** Category: \"common\", \"react\", or \"vue\" */\n category: string;\n /** Raw markdown body (no frontmatter) */\n content: string;\n}\n\nfunction stripFrontmatter(raw: string): string {\n if (!raw.startsWith('---')) return raw.trim();\n const end = raw.indexOf('\\n---', 3);\n if (end === -1) return raw.trim();\n return raw.slice(end + '\\n---'.length).replace(/^\\s*\\n+/, '').trimEnd();\n}\n\nfunction mapFrameworkDir(fw: Framework | StackFramework): string | null {\n if (fw === 'vue' || fw === 'nuxt') return 'vue';\n if (fw === 'react' || fw === 'next') return 'react';\n return null;\n}\n\nexport async function loadRuleSources(\n framework: Framework | StackFramework,\n): Promise<RuleFile[]> {\n const srcBase = rulesSourceDir();\n if (!(await fs.pathExists(srcBase))) {\n logger.warn(`Rules source directory not found: ${srcBase}`);\n return [];\n }\n const fwDir = mapFrameworkDir(framework);\n const dirs: { dir: string; category: string }[] = [\n { dir: path.join(srcBase, 'common'), category: 'common' },\n ];\n if (fwDir) {\n dirs.push({ dir: path.join(srcBase, fwDir), category: fwDir });\n }\n\n const rules: RuleFile[] = [];\n for (const { dir, category } of dirs) {\n if (!(await fs.pathExists(dir))) continue;\n const files = await fs.readdir(dir);\n for (const file of files) {\n const ext = path.extname(file).toLowerCase();\n if (ext !== '.md' && ext !== '.mdc') continue;\n const raw = await fs.readFile(path.join(dir, file), 'utf-8');\n rules.push({\n name: path.basename(file, ext),\n category,\n content: stripFrontmatter(raw),\n });\n }\n }\n return rules;\n}\n\nfunction toMdcContent(rule: RuleFile, globs?: string[]): string {\n const globLine = globs ? `globs: ${JSON.stringify(globs)}` : '';\n const lines = [\n '---',\n `description: ${rule.category}/${rule.name} conventions`,\n ...(globLine ? [globLine] : []),\n 'alwaysApply: true',\n '---',\n '',\n rule.content,\n '',\n ];\n return lines.join('\\n');\n}\n\nfunction ruleGlobs(rule: RuleFile): string[] | undefined {\n if (rule.category === 'react') return ['**/*.{tsx,jsx,ts,js}'];\n if (rule.category === 'vue') return ['**/*.{vue,ts,js}'];\n return undefined;\n}\n\nexport async function writeCursorRules(\n projectRoot: string,\n framework: Framework | StackFramework,\n): Promise<void> {\n const rules = await loadRuleSources(framework);\n const dir = path.join(projectRoot, '.cursor', 'rules');\n await fs.ensureDir(dir);\n\n for (const rule of rules) {\n const filename = `${rule.category}-${rule.name}.mdc`;\n await fs.writeFile(path.join(dir, filename), toMdcContent(rule, ruleGlobs(rule)), 'utf-8');\n }\n}\n\nexport async function writeCodeBuddyRules(\n projectRoot: string,\n framework: Framework | StackFramework,\n): Promise<void> {\n const rules = await loadRuleSources(framework);\n const dir = path.join(projectRoot, '.codebuddy', 'rules');\n await fs.ensureDir(dir);\n\n for (const rule of rules) {\n const filename = `${rule.category}-${rule.name}.mdc`;\n await fs.writeFile(path.join(dir, filename), toMdcContent(rule, ruleGlobs(rule)), 'utf-8');\n }\n}\n\nexport async function writeCopilotInstructions(\n projectRoot: string,\n framework: Framework | StackFramework,\n): Promise<void> {\n const rules = await loadRuleSources(framework);\n const dir = path.join(projectRoot, '.github');\n await fs.ensureDir(dir);\n\n const sections = rules.map((r) => r.content);\n const body = [\n '# Project Coding Guidelines',\n '',\n ...sections.flatMap((s) => [s, '']),\n ].join('\\n');\n\n await fs.writeFile(path.join(dir, 'copilot-instructions.md'), body, 'utf-8');\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { ToolAdapter, AdapterContext, SkillSelection, McpSelection } from './types.js';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { TOOL_CONFIG_PATHS } from '../core/paths.js';\nimport { loadRuleSources } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\n\nexport const claudeCodeAdapter: ToolAdapter = {\n id: 'claude-code',\n\n async applySkills(ctx, skills) {\n if (skills.length === 0) return;\n const skillsRoot = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS['claude-code'], 'skills');\n await fs.ensureDir(skillsRoot);\n\n for (const skill of skills) {\n const targetDir = path.join(skillsRoot, skill.id);\n await fs.ensureDir(targetDir);\n\n if (skill.sourcePath) {\n const sourceDir = path.dirname(skill.sourcePath);\n await fs.copy(sourceDir, targetDir, { overwrite: true });\n } else {\n await fs.writeFile(path.join(targetDir, 'SKILL.md'), skill.content, 'utf-8');\n }\n }\n logger.success('Claude Code: skills copied to .claude/skills/<skill>/SKILL.md');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const configPath = path.join(ctx.projectRoot, '.mcp.json');\n const existing = (await readJsonSafe<Record<string, unknown>>(configPath)) ?? {};\n const mcpSection = (existing.mcpServers as Record<string, unknown>) ?? {};\n\n for (const m of mcp) {\n mcpSection[m.id] = m.config;\n }\n\n await writeJsonSafe(configPath, mergeConfig(existing, { mcpServers: mcpSection }));\n logger.success('Claude Code: MCP config written to .mcp.json');\n },\n\n async applyRules(ctx) {\n const rulesDir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS['claude-code'], 'rules');\n await fs.ensureDir(rulesDir);\n\n const rules = await loadRuleSources(ctx.framework);\n for (const rule of rules) {\n const filename = `${rule.category}-${rule.name}.md`;\n await fs.writeFile(path.join(rulesDir, filename), rule.content + '\\n', 'utf-8');\n }\n logger.success('Claude Code: rules written to .claude/rules/');\n },\n};\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { ToolAdapter, AdapterContext, SkillSelection, McpSelection } from './types.js';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { writeCopilotInstructions } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\nimport { TOOL_CONFIG_PATHS } from '../core/paths.js';\n\nexport const vscodeAdapter: ToolAdapter = {\n id: 'vscode',\n\n async applySkills(_ctx, skills) {\n if (skills.length === 0) return;\n logger.info('VS Code: skills are applied via Copilot instructions — no separate skills directory.');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.vscode);\n await fs.ensureDir(dir);\n\n const configPath = path.join(dir, 'mcp.json');\n const existing = (await readJsonSafe<Record<string, unknown>>(configPath)) ?? {};\n const serversSection = (existing.servers as Record<string, unknown>) ?? {};\n\n for (const m of mcp) {\n serversSection[m.id] = m.config;\n }\n\n await writeJsonSafe(configPath, mergeConfig(existing, { servers: serversSection }));\n logger.success('VS Code: MCP config written to .vscode/mcp.json (servers)');\n },\n\n async applyRules(ctx) {\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.vscode);\n await fs.ensureDir(dir);\n\n const extensionsPath = path.join(dir, 'extensions.json');\n const existing = (await readJsonSafe<{ recommendations?: string[] }>(extensionsPath)) ?? {};\n const recs = new Set(existing.recommendations ?? []);\n\n const recommended = [\n 'dbaeumer.vscode-eslint',\n 'esbenp.prettier-vscode',\n 'stylelint.vscode-stylelint',\n ];\n if (ctx.framework === 'vue') recommended.push('Vue.volar');\n for (const ext of recommended) recs.add(ext);\n\n await writeJsonSafe(extensionsPath, { recommendations: [...recs] });\n\n await writeCopilotInstructions(ctx.projectRoot, ctx.framework);\n logger.success('VS Code: extensions.json + .github/copilot-instructions.md updated');\n },\n};\n","import type { ToolAdapter, AdapterContext, SkillSelection, McpSelection } from './types.js';\nimport path from 'node:path';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { writeCodeBuddyRules } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\n\nexport const codebuddyCnAdapter: ToolAdapter = {\n id: 'codebuddy-cn',\n\n async applySkills(_ctx, skills) {\n if (skills.length === 0) return;\n logger.info('CodeBuddy: skills are applied via rules — no separate skills directory needed.');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const configPath = path.join(ctx.projectRoot, '.mcp.json');\n const existing = (await readJsonSafe<Record<string, unknown>>(configPath)) ?? {};\n const mcpSection = (existing.mcpServers as Record<string, unknown>) ?? {};\n\n for (const m of mcp) {\n mcpSection[m.id] = m.config;\n }\n\n await writeJsonSafe(configPath, mergeConfig(existing, { mcpServers: mcpSection }));\n logger.success('CodeBuddy: MCP config written to .mcp.json');\n },\n\n async applyRules(ctx) {\n await writeCodeBuddyRules(ctx.projectRoot, ctx.framework);\n logger.success('CodeBuddy: rules written to .codebuddy/rules/*.mdc');\n },\n};\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { ToolAdapter, AdapterContext, SkillSelection, McpSelection } from './types.js';\nimport { readJsonSafe, writeJsonSafe } from '../utils/fs.js';\nimport { mergeConfig } from '../core/merge-config.js';\nimport { TOOL_CONFIG_PATHS } from '../core/paths.js';\nimport { loadRuleSources } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\n\nexport const traeAdapter: ToolAdapter = {\n id: 'trae',\n\n async applySkills(ctx, skills) {\n if (skills.length === 0) return;\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.trae, 'rules');\n await fs.ensureDir(dir);\n\n for (const skill of skills) {\n const filePath = path.join(dir, `${skill.id}.md`);\n await fs.writeFile(filePath, skill.content, 'utf-8');\n }\n logger.success('Trae: skills written to .trae/rules/');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const configPath = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.trae, 'mcp.json');\n await fs.ensureDir(path.dirname(configPath));\n const existing = (await readJsonSafe<Record<string, unknown>>(configPath)) ?? {};\n const mcpSection = (existing.mcpServers as Record<string, unknown>) ?? {};\n\n for (const m of mcp) {\n mcpSection[m.id] = m.config;\n }\n\n await writeJsonSafe(configPath, mergeConfig(existing, { mcpServers: mcpSection }));\n logger.success('Trae: MCP config written to .trae/mcp.json');\n },\n\n async applyRules(ctx) {\n const rulesDir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.trae, 'rules');\n await fs.ensureDir(rulesDir);\n\n const rules = await loadRuleSources(ctx.framework);\n for (const rule of rules) {\n const filename = `${rule.category}-${rule.name}.md`;\n await fs.writeFile(path.join(rulesDir, filename), rule.content + '\\n', 'utf-8');\n }\n logger.success('Trae: rules written to .trae/rules/');\n },\n};\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { ToolAdapter, AdapterContext } from './types.js';\nimport { TOOL_CONFIG_PATHS } from '../core/paths.js';\nimport { loadRuleSources } from '../core/rule-writers.js';\nimport { logger } from '../utils/logger.js';\n\nexport const ideaAdapter: ToolAdapter = {\n id: 'idea',\n\n async applySkills(ctx, skills) {\n if (skills.length === 0) return;\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.idea);\n await fs.ensureDir(dir);\n logger.info('IDEA: skill integration is a placeholder — manual config may be needed.');\n },\n\n async applyMcp(ctx, mcp) {\n if (mcp.length === 0) return;\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.idea);\n await fs.ensureDir(dir);\n logger.info('IDEA: MCP integration is a placeholder — manual config may be needed.');\n },\n\n async applyRules(ctx) {\n const dir = path.join(ctx.projectRoot, TOOL_CONFIG_PATHS.idea);\n await fs.ensureDir(dir);\n\n // Keep JetBrains config untouched; write our own additive folder.\n const rulesDir = path.join(dir, 'fe-kit', 'rules');\n await fs.ensureDir(rulesDir);\n\n const rules = await loadRuleSources(ctx.framework);\n for (const rule of rules) {\n const filename = `${rule.category}-${rule.name}.md`;\n await fs.writeFile(path.join(rulesDir, filename), rule.content + '\\n', 'utf-8');\n }\n\n logger.success('IDEA: rules written to .idea/fe-kit/rules/');\n },\n};\n","import type { DevToolId } from '../constants/tools.js';\nimport type { ToolAdapter } from './types.js';\nimport { cursorAdapter } from './cursor.js';\nimport { claudeCodeAdapter } from './claude-code.js';\nimport { vscodeAdapter } from './vscode.js';\nimport { codebuddyCnAdapter } from './codebuddy-cn.js';\nimport { traeAdapter } from './trae.js';\nimport { ideaAdapter } from './idea.js';\n\nconst adapters: Record<DevToolId, ToolAdapter> = {\n cursor: cursorAdapter,\n 'claude-code': claudeCodeAdapter,\n vscode: vscodeAdapter,\n 'codebuddy-cn': codebuddyCnAdapter,\n trae: traeAdapter,\n idea: ideaAdapter,\n};\n\nexport function getAdapter(id: DevToolId): ToolAdapter {\n return adapters[id];\n}\n\nexport function getAdapters(ids: DevToolId[]): ToolAdapter[] {\n return ids.map((id) => adapters[id]);\n}\n","import type { AdapterContext, SkillSelection, McpSelection } from '../adapters/types.js';\nimport type { Framework } from '../constants/frameworks.js';\nimport type { StackFramework } from './detect-stack.js';\nimport type { DevToolId } from '../constants/tools.js';\nimport { getAdapters } from '../adapters/registry.js';\nimport { getSkillById } from '../skills/catalog.js';\nimport { getMcpById } from '../mcp/catalog.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface AdapterInput {\n framework: Framework | StackFramework;\n devTools: DevToolId[];\n skills: string[];\n mcpServers: string[];\n}\n\nexport async function applyAdapters(\n projectRoot: string,\n input: AdapterInput,\n): Promise<void> {\n const adapters = getAdapters(input.devTools);\n const ctx: AdapterContext = { projectRoot, framework: input.framework };\n\n const skills: SkillSelection[] = input.skills\n .map(getSkillById)\n .filter((s): s is SkillSelection => s !== undefined);\n\n const mcp: McpSelection[] = input.mcpServers\n .map(getMcpById)\n .filter((m): m is McpSelection => m !== undefined);\n\n for (const adapter of adapters) {\n logger.step(`Applying config for ${adapter.id}...`);\n await adapter.applySkills(ctx, skills);\n await adapter.applyMcp(ctx, mcp);\n await adapter.applyRules(ctx);\n }\n}\n","import { runInitPrompts } from '../prompts/init-prompts.js';\nimport { generateProject } from '../generators/project-generator.js';\nimport { generateLintConfigs } from '../generators/lint-generator.js';\nimport { writeFeKitMeta } from '../generators/fe-kit-meta-generator.js';\nimport { generateReadme } from '../generators/readme-generator.js';\nimport { applyAdapters } from '../core/apply-adapters.js';\nimport { logger } from '../utils/index.js';\n\nexport async function initCommand(): Promise<void> {\n logger.step('Starting new project initialization...');\n\n const answers = await runInitPrompts();\n if (!answers) return;\n\n await generateProject(answers);\n await generateLintConfigs(answers);\n await writeFeKitMeta(answers);\n await generateReadme(answers);\n await applyAdapters(answers.projectPath, answers);\n\n logger.success(`Project \"${answers.projectName}\" created at ${answers.projectPath}`);\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport { detectProject } from '../core/detect-project.js';\nimport type { ProjectDetection } from '../core/detect-project.js';\nimport { detectStack, summarizeStack } from '../core/detect-stack.js';\nimport type { StackDetection } from '../core/detect-stack.js';\nimport { runEnhancePrompts } from '../prompts/enhance-prompts.js';\nimport { updateFeKitMeta } from '../generators/fe-kit-meta-generator.js';\nimport { generateQualityTooling } from '../generators/quality-generator.js';\nimport { applyAdapters } from '../core/apply-adapters.js';\nimport { logger } from '../utils/index.js';\n\nexport async function enhanceCommand(): Promise<void> {\n logger.step('Analyzing current project...');\n\n const projectRoot = process.cwd();\n\n const classicDetection = await detectProject(projectRoot);\n const stack: StackDetection | null = classicDetection\n ? await toStackDetection(projectRoot, classicDetection)\n : await detectStack(projectRoot);\n\n if (!stack) {\n logger.error(\n 'Could not detect a project in the current directory. ' +\n 'Make sure package.json exists.',\n );\n process.exitCode = 1;\n return;\n }\n\n logger.info(`Detected: ${summarizeStack(stack)}`);\n\n const answers = await runEnhancePrompts(stack);\n if (!answers) return;\n\n await updateFeKitMeta(projectRoot, classicDetection ?? stack, answers);\n\n if (answers.qualityTools.length > 0) {\n await generateQualityTooling(projectRoot, stack, answers.qualityTools);\n }\n\n await applyAdapters(projectRoot, {\n framework: stack.framework,\n ...answers,\n });\n\n logger.success('Project enhanced successfully.');\n}\n\nasync function toStackDetection(\n root: string,\n d: ProjectDetection,\n): Promise<StackDetection> {\n return {\n name: d.name,\n projectKind: 'frontend',\n framework: d.framework,\n bundler: d.bundler,\n hasTypeScript: d.hasTypeScript,\n hasGit: await fs.pathExists(path.join(root, '.git')),\n };\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Framework } from '../constants/frameworks.js';\nimport type { Bundler } from '../constants/bundlers.js';\nimport { readJsonSafe } from '../utils/fs.js';\n\nexport interface ProjectDetection {\n name: string;\n framework: Framework;\n router?: string;\n stateManagement?: string;\n bundler?: Bundler;\n hasTypeScript: boolean;\n}\n\nexport async function detectProject(\n root: string,\n): Promise<ProjectDetection | null> {\n const pkgPath = path.join(root, 'package.json');\n if (!(await fs.pathExists(pkgPath))) return null;\n\n const pkg = await readJsonSafe<Record<string, unknown>>(pkgPath);\n if (!pkg) return null;\n\n const allDeps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const framework = detectFramework(allDeps);\n if (!framework) return null;\n\n return {\n name: (pkg.name as string) ?? path.basename(root),\n framework,\n router: detectRouter(allDeps, framework),\n stateManagement: detectStateManagement(allDeps, framework),\n bundler: detectBundler(allDeps),\n hasTypeScript: 'typescript' in allDeps || (await fs.pathExists(path.join(root, 'tsconfig.json'))),\n };\n}\n\nfunction detectFramework(deps: Record<string, string>): Framework | null {\n if ('vue' in deps) return 'vue';\n if ('react' in deps) return 'react';\n return null;\n}\n\nfunction detectRouter(deps: Record<string, string>, fw: Framework): string | undefined {\n if (fw === 'vue' && 'vue-router' in deps) return 'vue-router';\n if (fw === 'react' && 'react-router' in deps) return 'react-router';\n if (fw === 'react' && 'react-router-dom' in deps) return 'react-router';\n return undefined;\n}\n\nfunction detectStateManagement(deps: Record<string, string>, fw: Framework): string | undefined {\n if (fw === 'vue') {\n if ('pinia' in deps) return 'pinia';\n if ('vuex' in deps) return 'vuex';\n }\n if (fw === 'react') {\n if ('@reduxjs/toolkit' in deps) return 'redux-toolkit';\n if ('zustand' in deps) return 'zustand';\n if ('mobx' in deps) return 'mobx';\n }\n return undefined;\n}\n\nfunction detectBundler(deps: Record<string, string>): Bundler | undefined {\n if ('vite' in deps) return 'vite';\n if ('webpack' in deps) return 'webpack';\n if ('@rspack/cli' in deps || '@rspack/core' in deps) return 'rspack';\n return undefined;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Bundler } from '../constants/bundlers.js';\nimport { readJsonSafe } from '../utils/fs.js';\n\nexport const STACK_FRAMEWORKS = ['vue', 'react', 'next', 'nuxt', 'unknown'] as const;\nexport type StackFramework = (typeof STACK_FRAMEWORKS)[number];\n\nexport const PROJECT_KINDS = ['frontend', 'node', 'unknown'] as const;\nexport type ProjectKind = (typeof PROJECT_KINDS)[number];\n\nexport interface StackDetection {\n name: string;\n projectKind: ProjectKind;\n framework: StackFramework;\n bundler: Bundler | undefined;\n hasTypeScript: boolean;\n hasGit: boolean;\n}\n\nexport async function detectStack(root: string): Promise<StackDetection | null> {\n const pkgPath = path.join(root, 'package.json');\n if (!(await fs.pathExists(pkgPath))) return null;\n\n const pkg = await readJsonSafe<Record<string, unknown>>(pkgPath);\n if (!pkg) return null;\n\n const allDeps: Record<string, string> = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const framework = inferFramework(allDeps);\n const bundler = inferBundler(allDeps);\n const hasTypeScript =\n 'typescript' in allDeps ||\n (await fs.pathExists(path.join(root, 'tsconfig.json')));\n const hasGit = await fs.pathExists(path.join(root, '.git'));\n\n return {\n name: (pkg.name as string) ?? path.basename(root),\n projectKind: inferProjectKind(pkg, allDeps, framework),\n framework,\n bundler,\n hasTypeScript,\n hasGit,\n };\n}\n\nfunction inferFramework(deps: Record<string, string>): StackFramework {\n if ('nuxt' in deps) return 'nuxt';\n if ('next' in deps) return 'next';\n if ('vue' in deps) return 'vue';\n if ('react' in deps) return 'react';\n return 'unknown';\n}\n\nfunction inferBundler(deps: Record<string, string>): Bundler | undefined {\n if ('vite' in deps) return 'vite';\n if ('webpack' in deps) return 'webpack';\n if ('@rspack/cli' in deps || '@rspack/core' in deps) return 'rspack';\n return undefined;\n}\n\nfunction inferProjectKind(\n pkg: Record<string, unknown>,\n deps: Record<string, string>,\n framework: StackFramework,\n): ProjectKind {\n if (framework !== 'unknown') return 'frontend';\n\n const hasNodeSignals =\n pkg.bin !== undefined ||\n pkg.main !== undefined ||\n pkg.exports !== undefined ||\n 'express' in deps ||\n 'fastify' in deps ||\n 'koa' in deps ||\n '@types/node' in deps;\n\n if (hasNodeSignals) return 'node';\n\n return 'unknown';\n}\n\nexport function summarizeStack(stack: StackDetection): string {\n const parts: string[] = [];\n\n if (stack.framework !== 'unknown') {\n parts.push(stack.framework.charAt(0).toUpperCase() + stack.framework.slice(1));\n } else if (stack.projectKind === 'node') {\n parts.push('Node');\n } else {\n parts.push('JavaScript/TypeScript');\n }\n\n if (stack.bundler) {\n parts.push(stack.bundler.charAt(0).toUpperCase() + stack.bundler.slice(1));\n }\n\n if (stack.hasTypeScript) parts.push('TypeScript');\n\n return parts.join(' + ');\n}\n","import prompts from 'prompts';\nimport type { EnhanceAnswers } from '../types/selections.js';\nimport type { StackDetection } from '../core/detect-stack.js';\nimport { summarizeStack } from '../core/detect-stack.js';\nimport type { QualityTool } from '../constants/lint.js';\nimport { DEV_TOOLS } from '../constants/tools.js';\nimport { getSkillCatalog } from '../skills/catalog.js';\nimport { getMcpCatalog } from '../mcp/catalog.js';\n\n\ninterface QualityToolOption {\n id: QualityTool;\n label: string;\n description: string;\n selected: boolean;\n}\n\nfunction getApplicableTools(stack: StackDetection): QualityToolOption[] {\n const tools: QualityToolOption[] = [];\n\n tools.push({\n id: 'eslint',\n label: 'ESLint',\n description: 'Linting for JavaScript / TypeScript',\n selected: true,\n });\n\n tools.push({\n id: 'prettier',\n label: 'Prettier',\n description: 'Code formatting',\n selected: true,\n });\n\n tools.push({\n id: 'editorconfig',\n label: 'EditorConfig',\n description: 'Cross-editor indentation & whitespace settings',\n selected: true,\n });\n\n if (stack.projectKind === 'frontend') {\n tools.push({\n id: 'stylelint',\n label: 'Stylelint',\n description: 'CSS / SCSS linting',\n selected: false,\n });\n }\n\n tools.push({\n id: 'commitlint',\n label: 'commitlint',\n description: 'Enforce conventional commit messages',\n selected: false,\n });\n\n return tools;\n}\n\nexport async function runEnhancePrompts(\n stack: StackDetection,\n): Promise<EnhanceAnswers | null> {\n const stackLabel = summarizeStack(stack);\n const applicableTools = getApplicableTools(stack);\n\n const response = await prompts(\n [\n {\n type: 'multiselect',\n name: 'devTools',\n message: `Dev tools to configure for this ${stackLabel} project:`,\n choices: DEV_TOOLS.map((t) => ({ title: t, value: t, selected: t === 'cursor' })),\n min: 1,\n hint: 'Select at least one',\n },\n {\n type: 'multiselect',\n name: 'qualityTools',\n message: 'Code quality tools to install & configure:',\n choices: applicableTools.map((t) => ({\n title: `${t.label} — ${t.description}`,\n value: t.id,\n selected: t.selected,\n })),\n hint: 'Space to toggle, Enter to confirm',\n },\n {\n type: 'multiselect',\n name: 'skills',\n message: 'Skills to add:',\n choices: getSkillCatalog().map((s) => ({\n title: s.label,\n description: s.description,\n value: s.id,\n selected: false,\n })),\n },\n {\n type: 'multiselect',\n name: 'mcpServers',\n message: 'MCP servers to add:',\n choices: getMcpCatalog().map((m) => ({\n title: m.label,\n description: m.description,\n value: m.id,\n selected: false,\n })),\n },\n ],\n { onCancel: () => process.exit(0) },\n );\n\n if (!response.devTools) return null;\n\n return {\n devTools: response.devTools,\n qualityTools: response.qualityTools ?? [],\n skills: response.skills ?? [],\n mcpServers: response.mcpServers ?? [],\n };\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { StackDetection, StackFramework } from '../core/detect-stack.js';\nimport type { QualityTool } from '../constants/lint.js';\nimport { logger } from '../utils/logger.js';\n\ntype Generator = (root: string, stack: StackDetection) => Promise<void>;\n\nconst GENERATORS: Record<QualityTool, Generator> = {\n eslint: generateEslint,\n stylelint: generateStylelint,\n prettier: generatePrettier,\n editorconfig: generateEditorConfig,\n commitlint: generateCommitlint,\n};\n\nexport async function generateQualityTooling(\n root: string,\n stack: StackDetection,\n tools: QualityTool[],\n): Promise<void> {\n for (const tool of tools) {\n await GENERATORS[tool](root, stack);\n }\n}\n\n// ---------------------------------------------------------------------------\n// ESLint — stack-aware config & optional bundler plugin\n// ---------------------------------------------------------------------------\n\nasync function generateEslint(root: string, stack: StackDetection): Promise<void> {\n const pkg = await readPkg(root);\n const devDeps: Record<string, string> = {\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n devDeps.eslint = '^9.25.0';\n devDeps['@eslint/js'] = '^9.25.0';\n devDeps.globals = '^16.0.0';\n\n if (stack.hasTypeScript) {\n devDeps['typescript-eslint'] = '^8.30.0';\n }\n\n addFrameworkEslintDeps(devDeps, stack.framework);\n addBundlerEslintPlugin(devDeps, stack);\n\n pkg.devDependencies = devDeps;\n await writePkg(root, pkg);\n\n const configContent = buildEslintConfig(stack);\n await fs.writeFile(path.join(root, 'eslint.config.mjs'), configContent, 'utf-8');\n logger.success('ESLint 9 flat config generated');\n}\n\nfunction addFrameworkEslintDeps(devDeps: Record<string, string>, fw: StackFramework): void {\n if (fw === 'vue' || fw === 'nuxt') {\n devDeps['eslint-plugin-vue'] = '^10.0.0';\n } else if (fw === 'react' || fw === 'next') {\n devDeps['eslint-plugin-react-hooks'] = '^5.2.0';\n devDeps['eslint-plugin-react-refresh'] = '^0.4.0';\n }\n}\n\nfunction addBundlerEslintPlugin(devDeps: Record<string, string>, stack: StackDetection): void {\n if (stack.projectKind !== 'frontend') return;\n\n if (stack.bundler === 'vite') {\n devDeps['vite-plugin-eslint2'] = '^5.0.0';\n } else if (stack.bundler === 'webpack' || stack.bundler === 'rspack') {\n devDeps['eslint-webpack-plugin'] = '^4.2.0';\n }\n}\n\nfunction buildEslintConfig(stack: StackDetection): string {\n const fw = stack.framework;\n\n if (fw === 'vue' || fw === 'nuxt') return buildVueEslintConfig(stack);\n if (fw === 'react' || fw === 'next') return buildReactEslintConfig(stack);\n return buildGenericEslintConfig(stack);\n}\n\nfunction buildVueEslintConfig(stack: StackDetection): string {\n const lines = [\n \"import js from '@eslint/js';\",\n ...(stack.hasTypeScript ? [\"import tseslint from 'typescript-eslint';\"] : []),\n \"import pluginVue from 'eslint-plugin-vue';\",\n '',\n ...(stack.hasTypeScript\n ? [\n 'export default tseslint.config(',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n ]\n : ['export default [', ' js.configs.recommended,']),\n \" ...pluginVue.configs['flat/recommended'],\",\n ...(stack.hasTypeScript\n ? [\n ' {',\n \" files: ['**/*.vue'],\",\n ' languageOptions: {',\n ' parserOptions: { parser: tseslint.parser },',\n ' },',\n ' },',\n ');',\n ]\n : ['];']),\n ];\n return lines.join('\\n');\n}\n\nfunction buildReactEslintConfig(stack: StackDetection): string {\n const lines = [\n \"import js from '@eslint/js';\",\n ...(stack.hasTypeScript ? [\"import tseslint from 'typescript-eslint';\"] : []),\n \"import reactHooks from 'eslint-plugin-react-hooks';\",\n \"import reactRefresh from 'eslint-plugin-react-refresh';\",\n \"import globals from 'globals';\",\n '',\n ...(stack.hasTypeScript\n ? [\n 'export default tseslint.config(',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n ]\n : ['export default [', ' js.configs.recommended,']),\n ' {',\n \" files: ['**/*.{ts,tsx,js,jsx}'],\",\n ' plugins: {',\n \" 'react-hooks': reactHooks,\",\n \" 'react-refresh': reactRefresh,\",\n ' },',\n ' languageOptions: {',\n ' globals: globals.browser,',\n ' },',\n ' rules: {',\n ' ...reactHooks.configs.recommended.rules,',\n \" 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],\",\n ' },',\n ' },',\n ...(stack.hasTypeScript ? [');'] : ['];']),\n ];\n return lines.join('\\n');\n}\n\nfunction buildGenericEslintConfig(stack: StackDetection): string {\n const lines = [\n \"import js from '@eslint/js';\",\n ...(stack.hasTypeScript ? [\"import tseslint from 'typescript-eslint';\"] : []),\n \"import globals from 'globals';\",\n '',\n ...(stack.hasTypeScript\n ? [\n 'export default tseslint.config(',\n ' js.configs.recommended,',\n ' ...tseslint.configs.recommended,',\n ]\n : ['export default [', ' js.configs.recommended,']),\n ' {',\n \" files: ['**/*.{ts,js}'],\",\n ' languageOptions: {',\n ' globals: {',\n ' ...globals.node,',\n ' },',\n ' },',\n ' },',\n ...(stack.hasTypeScript ? [');'] : ['];']),\n ];\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Stylelint\n// ---------------------------------------------------------------------------\n\nasync function generateStylelint(root: string, stack: StackDetection): Promise<void> {\n const pkg = await readPkg(root);\n const devDeps: Record<string, string> = {\n ...(pkg.devDependencies as Record<string, string> | undefined),\n stylelint: '^16.17.0',\n 'stylelint-config-standard': '^37.0.0',\n };\n\n const fw = stack.framework;\n if (fw === 'vue' || fw === 'nuxt') {\n devDeps['stylelint-config-standard-vue'] = '^1.0.0';\n }\n\n pkg.devDependencies = devDeps;\n await writePkg(root, pkg);\n\n const extendsArr = ['stylelint-config-standard'];\n if (fw === 'vue' || fw === 'nuxt') {\n extendsArr.push('stylelint-config-standard-vue');\n }\n\n await fs.writeJson(\n path.join(root, '.stylelintrc.json'),\n { extends: extendsArr },\n { spaces: 2 },\n );\n logger.success('Stylelint config generated');\n}\n\n// ---------------------------------------------------------------------------\n// Prettier\n// ---------------------------------------------------------------------------\n\nasync function generatePrettier(root: string): Promise<void> {\n const pkg = await readPkg(root);\n pkg.devDependencies = {\n ...(pkg.devDependencies as Record<string, string> | undefined),\n prettier: '^3.5.0',\n };\n await writePkg(root, pkg);\n\n const config = {\n semi: true,\n singleQuote: true,\n tabWidth: 2,\n trailingComma: 'all' as const,\n printWidth: 100,\n };\n await fs.writeJson(path.join(root, '.prettierrc.json'), config, { spaces: 2 });\n logger.success('Prettier config generated');\n}\n\n// ---------------------------------------------------------------------------\n// EditorConfig\n// ---------------------------------------------------------------------------\n\nasync function generateEditorConfig(root: string): Promise<void> {\n const content = [\n 'root = true',\n '',\n '[*]',\n 'indent_style = space',\n 'indent_size = 2',\n 'end_of_line = lf',\n 'charset = utf-8',\n 'trim_trailing_whitespace = true',\n 'insert_final_newline = true',\n ].join('\\n');\n\n await fs.writeFile(path.join(root, '.editorconfig'), content, 'utf-8');\n logger.success('EditorConfig generated');\n}\n\n// ---------------------------------------------------------------------------\n// commitlint\n// ---------------------------------------------------------------------------\n\nasync function generateCommitlint(root: string, stack: StackDetection): Promise<void> {\n const pkg = await readPkg(root);\n const devDeps: Record<string, string> = {\n ...(pkg.devDependencies as Record<string, string> | undefined),\n '@commitlint/cli': '^19.8.0',\n '@commitlint/config-conventional': '^19.8.0',\n };\n\n devDeps.husky = '^9.1.0';\n\n pkg.devDependencies = devDeps;\n\n const scripts = (pkg.scripts ?? {}) as Record<string, string>;\n scripts.prepare ??= 'husky';\n pkg.scripts = scripts;\n\n await writePkg(root, pkg);\n\n const isESM = pkg.type === 'module';\n const configName = isESM ? 'commitlint.config.cjs' : 'commitlint.config.js';\n const configContent = [\n \"module.exports = { extends: ['@commitlint/config-conventional'] };\",\n '',\n ].join('\\n');\n\n await fs.writeFile(path.join(root, configName), configContent, 'utf-8');\n\n await fs.ensureDir(path.join(root, '.husky'));\n const hookContent = 'npx --no -- commitlint --edit \"$1\"\\n';\n await fs.writeFile(path.join(root, '.husky', 'commit-msg'), hookContent, 'utf-8');\n\n if (!stack.hasGit) {\n logger.warn('No .git directory detected — commitlint hooks will activate after git init.');\n }\n\n logger.success('commitlint + husky generated');\n}\n\n// ---------------------------------------------------------------------------\n// Helpers — reduce repeated readJson / writeJson boilerplate\n// ---------------------------------------------------------------------------\n\nasync function readPkg(root: string): Promise<Record<string, unknown>> {\n return fs.readJson(path.join(root, 'package.json'));\n}\n\nasync function writePkg(root: string, data: Record<string, unknown>): Promise<void> {\n await fs.writeJson(path.join(root, 'package.json'), data, { spaces: 2 });\n}\n"],"mappings":"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","names":["path","path","path","fileURLToPath","fs","path","fileURLToPath","fs","path","fs","path","fs","path","fs","fs","path","path","fileURLToPath","fs","__dirname","path","fileURLToPath","fs","path","fs","path","fs","path","fs","path","fs","path","fileURLToPath","fs","__dirname","path","fileURLToPath","rulesSourceDir","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","path","path","fs","path","fs","path","fs","path","fs","adapters","path","fs","path","fs","path","fs","path","fs","path","fs","prompts","prompts","path","fs","GENERATORS","generateEslint","generateStylelint","generatePrettier","generateEditorConfig","fs","path","fs","path"]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: using-superpowers
|
|
3
|
+
description: Use when starting any conversation - establishes how to find and use skills, requiring Skill tool invocation before ANY response including clarifying questions
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<SUBAGENT-STOP>
|
|
7
|
+
If you were dispatched as a subagent to execute a specific task, skip this skill.
|
|
8
|
+
</SUBAGENT-STOP>
|
|
9
|
+
|
|
10
|
+
<EXTREMELY-IMPORTANT>
|
|
11
|
+
If you think there is even a 1% chance a skill might apply to what you are doing, you ABSOLUTELY MUST invoke the skill.
|
|
12
|
+
|
|
13
|
+
IF A SKILL APPLIES TO YOUR TASK, YOU DO NOT HAVE A CHOICE. YOU MUST USE IT.
|
|
14
|
+
|
|
15
|
+
This is not negotiable. This is not optional. You cannot rationalize your way out of this.
|
|
16
|
+
</EXTREMELY-IMPORTANT>
|
|
17
|
+
|
|
18
|
+
## Instruction Priority
|
|
19
|
+
|
|
20
|
+
Superpowers skills override default system prompt behavior, but **user instructions always take precedence**:
|
|
21
|
+
|
|
22
|
+
1. **User's explicit instructions** (CLAUDE.md, GEMINI.md, AGENTS.md, direct requests) — highest priority
|
|
23
|
+
2. **Superpowers skills** — override default system behavior where they conflict
|
|
24
|
+
3. **Default system prompt** — lowest priority
|
|
25
|
+
|
|
26
|
+
If CLAUDE.md, GEMINI.md, or AGENTS.md says "don't use TDD" and a skill says "always use TDD," follow the user's instructions. The user is in control.
|
|
27
|
+
|
|
28
|
+
## How to Access Skills
|
|
29
|
+
|
|
30
|
+
**In Claude Code:** Use the `Skill` tool. When you invoke a skill, its content is loaded and presented to you—follow it directly. Never use the Read tool on skill files.
|
|
31
|
+
|
|
32
|
+
**In Copilot CLI:** Use the `skill` tool. Skills are auto-discovered from installed plugins. The `skill` tool works the same as Claude Code's `Skill` tool.
|
|
33
|
+
|
|
34
|
+
**In Gemini CLI:** Skills activate via the `activate_skill` tool. Gemini loads skill metadata at session start and activates the full content on demand.
|
|
35
|
+
|
|
36
|
+
**In other environments:** Check your platform's documentation for how skills are loaded.
|
|
37
|
+
|
|
38
|
+
## Platform Adaptation
|
|
39
|
+
|
|
40
|
+
Skills use Claude Code tool names. Non-CC platforms: see `references/copilot-tools.md` (Copilot CLI), `references/codex-tools.md` (Codex) for tool equivalents. Gemini CLI users get the tool mapping loaded automatically via GEMINI.md.
|
|
41
|
+
|
|
42
|
+
# Using Skills
|
|
43
|
+
|
|
44
|
+
## The Rule
|
|
45
|
+
|
|
46
|
+
**Invoke relevant or requested skills BEFORE any response or action.** Even a 1% chance a skill might apply means that you should invoke the skill to check. If an invoked skill turns out to be wrong for the situation, you don't need to use it.
|
|
47
|
+
|
|
48
|
+
```dot
|
|
49
|
+
digraph skill_flow {
|
|
50
|
+
"User message received" [shape=doublecircle];
|
|
51
|
+
"About to EnterPlanMode?" [shape=doublecircle];
|
|
52
|
+
"Already brainstormed?" [shape=diamond];
|
|
53
|
+
"Invoke brainstorming skill" [shape=box];
|
|
54
|
+
"Might any skill apply?" [shape=diamond];
|
|
55
|
+
"Invoke Skill tool" [shape=box];
|
|
56
|
+
"Announce: 'Using [skill] to [purpose]'" [shape=box];
|
|
57
|
+
"Has checklist?" [shape=diamond];
|
|
58
|
+
"Create TodoWrite todo per item" [shape=box];
|
|
59
|
+
"Follow skill exactly" [shape=box];
|
|
60
|
+
"Respond (including clarifications)" [shape=doublecircle];
|
|
61
|
+
|
|
62
|
+
"About to EnterPlanMode?" -> "Already brainstormed?";
|
|
63
|
+
"Already brainstormed?" -> "Invoke brainstorming skill" [label="no"];
|
|
64
|
+
"Already brainstormed?" -> "Might any skill apply?" [label="yes"];
|
|
65
|
+
"Invoke brainstorming skill" -> "Might any skill apply?";
|
|
66
|
+
|
|
67
|
+
"User message received" -> "Might any skill apply?";
|
|
68
|
+
"Might any skill apply?" -> "Invoke Skill tool" [label="yes, even 1%"];
|
|
69
|
+
"Might any skill apply?" -> "Respond (including clarifications)" [label="definitely not"];
|
|
70
|
+
"Invoke Skill tool" -> "Announce: 'Using [skill] to [purpose]'";
|
|
71
|
+
"Announce: 'Using [skill] to [purpose]'" -> "Has checklist?";
|
|
72
|
+
"Has checklist?" -> "Create TodoWrite todo per item" [label="yes"];
|
|
73
|
+
"Has checklist?" -> "Follow skill exactly" [label="no"];
|
|
74
|
+
"Create TodoWrite todo per item" -> "Follow skill exactly";
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Red Flags
|
|
79
|
+
|
|
80
|
+
These thoughts mean STOP—you're rationalizing:
|
|
81
|
+
|
|
82
|
+
| Thought | Reality |
|
|
83
|
+
|---------|---------|
|
|
84
|
+
| "This is just a simple question" | Questions are tasks. Check for skills. |
|
|
85
|
+
| "I need more context first" | Skill check comes BEFORE clarifying questions. |
|
|
86
|
+
| "Let me explore the codebase first" | Skills tell you HOW to explore. Check first. |
|
|
87
|
+
| "I can check git/files quickly" | Files lack conversation context. Check for skills. |
|
|
88
|
+
| "Let me gather information first" | Skills tell you HOW to gather information. |
|
|
89
|
+
| "This doesn't need a formal skill" | If a skill exists, use it. |
|
|
90
|
+
| "I remember this skill" | Skills evolve. Read current version. |
|
|
91
|
+
| "This doesn't count as a task" | Action = task. Check for skills. |
|
|
92
|
+
| "The skill is overkill" | Simple things become complex. Use it. |
|
|
93
|
+
| "I'll just do this one thing first" | Check BEFORE doing anything. |
|
|
94
|
+
| "This feels productive" | Undisciplined action wastes time. Skills prevent this. |
|
|
95
|
+
| "I know what that means" | Knowing the concept ≠ using the skill. Invoke it. |
|
|
96
|
+
|
|
97
|
+
## Skill Priority
|
|
98
|
+
|
|
99
|
+
When multiple skills could apply, use this order:
|
|
100
|
+
|
|
101
|
+
1. **Process skills first** (brainstorming, debugging) - these determine HOW to approach the task
|
|
102
|
+
2. **Implementation skills second** (frontend-design, mcp-builder) - these guide execution
|
|
103
|
+
|
|
104
|
+
"Let's build X" → brainstorming first, then implementation skills.
|
|
105
|
+
"Fix this bug" → debugging first, then domain-specific skills.
|
|
106
|
+
|
|
107
|
+
## Skill Types
|
|
108
|
+
|
|
109
|
+
**Rigid** (TDD, debugging): Follow exactly. Don't adapt away discipline.
|
|
110
|
+
|
|
111
|
+
**Flexible** (patterns): Adapt principles to context.
|
|
112
|
+
|
|
113
|
+
The skill itself tells you which.
|
|
114
|
+
|
|
115
|
+
## User Instructions
|
|
116
|
+
|
|
117
|
+
Instructions say WHAT, not HOW. "Add X" or "Fix Y" doesn't mean skip workflows.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Codex Tool Mapping
|
|
2
|
+
|
|
3
|
+
Skills use Claude Code tool names. When you encounter these in a skill, use your platform equivalent:
|
|
4
|
+
|
|
5
|
+
| Skill references | Codex equivalent |
|
|
6
|
+
|-----------------|------------------|
|
|
7
|
+
| `Task` tool (dispatch subagent) | `spawn_agent` (see [Named agent dispatch](#named-agent-dispatch)) |
|
|
8
|
+
| Multiple `Task` calls (parallel) | Multiple `spawn_agent` calls |
|
|
9
|
+
| Task returns result | `wait` |
|
|
10
|
+
| Task completes automatically | `close_agent` to free slot |
|
|
11
|
+
| `TodoWrite` (task tracking) | `update_plan` |
|
|
12
|
+
| `Skill` tool (invoke a skill) | Skills load natively — just follow the instructions |
|
|
13
|
+
| `Read`, `Write`, `Edit` (files) | Use your native file tools |
|
|
14
|
+
| `Bash` (run commands) | Use your native shell tools |
|
|
15
|
+
|
|
16
|
+
## Subagent dispatch requires multi-agent support
|
|
17
|
+
|
|
18
|
+
Add to your Codex config (`~/.codex/config.toml`):
|
|
19
|
+
|
|
20
|
+
```toml
|
|
21
|
+
[features]
|
|
22
|
+
multi_agent = true
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
This enables `spawn_agent`, `wait`, and `close_agent` for skills like `dispatching-parallel-agents` and `subagent-driven-development`.
|
|
26
|
+
|
|
27
|
+
## Named agent dispatch
|
|
28
|
+
|
|
29
|
+
Claude Code skills reference named agent types like `superpowers:code-reviewer`.
|
|
30
|
+
Codex does not have a named agent registry — `spawn_agent` creates generic agents
|
|
31
|
+
from built-in roles (`default`, `explorer`, `worker`).
|
|
32
|
+
|
|
33
|
+
When a skill says to dispatch a named agent type:
|
|
34
|
+
|
|
35
|
+
1. Find the agent's prompt file (e.g., `agents/code-reviewer.md` or the skill's
|
|
36
|
+
local prompt template like `code-quality-reviewer-prompt.md`)
|
|
37
|
+
2. Read the prompt content
|
|
38
|
+
3. Fill any template placeholders (`{BASE_SHA}`, `{WHAT_WAS_IMPLEMENTED}`, etc.)
|
|
39
|
+
4. Spawn a `worker` agent with the filled content as the `message`
|
|
40
|
+
|
|
41
|
+
| Skill instruction | Codex equivalent |
|
|
42
|
+
|-------------------|------------------|
|
|
43
|
+
| `Task tool (superpowers:code-reviewer)` | `spawn_agent(agent_type="worker", message=...)` with `code-reviewer.md` content |
|
|
44
|
+
| `Task tool (general-purpose)` with inline prompt | `spawn_agent(message=...)` with the same prompt |
|
|
45
|
+
|
|
46
|
+
### Message framing
|
|
47
|
+
|
|
48
|
+
The `message` parameter is user-level input, not a system prompt. Structure it
|
|
49
|
+
for maximum instruction adherence:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
Your task is to perform the following. Follow the instructions below exactly.
|
|
53
|
+
|
|
54
|
+
<agent-instructions>
|
|
55
|
+
[filled prompt content from the agent's .md file]
|
|
56
|
+
</agent-instructions>
|
|
57
|
+
|
|
58
|
+
Execute this now. Output ONLY the structured response following the format
|
|
59
|
+
specified in the instructions above.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- Use task-delegation framing ("Your task is...") rather than persona framing ("You are...")
|
|
63
|
+
- Wrap instructions in XML tags — the model treats tagged blocks as authoritative
|
|
64
|
+
- End with an explicit execution directive to prevent summarization of the instructions
|
|
65
|
+
|
|
66
|
+
### When this workaround can be removed
|
|
67
|
+
|
|
68
|
+
This approach compensates for Codex's plugin system not yet supporting an `agents`
|
|
69
|
+
field in `plugin.json`. When `RawPluginManifest` gains an `agents` field, the
|
|
70
|
+
plugin can symlink to `agents/` (mirroring the existing `skills/` symlink) and
|
|
71
|
+
skills can dispatch named agent types directly.
|
|
72
|
+
|
|
73
|
+
## Environment Detection
|
|
74
|
+
|
|
75
|
+
Skills that create worktrees or finish branches should detect their
|
|
76
|
+
environment with read-only git commands before proceeding:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
|
|
80
|
+
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
|
|
81
|
+
BRANCH=$(git branch --show-current)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- `GIT_DIR != GIT_COMMON` → already in a linked worktree (skip creation)
|
|
85
|
+
- `BRANCH` empty → detached HEAD (cannot branch/push/PR from sandbox)
|
|
86
|
+
|
|
87
|
+
See `using-git-worktrees` Step 0 and `finishing-a-development-branch`
|
|
88
|
+
Step 1 for how each skill uses these signals.
|
|
89
|
+
|
|
90
|
+
## Codex App Finishing
|
|
91
|
+
|
|
92
|
+
When the sandbox blocks branch/push operations (detached HEAD in an
|
|
93
|
+
externally managed worktree), the agent commits all work and informs
|
|
94
|
+
the user to use the App's native controls:
|
|
95
|
+
|
|
96
|
+
- **"Create branch"** — names the branch, then commit/push/PR via App UI
|
|
97
|
+
- **"Hand off to local"** — transfers work to the user's local checkout
|
|
98
|
+
|
|
99
|
+
The agent can still run tests, stage files, and output suggested branch
|
|
100
|
+
names, commit messages, and PR descriptions for the user to copy.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Copilot CLI Tool Mapping
|
|
2
|
+
|
|
3
|
+
Skills use Claude Code tool names. When you encounter these in a skill, use your platform equivalent:
|
|
4
|
+
|
|
5
|
+
| Skill references | Copilot CLI equivalent |
|
|
6
|
+
|-----------------|----------------------|
|
|
7
|
+
| `Read` (file reading) | `view` |
|
|
8
|
+
| `Write` (file creation) | `create` |
|
|
9
|
+
| `Edit` (file editing) | `edit` |
|
|
10
|
+
| `Bash` (run commands) | `bash` |
|
|
11
|
+
| `Grep` (search file content) | `grep` |
|
|
12
|
+
| `Glob` (search files by name) | `glob` |
|
|
13
|
+
| `Skill` tool (invoke a skill) | `skill` |
|
|
14
|
+
| `WebFetch` | `web_fetch` |
|
|
15
|
+
| `Task` tool (dispatch subagent) | `task` (see [Agent types](#agent-types)) |
|
|
16
|
+
| Multiple `Task` calls (parallel) | Multiple `task` calls |
|
|
17
|
+
| Task status/output | `read_agent`, `list_agents` |
|
|
18
|
+
| `TodoWrite` (task tracking) | `sql` with built-in `todos` table |
|
|
19
|
+
| `WebSearch` | No equivalent — use `web_fetch` with a search engine URL |
|
|
20
|
+
| `EnterPlanMode` / `ExitPlanMode` | No equivalent — stay in the main session |
|
|
21
|
+
|
|
22
|
+
## Agent types
|
|
23
|
+
|
|
24
|
+
Copilot CLI's `task` tool accepts an `agent_type` parameter:
|
|
25
|
+
|
|
26
|
+
| Claude Code agent | Copilot CLI equivalent |
|
|
27
|
+
|-------------------|----------------------|
|
|
28
|
+
| `general-purpose` | `"general-purpose"` |
|
|
29
|
+
| `Explore` | `"explore"` |
|
|
30
|
+
| Named plugin agents (e.g. `superpowers:code-reviewer`) | Discovered automatically from installed plugins |
|
|
31
|
+
|
|
32
|
+
## Async shell sessions
|
|
33
|
+
|
|
34
|
+
Copilot CLI supports persistent async shell sessions, which have no direct Claude Code equivalent:
|
|
35
|
+
|
|
36
|
+
| Tool | Purpose |
|
|
37
|
+
|------|---------|
|
|
38
|
+
| `bash` with `async: true` | Start a long-running command in the background |
|
|
39
|
+
| `write_bash` | Send input to a running async session |
|
|
40
|
+
| `read_bash` | Read output from an async session |
|
|
41
|
+
| `stop_bash` | Terminate an async session |
|
|
42
|
+
| `list_bash` | List all active shell sessions |
|
|
43
|
+
|
|
44
|
+
## Additional Copilot CLI tools
|
|
45
|
+
|
|
46
|
+
| Tool | Purpose |
|
|
47
|
+
|------|---------|
|
|
48
|
+
| `store_memory` | Persist facts about the codebase for future sessions |
|
|
49
|
+
| `report_intent` | Update the UI status line with current intent |
|
|
50
|
+
| `sql` | Query the session's SQLite database (todos, metadata) |
|
|
51
|
+
| `fetch_copilot_cli_documentation` | Look up Copilot CLI documentation |
|
|
52
|
+
| GitHub MCP tools (`github-mcp-server-*`) | Native GitHub API access (issues, PRs, code search) |
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Gemini CLI Tool Mapping
|
|
2
|
+
|
|
3
|
+
Skills use Claude Code tool names. When you encounter these in a skill, use your platform equivalent:
|
|
4
|
+
|
|
5
|
+
| Skill references | Gemini CLI equivalent |
|
|
6
|
+
|-----------------|----------------------|
|
|
7
|
+
| `Read` (file reading) | `read_file` |
|
|
8
|
+
| `Write` (file creation) | `write_file` |
|
|
9
|
+
| `Edit` (file editing) | `replace` |
|
|
10
|
+
| `Bash` (run commands) | `run_shell_command` |
|
|
11
|
+
| `Grep` (search file content) | `grep_search` |
|
|
12
|
+
| `Glob` (search files by name) | `glob` |
|
|
13
|
+
| `TodoWrite` (task tracking) | `write_todos` |
|
|
14
|
+
| `Skill` tool (invoke a skill) | `activate_skill` |
|
|
15
|
+
| `WebSearch` | `google_web_search` |
|
|
16
|
+
| `WebFetch` | `web_fetch` |
|
|
17
|
+
| `Task` tool (dispatch subagent) | No equivalent — Gemini CLI does not support subagents |
|
|
18
|
+
|
|
19
|
+
## No subagent support
|
|
20
|
+
|
|
21
|
+
Gemini CLI has no equivalent to Claude Code's `Task` tool. Skills that rely on subagent dispatch (`subagent-driven-development`, `dispatching-parallel-agents`) will fall back to single-session execution via `executing-plans`.
|
|
22
|
+
|
|
23
|
+
## Additional Gemini CLI tools
|
|
24
|
+
|
|
25
|
+
These tools are available in Gemini CLI but have no Claude Code equivalent:
|
|
26
|
+
|
|
27
|
+
| Tool | Purpose |
|
|
28
|
+
|------|---------|
|
|
29
|
+
| `list_directory` | List files and subdirectories |
|
|
30
|
+
| `save_memory` | Persist facts to GEMINI.md across sessions |
|
|
31
|
+
| `ask_user` | Request structured input from the user |
|
|
32
|
+
| `tracker_create_task` | Rich task management (create, update, list, visualize) |
|
|
33
|
+
| `enter_plan_mode` / `exit_plan_mode` | Switch to read-only research mode before making changes |
|