@nick848/ft 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/init.ts","../src/core/detector.ts","../src/core/paths.ts","../src/core/config.ts","../src/core/agents.ts","../src/core/template.ts","../src/core/i18n.ts","../src/adapters/index.ts","../src/adapters/mcp-setup.ts","../src/cli/commands/update.ts","../src/cli/commands/version.ts","../src/cli/commands/help.ts","../src/cli/commands/slash.ts","../src/slash/fill-context.ts","../src/core/rtk-bridge.ts","../src/core/rtk.ts","../src/slash/comet-passthrough.ts","../src/slash/graph-setup.ts","../src/slash/graph-init.ts","../src/slash/graph-refresh.ts","../src/slash/graph-handoff.ts","../src/slash/graph-status.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { runInit } from './commands/init.js';\nimport { runUpdate } from './commands/update.js';\nimport { runVersion } from './commands/version.js';\nimport { printHelp } from './commands/help.js';\nimport { runSlash } from './commands/slash.js';\n\nconst program = new Command();\n\nprogram\n .name('ft')\n .description('Frontend Toolkit — orchestration layer for Comet and GitNexus')\n .version('0.1.0');\n\nprogram\n .command('init')\n .description('Full project initialization pipeline')\n .option('--lang <lang>', 'Language: zh-CN or en')\n .action(async (options: { lang?: string }) => {\n await runInit({ lang: options.lang });\n });\n\nprogram\n .command('update')\n .description('Update @nick848/ft globally')\n .action(async () => {\n await runUpdate();\n });\n\nprogram\n .command('version')\n .description('Show FT, Comet, and GitNexus versions')\n .action(async () => {\n await runVersion();\n });\n\nprogram\n .command('help')\n .description('Show help')\n .action(() => {\n printHelp();\n });\n\nprogram\n .command('slash')\n .description('Run IDE slash command')\n .argument('<command>', 'Slash subcommand name')\n .argument('[args...]', 'Additional arguments')\n .action(async (command: string, args: string[]) => {\n await runSlash(command, args);\n });\n\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err);\n process.exit(1);\n});\n","import chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { execa } from 'execa';\nimport type { PlatformId } from '../../types/index.js';\nimport {\n detectComet,\n detectKarpathyRules,\n detectGitNexus,\n detectPlatformsInProject,\n detectProjectMeta,\n} from '../../core/detector.js';\nimport {\n loadConfig,\n resolveLanguage,\n writeDefaultConfig,\n mergeConfig,\n} from '../../core/config.js';\nimport { generateAgentsMd } from '../../core/agents.js';\nimport { t, tf } from '../../core/i18n.js';\nimport { getAdaptersForPlatforms } from '../../adapters/index.js';\nimport { configureMcpForAdapters } from '../../adapters/mcp-setup.js';\n\ntype InjectMode = 'manual' | 'auto' | 'all';\n\nasync function selectPlatforms(mode: InjectMode, lang: 'zh-CN' | 'en'): Promise<PlatformId[]> {\n if (mode === 'all') {\n return ['cursor', 'codex', 'opencode'];\n }\n\n if (mode === 'auto') {\n const detected = detectPlatformsInProject();\n if (detected.length > 0) return detected;\n return ['cursor', 'codex', 'opencode'];\n }\n\n const { platforms } = await inquirer.prompt<{ platforms: PlatformId[] }>([\n {\n type: 'checkbox',\n name: 'platforms',\n message: t('init.selectPlatforms', lang),\n choices: [\n { name: 'Cursor', value: 'cursor' },\n { name: 'Codex', value: 'codex' },\n { name: 'OpenCode', value: 'opencode' },\n ],\n validate: (v) => (v.length > 0 ? true : t('init.selectAtLeastOne', lang)),\n },\n ]);\n return platforms;\n}\n\nasync function selectInjectMode(lang: 'zh-CN' | 'en'): Promise<InjectMode> {\n const { mode } = await inquirer.prompt<{ mode: InjectMode }>([\n {\n type: 'list',\n name: 'mode',\n message: t('init.injectModeQuestion', lang),\n choices: [\n { name: t('init.injectModeManual', lang), value: 'manual' },\n { name: t('init.injectModeAuto', lang), value: 'auto' },\n { name: t('init.injectModeAll', lang), value: 'all' },\n ],\n },\n ]);\n return mode;\n}\n\nexport async function runInit(options: { lang?: string }): Promise<void> {\n const projectRoot = process.cwd();\n const existingConfig = await loadConfig(projectRoot);\n const language = resolveLanguage(options.lang, existingConfig.language);\n\n // Stage 4.1: mandatory dependencies\n const cometVersion = await detectComet();\n if (!cometVersion) {\n console.error(chalk.red(t('error.cometMissing', language)));\n process.exit(1);\n }\n\n if (!detectKarpathyRules(projectRoot)) {\n console.error(chalk.red(t('error.karpathyMissing', language)));\n process.exit(1);\n }\n\n // Stage 4.2: optional GitNexus\n const gitnexusVersion = await detectGitNexus();\n const gitnexusInstalled = Boolean(gitnexusVersion);\n if (!gitnexusInstalled) {\n console.log(chalk.gray(t('hint.gitnexusOptional', language)));\n }\n\n // Stage 4.3: interactive tool selection\n const injectMode = await selectInjectMode(language);\n const selectedPlatforms = await selectPlatforms(injectMode, language);\n\n // Stage 4.4: rules injection\n const adapterList = getAdaptersForPlatforms(selectedPlatforms);\n for (const adapter of adapterList) {\n adapter.injectRules(projectRoot);\n console.log(chalk.green(tf('init.rulesInjected', language, { path: adapter.rulesTargetPath })));\n }\n\n // Stage 4.5: MCP config (only if gitnexus installed)\n if (gitnexusInstalled) {\n await configureMcpForAdapters(adapterList, language);\n }\n\n // Stage 4.6: AGENTS.md\n const meta = detectProjectMeta(projectRoot);\n generateAgentsMd(meta, language, projectRoot);\n console.log(chalk.green(t('init.agentsGenerated', language)));\n\n const config = mergeConfig({\n ...existingConfig,\n language,\n tools: selectedPlatforms,\n });\n writeDefaultConfig(projectRoot, config);\n\n // Stage 4.7: comet init (TTY interactive)\n console.log(chalk.blue(t('init.runningComet', language)));\n await execa('comet', ['init'], { stdio: 'inherit', cwd: projectRoot });\n\n // Stage 4.8: done\n console.log(chalk.green.bold(t('init.success', language)));\n console.log(chalk.cyan(t('init.nextStep', language)));\n}\n","import { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport { execa } from 'execa';\nimport type { PlatformId, ProjectMeta } from '../types/index.js';\n\nimport { getRulesTemplatesDir } from './paths.js';\n\nconst KARPATHY_PATHS = [\n '.cursor/rules/karpathy-guidelines.mdc',\n '.codex/rules/karpathy-guidelines.md',\n '.opencode/rules/karpathy-guidelines.md',\n] as const;\n\nconst PLATFORM_DIRS: Record<PlatformId, string> = {\n cursor: '.cursor',\n codex: '.codex',\n opencode: '.opencode',\n};\n\nexport async function detectComet(): Promise<string | null> {\n try {\n const { stdout } = await execa('comet', ['--version']);\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\nexport function detectKarpathyRules(projectRoot: string = process.cwd()): boolean {\n if (KARPATHY_PATHS.some((p) => existsSync(path.join(projectRoot, p)))) {\n return true;\n }\n const templatesDir = getRulesTemplatesDir();\n return existsSync(path.join(templatesDir, 'cursor.mdc'));\n}\n\nexport async function detectGitNexus(): Promise<string | null> {\n try {\n const { stdout } = await execa('gitnexus', ['--version']);\n return stdout.trim();\n } catch {\n return null;\n }\n}\n\nexport function detectPlatformsInProject(projectRoot: string = process.cwd()): PlatformId[] {\n const found: PlatformId[] = [];\n for (const [id, dir] of Object.entries(PLATFORM_DIRS)) {\n if (existsSync(path.join(projectRoot, dir))) {\n found.push(id as PlatformId);\n }\n }\n return found;\n}\n\nexport function detectPackageManager(projectRoot: string = process.cwd()): string {\n if (existsSync(path.join(projectRoot, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(path.join(projectRoot, 'yarn.lock'))) return 'yarn';\n if (\n existsSync(path.join(projectRoot, 'bun.lockb')) ||\n existsSync(path.join(projectRoot, 'bun.lock'))\n ) {\n return 'bun';\n }\n if (existsSync(path.join(projectRoot, 'package-lock.json'))) return 'npm';\n return 'npm';\n}\n\nexport function detectProjectMeta(projectRoot: string = process.cwd()): ProjectMeta {\n const pkgPath = path.join(projectRoot, 'package.json');\n let name = path.basename(projectRoot);\n let scripts = '[NEEDS LLM INPUT]';\n let workspaces = '[NEEDS LLM INPUT]';\n let framework = 'unknown';\n let language = 'JavaScript';\n let monorepo = '否';\n\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n name?: string;\n scripts?: Record<string, string>;\n workspaces?: string[] | Record<string, unknown>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n name = pkg.name ?? name;\n if (pkg.scripts) {\n scripts = Object.entries(pkg.scripts)\n .map(([k, v]) => `- \\`${k}\\`: ${v}`)\n .join('\\n');\n }\n if (pkg.workspaces) {\n monorepo = '是';\n workspaces =\n Array.isArray(pkg.workspaces)\n ? pkg.workspaces.join(', ')\n : JSON.stringify(pkg.workspaces);\n }\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps['next']) framework = 'Next.js';\n else if (deps['nuxt']) framework = 'Nuxt';\n else if (deps['vue']) framework = 'Vue';\n else if (deps['react']) framework = 'React';\n else if (deps['@angular/core']) framework = 'Angular';\n else if (deps['svelte']) framework = 'Svelte';\n if (deps['typescript'] || existsSync(path.join(projectRoot, 'tsconfig.json'))) {\n language = 'TypeScript';\n }\n }\n\n return {\n name,\n packageManager: detectPackageManager(projectRoot),\n framework,\n language,\n monorepo,\n workspaces,\n scripts,\n };\n}\n\nexport function isStdinTTY(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n\nexport function isStdoutTTY(): boolean {\n return Boolean(process.stdout.isTTY);\n}\n\nexport function agentsMdHasPendingPlaceholders(projectRoot: string = process.cwd()): boolean {\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n if (!existsSync(agentsPath)) return true;\n const content = readFileSync(agentsPath, 'utf-8');\n return content.includes('[NEEDS LLM INPUT]');\n}\n\nexport function gitNexusGraphExists(projectRoot: string = process.cwd()): boolean {\n const graphDir = path.join(projectRoot, '.gitnexus');\n return existsSync(graphDir);\n}\n\nexport function countGitNexusIndexFiles(projectRoot: string = process.cwd()): number {\n const graphDir = path.join(projectRoot, '.gitnexus');\n if (!existsSync(graphDir)) return 0;\n try {\n return readdirSync(graphDir).length;\n } catch {\n return 0;\n }\n}\n","import { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\n\nexport function getPackageRoot(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n\n while (dir !== path.dirname(dir)) {\n const pkgPath = path.join(dir, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { name?: string };\n if (pkg.name === '@nick848/ft') {\n return dir;\n }\n } catch {\n // continue walking\n }\n }\n dir = path.dirname(dir);\n }\n\n return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');\n}\n\nexport function getTemplatesDir(): string {\n return path.join(getPackageRoot(), 'templates');\n}\n\nexport function getRulesTemplatesDir(): string {\n return path.join(getPackageRoot(), 'rules-templates');\n}\n\nexport function getLocalesDir(): string {\n return path.join(getPackageRoot(), 'locales');\n}\n","import { cosmiconfig } from 'cosmiconfig';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport type { FtConfig, Language } from '../types/index.js';\n\nconst MODULE_NAME = 'ft';\n\nconst DEFAULT_CONFIG: FtConfig = {\n language: 'zh-CN',\n rtk: {\n enabled: true,\n auto_trigger_lines: 500,\n exclude_patterns: ['--json', '--format json', '--xml'],\n },\n tools: ['cursor', 'codex', 'opencode'],\n gitnexus: {\n graph_path: '.gitnexus/',\n auto_prompt_in_agents: true,\n },\n};\n\nexport function mergeConfig(partial?: Partial<FtConfig>): FtConfig {\n return {\n ...DEFAULT_CONFIG,\n ...partial,\n rtk: { ...DEFAULT_CONFIG.rtk, ...partial?.rtk },\n gitnexus: { ...DEFAULT_CONFIG.gitnexus, ...partial?.gitnexus },\n tools: partial?.tools ?? DEFAULT_CONFIG.tools,\n };\n}\n\nexport async function loadConfig(projectRoot: string = process.cwd()): Promise<FtConfig> {\n const explorer = cosmiconfig(MODULE_NAME, {\n searchPlaces: [\n '.ft/config.yaml',\n '.ft/config.yml',\n '.ft/config.json',\n 'ft.config.yaml',\n 'ft.config.json',\n ],\n });\n\n const result = await explorer.search(projectRoot);\n if (!result?.config) {\n return { ...DEFAULT_CONFIG };\n }\n\n return mergeConfig(result.config as Partial<FtConfig>);\n}\n\nexport function resolveLanguage(\n cliLang?: string,\n configLang?: Language,\n): Language {\n if (cliLang === 'en' || cliLang === 'zh-CN') {\n return cliLang;\n }\n if (configLang) {\n return configLang;\n }\n return 'zh-CN';\n}\n\nexport function writeDefaultConfig(projectRoot: string, config: FtConfig): void {\n const ftDir = path.join(projectRoot, '.ft');\n if (!existsSync(ftDir)) {\n mkdirSync(ftDir, { recursive: true });\n }\n const configPath = path.join(ftDir, 'config.yaml');\n writeFileSync(configPath, YAML.stringify(config), 'utf-8');\n}\n\nexport function readConfigFile(projectRoot: string): FtConfig | null {\n const configPath = path.join(projectRoot, '.ft', 'config.yaml');\n if (!existsSync(configPath)) {\n return null;\n }\n const raw = readFileSync(configPath, 'utf-8');\n return mergeConfig(YAML.parse(raw) as Partial<FtConfig>);\n}\n","import Handlebars from 'handlebars';\nimport { readFileSync, writeFileSync, renameSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { Language } from '../types/index.js';\nimport { getTemplatesDir } from './paths.js';\nimport { buildAgentsTemplateData } from './template.js';\nimport type { ProjectMeta } from '../types/index.js';\n\nexport function renderAgentsMd(\n meta: ProjectMeta,\n lang: Language,\n): string {\n const templateName = lang === 'en' ? 'AGENTS.md.en.hbs' : 'AGENTS.md.zh.hbs';\n const templatePath = path.join(getTemplatesDir(), templateName);\n const source = readFileSync(templatePath, 'utf-8');\n const template = Handlebars.compile(source);\n const data = buildAgentsTemplateData(meta, lang);\n return template(data);\n}\n\nexport function generateAgentsMd(\n meta: ProjectMeta,\n lang: Language,\n projectRoot: string = process.cwd(),\n): void {\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n const backupPath = path.join(projectRoot, 'AGENTS-BAK.md');\n\n if (existsSync(agentsPath)) {\n renameSync(agentsPath, backupPath);\n }\n\n const content = renderAgentsMd(meta, lang);\n writeFileSync(agentsPath, content, 'utf-8');\n}\n\nexport function updateGraphTimestampInAgents(\n projectRoot: string = process.cwd(),\n timestamp?: string,\n): void {\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n if (!existsSync(agentsPath)) return;\n\n const ts = timestamp ?? new Date().toISOString();\n let content = readFileSync(agentsPath, 'utf-8');\n const marker = '图谱最后刷新时间';\n const enMarker = 'Graph last refreshed';\n const isEnglish = content.includes('## AI Working Guide');\n const line = isEnglish\n ? `- ${enMarker}: ${ts}`\n : `- ${marker}: ${ts}`;\n\n const regex = /- (图谱最后刷新时间|Graph last refreshed): .+/;\n if (regex.test(content)) {\n content = content.replace(regex, line);\n } else if (content.includes('## AI 工作指南') || isEnglish) {\n const sectionRegex = /(## AI (工作指南|Working Guide)\\n)/;\n content = content.replace(sectionRegex, `$1${line}\\n`);\n } else {\n content += `\\n## AI 工作指南\\n${line}\\n`;\n }\n\n writeFileSync(agentsPath, content, 'utf-8');\n}\n","import type { Language, ProjectMeta } from '../types/index.js';\n\nexport function getGitNexusCondition(lang: Language): string {\n if (lang === 'en') {\n return 'If GitNexus is installed in this project, AI **must prioritize** GitNexus MCP tools (e.g. `gitnexus_get_symbol`) for code scanning and dependency analysis. If not installed, ignore this rule.';\n }\n return '如果当前工程已安装 GitNexus,AI 在进行代码扫描和分析时**必须优先使用** GitNexus MCP 工具(如 `gitnexus_get_symbol`)获取符号级依赖关系。若未安装,请忽略此条。';\n}\n\nexport interface AgentsTemplateData {\n projectName: string;\n packageManager: string;\n framework: string;\n language: string;\n monorepo: string;\n workspaces: string;\n scripts: string;\n gitnexus_condition: string;\n}\n\nexport function buildAgentsTemplateData(\n meta: ProjectMeta,\n lang: Language,\n): AgentsTemplateData {\n return {\n projectName: meta.name,\n packageManager: meta.packageManager,\n framework: meta.framework,\n language: meta.language,\n monorepo: meta.monorepo,\n workspaces: meta.workspaces,\n scripts: meta.scripts,\n gitnexus_condition: getGitNexusCondition(lang),\n };\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { Language } from '../types/index.js';\nimport { getLocalesDir } from './paths.js';\n\ntype LocaleMap = Record<string, string>;\n\nconst cache: Partial<Record<Language, LocaleMap>> = {};\n\nfunction loadLocale(lang: Language): LocaleMap {\n if (cache[lang]) return cache[lang]!;\n const filePath = path.join(getLocalesDir(), `${lang}.json`);\n if (!existsSync(filePath)) {\n return {};\n }\n cache[lang] = JSON.parse(readFileSync(filePath, 'utf-8')) as LocaleMap;\n return cache[lang]!;\n}\n\nexport function t(key: string, lang: Language = 'zh-CN'): string {\n const locale = loadLocale(lang);\n return locale[key] ?? key;\n}\n\nexport function tf(key: string, lang: Language, vars?: Record<string, string>): string {\n let text = t(key, lang);\n if (!vars) return text;\n for (const [k, v] of Object.entries(vars)) {\n text = text.replace(new RegExp(`\\\\{\\\\{${k}\\\\}\\\\}`, 'g'), v);\n }\n return text;\n}\n","import { homedir } from 'node:os';\nimport path from 'node:path';\nimport {\n readFileSync,\n writeFileSync,\n mkdirSync,\n existsSync,\n copyFileSync,\n} from 'node:fs';\nimport deepmerge from 'deepmerge';\nimport type { PlatformId } from '../types/index.js';\nimport { getRulesTemplatesDir } from '../core/paths.js';\n\nexport interface PlatformAdapter {\n id: PlatformId;\n rulesTargetPath: string;\n rulesTemplateName: string;\n mcpConfigPath: string;\n getGitNexusMcpEntry(): Record<string, unknown>;\n mergeGitNexusMcp(config: Record<string, unknown>): Record<string, unknown>;\n hasGitNexusMcp(config: Record<string, unknown>): boolean;\n injectRules(projectRoot: string): void;\n configureMcp(): Promise<{ success: boolean; path: string; snippet: string }>;\n}\n\nconst GITNEXUS_SNIPPET = {\n gitnexus: {\n command: 'gitnexus',\n args: ['mcp'],\n disabled: false,\n },\n};\n\nfunction readJsonFile(filePath: string): Record<string, unknown> {\n if (!existsSync(filePath)) {\n return { mcpServers: {} };\n }\n const raw = readFileSync(filePath, 'utf-8');\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return { mcpServers: {} };\n }\n}\n\nfunction writeJsonFile(filePath: string, data: Record<string, unknown>): void {\n const dir = path.dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\n}\n\nfunction ensureMcpServersShape(config: Record<string, unknown>): Record<string, unknown> {\n if (!config.mcpServers || typeof config.mcpServers !== 'object') {\n config.mcpServers = {};\n }\n return config;\n}\n\nfunction createAdapter(\n id: PlatformId,\n rulesTargetPath: string,\n rulesTemplateName: string,\n mcpConfigPath: string,\n): PlatformAdapter {\n return {\n id,\n rulesTargetPath,\n rulesTemplateName,\n mcpConfigPath,\n getGitNexusMcpEntry() {\n return { ...GITNEXUS_SNIPPET };\n },\n mergeGitNexusMcp(config) {\n const base = ensureMcpServersShape({ ...config });\n const servers = base.mcpServers as Record<string, unknown>;\n if (servers.gitnexus) {\n return base;\n }\n return deepmerge(base, { mcpServers: GITNEXUS_SNIPPET });\n },\n hasGitNexusMcp(config) {\n const servers = config.mcpServers as Record<string, unknown> | undefined;\n return Boolean(servers?.gitnexus);\n },\n injectRules(projectRoot) {\n const target = path.join(projectRoot, rulesTargetPath);\n const source = path.join(getRulesTemplatesDir(), rulesTemplateName);\n const dir = path.dirname(target);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n copyFileSync(source, target);\n },\n async configureMcp() {\n const configPath = mcpConfigPath;\n const snippet = JSON.stringify(GITNEXUS_SNIPPET, null, 2);\n try {\n const existing = readJsonFile(configPath);\n if (this.hasGitNexusMcp(existing)) {\n return { success: true, path: configPath, snippet };\n }\n const merged = this.mergeGitNexusMcp(existing);\n writeJsonFile(configPath, merged);\n return { success: true, path: configPath, snippet };\n } catch {\n return { success: false, path: configPath, snippet };\n }\n },\n };\n}\n\nexport const cursorAdapter = createAdapter(\n 'cursor',\n '.cursor/rules/karpathy-guidelines.mdc',\n 'cursor.mdc',\n path.join(homedir(), '.cursor', 'mcp.json'),\n);\n\nexport const codexAdapter = createAdapter(\n 'codex',\n '.codex/rules/karpathy-guidelines.md',\n 'codex.md',\n path.join(homedir(), '.codex', 'mcp.json'),\n);\n\nexport const opencodeAdapter = createAdapter(\n 'opencode',\n '.opencode/rules/karpathy-guidelines.md',\n 'opencode.md',\n path.join(homedir(), '.config', 'opencode', 'mcp.json'),\n);\n\nexport const adapters: Record<PlatformId, PlatformAdapter> = {\n cursor: cursorAdapter,\n codex: codexAdapter,\n opencode: opencodeAdapter,\n};\n\nexport function getAdaptersForPlatforms(platforms: PlatformId[]): PlatformAdapter[] {\n return platforms.map((p) => adapters[p]);\n}\n","import chalk from 'chalk';\nimport readline from 'node:readline';\nimport type { PlatformAdapter } from './index.js';\nimport { tf } from '../core/i18n.js';\nimport type { Language } from '../types/index.js';\n\nexport async function configureMcpForAdapters(\n adapterList: PlatformAdapter[],\n lang: Language,\n): Promise<void> {\n for (const adapter of adapterList) {\n const result = await adapter.configureMcp();\n if (result.success) {\n console.log(chalk.green(tf('mcp.writeSuccess', lang, { path: result.path })));\n } else {\n await promptManualMcpConfig(adapter, lang, result.path, result.snippet);\n }\n }\n}\n\nasync function promptManualMcpConfig(\n _adapter: PlatformAdapter,\n lang: Language,\n configPath: string,\n snippet: string,\n): Promise<void> {\n const border = '═'.repeat(60);\n console.log(chalk.yellow(`\\n${border}`));\n console.log(chalk.yellow.bold(tf('mcp.manualTitle', lang, { path: configPath })));\n console.log(chalk.cyan(snippet));\n console.log(chalk.yellow(`${border}\\n`));\n console.log(chalk.gray(tf('mcp.pressKey', lang)));\n\n await new Promise<void>((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n process.stdin.setRawMode?.(true);\n process.stdin.resume();\n process.stdin.once('data', () => {\n rl.close();\n process.stdin.setRawMode?.(false);\n resolve();\n });\n });\n}\n","import { execa } from 'execa';\n\nexport async function runUpdate(): Promise<void> {\n await execa('npm', ['update', '-g', '@nick848/ft'], { stdio: 'inherit' });\n}\n","import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport {\n detectComet,\n detectGitNexus,\n} from '../../core/detector.js';\nimport { getPackageRoot } from '../../core/paths.js';\n\nfunction getFtVersion(): string {\n try {\n const pkgPath = path.join(getPackageRoot(), 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { version?: string };\n return pkg.version ?? 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nexport async function runVersion(): Promise<void> {\n const ftVersion = getFtVersion();\n const cometVersion = await detectComet();\n const gitnexusVersion = await detectGitNexus();\n\n console.log(`FT: ${ftVersion}`);\n console.log(`Comet: ${cometVersion ?? 'not installed'}`);\n console.log(`GitNexus: ${gitnexusVersion ?? 'not installed'}`);\n}\n","export function printHelp(): void {\n console.log(`\nFT (Frontend Toolkit) — CLI orchestration for Comet, Karpathy rules, and GitNexus\n\nUsage:\n ft init [--lang en|zh-CN] Full project initialization pipeline\n ft update Update @nick848/ft globally\n ft version Show FT, Comet, and GitNexus versions\n ft help Show this help\n ft slash <command> [args] Run IDE slash command (internal)\n\nSlash commands (use via IDE, maps to ft slash):\n fill-context Output prompt recipe to fill AGENTS.md\n open Comet open (passthrough)\n design Comet design (passthrough)\n build Comet build (passthrough)\n verify Comet verify (passthrough)\n archive Comet archive (passthrough)\n hotfix Comet hotfix (passthrough)\n tweak Comet tweak (passthrough)\n graph-setup GitNexus install guide + MCP retry\n graph-init gitnexus analyze\n graph-refresh gitnexus analyze --force\n graph-handoff Graph summary + prompt + AGENTS timestamp\n graph-status Check GitNexus installation and graph state\n`);\n}\n","import chalk from 'chalk';\nimport type { SlashCommand } from '../../types/index.js';\nimport { loadConfig } from '../../core/config.js';\nimport { agentsMdHasPendingPlaceholders } from '../../core/detector.js';\nimport { t } from '../../core/i18n.js';\nimport { runFillContext } from '../../slash/fill-context.js';\nimport { runCometSlash } from '../../slash/comet-passthrough.js';\nimport { runGraphSetup } from '../../slash/graph-setup.js';\nimport { runGraphInit } from '../../slash/graph-init.js';\nimport { runGraphRefresh } from '../../slash/graph-refresh.js';\nimport { runGraphHandoff } from '../../slash/graph-handoff.js';\nimport { runGraphStatus } from '../../slash/graph-status.js';\n\nconst COMET_COMMANDS: SlashCommand[] = [\n 'open',\n 'design',\n 'build',\n 'verify',\n 'archive',\n 'hotfix',\n 'tweak',\n];\n\nconst GRAPH_COMMANDS: SlashCommand[] = [\n 'graph-setup',\n 'graph-init',\n 'graph-refresh',\n 'graph-handoff',\n 'graph-status',\n];\n\nconst ALL_COMMANDS: SlashCommand[] = [\n 'fill-context',\n ...COMET_COMMANDS,\n ...GRAPH_COMMANDS,\n];\n\nfunction gateCometCommands(projectRoot: string, lang: 'zh-CN' | 'en'): void {\n if (agentsMdHasPendingPlaceholders(projectRoot)) {\n console.error(chalk.yellow(t('gate.fillContextFirst', lang)));\n process.exit(1);\n }\n}\n\nexport async function runSlash(command: string, args: string[]): Promise<void> {\n if (!ALL_COMMANDS.includes(command as SlashCommand)) {\n console.error(chalk.red(`Unknown slash command: ${command}`));\n process.exit(1);\n }\n\n const projectRoot = process.cwd();\n const config = await loadConfig(projectRoot);\n const lang = config.language;\n const slashCmd = command as SlashCommand;\n\n if (COMET_COMMANDS.includes(slashCmd)) {\n gateCometCommands(projectRoot, lang);\n const exitCode = await runCometSlash(slashCmd, args, config);\n process.exit(exitCode);\n }\n\n switch (slashCmd) {\n case 'fill-context':\n await runFillContext(config);\n break;\n case 'graph-setup':\n await runGraphSetup(config);\n break;\n case 'graph-init':\n await runGraphInit(config);\n break;\n case 'graph-refresh':\n await runGraphRefresh(config);\n break;\n case 'graph-handoff':\n await runGraphHandoff(config);\n break;\n case 'graph-status':\n await runGraphStatus(config);\n break;\n default:\n process.exit(1);\n }\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport path from 'node:path';\nimport type { FtConfig } from '../types/index.js';\nimport { t } from '../core/i18n.js';\n\nconst PLACEHOLDER = '[NEEDS LLM INPUT]';\n\nconst SECTION_HINTS: Record<string, { zh: string; en: string }> = {\n '结构': { zh: '请遍历 src/ 生成树形目录结构', en: 'Traverse src/ and produce a tree directory structure' },\n 'Structure': { zh: '请遍历 src/ 生成树形目录结构', en: 'Traverse src/ and produce a tree directory structure' },\n '规范': { zh: '请根据 .eslintrc / prettier 等配置文件总结代码规范', en: 'Summarize code conventions from eslint/prettier configs' },\n 'Conventions': { zh: '请根据 .eslintrc / prettier 等配置文件总结代码规范', en: 'Summarize code conventions from eslint/prettier configs' },\n '路由': { zh: '请根据路由配置文件列出主要路由', en: 'List main routes from routing config' },\n 'Routing': { zh: '请根据路由配置文件列出主要路由', en: 'List main routes from routing config' },\n};\n\nfunction extractSections(content: string): Array<{ section: string; line: number }> {\n const lines = content.split('\\n');\n const results: Array<{ section: string; line: number }> = [];\n let currentSection = '';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.startsWith('## ')) {\n currentSection = line.replace(/^##\\s+/, '').trim();\n }\n if (line.includes(PLACEHOLDER)) {\n results.push({ section: currentSection, line: i + 1 });\n }\n }\n return results;\n}\n\nfunction findSectionInBackup(section: string, backup: string): string {\n if (!section) return '';\n const regex = new RegExp(`## ${section}[\\\\s\\\\n]+([\\\\s\\\\S]*?)(?=\\\\n## |$)`, 'm');\n const match = backup.match(regex);\n return match?.[1]?.trim() ?? '';\n}\n\nexport async function runFillContext(config: FtConfig): Promise<void> {\n const projectRoot = process.cwd();\n const agentsPath = path.join(projectRoot, 'AGENTS.md');\n const lang = config.language;\n\n if (!existsSync(agentsPath)) {\n console.log(t('fillContext.noAgents', lang));\n return;\n }\n\n const agentsContent = readFileSync(agentsPath, 'utf-8');\n const placeholders = extractSections(agentsContent);\n\n const backupPath = path.join(projectRoot, 'AGENTS-BAK.md');\n const backupContent = existsSync(backupPath)\n ? readFileSync(backupPath, 'utf-8')\n : '';\n\n const langLabel = lang === 'en' ? 'English' : '简体中文';\n\n console.log(`# ${t('fillContext.title', lang)}\\n`);\n console.log(t('fillContext.goal', lang));\n console.log(`\\n**${t('fillContext.langConstraint', lang)}**: ${langLabel}\\n`);\n\n if (placeholders.length === 0) {\n console.log(t('fillContext.noPlaceholders', lang));\n return;\n }\n\n console.log(`## ${t('fillContext.taskList', lang)}\\n`);\n\n for (const { section, line } of placeholders) {\n const hint = SECTION_HINTS[section];\n const guide =\n lang === 'en'\n ? hint?.en ?? 'Replace placeholder with accurate project-specific content'\n : hint?.zh ?? '将占位符替换为准确的项目相关内容';\n\n console.log(`### ${section || 'General'} (line ${line})`);\n console.log(`- **${t('fillContext.placeholder', lang)}**: ${PLACEHOLDER}`);\n console.log(`- **${t('fillContext.guide', lang)}**: ${guide}`);\n\n if (backupContent && section) {\n const ref = findSectionInBackup(section, backupContent);\n if (ref) {\n console.log(`- **${t('fillContext.reference', lang)}**:\\n`);\n console.log(ref);\n }\n }\n console.log('');\n }\n\n if (backupContent) {\n console.log(`## ${t('fillContext.backupNote', lang)}\\n`);\n console.log(t('fillContext.backupMerge', lang));\n }\n}\n","import { execa, type ExecaError } from 'execa';\nimport type { FtConfig } from '../types/index.js';\nimport { shouldBypassRtk, compressOutputIfNeeded } from './rtk.js';\nimport { isStdoutTTY } from './detector.js';\n\nexport interface RunWithRtkOptions {\n cwd?: string;\n rtkDisabled?: boolean;\n inheritStdio?: boolean;\n}\n\nexport async function runWithRtk(\n command: string,\n args: string[],\n config: FtConfig,\n options: RunWithRtkOptions = {},\n): Promise<{ stdout: string; stderr: string; exitCode: number }> {\n const bypass = shouldBypassRtk(args, config);\n const ttyPassthrough = options.inheritStdio ?? false;\n const rtkOff = options.rtkDisabled || bypass || ttyPassthrough;\n\n if (ttyPassthrough) {\n const subprocess = execa(command, args, {\n cwd: options.cwd,\n stdio: 'inherit',\n reject: false,\n });\n const result = await subprocess;\n return {\n stdout: '',\n stderr: '',\n exitCode: result.exitCode ?? (result.failed ? 1 : 0),\n };\n }\n\n const result = await execa(command, args, {\n cwd: options.cwd,\n reject: false,\n all: true,\n });\n\n const combined = result.all ?? `${result.stdout}\\n${result.stderr}`;\n const processed = compressOutputIfNeeded(combined, config, rtkOff);\n\n if (processed !== combined) {\n process.stdout.write(processed);\n if (!processed.endsWith('\\n')) process.stdout.write('\\n');\n } else {\n if (result.stdout) process.stdout.write(result.stdout);\n if (result.stderr) process.stderr.write(result.stderr);\n }\n\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode ?? 1,\n };\n}\n\nexport async function runCometPassthrough(\n subcommand: string,\n extraArgs: string[],\n config: FtConfig,\n options: RunWithRtkOptions = {},\n): Promise<number> {\n const args = [subcommand, ...extraArgs];\n const isTTY = isStdoutTTY() && isStdinTTY();\n\n if (isTTY) {\n const result = await runWithRtk('comet', args, config, {\n ...options,\n inheritStdio: true,\n rtkDisabled: true,\n });\n return result.exitCode;\n }\n\n const withNonInteractive = ['--non-interactive', ...args];\n try {\n const result = await runWithRtk('comet', withNonInteractive, config, options);\n if (result.exitCode === 0) return 0;\n\n const retry = await runWithRtk('comet', args, config, options);\n if (retry.exitCode !== 0) {\n throw new Error('NON_INTERACTIVE_FAILED');\n }\n return 0;\n } catch (err) {\n if ((err as ExecaError).message?.includes('ENOENT')) {\n throw new Error('COMET_NOT_FOUND');\n }\n throw err;\n }\n}\n\nfunction isStdinTTY(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n","import type { FtConfig } from '../types/index.js';\n\nconst HEAD_LINES = 200;\nconst TAIL_LINES = 100;\n\nexport function shouldBypassRtk(\n commandArgs: string[],\n config: FtConfig,\n): boolean {\n const joined = commandArgs.join(' ');\n return config.rtk.exclude_patterns.some((pattern) => joined.includes(pattern));\n}\n\nexport function truncateMiddle(\n text: string,\n headLines = HEAD_LINES,\n tailLines = TAIL_LINES,\n): string {\n const lines = text.split('\\n');\n const total = lines.length;\n const threshold = headLines + tailLines;\n\n if (total <= threshold) {\n return text;\n }\n\n const omitted = total - headLines - tailLines;\n const head = lines.slice(0, headLines);\n const tail = lines.slice(-tailLines);\n const marker = `...... (已省略 ${omitted} 行) ......`;\n\n return [...head, marker, ...tail].join('\\n');\n}\n\nexport function compressOutputIfNeeded(\n text: string,\n config: FtConfig,\n rtkDisabled: boolean,\n): string {\n if (rtkDisabled) return text;\n\n const lines = text.split('\\n');\n const shouldCompress =\n config.rtk.enabled || lines.length > config.rtk.auto_trigger_lines;\n\n if (!shouldCompress) return text;\n\n return truncateMiddle(text);\n}\n","import { runCometPassthrough } from '../core/rtk-bridge.js';\nimport type { FtConfig } from '../types/index.js';\nimport type { CometSubcommand } from '../types/index.js';\nimport chalk from 'chalk';\nimport { t } from '../core/i18n.js';\n\nconst COMET_MAP: Record<string, CometSubcommand> = {\n open: 'open',\n design: 'design',\n build: 'build',\n verify: 'verify',\n archive: 'archive',\n hotfix: 'hotfix',\n tweak: 'tweak',\n};\n\nexport async function runCometSlash(\n subcommand: string,\n args: string[],\n config: FtConfig,\n): Promise<number> {\n const mapped = COMET_MAP[subcommand];\n if (!mapped) return 1;\n\n try {\n return await runCometPassthrough(mapped, args, config);\n } catch (err) {\n const message = (err as Error).message;\n if (message === 'NON_INTERACTIVE_FAILED') {\n console.error(chalk.red(t('error.cometNonInteractive', config.language)));\n console.error(chalk.yellow(t('error.cometUseTerminal', config.language)));\n return 1;\n }\n console.error(chalk.red(String(err)));\n return 1;\n }\n}\n","import chalk from 'chalk';\nimport type { FtConfig } from '../types/index.js';\nimport { detectGitNexus } from '../core/detector.js';\nimport { t } from '../core/i18n.js';\nimport { getAdaptersForPlatforms } from '../adapters/index.js';\nimport { configureMcpForAdapters } from '../adapters/mcp-setup.js';\n\nexport async function runGraphSetup(config: FtConfig): Promise<void> {\n const lang = config.language;\n const installed = await detectGitNexus();\n\n if (!installed) {\n console.log(chalk.yellow(t('graph.setupGuide', lang)));\n console.log(chalk.cyan('npm install -g gitnexus'));\n } else {\n console.log(chalk.green(t('graph.alreadyInstalled', lang)));\n }\n\n const adapterList = getAdaptersForPlatforms(config.tools);\n await configureMcpForAdapters(adapterList, lang);\n}\n","import type { FtConfig } from '../types/index.js';\nimport { runWithRtk } from '../core/rtk-bridge.js';\n\nexport async function runGraphInit(config: FtConfig): Promise<void> {\n const result = await runWithRtk('gitnexus', ['analyze'], config);\n process.exit(result.exitCode);\n}\n","import type { FtConfig } from '../types/index.js';\nimport { runWithRtk } from '../core/rtk-bridge.js';\n\nexport async function runGraphRefresh(config: FtConfig): Promise<void> {\n const result = await runWithRtk('gitnexus', ['analyze', '--force'], config);\n process.exit(result.exitCode);\n}\n","import chalk from 'chalk';\nimport type { FtConfig } from '../types/index.js';\nimport { runWithRtk } from '../core/rtk-bridge.js';\nimport { updateGraphTimestampInAgents } from '../core/agents.js';\nimport { t } from '../core/i18n.js';\n\nexport async function runGraphHandoff(config: FtConfig): Promise<void> {\n const lang = config.language;\n\n console.log(chalk.bold(`## A. ${t('graph.handoffSummary', lang)}\\n`));\n const summary = await runWithRtk('gitnexus', ['query', '--summary'], config);\n if (summary.exitCode !== 0) {\n console.log(chalk.yellow(t('graph.summaryFailed', lang)));\n }\n\n console.log(chalk.bold(`\\n## B. ${t('graph.handoffPrompt', lang)}\\n`));\n console.log(t('graph.handoffPromptBody', lang));\n\n console.log(chalk.bold(`\\n## C. ${t('graph.handoffTimestamp', lang)}\\n`));\n updateGraphTimestampInAgents();\n console.log(chalk.green(t('graph.timestampUpdated', lang)));\n}\n","import chalk from 'chalk';\nimport type { FtConfig } from '../types/index.js';\nimport {\n detectGitNexus,\n gitNexusGraphExists,\n countGitNexusIndexFiles,\n} from '../core/detector.js';\nimport { t } from '../core/i18n.js';\n\nexport async function runGraphStatus(config: FtConfig): Promise<void> {\n const lang = config.language;\n const version = await detectGitNexus();\n const graphExists = gitNexusGraphExists();\n const indexCount = countGitNexusIndexFiles();\n\n console.log(chalk.bold(t('graph.statusTitle', lang)));\n console.log(`${t('graph.statusInstalled', lang)}: ${version ? chalk.green(version) : chalk.red('no')}`);\n console.log(`${t('graph.statusGraph', lang)}: ${graphExists ? chalk.green('yes') : chalk.yellow('no')}`);\n console.log(`${t('graph.statusIndexFiles', lang)}: ${indexCount}`);\n}\n"],"mappings":"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","names":["chalk","execa","readFileSync","existsSync","path","existsSync","path","readFileSync","path","existsSync","readFileSync","readFileSync","existsSync","path","readFileSync","writeFileSync","existsSync","path","path","readFileSync","existsSync","writeFileSync","readFileSync","existsSync","path","path","existsSync","readFileSync","path","readFileSync","writeFileSync","mkdirSync","existsSync","existsSync","readFileSync","path","mkdirSync","writeFileSync","chalk","execa","execa","readFileSync","path","path","readFileSync","chalk","readFileSync","existsSync","path","path","existsSync","readFileSync","execa","execa","result","chalk","chalk","chalk","chalk","chalk","chalk","chalk","chalk","chalk"]}
@@ -0,0 +1,45 @@
1
+ {
2
+ "error.cometMissing": "Comet not found. Run: npm install -g @rpamis/comet, then retry ft init",
3
+ "error.karpathyMissing": "andrej-karpathy-skills not found. See https://github.com/multica-ai/andrej-karpathy-skills or copy rule files manually.",
4
+ "error.cometNonInteractive": "Comet failed in non-interactive (IDE) environment.",
5
+ "error.cometUseTerminal": "Run in system terminal: comet <command>",
6
+ "hint.gitnexusOptional": "Tip: install GitNexus for code intelligence (npm install -g gitnexus)",
7
+ "init.injectModeQuestion": "How should Karpathy rules be injected?",
8
+ "init.injectModeManual": "1) Manually select target tools (recommended)",
9
+ "init.injectModeAuto": "2) Auto-detect current environment",
10
+ "init.injectModeAll": "3) Install all (Cursor + Codex + OpenCode)",
11
+ "init.selectPlatforms": "Select target tools for rule injection:",
12
+ "init.selectAtLeastOne": "Select at least one tool",
13
+ "init.rulesInjected": "Rules injected: {{path}}",
14
+ "init.agentsGenerated": "AGENTS.md generated",
15
+ "init.runningComet": "Running comet init...",
16
+ "init.success": "✓ FT initialization complete",
17
+ "init.nextStep": "Next: run /ft-fill-context in your IDE to complete project context",
18
+ "mcp.writeSuccess": "MCP config written: {{path}}",
19
+ "mcp.manualTitle": "⚠️ Cannot write MCP config. Add the following to {{path}}:",
20
+ "mcp.pressKey": "Press any key to continue...",
21
+ "gate.fillContextFirst": "Complete /ft-fill-context first — fill all [NEEDS LLM INPUT] placeholders in AGENTS.md before Comet workflow commands.",
22
+ "fillContext.title": "AGENTS.md Context Fill Task",
23
+ "fillContext.goal": "Edit `AGENTS.md` directly and replace `[NEEDS LLM INPUT]` with project-specific content.",
24
+ "fillContext.langConstraint": "Language",
25
+ "fillContext.noPlaceholders": "No placeholders found. AGENTS.md is ready.",
26
+ "fillContext.noAgents": "AGENTS.md not found. Run ft init first.",
27
+ "fillContext.taskList": "Items to fill",
28
+ "fillContext.placeholder": "Placeholder",
29
+ "fillContext.guide": "Guidance",
30
+ "fillContext.reference": "Reference (from AGENTS-BAK.md)",
31
+ "fillContext.backupNote": "Backup merge notes",
32
+ "fillContext.backupMerge": "Regenerate template sections from backup; append custom sections from backup to the end with <!-- migrated from AGENTS-BAK.md -->",
33
+ "graph.setupGuide": "GitNexus not installed. Run:",
34
+ "graph.alreadyInstalled": "GitNexus is installed.",
35
+ "graph.handoffSummary": "Graph Summary",
36
+ "graph.handoffPrompt": "Guidance Prompt",
37
+ "graph.handoffPromptBody": "For upcoming coding tasks, prioritize GitNexus MCP tools (get_symbol, get_callers, query) for symbol-level dependencies instead of blind full-repo scans.",
38
+ "graph.handoffTimestamp": "Update AGENTS.md Timestamp",
39
+ "graph.timestampUpdated": "Graph refresh timestamp updated in AGENTS.md.",
40
+ "graph.summaryFailed": "Could not fetch graph summary (gitnexus query --summary failed).",
41
+ "graph.statusTitle": "GitNexus Status",
42
+ "graph.statusInstalled": "Installed",
43
+ "graph.statusGraph": "Graph directory",
44
+ "graph.statusIndexFiles": "Index files"
45
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "error.cometMissing": "未检测到 Comet,请执行 npm install -g @rpamis/comet 后重新运行 ft init",
3
+ "error.karpathyMissing": "未检测到 andrej-karpathy-skills,请参考 https://github.com/multica-ai/andrej-karpathy-skills 安装,或手动复制规则文件后重试",
4
+ "error.cometNonInteractive": "Comet 在非交互环境(IDE)中执行失败。",
5
+ "error.cometUseTerminal": "请在系统终端执行:comet <command>",
6
+ "hint.gitnexusOptional": "提示:可安装 GitNexus 增强代码认知(npm install -g gitnexus)",
7
+ "init.injectModeQuestion": "请选择 andrej-karpathy-skills 规则的注入方式:",
8
+ "init.injectModeManual": "1) 手动选择目标工具(推荐)",
9
+ "init.injectModeAuto": "2) 自动检测当前环境",
10
+ "init.injectModeAll": "3) 全部安装(Cursor + Codex + OpenCode)",
11
+ "init.selectPlatforms": "选择要注入规则的目标工具:",
12
+ "init.selectAtLeastOne": "请至少选择一个工具",
13
+ "init.rulesInjected": "已注入规则:{{path}}",
14
+ "init.agentsGenerated": "已生成 AGENTS.md",
15
+ "init.runningComet": "正在执行 comet init...",
16
+ "init.success": "✓ FT 初始化完成",
17
+ "init.nextStep": "下一步:在 IDE 中执行 /ft-fill-context 完善项目上下文",
18
+ "mcp.writeSuccess": "已写入 MCP 配置:{{path}}",
19
+ "mcp.manualTitle": "⚠️ 无法自动写入 MCP 配置,请手动将以下内容添加到 {{path}} 中:",
20
+ "mcp.pressKey": "完成后按任意键继续...",
21
+ "gate.fillContextFirst": "请先完成 /ft-fill-context,将 AGENTS.md 中的 [NEEDS LLM INPUT] 占位符填充完毕后再执行 Comet 流程命令。",
22
+ "fillContext.title": "AGENTS.md 上下文填充任务",
23
+ "fillContext.goal": "请直接编辑 `AGENTS.md` 文件,将 `[NEEDS LLM INPUT]` 替换为具体内容。",
24
+ "fillContext.langConstraint": "语言约束",
25
+ "fillContext.noPlaceholders": "未发现待填充占位符,AGENTS.md 已就绪。",
26
+ "fillContext.noAgents": "未找到 AGENTS.md,请先运行 ft init。",
27
+ "fillContext.taskList": "待填充项",
28
+ "fillContext.placeholder": "占位符",
29
+ "fillContext.guide": "填充指引",
30
+ "fillContext.reference": "参考内容(来自 AGENTS-BAK.md)",
31
+ "fillContext.backupNote": "备份合并说明",
32
+ "fillContext.backupMerge": "模板内字段请参考旧内容重新生成;超模板自定义章节须原样追加到 AGENTS.md 末尾,并添加注释 <!-- 以下内容来自 AGENTS-BAK.md,已自动迁移 -->",
33
+ "graph.setupGuide": "GitNexus 未安装。请执行:",
34
+ "graph.alreadyInstalled": "GitNexus 已安装。",
35
+ "graph.handoffSummary": "图谱摘要",
36
+ "graph.handoffPrompt": "引导提示词",
37
+ "graph.handoffPromptBody": "在后续编码任务中,请优先使用 GitNexus MCP 工具(如 get_symbol、get_callers、query)获取符号级依赖与调用关系,避免盲目全文扫描。",
38
+ "graph.handoffTimestamp": "更新 AGENTS.md 时间戳",
39
+ "graph.timestampUpdated": "已更新 AGENTS.md 中的图谱刷新时间。",
40
+ "graph.summaryFailed": "无法获取图谱摘要(gitnexus query --summary 失败)。",
41
+ "graph.statusTitle": "GitNexus 状态",
42
+ "graph.statusInstalled": "已安装",
43
+ "graph.statusGraph": "图谱目录",
44
+ "graph.statusIndexFiles": "索引文件数"
45
+ }
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@nick848/ft",
3
+ "version": "0.1.0",
4
+ "description": "Frontend Toolkit — CLI orchestration layer for Comet, Karpathy rules, and GitNexus",
5
+ "type": "module",
6
+ "bin": {
7
+ "ft": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "templates",
12
+ "rules-templates",
13
+ "locales",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsup",
19
+ "dev": "tsup --watch",
20
+ "start": "node dist/index.js",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest",
23
+ "typecheck": "tsc --noEmit",
24
+ "prepack": "npm run build",
25
+ "prepublishOnly": "npm run build && npm test",
26
+ "pack:check": "npm pack --dry-run",
27
+ "pack": "npm pack",
28
+ "publish:public": "npm publish --access public"
29
+ },
30
+ "keywords": [
31
+ "frontend",
32
+ "cli",
33
+ "comet",
34
+ "cursor",
35
+ "codex",
36
+ "opencode",
37
+ "gitnexus",
38
+ "agents"
39
+ ],
40
+ "author": "nick848",
41
+ "license": "MIT",
42
+ "publishConfig": {
43
+ "access": "public",
44
+ "registry": "https://registry.npmjs.org/"
45
+ },
46
+ "dependencies": {
47
+ "chalk": "^5.4.1",
48
+ "commander": "^13.1.0",
49
+ "cosmiconfig": "^9.0.0",
50
+ "deepmerge": "^4.3.1",
51
+ "execa": "^9.5.2",
52
+ "handlebars": "^4.7.8",
53
+ "inquirer": "^12.4.2",
54
+ "yaml": "^2.7.0"
55
+ },
56
+ "devDependencies": {
57
+ "@types/node": "^22.13.10",
58
+ "tsup": "^8.4.0",
59
+ "typescript": "^5.8.2",
60
+ "vitest": "^3.0.9"
61
+ },
62
+ "engines": {
63
+ "node": ">=18"
64
+ }
65
+ }
@@ -0,0 +1,10 @@
1
+ # Karpathy Guidelines
2
+
3
+ Follow these four principles when writing and reviewing code:
4
+
5
+ 1. **Think before coding** — Understand the problem, constraints, and edge cases before implementing.
6
+ 2. **Simplicity first** — Prefer the smallest correct solution. Avoid premature abstraction.
7
+ 3. **Read before write** — Inspect existing code, conventions, and dependencies before adding new code.
8
+ 4. **Verify your work** — Run tests, linters, and manual checks. Fix issues before considering the task done.
9
+
10
+ When uncertain, ask clarifying questions rather than guessing.
@@ -0,0 +1,16 @@
1
+ ---
2
+ description: Andrej Karpathy coding guidelines — four core principles for AI-assisted development
3
+ globs:
4
+ alwaysApply: true
5
+ ---
6
+
7
+ # Karpathy Guidelines
8
+
9
+ Follow these four principles when writing and reviewing code:
10
+
11
+ 1. **Think before coding** — Understand the problem, constraints, and edge cases before implementing.
12
+ 2. **Simplicity first** — Prefer the smallest correct solution. Avoid premature abstraction.
13
+ 3. **Read before write** — Inspect existing code, conventions, and dependencies before adding new code.
14
+ 4. **Verify your work** — Run tests, linters, and manual checks. Fix issues before considering the task done.
15
+
16
+ When uncertain, ask clarifying questions rather than guessing.
@@ -0,0 +1,10 @@
1
+ # Karpathy Guidelines
2
+
3
+ Follow these four principles when writing and reviewing code:
4
+
5
+ 1. **Think before coding** — Understand the problem, constraints, and edge cases before implementing.
6
+ 2. **Simplicity first** — Prefer the smallest correct solution. Avoid premature abstraction.
7
+ 3. **Read before write** — Inspect existing code, conventions, and dependencies before adding new code.
8
+ 4. **Verify your work** — Run tests, linters, and manual checks. Fix issues before considering the task done.
9
+
10
+ When uncertain, ask clarifying questions rather than guessing.
@@ -0,0 +1,46 @@
1
+ # {{projectName}} — AI Agent Working Guide
2
+
3
+ ## Project Overview
4
+
5
+ - **Package manager**: {{packageManager}}
6
+ - **Framework**: {{framework}}
7
+ - **Language**: {{language}}
8
+ - **Monorepo**: {{monorepo}}
9
+
10
+ ## Workspaces
11
+
12
+ {{workspaces}}
13
+
14
+ ## Common Commands
15
+
16
+ {{scripts}}
17
+
18
+ ## Structure
19
+
20
+ [NEEDS LLM INPUT]
21
+
22
+ ## Conventions
23
+
24
+ [NEEDS LLM INPUT]
25
+
26
+ ## Routing
27
+
28
+ [NEEDS LLM INPUT]
29
+
30
+ ## Mini Program Info
31
+
32
+ [NEEDS LLM INPUT]
33
+
34
+ ## Bundle Size
35
+
36
+ [NEEDS LLM INPUT]
37
+
38
+ ## Development Constraints
39
+
40
+ [NEEDS LLM INPUT]
41
+
42
+ ## AI Working Guide
43
+
44
+ {{gitnexus_condition}}
45
+
46
+ - Graph last refreshed: not initialized
@@ -0,0 +1,46 @@
1
+ # {{projectName}} — AI Agent 工作指南
2
+
3
+ ## 项目概览
4
+
5
+ - **包管理**: {{packageManager}}
6
+ - **框架**: {{framework}}
7
+ - **语言**: {{language}}
8
+ - **Monorepo**: {{monorepo}}
9
+
10
+ ## 工作区
11
+
12
+ {{workspaces}}
13
+
14
+ ## 常用命令
15
+
16
+ {{scripts}}
17
+
18
+ ## 结构
19
+
20
+ [NEEDS LLM INPUT]
21
+
22
+ ## 规范
23
+
24
+ [NEEDS LLM INPUT]
25
+
26
+ ## 路由
27
+
28
+ [NEEDS LLM INPUT]
29
+
30
+ ## 小程序信息
31
+
32
+ [NEEDS LLM INPUT]
33
+
34
+ ## 包体积
35
+
36
+ [NEEDS LLM INPUT]
37
+
38
+ ## 开发约束
39
+
40
+ [NEEDS LLM INPUT]
41
+
42
+ ## AI 工作指南
43
+
44
+ {{gitnexus_condition}}
45
+
46
+ - 图谱最后刷新时间: 未初始化