frontmcp 0.3.0 → 0.4.0
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/LICENSE +201 -0
- package/README.md +448 -0
- package/package.json +4 -4
- package/src/args.d.ts +8 -0
- package/src/args.js +19 -0
- package/src/args.js.map +1 -0
- package/src/cli.d.ts +0 -1
- package/src/cli.js +30 -574
- package/src/cli.js.map +1 -1
- package/src/colors.d.ts +12 -0
- package/src/colors.js +17 -0
- package/src/colors.js.map +1 -0
- package/src/commands/build.d.ts +2 -0
- package/src/commands/build.js +43 -0
- package/src/commands/build.js.map +1 -0
- package/src/commands/create.d.ts +1 -0
- package/src/commands/create.js +204 -0
- package/src/commands/create.js.map +1 -0
- package/src/commands/dev.d.ts +2 -0
- package/src/commands/dev.js +49 -0
- package/src/commands/dev.js.map +1 -0
- package/src/commands/doctor.d.ts +1 -0
- package/src/commands/doctor.js +87 -0
- package/src/commands/doctor.js.map +1 -0
- package/src/commands/inspector.d.ts +1 -0
- package/src/commands/inspector.js +10 -0
- package/src/commands/inspector.js.map +1 -0
- package/src/commands/template.d.ts +13 -0
- package/src/commands/template.js +179 -0
- package/src/commands/template.js.map +1 -0
- package/src/templates/3rd-party-integration/src/http-client.d.ts +20 -0
- package/src/templates/3rd-party-integration/src/http-client.js +101 -0
- package/src/templates/3rd-party-integration/src/http-client.js.map +1 -0
- package/src/templates/3rd-party-integration/src/mcp-http-types.d.ts +199 -0
- package/src/templates/3rd-party-integration/src/mcp-http-types.js +51 -0
- package/src/templates/3rd-party-integration/src/mcp-http-types.js.map +1 -0
- package/src/templates/3rd-party-integration/src/tools/example.list.d.ts +125 -0
- package/src/templates/3rd-party-integration/src/tools/example.list.js +85 -0
- package/src/templates/3rd-party-integration/src/tools/example.list.js.map +1 -0
- package/src/tsconfig.d.ts +34 -0
- package/src/tsconfig.js +103 -0
- package/src/tsconfig.js.map +1 -0
- package/src/utils/fs.d.ts +11 -0
- package/src/utils/fs.js +104 -0
- package/src/utils/fs.js.map +1 -0
package/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/**\n * frontmcp - FrontMCP command line interface\n * Save as bin/frontmcp.ts (compile to JS with shebang preserved) or run with tsx.\n */\n\nimport * as fs from 'fs';\nimport {promises as fsp} from 'fs';\nimport * as path from 'path';\nimport {spawn, ChildProcess} from 'child_process';\nimport {getSelfVersion} from './version';\n\n/* ----------------------------- Types & Helpers ---------------------------- */\n\ntype Command = 'dev' | 'build' | 'init' | 'doctor' | 'inspector' | 'create' | 'help';\n\ninterface ParsedArgs {\n _: string[];\n outDir?: string;\n entry?: string;\n help?: boolean;\n}\n\nconst COLORS = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n} as const;\n\nconst c = (color: keyof typeof COLORS, s: string) => COLORS[color] + s + COLORS.reset;\n\nfunction showHelp(): void {\n console.log(`\n${c('bold', 'frontmcp')} — FrontMCP command line interface\n\n${c('bold', 'Usage')}\n frontmcp <command> [options]\n\n${c('bold', 'Commands')}\n dev Start in development mode (tsx --watch <entry> + async type-check)\n build Compile entry with TypeScript (tsc)\n init Create or fix a tsconfig.json suitable for FrontMCP\n doctor Check Node/npm versions and tsconfig requirements\n inspector Launch MCP Inspector (npx @modelcontextprotocol/inspector)\n create <name> Scaffold a new FrontMCP project in ./<name>\n help Show this help message\n\n${c('bold', 'Options')}\n -o, --out-dir <dir> Output directory (default: ./dist)\n -e, --entry <path> Manually specify entry file path\n\n${c('bold', 'Examples')}\n frontmcp dev\n frontmcp build --out-dir build\n frontmcp init\n frontmcp doctor\n frontmcp inspector\n npx frontmcp create my-mcp\n`);\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const out: ParsedArgs = {_: []};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a === '--out-dir' || a === '-o') out.outDir = argv[++i];\n else if (a === '--entry' || a === '-e') out.entry = argv[++i];\n else if (a === '--help' || a === '-h') out.help = true;\n else out._.push(a);\n }\n return out;\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await fsp.access(p, fs.constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJSON<T = any>(jsonPath: string): Promise<T | null> {\n try {\n const buf = await fsp.readFile(jsonPath, 'utf8');\n return JSON.parse(buf) as T;\n } catch {\n return null;\n }\n}\n\nasync function writeJSON(p: string, obj: any) {\n await fsp.writeFile(p, JSON.stringify(obj, null, 2) + '\\n', 'utf8');\n}\n\nfunction tryCandidates(base: string): string[] {\n const exts = ['', '.ts', '.tsx', '.js', '.mjs', '.cjs'];\n return exts.map((ext) => base + ext);\n}\n\nasync function resolveEntry(cwd: string, explicit?: string): Promise<string> {\n if (explicit) {\n const full = path.resolve(cwd, explicit);\n if (await fileExists(full)) return full;\n throw new Error(`Entry override not found: ${explicit}`);\n }\n\n const pkgPath = path.join(cwd, 'package.json');\n if (await fileExists(pkgPath)) {\n const pkg = await readJSON<any>(pkgPath);\n if (pkg && typeof pkg.main === 'string' && pkg.main.trim()) {\n const mainCandidates = tryCandidates(path.resolve(cwd, pkg.main));\n for (const p of mainCandidates) {\n if (await fileExists(p)) return p;\n }\n const asDir = path.resolve(cwd, pkg.main);\n const idxCandidates = tryCandidates(path.join(asDir, 'index'));\n for (const p of idxCandidates) {\n if (await fileExists(p)) return p;\n }\n }\n }\n\n const fallback = path.join(cwd, 'src', 'main.ts');\n if (await fileExists(fallback)) return fallback;\n\n const msg = [\n c('red', 'No entry file found.'),\n '',\n 'I looked for:',\n ` • ${pkgPath} with a valid \"main\" field`,\n ` • ${path.relative(cwd, fallback)}`,\n '',\n 'Please create an entry file (e.g. src/main.ts) or set \"main\" in package.json,',\n 'or run with an explicit path:',\n ` frontmcp dev --entry src/main.ts`,\n ].join('\\n');\n throw new Error(msg);\n}\n\nfunction runCmd(cmd: string, args: string[], opts: {cwd?: string} = {}): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, {stdio: 'inherit', shell: true, ...opts});\n child.on('close', (code) => (code === 0 ? resolve() : reject(new Error(`${cmd} exited with code ${code}`))));\n child.on('error', reject);\n });\n}\n\nasync function ensureDir(p: string): Promise<void> {\n await fsp.mkdir(p, {recursive: true});\n}\n\nasync function isDirEmpty(dir: string): Promise<boolean> {\n try {\n const items = await fsp.readdir(dir);\n return items.length === 0;\n } catch (e: any) {\n if (e?.code === 'ENOENT') return true;\n throw e;\n }\n}\n\nfunction sanitizeForFolder(name: string): string {\n const seg = name.startsWith('@') && name.includes('/') ? name.split('/')[1] : name;\n return (\n seg\n .replace(/[^a-zA-Z0-9._-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase() || 'frontmcp-app'\n );\n}\n\nfunction sanitizeForNpm(name: string): string {\n if (name.startsWith('@') && name.includes('/')) {\n const [scope, pkg] = name.split('/');\n const s = scope.replace(/[^a-z0-9-]/gi, '').toLowerCase();\n const p = pkg.replace(/[^a-z0-9._-]/gi, '-').toLowerCase();\n return `@${s}/${p || 'frontmcp-app'}`;\n }\n return name.replace(/[^a-z0-9._-]/gi, '-').toLowerCase() || 'frontmcp-app';\n}\n\n/* --------------------------------- Actions -------------------------------- */\n\nfunction isTsLike(p: string): boolean {\n return /\\.tsx?$/i.test(p);\n}\n\nfunction killQuiet(proc?: ChildProcess) {\n try {\n if (proc) {\n proc.kill('SIGINT');\n }\n } catch {\n // Intentionally ignore shutdown errors.\n }\n}\n\nasync function runDev(opts: ParsedArgs): Promise<void> {\n const cwd = process.cwd();\n const entry = await resolveEntry(cwd, opts.entry);\n\n console.log(`${c('cyan', '[dev]')} using entry: ${path.relative(cwd, entry)}`);\n console.log(\n `${c('gray', '[dev]')} starting ${c('bold', 'tsx --watch')} and ${c(\n 'bold',\n 'tsc --noEmit --watch',\n )} (async type-checker)`,\n );\n console.log(`${c('gray', 'hint:')} press Ctrl+C to stop`);\n\n // Start tsx watcher (app run)\n const app = spawn('npx', ['-y', 'tsx', '--watch', entry], {stdio: 'inherit', shell: true});\n // Start tsc in watch mode for async type-checking (non-blocking)\n const checker = spawn('npx', ['-y', 'tsc', '--noEmit', '--pretty', '--watch'], {\n stdio: 'inherit',\n shell: true,\n });\n\n const cleanup = () => {\n killQuiet(checker);\n killQuiet(app);\n };\n\n process.on('SIGINT', () => {\n cleanup();\n process.exit(0);\n });\n\n await new Promise<void>((resolve, reject) => {\n app.on('close', (_code) => {\n // When app exits, stop checker too.\n cleanup();\n resolve();\n });\n app.on('error', (err) => {\n cleanup();\n reject(err);\n });\n });\n}\n\nasync function runBuild(opts: ParsedArgs): Promise<void> {\n const cwd = process.cwd();\n const entry = await resolveEntry(cwd, opts.entry);\n const outDir = path.resolve(cwd, opts.outDir || 'dist');\n await ensureDir(outDir);\n\n console.log(`${c('cyan', '[build]')} entry: ${path.relative(cwd, entry)}`);\n console.log(`${c('cyan', '[build]')} outDir: ${path.relative(cwd, outDir)}`);\n\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n const hasTsconfig = await fileExists(tsconfigPath);\n const args: string[] = ['-y', 'tsc'];\n\n if (hasTsconfig) {\n console.log(c('gray', `[build] tsconfig.json detected — compiling with project settings`));\n args.push('--project', tsconfigPath);\n } else {\n args.push(entry);\n args.push('--rootDir', path.dirname(entry));\n if (!isTsLike(entry)) {\n args.push('--allowJs');\n console.log(c('yellow', '[build] Entry is not TypeScript; enabling --allowJs'));\n }\n args.push('--experimentalDecorators', '--emitDecoratorMetadata');\n args.push('--module', REQUIRED_DECORATOR_FIELDS.module);\n args.push('--target', REQUIRED_DECORATOR_FIELDS.target);\n }\n\n args.push('--outDir', outDir);\n args.push('--skipLibCheck');\n\n await runCmd('npx', args);\n\n console.log(c('green', '✅ Build completed.'));\n console.log(c('gray', `Output placed in ${path.relative(cwd, outDir)}`));\n}\n\n/* --------------------------- tsconfig management --------------------------- */\n\nconst REQUIRED_DECORATOR_FIELDS = {\n target: 'es2021',\n module: 'esnext',\n emitDecoratorMetadata: true,\n experimentalDecorators: true,\n strictFunctionTypes: true,\n moduleResolution: 'node',\n} as const;\n\nconst RECOMMENDED_TSCONFIG = {\n compilerOptions: {\n target: REQUIRED_DECORATOR_FIELDS.target,\n module: REQUIRED_DECORATOR_FIELDS.module,\n emitDecoratorMetadata: REQUIRED_DECORATOR_FIELDS.emitDecoratorMetadata,\n experimentalDecorators: REQUIRED_DECORATOR_FIELDS.experimentalDecorators,\n strictFunctionTypes: REQUIRED_DECORATOR_FIELDS.strictFunctionTypes,\n moduleResolution: REQUIRED_DECORATOR_FIELDS.moduleResolution,\n strict: true,\n esModuleInterop: true,\n resolveJsonModule: true,\n skipLibCheck: true,\n sourceMap: true,\n outDir: 'dist',\n rootDir: 'src',\n types: ['node'],\n },\n include: ['src/**/*'],\n} as const;\n\nfunction deepMerge<T extends Record<string, any>, U extends Record<string, any>>(\n base: T,\n patch: U,\n): T & U {\n const out: Record<string, any> = {...base};\n for (const [k, v] of Object.entries(patch)) {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n out[k] = deepMerge(base[k] ?? {}, v as Record<string, any>);\n } else {\n out[k] = v;\n }\n }\n return out as T & U;\n}\n\nfunction ensureRequiredTsOptions(obj: Record<string, any>): Record<string, any> {\n const next = {...obj};\n next.compilerOptions = {...(next.compilerOptions || {})};\n next.compilerOptions.target = REQUIRED_DECORATOR_FIELDS.target;\n next.compilerOptions.module = REQUIRED_DECORATOR_FIELDS.module;\n next.compilerOptions.emitDecoratorMetadata = REQUIRED_DECORATOR_FIELDS.emitDecoratorMetadata;\n next.compilerOptions.experimentalDecorators = REQUIRED_DECORATOR_FIELDS.experimentalDecorators;\n return next;\n}\n\nfunction normalizeStr(x: unknown): string | undefined {\n return typeof x === 'string' ? x.toLowerCase() : undefined;\n}\n\nfunction checkRequiredTsOptions(compilerOptions: Record<string, any> | undefined) {\n const issues: string[] = [];\n const ok: string[] = [];\n\n const target = normalizeStr(compilerOptions?.target);\n const moduleVal = normalizeStr(compilerOptions?.module);\n const edm = compilerOptions?.emitDecoratorMetadata;\n const ed = compilerOptions?.experimentalDecorators;\n\n if (target === REQUIRED_DECORATOR_FIELDS.target)\n ok.push(`compilerOptions.target = \"${REQUIRED_DECORATOR_FIELDS.target}\"`);\n else issues.push(`compilerOptions.target should be \"${REQUIRED_DECORATOR_FIELDS.target}\"`);\n\n if (moduleVal === REQUIRED_DECORATOR_FIELDS.module)\n ok.push(`compilerOptions.module = \"${REQUIRED_DECORATOR_FIELDS.module}\"`);\n else issues.push(`compilerOptions.module should be \"${REQUIRED_DECORATOR_FIELDS.module}\"`);\n\n if (edm === REQUIRED_DECORATOR_FIELDS.emitDecoratorMetadata)\n ok.push(`compilerOptions.emitDecoratorMetadata = true`);\n else issues.push(`compilerOptions.emitDecoratorMetadata should be true`);\n\n if (ed === REQUIRED_DECORATOR_FIELDS.experimentalDecorators)\n ok.push(`compilerOptions.experimentalDecorators = true`);\n else issues.push(`compilerOptions.experimentalDecorators should be true`);\n\n return {ok, issues};\n}\n\nasync function runInit(baseDir?: string): Promise<void> {\n const cwd = baseDir ?? process.cwd();\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n const existing = await readJSON<Record<string, any>>(tsconfigPath);\n\n if (!existing) {\n console.log(\n c(\n 'yellow',\n `tsconfig.json not found — creating one in ${path.relative(process.cwd(), cwd) || '.'}.`,\n ),\n );\n await writeJSON(tsconfigPath, RECOMMENDED_TSCONFIG);\n console.log(c('green', '✅ Created tsconfig.json with required decorator settings.'));\n return;\n }\n\n let merged = deepMerge(RECOMMENDED_TSCONFIG as any, existing);\n merged = ensureRequiredTsOptions(merged);\n\n await writeJSON(tsconfigPath, merged);\n console.log(\n c('green', '✅ tsconfig.json verified and updated (required decorator settings enforced).'),\n );\n}\n\nfunction cmpSemver(a: string, b: string): number {\n const pa = a.split('.').map((n) => parseInt(n, 10) || 0);\n const pb = b.split('.').map((n) => parseInt(n, 10) || 0);\n for (let i = 0; i < 3; i++) {\n if ((pa[i] || 0) > (pb[i] || 0)) return 1;\n if ((pa[i] || 0) < (pb[i] || 0)) return -1;\n }\n return 0;\n}\n\nasync function runDoctor(): Promise<void> {\n const MIN_NODE = '22.0.0';\n const MIN_NPM = '10.0.0';\n const cwd = process.cwd();\n\n let ok = true;\n\n const nodeVer = process.versions.node;\n if (cmpSemver(nodeVer, MIN_NODE) >= 0) {\n console.log(`✅ Node ${nodeVer} (min ${MIN_NODE})`);\n } else {\n ok = false;\n console.log(`❌ Node ${nodeVer} — please upgrade to >= ${MIN_NODE}`);\n }\n\n let npmVer = 'unknown';\n try {\n npmVer = await new Promise<string>((resolve, reject) => {\n const child = spawn('npm', ['-v'], {shell: true});\n let out = '';\n child.stdout?.on('data', (d) => (out += String(d)));\n child.on('close', () => resolve(out.trim()));\n child.on('error', reject);\n });\n if (cmpSemver(npmVer, MIN_NPM) >= 0) {\n console.log(`✅ npm ${npmVer} (min ${MIN_NPM})`);\n } else {\n ok = false;\n console.log(`❌ npm ${npmVer} — please upgrade to >= ${MIN_NPM}`);\n }\n } catch {\n ok = false;\n console.log('❌ npm not found in PATH');\n }\n\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n if (await fileExists(tsconfigPath)) {\n console.log(`✅ tsconfig.json found`);\n const tsconfig = await readJSON<Record<string, any>>(tsconfigPath);\n const {ok: oks, issues} = checkRequiredTsOptions(tsconfig?.compilerOptions);\n for (const line of oks) console.log(c('green', ` ✓ ${line}`));\n if (issues.length) {\n ok = false;\n for (const line of issues) console.log(c('yellow', ` • ${line}`));\n console.log(c('cyan', ` -> Run \"frontmcp init\" to apply the required settings.`));\n }\n } else {\n ok = false;\n console.log(`❌ tsconfig.json not found — run ${c('cyan', 'frontmcp init')}`);\n }\n\n try {\n const entry = await resolveEntry(cwd);\n console.log(`✅ entry detected: ${path.relative(cwd, entry)}`);\n } catch (e: any) {\n const firstLine = (e?.message as string | undefined)?.split('\\n')?.[0] ?? 'entry not found';\n console.log(`❌ entry not detected — ${firstLine}`);\n }\n\n if (ok) console.log(c('green', '\\nAll checks passed. You are ready to go!'));\n else console.log(c('yellow', '\\nSome checks failed. See above for fixes.'));\n}\n\n/* ------------------------------- Inspector -------------------------------- */\n\nasync function runInspector(): Promise<void> {\n console.log(`${c('cyan', '[inspector]')} launching MCP Inspector...`);\n await runCmd('npx', ['-y', '@modelcontextprotocol/inspector']);\n}\n\n/* --------------------------------- Create --------------------------------- */\n\nfunction pkgNameFromCwd(cwd: string) {\n return (\n path\n .basename(cwd)\n .replace(/[^a-zA-Z0-9._-]/g, '-')\n .toLowerCase() || 'frontmcp-app'\n );\n}\n\nasync function upsertPackageJson(\n cwd: string,\n nameOverride: string | undefined,\n selfVersion: string,\n) {\n const pkgPath = path.join(cwd, 'package.json');\n const existing = await readJSON<Record<string, any>>(pkgPath);\n\n // Use caret range for libs to track the CLI version\n const frontmcpLibRange = `^${selfVersion}`;\n\n const base = {\n name: nameOverride ?? pkgNameFromCwd(cwd),\n version: '0.1.0',\n private: true,\n type: 'commonjs',\n main: 'src/main.ts',\n scripts: {\n dev: 'frontmcp dev',\n build: 'frontmcp build',\n inspect: 'frontmcp inspector',\n doctor: 'frontmcp doctor',\n },\n engines: {\n node: '>=22',\n npm: '>=10',\n },\n dependencies: {\n '@frontmcp/sdk': frontmcpLibRange,\n '@frontmcp/plugins': frontmcpLibRange,\n '@frontmcp/adapters': frontmcpLibRange,\n zod: '^3.23.8',\n 'reflect-metadata': '^0.2.2',\n },\n devDependencies: {\n frontmcp: selfVersion, // exact CLI version used by npx\n tsx: '^4.20.6',\n '@types/node': '^22.0.0',\n typescript: '^5.5.3',\n },\n };\n\n if (!existing) {\n await writeJSON(pkgPath, base);\n console.log(\n c(\n 'green',\n '✅ Created package.json (synced @frontmcp libs to CLI version + exact frontmcp)',\n ),\n );\n return;\n }\n\n const merged: any = {...base, ...existing};\n\n // Preserve some user fields if present\n merged.name = existing.name || base.name;\n merged.main = existing.main || base.main;\n merged.type = existing.type || base.type;\n\n merged.scripts = {\n ...base.scripts,\n ...(existing.scripts || {}),\n dev: existing.scripts?.dev ?? base.scripts.dev,\n build: existing.scripts?.build ?? base.scripts.build,\n inspect: existing.scripts?.inspect ?? base.scripts.inspect,\n doctor: existing.scripts?.doctor ?? base.scripts.doctor,\n };\n\n merged.engines = {\n ...(existing.engines || {}),\n node: existing.engines?.node || base.engines.node,\n npm: existing.engines?.npm || base.engines.npm,\n };\n\n // Force @frontmcp libs to follow the CLI version range\n merged.dependencies = {\n ...(existing.dependencies || {}),\n ...base.dependencies,\n '@frontmcp/sdk': frontmcpLibRange,\n '@frontmcp/plugins': frontmcpLibRange,\n '@frontmcp/adapters': frontmcpLibRange,\n zod: '^3.23.8',\n 'reflect-metadata': '^0.2.2',\n };\n\n merged.devDependencies = {\n ...(existing.devDependencies || {}),\n ...base.devDependencies,\n frontmcp: selfVersion,\n tsx: '^4.20.6',\n typescript: '^5.5.3',\n };\n\n await writeJSON(pkgPath, merged);\n console.log(\n c(\n 'green',\n '✅ Updated package.json (synced @frontmcp libs + frontmcp to current CLI version)',\n ),\n );\n}\n\nasync function scaffoldFileIfMissing(baseDir: string, p: string, content: string) {\n if (await fileExists(p)) {\n console.log(c('gray', `skip: ${path.relative(baseDir, p)} already exists`));\n return;\n }\n await ensureDir(path.dirname(p));\n await fsp.writeFile(p, content.replace(/^\\n/, ''), 'utf8');\n console.log(c('green', `✓ created ${path.relative(baseDir, p)}`));\n}\n\nconst TEMPLATE_MAIN_TS = `\nimport 'reflect-metadata';\nimport { FrontMcp } from '@frontmcp/sdk';\nimport { CalcApp } from './calc.app';\n\n@FrontMcp({\n info: { name: 'Demo 🚀', version: '0.1.0' },\n apps: [CalcApp],\n})\nexport default class Server {}\n`;\n\nconst TEMPLATE_CALC_APP_TS = `\nimport { App } from '@frontmcp/sdk';\nimport AddTool from './tools/add.tool';\n\n@App({\n id: 'calc',\n name: 'Calculator',\n tools: [AddTool],\n})\nexport class CalcApp {}\n`;\n\nconst TEMPLATE_ADD_TOOL_TS = `\nimport {Tool, ToolContext} from \"@frontmcp/sdk\";\nimport {z} from \"zod\";\n\n@Tool({\n name: 'add',\n description: 'Add two numbers',\n inputSchema: {a: z.number(), b: z.number()},\n outputSchema: {result: z.number()}\n})\nexport default class AddTool extends ToolContext {\n async execute(input: { a: number, b: number }) {\n return {\n result: input.a + input.b,\n };\n }\n}\n`;\n\nasync function runCreate(projectArg?: string): Promise<void> {\n if (!projectArg) {\n console.error(c('red', 'Error: project name is required.\\n'));\n console.log(`Usage: ${c('bold', 'npx frontmcp create <project-name>')}`);\n process.exit(1);\n }\n\n const folder = sanitizeForFolder(projectArg);\n const pkgName = sanitizeForNpm(projectArg);\n const targetDir = path.resolve(process.cwd(), folder);\n\n if (await fileExists(targetDir)) {\n if (!(await isDirEmpty(targetDir))) {\n console.error(\n c(\n 'red',\n `Refusing to scaffold into non-empty directory: ${path.relative(\n process.cwd(),\n targetDir,\n )}`,\n ),\n );\n console.log(c('gray', 'Pick a different name or start with an empty folder.'));\n process.exit(1);\n }\n } else {\n await ensureDir(targetDir);\n }\n\n console.log(\n `${c('cyan', '[create]')} Creating project in ${c(\n 'bold',\n './' + path.relative(process.cwd(), targetDir),\n )}`,\n );\n process.chdir(targetDir);\n\n // 1) tsconfig\n await runInit(targetDir);\n\n // 2) package.json (pinned deps + exact CLI version)\n const selfVersion = getSelfVersion();\n await upsertPackageJson(targetDir, pkgName, selfVersion);\n\n // 3) files\n await scaffoldFileIfMissing(\n targetDir,\n path.join(targetDir, 'src', 'main.ts'),\n TEMPLATE_MAIN_TS,\n );\n await scaffoldFileIfMissing(\n targetDir,\n path.join(targetDir, 'src', 'calc.app.ts'),\n TEMPLATE_CALC_APP_TS,\n );\n await scaffoldFileIfMissing(\n targetDir,\n path.join(targetDir, 'src', 'tools', 'add.tool.ts'),\n TEMPLATE_ADD_TOOL_TS,\n );\n\n console.log('\\nNext steps:');\n console.log(` 1) cd ${folder}`);\n console.log(' 2) npm install');\n console.log(' 3) npm run dev ', c('gray', '# tsx watcher + async tsc type-check'));\n console.log(' 4) npm run inspect ', c('gray', '# launch MCP Inspector'));\n console.log(' 5) npm run build ', c('gray', '# compile with tsc via frontmcp build'));\n}\n\n/* --------------------------------- Main ----------------------------------- */\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const parsed = parseArgs(argv);\n const cmd = parsed._[0] as Command | undefined;\n\n if (parsed.help || !cmd) {\n showHelp();\n process.exit(0);\n }\n\n try {\n switch (cmd) {\n case 'dev':\n await runDev(parsed);\n break;\n case 'build':\n parsed.outDir = parsed.outDir || 'dist';\n await runBuild(parsed);\n break;\n case 'init':\n await runInit();\n break;\n case 'doctor':\n await runDoctor();\n break;\n case 'inspector':\n await runInspector();\n break;\n case 'create': {\n const projectName = parsed._[1];\n await runCreate(projectName);\n break;\n }\n case 'help':\n showHelp();\n break;\n default:\n console.error(c('red', `Unknown command: ${cmd}`));\n showHelp();\n process.exitCode = 1;\n }\n } catch (err: any) {\n console.error(\n '\\n' + c('red', err instanceof Error ? err.stack || err.message : String(err)),\n );\n process.exit(1);\n }\n}\n\nmain();\n"]}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";;AACA;;GAEG;;AAEH,qCAA6B;AAC7B,iCAAwD;AACxD,wCAAwC;AACxC,4CAA4C;AAC5C,yCAAqC;AACrC,8CAA8C;AAC9C,oDAAoD;AACpD,8CAA8C;AAC9C,kDAAkD;AAElD,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;EACZ,IAAA,UAAC,EAAC,MAAM,EAAE,UAAU,CAAC;;EAErB,IAAA,UAAC,EAAC,MAAM,EAAE,OAAO,CAAC;;;EAGlB,IAAA,UAAC,EAAC,MAAM,EAAE,UAAU,CAAC;;;;;;;;;;EAUrB,IAAA,UAAC,EAAC,MAAM,EAAE,SAAS,CAAC;;;;EAIpB,IAAA,UAAC,EAAC,MAAM,EAAE,UAAU,CAAC;;;;;;;;CAQtB,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAe,IAAA,gBAAS,EAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAwB,CAAC;IAE/C,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,KAAK;gBACR,MAAM,IAAA,YAAM,EAAC,MAAM,CAAC,CAAC;gBACrB,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;gBACxC,MAAM,IAAA,gBAAQ,EAAC,MAAM,CAAC,CAAC;gBACvB,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,IAAA,kBAAO,GAAE,CAAC;gBAChB,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,IAAA,kBAAS,GAAE,CAAC;gBAClB,MAAM;YACR,KAAK,WAAW;gBACd,MAAM,IAAA,wBAAY,GAAE,CAAC;gBACrB,MAAM;YACR,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,IAAA,kBAAS,EAAC,WAAW,CAAC,CAAC;gBAC7B,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;gBACzD,MAAM,IAAA,sBAAW,EAAC,IAAI,CAAC,CAAC;gBACxB,MAAM;YACR,CAAC;YACD,KAAK,MAAM;gBACT,QAAQ,EAAE,CAAC;gBACX,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,IAAA,UAAC,EAAC,KAAK,EAAE,oBAAoB,GAAG,EAAE,CAAC,CAAC,CAAC;gBACnD,QAAQ,EAAE,CAAC;gBACX,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,IAAA,UAAC,EAAC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\n/**\n * frontmcp - FrontMCP command line interface\n */\n\nimport { c } from './colors';\nimport { Command, ParsedArgs, parseArgs } from './args';\nimport { runDev } from './commands/dev';\nimport { runBuild } from './commands/build';\nimport { runInit } from './tsconfig';\nimport { runDoctor } from './commands/doctor';\nimport { runInspector } from './commands/inspector';\nimport { runCreate } from './commands/create';\nimport { runTemplate } from './commands/template';\n\nfunction showHelp(): void {\n console.log(`\n${c('bold', 'frontmcp')} — FrontMCP command line interface\n\n${c('bold', 'Usage')}\n frontmcp <command> [options]\n\n${c('bold', 'Commands')}\n dev Start in development mode (tsx --watch <entry> + async type-check)\n build Compile entry with TypeScript (tsc)\n init Create or fix a tsconfig.json suitable for FrontMCP\n doctor Check Node/npm versions and tsconfig requirements\n inspector Launch MCP Inspector (npx @modelcontextprotocol/inspector)\n create <name> Scaffold a new FrontMCP project in ./<name>\n template <type> Scaffold a template by type (e.g., \"3rd-party-integration\")\n help Show this help message\n\n${c('bold', 'Options')}\n -o, --out-dir <dir> Output directory (default: ./dist)\n -e, --entry <path> Manually specify entry file path\n\n${c('bold', 'Examples')}\n frontmcp dev\n frontmcp build --out-dir build\n frontmcp init\n frontmcp doctor\n frontmcp inspector\n npx frontmcp create my-mcp\n npx frontmcp template marketplace-3rd-tools\n`);\n}\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const parsed: ParsedArgs = parseArgs(argv);\n const cmd = parsed._[0] as Command | undefined;\n\n if (parsed.help || !cmd) {\n showHelp();\n process.exit(0);\n }\n\n try {\n switch (cmd) {\n case 'dev':\n await runDev(parsed);\n break;\n case 'build':\n parsed.outDir = parsed.outDir || 'dist';\n await runBuild(parsed);\n break;\n case 'init':\n await runInit();\n break;\n case 'doctor':\n await runDoctor();\n break;\n case 'inspector':\n await runInspector();\n break;\n case 'create': {\n const projectName = parsed._[1];\n await runCreate(projectName);\n break;\n }\n case 'template': {\n const type = parsed._[1]; // e.g. \"3rd-party-integration\"\n await runTemplate(type);\n break;\n }\n case 'help':\n showHelp();\n break;\n default:\n console.error(c('red', `Unknown command: ${cmd}`));\n showHelp();\n process.exitCode = 1;\n }\n } catch (err: any) {\n console.error('\\n' + c('red', err instanceof Error ? err.stack || err.message : String(err)));\n process.exit(1);\n }\n}\n\nmain();\n"]}
|
package/src/colors.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const COLORS: {
|
|
2
|
+
readonly reset: "\u001B[0m";
|
|
3
|
+
readonly bold: "\u001B[1m";
|
|
4
|
+
readonly dim: "\u001B[2m";
|
|
5
|
+
readonly red: "\u001B[31m";
|
|
6
|
+
readonly green: "\u001B[32m";
|
|
7
|
+
readonly yellow: "\u001B[33m";
|
|
8
|
+
readonly blue: "\u001B[34m";
|
|
9
|
+
readonly cyan: "\u001B[36m";
|
|
10
|
+
readonly gray: "\u001B[90m";
|
|
11
|
+
};
|
|
12
|
+
export declare const c: (color: keyof typeof COLORS, s: string) => string;
|
package/src/colors.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.c = exports.COLORS = void 0;
|
|
4
|
+
exports.COLORS = {
|
|
5
|
+
reset: '\x1b[0m',
|
|
6
|
+
bold: '\x1b[1m',
|
|
7
|
+
dim: '\x1b[2m',
|
|
8
|
+
red: '\x1b[31m',
|
|
9
|
+
green: '\x1b[32m',
|
|
10
|
+
yellow: '\x1b[33m',
|
|
11
|
+
blue: '\x1b[34m',
|
|
12
|
+
cyan: '\x1b[36m',
|
|
13
|
+
gray: '\x1b[90m',
|
|
14
|
+
};
|
|
15
|
+
const c = (color, s) => exports.COLORS[color] + s + exports.COLORS.reset;
|
|
16
|
+
exports.c = c;
|
|
17
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/colors.ts"],"names":[],"mappings":";;;AAAa,QAAA,MAAM,GAAG;IACpB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;CACR,CAAC;AAEJ,MAAM,CAAC,GAAG,CAAC,KAA0B,EAAE,CAAS,EAAE,EAAE,CAAC,cAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,cAAM,CAAC,KAAK,CAAC;AAAhF,QAAA,CAAC,KAA+E","sourcesContent":["export const COLORS = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n} as const;\n\nexport const c = (color: keyof typeof COLORS, s: string) => COLORS[color] + s + COLORS.reset;\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runBuild = runBuild;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const path = tslib_1.__importStar(require("path"));
|
|
6
|
+
const colors_1 = require("../colors");
|
|
7
|
+
const fs_1 = require("../utils/fs");
|
|
8
|
+
const tsconfig_1 = require("../tsconfig");
|
|
9
|
+
function isTsLike(p) {
|
|
10
|
+
return /\.tsx?$/i.test(p);
|
|
11
|
+
}
|
|
12
|
+
async function runBuild(opts) {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
const entry = await (0, fs_1.resolveEntry)(cwd, opts.entry);
|
|
15
|
+
const outDir = path.resolve(cwd, opts.outDir || 'dist');
|
|
16
|
+
await (0, fs_1.ensureDir)(outDir);
|
|
17
|
+
console.log(`${(0, colors_1.c)('cyan', '[build]')} entry: ${path.relative(cwd, entry)}`);
|
|
18
|
+
console.log(`${(0, colors_1.c)('cyan', '[build]')} outDir: ${path.relative(cwd, outDir)}`);
|
|
19
|
+
const tsconfigPath = path.join(cwd, 'tsconfig.json');
|
|
20
|
+
const hasTsconfig = await (0, fs_1.fileExists)(tsconfigPath);
|
|
21
|
+
const args = ['-y', 'tsc'];
|
|
22
|
+
if (hasTsconfig) {
|
|
23
|
+
console.log((0, colors_1.c)('gray', `[build] tsconfig.json detected — compiling with project settings`));
|
|
24
|
+
args.push('--project', tsconfigPath);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
args.push(entry);
|
|
28
|
+
args.push('--rootDir', path.dirname(entry));
|
|
29
|
+
if (!isTsLike(entry)) {
|
|
30
|
+
args.push('--allowJs');
|
|
31
|
+
console.log((0, colors_1.c)('yellow', '[build] Entry is not TypeScript; enabling --allowJs'));
|
|
32
|
+
}
|
|
33
|
+
args.push('--experimentalDecorators', '--emitDecoratorMetadata');
|
|
34
|
+
args.push('--module', tsconfig_1.REQUIRED_DECORATOR_FIELDS.module);
|
|
35
|
+
args.push('--target', tsconfig_1.REQUIRED_DECORATOR_FIELDS.target);
|
|
36
|
+
}
|
|
37
|
+
args.push('--outDir', outDir);
|
|
38
|
+
args.push('--skipLibCheck');
|
|
39
|
+
await (0, fs_1.runCmd)('npx', args);
|
|
40
|
+
console.log((0, colors_1.c)('green', '✅ Build completed.'));
|
|
41
|
+
console.log((0, colors_1.c)('gray', `Output placed in ${path.relative(cwd, outDir)}`));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/build.ts"],"names":[],"mappings":";;AAUA,4BAmCC;;AA7CD,mDAA6B;AAE7B,sCAA8B;AAC9B,oCAA0E;AAC1E,0CAAwD;AAExD,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAEM,KAAK,UAAU,QAAQ,CAAC,IAAgB;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,IAAA,iBAAY,EAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC;IACxD,MAAM,IAAA,cAAS,EAAC,MAAM,CAAC,CAAC;IAExB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,SAAS,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,SAAS,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAE7E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,MAAM,IAAA,eAAU,EAAC,YAAY,CAAC,CAAC;IACnD,MAAM,IAAI,GAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAErC,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,kEAAkE,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,QAAQ,EAAE,qDAAqD,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,yBAAyB,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oCAAyB,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oCAAyB,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAE5B,MAAM,IAAA,WAAM,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,IAAA,UAAC,EAAC,MAAM,EAAE,oBAAoB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC","sourcesContent":["import * as path from 'path';\nimport { ParsedArgs } from '../args';\nimport { c } from '../colors';\nimport { ensureDir, fileExists, runCmd, resolveEntry } from '../utils/fs';\nimport { REQUIRED_DECORATOR_FIELDS } from '../tsconfig';\n\nfunction isTsLike(p: string): boolean {\n return /\\.tsx?$/i.test(p);\n}\n\nexport async function runBuild(opts: ParsedArgs): Promise<void> {\n const cwd = process.cwd();\n const entry = await resolveEntry(cwd, opts.entry);\n const outDir = path.resolve(cwd, opts.outDir || 'dist');\n await ensureDir(outDir);\n\n console.log(`${c('cyan', '[build]')} entry: ${path.relative(cwd, entry)}`);\n console.log(`${c('cyan', '[build]')} outDir: ${path.relative(cwd, outDir)}`);\n\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n const hasTsconfig = await fileExists(tsconfigPath);\n const args: string[] = ['-y', 'tsc'];\n\n if (hasTsconfig) {\n console.log(c('gray', `[build] tsconfig.json detected — compiling with project settings`));\n args.push('--project', tsconfigPath);\n } else {\n args.push(entry);\n args.push('--rootDir', path.dirname(entry));\n if (!isTsLike(entry)) {\n args.push('--allowJs');\n console.log(c('yellow', '[build] Entry is not TypeScript; enabling --allowJs'));\n }\n args.push('--experimentalDecorators', '--emitDecoratorMetadata');\n args.push('--module', REQUIRED_DECORATOR_FIELDS.module);\n args.push('--target', REQUIRED_DECORATOR_FIELDS.target);\n }\n\n args.push('--outDir', outDir);\n args.push('--skipLibCheck');\n\n await runCmd('npx', args);\n\n console.log(c('green', '✅ Build completed.'));\n console.log(c('gray', `Output placed in ${path.relative(cwd, outDir)}`));\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runCreate(projectArg?: string): Promise<void>;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runCreate = runCreate;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const path = tslib_1.__importStar(require("path"));
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const colors_1 = require("../colors");
|
|
8
|
+
const fs_2 = require("../utils/fs");
|
|
9
|
+
const tsconfig_1 = require("../tsconfig");
|
|
10
|
+
const version_1 = require("../version");
|
|
11
|
+
const fs_3 = require("../utils/fs");
|
|
12
|
+
function sanitizeForFolder(name) {
|
|
13
|
+
const seg = name.startsWith('@') && name.includes('/') ? name.split('/')[1] : name;
|
|
14
|
+
return (seg
|
|
15
|
+
.replace(/[^a-zA-Z0-9._-]/g, '-')
|
|
16
|
+
.replace(/-+/g, '-')
|
|
17
|
+
.replace(/^-|-$/g, '')
|
|
18
|
+
.toLowerCase() || 'frontmcp-app');
|
|
19
|
+
}
|
|
20
|
+
function sanitizeForNpm(name) {
|
|
21
|
+
if (name.startsWith('@') && name.includes('/')) {
|
|
22
|
+
const [scope, pkg] = name.split('/');
|
|
23
|
+
const s = scope.replace(/[^a-z0-9-]/gi, '').toLowerCase();
|
|
24
|
+
const p = pkg.replace(/[^a-z0-9._-]/gi, '-').toLowerCase();
|
|
25
|
+
return `@${s}/${p || 'frontmcp-app'}`;
|
|
26
|
+
}
|
|
27
|
+
return name.replace(/[^a-z0-9._-]/gi, '-').toLowerCase() || 'frontmcp-app';
|
|
28
|
+
}
|
|
29
|
+
function pkgNameFromCwd(cwd) {
|
|
30
|
+
return (path
|
|
31
|
+
.basename(cwd)
|
|
32
|
+
.replace(/[^a-zA-Z0-9._-]/g, '-')
|
|
33
|
+
.toLowerCase() || 'frontmcp-app');
|
|
34
|
+
}
|
|
35
|
+
async function upsertPackageJson(cwd, nameOverride, selfVersion) {
|
|
36
|
+
const pkgPath = path.join(cwd, 'package.json');
|
|
37
|
+
const existing = await (0, fs_3.readJSON)(pkgPath);
|
|
38
|
+
const frontmcpLibRange = `^${selfVersion}`;
|
|
39
|
+
const base = {
|
|
40
|
+
name: nameOverride ?? pkgNameFromCwd(cwd),
|
|
41
|
+
version: '0.1.0',
|
|
42
|
+
private: true,
|
|
43
|
+
type: 'commonjs',
|
|
44
|
+
main: 'src/main.ts',
|
|
45
|
+
scripts: {
|
|
46
|
+
dev: 'frontmcp dev',
|
|
47
|
+
build: 'frontmcp build',
|
|
48
|
+
inspect: 'frontmcp inspector',
|
|
49
|
+
doctor: 'frontmcp doctor',
|
|
50
|
+
},
|
|
51
|
+
engines: {
|
|
52
|
+
node: '>=22',
|
|
53
|
+
npm: '>=10',
|
|
54
|
+
},
|
|
55
|
+
dependencies: {
|
|
56
|
+
'@frontmcp/sdk': frontmcpLibRange,
|
|
57
|
+
'@frontmcp/plugins': frontmcpLibRange,
|
|
58
|
+
'@frontmcp/adapters': frontmcpLibRange,
|
|
59
|
+
zod: '^3.25.76',
|
|
60
|
+
'reflect-metadata': '^0.2.2',
|
|
61
|
+
},
|
|
62
|
+
devDependencies: {
|
|
63
|
+
frontmcp: selfVersion,
|
|
64
|
+
tsx: '^4.20.6',
|
|
65
|
+
'@types/node': '^22.0.0',
|
|
66
|
+
typescript: '^5.5.3',
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
if (!existing) {
|
|
70
|
+
await (0, fs_2.writeJSON)(pkgPath, base);
|
|
71
|
+
console.log((0, colors_1.c)('green', '✅ Created package.json (synced @frontmcp libs to CLI version + exact frontmcp)'));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const merged = { ...base, ...existing };
|
|
75
|
+
merged.name = existing.name || base.name;
|
|
76
|
+
merged.main = existing.main || base.main;
|
|
77
|
+
merged.type = existing.type || base.type;
|
|
78
|
+
merged.scripts = {
|
|
79
|
+
...base.scripts,
|
|
80
|
+
...(existing.scripts || {}),
|
|
81
|
+
dev: existing.scripts?.dev ?? base.scripts.dev,
|
|
82
|
+
build: existing.scripts?.build ?? base.scripts.build,
|
|
83
|
+
inspect: existing.scripts?.inspect ?? base.scripts.inspect,
|
|
84
|
+
doctor: existing.scripts?.doctor ?? base.scripts.doctor,
|
|
85
|
+
};
|
|
86
|
+
merged.engines = {
|
|
87
|
+
...(existing.engines || {}),
|
|
88
|
+
node: existing.engines?.node || base.engines.node,
|
|
89
|
+
npm: existing.engines?.npm || base.engines.npm,
|
|
90
|
+
};
|
|
91
|
+
merged.dependencies = {
|
|
92
|
+
...(existing.dependencies || {}),
|
|
93
|
+
...base.dependencies,
|
|
94
|
+
'@frontmcp/sdk': frontmcpLibRange,
|
|
95
|
+
'@frontmcp/plugins': frontmcpLibRange,
|
|
96
|
+
'@frontmcp/adapters': frontmcpLibRange,
|
|
97
|
+
zod: '^3.25.76',
|
|
98
|
+
'reflect-metadata': '^0.2.2',
|
|
99
|
+
};
|
|
100
|
+
merged.devDependencies = {
|
|
101
|
+
...(existing.devDependencies || {}),
|
|
102
|
+
...base.devDependencies,
|
|
103
|
+
frontmcp: selfVersion,
|
|
104
|
+
tsx: '^4.20.6',
|
|
105
|
+
typescript: '^5.5.3',
|
|
106
|
+
};
|
|
107
|
+
await (0, fs_2.writeJSON)(pkgPath, merged);
|
|
108
|
+
console.log((0, colors_1.c)('green', '✅ Updated package.json (synced @frontmcp libs + frontmcp to current CLI version)'));
|
|
109
|
+
}
|
|
110
|
+
async function scaffoldFileIfMissing(baseDir, p, content) {
|
|
111
|
+
if (await (0, fs_2.fileExists)(p)) {
|
|
112
|
+
console.log((0, colors_1.c)('gray', `skip: ${path.relative(baseDir, p)} already exists`));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
await (0, fs_2.ensureDir)(path.dirname(p));
|
|
116
|
+
await fs_1.promises.writeFile(p, content.replace(/^\n/, ''), 'utf8');
|
|
117
|
+
console.log((0, colors_1.c)('green', `✓ created ${path.relative(baseDir, p)}`));
|
|
118
|
+
}
|
|
119
|
+
const TEMPLATE_MAIN_TS = `
|
|
120
|
+
import 'reflect-metadata';
|
|
121
|
+
import { FrontMcp } from '@frontmcp/sdk';
|
|
122
|
+
import { CalcApp } from './calc.app';
|
|
123
|
+
|
|
124
|
+
@FrontMcp({
|
|
125
|
+
info: { name: 'Demo 🚀', version: '0.1.0' },
|
|
126
|
+
apps: [CalcApp],
|
|
127
|
+
})
|
|
128
|
+
export default class Server {}
|
|
129
|
+
`;
|
|
130
|
+
const TEMPLATE_CALC_APP_TS = `
|
|
131
|
+
import { App } from '@frontmcp/sdk';
|
|
132
|
+
import AddTool from './tools/add.tool';
|
|
133
|
+
|
|
134
|
+
@App({
|
|
135
|
+
id: 'calc',
|
|
136
|
+
name: 'Calculator',
|
|
137
|
+
tools: [AddTool],
|
|
138
|
+
})
|
|
139
|
+
export class CalcApp {}
|
|
140
|
+
`;
|
|
141
|
+
const TEMPLATE_ADD_TOOL_TS = `
|
|
142
|
+
import {Tool, ToolContext} from "@frontmcp/sdk";
|
|
143
|
+
import {z} from "zod";
|
|
144
|
+
|
|
145
|
+
@Tool({
|
|
146
|
+
name: 'add',
|
|
147
|
+
description: 'Add two numbers',
|
|
148
|
+
inputSchema: {a: z.number(), b: z.number()},
|
|
149
|
+
outputSchema: {result: z.number()}
|
|
150
|
+
})
|
|
151
|
+
export default class AddTool extends ToolContext {
|
|
152
|
+
async execute(input: { a: number, b: number }) {
|
|
153
|
+
return {
|
|
154
|
+
result: input.a + input.b,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
`;
|
|
159
|
+
async function runCreate(projectArg) {
|
|
160
|
+
if (!projectArg) {
|
|
161
|
+
console.error((0, colors_1.c)('red', 'Error: project name is required.\n'));
|
|
162
|
+
console.log(`Usage: ${(0, colors_1.c)('bold', 'npx frontmcp create <project-name>')}`);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
const folder = sanitizeForFolder(projectArg);
|
|
166
|
+
const pkgName = sanitizeForNpm(projectArg);
|
|
167
|
+
const targetDir = path.resolve(process.cwd(), folder);
|
|
168
|
+
try {
|
|
169
|
+
const stat = await fs_1.promises.stat(targetDir);
|
|
170
|
+
if (!stat.isDirectory()) {
|
|
171
|
+
console.error((0, colors_1.c)('red', `Refusing to scaffold into non-directory path: ${path.relative(process.cwd(), targetDir)}`));
|
|
172
|
+
console.log((0, colors_1.c)('gray', 'Pick a different project name or remove/rename the existing file.'));
|
|
173
|
+
process.exit(1);
|
|
174
|
+
}
|
|
175
|
+
if (!(await (0, fs_2.isDirEmpty)(targetDir))) {
|
|
176
|
+
console.error((0, colors_1.c)('red', `Refusing to scaffold into non-empty directory: ${path.relative(process.cwd(), targetDir)}`));
|
|
177
|
+
console.log((0, colors_1.c)('gray', 'Pick a different name or start with an empty folder.'));
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
if (e?.code === 'ENOENT') {
|
|
183
|
+
await (0, fs_2.ensureDir)(targetDir);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
throw e;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
console.log(`${(0, colors_1.c)('cyan', '[create]')} Creating project in ${(0, colors_1.c)('bold', './' + path.relative(process.cwd(), targetDir))}`);
|
|
190
|
+
process.chdir(targetDir);
|
|
191
|
+
await (0, tsconfig_1.runInit)(targetDir);
|
|
192
|
+
const selfVersion = (0, version_1.getSelfVersion)();
|
|
193
|
+
await upsertPackageJson(targetDir, pkgName, selfVersion);
|
|
194
|
+
await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'main.ts'), TEMPLATE_MAIN_TS);
|
|
195
|
+
await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'calc.app.ts'), TEMPLATE_CALC_APP_TS);
|
|
196
|
+
await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'tools', 'add.tool.ts'), TEMPLATE_ADD_TOOL_TS);
|
|
197
|
+
console.log('\nNext steps:');
|
|
198
|
+
console.log(` 1) cd ${folder}`);
|
|
199
|
+
console.log(' 2) npm install');
|
|
200
|
+
console.log(' 3) npm run dev ', (0, colors_1.c)('gray', '# tsx watcher + async tsc type-check'));
|
|
201
|
+
console.log(' 4) npm run inspect ', (0, colors_1.c)('gray', '# launch MCP Inspector'));
|
|
202
|
+
console.log(' 5) npm run build ', (0, colors_1.c)('gray', '# compile with tsc via frontmcp build'));
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/create.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path';\nimport { promises as fsp } from 'fs';\nimport { c } from '../colors';\nimport { ensureDir, fileExists, isDirEmpty, writeJSON } from '../utils/fs';\nimport { runInit } from '../tsconfig';\nimport { getSelfVersion } from '../version';\nimport { readJSON } from '../utils/fs';\n\nfunction sanitizeForFolder(name: string): string {\n const seg = name.startsWith('@') && name.includes('/') ? name.split('/')[1] : name;\n return (\n seg\n .replace(/[^a-zA-Z0-9._-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase() || 'frontmcp-app'\n );\n}\n\nfunction sanitizeForNpm(name: string): string {\n if (name.startsWith('@') && name.includes('/')) {\n const [scope, pkg] = name.split('/');\n const s = scope.replace(/[^a-z0-9-]/gi, '').toLowerCase();\n const p = pkg.replace(/[^a-z0-9._-]/gi, '-').toLowerCase();\n return `@${s}/${p || 'frontmcp-app'}`;\n }\n return name.replace(/[^a-z0-9._-]/gi, '-').toLowerCase() || 'frontmcp-app';\n}\n\nfunction pkgNameFromCwd(cwd: string) {\n return (\n path\n .basename(cwd)\n .replace(/[^a-zA-Z0-9._-]/g, '-')\n .toLowerCase() || 'frontmcp-app'\n );\n}\n\nasync function upsertPackageJson(cwd: string, nameOverride: string | undefined, selfVersion: string) {\n const pkgPath = path.join(cwd, 'package.json');\n const existing = await readJSON<Record<string, any>>(pkgPath);\n\n const frontmcpLibRange = `^${selfVersion}`;\n\n const base = {\n name: nameOverride ?? pkgNameFromCwd(cwd),\n version: '0.1.0',\n private: true,\n type: 'commonjs',\n main: 'src/main.ts',\n scripts: {\n dev: 'frontmcp dev',\n build: 'frontmcp build',\n inspect: 'frontmcp inspector',\n doctor: 'frontmcp doctor',\n },\n engines: {\n node: '>=22',\n npm: '>=10',\n },\n dependencies: {\n '@frontmcp/sdk': frontmcpLibRange,\n '@frontmcp/plugins': frontmcpLibRange,\n '@frontmcp/adapters': frontmcpLibRange,\n zod: '^3.25.76',\n 'reflect-metadata': '^0.2.2',\n },\n devDependencies: {\n frontmcp: selfVersion,\n tsx: '^4.20.6',\n '@types/node': '^22.0.0',\n typescript: '^5.5.3',\n },\n };\n\n if (!existing) {\n await writeJSON(pkgPath, base);\n console.log(c('green', '✅ Created package.json (synced @frontmcp libs to CLI version + exact frontmcp)'));\n return;\n }\n\n const merged: any = { ...base, ...existing };\n\n merged.name = existing.name || base.name;\n merged.main = existing.main || base.main;\n merged.type = existing.type || base.type;\n\n merged.scripts = {\n ...base.scripts,\n ...(existing.scripts || {}),\n dev: existing.scripts?.dev ?? base.scripts.dev,\n build: existing.scripts?.build ?? base.scripts.build,\n inspect: existing.scripts?.inspect ?? base.scripts.inspect,\n doctor: existing.scripts?.doctor ?? base.scripts.doctor,\n };\n\n merged.engines = {\n ...(existing.engines || {}),\n node: existing.engines?.node || base.engines.node,\n npm: existing.engines?.npm || base.engines.npm,\n };\n\n merged.dependencies = {\n ...(existing.dependencies || {}),\n ...base.dependencies,\n '@frontmcp/sdk': frontmcpLibRange,\n '@frontmcp/plugins': frontmcpLibRange,\n '@frontmcp/adapters': frontmcpLibRange,\n zod: '^3.25.76',\n 'reflect-metadata': '^0.2.2',\n };\n\n merged.devDependencies = {\n ...(existing.devDependencies || {}),\n ...base.devDependencies,\n frontmcp: selfVersion,\n tsx: '^4.20.6',\n typescript: '^5.5.3',\n };\n\n await writeJSON(pkgPath, merged);\n console.log(c('green', '✅ Updated package.json (synced @frontmcp libs + frontmcp to current CLI version)'));\n}\n\nasync function scaffoldFileIfMissing(baseDir: string, p: string, content: string) {\n if (await fileExists(p)) {\n console.log(c('gray', `skip: ${path.relative(baseDir, p)} already exists`));\n return;\n }\n await ensureDir(path.dirname(p));\n await fsp.writeFile(p, content.replace(/^\\n/, ''), 'utf8');\n console.log(c('green', `✓ created ${path.relative(baseDir, p)}`));\n}\n\nconst TEMPLATE_MAIN_TS = `\nimport 'reflect-metadata';\nimport { FrontMcp } from '@frontmcp/sdk';\nimport { CalcApp } from './calc.app';\n\n@FrontMcp({\n info: { name: 'Demo 🚀', version: '0.1.0' },\n apps: [CalcApp],\n})\nexport default class Server {}\n`;\n\nconst TEMPLATE_CALC_APP_TS = `\nimport { App } from '@frontmcp/sdk';\nimport AddTool from './tools/add.tool';\n\n@App({\n id: 'calc',\n name: 'Calculator',\n tools: [AddTool],\n})\nexport class CalcApp {}\n`;\n\nconst TEMPLATE_ADD_TOOL_TS = `\nimport {Tool, ToolContext} from \"@frontmcp/sdk\";\nimport {z} from \"zod\";\n\n@Tool({\n name: 'add',\n description: 'Add two numbers',\n inputSchema: {a: z.number(), b: z.number()},\n outputSchema: {result: z.number()}\n})\nexport default class AddTool extends ToolContext {\n async execute(input: { a: number, b: number }) {\n return {\n result: input.a + input.b,\n };\n }\n}\n`;\n\nexport async function runCreate(projectArg?: string): Promise<void> {\n if (!projectArg) {\n console.error(c('red', 'Error: project name is required.\\n'));\n console.log(`Usage: ${c('bold', 'npx frontmcp create <project-name>')}`);\n process.exit(1);\n }\n\n const folder = sanitizeForFolder(projectArg);\n const pkgName = sanitizeForNpm(projectArg);\n const targetDir = path.resolve(process.cwd(), folder);\n\n try {\n const stat = await fsp.stat(targetDir);\n if (!stat.isDirectory()) {\n console.error(\n c('red', `Refusing to scaffold into non-directory path: ${path.relative(process.cwd(), targetDir)}`),\n );\n console.log(c('gray', 'Pick a different project name or remove/rename the existing file.'));\n process.exit(1);\n }\n if (!(await isDirEmpty(targetDir))) {\n console.error(\n c('red', `Refusing to scaffold into non-empty directory: ${path.relative(process.cwd(), targetDir)}`),\n );\n console.log(c('gray', 'Pick a different name or start with an empty folder.'));\n process.exit(1);\n }\n } catch (e: any) {\n if (e?.code === 'ENOENT') {\n await ensureDir(targetDir);\n } else {\n throw e;\n }\n }\n\n console.log(\n `${c('cyan', '[create]')} Creating project in ${c('bold', './' + path.relative(process.cwd(), targetDir))}`,\n );\n process.chdir(targetDir);\n\n await runInit(targetDir);\n\n const selfVersion = getSelfVersion();\n await upsertPackageJson(targetDir, pkgName, selfVersion);\n\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'main.ts'), TEMPLATE_MAIN_TS);\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'calc.app.ts'), TEMPLATE_CALC_APP_TS);\n await scaffoldFileIfMissing(targetDir, path.join(targetDir, 'src', 'tools', 'add.tool.ts'), TEMPLATE_ADD_TOOL_TS);\n\n console.log('\\nNext steps:');\n console.log(` 1) cd ${folder}`);\n console.log(' 2) npm install');\n console.log(' 3) npm run dev ', c('gray', '# tsx watcher + async tsc type-check'));\n console.log(' 4) npm run inspect ', c('gray', '# launch MCP Inspector'));\n console.log(' 5) npm run build ', c('gray', '# compile with tsc via frontmcp build'));\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runDev = runDev;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const path = tslib_1.__importStar(require("path"));
|
|
6
|
+
const child_process_1 = require("child_process");
|
|
7
|
+
const colors_1 = require("../colors");
|
|
8
|
+
const fs_1 = require("../utils/fs");
|
|
9
|
+
function killQuiet(proc) {
|
|
10
|
+
try {
|
|
11
|
+
if (proc) {
|
|
12
|
+
proc.kill('SIGINT');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// ignore
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async function runDev(opts) {
|
|
20
|
+
const cwd = process.cwd();
|
|
21
|
+
const entry = await (0, fs_1.resolveEntry)(cwd, opts.entry);
|
|
22
|
+
console.log(`${(0, colors_1.c)('cyan', '[dev]')} using entry: ${path.relative(cwd, entry)}`);
|
|
23
|
+
console.log(`${(0, colors_1.c)('gray', '[dev]')} starting ${(0, colors_1.c)('bold', 'tsx --watch')} and ${(0, colors_1.c)('bold', 'tsc --noEmit --watch')} (async type-checker)`);
|
|
24
|
+
console.log(`${(0, colors_1.c)('gray', 'hint:')} press Ctrl+C to stop`);
|
|
25
|
+
const app = (0, child_process_1.spawn)('npx', ['-y', 'tsx', '--watch', entry], { stdio: 'inherit', shell: true });
|
|
26
|
+
const checker = (0, child_process_1.spawn)('npx', ['-y', 'tsc', '--noEmit', '--pretty', '--watch'], {
|
|
27
|
+
stdio: 'inherit',
|
|
28
|
+
shell: true,
|
|
29
|
+
});
|
|
30
|
+
const cleanup = () => {
|
|
31
|
+
killQuiet(checker);
|
|
32
|
+
killQuiet(app);
|
|
33
|
+
};
|
|
34
|
+
process.on('SIGINT', () => {
|
|
35
|
+
cleanup();
|
|
36
|
+
process.exit(0);
|
|
37
|
+
});
|
|
38
|
+
await new Promise((resolve, reject) => {
|
|
39
|
+
app.on('close', () => {
|
|
40
|
+
cleanup();
|
|
41
|
+
resolve();
|
|
42
|
+
});
|
|
43
|
+
app.on('error', (err) => {
|
|
44
|
+
cleanup();
|
|
45
|
+
reject(err);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/commands/dev.ts"],"names":[],"mappings":";;AAgBA,wBAuCC;;AAvDD,mDAA6B;AAC7B,iDAAoD;AAEpD,sCAA8B;AAC9B,oCAA2C;AAE3C,SAAS,SAAS,CAAC,IAAmB;IACpC,IAAI,CAAC;QACH,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,MAAM,CAAC,IAAgB;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,IAAA,iBAAY,EAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CACT,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,OAAO,CAAC,aAAa,IAAA,UAAC,EAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,IAAA,UAAC,EACjE,MAAM,EACN,sBAAsB,CACvB,uBAAuB,CACzB,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,GAAG,IAAA,UAAC,EAAC,MAAM,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAE1D,MAAM,GAAG,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7F,MAAM,OAAO,GAAG,IAAA,qBAAK,EAAC,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE;QAC7E,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,SAAS,CAAC,OAAO,CAAC,CAAC;QACnB,SAAS,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACtB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import * as path from 'path';\nimport { spawn, ChildProcess } from 'child_process';\nimport { ParsedArgs } from '../args';\nimport { c } from '../colors';\nimport { resolveEntry } from '../utils/fs';\n\nfunction killQuiet(proc?: ChildProcess) {\n try {\n if (proc) {\n proc.kill('SIGINT');\n }\n } catch {\n // ignore\n }\n}\n\nexport async function runDev(opts: ParsedArgs): Promise<void> {\n const cwd = process.cwd();\n const entry = await resolveEntry(cwd, opts.entry);\n\n console.log(`${c('cyan', '[dev]')} using entry: ${path.relative(cwd, entry)}`);\n console.log(\n `${c('gray', '[dev]')} starting ${c('bold', 'tsx --watch')} and ${c(\n 'bold',\n 'tsc --noEmit --watch',\n )} (async type-checker)`,\n );\n console.log(`${c('gray', 'hint:')} press Ctrl+C to stop`);\n\n const app = spawn('npx', ['-y', 'tsx', '--watch', entry], { stdio: 'inherit', shell: true });\n const checker = spawn('npx', ['-y', 'tsc', '--noEmit', '--pretty', '--watch'], {\n stdio: 'inherit',\n shell: true,\n });\n\n const cleanup = () => {\n killQuiet(checker);\n killQuiet(app);\n };\n\n process.on('SIGINT', () => {\n cleanup();\n process.exit(0);\n });\n\n await new Promise<void>((resolve, reject) => {\n app.on('close', () => {\n cleanup();\n resolve();\n });\n app.on('error', (err) => {\n cleanup();\n reject(err);\n });\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runDoctor(): Promise<void>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runDoctor = runDoctor;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const path = tslib_1.__importStar(require("path"));
|
|
6
|
+
const child_process_1 = require("child_process");
|
|
7
|
+
const colors_1 = require("../colors");
|
|
8
|
+
const fs_1 = require("../utils/fs");
|
|
9
|
+
const tsconfig_1 = require("../tsconfig");
|
|
10
|
+
const fs_2 = require("../utils/fs");
|
|
11
|
+
function cmpSemver(a, b) {
|
|
12
|
+
const pa = a.split('.').map((n) => parseInt(n, 10) || 0);
|
|
13
|
+
const pb = b.split('.').map((n) => parseInt(n, 10) || 0);
|
|
14
|
+
for (let i = 0; i < 3; i++) {
|
|
15
|
+
if ((pa[i] || 0) > (pb[i] || 0))
|
|
16
|
+
return 1;
|
|
17
|
+
if ((pa[i] || 0) < (pb[i] || 0))
|
|
18
|
+
return -1;
|
|
19
|
+
}
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
async function runDoctor() {
|
|
23
|
+
const MIN_NODE = '22.0.0';
|
|
24
|
+
const MIN_NPM = '10.0.0';
|
|
25
|
+
const cwd = process.cwd();
|
|
26
|
+
let ok = true;
|
|
27
|
+
const nodeVer = process.versions.node;
|
|
28
|
+
if (cmpSemver(nodeVer, MIN_NODE) >= 0) {
|
|
29
|
+
console.log(`✅ Node ${nodeVer} (min ${MIN_NODE})`);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
ok = false;
|
|
33
|
+
console.log(`❌ Node ${nodeVer} — please upgrade to >= ${MIN_NODE}`);
|
|
34
|
+
}
|
|
35
|
+
let npmVer = 'unknown';
|
|
36
|
+
try {
|
|
37
|
+
npmVer = await new Promise((resolve, reject) => {
|
|
38
|
+
const child = (0, child_process_1.spawn)('npm', ['-v'], { shell: true });
|
|
39
|
+
let out = '';
|
|
40
|
+
child.stdout?.on('data', (d) => (out += String(d)));
|
|
41
|
+
child.on('close', () => resolve(out.trim()));
|
|
42
|
+
child.on('error', reject);
|
|
43
|
+
});
|
|
44
|
+
if (cmpSemver(npmVer, MIN_NPM) >= 0) {
|
|
45
|
+
console.log(`✅ npm ${npmVer} (min ${MIN_NPM})`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
ok = false;
|
|
49
|
+
console.log(`❌ npm ${npmVer} — please upgrade to >= ${MIN_NPM}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
ok = false;
|
|
54
|
+
console.log('❌ npm not found in PATH');
|
|
55
|
+
}
|
|
56
|
+
const tsconfigPath = path.join(cwd, 'tsconfig.json');
|
|
57
|
+
if (await (0, fs_1.fileExists)(tsconfigPath)) {
|
|
58
|
+
console.log(`✅ tsconfig.json found`);
|
|
59
|
+
const tsconfig = await (0, fs_1.readJSON)(tsconfigPath);
|
|
60
|
+
const { ok: oks, issues } = (0, tsconfig_1.checkRequiredTsOptions)(tsconfig?.compilerOptions);
|
|
61
|
+
for (const line of oks)
|
|
62
|
+
console.log((0, colors_1.c)('green', ` ✓ ${line}`));
|
|
63
|
+
if (issues.length) {
|
|
64
|
+
ok = false;
|
|
65
|
+
for (const line of issues)
|
|
66
|
+
console.log((0, colors_1.c)('yellow', ` • ${line}`));
|
|
67
|
+
console.log((0, colors_1.c)('cyan', ` -> Run "frontmcp init" to apply the required settings.`));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
ok = false;
|
|
72
|
+
console.log(`❌ tsconfig.json not found — run ${(0, colors_1.c)('cyan', 'frontmcp init')}`);
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const entry = await (0, fs_2.resolveEntry)(cwd);
|
|
76
|
+
console.log(`✅ entry detected: ${path.relative(cwd, entry)}`);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
const firstLine = e?.message?.split('\n')?.[0] ?? 'entry not found';
|
|
80
|
+
console.log(`❌ entry not detected — ${firstLine}`);
|
|
81
|
+
}
|
|
82
|
+
if (ok)
|
|
83
|
+
console.log((0, colors_1.c)('green', '\nAll checks passed. You are ready to go!'));
|
|
84
|
+
else
|
|
85
|
+
console.log((0, colors_1.c)('yellow', '\nSome checks failed. See above for fixes.'));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/commands/doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'path';\nimport { spawn } from 'child_process';\nimport { c } from '../colors';\nimport { fileExists, readJSON } from '../utils/fs';\nimport { checkRequiredTsOptions } from '../tsconfig';\nimport { resolveEntry } from '../utils/fs';\n\nfunction cmpSemver(a: string, b: string): number {\n const pa = a.split('.').map((n) => parseInt(n, 10) || 0);\n const pb = b.split('.').map((n) => parseInt(n, 10) || 0);\n for (let i = 0; i < 3; i++) {\n if ((pa[i] || 0) > (pb[i] || 0)) return 1;\n if ((pa[i] || 0) < (pb[i] || 0)) return -1;\n }\n return 0;\n}\n\nexport async function runDoctor(): Promise<void> {\n const MIN_NODE = '22.0.0';\n const MIN_NPM = '10.0.0';\n const cwd = process.cwd();\n\n let ok = true;\n\n const nodeVer = process.versions.node;\n if (cmpSemver(nodeVer, MIN_NODE) >= 0) {\n console.log(`✅ Node ${nodeVer} (min ${MIN_NODE})`);\n } else {\n ok = false;\n console.log(`❌ Node ${nodeVer} — please upgrade to >= ${MIN_NODE}`);\n }\n\n let npmVer = 'unknown';\n try {\n npmVer = await new Promise<string>((resolve, reject) => {\n const child = spawn('npm', ['-v'], { shell: true });\n let out = '';\n child.stdout?.on('data', (d) => (out += String(d)));\n child.on('close', () => resolve(out.trim()));\n child.on('error', reject);\n });\n if (cmpSemver(npmVer, MIN_NPM) >= 0) {\n console.log(`✅ npm ${npmVer} (min ${MIN_NPM})`);\n } else {\n ok = false;\n console.log(`❌ npm ${npmVer} — please upgrade to >= ${MIN_NPM}`);\n }\n } catch {\n ok = false;\n console.log('❌ npm not found in PATH');\n }\n\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n if (await fileExists(tsconfigPath)) {\n console.log(`✅ tsconfig.json found`);\n const tsconfig = await readJSON<Record<string, any>>(tsconfigPath);\n const { ok: oks, issues } = checkRequiredTsOptions(tsconfig?.compilerOptions);\n for (const line of oks) console.log(c('green', ` ✓ ${line}`));\n if (issues.length) {\n ok = false;\n for (const line of issues) console.log(c('yellow', ` • ${line}`));\n console.log(c('cyan', ` -> Run \"frontmcp init\" to apply the required settings.`));\n }\n } else {\n ok = false;\n console.log(`❌ tsconfig.json not found — run ${c('cyan', 'frontmcp init')}`);\n }\n\n try {\n const entry = await resolveEntry(cwd);\n console.log(`✅ entry detected: ${path.relative(cwd, entry)}`);\n } catch (e: any) {\n const firstLine = (e?.message as string | undefined)?.split('\\n')?.[0] ?? 'entry not found';\n console.log(`❌ entry not detected — ${firstLine}`);\n }\n\n if (ok) console.log(c('green', '\\nAll checks passed. You are ready to go!'));\n else console.log(c('yellow', '\\nSome checks failed. See above for fixes.'));\n}\n"]}
|