@superspec/cli 1.1.1 → 1.2.1
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 +21 -0
- package/README.md +374 -0
- package/dist/cli/index.js +763 -683
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +30 -30
- package/dist/index.js +275 -301
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/prompts/agents.md +35 -17
- package/prompts/rules.md +48 -27
- package/templates/en/checklist.md +31 -8
- package/templates/en/commands/ss-checklist.md +11 -6
- package/templates/en/commands/ss-create.md +35 -9
- package/templates/en/commands/ss-resume.md +18 -5
- package/templates/en/commands/ss-tasks.md +3 -2
- package/templates/en/proposal.md +14 -2
- package/templates/zh/checklist.md +31 -8
- package/templates/zh/commands/ss-checklist.md +11 -6
- package/templates/zh/commands/ss-create.md +34 -8
- package/templates/zh/commands/ss-resume.md +18 -5
- package/templates/zh/commands/ss-tasks.md +3 -2
- package/templates/zh/proposal.md +14 -2
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/commands/init.ts","../../src/core/config.ts","../../src/core/template.ts","../../src/utils/paths.ts","../../src/utils/fs.ts","../../src/utils/git.ts","../../src/prompts/index.ts","../../src/ui/index.ts","../../src/commands/create.ts","../../src/utils/date.ts","../../src/utils/template.ts","../../src/commands/archive.ts","../../src/commands/update.ts","../../src/commands/lint.ts","../../src/core/lint.ts","../../src/commands/validate.ts","../../src/core/validate.ts","../../src/core/frontmatter.ts","../../src/commands/search.ts","../../src/commands/deps.ts","../../src/commands/status.ts","../../src/commands/sync.ts","../../src/core/context.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from 'node:module';\nimport { program } from 'commander';\nimport { initCommand } from '../commands/init.js';\nimport { createCommand } from '../commands/create.js';\nimport { archiveCommand } from '../commands/archive.js';\nimport { updateCommand } from '../commands/update.js';\nimport { lintCommand } from '../commands/lint.js';\nimport { validateCommand } from '../commands/validate.js';\nimport { searchCommand } from '../commands/search.js';\nimport { depsListCommand, depsAddCommand, depsRemoveCommand } from '../commands/deps.js';\nimport { statusCommand, listCommand } from '../commands/status.js';\nimport { syncCommand } from '../commands/sync.js';\nimport { loadConfig } from '../core/config.js';\nimport { setLang, t } from '../ui/index.js';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('../../package.json');\n\nsetLang(loadConfig(process.cwd(), true).lang);\n\nprogram.name('superspec').description(t('Spec-driven development for AI coding assistants', 'AI 编码助手的规格驱动开发工具')).version(pkg.version);\n\nprogram\n .command('init')\n .description(t('Initialize SuperSpec in current project', '初始化 SuperSpec 到当前项目'))\n .option('--ai <agent>', t('AI assistant type: claude, cursor, qwen, opencode, codex, codebuddy, qoder', 'AI 助手类型: claude, cursor, qwen, opencode, codex, codebuddy, qoder'), 'cursor')\n .option('--lang <lang>', t('Template language: zh, en', '模板语言: zh, en'), 'en')\n .option('--force', t('Force overwrite existing config', '强制覆盖已有配置'))\n .option('--no-git', t('Skip git initialization', '跳过 git 初始化'))\n .action(initCommand);\n\nprogram\n .command('create <feature>')\n .description(t('Create change and generate proposal (-b boost mode)', '创建变更并生成 proposal(-b 增强模式)'))\n .option('-b, --boost', t('Boost mode, also generate spec + checklist', '增强模式,额外生成 spec + checklist'))\n .option('-c, --creative', t('Creative mode, encourage new approaches', '创造模式,鼓励探索新方案'))\n .option('-d, --description <desc>', t('Change description for context', '变更描述,用于生成上下文'))\n .option('--spec-dir <dir>', t('Custom spec folder name', '自定义 spec 文件夹名称'))\n .option('--no-branch', t('Skip git branch creation', '不创建 git 分支'))\n .option('--intent-type <type>', t('Intent type: feature, hotfix, bugfix, refactor, chore', '意图类型:feature, hotfix, bugfix, refactor, chore'))\n .option('--branch-prefix <prefix>', t('Custom branch prefix', '自定义分支前缀'))\n .option('--branch-template <template>', t('Branch name template: {prefix}{date}-{feature}-{user}', '分支名称模板:{prefix}-{date}-{feature}-{user}'))\n .option('--change-name-template <template>', t('Folder name template: {date}-{feature}-{user}', '文件夹名称模板:{date}-{feature}-{user}'))\n .option('--user <user>', t('Developer identifier (e.g. jay)', '开发者标识(如 jay)'))\n .option('--lang <lang>', t('SDD document language: zh, en', 'SDD 文档语言: zh, en'))\n .action(createCommand);\n\nprogram\n .command('archive [name]')\n .description(t('Archive completed changes', '归档已完成的变更'))\n .option('--all', t('Archive all completed changes', '归档所有已完成的变更'))\n .action(archiveCommand);\n\nprogram.command('update').description(t('Refresh agent instructions and templates', '刷新 agent 指令和模板')).action(updateCommand);\n\nprogram\n .command('lint [name]')\n .description(t('Check artifact line limits', '检查 artifact 行数是否超限'))\n .action(lintCommand);\n\nprogram\n .command('validate [name]')\n .description(t('Cross-validate artifact consistency', '交叉验证 artifact 一致性'))\n .option('--check-deps', t('Also check dependency consistency', '同时检查依赖一致性'))\n .action(validateCommand);\n\nprogram\n .command('search <query>')\n .description(t('Search change contents', '搜索变更内容'))\n .option('--archived', t('Include archived changes', '包含已归档的变更'))\n .option('--artifact <type>', t('Filter by artifact type (proposal/spec/tasks/clarify/checklist)', '按 artifact 类型过滤 (proposal/spec/tasks/clarify/checklist)'))\n .option('--limit <n>', t('Max results to show (default: 50)', '最大显示结果数(默认 50)'))\n .option('-E, --regex', t('Use regex pattern matching', '使用正则表达式匹配'))\n .action(searchCommand);\n\nconst deps = program.command('deps').description(t('Manage spec dependencies', '管理 spec 依赖'));\n\ndeps\n .command('list [name]')\n .description(t('View dependency graph', '查看依赖关系'))\n .action(depsListCommand);\n\ndeps\n .command('add <name>')\n .description(t('Add spec dependency', '添加 spec 依赖'))\n .requiredOption('--on <other>', t('Dependency spec name', '依赖的 spec 名称'))\n .action(depsAddCommand);\n\ndeps\n .command('remove <name>')\n .description(t('Remove spec dependency', '移除 spec 依赖'))\n .requiredOption('--on <other>', t('Dependency to remove', '要移除的依赖名称'))\n .action(depsRemoveCommand);\n\nprogram\n .command('status')\n .description(t('View all change statuses', '查看所有变更状态'))\n .action(statusCommand);\n\nprogram\n .command('list')\n .description(t('List change names (for scripting)', '列出变更名称(用于脚本)'))\n .option('--archived', t('Include archived changes', '包含已归档的变更'))\n .action(listCommand);\n\nprogram\n .command('sync [name]')\n .description(t('Sync git changes to context.md', '同步 git 变更到 context.md'))\n .option('--base <branch>', t('Base branch (default: main/master)', '基准分支(默认 main/master)'))\n .option('--no-git', t('Skip git diff collection', '不收集 git diff 信息'))\n .action(syncCommand);\n\nprogram.parse();\n","import { existsSync, writeFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { getDefaultConfig } from '../core/config.js';\nimport { copyTemplate } from '../core/template.js';\nimport { ensureDir } from '../utils/fs.js';\nimport { isGitRepo } from '../utils/git.js';\nimport { installRules, installAgentsMd, installCommands, AI_EDITORS, type AIEditor } from '../prompts/index.js';\nimport { log, symbol, printLogo, printSummary, theme, t, setLang } from '../ui/index.js';\n\nexport interface InitOptions {\n ai: string;\n lang: string;\n force?: boolean;\n git?: boolean;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const configPath = join(cwd, 'superspec.config.json');\n\n if (existsSync(configPath) && !options.force) {\n log.warn(`${symbol.warn} ${t('superspec.config.json already exists, use --force to overwrite', 'superspec.config.json 已存在,使用 --force 覆盖')}`);\n return;\n }\n\n const lang = options.lang || 'zh';\n setLang(lang as 'zh' | 'en');\n\n printLogo('small');\n console.log(theme.dim(' Spec-Driven Development Toolkit\\n'));\n\n const config = getDefaultConfig();\n config.lang = lang as 'zh' | 'en';\n\n const aiEditor = options.ai as AIEditor;\n if (aiEditor && AI_EDITORS[aiEditor]) {\n config.aiEditor = aiEditor;\n }\n\n const specDir = join(cwd, config.specDir);\n\n const existingFiles = readdirSync(cwd).filter(f => !f.startsWith('.') && f !== 'node_modules');\n if (existingFiles.length > 0 && !options.force) {\n log.warn(`${symbol.warn} ${t(`current directory is not empty (${existingFiles.length} items)`, `当前目录非空(${existingFiles.length} 项)`)}`);\n log.dim(` ${t('template files will be merged with existing content', '模板文件将与现有内容合并')}`);\n console.log();\n }\n\n log.section(t('Creating Configuration', '创建配置'));\n writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n log.success(`${symbol.file} superspec.config.json`);\n\n log.section(t('Creating Directory Structure', '创建目录结构'));\n ensureDir(join(specDir, 'changes'));\n ensureDir(join(specDir, 'templates'));\n log.success(`${symbol.folder} ${config.specDir}/changes/`);\n log.success(`${symbol.folder} ${config.specDir}/templates/`);\n\n log.section(t('Installing Templates', '安装模板'));\n const templateNames = Object.values(config.templates).map((v) => (v.endsWith('.md') ? v : `${v}.md`));\n for (const tpl of templateNames) {\n try {\n copyTemplate(tpl, join(specDir, 'templates', tpl), lang);\n } catch {\n // skip missing templates\n }\n }\n log.success(`${symbol.ok} ${templateNames.length} ${t('templates', '个模板')} (${lang})`);\n\n log.section(t('Installing AI Agent Files', '安装 AI Agent 文件'));\n installAgentsMd(cwd);\n\n if (aiEditor && AI_EDITORS[aiEditor]) {\n installRules(cwd, aiEditor);\n installCommands(cwd, aiEditor, lang);\n }\n\n if (options.git !== false && !isGitRepo()) {\n execSync('git init', { cwd, stdio: 'inherit' });\n log.success(`${symbol.git} git init`);\n }\n\n console.log();\n printSummary([\n { label: 'Config', value: 'superspec.config.json' },\n { label: 'Spec dir', value: `${config.specDir}/` },\n { label: 'AI agent', value: options.ai },\n { label: 'Language', value: lang },\n ]);\n\n log.done(t('SuperSpec initialized successfully!', 'SuperSpec 初始化成功!'));\n log.dim(`${t('Next', '下一步')}: superspec create <feature>`);\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type Strategy = 'follow' | 'create';\nexport type AIEditorType = 'claude' | 'cursor' | 'qwen' | 'opencode' | 'codex' | 'codebuddy' | 'qoder';\n\nexport interface SuperSpecConfig {\n lang: 'zh' | 'en';\n aiEditor: AIEditorType;\n specDir: string;\n branchPrefix: string;\n branchTemplate: string;\n changeNameTemplate: string;\n boost: boolean;\n strategy: Strategy;\n context: string[];\n templates: Record<string, string>;\n archive: {\n dir: string;\n datePrefix: boolean;\n };\n limits: {\n targetLines: number;\n hardLines: number;\n };\n artifacts: string[];\n boostArtifacts: string[];\n}\n\nconst DEFAULT_CONFIG: SuperSpecConfig = {\n lang: 'en',\n aiEditor: 'cursor',\n specDir: 'superspec',\n branchPrefix: '',\n branchTemplate: '{prefix}{intentType}-{date}-{feature}-{user}',\n changeNameTemplate: '{prefix}{intentType}-{date}-{feature}-{user}',\n boost: false,\n strategy: 'follow',\n context: [],\n templates: {\n spec: 'spec.md',\n proposal: 'proposal.md',\n tasks: 'tasks.md',\n clarify: 'clarify.md',\n checklist: 'checklist.md',\n design: 'design.md'\n },\n archive: {\n dir: 'archive',\n datePrefix: true,\n },\n limits: {\n targetLines: 300,\n hardLines: 400,\n },\n artifacts: ['proposal'],\n boostArtifacts: ['proposal', 'spec', 'design', 'tasks', 'checklist'],\n};\n\nexport function loadConfig(projectRoot: string = process.cwd(), silent: boolean = false): SuperSpecConfig {\n const configPath = join(projectRoot, 'superspec.config.json');\n let userConfig: Partial<SuperSpecConfig> = {};\n\n if (existsSync(configPath)) {\n try {\n userConfig = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch (e: any) {\n if (!silent) {\n console.warn(`⚠ Config file parsing failed: ${e.message}`);\n }\n }\n }\n\n return deepMerge(DEFAULT_CONFIG, userConfig) as SuperSpecConfig;\n}\n\nexport function getDefaultConfig(): SuperSpecConfig {\n return structuredClone(DEFAULT_CONFIG);\n}\n\nfunction deepMerge(target: Record<string, any>, source: Record<string, any>): Record<string, any> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n const val = source[key];\n if (val === null || val === undefined) continue;\n if (\n typeof val === 'object' &&\n !Array.isArray(val) &&\n target[key] &&\n typeof target[key] === 'object'\n ) {\n result[key] = deepMerge(target[key], val);\n } else {\n result[key] = val;\n }\n }\n return result;\n}\n","import { existsSync, copyFileSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { getPackageRoot } from '../utils/paths.js';\nimport { ensureDir } from '../utils/fs.js';\n\nexport function resolveTemplatePath(templateName: string, lang: string = 'zh'): string {\n const root = getPackageRoot();\n const langPath = join(root, 'templates', lang, templateName);\n if (existsSync(langPath)) return langPath;\n const fallbackLang = lang === 'zh' ? 'en' : 'zh';\n const fallback = join(root, 'templates', fallbackLang, templateName);\n if (existsSync(fallback)) return fallback;\n throw new Error(`Template not found: ${templateName} (lang: ${lang})`);\n}\n\nexport function copyTemplate(templateName: string, destPath: string, lang: string = 'zh'): void {\n const srcPath = resolveTemplatePath(templateName, lang);\n ensureDir(dirname(destPath));\n copyFileSync(srcPath, destPath);\n}\n\n/**\n * Simple template engine supporting:\n * - {{variable}} - variable substitution\n * - {{#if variable}}...{{/if}} - conditional blocks (shown if variable is truthy)\n */\nexport function renderTemplate(templateName: string, vars: Record<string, string> = {}, lang: string = 'zh'): string {\n const srcPath = resolveTemplatePath(templateName, lang);\n let content = readFileSync(srcPath, 'utf-8');\n\n // Process conditionals first: {{#if variable}}...{{/if}}\n content = processConditionals(content, vars);\n\n // Process simple variable substitution: {{variable}}\n for (const [key, value] of Object.entries(vars)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n\n return content;\n}\n\nfunction processConditionals(content: string, vars: Record<string, string>): string {\n // Match {{#if variable}}...{{/if}} patterns\n const ifRegex = /\\{\\{#if\\s+(\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g;\n\n return content.replace(ifRegex, (match, varName, innerContent) => {\n const value = vars[varName];\n // Show content if variable exists and is not empty\n if (value && value.trim() !== '') {\n return innerContent;\n }\n return '';\n });\n}\n\nexport function writeRenderedTemplate(\n templateName: string,\n destPath: string,\n vars: Record<string, string> = {},\n lang: string = 'zh',\n): void {\n const content = renderTemplate(templateName, vars, lang);\n ensureDir(dirname(destPath));\n writeFileSync(destPath, content, 'utf-8');\n}\n","import { dirname, join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\n\nexport function getPackageRoot(): string {\n const __filename = fileURLToPath(import.meta.url);\n let dir = dirname(__filename);\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, 'package.json')) && existsSync(join(dir, 'templates'))) {\n return dir;\n }\n dir = dirname(dir);\n }\n return join(dirname(__filename), '..', '..');\n}\n","import { mkdirSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function resolveChangeNames(changesDir: string, name: string | undefined, archiveDirName: string): string[] {\n if (!existsSync(changesDir)) return [];\n if (name) return [name];\n return readdirSync(changesDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name !== archiveDirName)\n .map((e) => e.name);\n}\n","import { execSync } from 'node:child_process';\n\nconst GIT_TIMEOUT = 10_000;\n\nexport function isGitRepo(): boolean {\n try {\n execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore', timeout: GIT_TIMEOUT });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getCurrentBranch(): string | null {\n try {\n return execSync('git branch --show-current', { encoding: 'utf-8', timeout: GIT_TIMEOUT }).trim();\n } catch {\n return null;\n }\n}\n\nconst SAFE_BRANCH_RE = /^[a-zA-Z0-9._\\-/]+$/;\n\nexport function createBranch(branchName: string): void {\n if (!SAFE_BRANCH_RE.test(branchName)) {\n throw new Error(`invalid branch name: ${branchName}`);\n }\n execSync(`git checkout -b ${branchName}`, { stdio: 'inherit', timeout: GIT_TIMEOUT });\n}\n\nexport function getDefaultBranch(): string {\n try {\n const ref = execSync('git symbolic-ref refs/remotes/origin/HEAD', { encoding: 'utf-8', timeout: GIT_TIMEOUT }).trim();\n return ref.replace('refs/remotes/origin/', '');\n } catch {\n try {\n execSync('git rev-parse --verify main', { stdio: 'ignore', timeout: GIT_TIMEOUT });\n return 'main';\n } catch {\n return 'master';\n }\n }\n}\n\nexport interface GitChange {\n status: string;\n file: string;\n}\n\nexport function getDiffFiles(base?: string): GitChange[] {\n const baseBranch = base || getDefaultBranch();\n try {\n const mergeBase = execSync(`git merge-base ${baseBranch} HEAD`, { encoding: 'utf-8', timeout: GIT_TIMEOUT }).trim();\n const output = execSync(`git diff --name-status ${mergeBase}`, { encoding: 'utf-8', timeout: 30_000 }).trim();\n if (!output) return [];\n return output.split('\\n').map((line) => {\n const [status, ...parts] = line.split('\\t');\n return { status: status.charAt(0), file: parts.join('\\t') };\n });\n } catch {\n return [];\n }\n}\n","import { existsSync, readFileSync, writeFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getPackageRoot } from '../utils/paths.js';\nimport { ensureDir } from '../utils/fs.js';\nimport { log, symbol } from '../ui/index.js';\n\n// Supported AI editors configuration\nexport const AI_EDITORS = {\n claude: {\n commands: '.claude/commands',\n rules: null, // Claude doesn't use rules files\n },\n cursor: {\n commands: '.cursor/commands',\n rules: '.cursor/rules',\n rulesFile: 'superspec.mdc',\n },\n qwen: {\n commands: '.qwen/commands',\n rules: '.qwen/rules',\n rulesFile: 'superspec.md',\n },\n opencode: {\n commands: '.opencode/commands',\n rules: null,\n },\n codex: {\n commands: '.codex/commands',\n rules: null,\n },\n codebuddy: {\n commands: '.codebuddy/commands',\n rules: '.codebuddy/rules',\n rulesFile: 'superspec.md',\n },\n qoder: {\n commands: '.qoder/commands',\n rules: '.qoder/rules',\n rulesFile: 'superspec.md',\n },\n} as const;\n\nexport type AIEditor = keyof typeof AI_EDITORS;\n\n/**\n * Install rules file for a specific AI editor\n */\nexport function installRules(cwd: string, editor: AIEditor): void {\n const config = AI_EDITORS[editor];\n\n // Skip if this editor doesn't use rules files\n if (!config.rules) {\n return;\n }\n\n const rulesDir = join(cwd, config.rules);\n ensureDir(rulesDir);\n\n const promptSrc = join(getPackageRoot(), 'prompts', 'rules.md');\n if (existsSync(promptSrc)) {\n const content = readFileSync(promptSrc, 'utf-8');\n const rulesFile = 'rulesFile' in config ? config.rulesFile : 'superspec.md';\n const destPath = join(rulesDir, rulesFile as string);\n writeFileSync(destPath, content, 'utf-8');\n log.success(`${symbol.ok} ${config.rules}/${rulesFile}`);\n }\n}\n\nconst SS_START = '<!-- superspec:start -->';\nconst SS_END = '<!-- superspec:end -->';\n\nexport function installAgentsMd(cwd: string): void {\n const agentsMdPath = join(cwd, 'AGENTS.md');\n const agentPromptSrc = join(getPackageRoot(), 'prompts', 'agents.md');\n\n if (!existsSync(agentPromptSrc)) return;\n\n const newContent = readFileSync(agentPromptSrc, 'utf-8');\n const wrapped = `${SS_START}\\n${newContent}\\n${SS_END}`;\n\n if (existsSync(agentsMdPath)) {\n const existing = readFileSync(agentsMdPath, 'utf-8');\n const startIdx = existing.indexOf(SS_START);\n const endIdx = existing.indexOf(SS_END);\n\n if (startIdx !== -1 && endIdx !== -1) {\n const before = existing.slice(0, startIdx);\n const after = existing.slice(endIdx + SS_END.length);\n writeFileSync(agentsMdPath, before + wrapped + after, 'utf-8');\n } else if (existing.includes('SuperSpec')) {\n writeFileSync(agentsMdPath, existing, 'utf-8');\n } else {\n writeFileSync(agentsMdPath, existing + '\\n\\n' + wrapped, 'utf-8');\n }\n } else {\n writeFileSync(agentsMdPath, wrapped, 'utf-8');\n }\n log.success(`${symbol.ok} AGENTS.md`);\n}\n\n/**\n * Install commands for a specific AI editor\n */\nexport function installCommands(cwd: string, editor: AIEditor, lang: string = 'zh'): void {\n const config = AI_EDITORS[editor];\n const commandsDir = join(cwd, config.commands);\n ensureDir(commandsDir);\n\n // Copy command templates from templates/{lang}/commands/\n const templatesDir = join(getPackageRoot(), 'templates', lang, 'commands');\n const fallbackDir = join(getPackageRoot(), 'templates', 'zh', 'commands');\n const sourceDir = existsSync(templatesDir) ? templatesDir : fallbackDir;\n\n if (!existsSync(sourceDir)) {\n log.warn(`${symbol.warn} Commands templates not found: ${sourceDir}`);\n return;\n }\n\n const commandFiles = readdirSync(sourceDir).filter(f => f.endsWith('.md'));\n\n for (const file of commandFiles) {\n const srcPath = join(sourceDir, file);\n const destPath = join(commandsDir, file);\n const content = readFileSync(srcPath, 'utf-8');\n writeFileSync(destPath, content, 'utf-8');\n }\n\n log.success(`${symbol.ok} ${config.commands}/ (${commandFiles.length} commands)`);\n}\n\n/**\n * Install commands for all supported AI editors\n */\nexport function installAllCommands(cwd: string, lang: string = 'zh'): void {\n for (const editor of Object.keys(AI_EDITORS) as AIEditor[]) {\n installCommands(cwd, editor, lang);\n }\n}\n","import chalk from 'chalk';\n\nexport const theme = {\n primary: chalk.hex('#6366f1'),\n success: chalk.hex('#22c55e'),\n warning: chalk.hex('#f59e0b'),\n error: chalk.hex('#ef4444'),\n info: chalk.hex('#3b82f6'),\n boost: chalk.hex('#a855f7'),\n dim: chalk.hex('#6b7280'),\n highlight: chalk.hex('#f472b6'),\n border: chalk.hex('#374151'),\n gradient1: chalk.hex('#818cf8'),\n gradient2: chalk.hex('#6366f1'),\n gradient3: chalk.hex('#4f46e5'),\n};\n\n// ASCII Art Logo for SuperSpec (S-U-P-E-R-S-P-E-C)\nexport const logo = {\n small: `\n${theme.gradient1(' ███████╗██╗ ██╗██████╗ ███████╗██████╗ ███████╗██████╗ ███████╗ ██████╗')}\n${theme.gradient2(' ██╔════╝██║ ██║██╔══██╗██╔════╝██╔══██╗██╔════╝██╔══██╗██╔════╝██╔════╝')}\n${theme.gradient3(' ███████╗██║ ██║██████╔╝█████╗ ██████╔╝███████╗██████╔╝█████╗ ██║ ')}\n${theme.gradient2(' ╚════██║██║ ██║██╔═══╝ ██╔══╝ ██╔══██╗╚════██║██╔═══╝ ██╔══╝ ██║ ')}\n${theme.gradient1(' ███████║╚██████╔╝██║ ███████╗██║ ██║███████║██║ ███████╗╚██████╗')}\n${theme.gradient1(' ╚══════╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚══════╝ ╚═════╝')}\n `,\n tiny: `\n${theme.gradient1(' ███████╗██╗ ██╗██████╗ ███████╗██████╗ ███████╗██████╗ ███████╗ ██████╗')}\n${theme.gradient2(' ╚═════╗██║ ██║██╔══██║██╔════╝██╔══██╗╚═════╗██╔══██║██╔════╝██╔════╝')}\n${theme.gradient3(' ███████║██║ ██║██████╔╝█████╗ ██████╔╝███████║██████╔╝█████╗ ██║ ')} ${theme.highlight('Spec-Driven Development')}\n${theme.gradient2(' ╚════██║██║ ██║██╔═══╝ ██╔══╝ ██╔══██╗╚════██║██╔═══╝ ██╔══╝ ██║ ')}\n${theme.gradient1(' ███████║╚██████╔╝██║ ███████╗██║ ██║███████║██║ ███████╗╚██████╗')}\n${theme.gradient1(' ╚══════╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚══════╝ ╚═════╝')}\n `,\n};\n\nconst box = {\n topLeft: '╭',\n topRight: '╮',\n bottomLeft: '╰',\n bottomRight: '╯',\n horizontal: '─',\n vertical: '│',\n};\n\nfunction boxText(text: string, width: number = 50): string {\n const padding = ' '.repeat(Math.max(0, width - text.length - 4));\n return `${theme.border(box.vertical)} ${theme.highlight(text)}${padding} ${theme.border(box.vertical)}`;\n}\n\nfunction createBox(lines: string[], width: number = 52): string {\n const top = theme.border(`${box.topLeft}${box.horizontal.repeat(width - 2)}${box.topRight}`);\n const bottom = theme.border(`${box.bottomLeft}${box.horizontal.repeat(width - 2)}${box.bottomRight}`);\n const middle = lines.map(line => boxText(line, width));\n return [top, ...middle, bottom].join('\\n');\n}\n\nexport const log = {\n info: (msg: string) => console.log(theme.info(msg)),\n success: (msg: string) => console.log(theme.success(msg)),\n warn: (msg: string) => console.log(theme.warning(msg)),\n error: (msg: string) => console.log(theme.error(msg)),\n dim: (msg: string) => console.log(theme.dim(msg)),\n boost: (msg: string) => console.log(theme.boost(msg)),\n highlight: (msg: string) => console.log(theme.highlight(msg)),\n title: (msg: string) => {\n console.log();\n console.log(createBox([msg]));\n console.log();\n },\n section: (msg: string) => {\n console.log();\n console.log(theme.primary(`◆ ${msg}`));\n console.log(theme.border('─'.repeat(50)));\n },\n done: (msg: string) => {\n console.log();\n console.log(theme.success(`✨ ${msg}`));\n console.log();\n },\n};\n\nexport const symbol = {\n start: theme.primary('◆'),\n ok: theme.success('✓'),\n fail: theme.error('✗'),\n warn: theme.warning('⚠'),\n bolt: theme.boost('⚡'),\n arrow: theme.dim('→'),\n bullet: theme.dim('•'),\n sparkle: theme.highlight('✨'),\n folder: theme.primary('📁'),\n file: theme.info('📄'),\n git: theme.warning('🌿'),\n ai: theme.boost('🤖'),\n info: theme.info('ℹ'),\n} as const;\n\n// Helper to print the logo\nexport function printLogo(size: 'small' | 'tiny' = 'small'): void {\n console.log(logo[size]);\n}\n\nlet _lang: 'zh' | 'en' = 'en';\n\nexport function setLang(lang: 'zh' | 'en'): void {\n _lang = lang;\n}\n\nexport function t(en: string, zh: string): string {\n return _lang === 'zh' ? zh : en;\n}\n\n// Helper to print a summary box\nexport function printSummary(items: { label: string; value: string }[]): void {\n const maxLabel = Math.max(...items.map(i => i.label.length));\n const width = 50;\n\n console.log(theme.border('╭' + '─'.repeat(width - 2) + '╮'));\n for (const { label, value } of items) {\n const padding = ' '.repeat(maxLabel - label.length);\n const line = `${theme.dim(label)}${padding} ${symbol.arrow} ${theme.highlight(value)}`;\n // Strip ANSI codes for length calculation\n const plainLine = line.replace(/\\u001b\\[\\d+(?:;\\d+)*m/g, '');\n const rightPad = ' '.repeat(Math.max(0, width - plainLine.length - 4));\n console.log(theme.border('│ ') + line + rightPad + theme.border(' │'));\n }\n console.log(theme.border('╰' + '─'.repeat(width - 2) + '╯'));\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { writeRenderedTemplate } from '../core/template.js';\nimport { ensureDir, getDateString, renderNameTemplate, detectLang, type NameTemplateVars } from '../utils/index.js';\nimport { isGitRepo, createBranch } from '../utils/git.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nexport interface CreateOptions {\n boost?: boolean;\n creative?: boolean;\n user?: string;\n lang?: string;\n branch?: boolean;\n specDir?: string;\n branchPrefix?: string;\n branchTemplate?: string;\n changeNameTemplate?: string;\n description?: string;\n intentType?: string;\n}\n\nexport async function createCommand(feature: string, options: CreateOptions): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n\n const specDir = options.specDir || config.specDir;\n const branchPrefix = options.branchPrefix || config.branchPrefix;\n const boost = options.boost || config.boost;\n const strategy = options.creative ? 'create' : config.strategy;\n const description = options.description || '';\n const lang = options.lang || config.lang || 'en';\n\n const templateVars: NameTemplateVars = {\n prefix: branchPrefix,\n intentType: options.intentType,\n feature,\n date: getDateString(),\n user: options.user,\n };\n\n const changeNameTemplate = options.changeNameTemplate || config.changeNameTemplate || '{date}-{feature}';\n const changeFolderName = renderNameTemplate(changeNameTemplate, templateVars, false);\n const changePath = join(cwd, specDir, 'changes', changeFolderName);\n\n if (existsSync(changePath)) {\n log.warn(`${symbol.warn} ${t(`change \"${changeFolderName}\" already exists`, `变更 \"${changeFolderName}\" 已存在`)}: ${changePath}`);\n return;\n }\n\n log.title(`${t('Creating Change', '创建变更')}: ${changeFolderName}`);\n if (options.intentType) {\n log.info(`${t('Intent Type', '意图类型')}: ${options.intentType}`);\n }\n\n if (boost) {\n log.boost(`${symbol.bolt} ${t('Boost mode enabled', '增强模式已启用')}`);\n }\n if (strategy === 'create') {\n log.boost(`${symbol.bolt} ${t('Creative mode: exploring new solutions', '创造模式:探索新方案')}`);\n }\n\n ensureDir(changePath);\n\n const vars: Record<string, string> = {\n name: changeFolderName,\n date: templateVars.date,\n boost: boost ? 'true' : 'false',\n strategy,\n description,\n };\n\n const artifacts = boost ? config.boostArtifacts : config.artifacts;\n\n log.section(t('Generating Artifacts', '生成 Artifacts'));\n for (const artifact of artifacts) {\n const templateFile = config.templates[artifact] || `${artifact}.md`;\n const destPath = join(changePath, `${artifact}.md`);\n try {\n writeRenderedTemplate(templateFile, destPath, vars, lang);\n log.success(`${symbol.ok} ${artifact}.md`);\n } catch (e: any) {\n log.error(`${symbol.fail} ${artifact}.md: ${e.message}`);\n }\n }\n\n if (options.branch !== false && isGitRepo()) {\n const branchTemplate = options.branchTemplate || config.branchTemplate || '{prefix}{date}-{feature}';\n const branchName = renderNameTemplate(branchTemplate, templateVars, true);\n try {\n createBranch(branchName);\n log.success(`${symbol.ok} Branch: ${branchName}`);\n } catch (e: any) {\n log.warn(`${symbol.warn} ${t('branch creation failed', '分支创建失败')}: ${e.message}`);\n }\n }\n\n log.done(t('Change created successfully!', '变更创建成功!'));\n log.dim(`${t('Path', '路径')}: ${specDir}/changes/${changeFolderName}/`);\n\n if (boost) {\n log.dim(`${t('Workflow', '工作流')}: /ss-create → /ss-tasks → /ss-apply (boost)`);\n } else {\n log.dim(`${t('Workflow', '工作流')}: /ss-tasks → /ss-apply`);\n }\n\n log.dim(`${t('Next', '下一步')}: superspec lint ${changeFolderName}`);\n}\n","export function getDateString(): string {\n const d = new Date();\n return `${d.getFullYear()}${String(d.getMonth() + 1).padStart(2, '0')}${String(d.getDate()).padStart(2, '0')}`;\n}\n","const CJK_REGEX = /[\\u4e00-\\u9fff\\u3400-\\u4dbf\\u{20000}-\\u{2a6df}\\u{2a700}-\\u{2b73f}]/u;\n\nexport function detectLang(...inputs: (string | undefined)[]): 'zh' | 'en' | undefined {\n for (const text of inputs) {\n if (text && CJK_REGEX.test(text)) return 'zh';\n }\n return undefined;\n}\n\nexport interface NameTemplateVars {\n prefix?: string;\n intentType?: string;\n feature: string;\n date: string;\n user?: string;\n [key: string]: string | undefined;\n}\n\n\nexport function renderNameTemplate(template: string, vars: NameTemplateVars, strict = false): string {\n let result = template;\n\n for (const [key, value] of Object.entries(vars)) {\n if (value !== undefined) {\n result = result.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value);\n }\n }\n\n result = result.replace(/\\{[^}]+\\}/g, '');\n\n if (strict) {\n return result.replace(/[^a-zA-Z0-9._\\-/]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n }\n return result.replace(/[^\\p{L}\\p{N}._\\-/]/gu, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n}\n","import { existsSync, readdirSync, renameSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig, type SuperSpecConfig } from '../core/config.js';\nimport { ensureDir } from '../utils/fs.js';\nimport { getDateString } from '../utils/date.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nexport interface ArchiveOptions {\n all?: boolean;\n}\n\nexport async function archiveCommand(name: string | undefined, options: ArchiveOptions): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n const archiveDir = join(cwd, config.specDir, 'changes', config.archive.dir);\n\n if (!existsSync(changesDir)) {\n log.warn(`${symbol.warn} ${t('no changes directory found', '未找到 changes 目录')}`);\n return;\n }\n\n if (options.all) {\n const entries = readdirSync(changesDir, { withFileTypes: true }).filter(\n (e) => e.isDirectory() && e.name !== config.archive.dir,\n );\n\n if (entries.length === 0) {\n log.warn(`${symbol.warn} ${t('no changes to archive', '没有可归档的变更')}`);\n return;\n }\n\n log.info(`${symbol.start} ${t('archiving all changes...', '归档所有变更...')}`);\n for (const entry of entries) {\n archiveOne(entry.name, changesDir, archiveDir, config);\n }\n } else if (name) {\n const changePath = join(changesDir, name);\n if (!existsSync(changePath)) {\n log.warn(`${symbol.warn} ${t(`change \"${name}\" not found`, `变更 \"${name}\" 不存在`)}`);\n return;\n }\n log.info(`${symbol.start} ${t(`archiving: ${name}`, `归档变更: ${name}`)}`);\n archiveOne(name, changesDir, archiveDir, config);\n } else {\n log.warn(`${symbol.warn} ${t('specify a name or use --all', '请指定变更名称或使用 --all')}`);\n return;\n }\n\n log.info(`${symbol.start} ${t('archive done!', '归档完成!')}`);\n}\n\nfunction archiveOne(name: string, changesDir: string, archiveDir: string, config: SuperSpecConfig): void {\n ensureDir(archiveDir);\n const src = join(changesDir, name);\n const dateStr = config.archive.datePrefix ? `${getDateString()}-` : '';\n const dest = join(archiveDir, `${dateStr}${name}`);\n\n if (existsSync(dest)) {\n log.warn(` ${symbol.warn} ${t('archive target exists', '归档目标已存在')}: ${dest}`);\n return;\n }\n\n renameSync(src, dest);\n log.success(` ${symbol.ok} ${name} → archive/${dateStr}${name}`);\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { copyTemplate } from '../core/template.js';\nimport { ensureDir } from '../utils/fs.js';\nimport { installRules, installAgentsMd, installCommands, AI_EDITORS, type AIEditor } from '../prompts/index.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nexport async function updateCommand(): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const specDir = join(cwd, config.specDir);\n const lang = config.lang || 'zh';\n\n if (!existsSync(join(cwd, 'superspec.config.json'))) {\n log.warn(`${symbol.warn} ${t('not initialized, run superspec init first', '当前目录未初始化 SuperSpec,请先运行 superspec init')}`);\n return;\n }\n\n log.info(`${symbol.start} ${t('updating SuperSpec...', '更新 SuperSpec...')}`);\n\n const templateNames = Object.values(config.templates).map((v) => (v.endsWith('.md') ? v : `${v}.md`));\n ensureDir(join(specDir, 'templates'));\n for (const tpl of templateNames) {\n try {\n copyTemplate(tpl, join(specDir, 'templates', tpl), lang);\n } catch {\n // skip missing templates\n }\n }\n log.success(` ${symbol.ok} ${t('templates updated', '模板更新')} (${lang})`);\n\n installAgentsMd(cwd);\n\n const aiEditor = config.aiEditor as AIEditor;\n if (aiEditor && AI_EDITORS[aiEditor]) {\n installRules(cwd, aiEditor);\n installCommands(cwd, aiEditor, lang);\n }\n\n log.info(`${symbol.start} ${t('update done!', '更新完成!')}`);\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { lintChange } from '../core/lint.js';\nimport { resolveChangeNames } from '../utils/fs.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nexport async function lintCommand(name: string | undefined): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n const { targetLines, hardLines } = config.limits;\n\n const names = resolveChangeNames(changesDir, name, config.archive.dir);\n\n if (names.length === 0) {\n log.warn(`${symbol.warn} ${t('no changes to lint', '没有可检查的变更')}`);\n return;\n }\n\n let hasIssues = false;\n\n for (const n of names) {\n const changePath = join(changesDir, n);\n if (!existsSync(changePath)) {\n log.warn(`${symbol.warn} \"${n}\" ${t('not found', '未找到')}`);\n continue;\n }\n\n const results = lintChange(changePath, targetLines, hardLines);\n log.info(`${symbol.start} ${n}`);\n\n for (const r of results) {\n if (r.status === 'error') {\n log.error(` ${symbol.fail} ${r.artifact}: ${r.message}`);\n hasIssues = true;\n } else if (r.status === 'warn') {\n log.warn(` ${symbol.warn} ${r.artifact}: ${r.message}`);\n hasIssues = true;\n } else {\n log.success(` ${symbol.ok} ${r.artifact}: ${r.message}`);\n }\n }\n }\n\n if (!hasIssues) {\n log.info(`${symbol.start} ${t('all artifacts within limits', '所有 artifact 均在限制范围内')}`);\n }\n}\n","import { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join, basename } from 'node:path';\n\nexport interface LintResult {\n artifact: string;\n lines: number;\n status: 'ok' | 'warn' | 'error';\n message: string;\n}\n\nexport function lintArtifact(filePath: string, targetLines: number, hardLines: number): LintResult {\n const artifact = basename(filePath);\n if (!existsSync(filePath)) {\n return { artifact, lines: 0, status: 'ok', message: 'not found' };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n').length;\n\n if (lines > hardLines) {\n return { artifact, lines, status: 'error', message: `${lines} lines exceeds hard limit (${hardLines}). Must split.` };\n }\n if (lines > targetLines) {\n return { artifact, lines, status: 'warn', message: `${lines} lines exceeds target (${targetLines}). Consider splitting.` };\n }\n return { artifact, lines, status: 'ok', message: `${lines} lines` };\n}\n\nexport function lintChange(changePath: string, targetLines: number, hardLines: number): LintResult[] {\n if (!existsSync(changePath)) return [];\n\n const files = readdirSync(changePath).filter((f) => f.endsWith('.md'));\n return files.map((f) => lintArtifact(join(changePath, f), targetLines, hardLines));\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { validateChange, type ValidationIssue } from '../core/validate.js';\nimport { resolveChangeNames } from '../utils/fs.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nexport interface ValidateOptions {\n checkDeps?: boolean;\n}\n\nexport async function validateCommand(name: string | undefined, options: ValidateOptions): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n const names = resolveChangeNames(changesDir, name, config.archive.dir);\n\n if (names.length === 0) {\n log.warn(`${symbol.warn} ${t('no changes to validate', '没有可验证的变更')}`);\n return;\n }\n\n let totalIssues = 0;\n\n for (const n of names) {\n const changePath = join(changesDir, n);\n if (!existsSync(changePath)) {\n log.warn(`${symbol.warn} \"${n}\" ${t('not found', '未找到')}`);\n continue;\n }\n\n const issues = validateChange(changePath, options.checkDeps);\n log.info(`${symbol.start} ${n}`);\n\n if (issues.length === 0) {\n log.success(` ${symbol.ok} ${t('all checks passed', '所有检查通过')}`);\n } else {\n for (const issue of issues) {\n totalIssues++;\n if (issue.level === 'error') {\n log.error(` ${symbol.fail} [${issue.artifact}] ${issue.message}`);\n } else if (issue.level === 'warn') {\n log.warn(` ${symbol.warn} [${issue.artifact}] ${issue.message}`);\n } else {\n log.dim(` ℹ [${issue.artifact}] ${issue.message}`);\n }\n }\n }\n }\n\n if (totalIssues === 0) {\n log.success(`${symbol.ok} ${t('all validations passed', '所有验证通过')}`);\n } else {\n log.warn(`${symbol.warn} ${totalIssues} ${t('issue(s) found', '个问题')}`);\n }\n}\n","import { readFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { parseFrontmatter } from './frontmatter.js';\n\nexport interface ValidationIssue {\n level: 'error' | 'warn' | 'info';\n artifact: string;\n message: string;\n}\n\nfunction extractIds(content: string, pattern: RegExp): string[] {\n const matches = content.match(pattern);\n return matches ? [...new Set(matches)] : [];\n}\n\nexport function validateChange(changePath: string, checkDeps = false): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n const read = (name: string): string | null => {\n const p = join(changePath, name);\n return existsSync(p) ? readFileSync(p, 'utf-8') : null;\n };\n\n const proposal = read('proposal.md');\n const spec = read('spec.md');\n const tasks = read('tasks.md');\n\n if (!proposal) issues.push({ level: 'warn', artifact: 'proposal.md', message: 'missing' });\n if (!tasks) issues.push({ level: 'warn', artifact: 'tasks.md', message: 'missing' });\n\n if (proposal && spec) {\n const proposalGoals = extractIds(proposal, /US-\\d+/g);\n const specUS = extractIds(spec, /US-\\d+/g);\n for (const id of proposalGoals) {\n if (!specUS.includes(id)) {\n issues.push({ level: 'error', artifact: 'spec.md', message: `${id} from proposal not found in spec` });\n }\n }\n }\n\n if (spec && tasks) {\n const specFR = extractIds(spec, /FR-\\d+/g);\n const tasksFR = extractIds(tasks, /FR-\\d+/g);\n\n for (const id of specFR) {\n if (!tasksFR.includes(id)) {\n issues.push({ level: 'warn', artifact: 'tasks.md', message: `${id} from spec not referenced in tasks` });\n }\n }\n\n for (const id of tasksFR) {\n if (!specFR.includes(id)) {\n issues.push({ level: 'error', artifact: 'tasks.md', message: `${id} referenced but not defined in spec` });\n }\n }\n }\n\n if (spec) {\n const acIds = extractIds(spec, /AC-\\d+\\.\\d+/g);\n const frIds = extractIds(spec, /FR-\\d+/g);\n for (const ac of acIds) {\n const frNum = ac.replace('AC-', '').split('.')[0];\n const parentFR = `FR-${frNum}`;\n if (!frIds.includes(parentFR)) {\n issues.push({ level: 'warn', artifact: 'spec.md', message: `${ac} has no parent ${parentFR}` });\n }\n }\n }\n\n if (checkDeps && proposal) {\n const { meta, body } = parseFrontmatter(proposal);\n const fmDeps: string[] = Array.isArray(meta.depends_on) ? meta.depends_on : [];\n\n const contentRefs = extractIds(body, /depends[_ ]on[:\\s]+(\\S+)/gi);\n const mentioned = contentRefs.map((m) => m.replace(/depends[_ ]on[:\\s]+/i, ''));\n\n for (const dep of mentioned) {\n if (!fmDeps.includes(dep)) {\n issues.push({ level: 'warn', artifact: 'proposal.md', message: `content mentions \"${dep}\" but not in frontmatter depends_on` });\n }\n }\n\n const changesDir = join(changePath, '..');\n for (const dep of fmDeps) {\n if (!existsSync(join(changesDir, dep))) {\n issues.push({ level: 'error', artifact: 'proposal.md', message: `depends_on \"${dep}\" not found in changes` });\n }\n }\n }\n\n return issues;\n}\n","const FM_REGEX = /^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/;\n\nexport interface Frontmatter {\n [key: string]: any;\n}\n\nexport interface ParsedDoc {\n meta: Frontmatter;\n body: string;\n}\n\nexport function parseFrontmatter(content: string): ParsedDoc {\n const match = content.match(FM_REGEX);\n if (!match) {\n return { meta: {}, body: content };\n }\n\n const meta: Frontmatter = {};\n const lines = match[1].split('\\n');\n for (const line of lines) {\n const idx = line.indexOf(':');\n if (idx === -1) continue;\n const key = line.slice(0, idx).trim();\n let value: any = line.slice(idx + 1).trim();\n if (key === '') continue;\n if (value === '[]') {\n value = [];\n } else if (value.startsWith('[') && value.endsWith(']')) {\n value = value\n .slice(1, -1)\n .split(',')\n .map((s: string) => s.trim().replace(/^[\"']|[\"']$/g, ''))\n .filter(Boolean);\n } else if (value === 'true') {\n value = true;\n } else if (value === 'false') {\n value = false;\n }\n meta[key] = value;\n }\n\n return { meta, body: match[2] };\n}\n\nexport function serializeFrontmatter(meta: Frontmatter): string {\n const lines: string[] = ['---'];\n for (const [key, value] of Object.entries(meta)) {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n lines.push(`${key}: []`);\n } else {\n lines.push(`${key}: [${value.map((v: string) => `\"${v}\"`).join(', ')}]`);\n }\n } else {\n lines.push(`${key}: ${value}`);\n }\n }\n lines.push('---');\n return lines.join('\\n');\n}\n\nexport function updateFrontmatter(content: string, updates: Partial<Frontmatter>): string {\n const { meta, body } = parseFrontmatter(content);\n const merged = { ...meta, ...updates };\n return serializeFrontmatter(merged) + '\\n' + body;\n}\n\nexport function addDependency(content: string, depName: string): string {\n const { meta, body } = parseFrontmatter(content);\n const deps: string[] = Array.isArray(meta.depends_on) ? meta.depends_on : [];\n if (!deps.includes(depName)) {\n deps.push(depName);\n }\n meta.depends_on = deps;\n return serializeFrontmatter(meta) + '\\n' + body;\n}\n\nexport function removeDependency(content: string, depName: string): string {\n const { meta, body } = parseFrontmatter(content);\n const deps: string[] = Array.isArray(meta.depends_on) ? meta.depends_on : [];\n meta.depends_on = deps.filter((d) => d !== depName);\n return serializeFrontmatter(meta) + '\\n' + body;\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nconst DEFAULT_LIMIT = 50;\n\nexport interface SearchOptions {\n archived?: boolean;\n artifact?: string;\n limit?: string;\n regex?: boolean;\n}\n\ninterface SearchHit {\n change: string;\n artifact: string;\n line: number;\n text: string;\n}\n\nexport async function searchCommand(query: string, options: SearchOptions): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n if (!existsSync(changesDir)) {\n log.warn(`${symbol.warn} ${t('no changes directory found', '未找到 changes 目录')}`);\n return;\n }\n\n const dirs: { name: string; path: string }[] = [];\n\n const activeEntries = readdirSync(changesDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name !== config.archive.dir);\n for (const e of activeEntries) {\n dirs.push({ name: e.name, path: join(changesDir, e.name) });\n }\n\n if (options.archived) {\n const archiveDir = join(changesDir, config.archive.dir);\n if (existsSync(archiveDir)) {\n const archivedEntries = readdirSync(archiveDir, { withFileTypes: true })\n .filter((e) => e.isDirectory());\n for (const e of archivedEntries) {\n dirs.push({ name: `${config.archive.dir}/${e.name}`, path: join(archiveDir, e.name) });\n }\n }\n }\n\n let matcher: (line: string) => boolean;\n if (options.regex) {\n try {\n const re = new RegExp(query, 'i');\n matcher = (line) => re.test(line);\n } catch (e: any) {\n log.error(`${symbol.fail} ${t('invalid regex', '无效正则')}: ${e.message}`);\n return;\n }\n } else {\n const queryLower = query.toLowerCase();\n matcher = (line) => line.toLowerCase().includes(queryLower);\n }\n\n const hits: SearchHit[] = [];\n\n for (const dir of dirs) {\n if (!existsSync(dir.path)) continue;\n const files = readdirSync(dir.path).filter((f) => f.endsWith('.md'));\n\n for (const file of files) {\n if (options.artifact) {\n const artType = basename(file, '.md');\n if (artType !== options.artifact) continue;\n }\n\n const filePath = join(dir.path, file);\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n if (matcher(lines[i])) {\n hits.push({\n change: dir.name,\n artifact: file,\n line: i + 1,\n text: lines[i].trim(),\n });\n }\n }\n }\n }\n\n if (hits.length === 0) {\n log.warn(`${symbol.warn} ${t(`no results for \"${query}\"`, `\"${query}\" 无结果`)}`);\n return;\n }\n\n const limit = options.limit ? parseInt(options.limit, 10) : DEFAULT_LIMIT;\n const shown = hits.slice(0, limit);\n\n log.info(`${symbol.start} ${hits.length} ${t('result(s) for', '条结果,搜索')} \"${query}\"`);\n for (const hit of shown) {\n log.dim(` ${hit.change}/${hit.artifact}:${hit.line} ${hit.text}`);\n }\n if (hits.length > limit) {\n log.dim(` ... ${hits.length - limit} ${t('more result(s), use --limit to show more', '条更多结果,使用 --limit 显示更多')}`);\n }\n}\n","import { existsSync, readFileSync, writeFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { addDependency, removeDependency, parseFrontmatter } from '../core/frontmatter.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nexport async function depsAddCommand(name: string, options: { on: string }): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const proposalPath = join(cwd, config.specDir, 'changes', name, 'proposal.md');\n\n if (!existsSync(proposalPath)) {\n log.warn(`${symbol.warn} \"${name}\" ${t('not found', '未找到')}`);\n return;\n }\n\n const content = readFileSync(proposalPath, 'utf-8');\n const updated = addDependency(content, options.on);\n writeFileSync(proposalPath, updated, 'utf-8');\n log.success(`${symbol.ok} ${name} → depends_on: ${options.on}`);\n}\n\nexport async function depsRemoveCommand(name: string, options: { on: string }): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const proposalPath = join(cwd, config.specDir, 'changes', name, 'proposal.md');\n\n if (!existsSync(proposalPath)) {\n log.warn(`${symbol.warn} \"${name}\" ${t('not found', '未找到')}`);\n return;\n }\n\n const content = readFileSync(proposalPath, 'utf-8');\n const updated = removeDependency(content, options.on);\n writeFileSync(proposalPath, updated, 'utf-8');\n log.success(`${symbol.ok} ${name} → ${t('removed dependency', '移除依赖')}: ${options.on}`);\n}\n\nexport async function depsListCommand(name: string | undefined): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n if (name) {\n const proposalPath = join(changesDir, name, 'proposal.md');\n if (!existsSync(proposalPath)) {\n log.warn(`${symbol.warn} \"${name}\" ${t('not found', '未找到')}`);\n return;\n }\n const content = readFileSync(proposalPath, 'utf-8');\n const { meta } = parseFrontmatter(content);\n const deps: string[] = Array.isArray(meta.depends_on) ? meta.depends_on : [];\n log.info(`${symbol.start} ${name}`);\n if (deps.length === 0) {\n log.dim(` ${t('no dependencies', '无依赖')}`);\n } else {\n for (const d of deps) {\n log.dim(` → ${d}`);\n }\n }\n return;\n }\n\n if (!existsSync(changesDir)) {\n log.warn(`${symbol.warn} ${t('no changes directory', '未找到 changes 目录')}`);\n return;\n }\n\n const entries = readdirSync(changesDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name !== config.archive.dir);\n\n log.info(`${symbol.start} ${t('dependency graph', '依赖关系')}`);\n for (const entry of entries) {\n const proposalPath = join(changesDir, entry.name, 'proposal.md');\n if (!existsSync(proposalPath)) continue;\n const content = readFileSync(proposalPath, 'utf-8');\n const { meta } = parseFrontmatter(content);\n const deps: string[] = Array.isArray(meta.depends_on) ? meta.depends_on : [];\n if (deps.length > 0) {\n log.dim(` ${entry.name} → [${deps.join(', ')}]`);\n } else {\n log.dim(` ${entry.name}`);\n }\n }\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { parseFrontmatter } from '../core/frontmatter.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nconst ARTIFACT_TYPES = ['proposal', 'spec', 'tasks', 'clarify', 'checklist'] as const;\n\nfunction readStatus(changePath: string, artifact: string): string {\n const filePath = join(changePath, `${artifact}.md`);\n if (!existsSync(filePath)) return '—';\n const content = readFileSync(filePath, 'utf-8');\n const { meta } = parseFrontmatter(content);\n if (meta.status) return meta.status;\n if (content.includes('✅')) return 'done';\n if (content.includes('🟢')) return 'ready';\n return 'draft';\n}\n\nfunction statusIcon(s: string): string {\n if (s === '—') return '—';\n if (s === 'done' || s === 'complete') return '✅';\n if (s === 'ready') return '🟢';\n return '🟡';\n}\n\nfunction overallStatus(statuses: Record<string, string>): string {\n const vals = Object.values(statuses).filter((v) => v !== '—');\n if (vals.length === 0) return 'empty';\n if (vals.every((v) => v === 'done' || v === 'complete')) return '✅ Done';\n if (vals.every((v) => v === 'ready' || v === 'done' || v === 'complete')) return '🟢 Ready';\n return '🟡 Draft';\n}\n\nexport async function statusCommand(): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n if (!existsSync(changesDir)) {\n log.warn(`${symbol.warn} ${t('no changes directory found', '未找到 changes 目录')}`);\n return;\n }\n\n const entries = readdirSync(changesDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name !== config.archive.dir)\n .sort((a, b) => a.name.localeCompare(b.name));\n\n if (entries.length === 0) {\n log.dim(` ${t('no active changes', '无活跃变更')}`);\n return;\n }\n\n const header = ['Change', ...ARTIFACT_TYPES.map((a) => a.slice(0, 8).padEnd(8)), 'Status'];\n const rows: string[][] = [];\n\n for (const entry of entries) {\n const changePath = join(changesDir, entry.name);\n const statuses: Record<string, string> = {};\n for (const art of ARTIFACT_TYPES) {\n statuses[art] = readStatus(changePath, art);\n }\n rows.push([\n entry.name,\n ...ARTIFACT_TYPES.map((a) => statusIcon(statuses[a])),\n overallStatus(statuses),\n ]);\n }\n\n const colWidths = header.map((h, i) => {\n const maxData = rows.reduce((max, row) => Math.max(max, stripAnsi(row[i]).length), 0);\n return Math.max(stripAnsi(h).length, maxData);\n });\n\n const divider = colWidths.map((w) => '-'.repeat(w + 2)).join('+');\n const formatRow = (row: string[]) =>\n row.map((cell, i) => ` ${cell.padEnd(colWidths[i])} `).join('|');\n\n log.info(`${symbol.start} ${t('changes', '变更列表')}`);\n console.log(formatRow(header));\n console.log(divider);\n for (const row of rows) {\n console.log(formatRow(row));\n }\n\n const archiveDir = join(changesDir, config.archive.dir);\n if (existsSync(archiveDir)) {\n const archived = readdirSync(archiveDir, { withFileTypes: true }).filter((e) => e.isDirectory());\n if (archived.length > 0) {\n log.dim(`\\n ${archived.length} ${t('archived change(s)', '个已归档变更')}`);\n }\n }\n}\n\nexport async function listCommand(options: { archived?: boolean }): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n if (!existsSync(changesDir)) return;\n\n const entries = readdirSync(changesDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name !== config.archive.dir)\n .sort((a, b) => a.name.localeCompare(b.name));\n\n for (const e of entries) {\n console.log(e.name);\n }\n\n if (options.archived) {\n const archiveDir = join(changesDir, config.archive.dir);\n if (existsSync(archiveDir)) {\n const archived = readdirSync(archiveDir, { withFileTypes: true })\n .filter((e) => e.isDirectory());\n for (const e of archived) {\n console.log(`${config.archive.dir}/${e.name}`);\n }\n }\n }\n}\n\nfunction stripAnsi(str: string): string {\n return str.replace(/\\u001b\\[\\d+(?:;\\d+)*m/g, '').replace(/[✅🟢🟡—]/g, 'XX');\n}\n","import { existsSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { generateContext } from '../core/context.js';\nimport { resolveChangeNames } from '../utils/fs.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nexport async function syncCommand(name: string | undefined, opts: { base?: string; git?: boolean }): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n const names = resolveChangeNames(changesDir, name, config.archive.dir);\n\n if (names.length === 0) {\n log.warn(`${symbol.warn} ${t('no changes found', '未找到变更')}`);\n return;\n }\n\n const useGit = opts.git !== false;\n\n for (const n of names) {\n const changePath = join(changesDir, n);\n if (!existsSync(changePath)) {\n log.warn(`${symbol.warn} \"${n}\" ${t('not found', '未找到')}`);\n continue;\n }\n\n const content = generateContext(changePath, n, {\n gitDiff: useGit,\n baseBranch: opts.base,\n });\n const destPath = join(changePath, 'context.md');\n writeFileSync(destPath, content, 'utf-8');\n log.success(`${symbol.ok} ${t('synced', '已同步')} ${n}/context.md`);\n }\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parseFrontmatter, serializeFrontmatter } from './frontmatter.js';\nimport { getDateString } from '../utils/date.js';\nimport { getDiffFiles, type GitChange } from '../utils/git.js';\n\nexport interface ContextData {\n name: string;\n status: string;\n strategy: string;\n mode: string;\n updated: string;\n goals: string[];\n progress: { total: number; done: number; items: string[] };\n decisions: string[];\n files: string[];\n}\n\nfunction extractSection(body: string, heading: string): string[] {\n const regex = new RegExp(`^##\\\\s+${heading}[\\\\s\\\\S]*?$`, 'im');\n const match = body.match(regex);\n if (!match) return [];\n\n const startIdx = body.indexOf(match[0]) + match[0].length;\n const rest = body.slice(startIdx);\n const nextSection = rest.match(/^##\\s+/m);\n const sectionContent = nextSection ? rest.slice(0, nextSection.index) : rest;\n\n return sectionContent\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0 && !l.startsWith('<!--'));\n}\n\nfunction parseTaskItems(body: string): { total: number; done: number; items: string[] } {\n const lines = body.split('\\n');\n const items: string[] = [];\n let done = 0;\n let total = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n const checked = trimmed.match(/^-\\s*\\[x\\]\\s+(.*)/i);\n const unchecked = trimmed.match(/^-\\s*\\[\\s\\]\\s+(.*)/);\n\n if (checked) {\n total++;\n done++;\n const desc = checked[1].trim();\n items.push(`- [x] ${desc}`);\n } else if (unchecked) {\n total++;\n const desc = unchecked[1].trim();\n items.push(`- [ ] ${desc}`);\n }\n }\n\n return { total, done, items };\n}\n\nfunction extractFilePaths(body: string): string[] {\n const paths = new Set<string>();\n const regex = /`([^`]+\\.[a-zA-Z]+)`/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(body)) !== null) {\n const p = match[1];\n if (p.includes('/') && !p.startsWith('http') && !p.includes(' ')) {\n paths.add(p);\n }\n }\n return [...paths];\n}\n\nfunction extractDecisions(body: string): string[] {\n const lines = body.split('\\n');\n const decisions: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (/^\\|?\\s*D\\d+\\s*\\|/.test(trimmed)) {\n const cells = trimmed.split('|').map((c) => c.trim()).filter(Boolean);\n if (cells.length >= 2) {\n decisions.push(`- ${cells[0]}: ${cells[1]}`);\n }\n }\n }\n return decisions;\n}\n\nexport interface GenerateContextOptions {\n gitDiff?: boolean;\n baseBranch?: string;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n A: 'added',\n M: 'modified',\n D: 'deleted',\n R: 'renamed',\n};\n\nfunction classifyGitChanges(gitChanges: GitChange[], taskFiles: string[]): string[] {\n const taskFileSet = new Set(taskFiles);\n const lines: string[] = [];\n for (const { status, file } of gitChanges) {\n const label = STATUS_LABELS[status] || status;\n const inTasks = taskFileSet.has(file) || taskFiles.some((tf) => file.endsWith(tf) || tf.endsWith(file));\n const tag = inTasks ? '' : ' (unplanned)';\n lines.push(`- ${label}: ${file}${tag}`);\n }\n return lines;\n}\n\nexport function generateContext(changePath: string, changeName: string, options: GenerateContextOptions = {}): string {\n const read = (name: string): string | null => {\n const p = join(changePath, name);\n return existsSync(p) ? readFileSync(p, 'utf-8') : null;\n };\n\n const proposal = read('proposal.md');\n const spec = read('spec.md');\n const tasks = read('tasks.md');\n const clarify = read('clarify.md');\n\n let strategy = 'follow';\n let status = 'in-progress';\n const mode = spec ? 'boost' : 'standard';\n\n if (proposal) {\n const { meta } = parseFrontmatter(proposal);\n if (meta.strategy) strategy = meta.strategy;\n if (meta.status) status = meta.status;\n }\n\n const goals: string[] = [];\n if (proposal) {\n const { body } = parseFrontmatter(proposal);\n const goalLines = extractSection(body, '目标|Goals');\n for (const line of goalLines) {\n const cleaned = line.replace(/^-\\s*\\[.\\]\\s*/, '- ').replace(/^-\\s*/, '');\n if (cleaned) goals.push(`- ${cleaned}`);\n }\n }\n\n let progress = { total: 0, done: 0, items: [] as string[] };\n let files: string[] = [];\n if (tasks) {\n const { body } = parseFrontmatter(tasks);\n progress = parseTaskItems(body);\n files = extractFilePaths(body);\n }\n\n const decisions: string[] = [];\n if (clarify) {\n const { body } = parseFrontmatter(clarify);\n decisions.push(...extractDecisions(body));\n }\n\n const existingContext = read('context.md');\n let notes = '';\n if (existingContext) {\n const { body } = parseFrontmatter(existingContext);\n const notesSection = extractSection(body, 'Notes');\n if (notesSection.length > 0) {\n notes = notesSection.join('\\n');\n }\n }\n\n const fm = serializeFrontmatter({\n name: changeName,\n status,\n strategy,\n mode,\n updated: getDateString(),\n });\n\n const lines: string[] = [fm, ''];\n\n if (goals.length > 0) {\n lines.push('## Goals', ...goals, '');\n }\n\n if (progress.total > 0) {\n lines.push(`## Progress (${progress.done}/${progress.total} tasks)`);\n lines.push(...progress.items, '');\n }\n\n if (decisions.length > 0) {\n lines.push('## Decisions', ...decisions, '');\n }\n\n if (files.length > 0) {\n lines.push('## Affected Files');\n for (const f of files) {\n lines.push(`- ${f}`);\n }\n lines.push('');\n }\n\n if (options.gitDiff === true) {\n const gitChanges = getDiffFiles(options.baseBranch);\n if (gitChanges.length > 0) {\n const classified = classifyGitChanges(gitChanges, files);\n lines.push('## Git Changes', ...classified, '');\n }\n }\n\n lines.push('## Notes');\n if (notes) {\n lines.push(notes);\n }\n lines.push('');\n\n return lines.join('\\n');\n}\n"],"mappings":"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","names":["existsSync","writeFileSync","readdirSync","join","execSync","existsSync","readFileSync","join","dirname","join","existsSync","__filename","existsSync","join","existsSync","dirname","readFileSync","existsSync","readFileSync","writeFileSync","readdirSync","join","join","existsSync","readFileSync","writeFileSync","readdirSync","join","existsSync","readdirSync","writeFileSync","execSync","existsSync","join","join","existsSync","existsSync","readdirSync","join","join","existsSync","readdirSync","existsSync","join","join","existsSync","existsSync","join","readFileSync","existsSync","readdirSync","join","join","existsSync","existsSync","join","readFileSync","existsSync","join","deps","join","existsSync","readFileSync","join","existsSync","existsSync","readFileSync","readdirSync","join","basename","join","existsSync","readdirSync","basename","readFileSync","existsSync","readFileSync","writeFileSync","readdirSync","join","join","existsSync","readFileSync","writeFileSync","deps","readdirSync","existsSync","readFileSync","readdirSync","join","join","existsSync","readFileSync","readdirSync","existsSync","writeFileSync","join","readFileSync","existsSync","join","join","existsSync","readFileSync","join","existsSync","writeFileSync","require"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/commands/archive.ts","../../src/core/config.ts","../../src/ui/index.ts","../../src/utils/date.ts","../../src/utils/fs.ts","../../src/commands/create.ts","../../src/utils/git.ts","../../src/utils/paths.ts","../../src/utils/template.ts","../../src/commands/deps.ts","../../src/core/frontmatter.ts","../../src/commands/init.ts","../../src/core/template.ts","../../src/prompts/index.ts","../../src/commands/lint.ts","../../src/core/lint.ts","../../src/commands/search.ts","../../src/commands/status.ts","../../src/commands/sync.ts","../../src/core/context.ts","../../src/commands/update.ts","../../src/commands/validate.ts","../../src/core/validate.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from 'node:module';\nimport { program } from 'commander';\nimport { archiveCommand } from '../commands/archive.js';\nimport { createCommand } from '../commands/create.js';\nimport { depsAddCommand, depsListCommand, depsRemoveCommand } from '../commands/deps.js';\nimport { initCommand } from '../commands/init.js';\nimport { lintCommand } from '../commands/lint.js';\nimport { searchCommand } from '../commands/search.js';\nimport { listCommand, statusCommand } from '../commands/status.js';\nimport { syncCommand } from '../commands/sync.js';\nimport { updateCommand } from '../commands/update.js';\nimport { validateCommand } from '../commands/validate.js';\nimport { loadConfig } from '../core/config.js';\nimport { setLang, t } from '../ui/index.js';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('../../package.json');\n\nsetLang(loadConfig(process.cwd(), true).lang);\n\nprogram\n .name('superspec')\n .description(\n t('Spec-driven development for AI coding assistants', 'AI 编码助手的规格驱动开发工具')\n )\n .version(pkg.version);\n\nprogram\n .command('init')\n .description(t('Initialize SuperSpec in current project', '初始化 SuperSpec 到当前项目'))\n .option(\n '--ai <agent>',\n t(\n 'AI assistant type: claude, cursor, qwen, opencode, codex, codebuddy, qoder',\n 'AI 助手类型: claude, cursor, qwen, opencode, codex, codebuddy, qoder'\n ),\n 'cursor'\n )\n .option('--lang <lang>', t('Template language: zh, en', '模板语言: zh, en'), 'en')\n .option('--force', t('Force overwrite existing config', '强制覆盖已有配置'))\n .option('--no-git', t('Skip git initialization', '跳过 git 初始化'))\n .action(initCommand);\n\nprogram\n .command('create <feature>')\n .description(\n t(\n 'Create change and generate proposal (-b boost mode)',\n '创建变更并生成 proposal(-b 增强模式)'\n )\n )\n .option(\n '-b, --boost',\n t(\n 'Boost mode, also generate spec + design + checklist',\n '增强模式,额外生成 spec + design + checklist'\n )\n )\n .option(\n '-c, --creative',\n t('Creative mode, encourage new approaches', '创造模式,鼓励探索新方案')\n )\n .option(\n '-d, --description <desc>',\n t('Change description for context', '变更描述,用于生成上下文')\n )\n .option('--spec-dir <dir>', t('Custom spec folder name', '自定义 spec 文件夹名称'))\n .option('--no-branch', t('Skip git branch creation', '不创建 git 分支'))\n .option(\n '--intent-type <type>',\n t(\n 'Intent type: feature, hotfix, bugfix, refactor, chore',\n '意图类型:feature, hotfix, bugfix, refactor, chore'\n )\n )\n .option('--branch-prefix <prefix>', t('Custom branch prefix', '自定义分支前缀'))\n .option(\n '--branch-template <template>',\n t(\n 'Branch name template: {prefix}{date}-{feature}-{user}',\n '分支名称模板:{prefix}-{date}-{feature}-{user}'\n )\n )\n .option(\n '--change-name-template <template>',\n t('Folder name template: {date}-{feature}-{user}', '文件夹名称模板:{date}-{feature}-{user}')\n )\n .option('--user <user>', t('Developer identifier (e.g. jay)', '开发者标识(如 jay)'))\n .option('--lang <lang>', t('SDD document language: zh, en', 'SDD 文档语言: zh, en'))\n .action(createCommand);\n\nprogram\n .command('archive [name]')\n .description(t('Archive completed changes', '归档已完成的变更'))\n .option('--all', t('Archive all completed changes', '归档所有已完成的变更'))\n .action(archiveCommand);\n\nprogram\n .command('update')\n .description(t('Refresh agent instructions and templates', '刷新 agent 指令和模板'))\n .action(updateCommand);\n\nprogram\n .command('lint [name]')\n .description(t('Check artifact line limits', '检查 artifact 行数是否超限'))\n .action(lintCommand);\n\nprogram\n .command('validate [name]')\n .description(t('Cross-validate artifact consistency', '交叉验证 artifact 一致性'))\n .option('--check-deps', t('Also check dependency consistency', '同时检查依赖一致性'))\n .action(validateCommand);\n\nprogram\n .command('search <query>')\n .description(t('Search change contents', '搜索变更内容'))\n .option('--archived', t('Include archived changes', '包含已归档的变更'))\n .option(\n '--artifact <type>',\n t(\n 'Filter by artifact type (proposal/spec/tasks/clarify/checklist)',\n '按 artifact 类型过滤 (proposal/spec/tasks/clarify/checklist)'\n )\n )\n .option('--limit <n>', t('Max results to show (default: 50)', '最大显示结果数(默认 50)'))\n .option('-E, --regex', t('Use regex pattern matching', '使用正则表达式匹配'))\n .action(searchCommand);\n\nconst deps = program.command('deps').description(t('Manage spec dependencies', '管理 spec 依赖'));\n\ndeps\n .command('list [name]')\n .description(t('View dependency graph', '查看依赖关系'))\n .action(depsListCommand);\n\ndeps\n .command('add <name>')\n .description(t('Add spec dependency', '添加 spec 依赖'))\n .requiredOption('--on <other>', t('Dependency spec name', '依赖的 spec 名称'))\n .action(depsAddCommand);\n\ndeps\n .command('remove <name>')\n .description(t('Remove spec dependency', '移除 spec 依赖'))\n .requiredOption('--on <other>', t('Dependency to remove', '要移除的依赖名称'))\n .action(depsRemoveCommand);\n\nprogram\n .command('status')\n .description(t('View all change statuses', '查看所有变更状态'))\n .action(statusCommand);\n\nprogram\n .command('list')\n .description(t('List change names (for scripting)', '列出变更名称(用于脚本)'))\n .option('--archived', t('Include archived changes', '包含已归档的变更'))\n .action(listCommand);\n\nprogram\n .command('sync [name]')\n .description(t('Sync git changes to context.md', '同步 git 变更到 context.md'))\n .option(\n '--base <branch>',\n t('Base branch (default: main/master)', '基准分支(默认 main/master)')\n )\n .option('--no-git', t('Skip git diff collection', '不收集 git diff 信息'))\n .action(syncCommand);\n\nprogram.parse();\n","import { existsSync, readdirSync, renameSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig, type SuperSpecConfig } from '../core/config.js';\nimport { log, symbol, t } from '../ui/index.js';\nimport { getDateString } from '../utils/date.js';\nimport { ensureDir } from '../utils/fs.js';\n\nexport interface ArchiveOptions {\n all?: boolean;\n}\n\nexport async function archiveCommand(\n name: string | undefined,\n options: ArchiveOptions\n): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n const archiveDir = join(cwd, config.specDir, 'changes', config.archive.dir);\n\n if (!existsSync(changesDir)) {\n log.warn(`${symbol.warn} ${t('no changes directory found', '未找到 changes 目录')}`);\n return;\n }\n\n if (options.all) {\n const entries = readdirSync(changesDir, { withFileTypes: true }).filter(\n (e) => e.isDirectory() && e.name !== config.archive.dir\n );\n\n if (entries.length === 0) {\n log.warn(`${symbol.warn} ${t('no changes to archive', '没有可归档的变更')}`);\n return;\n }\n\n log.info(`${symbol.start} ${t('archiving all changes...', '归档所有变更...')}`);\n for (const entry of entries) {\n archiveOne(entry.name, changesDir, archiveDir, config);\n }\n } else if (name) {\n const changePath = join(changesDir, name);\n if (!existsSync(changePath)) {\n log.warn(`${symbol.warn} ${t(`change \"${name}\" not found`, `变更 \"${name}\" 不存在`)}`);\n return;\n }\n log.info(`${symbol.start} ${t(`archiving: ${name}`, `归档变更: ${name}`)}`);\n archiveOne(name, changesDir, archiveDir, config);\n } else {\n log.warn(`${symbol.warn} ${t('specify a name or use --all', '请指定变更名称或使用 --all')}`);\n return;\n }\n\n log.info(`${symbol.start} ${t('archive done!', '归档完成!')}`);\n}\n\nfunction archiveOne(\n name: string,\n changesDir: string,\n archiveDir: string,\n config: SuperSpecConfig\n): void {\n ensureDir(archiveDir);\n const src = join(changesDir, name);\n const dateStr = config.archive.datePrefix ? `${getDateString()}-` : '';\n const dest = join(archiveDir, `${dateStr}${name}`);\n\n if (existsSync(dest)) {\n log.warn(` ${symbol.warn} ${t('archive target exists', '归档目标已存在')}: ${dest}`);\n return;\n }\n\n renameSync(src, dest);\n log.success(` ${symbol.ok} ${name} → archive/${dateStr}${name}`);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type Strategy = 'follow' | 'create';\nexport type AIEditorType =\n | 'claude'\n | 'cursor'\n | 'qwen'\n | 'opencode'\n | 'codex'\n | 'codebuddy'\n | 'qoder';\n\nexport interface SuperSpecConfig {\n lang: 'zh' | 'en';\n aiEditor: AIEditorType;\n specDir: string;\n branchPrefix: string;\n branchTemplate: string;\n changeNameTemplate: string;\n boost: boolean;\n strategy: Strategy;\n context: string[];\n templates: Record<string, string>;\n archive: {\n dir: string;\n datePrefix: boolean;\n };\n limits: {\n targetLines: number;\n hardLines: number;\n };\n artifacts: string[];\n boostArtifacts: string[];\n}\n\nconst DEFAULT_CONFIG: SuperSpecConfig = {\n lang: 'en',\n aiEditor: 'cursor',\n specDir: 'superspec',\n branchPrefix: '',\n branchTemplate: '{prefix}{intentType}-{date}-{feature}-{user}',\n changeNameTemplate: '{prefix}{intentType}-{date}-{feature}-{user}',\n boost: false,\n strategy: 'follow',\n context: [],\n templates: {\n spec: 'spec.md',\n proposal: 'proposal.md',\n tasks: 'tasks.md',\n clarify: 'clarify.md',\n checklist: 'checklist.md',\n design: 'design.md'\n },\n archive: {\n dir: 'archive',\n datePrefix: true\n },\n limits: {\n targetLines: 300,\n hardLines: 400\n },\n artifacts: ['proposal'],\n boostArtifacts: ['proposal', 'spec', 'design', 'tasks', 'checklist']\n};\n\nexport function loadConfig(\n projectRoot: string = process.cwd(),\n silent: boolean = false\n): SuperSpecConfig {\n const configPath = join(projectRoot, 'superspec.config.json');\n let userConfig: Partial<SuperSpecConfig> = {};\n\n if (existsSync(configPath)) {\n try {\n userConfig = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch (e: any) {\n if (!silent) {\n console.warn(`⚠ Config file parsing failed: ${e.message}`);\n }\n }\n }\n\n return deepMerge(DEFAULT_CONFIG, userConfig) as SuperSpecConfig;\n}\n\nexport function getDefaultConfig(): SuperSpecConfig {\n return structuredClone(DEFAULT_CONFIG);\n}\n\nfunction deepMerge(target: Record<string, any>, source: Record<string, any>): Record<string, any> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n const val = source[key];\n if (val === null || val === undefined) continue;\n if (\n typeof val === 'object' &&\n !Array.isArray(val) &&\n target[key] &&\n typeof target[key] === 'object'\n ) {\n result[key] = deepMerge(target[key], val);\n } else {\n result[key] = val;\n }\n }\n return result;\n}\n","import chalk from 'chalk';\n\nexport const theme = {\n primary: chalk.hex('#6366f1'),\n success: chalk.hex('#22c55e'),\n warning: chalk.hex('#f59e0b'),\n error: chalk.hex('#ef4444'),\n info: chalk.hex('#3b82f6'),\n boost: chalk.hex('#a855f7'),\n dim: chalk.hex('#6b7280'),\n highlight: chalk.hex('#f472b6'),\n border: chalk.hex('#374151'),\n gradient1: chalk.hex('#818cf8'),\n gradient2: chalk.hex('#6366f1'),\n gradient3: chalk.hex('#4f46e5')\n};\n\n// ASCII Art Logo for SuperSpec (S-U-P-E-R-S-P-E-C)\nexport const logo = {\n small: `\n${theme.gradient1(' ███████╗██╗ ██╗██████╗ ███████╗██████╗ ███████╗██████╗ ███████╗ ██████╗')}\n${theme.gradient2(' ██╔════╝██║ ██║██╔══██╗██╔════╝██╔══██╗██╔════╝██╔══██╗██╔════╝██╔════╝')}\n${theme.gradient3(' ███████╗██║ ██║██████╔╝█████╗ ██████╔╝███████╗██████╔╝█████╗ ██║ ')}\n${theme.gradient2(' ╚════██║██║ ██║██╔═══╝ ██╔══╝ ██╔══██╗╚════██║██╔═══╝ ██╔══╝ ██║ ')}\n${theme.gradient1(' ███████║╚██████╔╝██║ ███████╗██║ ██║███████║██║ ███████╗╚██████╗')}\n${theme.gradient1(' ╚══════╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚══════╝ ╚═════╝')}\n `,\n tiny: `\n${theme.gradient1(' ███████╗██╗ ██╗██████╗ ███████╗██████╗ ███████╗██████╗ ███████╗ ██████╗')}\n${theme.gradient2(' ╚═════╗██║ ██║██╔══██║██╔════╝██╔══██╗╚═════╗██╔══██║██╔════╝██╔════╝')}\n${theme.gradient3(' ███████║██║ ██║██████╔╝█████╗ ██████╔╝███████║██████╔╝█████╗ ██║ ')} ${theme.highlight('Spec-Driven Development')}\n${theme.gradient2(' ╚════██║██║ ██║██╔═══╝ ██╔══╝ ██╔══██╗╚════██║██╔═══╝ ██╔══╝ ██║ ')}\n${theme.gradient1(' ███████║╚██████╔╝██║ ███████╗██║ ██║███████║██║ ███████╗╚██████╗')}\n${theme.gradient1(' ╚══════╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚══════╝ ╚═════╝')}\n `\n};\n\nconst box = {\n topLeft: '╭',\n topRight: '╮',\n bottomLeft: '╰',\n bottomRight: '╯',\n horizontal: '─',\n vertical: '│'\n};\n\nfunction boxText(text: string, width: number = 50): string {\n const padding = ' '.repeat(Math.max(0, width - text.length - 4));\n return `${theme.border(box.vertical)} ${theme.highlight(text)}${padding} ${theme.border(box.vertical)}`;\n}\n\nfunction createBox(lines: string[], width: number = 52): string {\n const top = theme.border(`${box.topLeft}${box.horizontal.repeat(width - 2)}${box.topRight}`);\n const bottom = theme.border(\n `${box.bottomLeft}${box.horizontal.repeat(width - 2)}${box.bottomRight}`\n );\n const middle = lines.map((line) => boxText(line, width));\n return [top, ...middle, bottom].join('\\n');\n}\n\nexport const log = {\n info: (msg: string) => console.log(theme.info(msg)),\n success: (msg: string) => console.log(theme.success(msg)),\n warn: (msg: string) => console.log(theme.warning(msg)),\n error: (msg: string) => console.log(theme.error(msg)),\n dim: (msg: string) => console.log(theme.dim(msg)),\n boost: (msg: string) => console.log(theme.boost(msg)),\n highlight: (msg: string) => console.log(theme.highlight(msg)),\n title: (msg: string) => {\n console.log();\n console.log(createBox([msg]));\n console.log();\n },\n section: (msg: string) => {\n console.log();\n console.log(theme.primary(`◆ ${msg}`));\n console.log(theme.border('─'.repeat(50)));\n },\n done: (msg: string) => {\n console.log();\n console.log(theme.success(`✨ ${msg}`));\n console.log();\n }\n};\n\nexport const symbol = {\n start: theme.primary('◆'),\n ok: theme.success('✓'),\n fail: theme.error('✗'),\n warn: theme.warning('⚠'),\n bolt: theme.boost('⚡'),\n arrow: theme.dim('→'),\n bullet: theme.dim('•'),\n sparkle: theme.highlight('✨'),\n folder: theme.primary('📁'),\n file: theme.info('📄'),\n git: theme.warning('🌿'),\n ai: theme.boost('🤖'),\n info: theme.info('ℹ')\n} as const;\n\n// Helper to print the logo\nexport function printLogo(size: 'small' | 'tiny' = 'small'): void {\n console.log(logo[size]);\n}\n\nlet _lang: 'zh' | 'en' = 'en';\n\nexport function setLang(lang: 'zh' | 'en'): void {\n _lang = lang;\n}\n\nexport function t(en: string, zh: string): string {\n return _lang === 'zh' ? zh : en;\n}\n\n// Helper to print a summary box\nexport function printSummary(items: { label: string; value: string }[]): void {\n const maxLabel = Math.max(...items.map((i) => i.label.length));\n const width = 50;\n\n console.log(theme.border(`╭${'─'.repeat(width - 2)}╮`));\n for (const { label, value } of items) {\n const padding = ' '.repeat(maxLabel - label.length);\n const line = `${theme.dim(label)}${padding} ${symbol.arrow} ${theme.highlight(value)}`;\n // Strip ANSI codes for length calculation\n const plainLine = line.replace(/\\u001b\\[\\d+(?:;\\d+)*m/g, '');\n const rightPad = ' '.repeat(Math.max(0, width - plainLine.length - 4));\n console.log(theme.border('│ ') + line + rightPad + theme.border(' │'));\n }\n console.log(theme.border(`╰${'─'.repeat(width - 2)}╯`));\n}\n","export function getDateString(): string {\n const d = new Date();\n return `${d.getFullYear()}${String(d.getMonth() + 1).padStart(2, '0')}${String(d.getDate()).padStart(2, '0')}`;\n}\n","import { existsSync, mkdirSync, readdirSync } from 'node:fs';\n\nexport function ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport function resolveChangeNames(\n changesDir: string,\n name: string | undefined,\n archiveDirName: string\n): string[] {\n if (!existsSync(changesDir)) return [];\n if (name) return [name];\n return readdirSync(changesDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name !== archiveDirName)\n .map((e) => e.name);\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { log, symbol, t } from '../ui/index.js';\nimport { createBranch, isGitRepo } from '../utils/git.js';\nimport {\n ensureDir,\n getDateString,\n type NameTemplateVars,\n renderNameTemplate\n} from '../utils/index.js';\n\nexport interface CreateOptions {\n boost?: boolean;\n creative?: boolean;\n user?: string;\n lang?: string;\n branch?: boolean;\n specDir?: string;\n branchPrefix?: string;\n branchTemplate?: string;\n changeNameTemplate?: string;\n description?: string;\n intentType?: string;\n}\n\nexport async function createCommand(feature: string, options: CreateOptions): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n\n const specDir = options.specDir || config.specDir;\n const branchPrefix = options.branchPrefix || config.branchPrefix;\n const boost = options.boost || config.boost;\n const strategy = options.creative ? 'create' : config.strategy;\n const templateVars: NameTemplateVars = {\n prefix: branchPrefix,\n intentType: options.intentType,\n feature,\n date: getDateString(),\n user: options.user\n };\n\n const changeNameTemplate =\n options.changeNameTemplate || config.changeNameTemplate || '{date}-{feature}';\n const changeFolderName = renderNameTemplate(changeNameTemplate, templateVars, false);\n const changePath = join(cwd, specDir, 'changes', changeFolderName);\n\n if (existsSync(changePath)) {\n log.warn(\n `${symbol.warn} ${t(`change \"${changeFolderName}\" already exists`, `变更 \"${changeFolderName}\" 已存在`)}: ${changePath}`\n );\n return;\n }\n\n log.title(`${t('Creating Change', '创建变更')}: ${changeFolderName}`);\n if (options.intentType) {\n log.info(`${t('Intent Type', '意图类型')}: ${options.intentType}`);\n }\n\n if (boost) {\n log.boost(`${symbol.bolt} ${t('Boost mode enabled', '增强模式已启用')}`);\n }\n if (strategy === 'create') {\n log.boost(\n `${symbol.bolt} ${t('Creative mode: exploring new solutions', '创造模式:探索新方案')}`\n );\n }\n\n ensureDir(changePath);\n\n if (options.branch !== false && isGitRepo()) {\n const branchTemplate =\n options.branchTemplate || config.branchTemplate || '{prefix}{date}-{feature}';\n const branchName = renderNameTemplate(branchTemplate, templateVars, true);\n try {\n createBranch(branchName);\n log.success(`${symbol.ok} Branch: ${branchName}`);\n } catch (e: any) {\n log.warn(`${symbol.warn} ${t('branch creation failed', '分支创建失败')}: ${e.message}`);\n }\n }\n\n log.done(t('Change created successfully!', '变更创建成功!'));\n log.dim(`${t('Path', '路径')}: ${specDir}/changes/${changeFolderName}/`);\n log.dim(`${t('Templates', '模板参考')}: ${specDir}/templates/`);\n\n const expectedArtifacts = boost ? config.boostArtifacts : config.artifacts;\n log.dim(`${t('Expected artifacts', '预期 Artifacts')}: ${expectedArtifacts.join(', ')}`);\n log.dim(\n `${t('Next', '下一步')}: ${t('AI generates artifacts on demand via /ss-create', 'AI 按需通过 /ss-create 生成 artifacts')}`\n );\n}\n","import { execSync } from 'node:child_process';\n\nconst GIT_TIMEOUT = 10_000;\n\nexport function isGitRepo(): boolean {\n try {\n execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore', timeout: GIT_TIMEOUT });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getCurrentBranch(): string | null {\n try {\n return execSync('git branch --show-current', {\n encoding: 'utf-8',\n timeout: GIT_TIMEOUT\n }).trim();\n } catch {\n return null;\n }\n}\n\nconst SAFE_BRANCH_RE = /^[a-zA-Z0-9._\\-/]+$/;\n\nexport function createBranch(branchName: string): void {\n if (!SAFE_BRANCH_RE.test(branchName)) {\n throw new Error(`invalid branch name: ${branchName}`);\n }\n execSync(`git checkout -b ${branchName}`, { stdio: 'inherit', timeout: GIT_TIMEOUT });\n}\n\nexport function getDefaultBranch(): string {\n try {\n const ref = execSync('git symbolic-ref refs/remotes/origin/HEAD', {\n encoding: 'utf-8',\n timeout: GIT_TIMEOUT\n }).trim();\n return ref.replace('refs/remotes/origin/', '');\n } catch {\n try {\n execSync('git rev-parse --verify main', { stdio: 'ignore', timeout: GIT_TIMEOUT });\n return 'main';\n } catch {\n return 'master';\n }\n }\n}\n\nexport interface GitChange {\n status: string;\n file: string;\n}\n\nexport function getDiffFiles(base?: string): GitChange[] {\n const baseBranch = base || getDefaultBranch();\n try {\n const mergeBase = execSync(`git merge-base ${baseBranch} HEAD`, {\n encoding: 'utf-8',\n timeout: GIT_TIMEOUT\n }).trim();\n const output = execSync(`git diff --name-status ${mergeBase}`, {\n encoding: 'utf-8',\n timeout: 30_000\n }).trim();\n if (!output) return [];\n return output.split('\\n').map((line) => {\n const [status, ...parts] = line.split('\\t');\n return { status: status.charAt(0), file: parts.join('\\t') };\n });\n } catch {\n return [];\n }\n}\n","import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getPackageRoot(): string {\n const __filename = fileURLToPath(import.meta.url);\n let dir = dirname(__filename);\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, 'package.json')) && existsSync(join(dir, 'templates'))) {\n return dir;\n }\n dir = dirname(dir);\n }\n return join(dirname(__filename), '..', '..');\n}\n","export interface NameTemplateVars {\n prefix?: string;\n intentType?: string;\n feature: string;\n date: string;\n user?: string;\n [key: string]: string | undefined;\n}\n\nexport function renderNameTemplate(\n template: string,\n vars: NameTemplateVars,\n strict = false\n): string {\n let result = template;\n\n for (const [key, value] of Object.entries(vars)) {\n if (value !== undefined) {\n result = result.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value);\n }\n }\n\n result = result.replace(/\\{[^}]+\\}/g, '');\n\n if (strict) {\n return result\n .replace(/[^a-zA-Z0-9._\\-/]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n }\n return result\n .replace(/[^\\p{L}\\p{N}._\\-/]/gu, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n}\n","import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { addDependency, parseFrontmatter, removeDependency } from '../core/frontmatter.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nexport async function depsAddCommand(name: string, options: { on: string }): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const proposalPath = join(cwd, config.specDir, 'changes', name, 'proposal.md');\n\n if (!existsSync(proposalPath)) {\n log.warn(`${symbol.warn} \"${name}\" ${t('not found', '未找到')}`);\n return;\n }\n\n const content = readFileSync(proposalPath, 'utf-8');\n const updated = addDependency(content, options.on);\n writeFileSync(proposalPath, updated, 'utf-8');\n log.success(`${symbol.ok} ${name} → depends_on: ${options.on}`);\n}\n\nexport async function depsRemoveCommand(name: string, options: { on: string }): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const proposalPath = join(cwd, config.specDir, 'changes', name, 'proposal.md');\n\n if (!existsSync(proposalPath)) {\n log.warn(`${symbol.warn} \"${name}\" ${t('not found', '未找到')}`);\n return;\n }\n\n const content = readFileSync(proposalPath, 'utf-8');\n const updated = removeDependency(content, options.on);\n writeFileSync(proposalPath, updated, 'utf-8');\n log.success(`${symbol.ok} ${name} → ${t('removed dependency', '移除依赖')}: ${options.on}`);\n}\n\nexport async function depsListCommand(name: string | undefined): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n if (name) {\n const proposalPath = join(changesDir, name, 'proposal.md');\n if (!existsSync(proposalPath)) {\n log.warn(`${symbol.warn} \"${name}\" ${t('not found', '未找到')}`);\n return;\n }\n const content = readFileSync(proposalPath, 'utf-8');\n const { meta } = parseFrontmatter(content);\n const deps: string[] = Array.isArray(meta.depends_on) ? meta.depends_on : [];\n log.info(`${symbol.start} ${name}`);\n if (deps.length === 0) {\n log.dim(` ${t('no dependencies', '无依赖')}`);\n } else {\n for (const d of deps) {\n log.dim(` → ${d}`);\n }\n }\n return;\n }\n\n if (!existsSync(changesDir)) {\n log.warn(`${symbol.warn} ${t('no changes directory', '未找到 changes 目录')}`);\n return;\n }\n\n const entries = readdirSync(changesDir, { withFileTypes: true }).filter(\n (e) => e.isDirectory() && e.name !== config.archive.dir\n );\n\n log.info(`${symbol.start} ${t('dependency graph', '依赖关系')}`);\n for (const entry of entries) {\n const proposalPath = join(changesDir, entry.name, 'proposal.md');\n if (!existsSync(proposalPath)) continue;\n const content = readFileSync(proposalPath, 'utf-8');\n const { meta } = parseFrontmatter(content);\n const deps: string[] = Array.isArray(meta.depends_on) ? meta.depends_on : [];\n if (deps.length > 0) {\n log.dim(` ${entry.name} → [${deps.join(', ')}]`);\n } else {\n log.dim(` ${entry.name}`);\n }\n }\n}\n","const FM_REGEX = /^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/;\n\nexport interface Frontmatter {\n [key: string]: any;\n}\n\nexport interface ParsedDoc {\n meta: Frontmatter;\n body: string;\n}\n\nexport function parseFrontmatter(content: string): ParsedDoc {\n const match = content.match(FM_REGEX);\n if (!match) {\n return { meta: {}, body: content };\n }\n\n const meta: Frontmatter = {};\n const lines = match[1].split('\\n');\n for (const line of lines) {\n const idx = line.indexOf(':');\n if (idx === -1) continue;\n const key = line.slice(0, idx).trim();\n let value: any = line.slice(idx + 1).trim();\n if (key === '') continue;\n if (value === '[]') {\n value = [];\n } else if (value.startsWith('[') && value.endsWith(']')) {\n value = value\n .slice(1, -1)\n .split(',')\n .map((s: string) => s.trim().replace(/^[\"']|[\"']$/g, ''))\n .filter(Boolean);\n } else if (value === 'true') {\n value = true;\n } else if (value === 'false') {\n value = false;\n }\n meta[key] = value;\n }\n\n return { meta, body: match[2] };\n}\n\nexport function serializeFrontmatter(meta: Frontmatter): string {\n const lines: string[] = ['---'];\n for (const [key, value] of Object.entries(meta)) {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n lines.push(`${key}: []`);\n } else {\n lines.push(`${key}: [${value.map((v: string) => `\"${v}\"`).join(', ')}]`);\n }\n } else {\n lines.push(`${key}: ${value}`);\n }\n }\n lines.push('---');\n return lines.join('\\n');\n}\n\nexport function updateFrontmatter(content: string, updates: Partial<Frontmatter>): string {\n const { meta, body } = parseFrontmatter(content);\n const merged = { ...meta, ...updates };\n return `${serializeFrontmatter(merged)}\\n${body}`;\n}\n\nexport function addDependency(content: string, depName: string): string {\n const { meta, body } = parseFrontmatter(content);\n const deps: string[] = Array.isArray(meta.depends_on) ? meta.depends_on : [];\n if (!deps.includes(depName)) {\n deps.push(depName);\n }\n meta.depends_on = deps;\n return `${serializeFrontmatter(meta)}\\n${body}`;\n}\n\nexport function removeDependency(content: string, depName: string): string {\n const { meta, body } = parseFrontmatter(content);\n const deps: string[] = Array.isArray(meta.depends_on) ? meta.depends_on : [];\n meta.depends_on = deps.filter((d) => d !== depName);\n return `${serializeFrontmatter(meta)}\\n${body}`;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getDefaultConfig } from '../core/config.js';\nimport { copyTemplate } from '../core/template.js';\nimport {\n AI_EDITORS,\n type AIEditor,\n installAgentsMd,\n installCommands,\n installRules\n} from '../prompts/index.js';\nimport { log, printLogo, printSummary, setLang, symbol, t, theme } from '../ui/index.js';\nimport { ensureDir } from '../utils/fs.js';\nimport { isGitRepo } from '../utils/git.js';\n\nexport interface InitOptions {\n ai: string;\n lang: string;\n force?: boolean;\n git?: boolean;\n}\n\nexport async function initCommand(options: InitOptions): Promise<void> {\n const cwd = process.cwd();\n const configPath = join(cwd, 'superspec.config.json');\n\n if (existsSync(configPath) && !options.force) {\n log.warn(\n `${symbol.warn} ${t('superspec.config.json already exists, use --force to overwrite', 'superspec.config.json 已存在,使用 --force 覆盖')}`\n );\n return;\n }\n\n const lang = options.lang || 'zh';\n setLang(lang as 'zh' | 'en');\n\n printLogo('small');\n console.log(theme.dim(' Spec-Driven Development Toolkit\\n'));\n\n const config = getDefaultConfig();\n config.lang = lang as 'zh' | 'en';\n\n const aiEditor = options.ai as AIEditor;\n if (aiEditor && AI_EDITORS[aiEditor]) {\n config.aiEditor = aiEditor;\n }\n\n const specDir = join(cwd, config.specDir);\n\n const existingFiles = readdirSync(cwd).filter((f) => !f.startsWith('.') && f !== 'node_modules');\n if (existingFiles.length > 0 && !options.force) {\n log.warn(\n `${symbol.warn} ${t(`current directory is not empty (${existingFiles.length} items)`, `当前目录非空(${existingFiles.length} 项)`)}`\n );\n log.dim(\n ` ${t('template files will be merged with existing content', '模板文件将与现有内容合并')}`\n );\n console.log();\n }\n\n log.section(t('Creating Configuration', '创建配置'));\n writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`, 'utf-8');\n log.success(`${symbol.file} superspec.config.json`);\n\n log.section(t('Creating Directory Structure', '创建目录结构'));\n ensureDir(join(specDir, 'changes'));\n ensureDir(join(specDir, 'templates'));\n log.success(`${symbol.folder} ${config.specDir}/changes/`);\n log.success(`${symbol.folder} ${config.specDir}/templates/`);\n\n log.section(t('Installing Templates', '安装模板'));\n const templateNames = Object.values(config.templates).map((v) =>\n v.endsWith('.md') ? v : `${v}.md`\n );\n for (const tpl of templateNames) {\n try {\n copyTemplate(tpl, join(specDir, 'templates', tpl), lang);\n } catch {\n // skip missing templates\n }\n }\n log.success(`${symbol.ok} ${templateNames.length} ${t('templates', '个模板')} (${lang})`);\n\n log.section(t('Installing AI Agent Files', '安装 AI Agent 文件'));\n installAgentsMd(cwd);\n\n if (aiEditor && AI_EDITORS[aiEditor]) {\n installRules(cwd, aiEditor);\n installCommands(cwd, aiEditor, lang);\n }\n\n if (options.git !== false && !isGitRepo()) {\n execSync('git init', { cwd, stdio: 'inherit' });\n log.success(`${symbol.git} git init`);\n }\n\n console.log();\n printSummary([\n { label: 'Config', value: 'superspec.config.json' },\n { label: 'Spec dir', value: `${config.specDir}/` },\n { label: 'AI agent', value: options.ai },\n { label: 'Language', value: lang }\n ]);\n\n log.done(t('SuperSpec initialized successfully!', 'SuperSpec 初始化成功!'));\n log.dim(`${t('Next', '下一步')}: superspec create <feature>`);\n}\n","import { copyFileSync, existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { ensureDir } from '../utils/fs.js';\nimport { getPackageRoot } from '../utils/paths.js';\n\nexport function resolveTemplatePath(templateName: string, lang: string = 'zh'): string {\n const root = getPackageRoot();\n const langPath = join(root, 'templates', lang, templateName);\n if (existsSync(langPath)) return langPath;\n const fallbackLang = lang === 'zh' ? 'en' : 'zh';\n const fallback = join(root, 'templates', fallbackLang, templateName);\n if (existsSync(fallback)) return fallback;\n throw new Error(`Template not found: ${templateName} (lang: ${lang})`);\n}\n\nexport function copyTemplate(templateName: string, destPath: string, lang: string = 'zh'): void {\n const srcPath = resolveTemplatePath(templateName, lang);\n ensureDir(dirname(destPath));\n copyFileSync(srcPath, destPath);\n}\n\n/**\n * Simple template engine supporting:\n * - {{variable}} - variable substitution\n * - {{#if variable}}...{{/if}} - conditional blocks (shown if variable is truthy)\n */\nexport function renderTemplate(\n templateName: string,\n vars: Record<string, string> = {},\n lang: string = 'zh'\n): string {\n const srcPath = resolveTemplatePath(templateName, lang);\n let content = readFileSync(srcPath, 'utf-8');\n\n // Process conditionals first: {{#if variable}}...{{/if}}\n content = processConditionals(content, vars);\n\n // Process simple variable substitution: {{variable}}\n for (const [key, value] of Object.entries(vars)) {\n content = content.replaceAll(`{{${key}}}`, value);\n }\n\n return content;\n}\n\nfunction processConditionals(content: string, vars: Record<string, string>): string {\n // Match {{#if variable}}...{{/if}} patterns\n const ifRegex = /\\{\\{#if\\s+(\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g;\n\n return content.replace(ifRegex, (_match, varName, innerContent) => {\n const value = vars[varName];\n // Show content if variable exists and is not empty\n if (value && value.trim() !== '') {\n return innerContent;\n }\n return '';\n });\n}\n\nexport function writeRenderedTemplate(\n templateName: string,\n destPath: string,\n vars: Record<string, string> = {},\n lang: string = 'zh'\n): void {\n const content = renderTemplate(templateName, vars, lang);\n ensureDir(dirname(destPath));\n writeFileSync(destPath, content, 'utf-8');\n}\n","import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { log, symbol } from '../ui/index.js';\nimport { ensureDir } from '../utils/fs.js';\nimport { getPackageRoot } from '../utils/paths.js';\n\n// Supported AI editors configuration\nexport const AI_EDITORS = {\n claude: {\n commands: '.claude/commands',\n rules: null // Claude doesn't use rules files\n },\n cursor: {\n commands: '.cursor/commands',\n rules: '.cursor/rules',\n rulesFile: 'superspec.mdc'\n },\n qwen: {\n commands: '.qwen/commands',\n rules: '.qwen/rules',\n rulesFile: 'superspec.md'\n },\n opencode: {\n commands: '.opencode/commands',\n rules: null\n },\n codex: {\n commands: '.codex/commands',\n rules: null\n },\n codebuddy: {\n commands: '.codebuddy/commands',\n rules: '.codebuddy/rules',\n rulesFile: 'superspec.md'\n },\n qoder: {\n commands: '.qoder/commands',\n rules: '.qoder/rules',\n rulesFile: 'superspec.md'\n }\n} as const;\n\nexport type AIEditor = keyof typeof AI_EDITORS;\n\n/**\n * Install rules file for a specific AI editor\n */\nexport function installRules(cwd: string, editor: AIEditor): void {\n const config = AI_EDITORS[editor];\n\n // Skip if this editor doesn't use rules files\n if (!config.rules) {\n return;\n }\n\n const rulesDir = join(cwd, config.rules);\n ensureDir(rulesDir);\n\n const promptSrc = join(getPackageRoot(), 'prompts', 'rules.md');\n if (existsSync(promptSrc)) {\n const content = readFileSync(promptSrc, 'utf-8');\n const rulesFile = 'rulesFile' in config ? config.rulesFile : 'superspec.md';\n const destPath = join(rulesDir, rulesFile as string);\n writeFileSync(destPath, content, 'utf-8');\n log.success(`${symbol.ok} ${config.rules}/${rulesFile}`);\n }\n}\n\nconst SS_START = '<!-- superspec:start -->';\nconst SS_END = '<!-- superspec:end -->';\n\nexport function installAgentsMd(cwd: string): void {\n const agentsMdPath = join(cwd, 'AGENTS.md');\n const agentPromptSrc = join(getPackageRoot(), 'prompts', 'agents.md');\n\n if (!existsSync(agentPromptSrc)) return;\n\n const newContent = readFileSync(agentPromptSrc, 'utf-8');\n const wrapped = `${SS_START}\\n${newContent}\\n${SS_END}`;\n\n if (existsSync(agentsMdPath)) {\n const existing = readFileSync(agentsMdPath, 'utf-8');\n const startIdx = existing.indexOf(SS_START);\n const endIdx = existing.indexOf(SS_END);\n\n if (startIdx !== -1 && endIdx !== -1) {\n const before = existing.slice(0, startIdx);\n const after = existing.slice(endIdx + SS_END.length);\n writeFileSync(agentsMdPath, before + wrapped + after, 'utf-8');\n } else if (existing.includes('SuperSpec')) {\n writeFileSync(agentsMdPath, existing, 'utf-8');\n } else {\n writeFileSync(agentsMdPath, `${existing}\\n\\n${wrapped}`, 'utf-8');\n }\n } else {\n writeFileSync(agentsMdPath, wrapped, 'utf-8');\n }\n log.success(`${symbol.ok} AGENTS.md`);\n}\n\n/**\n * Install commands for a specific AI editor\n */\nexport function installCommands(cwd: string, editor: AIEditor, lang: string = 'zh'): void {\n const config = AI_EDITORS[editor];\n const commandsDir = join(cwd, config.commands);\n ensureDir(commandsDir);\n\n // Copy command templates from templates/{lang}/commands/\n const templatesDir = join(getPackageRoot(), 'templates', lang, 'commands');\n const fallbackDir = join(getPackageRoot(), 'templates', 'zh', 'commands');\n const sourceDir = existsSync(templatesDir) ? templatesDir : fallbackDir;\n\n if (!existsSync(sourceDir)) {\n log.warn(`${symbol.warn} Commands templates not found: ${sourceDir}`);\n return;\n }\n\n const commandFiles = readdirSync(sourceDir).filter((f) => f.endsWith('.md'));\n\n for (const file of commandFiles) {\n const srcPath = join(sourceDir, file);\n const destPath = join(commandsDir, file);\n const content = readFileSync(srcPath, 'utf-8');\n writeFileSync(destPath, content, 'utf-8');\n }\n\n log.success(`${symbol.ok} ${config.commands}/ (${commandFiles.length} commands)`);\n}\n\n/**\n * Install commands for all supported AI editors\n */\nexport function installAllCommands(cwd: string, lang: string = 'zh'): void {\n for (const editor of Object.keys(AI_EDITORS) as AIEditor[]) {\n installCommands(cwd, editor, lang);\n }\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { lintChange } from '../core/lint.js';\nimport { log, symbol, t } from '../ui/index.js';\nimport { resolveChangeNames } from '../utils/fs.js';\n\nexport async function lintCommand(name: string | undefined): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n const { targetLines, hardLines } = config.limits;\n\n const names = resolveChangeNames(changesDir, name, config.archive.dir);\n\n if (names.length === 0) {\n log.warn(`${symbol.warn} ${t('no changes to lint', '没有可检查的变更')}`);\n return;\n }\n\n let hasIssues = false;\n\n for (const n of names) {\n const changePath = join(changesDir, n);\n if (!existsSync(changePath)) {\n log.warn(`${symbol.warn} \"${n}\" ${t('not found', '未找到')}`);\n continue;\n }\n\n const results = lintChange(changePath, targetLines, hardLines);\n log.info(`${symbol.start} ${n}`);\n\n for (const r of results) {\n if (r.status === 'error') {\n log.error(` ${symbol.fail} ${r.artifact}: ${r.message}`);\n hasIssues = true;\n } else if (r.status === 'warn') {\n log.warn(` ${symbol.warn} ${r.artifact}: ${r.message}`);\n hasIssues = true;\n } else {\n log.success(` ${symbol.ok} ${r.artifact}: ${r.message}`);\n }\n }\n }\n\n if (!hasIssues) {\n log.info(`${symbol.start} ${t('all artifacts within limits', '所有 artifact 均在限制范围内')}`);\n }\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { basename, join } from 'node:path';\n\nexport interface LintResult {\n artifact: string;\n lines: number;\n status: 'ok' | 'warn' | 'error';\n message: string;\n}\n\nexport function lintArtifact(filePath: string, targetLines: number, hardLines: number): LintResult {\n const artifact = basename(filePath);\n if (!existsSync(filePath)) {\n return { artifact, lines: 0, status: 'ok', message: 'not found' };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n').length;\n\n if (lines > hardLines) {\n return {\n artifact,\n lines,\n status: 'error',\n message: `${lines} lines exceeds hard limit (${hardLines}). Must split.`\n };\n }\n if (lines > targetLines) {\n return {\n artifact,\n lines,\n status: 'warn',\n message: `${lines} lines exceeds target (${targetLines}). Consider splitting.`\n };\n }\n return { artifact, lines, status: 'ok', message: `${lines} lines` };\n}\n\nexport function lintChange(\n changePath: string,\n targetLines: number,\n hardLines: number\n): LintResult[] {\n if (!existsSync(changePath)) return [];\n\n const files = readdirSync(changePath).filter((f) => f.endsWith('.md'));\n return files.map((f) => lintArtifact(join(changePath, f), targetLines, hardLines));\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { basename, join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nconst DEFAULT_LIMIT = 50;\n\nexport interface SearchOptions {\n archived?: boolean;\n artifact?: string;\n limit?: string;\n regex?: boolean;\n}\n\ninterface SearchHit {\n change: string;\n artifact: string;\n line: number;\n text: string;\n}\n\nexport async function searchCommand(query: string, options: SearchOptions): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n if (!existsSync(changesDir)) {\n log.warn(`${symbol.warn} ${t('no changes directory found', '未找到 changes 目录')}`);\n return;\n }\n\n const dirs: { name: string; path: string }[] = [];\n\n const activeEntries = readdirSync(changesDir, { withFileTypes: true }).filter(\n (e) => e.isDirectory() && e.name !== config.archive.dir\n );\n for (const e of activeEntries) {\n dirs.push({ name: e.name, path: join(changesDir, e.name) });\n }\n\n if (options.archived) {\n const archiveDir = join(changesDir, config.archive.dir);\n if (existsSync(archiveDir)) {\n const archivedEntries = readdirSync(archiveDir, { withFileTypes: true }).filter((e) =>\n e.isDirectory()\n );\n for (const e of archivedEntries) {\n dirs.push({ name: `${config.archive.dir}/${e.name}`, path: join(archiveDir, e.name) });\n }\n }\n }\n\n let matcher: (line: string) => boolean;\n if (options.regex) {\n try {\n const re = new RegExp(query, 'i');\n matcher = (line) => re.test(line);\n } catch (e: any) {\n log.error(`${symbol.fail} ${t('invalid regex', '无效正则')}: ${e.message}`);\n return;\n }\n } else {\n const queryLower = query.toLowerCase();\n matcher = (line) => line.toLowerCase().includes(queryLower);\n }\n\n const hits: SearchHit[] = [];\n\n for (const dir of dirs) {\n if (!existsSync(dir.path)) continue;\n const files = readdirSync(dir.path).filter((f) => f.endsWith('.md'));\n\n for (const file of files) {\n if (options.artifact) {\n const artType = basename(file, '.md');\n if (artType !== options.artifact) continue;\n }\n\n const filePath = join(dir.path, file);\n const content = readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n if (matcher(lines[i])) {\n hits.push({\n change: dir.name,\n artifact: file,\n line: i + 1,\n text: lines[i].trim()\n });\n }\n }\n }\n }\n\n if (hits.length === 0) {\n log.warn(`${symbol.warn} ${t(`no results for \"${query}\"`, `\"${query}\" 无结果`)}`);\n return;\n }\n\n const limit = options.limit ? parseInt(options.limit, 10) : DEFAULT_LIMIT;\n const shown = hits.slice(0, limit);\n\n log.info(`${symbol.start} ${hits.length} ${t('result(s) for', '条结果,搜索')} \"${query}\"`);\n for (const hit of shown) {\n log.dim(` ${hit.change}/${hit.artifact}:${hit.line} ${hit.text}`);\n }\n if (hits.length > limit) {\n log.dim(\n ` ... ${hits.length - limit} ${t('more result(s), use --limit to show more', '条更多结果,使用 --limit 显示更多')}`\n );\n }\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { parseFrontmatter } from '../core/frontmatter.js';\nimport { log, symbol, t } from '../ui/index.js';\n\nconst ARTIFACT_TYPES = ['proposal', 'spec', 'tasks', 'clarify', 'checklist'] as const;\n\nfunction readStatus(changePath: string, artifact: string): string {\n const filePath = join(changePath, `${artifact}.md`);\n if (!existsSync(filePath)) return '—';\n const content = readFileSync(filePath, 'utf-8');\n const { meta } = parseFrontmatter(content);\n if (meta.status) return meta.status;\n if (content.includes('✅')) return 'done';\n if (content.includes('🟢')) return 'ready';\n return 'draft';\n}\n\nfunction statusIcon(s: string): string {\n if (s === '—') return '—';\n if (s === 'done' || s === 'complete') return '✅';\n if (s === 'ready') return '🟢';\n return '🟡';\n}\n\nfunction overallStatus(statuses: Record<string, string>): string {\n const vals = Object.values(statuses).filter((v) => v !== '—');\n if (vals.length === 0) return 'empty';\n if (vals.every((v) => v === 'done' || v === 'complete')) return '✅ Done';\n if (vals.every((v) => v === 'ready' || v === 'done' || v === 'complete')) return '🟢 Ready';\n return '🟡 Draft';\n}\n\nexport async function statusCommand(): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n if (!existsSync(changesDir)) {\n log.warn(`${symbol.warn} ${t('no changes directory found', '未找到 changes 目录')}`);\n return;\n }\n\n const entries = readdirSync(changesDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name !== config.archive.dir)\n .sort((a, b) => a.name.localeCompare(b.name));\n\n if (entries.length === 0) {\n log.dim(` ${t('no active changes', '无活跃变更')}`);\n return;\n }\n\n const header = ['Change', ...ARTIFACT_TYPES.map((a) => a.slice(0, 8).padEnd(8)), 'Status'];\n const rows: string[][] = [];\n\n for (const entry of entries) {\n const changePath = join(changesDir, entry.name);\n const statuses: Record<string, string> = {};\n for (const art of ARTIFACT_TYPES) {\n statuses[art] = readStatus(changePath, art);\n }\n rows.push([\n entry.name,\n ...ARTIFACT_TYPES.map((a) => statusIcon(statuses[a])),\n overallStatus(statuses)\n ]);\n }\n\n const colWidths = header.map((h, i) => {\n const maxData = rows.reduce((max, row) => Math.max(max, stripAnsi(row[i]).length), 0);\n return Math.max(stripAnsi(h).length, maxData);\n });\n\n const divider = colWidths.map((w) => '-'.repeat(w + 2)).join('+');\n const formatRow = (row: string[]) =>\n row.map((cell, i) => ` ${cell.padEnd(colWidths[i])} `).join('|');\n\n log.info(`${symbol.start} ${t('changes', '变更列表')}`);\n console.log(formatRow(header));\n console.log(divider);\n for (const row of rows) {\n console.log(formatRow(row));\n }\n\n const archiveDir = join(changesDir, config.archive.dir);\n if (existsSync(archiveDir)) {\n const archived = readdirSync(archiveDir, { withFileTypes: true }).filter((e) =>\n e.isDirectory()\n );\n if (archived.length > 0) {\n log.dim(`\\n ${archived.length} ${t('archived change(s)', '个已归档变更')}`);\n }\n }\n}\n\nexport async function listCommand(options: { archived?: boolean }): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n if (!existsSync(changesDir)) return;\n\n const entries = readdirSync(changesDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name !== config.archive.dir)\n .sort((a, b) => a.name.localeCompare(b.name));\n\n for (const e of entries) {\n console.log(e.name);\n }\n\n if (options.archived) {\n const archiveDir = join(changesDir, config.archive.dir);\n if (existsSync(archiveDir)) {\n const archived = readdirSync(archiveDir, { withFileTypes: true }).filter((e) =>\n e.isDirectory()\n );\n for (const e of archived) {\n console.log(`${config.archive.dir}/${e.name}`);\n }\n }\n }\n}\n\nfunction stripAnsi(str: string): string {\n return str.replace(/\\u001b\\[\\d+(?:;\\d+)*m/g, '').replace(/[✅🟢🟡—]/gu, 'XX');\n}\n","import { existsSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { generateContext } from '../core/context.js';\nimport { log, symbol, t } from '../ui/index.js';\nimport { resolveChangeNames } from '../utils/fs.js';\n\nexport async function syncCommand(\n name: string | undefined,\n opts: { base?: string; git?: boolean }\n): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n const names = resolveChangeNames(changesDir, name, config.archive.dir);\n\n if (names.length === 0) {\n log.warn(`${symbol.warn} ${t('no changes found', '未找到变更')}`);\n return;\n }\n\n const useGit = opts.git !== false;\n\n for (const n of names) {\n const changePath = join(changesDir, n);\n if (!existsSync(changePath)) {\n log.warn(`${symbol.warn} \"${n}\" ${t('not found', '未找到')}`);\n continue;\n }\n\n const content = generateContext(changePath, n, {\n gitDiff: useGit,\n baseBranch: opts.base\n });\n const destPath = join(changePath, 'context.md');\n writeFileSync(destPath, content, 'utf-8');\n log.success(`${symbol.ok} ${t('synced', '已同步')} ${n}/context.md`);\n }\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getDateString } from '../utils/date.js';\nimport { type GitChange, getDiffFiles } from '../utils/git.js';\nimport { parseFrontmatter, serializeFrontmatter } from './frontmatter.js';\n\nexport interface ContextData {\n name: string;\n status: string;\n strategy: string;\n mode: string;\n updated: string;\n goals: string[];\n progress: { total: number; done: number; items: string[] };\n decisions: string[];\n files: string[];\n}\n\nfunction extractSection(body: string, heading: string): string[] {\n const regex = new RegExp(`^##\\\\s+(?:${heading})[\\\\s\\\\S]*?$`, 'im');\n const match = body.match(regex);\n if (!match) return [];\n\n const startIdx = body.indexOf(match[0]) + match[0].length;\n const rest = body.slice(startIdx);\n const nextSection = rest.match(/^##\\s+/m);\n const sectionContent = nextSection ? rest.slice(0, nextSection.index) : rest;\n\n return sectionContent\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l.length > 0 && !l.startsWith('<!--'));\n}\n\nfunction parseTaskItems(body: string): { total: number; done: number; items: string[] } {\n const lines = body.split('\\n');\n const items: string[] = [];\n let done = 0;\n let total = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n const checked = trimmed.match(/^-\\s*\\[x\\]\\s+(.*)/i);\n const unchecked = trimmed.match(/^-\\s*\\[\\s\\]\\s+(.*)/);\n\n if (checked) {\n total++;\n done++;\n const desc = checked[1].trim();\n items.push(`- [x] ${desc}`);\n } else if (unchecked) {\n total++;\n const desc = unchecked[1].trim();\n items.push(`- [ ] ${desc}`);\n }\n }\n\n return { total, done, items };\n}\n\nfunction extractFilePaths(body: string): string[] {\n const paths = new Set<string>();\n const regex = /`([^`]+\\.[a-zA-Z]+)`/g;\n let match: RegExpExecArray | null = regex.exec(body);\n while (match !== null) {\n const p = match[1];\n if (p.includes('/') && !p.startsWith('http') && !p.includes(' ')) {\n paths.add(p);\n }\n match = regex.exec(body);\n }\n return [...paths];\n}\n\nfunction extractDecisions(body: string): string[] {\n const lines = body.split('\\n');\n const decisions: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (/^\\|?\\s*D\\d+\\s*\\|/.test(trimmed)) {\n const cells = trimmed\n .split('|')\n .map((c) => c.trim())\n .filter(Boolean);\n if (cells.length >= 2) {\n decisions.push(`- ${cells[0]}: ${cells[1]}`);\n }\n }\n }\n return decisions;\n}\n\nexport interface GenerateContextOptions {\n gitDiff?: boolean;\n baseBranch?: string;\n}\n\nconst STATUS_LABELS: Record<string, string> = {\n A: 'added',\n M: 'modified',\n D: 'deleted',\n R: 'renamed'\n};\n\nfunction classifyGitChanges(gitChanges: GitChange[], taskFiles: string[]): string[] {\n const taskFileSet = new Set(taskFiles);\n const lines: string[] = [];\n for (const { status, file } of gitChanges) {\n const label = STATUS_LABELS[status] || status;\n const inTasks =\n taskFileSet.has(file) || taskFiles.some((tf) => file.endsWith(tf) || tf.endsWith(file));\n const tag = inTasks ? '' : ' (unplanned)';\n lines.push(`- ${label}: ${file}${tag}`);\n }\n return lines;\n}\n\nexport function generateContext(\n changePath: string,\n changeName: string,\n options: GenerateContextOptions = {}\n): string {\n const read = (name: string): string | null => {\n const p = join(changePath, name);\n return existsSync(p) ? readFileSync(p, 'utf-8') : null;\n };\n\n const proposal = read('proposal.md');\n const spec = read('spec.md');\n const tasks = read('tasks.md');\n const clarify = read('clarify.md');\n\n const mode = spec ? 'boost' : 'standard';\n const proposalMeta = proposal ? parseFrontmatter(proposal).meta : {};\n const strategy = proposalMeta.strategy || 'follow';\n const status = proposalMeta.status || 'in-progress';\n\n const goals: string[] = [];\n if (proposal) {\n const { body } = parseFrontmatter(proposal);\n const goalLines = extractSection(body, '目标|Goals');\n for (const line of goalLines) {\n const cleaned = line.replace(/^-\\s*\\[.\\]\\s*/, '- ').replace(/^-\\s*/, '');\n if (cleaned) goals.push(`- ${cleaned}`);\n }\n }\n\n let progress = { total: 0, done: 0, items: [] as string[] };\n let files: string[] = [];\n if (tasks) {\n const { body } = parseFrontmatter(tasks);\n progress = parseTaskItems(body);\n files = extractFilePaths(body);\n }\n\n const decisions: string[] = [];\n if (clarify) {\n const { body } = parseFrontmatter(clarify);\n decisions.push(...extractDecisions(body));\n }\n\n const existingContext = read('context.md');\n let notes = '';\n if (existingContext) {\n const { body } = parseFrontmatter(existingContext);\n const notesSection = extractSection(body, 'Notes');\n if (notesSection.length > 0) {\n notes = notesSection.join('\\n');\n }\n }\n\n const fmData: Record<string, string> = {\n name: changeName,\n status,\n strategy,\n mode,\n updated: getDateString()\n };\n if (proposalMeta.input) fmData.input = proposalMeta.input;\n const fm = serializeFrontmatter(fmData);\n\n const lines: string[] = [fm, ''];\n\n if (goals.length > 0) {\n lines.push('## Goals', ...goals, '');\n }\n\n if (progress.total > 0) {\n lines.push(`## Progress (${progress.done}/${progress.total} tasks)`);\n lines.push(...progress.items, '');\n }\n\n if (decisions.length > 0) {\n lines.push('## Decisions', ...decisions, '');\n }\n\n if (files.length > 0) {\n lines.push('## Affected Files');\n for (const f of files) {\n lines.push(`- ${f}`);\n }\n lines.push('');\n }\n\n if (options.gitDiff === true) {\n const gitChanges = getDiffFiles(options.baseBranch);\n if (gitChanges.length > 0) {\n const classified = classifyGitChanges(gitChanges, files);\n lines.push('## Git Changes', ...classified, '');\n }\n }\n\n lines.push('## Notes');\n if (notes) {\n lines.push(notes);\n }\n lines.push('');\n\n return lines.join('\\n');\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { copyTemplate } from '../core/template.js';\nimport {\n AI_EDITORS,\n type AIEditor,\n installAgentsMd,\n installCommands,\n installRules\n} from '../prompts/index.js';\nimport { log, symbol, t } from '../ui/index.js';\nimport { ensureDir } from '../utils/fs.js';\n\nexport async function updateCommand(): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const specDir = join(cwd, config.specDir);\n const lang = config.lang || 'zh';\n\n if (!existsSync(join(cwd, 'superspec.config.json'))) {\n log.warn(\n `${symbol.warn} ${t('not initialized, run superspec init first', '当前目录未初始化 SuperSpec,请先运行 superspec init')}`\n );\n return;\n }\n\n log.info(`${symbol.start} ${t('updating SuperSpec...', '更新 SuperSpec...')}`);\n\n const templateNames = Object.values(config.templates).map((v) =>\n v.endsWith('.md') ? v : `${v}.md`\n );\n ensureDir(join(specDir, 'templates'));\n for (const tpl of templateNames) {\n try {\n copyTemplate(tpl, join(specDir, 'templates', tpl), lang);\n } catch {\n // skip missing templates\n }\n }\n log.success(` ${symbol.ok} ${t('templates updated', '模板更新')} (${lang})`);\n\n installAgentsMd(cwd);\n\n const aiEditor = config.aiEditor as AIEditor;\n if (aiEditor && AI_EDITORS[aiEditor]) {\n installRules(cwd, aiEditor);\n installCommands(cwd, aiEditor, lang);\n }\n\n log.info(`${symbol.start} ${t('update done!', '更新完成!')}`);\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { loadConfig } from '../core/config.js';\nimport { validateChange } from '../core/validate.js';\nimport { log, symbol, t } from '../ui/index.js';\nimport { resolveChangeNames } from '../utils/fs.js';\n\nexport interface ValidateOptions {\n checkDeps?: boolean;\n}\n\nexport async function validateCommand(\n name: string | undefined,\n options: ValidateOptions\n): Promise<void> {\n const cwd = process.cwd();\n const config = loadConfig(cwd);\n const changesDir = join(cwd, config.specDir, 'changes');\n\n const names = resolveChangeNames(changesDir, name, config.archive.dir);\n\n if (names.length === 0) {\n log.warn(`${symbol.warn} ${t('no changes to validate', '没有可验证的变更')}`);\n return;\n }\n\n let totalIssues = 0;\n\n for (const n of names) {\n const changePath = join(changesDir, n);\n if (!existsSync(changePath)) {\n log.warn(`${symbol.warn} \"${n}\" ${t('not found', '未找到')}`);\n continue;\n }\n\n const issues = validateChange(changePath, options.checkDeps);\n log.info(`${symbol.start} ${n}`);\n\n if (issues.length === 0) {\n log.success(` ${symbol.ok} ${t('all checks passed', '所有检查通过')}`);\n } else {\n for (const issue of issues) {\n totalIssues++;\n if (issue.level === 'error') {\n log.error(` ${symbol.fail} [${issue.artifact}] ${issue.message}`);\n } else if (issue.level === 'warn') {\n log.warn(` ${symbol.warn} [${issue.artifact}] ${issue.message}`);\n } else {\n log.dim(` ℹ [${issue.artifact}] ${issue.message}`);\n }\n }\n }\n }\n\n if (totalIssues === 0) {\n log.success(`${symbol.ok} ${t('all validations passed', '所有验证通过')}`);\n } else {\n log.warn(`${symbol.warn} ${totalIssues} ${t('issue(s) found', '个问题')}`);\n }\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parseFrontmatter } from './frontmatter.js';\n\nexport interface ValidationIssue {\n level: 'error' | 'warn' | 'info';\n artifact: string;\n message: string;\n}\n\nfunction extractIds(content: string, pattern: RegExp): string[] {\n const matches = content.match(pattern);\n return matches ? [...new Set(matches)] : [];\n}\n\nexport function validateChange(changePath: string, checkDeps = false): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n const read = (name: string): string | null => {\n const p = join(changePath, name);\n return existsSync(p) ? readFileSync(p, 'utf-8') : null;\n };\n\n const proposal = read('proposal.md');\n const spec = read('spec.md');\n const tasks = read('tasks.md');\n\n if (!proposal) issues.push({ level: 'warn', artifact: 'proposal.md', message: 'missing' });\n if (!tasks) issues.push({ level: 'warn', artifact: 'tasks.md', message: 'missing' });\n\n if (proposal && spec) {\n const proposalGoals = extractIds(proposal, /US-\\d+/g);\n const specUS = extractIds(spec, /US-\\d+/g);\n for (const id of proposalGoals) {\n if (!specUS.includes(id)) {\n issues.push({\n level: 'error',\n artifact: 'spec.md',\n message: `${id} from proposal not found in spec`\n });\n }\n }\n }\n\n if (spec && tasks) {\n const specFR = extractIds(spec, /FR-\\d+/g);\n const tasksFR = extractIds(tasks, /FR-\\d+/g);\n\n for (const id of specFR) {\n if (!tasksFR.includes(id)) {\n issues.push({\n level: 'warn',\n artifact: 'tasks.md',\n message: `${id} from spec not referenced in tasks`\n });\n }\n }\n\n for (const id of tasksFR) {\n if (!specFR.includes(id)) {\n issues.push({\n level: 'error',\n artifact: 'tasks.md',\n message: `${id} referenced but not defined in spec`\n });\n }\n }\n }\n\n if (spec) {\n const acIds = extractIds(spec, /AC-\\d+\\.\\d+/g);\n const frIds = extractIds(spec, /FR-\\d+/g);\n for (const ac of acIds) {\n const frNum = ac.replace('AC-', '').split('.')[0];\n const parentFR = `FR-${frNum}`;\n if (!frIds.includes(parentFR)) {\n issues.push({\n level: 'warn',\n artifact: 'spec.md',\n message: `${ac} has no parent ${parentFR}`\n });\n }\n }\n }\n\n if (checkDeps && proposal) {\n const { meta, body } = parseFrontmatter(proposal);\n const fmDeps: string[] = Array.isArray(meta.depends_on) ? meta.depends_on : [];\n\n const contentRefs = extractIds(body, /depends[_ ]on[:\\s]+(\\S+)/gi);\n const mentioned = contentRefs.map((m) => m.replace(/depends[_ ]on[:\\s]+/i, ''));\n\n for (const dep of mentioned) {\n if (!fmDeps.includes(dep)) {\n issues.push({\n level: 'warn',\n artifact: 'proposal.md',\n message: `content mentions \"${dep}\" but not in frontmatter depends_on`\n });\n }\n }\n\n const changesDir = join(changePath, '..');\n for (const dep of fmDeps) {\n if (!existsSync(join(changesDir, dep))) {\n issues.push({\n level: 'error',\n artifact: 'proposal.md',\n message: `depends_on \"${dep}\" not found in changes`\n });\n }\n }\n }\n\n return issues;\n}\n"],"mappings":"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","names":["existsSync","readdirSync","join","existsSync","join","existsSync","readdirSync","existsSync","join","existsSync","join","__filename","join","existsSync","existsSync","readdirSync","readFileSync","join","deps","join","existsSync","readFileSync","deps","readdirSync","execSync","existsSync","readdirSync","writeFileSync","join","existsSync","readFileSync","writeFileSync","dirname","join","join","existsSync","dirname","existsSync","readdirSync","readFileSync","writeFileSync","join","join","existsSync","readFileSync","writeFileSync","readdirSync","join","existsSync","readdirSync","writeFileSync","execSync","existsSync","join","existsSync","readdirSync","readFileSync","join","join","existsSync","existsSync","readdirSync","readFileSync","basename","join","join","existsSync","readdirSync","basename","readFileSync","existsSync","readdirSync","readFileSync","join","join","existsSync","readFileSync","readdirSync","existsSync","writeFileSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","join","existsSync","writeFileSync","existsSync","join","join","existsSync","existsSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","join","existsSync","require"]}
|