ai-ops-cli 0.2.6 → 1.0.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.
Files changed (62) hide show
  1. package/README.ko.md +170 -0
  2. package/README.md +109 -163
  3. package/data/context-layer/AGENTS.md +29 -0
  4. package/data/context-layer/CLAUDE.md +14 -0
  5. package/data/context-layer/GEMINI.md +14 -0
  6. package/data/context-layer/docs/agent/checks/impact-checklist.md +16 -0
  7. package/data/context-layer/docs/agent/checks/review-checklist.md +17 -0
  8. package/data/context-layer/docs/agent/maps/codebase-map.md +16 -0
  9. package/data/context-layer/docs/agent/rules/doc-update-rules.md +22 -0
  10. package/data/context-layer/docs/agent/rules/routing-rules.md +22 -0
  11. package/data/context-layer/docs/agent/rules/stop-rules.md +20 -0
  12. package/data/context-layer/docs/agent/workflow.md +25 -0
  13. package/data/context-layer/docs/business/business-rules.md +16 -0
  14. package/data/context-layer/docs/docs-status.md +14 -0
  15. package/data/packs/pack-registry.json +8 -0
  16. package/data/packs/spec-lifecycle/docs/specs/README.ko.md +26 -0
  17. package/data/packs/spec-lifecycle/docs/specs/README.md +26 -0
  18. package/data/packs/spec-lifecycle/docs/specs/baseline/.gitkeep +1 -0
  19. package/data/packs/spec-lifecycle/docs/specs/initial-build/.gitkeep +1 -0
  20. package/data/skills/README.ko.md +182 -0
  21. package/data/skills/README.md +27 -2
  22. package/data/skills/skill-registry.json +64 -16
  23. package/data/skills/task-skills/doc-impact-reviewer/SKILL.md +101 -0
  24. package/data/skills/task-skills/doc-impact-reviewer/agents/openai.yaml +6 -0
  25. package/data/skills/task-skills/spec-baseline-sync/SKILL.md +134 -0
  26. package/data/skills/task-skills/spec-baseline-sync/agents/openai.yaml +6 -0
  27. package/data/skills/task-skills/spec-baseline-sync/references/template.md +14 -0
  28. package/data/skills/task-skills/spec-product-01-idea-to-brief/SKILL.md +78 -0
  29. package/data/skills/task-skills/spec-product-01-idea-to-brief/agents/openai.yaml +6 -0
  30. package/data/skills/task-skills/spec-product-01-idea-to-brief/references/template.md +36 -0
  31. package/data/skills/task-skills/spec-product-02-brief-to-technical-context/SKILL.md +91 -0
  32. package/data/skills/task-skills/spec-product-02-brief-to-technical-context/agents/openai.yaml +6 -0
  33. package/data/skills/task-skills/spec-product-02-brief-to-technical-context/references/template.md +58 -0
  34. package/data/skills/task-skills/spec-product-03-brief-to-product-spec/SKILL.md +85 -0
  35. package/data/skills/task-skills/spec-product-03-brief-to-product-spec/agents/openai.yaml +6 -0
  36. package/data/skills/task-skills/spec-product-03-brief-to-product-spec/references/template.md +41 -0
  37. package/data/skills/task-skills/spec-product-04-product-spec-to-ui-spec/SKILL.md +93 -0
  38. package/data/skills/task-skills/spec-product-04-product-spec-to-ui-spec/agents/openai.yaml +6 -0
  39. package/data/skills/task-skills/spec-product-04-product-spec-to-ui-spec/references/stitch-prompt-template.md +41 -0
  40. package/data/skills/task-skills/spec-product-04-product-spec-to-ui-spec/references/ui-spec-template.md +39 -0
  41. package/data/skills/task-skills/spec-product-05-spec-to-work-packets/SKILL.md +157 -0
  42. package/data/skills/task-skills/spec-product-05-spec-to-work-packets/agents/openai.yaml +6 -0
  43. package/data/skills/task-skills/spec-product-05-spec-to-work-packets/references/stitch-html-review.md +25 -0
  44. package/data/skills/task-skills/spec-product-05-spec-to-work-packets/references/work-packet-template.md +67 -0
  45. package/data/skills/task-skills/spec-shared-glossary-sync/SKILL.md +102 -0
  46. package/data/skills/task-skills/spec-shared-glossary-sync/agents/openai.yaml +6 -0
  47. package/data/skills/task-skills/spec-shared-glossary-sync/references/checklist.md +36 -0
  48. package/data/skills/task-skills/spec-shared-glossary-sync/references/template.md +58 -0
  49. package/data/subagents/README.ko.md +47 -0
  50. package/data/subagents/README.md +47 -0
  51. package/data/subagents/security-gate/PROMPT.md +18 -0
  52. package/data/subagents/security-gate/claude.frontmatter.yaml +8 -0
  53. package/data/subagents/security-gate/codex.frontmatter.toml +6 -0
  54. package/data/subagents/security-gate/gemini.frontmatter.yaml +6 -0
  55. package/data/subagents/security-reviewer/PROMPT.md +17 -0
  56. package/data/subagents/security-reviewer/claude.frontmatter.yaml +9 -0
  57. package/data/subagents/security-reviewer/codex.frontmatter.toml +6 -0
  58. package/data/subagents/security-reviewer/gemini.frontmatter.yaml +6 -0
  59. package/data/subagents/subagent-registry.json +14 -0
  60. package/dist/bin/index.js +2101 -1712
  61. package/dist/bin/index.js.map +1 -1
  62. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/index.ts","../../src/commands/init.ts","../../src/core/schemas/rule.schema.ts","../../src/core/schemas/preset.schema.ts","../../src/core/schemas/skill.schema.ts","../../src/core/schemas/skill-catalog.schema.ts","../../src/core/schemas/skill-registry.schema.ts","../../src/core/schemas/manifest.schema.ts","../../src/core/loader.ts","../../src/core/frontmatter.ts","../../src/core/renderer.ts","../../src/core/tool-output.ts","../../src/core/skill-renderer.ts","../../src/core/source-hash.ts","../../src/core/managed-header.ts","../../src/core/manifest-io.ts","../../src/core/manifest-resolution.ts","../../src/core/skill-registry-io.ts","../../src/core/diff.ts","../../src/core/install-plan.ts","../../src/data/spec-readme.ts","../../src/core/spec-plan.ts","../../src/core/uninstall-plan.ts","../../src/core/paths.ts","../../src/lib/paths.ts","../../src/lib/workspace.ts","../../src/lib/install.ts","../../src/lib/skill-install.ts","../../src/lib/tool-settings.ts","../../src/lib/deep-merge.util.ts","../../src/lib/prompt-control.ts","../../src/lib/gemini-settings.ts","../../src/lib/claude-settings.ts","../../src/lib/prettier-ignore.ts","../../src/lib/skill-state.ts","../../src/commands/update.ts","../../src/commands/diff.ts","../../src/commands/uninstall.ts","../../src/lib/uninstall.ts","../../src/commands/skill.ts","../../src/commands/spec.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { initCommand } from '../commands/init.js';\nimport { updateCommand } from '../commands/update.js';\nimport { diffCommand } from '../commands/diff.js';\nimport { uninstallCommand } from '../commands/uninstall.js';\nimport {\n skillDiffCommand,\n skillInstallCommand,\n skillListCommand,\n skillUninstallCommand,\n skillUpdateCommand,\n} from '../commands/skill.js';\nimport { specInitCommand } from '../commands/spec.js';\n\nconst program = new Command();\n\nprogram.name('ai-ops').description('AI 에이전트 규칙 스캐폴더').version('0.1.0');\n\nprogram\n .command('init')\n .description('AI 규칙 초기 설치')\n .action(() => initCommand());\n\nprogram\n .command('update')\n .description('기존 manifest 기반 규칙 갱신')\n .option('--force', '변경 없어도 강제 재설치', false)\n .action((opts: { force: boolean }) => updateCommand(opts));\n\nprogram\n .command('diff')\n .description('설치된 규칙과 최신 소스 비교')\n .action(() => diffCommand());\n\nprogram\n .command('uninstall')\n .description('설치된 규칙 파일 및 manifest 제거')\n .action(() => uninstallCommand());\n\nconst skillCommand = program.command('skill').description('에이전트 skill 설치/조회/갱신');\n\nconst applySkillScopeOptions = (command: Command): Command =>\n command\n .option('-g, --global', 'user scope에 설치/조회')\n .option('--project', 'project scope에 설치/조회')\n .option('--scope <scope>', 'explicit scope (user|project)')\n .option('--tool <tool...>', '대상 도구 지정');\n\napplySkillScopeOptions(skillCommand.command('list').description('사용 가능한 skill 목록')).action((opts) =>\n skillListCommand(opts),\n);\n\napplySkillScopeOptions(skillCommand.command('install <skillId>').description('skill 설치')).action((skillId, opts) =>\n skillInstallCommand(skillId, opts),\n);\n\napplySkillScopeOptions(skillCommand.command('diff [skillId]').description('skill 변경 비교')).action((skillId, opts) =>\n skillDiffCommand(skillId, opts),\n);\n\napplySkillScopeOptions(skillCommand.command('update [skillId]').description('skill 갱신')).action((skillId, opts) =>\n skillUpdateCommand(skillId, opts),\n);\n\napplySkillScopeOptions(skillCommand.command('uninstall <skillId>').description('skill 제거')).action((skillId, opts) =>\n skillUninstallCommand(skillId, opts),\n);\n\nconst specCommand = program.command('spec').description('spec 파이프라인 관리');\n\nspecCommand\n .command('init')\n .description('specs/ 디렉토리 구조 초기화')\n .option('--force', '이미 존재해도 강제 재생성', false)\n .action((opts: { force: boolean }) => specInitCommand(opts));\n\nprogram.parse();\n","import * as p from '@clack/prompts';\nimport type { InstalledSkill, Preset, Rule, Skill, ToolId, WorkspaceMapping } from '@/core/index.js';\nimport {\n loadAllRules,\n loadAllSkills,\n loadPresets,\n resolvePresetRules,\n resolvePresetSkills,\n renderForTool,\n buildInstallPlan,\n buildSkillInstallPlan,\n buildManifest,\n computeSourceHash,\n getCliVersion,\n resolveManifestPath,\n writeManifest,\n readSkillRegistry,\n resolveSkillRegistryPath,\n writeSkillRegistry,\n} from '@/core/index.js';\nimport {\n resolveBasePath,\n resolveCompilerDataDir,\n resolvePresetsPath,\n resolveRulesDir,\n resolveSkillsDir,\n resolveUserBasePath,\n} from '../lib/paths.js';\nimport { listWorkspaceCandidates } from '../lib/workspace.js';\nimport { installFiles } from '../lib/install.js';\nimport { installSkillPackages } from '../lib/skill-install.js';\nimport { promptGeminiSettings, installGeminiSettings } from '../lib/gemini-settings.js';\nimport { promptClaudeSettings, installClaudeSettings } from '../lib/claude-settings.js';\nimport { promptPrettierIgnore, installPrettierIgnore } from '../lib/prettier-ignore.js';\nimport { isPromptCancelled } from '../lib/prompt-control.js';\nimport {\n findInstalledSkill,\n mergeSkillTools,\n subtractSkillTools,\n type SkillScope,\n upsertInstalledSkill,\n} from '../lib/skill-state.js';\n\ntype SelectedSkillTarget = {\n skill: Skill;\n requestedTools: ToolId[];\n};\n\ntype InstallablePresetSkill = SelectedSkillTarget & {\n globalTools: ToolId[];\n};\n\ntype GlobalPresetSkill = {\n skill: Skill;\n availableTools: ToolId[];\n};\n\ntype WorkspacePresetMapping = {\n workspace: string;\n preset: Preset;\n finalRules: Rule[];\n finalSkillTargets: SelectedSkillTarget[];\n};\n\nconst TOOL_OPTIONS = [\n { value: 'claude-code' as ToolId, label: 'Claude Code' },\n { value: 'codex' as ToolId, label: 'Codex' },\n { value: 'gemini' as ToolId, label: 'Gemini CLI' },\n];\n\nconst deduplicateRules = (rules: readonly Rule[]): Rule[] => {\n const seen = new Set<string>();\n return rules.filter((rule) => {\n if (seen.has(rule.id)) return false;\n seen.add(rule.id);\n return true;\n });\n};\n\nconst formatToolList = (toolIds: readonly ToolId[]): string => toolIds.join(', ');\n\nconst deduplicateSkillTargets = (targets: readonly SelectedSkillTarget[]): SelectedSkillTarget[] => {\n const merged = new Map<string, SelectedSkillTarget>();\n\n for (const target of targets) {\n const previous = merged.get(target.skill.id);\n if (!previous) {\n merged.set(target.skill.id, {\n skill: target.skill,\n requestedTools: [...target.requestedTools],\n });\n continue;\n }\n\n merged.set(target.skill.id, {\n skill: target.skill,\n requestedTools: mergeSkillTools({\n existing: previous.requestedTools,\n requested: target.requestedTools,\n }),\n });\n }\n\n return [...merged.values()].sort((a, b) => a.skill.id.localeCompare(b.skill.id));\n};\n\nconst resolveSupportedRequestedTools = (skill: Skill, selectedTools: readonly ToolId[]): ToolId[] =>\n selectedTools.filter((toolId) => skill.supported_tools.includes(toolId));\n\nconst partitionPresetSkills = (params: {\n preset: Preset;\n allSkills: readonly Skill[];\n selectedTools: readonly ToolId[];\n globalInstalledSkills: readonly InstalledSkill[];\n}): {\n globalSkills: GlobalPresetSkill[];\n installableSkills: InstallablePresetSkill[];\n} => {\n const globalSkills: GlobalPresetSkill[] = [];\n const installableSkills: InstallablePresetSkill[] = [];\n\n for (const skill of resolvePresetSkills(params.preset, params.allSkills)) {\n if (skill.kind !== 'reference') {\n continue;\n }\n\n const supportedRequestedTools = resolveSupportedRequestedTools(skill, params.selectedTools);\n if (supportedRequestedTools.length === 0) {\n continue;\n }\n\n const installedGlobalSkill = findInstalledSkill(params.globalInstalledSkills, skill.id);\n const availableTools = installedGlobalSkill\n ? supportedRequestedTools.filter((toolId) => installedGlobalSkill.tools.includes(toolId))\n : [];\n const requestedTools = subtractSkillTools({\n requested: supportedRequestedTools,\n installed: availableTools,\n });\n\n if (requestedTools.length === 0) {\n globalSkills.push({\n skill,\n availableTools,\n });\n continue;\n }\n\n installableSkills.push({\n skill,\n requestedTools,\n globalTools: availableTools,\n });\n }\n\n return {\n globalSkills,\n installableSkills,\n };\n};\n\nconst selectPresetAndFineTune = async (\n workspaceName: string,\n presets: readonly Preset[],\n allRules: readonly Rule[],\n allSkills: readonly Skill[],\n selectedTools: readonly ToolId[],\n globalInstalledSkills: readonly InstalledSkill[],\n): Promise<WorkspacePresetMapping | null> => {\n const preset = await p.select<Preset>({\n message: `[${workspaceName}] 프리셋을 선택하세요`,\n options: presets.map((candidate) => ({\n value: candidate,\n label: candidate.id,\n hint: candidate.description,\n })),\n });\n if (p.isCancel(preset)) return null;\n\n const finalRules = resolvePresetRules(preset, allRules);\n if (finalRules.length > 0) {\n p.note(finalRules.map((rule) => ` ✓ ${rule.id}`).join('\\n'), `[${workspaceName}] core rules (잠금)`);\n }\n\n const { globalSkills, installableSkills } = partitionPresetSkills({\n preset,\n allSkills,\n selectedTools,\n globalInstalledSkills,\n });\n\n if (globalSkills.length > 0) {\n const globalLines = globalSkills.map(\n ({ skill, availableTools }) => ` ✓ ${skill.id} (${formatToolList(availableTools)})`,\n );\n p.note(globalLines.join('\\n'), `[${workspaceName}] already available globally`);\n }\n\n if (installableSkills.length === 0) {\n p.note(' 새로 설치할 reference skill이 없습니다.', `[${workspaceName}] installable reference skills`);\n return {\n workspace: workspaceName,\n preset,\n finalRules,\n finalSkillTargets: [],\n };\n }\n\n const selectedSkillIds = await p.multiselect<string>({\n message: `[${workspaceName}] installable reference skills 선택`,\n options: installableSkills.map(({ skill, requestedTools, globalTools }) => ({\n value: skill.id,\n label: skill.id,\n hint:\n globalTools.length > 0\n ? `global: ${formatToolList(globalTools)} / install: ${formatToolList(requestedTools)}`\n : `${skill.description} / install: ${formatToolList(requestedTools)}`,\n })),\n initialValues: installableSkills.map(({ skill }) => skill.id),\n required: false,\n });\n if (p.isCancel(selectedSkillIds)) return null;\n\n const selectedSkillSet = new Set(selectedSkillIds as string[]);\n\n return {\n workspace: workspaceName,\n preset,\n finalRules,\n finalSkillTargets: installableSkills\n .filter(({ skill }) => selectedSkillSet.has(skill.id))\n .map(({ skill, requestedTools }) => ({\n skill,\n requestedTools,\n })),\n };\n};\n\nconst selectInitSkillScope = async (): Promise<SkillScope | null> => {\n const scope = await p.select<SkillScope>({\n message: '선택된 skills를 어디에 설치할까요?',\n options: [\n { value: 'user', label: 'user (global)', hint: '기본값. 여러 프로젝트에서 재사용' },\n { value: 'project', label: 'project', hint: '현재 프로젝트에만 설치' },\n ],\n });\n return p.isCancel(scope) ? null : scope;\n};\n\nexport const initCommand = async (): Promise<void> => {\n const basePath = resolveBasePath();\n const userBasePath = resolveUserBasePath();\n const rulesDir = resolveRulesDir();\n const skillsDir = resolveSkillsDir();\n const spinner = p.spinner();\n let spinnerStarted = false;\n\n const cancelInit = (params?: { message?: string; exitCode?: number }): never => {\n if (spinnerStarted) {\n spinner.stop('설치 중단됨');\n spinnerStarted = false;\n }\n\n p.cancel(params?.message ?? '취소됨');\n process.exit(params?.exitCode ?? 0);\n };\n\n const handleSigint = (): never =>\n cancelInit({\n message: '사용자 요청으로 init이 중단되었습니다.',\n exitCode: 130,\n });\n\n process.once('SIGINT', handleSigint);\n\n try {\n p.intro('ai-ops init');\n\n const selectedTools = await p.multiselect<ToolId>({\n message: 'AI 도구를 선택하세요',\n options: TOOL_OPTIONS,\n required: true,\n });\n if (p.isCancel(selectedTools)) {\n cancelInit();\n }\n\n const isMonorepo = await p.confirm({\n message: '모노레포 프로젝트입니까?',\n initialValue: false,\n });\n if (p.isCancel(isMonorepo)) {\n cancelInit();\n }\n\n const allRules = loadAllRules(rulesDir);\n const allSkills = loadAllSkills(skillsDir);\n const presets = loadPresets(resolvePresetsPath());\n const sourceHash = computeSourceHash(resolveCompilerDataDir());\n const globalInstalledSkills = readSkillRegistry(resolveSkillRegistryPath(userBasePath))?.skills ?? [];\n\n const mappings: WorkspacePresetMapping[] = [];\n\n if (!isMonorepo) {\n const mapping =\n (await selectPresetAndFineTune(\n '.',\n presets,\n allRules,\n allSkills,\n selectedTools as ToolId[],\n globalInstalledSkills,\n )) ?? cancelInit();\n mappings.push(mapping);\n } else {\n const candidates = listWorkspaceCandidates(basePath);\n const selectedWorkspaces = await p.multiselect<string>({\n message: '워크스페이스를 선택하세요',\n options: candidates.map((candidate) => ({ value: candidate, label: candidate })),\n required: true,\n });\n if (p.isCancel(selectedWorkspaces)) {\n cancelInit();\n }\n\n for (const workspace of selectedWorkspaces as string[]) {\n const mapping =\n (await selectPresetAndFineTune(\n workspace,\n presets,\n allRules,\n allSkills,\n selectedTools as ToolId[],\n globalInstalledSkills,\n )) ?? cancelInit();\n mappings.push(mapping);\n }\n }\n\n const selectedSkillTargets = deduplicateSkillTargets(mappings.flatMap((mapping) => mapping.finalSkillTargets));\n const skillScope = selectedSkillTargets.length > 0 ? await selectInitSkillScope() : null;\n if (selectedSkillTargets.length > 0 && skillScope === null) {\n cancelInit();\n }\n\n const geminiSettingValues = (selectedTools as ToolId[]).includes('gemini') ? await promptGeminiSettings() : null;\n const resolvedGeminiSettingValues = isPromptCancelled(geminiSettingValues) ? cancelInit() : geminiSettingValues;\n\n const claudeSettingValues = (selectedTools as ToolId[]).includes('claude-code')\n ? await promptClaudeSettings()\n : null;\n const resolvedClaudeSettingValues = isPromptCancelled(claudeSettingValues) ? cancelInit() : claudeSettingValues;\n\n const wantPrettierIgnore = await promptPrettierIgnore();\n const resolvedWantPrettierIgnore = isPromptCancelled(wantPrettierIgnore) ? cancelInit() : wantPrettierIgnore;\n\n spinner.start('규칙 설치 중...');\n spinnerStarted = true;\n\n const meta = { sourceHash, generatedAt: new Date().toISOString() };\n const allInstalledFiles: string[] = [];\n const allAppended: string[] = [];\n const selectedRuleIds = deduplicateRules(mappings.flatMap((mapping) => mapping.finalRules)).map((rule) => rule.id);\n\n let projectInstalledSkills: InstalledSkill[] = [];\n\n if (selectedSkillTargets.length > 0 && skillScope !== null) {\n const skillBasePath = skillScope === 'project' ? basePath : userBasePath;\n const installedSkills = selectedSkillTargets.map(({ skill, requestedTools }) => {\n const existingUserSkill =\n skillScope === 'user' ? findInstalledSkill(globalInstalledSkills, skill.id) : undefined;\n const nextRequestedTools =\n skillScope === 'user'\n ? mergeSkillTools({\n existing: existingUserSkill?.tools,\n requested: requestedTools,\n })\n : requestedTools;\n const { packages, installedSkill } = buildSkillInstallPlan({\n skill,\n requestedTools: nextRequestedTools,\n scope: skillScope,\n });\n installSkillPackages(skillBasePath, packages);\n return installedSkill;\n });\n\n if (skillScope === 'project') {\n projectInstalledSkills = installedSkills;\n } else {\n const registryPath = resolveSkillRegistryPath(skillBasePath);\n const previous = readSkillRegistry(registryPath);\n const nextSkills = installedSkills.reduce<InstalledSkill[]>(\n (acc, installedSkill) => upsertInstalledSkill(acc, installedSkill),\n previous?.skills ?? [],\n );\n writeSkillRegistry(registryPath, {\n skills: nextSkills,\n cliVersion: getCliVersion(),\n generatedAt: new Date().toISOString(),\n });\n }\n }\n\n for (const toolId of selectedTools as ToolId[]) {\n if (isMonorepo) {\n const allWorkspaceRules = deduplicateRules(mappings.flatMap((mapping) => mapping.finalRules));\n const workspaceMappings: WorkspaceMapping[] = mappings.map((mapping) => ({\n path: mapping.workspace,\n ruleIds: mapping.finalRules.map((rule) => rule.id),\n }));\n const renderResult = renderForTool(toolId, allWorkspaceRules, workspaceMappings);\n const actions = buildInstallPlan({ toolId, renderResult, meta });\n const result = installFiles(basePath, actions, meta);\n allInstalledFiles.push(...result.written);\n allAppended.push(...result.appended);\n } else {\n const renderResult = renderForTool(toolId, mappings[0].finalRules);\n const actions = buildInstallPlan({ toolId, renderResult, meta });\n const result = installFiles(basePath, actions, meta);\n allInstalledFiles.push(...result.written);\n allAppended.push(...result.appended);\n }\n }\n\n if (resolvedGeminiSettingValues && resolvedGeminiSettingValues.length > 0) {\n installGeminiSettings(basePath, resolvedGeminiSettingValues);\n }\n\n if (resolvedClaudeSettingValues && resolvedClaudeSettingValues.length > 0) {\n installClaudeSettings(basePath, resolvedClaudeSettingValues);\n }\n\n if (resolvedWantPrettierIgnore) {\n installPrettierIgnore(basePath);\n }\n\n spinner.stop('규칙 설치 완료');\n spinnerStarted = false;\n\n const workspacesRecord = isMonorepo\n ? Object.fromEntries(\n mappings.map((mapping) => [\n mapping.workspace,\n {\n preset: mapping.preset.id,\n rules: mapping.finalRules.map((rule) => rule.id),\n },\n ]),\n )\n : undefined;\n\n const manifest = buildManifest({\n tools: selectedTools as string[],\n scope: 'project',\n preset: !isMonorepo ? mappings[0].preset.id : undefined,\n workspaces: workspacesRecord,\n installedRules: selectedRuleIds,\n installedFiles: allInstalledFiles,\n installedSkills: projectInstalledSkills,\n appendedFiles: allAppended,\n settings:\n resolvedClaudeSettingValues || resolvedGeminiSettingValues || resolvedWantPrettierIgnore\n ? {\n claude: resolvedClaudeSettingValues ? [...resolvedClaudeSettingValues] : undefined,\n gemini: resolvedGeminiSettingValues ? [...resolvedGeminiSettingValues] : undefined,\n prettierignore: resolvedWantPrettierIgnore || undefined,\n }\n : undefined,\n cliVersion: getCliVersion(),\n sourceHash,\n });\n writeManifest(resolveManifestPath(basePath), manifest);\n\n if (allAppended.length > 0) {\n p.log.info(`기존 파일에 섹션 추가됨 (내용 보존):\\n${allAppended.map((file) => ` ${file}`).join('\\n')}`);\n }\n p.log.success(`설치된 core rules: ${selectedRuleIds.length}개`);\n p.log.success(`설치된 skills: ${selectedSkillTargets.length}개${skillScope ? ` (${skillScope})` : ''}`);\n if (selectedSkillTargets.length > 0 && skillScope === 'user') {\n p.log.info('global skill은 ai-ops uninstall 대상이 아닙니다. ai-ops skill uninstall으로 제거하세요.');\n }\n p.outro('ai-ops init 완료');\n } finally {\n process.off('SIGINT', handleSigint);\n }\n};\n","/**\n * Rule = SSOT의 최소 지식 단위. 하나의 코딩 컨벤션/아키텍처 규칙을 YAML로 구조화한 것.\n */\nimport { z } from 'zod';\n\nexport const DecisionTableEntrySchema = z\n .object({\n when: z.string().min(1),\n then: z.string().min(1),\n /** 조건부 규칙에서 회피해야 할 패턴 */\n avoid: z.string().min(1).optional(),\n })\n .strict();\n\nexport const RuleContentSchema = z\n .object({\n /** Anti-pattern 규칙 ('하지 마라'). guidelines보다 항상 상단 렌더링 */\n constraints: z.array(z.string().min(1)).default([]),\n /** Positive 규칙 ('해라') */\n guidelines: z.array(z.string().min(1)),\n /** 조건부 규칙. when→then→avoid 구조 */\n decision_table: z.array(DecisionTableEntrySchema).optional(),\n })\n .strict();\n\nexport const RuleSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n category: z.string().min(1),\n tags: z.array(z.string().min(1)),\n /** 0-100. 높을수록 생성 파일 상단 배치 (U-shaped attention 최적화) */\n priority: z.number().int().min(0).max(100),\n supported_tools: z.array(z.string().min(1)).min(1).default(['claude-code', 'codex', 'gemini']),\n content: RuleContentSchema,\n })\n .strict();\n\nexport type DecisionTableEntry = z.infer<typeof DecisionTableEntrySchema>;\nexport type RuleContent = z.infer<typeof RuleContentSchema>;\nexport type Rule = z.infer<typeof RuleSchema>;\n","import { z } from 'zod';\n\nexport const PresetSchema = z\n .object({\n id: z\n .string()\n .regex(/^[a-z][a-z0-9-]*$/)\n .min(1),\n description: z.string().min(1),\n rules: z.array(z.string().min(1)).min(1),\n })\n .strict();\n\nexport type Preset = z.infer<typeof PresetSchema>;\n","import { z } from 'zod';\n\nexport const SKILL_KIND = {\n REFERENCE: 'reference',\n TASK: 'task',\n} as const;\n\nexport const SKILL_SCOPE = {\n PROJECT: 'project',\n USER: 'user',\n} as const;\n\nexport const SKILL_TOOL = {\n CLAUDE_CODE: 'claude-code',\n CODEX: 'codex',\n GEMINI: 'gemini',\n} as const;\n\nexport const SkillKindSchema = z.union([z.literal(SKILL_KIND.REFERENCE), z.literal(SKILL_KIND.TASK)]);\nexport const SkillScopeSchema = z.union([z.literal(SKILL_SCOPE.PROJECT), z.literal(SKILL_SCOPE.USER)]);\nexport const SkillToolSchema = z.union([\n z.literal(SKILL_TOOL.CLAUDE_CODE),\n z.literal(SKILL_TOOL.CODEX),\n z.literal(SKILL_TOOL.GEMINI),\n]);\n\nexport const SkillFileSchema = z\n .object({\n path: z.string().min(1),\n content: z.string(),\n })\n .strict();\n\nexport const SkillFrontmatterSchema = z\n .object({\n name: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'name must be kebab-case'),\n description: z.string().min(1),\n })\n .passthrough();\n\nexport type SkillFile = z.infer<typeof SkillFileSchema>;\nexport type SkillFrontmatter = z.infer<typeof SkillFrontmatterSchema>;\nexport type Skill = {\n id: string;\n kind: z.infer<typeof SkillKindSchema>;\n description: string;\n supported_tools: z.infer<typeof SkillToolSchema>[];\n install_scopes: z.infer<typeof SkillScopeSchema>[];\n groups: string[];\n included_in_presets: string[];\n directory: string;\n files: SkillFile[];\n};\n\nexport const InstalledSkillSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n kind: SkillKindSchema,\n tools: z.array(SkillToolSchema).min(1),\n scope: SkillScopeSchema,\n installed_paths: z.array(z.string().min(1)).min(1),\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n })\n .strip();\n\nexport type InstalledSkill = z.infer<typeof InstalledSkillSchema>;\n","import { z } from 'zod';\nimport { SkillKindSchema, SkillScopeSchema, SkillToolSchema } from './skill.schema.js';\n\nconst SkillIdSchema = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case');\nconst SkillCatalogPathSchema = z\n .string()\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*)+$/, 'source_path must be relative kebab-case path');\n\nexport const SkillCatalogEntrySchema = z\n .object({\n id: SkillIdSchema,\n kind: SkillKindSchema,\n supported_tools: z.array(SkillToolSchema).min(1),\n install_scopes: z.array(SkillScopeSchema).min(1),\n groups: z.array(z.string().min(1)),\n included_in_presets: z.array(z.string().min(1)),\n source_path: SkillCatalogPathSchema,\n })\n .strict()\n .superRefine((entry, ctx) => {\n const expectedPrefix = entry.kind === 'reference' ? 'reference-skills/' : 'task-skills/';\n\n if (!entry.source_path.startsWith(expectedPrefix)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['source_path'],\n message: `source_path must start with ${expectedPrefix}`,\n });\n }\n });\n\nexport const SkillCatalogSchema = z\n .object({\n skills: z.array(SkillCatalogEntrySchema),\n })\n .strict();\n\nexport type SkillCatalogEntry = z.infer<typeof SkillCatalogEntrySchema>;\nexport type SkillCatalog = z.infer<typeof SkillCatalogSchema>;\n","import { z } from 'zod';\nimport { InstalledSkillSchema } from './skill.schema.js';\n\nexport const SkillRegistrySchema = z\n .object({\n skills: z.array(InstalledSkillSchema),\n cliVersion: z.string().optional(),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type SkillRegistry = z.infer<typeof SkillRegistrySchema>;\n","/**\n * Manifest = 설치 추적 메타데이터. CLI가 이전 설치 상태를 기억하기 위한 JSON.\n */\nimport { z } from 'zod';\nimport { InstalledSkillSchema } from './skill.schema.js';\n\nexport const SCOPES = {\n PROJECT: 'project',\n} as const;\n\n/** init/update 시 선택된 settings 항목 추적 */\nconst SettingsConfigSchema = z\n .object({\n claude: z.array(z.string().min(1)).optional(),\n gemini: z.array(z.string().min(1)).optional(),\n prettierignore: z.boolean().optional(),\n })\n .strict();\n\nexport type SettingsConfig = z.infer<typeof SettingsConfigSchema>;\n\n/** 모노레포 워크스페이스별 preset + rules 추적 */\nconst WorkspaceEntrySchema = z\n .object({\n preset: z.string().min(1),\n rules: z.array(z.string().min(1)),\n })\n .strict();\n\nexport type WorkspaceEntry = z.infer<typeof WorkspaceEntrySchema>;\n\nexport const ManifestSchema = z\n .object({\n tools: z.array(z.string().min(1)).min(1),\n scope: z.literal('project'),\n /** 비모노레포 단일 preset */\n preset: z.string().min(1).optional(),\n /** 모노레포: workspace path → { preset, rules } */\n workspaces: z.record(z.string(), WorkspaceEntrySchema).optional(),\n installed_rules: z.array(z.string().min(1)),\n /** 실제 디스크에 쓰여진 파일 상대 경로 목록 (uninstall용). 기존 manifest 호환성 위해 optional */\n installed_files: z.array(z.string().min(1)).optional(),\n /** skill 설치 루트 디렉토리 목록 */\n installed_skills: z.array(InstalledSkillSchema).optional(),\n /** non-managed 파일에 섹션을 append한 경우 추적 (uninstall 시 섹션만 제거) */\n appended_files: z.array(z.string().min(1)).optional(),\n /** init 시 선택된 settings 항목 — update 시 재생성에 사용 */\n settings: SettingsConfigSchema.optional(),\n /** init/update 실행 시점의 CLI 패키지 버전 — 버전 변경 감지에 사용 */\n cliVersion: z.string().optional(),\n /** SSOT 데이터 파일들의 deterministic SHA-256 해시 (6자리 hex). diff/update 판단 기준 */\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n","import { readFileSync, readdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { parse } from 'yaml';\nimport { parseMarkdownFrontmatter } from './frontmatter.js';\nimport { RuleSchema, PresetSchema, SkillCatalogSchema, SkillFrontmatterSchema } from './schemas/index.js';\nimport type { Rule, Preset, Skill, SkillCatalog } from './schemas/index.js';\n\n// priority 내림차순 정렬 (높을수록 상단 → U-shaped attention)\nexport const sortRulesByPriority = (rules: readonly Rule[]): Rule[] =>\n [...rules].sort((a, b) => b.priority - a.priority);\n\nconst deduplicateRulesById = (rules: readonly Rule[]): Rule[] => {\n const seen = new Set<string>();\n return rules.filter((rule) => {\n if (seen.has(rule.id)) return false;\n seen.add(rule.id);\n return true;\n });\n};\n\nconst resolveRuleById = (ruleId: string, allRules: readonly Rule[], context?: string): Rule => {\n const found = allRules.find((rule) => rule.id === ruleId);\n if (!found) {\n const suffix = context ? ` (from ${context})` : '';\n throw new Error(`Rule not found: ${ruleId}${suffix}`);\n }\n return found;\n};\n\n// presets.yaml의 Record<id, {description, rules}> → Preset[] 변환\nexport const parseRawPresets = (raw: Record<string, { description: string; rules: string[] }>): Preset[] =>\n Object.entries(raw).map(([id, value]) => PresetSchema.parse({ id, ...value }));\n\n// preset.rules 목록을 실제 core rule로 해석 + priority 정렬, 누락 시 throw\nexport const resolvePresetRules = (preset: Preset, allRules: readonly Rule[]): Rule[] => {\n const resolved = preset.rules.map((ruleId) => resolveRuleById(ruleId, allRules, preset.id));\n return sortRulesByPriority(deduplicateRulesById(resolved));\n};\n\nexport const resolvePresetSkills = (preset: Preset, allSkills: readonly Skill[]): Skill[] => {\n return allSkills\n .filter((skill) => skill.included_in_presets.includes(preset.id))\n .sort((a, b) => a.id.localeCompare(b.id));\n};\n\nexport const loadRuleFile = (filePath: string): Rule => {\n const raw = readFileSync(filePath, 'utf-8');\n return RuleSchema.parse(parse(raw));\n};\n\nconst loadSkillDirectoryFiles = (skillDir: string): Skill['files'] => {\n const files: Skill['files'] = [];\n\n const walk = (relativeDir = ''): void => {\n const absDir = relativeDir.length > 0 ? join(skillDir, relativeDir) : skillDir;\n const entries = readdirSync(absDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const nextRelativePath = relativeDir.length > 0 ? join(relativeDir, entry.name) : entry.name;\n if (entry.isDirectory()) {\n walk(nextRelativePath);\n continue;\n }\n\n files.push({\n path: nextRelativePath,\n content: readFileSync(join(skillDir, nextRelativePath), 'utf-8'),\n });\n }\n };\n\n walk();\n return files;\n};\n\n// readdirSync + .yaml 필터 + 파일명 sort(결정적 로딩) → priority 내림차순\nexport const loadAllRules = (rulesDir: string): Rule[] => {\n const files = readdirSync(rulesDir)\n .filter((f) => f.endsWith('.yaml'))\n .sort();\n const rules = files.map((f) => loadRuleFile(resolve(rulesDir, f)));\n return sortRulesByPriority(rules);\n};\n\nexport const loadSkillCatalog = (skillsDir: string): SkillCatalog =>\n SkillCatalogSchema.parse(JSON.parse(readFileSync(resolve(skillsDir, 'skill-registry.json'), 'utf-8')));\n\nexport const loadAllSkills = (skillsDir: string): Skill[] => {\n const catalog = loadSkillCatalog(skillsDir);\n const entries = [...catalog.skills].sort((a, b) => a.id.localeCompare(b.id));\n\n return entries.map((entry) => {\n const directory = resolve(skillsDir, entry.source_path);\n const skillMdPath = join(directory, 'SKILL.md');\n const rawSkillMd = readFileSync(skillMdPath, 'utf-8');\n const { frontmatter } = parseMarkdownFrontmatter(rawSkillMd);\n const parsed = SkillFrontmatterSchema.parse(frontmatter);\n if (parsed.name !== entry.id) {\n throw new Error(`Skill directory and frontmatter name mismatch: ${entry.id} != ${parsed.name}`);\n }\n\n const files = loadSkillDirectoryFiles(directory);\n if (entry.kind === 'reference' && !files.some((file) => file.path === 'references/reference.md')) {\n throw new Error(`Reference skill must include references/reference.md: ${parsed.name}`);\n }\n\n return {\n id: entry.id,\n kind: entry.kind,\n description: parsed.description,\n supported_tools: [...entry.supported_tools],\n install_scopes: [...entry.install_scopes],\n groups: [...entry.groups],\n included_in_presets: [...entry.included_in_presets],\n directory,\n files,\n };\n });\n};\n\nexport const loadPresets = (presetsPath: string): Preset[] => {\n const raw = readFileSync(presetsPath, 'utf-8');\n const data = parse(raw) as Record<string, { description: string; rules: string[] }>;\n return parseRawPresets(data);\n};\n","import { parse } from 'yaml';\n\nexport const parseMarkdownFrontmatter = (content: string): { frontmatter: unknown; body: string } => {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n?/);\n if (!match) {\n throw new Error('Missing YAML frontmatter');\n }\n\n return {\n frontmatter: parse(match[1]),\n body: content.slice(match[0].length),\n };\n};\n","import { join } from 'node:path';\nimport type { Rule, DecisionTableEntry } from './schemas/index.js';\nimport { GLOBAL_CATEGORIES, CLAUDE_CODE_PATH_GLOBS, TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { ToolId } from './tool-output.js';\n\n// \"react-typescript\" → \"React Typescript\"\nexport const ruleIdToTitle = (id: string): string =>\n id\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n\n// DecisionTableEntry[] → Markdown 테이블 (pipe 문자 &#124; escape)\nexport const renderDecisionTable = (entries: readonly DecisionTableEntry[]): string => {\n const escape = (s: string) => s.replace(/\\|/g, '&#124;');\n const hasAvoid = entries.some((e) => e.avoid !== undefined);\n\n const header = hasAvoid ? '| When | Then | Avoid |\\n|------|------|-------|' : '| When | Then |\\n|------|------|';\n\n const rows = entries.map((e) => {\n const when = escape(e.when);\n const then = escape(e.then);\n if (hasAvoid) {\n const avoid = e.avoid ? escape(e.avoid) : '';\n return `| ${when} | ${then} | ${avoid} |`;\n }\n return `| ${when} | ${then} |`;\n });\n\n return [header, ...rows].join('\\n');\n};\n\n// 단일 Rule → Markdown (빈 섹션 생략)\nexport const renderRuleToMarkdown = (rule: Rule): string => {\n const sections: string[] = [`# ${ruleIdToTitle(rule.id)}`];\n\n if (rule.content.constraints.length > 0) {\n sections.push('## Constraints');\n sections.push(rule.content.constraints.map((c) => `- ${c}`).join('\\n'));\n }\n\n if (rule.content.guidelines.length > 0) {\n sections.push('## Guidelines');\n sections.push(rule.content.guidelines.map((g) => `- ${g}`).join('\\n'));\n }\n\n if (rule.content.decision_table && rule.content.decision_table.length > 0) {\n sections.push('## Decision Table');\n sections.push(renderDecisionTable(rule.content.decision_table));\n }\n\n return sections.join('\\n\\n');\n};\n\n// Rule[] → 단일 Markdown (--- separator, single-file 모드용)\nexport const renderRulesToMarkdown = (rules: readonly Rule[]): string =>\n rules.map((rule) => renderRuleToMarkdown(rule)).join('\\n\\n---\\n\\n');\n\n// Rule이 global 카테고리에 속하는지 판별\nexport const isGlobalRule = (rule: Rule): boolean => (GLOBAL_CATEGORIES as readonly string[]).includes(rule.category);\n\n// Rule[] → { global, domain } 분리\nexport const partitionRules = (rules: readonly Rule[]): { global: Rule[]; domain: Rule[] } => {\n const global: Rule[] = [];\n const domain: Rule[] = [];\n for (const rule of rules) {\n if (isGlobalRule(rule)) {\n global.push(rule);\n } else {\n domain.push(rule);\n }\n }\n return { global, domain };\n};\n\n// glob 배열 → YAML frontmatter 블록\nexport const renderFrontmatter = (paths: readonly string[]): string => {\n const lines = paths.map((p) => ` - \"${p}\"`).join('\\n');\n return `---\\npaths:\\n${lines}\\n---`;\n};\n\nexport type WorkspaceMapping = {\n path: string;\n ruleIds: readonly string[];\n};\n\n// 단일 Rule → Claude Code용 Markdown\n// domain 룰이면서 glob 매핑이 있으면 paths: frontmatter 추가 (단일 프로젝트 전용)\n// global 룰 또는 매핑 없는 domain 룰 → frontmatter 없음\nexport const renderClaudeCodeRule = (rule: Rule): string => {\n const globs = CLAUDE_CODE_PATH_GLOBS[rule.id];\n if (!isGlobalRule(rule) && globs !== undefined) {\n return `${renderFrontmatter(globs)}\\n\\n${renderRuleToMarkdown(rule)}`;\n }\n return renderRuleToMarkdown(rule);\n};\n\n// 도구별 렌더링 결과 타입 (tagged union)\nexport type ClaudeCodeRenderResult = {\n tool: 'claude-code';\n files: { relativePath: string; content: string }[];\n};\n\nexport type CodexRenderResult = {\n tool: 'codex';\n rootContent: string;\n domainFiles: { workspacePath: string; content: string }[];\n};\n\nexport type GeminiRenderResult = {\n tool: 'gemini';\n rootContent: string;\n domainFiles: { workspacePath: string; content: string }[];\n};\n\nexport type ToolRenderResult = ClaudeCodeRenderResult | CodexRenderResult | GeminiRenderResult;\n\n// CLI 진입점: toolId + rules → 도구별 렌더링 결과\nexport const renderForTool = (\n toolId: ToolId,\n rules: readonly Rule[],\n workspaceMappings?: readonly WorkspaceMapping[],\n): ToolRenderResult => {\n const config = TOOL_OUTPUT_MAP[toolId];\n\n if (toolId === 'claude-code') {\n const { rulesDir, fileExtension } = config as (typeof TOOL_OUTPUT_MAP)['claude-code'];\n\n if (!workspaceMappings || workspaceMappings.length === 0) {\n // 단일 프로젝트: domain 룰에 paths: frontmatter (path-scoped)\n const files = rules.map((rule) => ({\n relativePath: join(rulesDir, `${rule.id}${fileExtension}`),\n content: renderClaudeCodeRule(rule),\n }));\n return { tool: 'claude-code', files };\n }\n\n // 모노레포: global → .claude/rules/, domain → {workspace}/CLAUDE.md (진짜 지연 로딩)\n const { global, domain } = partitionRules(rules);\n\n const globalFiles = global.map((rule) => ({\n relativePath: join(rulesDir, `${rule.id}${fileExtension}`),\n content: renderRuleToMarkdown(rule), // global은 frontmatter 불필요\n }));\n\n const workspaceFiles: { relativePath: string; content: string }[] = [];\n for (const ws of workspaceMappings) {\n const wsRules = domain.filter((r) => ws.ruleIds.includes(r.id));\n if (wsRules.length === 0) continue;\n workspaceFiles.push({\n relativePath: join(ws.path, 'CLAUDE.md'),\n content: renderRulesToMarkdown(wsRules),\n });\n }\n\n return { tool: 'claude-code', files: [...globalFiles, ...workspaceFiles] };\n }\n\n if (!workspaceMappings || workspaceMappings.length === 0) {\n // 단일 프로젝트: 모든 룰(global + domain)을 rootContent 하나로 합침\n const rootContent = renderRulesToMarkdown(rules);\n const domainFiles: { workspacePath: string; content: string }[] = [];\n\n if (toolId === 'codex') return { tool: 'codex', rootContent, domainFiles };\n return { tool: 'gemini', rootContent, domainFiles };\n }\n\n // 모노레포: global → rootContent, domain → workspace별 파일\n const { global, domain } = partitionRules(rules);\n const rootContent = renderRulesToMarkdown(global);\n const domainFiles: { workspacePath: string; content: string }[] = [];\n for (const ws of workspaceMappings) {\n const wsRules = domain.filter((r) => ws.ruleIds.includes(r.id));\n if (wsRules.length === 0) continue;\n domainFiles.push({\n workspacePath: ws.path,\n content: renderRulesToMarkdown(wsRules),\n });\n }\n\n if (toolId === 'codex') {\n return { tool: 'codex', rootContent, domainFiles };\n }\n\n // gemini\n return { tool: 'gemini', rootContent, domainFiles };\n};\n","// Global 성격의 category (항상 로딩, frontmatter 없음)\nexport const GLOBAL_CATEGORIES = ['persona', 'communication', 'philosophy', 'convention', 'standard'] as const;\n\n// Claude Code paths: frontmatter용 Rule ID → glob 매핑\n// src/ 없이 루트를 src처럼 쓰는 React/Next.js 프로젝트 고려\n// 매핑에 없는 domain 룰 → frontmatter 없이 항상 로딩 (안전 fallback)\nexport const CLAUDE_CODE_PATH_GLOBS: Readonly<Record<string, readonly string[]>> = {\n typescript: ['**/*.ts', '**/*.tsx'],\n 'react-typescript': ['**/*.tsx', '**/*.jsx'],\n nextjs: ['**/app/**', 'next.config.*', '**/middleware.ts'],\n nestjs: ['**/*.module.ts', '**/*.controller.ts', '**/*.service.ts'],\n 'nestjs-graphql': ['**/*.resolver.ts'],\n 'graphql-core': ['**/*.graphql', '**/*.gql'],\n 'graphql-client-web': ['**/*.graphql', '**/*.gql', '**/*.tsx', '**/*.ts'],\n 'graphql-client-app': ['**/*.graphql', '**/*.gql', 'lib/**/*.dart'],\n 'graphql-server': ['**/*.graphql', '**/*.gql', '**/*.resolver.ts'],\n 'prisma-postgresql': ['prisma/**', '**/*.prisma'],\n 'shadcn-ui': ['**/components/ui/**'],\n flutter: ['lib/**/*.dart'],\n python: ['**/*.py'],\n fastapi: ['**/routers/**', '**/main.py'],\n sqlalchemy: ['**/models/**/*.py', 'alembic/**'],\n 'data-pipeline-python': ['**/pipelines/**', '**/etl/**'],\n 'ai-llm-python': ['**/agents/**', '**/chains/**'],\n 'libs-frontend-web': ['**/*.tsx', '**/*.ts'],\n 'libs-frontend-app': ['lib/**/*.dart'],\n 'libs-backend-ts': ['**/*.ts'],\n 'libs-backend-python': ['**/*.py'],\n};\n\nexport const TOOL_OUTPUT_MAP = {\n 'claude-code': {\n mode: 'multi-file' as const,\n rulesDir: '.claude/rules',\n fileExtension: '.md',\n // single: path-scoped (paths: frontmatter) / monorepo: hierarchical ({workspace}/CLAUDE.md)\n contextStrategy: 'hybrid' as const,\n },\n codex: {\n mode: 'multi-file' as const,\n dir: '',\n rootFileName: 'AGENTS.md', // global 룰\n domainFileName: 'AGENTS.override.md', // domain 룰 (하위 폴더)\n contextStrategy: 'hierarchical' as const, // 루트 + 하위 폴더 JIT\n },\n gemini: {\n mode: 'multi-file' as const,\n dir: '',\n rootFileName: 'GEMINI.md', // global 룰 (루트)\n domainFileName: 'GEMINI.md', // domain 룰 (하위 폴더)\n contextStrategy: 'hierarchical' as const, // 루트 + 하위 폴더 JIT\n },\n} as const;\n\nexport type ToolId = keyof typeof TOOL_OUTPUT_MAP;\n","import { join } from 'node:path';\nimport { computeInstalledSkillHash } from './source-hash.js';\nimport type { Skill, InstalledSkill } from './schemas/index.js';\nimport type { ToolId } from './tool-output.js';\n\nconst AGENT_SKILLS_DIR = '.agents/skills';\nconst CLAUDE_SKILLS_DIR = '.claude/skills';\n\ntype SkillPackageFile = {\n relativePath: string;\n content: string;\n};\n\nexport type SkillPackage = {\n skillId: string;\n rootDir: string;\n files: SkillPackageFile[];\n};\n\nconst buildRootDirs = (skillId: string, toolIds: readonly ToolId[]): string[] => {\n const dirs: string[] = [];\n if (toolIds.some((toolId) => toolId === 'codex' || toolId === 'gemini')) {\n dirs.push(join(AGENT_SKILLS_DIR, skillId));\n }\n if (toolIds.includes('claude-code')) {\n dirs.push(join(CLAUDE_SKILLS_DIR, skillId));\n }\n return dirs;\n};\n\nconst normalizeSelectedTools = (skill: Skill, requestedTools: readonly ToolId[]): ToolId[] => {\n const supportedToolSet = new Set(skill.supported_tools);\n return requestedTools.filter((toolId) => supportedToolSet.has(toolId));\n};\n\nexport const buildSkillInstallPlan = (params: {\n skill: Skill;\n requestedTools: readonly ToolId[];\n scope: InstalledSkill['scope'];\n}): { packages: SkillPackage[]; installedSkill: InstalledSkill } => {\n const selectedTools = normalizeSelectedTools(params.skill, params.requestedTools);\n if (selectedTools.length === 0) {\n throw new Error(`Skill ${params.skill.id} does not support the requested tools`);\n }\n\n const rootDirs = buildRootDirs(params.skill.id, selectedTools);\n const skillHash = computeInstalledSkillHash({\n kind: params.skill.kind,\n description: params.skill.description,\n tools: selectedTools,\n files: params.skill.files.map((file) => `${file.path}:${file.content}`),\n });\n\n const packages = rootDirs.map((rootDir) => {\n const files: SkillPackageFile[] = params.skill.files.map((file) => ({\n relativePath: join(rootDir, file.path),\n content: file.content,\n }));\n\n return {\n skillId: params.skill.id,\n rootDir,\n files,\n };\n });\n\n return {\n packages,\n installedSkill: {\n id: params.skill.id,\n kind: params.skill.kind,\n tools: selectedTools,\n scope: params.scope,\n installed_paths: rootDirs,\n sourceHash: skillHash,\n },\n };\n};\n","import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ManifestSchema } from './schemas/index.js';\nimport type { Manifest, InstalledSkill } from './schemas/index.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n// dist/bin/index.js(bundle) 기준: ../../package.json = apps/cli/package.json\nexport const getCliVersion = (): string => {\n try {\n const pkgPath = resolve(__dirname, '..', '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { version: string };\n return pkg.version;\n } catch {\n return 'unknown';\n }\n};\n\n// 문자열 배열 → SHA-256 → 6-hex (caller가 정렬 책임)\nexport const computeHash = (contents: readonly string[]): string =>\n createHash('sha256').update(contents.join('')).digest('hex').slice(0, 6);\n\nconst loadSortedFileContents = (dirPath: string): string[] => {\n const files = readdirSync(dirPath)\n .filter((f) => f.endsWith('.yaml'))\n .sort();\n\n return files.map((f) => readFileSync(resolve(dirPath, f), 'utf-8'));\n};\n\nconst loadDirectoryContents = (baseDir: string): string[] => {\n const contents: string[] = [];\n\n const walk = (relativeDir = ''): void => {\n const absDir = relativeDir.length > 0 ? join(baseDir, relativeDir) : baseDir;\n const entries = readdirSync(absDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const nextRelativePath = relativeDir.length > 0 ? join(relativeDir, entry.name) : entry.name;\n if (entry.isDirectory()) {\n walk(nextRelativePath);\n continue;\n }\n contents.push(`${nextRelativePath}:${readFileSync(join(baseDir, nextRelativePath), 'utf-8')}`);\n }\n };\n\n walk();\n return contents;\n};\n\nconst loadSkillTreeContents = (skillsDir: string): string[] => {\n const contents: string[] = [];\n const registryPath = resolve(skillsDir, 'skill-registry.json');\n\n if (existsSync(registryPath)) {\n contents.push(`skill-registry.json:${readFileSync(registryPath, 'utf-8')}`);\n }\n\n for (const directoryName of ['reference-skills', 'task-skills']) {\n const directoryPath = resolve(skillsDir, directoryName);\n if (!existsSync(directoryPath)) {\n continue;\n }\n\n const directoryContents = loadDirectoryContents(directoryPath).map((content) => `${directoryName}/${content}`);\n contents.push(...directoryContents);\n }\n\n return contents;\n};\n\n// compiler data 전체(rules, skills, presets) 해시\nexport const computeSourceHash = (dataDir: string): string => {\n const ruleContents = loadSortedFileContents(resolve(dataDir, 'rules'));\n const skillContents = loadSkillTreeContents(resolve(dataDir, 'skills'));\n const presetsContent = readFileSync(resolve(dataDir, 'presets.yaml'), 'utf-8');\n return computeHash([...ruleContents, ...skillContents, presetsContent]);\n};\n\nexport const computeInstalledSkillHash = (params: {\n kind: InstalledSkill['kind'];\n description: string;\n tools: readonly string[];\n files: readonly string[];\n}): string => computeHash([params.kind, params.description, ...[...params.tools].sort(), ...[...params.files].sort()]);\n\n// Manifest Builder (Pure, 단 generatedAt에 현재 시각 사용)\nexport const buildManifest = (params: {\n tools: readonly string[];\n scope: 'project';\n preset?: string;\n workspaces?: Record<string, { preset: string; rules: string[] }>;\n installedRules: readonly string[];\n installedFiles?: readonly string[];\n installedSkills?: readonly InstalledSkill[];\n appendedFiles?: readonly string[];\n settings?: { claude?: readonly string[]; gemini?: readonly string[]; prettierignore?: boolean };\n cliVersion?: string;\n sourceHash: string;\n}): Manifest =>\n ManifestSchema.parse({\n tools: [...params.tools],\n scope: params.scope,\n preset: params.preset,\n workspaces: params.workspaces,\n installed_rules: [...params.installedRules],\n installed_files: params.installedFiles ? [...params.installedFiles] : undefined,\n installed_skills: params.installedSkills ? [...params.installedSkills] : undefined,\n appended_files: params.appendedFiles && params.appendedFiles.length > 0 ? [...params.appendedFiles] : undefined,\n settings: params.settings\n ? {\n claude: params.settings.claude ? [...params.settings.claude] : undefined,\n gemini: params.settings.gemini ? [...params.settings.gemini] : undefined,\n prettierignore: params.settings.prettierignore,\n }\n : undefined,\n cliVersion: params.cliVersion,\n sourceHash: params.sourceHash,\n generatedAt: new Date().toISOString(),\n });\n","const MANAGED_MARKER = '<!-- managed by ai-ops -->';\nconst META_PATTERN = /^<!-- sourceHash: ([a-f0-9]{6}) \\| generatedAt: (.+) -->$/;\n\nconst SECTION_START = '<!-- ai-ops:start -->';\nconst SECTION_END = '<!-- ai-ops:end -->';\n\nexport const hasLegacyHeader = (content: string): boolean => content.includes(MANAGED_MARKER);\n\nexport const wrapWithSection = (content: string, meta: { sourceHash: string; generatedAt: string }): string => {\n const metaLine = `<!-- sourceHash: ${meta.sourceHash} | generatedAt: ${meta.generatedAt} -->`;\n return `${SECTION_START}\\n${metaLine}\\n\\n${content}\\n${SECTION_END}`;\n};\n\nexport const hasAiOpsSection = (content: string): boolean =>\n content.includes(SECTION_START) && content.includes(SECTION_END);\n\nexport const stripAiOpsSection = (content: string): string => {\n const startIdx = content.indexOf(SECTION_START);\n const endIdx = content.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return content;\n\n const before = content.slice(0, startIdx).trimEnd();\n const after = content.slice(endIdx + SECTION_END.length).trimStart();\n return before + (after ? '\\n\\n' + after : '') + '\\n';\n};\n\nexport const replaceAiOpsSection = (existing: string, newSection: string): string => {\n const startIdx = existing.indexOf(SECTION_START);\n const endIdx = existing.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return existing;\n\n const before = existing.slice(0, startIdx).trimEnd();\n const after = existing.slice(endIdx + SECTION_END.length).trimStart();\n\n // filter(Boolean)으로 빈 before/after 제거 → 불필요한 선행 \\n\\n 방지\n return [before, newSection, after].filter(Boolean).join('\\n\\n') + '\\n';\n};\n\nexport const parseAiOpsMeta = (content: string): { sourceHash: string; generatedAt: string } | null => {\n const startIdx = content.indexOf(SECTION_START);\n if (startIdx === -1) return null;\n\n const lines = content.slice(startIdx).split('\\n');\n // lines[0] = '<!-- ai-ops:start -->', lines[1] = meta line\n const metaLine = lines[1] ?? '';\n const match = META_PATTERN.exec(metaLine);\n if (!match) return null;\n\n return { sourceHash: match[1], generatedAt: match[2] };\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { ManifestSchema } from './schemas/index.js';\nimport type { Manifest } from './schemas/index.js';\n\nexport const MANIFEST_FILENAME = '.ai-ops-manifest.json';\n\n// Pure\nexport const parseManifest = (json: string): Manifest => ManifestSchema.parse(JSON.parse(json));\n\nexport const serializeManifest = (manifest: Manifest): string => JSON.stringify(manifest, null, 2) + '\\n';\n\n// I/O\nexport const resolveManifestPath = (basePath: string): string => join(basePath, MANIFEST_FILENAME);\n\nexport const readManifest = (manifestPath: string): Manifest | null => {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf-8');\n } catch {\n return null;\n }\n return parseManifest(raw);\n};\n\nexport const writeManifest = (manifestPath: string, manifest: Manifest): void => {\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeManifest(manifest), 'utf-8');\n};\n","import type { Manifest, Preset, Rule, Skill } from './schemas/index.js';\nimport { resolvePresetRules } from './loader.js';\nimport type { ToolId } from './tool-output.js';\n\nconst LEGACY_SKILL_ID_MAP = {\n 'engineering-standards-pack': 'backend-service-standards',\n} as const;\n\nconst LEGACY_EXTERNALIZED_RULE_SKILL_MAP = {\n 'engineering-standards': 'backend-service-standards',\n typescript: 'typescript-language',\n python: 'python-language',\n 'react-typescript': 'frontend-web-react-next-runtime',\n nextjs: 'frontend-web-react-next-runtime',\n 'libs-frontend-web': 'frontend-web-react-next-runtime',\n 'shadcn-ui': 'frontend-web-shadcn-ui',\n flutter: 'frontend-app-flutter-runtime',\n 'libs-frontend-app': 'frontend-app-flutter-runtime',\n nestjs: 'backend-ts-nestjs-runtime',\n 'libs-backend-ts': 'backend-ts-nestjs-runtime',\n fastapi: 'backend-python-fastapi-runtime',\n 'libs-backend-python': 'backend-python-fastapi-runtime',\n 'graphql-core': 'graphql-contract',\n 'graphql-client-web': 'graphql-client-integration',\n 'graphql-client-app': 'graphql-client-integration',\n 'graphql-server': 'graphql-server-runtime',\n 'nestjs-graphql': 'graphql-server-runtime',\n 'prisma-postgresql': 'db-prisma-postgresql',\n sqlalchemy: 'db-sqlalchemy-postgresql',\n 'ai-llm-python': 'ai-llm-python-runtime',\n 'data-pipeline-python': 'data-pipeline-python-performance',\n} as const;\n\nexport const resolveCanonicalSkillId = (skillId: string): string =>\n LEGACY_SKILL_ID_MAP[skillId as keyof typeof LEGACY_SKILL_ID_MAP] ?? skillId;\n\nconst resolveRulesFromIds = (ruleIds: readonly string[], allRules: readonly Rule[]): Rule[] => {\n const ruleMap = new Map(allRules.map((rule) => [rule.id, rule]));\n const seen = new Set<string>();\n const resolved = ruleIds.flatMap((ruleId) => {\n const rule = ruleMap.get(ruleId);\n if (!rule || seen.has(rule.id)) {\n return [];\n }\n seen.add(rule.id);\n return [rule];\n });\n\n return [...resolved].sort((a, b) => b.priority - a.priority);\n};\n\nconst resolvePresetById = (presetId: string | undefined, presets: readonly Preset[]): Preset | undefined => {\n if (presetId === undefined) {\n return undefined;\n }\n\n return presets.find((preset) => preset.id === presetId);\n};\n\nexport const resolveManifestRules = (params: {\n manifest: Manifest;\n allRules: readonly Rule[];\n presets: readonly Preset[];\n}): {\n installedRules: Rule[];\n workspaces?: Record<string, { preset: string; rules: string[] }>;\n} => {\n const { manifest, allRules, presets } = params;\n\n if (manifest.workspaces) {\n const resolvedWorkspaces = Object.fromEntries(\n Object.entries(manifest.workspaces).map(([workspacePath, entry]) => {\n const preset = resolvePresetById(entry.preset, presets);\n const rules = preset ? resolvePresetRules(preset, allRules) : resolveRulesFromIds(entry.rules, allRules);\n\n return [\n workspacePath,\n {\n preset: entry.preset,\n rules: rules.map((rule) => rule.id),\n },\n ];\n }),\n );\n\n const installedRules = resolveRulesFromIds(\n Object.values(resolvedWorkspaces).flatMap((entry) => entry.rules),\n allRules,\n );\n\n return {\n installedRules,\n workspaces: resolvedWorkspaces,\n };\n }\n\n const preset = resolvePresetById(manifest.preset, presets);\n const installedRules = preset\n ? resolvePresetRules(preset, allRules)\n : resolveRulesFromIds(manifest.installed_rules, allRules);\n\n return {\n installedRules,\n };\n};\n\nexport type ResolvedProjectSkillTarget = {\n skill: Skill;\n requestedTools: ToolId[];\n};\n\nexport const resolveManifestProjectSkills = (params: {\n manifest: Manifest;\n allSkills: readonly Skill[];\n}): ResolvedProjectSkillTarget[] => {\n const { manifest, allSkills } = params;\n const skillMap = new Map(allSkills.map((skill) => [skill.id, skill]));\n const targets: ResolvedProjectSkillTarget[] = [];\n const seen = new Set<string>();\n\n for (const installedSkill of manifest.installed_skills ?? []) {\n const canonicalSkillId = resolveCanonicalSkillId(installedSkill.id);\n const skill = skillMap.get(canonicalSkillId);\n if (!skill) {\n throw new Error(`Skill not found during manifest resolution: ${installedSkill.id}`);\n }\n if (seen.has(skill.id)) {\n continue;\n }\n\n seen.add(skill.id);\n targets.push({\n skill,\n requestedTools: [...installedSkill.tools] as ToolId[],\n });\n }\n\n for (const ruleId of manifest.installed_rules) {\n const mappedSkillId = LEGACY_EXTERNALIZED_RULE_SKILL_MAP[ruleId as keyof typeof LEGACY_EXTERNALIZED_RULE_SKILL_MAP];\n if (!mappedSkillId || seen.has(mappedSkillId)) {\n continue;\n }\n\n const skill = skillMap.get(mappedSkillId);\n if (!skill) {\n throw new Error(`Skill not found during legacy rule migration: ${mappedSkillId}`);\n }\n\n seen.add(mappedSkillId);\n targets.push({\n skill,\n requestedTools: [...manifest.tools] as ToolId[],\n });\n }\n\n return targets;\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { SkillRegistrySchema } from './schemas/index.js';\nimport type { SkillRegistry } from './schemas/index.js';\n\nexport const SKILL_REGISTRY_FILENAME = 'skills-manifest.json';\n\nexport const parseSkillRegistry = (json: string): SkillRegistry => SkillRegistrySchema.parse(JSON.parse(json));\n\nexport const serializeSkillRegistry = (registry: SkillRegistry): string => JSON.stringify(registry, null, 2) + '\\n';\n\nexport const resolveSkillRegistryPath = (userBasePath: string): string =>\n join(userBasePath, '.ai-ops', SKILL_REGISTRY_FILENAME);\n\nexport const readSkillRegistry = (registryPath: string): SkillRegistry | null => {\n let raw: string;\n try {\n raw = readFileSync(registryPath, 'utf-8');\n } catch {\n return null;\n }\n\n return parseSkillRegistry(raw);\n};\n\nexport const writeSkillRegistry = (registryPath: string, registry: SkillRegistry): void => {\n mkdirSync(dirname(registryPath), { recursive: true });\n writeFileSync(registryPath, serializeSkillRegistry(registry), 'utf-8');\n};\n","import type { Manifest } from './schemas/index.js';\n\nexport type DiffResult = {\n status: 'up-to-date' | 'changed';\n added: readonly string[];\n removed: readonly string[];\n sourceChanged: boolean;\n versionChanged: boolean;\n};\n\nexport const computeDiff = (params: {\n previous: Manifest;\n currentRules: readonly string[];\n currentSourceHash: string;\n currentCliVersion?: string;\n}): DiffResult => {\n const { previous, currentRules, currentSourceHash, currentCliVersion } = params;\n\n const previousSet = new Set(previous.installed_rules);\n const currentSet = new Set(currentRules);\n\n const added = currentRules.filter((id) => !previousSet.has(id));\n const removed = previous.installed_rules.filter((id) => !currentSet.has(id));\n const sourceChanged = previous.sourceHash !== currentSourceHash;\n // previous.cliVersion이 없는 레거시 manifest는 버전 변경으로 간주하지 않음\n const versionChanged =\n previous.cliVersion !== undefined && currentCliVersion !== undefined && previous.cliVersion !== currentCliVersion;\n\n const status = added.length > 0 || removed.length > 0 || sourceChanged || versionChanged ? 'changed' : 'up-to-date';\n\n return { status, added, removed, sourceChanged, versionChanged };\n};\n","import { join } from 'node:path';\nimport { wrapWithSection } from './managed-header.js';\nimport { TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { ToolId } from './tool-output.js';\nimport type { ToolRenderResult } from './renderer.js';\n\n// Codex has no settings.json — plan directory convention must live in AGENTS.md\nconst CODEX_PLAN_BODY =\n '## Plan Snapshot (Plan mode only)\\n\\n' +\n '- This rule applies only when Codex is running in `collaboration_mode=Plan`.\\n' +\n '- Before implementation (file edits/creates, installs, commits) and before leaving Plan mode, save the latest plan content to `.codex/plans/YYYYMMDD_<topic>.md`.\\n' +\n '- In `Default` mode, do not automatically create or update plan files.';\n\nexport type FileAction = {\n relativePath: string;\n content: string;\n};\n\nexport const buildInstallPlan = (params: {\n toolId: ToolId;\n renderResult: ToolRenderResult;\n meta: { sourceHash: string; generatedAt: string };\n}): readonly FileAction[] => {\n const { toolId, renderResult, meta } = params;\n\n if (toolId === 'claude-code' && renderResult.tool === 'claude-code') {\n return renderResult.files.map(({ relativePath, content }) => ({\n relativePath,\n content: wrapWithSection(content, meta),\n }));\n }\n\n if (toolId === 'codex' && renderResult.tool === 'codex') {\n const config = TOOL_OUTPUT_MAP['codex'];\n const actions: FileAction[] = [];\n\n // CODEX_PLAN_BODY is always written to root AGENTS.md regardless of whether global rules exist\n const rootContent = renderResult.rootContent\n ? renderResult.rootContent + '\\n\\n---\\n\\n' + CODEX_PLAN_BODY\n : CODEX_PLAN_BODY;\n\n actions.push({\n relativePath: join(config.dir, config.rootFileName),\n content: wrapWithSection(rootContent, meta),\n });\n\n for (const df of renderResult.domainFiles) {\n actions.push({\n relativePath: join(df.workspacePath, config.domainFileName),\n content: wrapWithSection(df.content, meta),\n });\n }\n\n return actions;\n }\n\n if (toolId === 'gemini' && renderResult.tool === 'gemini') {\n const config = TOOL_OUTPUT_MAP['gemini'];\n const actions: FileAction[] = [];\n\n if (renderResult.rootContent) {\n actions.push({\n relativePath: join(config.dir, config.rootFileName),\n content: wrapWithSection(renderResult.rootContent, meta),\n });\n }\n\n for (const df of renderResult.domainFiles) {\n actions.push({\n relativePath: join(df.workspacePath, config.domainFileName),\n content: wrapWithSection(df.content, meta),\n });\n }\n\n return actions;\n }\n\n return [];\n};\n","export const SPEC_README_TEMPLATE = `# Specs\n\n이 디렉토리는 AI 협업 기반 spec 파이프라인을 관리합니다.\n\n## 디렉토리 구조\n\n\\`\\`\\`\nspecs/\n├── baseline/ # 기준 spec 문서 (초기 요구사항, 확정된 스펙)\n└── initial-build/ # 초기 구축 spec 문서\n\\`\\`\\`\n\n## 사용 방법\n\n### baseline\n\n프로젝트의 초기 또는 확정된 스펙 문서를 \\`baseline/\\` 디렉토리에 저장합니다.\n\n- 파일명: \\`<feature-name>.md\\` (kebab-case)\n- 내용: 요구사항, 도메인 용어, 제약 조건 등\n\n### initial-build\n\n초기 구축 범위와 구현 계획을 \\`initial-build/\\` 디렉토리에 저장합니다.\n\n- 파일명: \\`<YYYYMMDD>-<feature-name>.md\\`\n- 내용: 초기 구현 범위, 사용자 흐름, 데이터 모델, API 계약, 검증 기준 등\n`;\n","import { SPEC_README_TEMPLATE } from '../data/spec-readme.js';\nimport type { FileAction } from './install-plan.js';\n\nexport const buildSpecInitPlan = (): readonly FileAction[] => [\n { relativePath: 'specs/README.md', content: SPEC_README_TEMPLATE },\n { relativePath: 'specs/baseline/.gitkeep', content: '' },\n { relativePath: 'specs/initial-build/.gitkeep', content: '' },\n];\n","import { join } from 'node:path';\nimport { TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { Manifest } from './schemas/index.js';\n\n/**\n * manifest에 installed_files가 없는 구버전 manifest를 위한 fallback.\n * manifest의 tools/workspaces/installed_rules 정보를 기반으로\n * 실제 설치됐을 파일 경로를 역산한다.\n */\nexport const inferInstalledFiles = (manifest: Manifest): string[] => {\n const files: string[] = [];\n const isMonorepo = manifest.workspaces !== undefined;\n\n for (const toolId of manifest.tools) {\n if (toolId === 'claude-code') {\n // claude-code: .claude/rules/{ruleId}.md\n const config = TOOL_OUTPUT_MAP['claude-code'];\n for (const ruleId of manifest.installed_rules) {\n files.push(join(config.rulesDir, `${ruleId}${config.fileExtension}`));\n }\n } else if (toolId === 'codex') {\n const config = TOOL_OUTPUT_MAP['codex'];\n if (!isMonorepo) {\n // 비모노: .codex/AGENTS.md + .codex/AGENTS.override.md (domain 있으면)\n files.push(join(config.dir, config.rootFileName));\n files.push(join(config.dir, config.domainFileName));\n } else {\n // 모노: .codex/AGENTS.md (global) + {workspace}/AGENTS.override.md (domain)\n files.push(join(config.dir, config.rootFileName));\n for (const ws of Object.keys(manifest.workspaces ?? {})) {\n files.push(join(ws, config.domainFileName));\n }\n }\n } else if (toolId === 'gemini') {\n const config = TOOL_OUTPUT_MAP['gemini'];\n if (!isMonorepo) {\n // 비모노: .gemini/GEMINI.md\n files.push(join(config.dir, config.rootFileName));\n } else {\n // 모노: .gemini/GEMINI.md (global) + {workspace}/GEMINI.md (domain)\n files.push(join(config.dir, config.rootFileName));\n for (const ws of Object.keys(manifest.workspaces ?? {})) {\n files.push(join(ws, config.domainFileName));\n }\n }\n }\n }\n\n // 중복 제거 (codex 비모노에서 rootFileName === domainFileName인 경우 대비)\n return [...new Set(files)];\n};\n","import { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// src/core/* 또는 dist/bin/index.js 기준에서도 공통으로 패키지 루트/data를 가리키도록 계산\n// src/core/paths.ts → ../../data = apps/cli/data\n// dist/bin/index.js (bundle) → ../../data = apps/cli/data\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport const COMPILER_DATA_DIR = resolve(__dirname, '..', '..', 'data');\n","import { join } from 'node:path';\nimport { COMPILER_DATA_DIR } from '@/core/index.js';\n\nexport const resolveCompilerDataDir = (): string => COMPILER_DATA_DIR;\n\nexport const resolveRulesDir = (): string => join(COMPILER_DATA_DIR, 'rules');\n\nexport const resolveSkillsDir = (): string => join(COMPILER_DATA_DIR, 'skills');\n\nexport const resolveReferenceSkillsDir = (): string => join(resolveSkillsDir(), 'reference-skills');\n\nexport const resolveTaskSkillsDir = (): string => join(resolveSkillsDir(), 'task-skills');\n\nexport const resolveSkillCatalogPath = (): string => join(resolveSkillsDir(), 'skill-registry.json');\n\nexport const resolvePresetsPath = (): string => join(COMPILER_DATA_DIR, 'presets.yaml');\n\n// project-only 설치 기준 디렉토리\nexport const resolveBasePath = (): string => process.cwd();\n\nexport const resolveUserBasePath = (): string => process.env.AI_OPS_HOME ?? process.env.HOME ?? process.cwd();\n","import { existsSync, readdirSync, statSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nconst EXCLUDE_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', '.turbo', '.cache', 'coverage']);\n\nconst isVisibleDir = (basePath: string, name: string): boolean => {\n if (name.startsWith('.') || EXCLUDE_DIRS.has(name)) return false;\n return statSync(resolve(basePath, name)).isDirectory();\n};\n\n// Project manifest files that indicate a workspace root\nconst PROJECT_MANIFESTS = [\n 'package.json', // Node.js / JS / TS\n 'pubspec.yaml', // Flutter / Dart\n 'pyproject.toml', // Python (modern)\n 'setup.py', // Python (legacy)\n 'Cargo.toml', // Rust\n 'go.mod', // Go\n];\n\nconst isWorkspaceRoot = (dirPath: string): boolean => PROJECT_MANIFESTS.some((f) => existsSync(join(dirPath, f)));\n\n// 프로젝트 매니페스트 파일 존재 여부로 워크스페이스 판별:\n// 1. top-level dir에 매니페스트 → 그 자체가 워크스페이스 (e.g. backend-ts, mobile, web)\n// 2. top-level dir에 매니페스트 없고 자식에 있음 → 자식을 후보로 (e.g. apps/web, packages/ui)\n// 3. 매니페스트 없는 경우 → 1-depth 그대로\nexport const listWorkspaceCandidates = (basePath: string): string[] => {\n const topLevel = readdirSync(basePath).filter((name) => isVisibleDir(basePath, name));\n\n const candidates: string[] = [];\n for (const dir of topLevel) {\n const subPath = resolve(basePath, dir);\n if (isWorkspaceRoot(subPath)) {\n candidates.push(dir);\n } else {\n const children = readdirSync(subPath).filter((name) => isVisibleDir(subPath, name));\n const wsChildren = children.filter((name) => isWorkspaceRoot(resolve(subPath, name)));\n if (wsChildren.length > 0) {\n for (const child of wsChildren) {\n candidates.push(join(dir, child));\n }\n } else {\n candidates.push(dir);\n }\n }\n }\n\n return candidates.sort();\n};\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { hasAiOpsSection, replaceAiOpsSection, stripAiOpsSection, hasLegacyHeader } from '@/core/index.js';\nimport type { FileAction } from '@/core/index.js';\n\nexport type InstallResult = {\n written: string[];\n appended: string[]; // 기존 non-managed 파일에 섹션 추가됨\n skipped: string[]; // 더 이상 발생하지 않음 (하위 호환용)\n};\n\nexport const installFiles = (\n basePath: string,\n actions: readonly FileAction[],\n _meta: { sourceHash: string; generatedAt: string },\n): InstallResult => {\n const written: string[] = [];\n const appended: string[] = [];\n const skipped: string[] = [];\n\n for (const action of actions) {\n const absPath = resolve(basePath, action.relativePath);\n\n if (!existsSync(absPath)) {\n mkdirSync(dirname(absPath), { recursive: true });\n writeFileSync(absPath, action.content + '\\n', 'utf-8');\n written.push(action.relativePath);\n } else {\n const existing = readFileSync(absPath, 'utf-8');\n\n if (hasAiOpsSection(existing)) {\n // 기존 블록 교체 (사용자 콘텐츠 자동 보존)\n const updated = replaceAiOpsSection(existing, action.content);\n writeFileSync(absPath, updated, 'utf-8');\n const stripped = stripAiOpsSection(existing);\n (stripped.trim().length > 0 ? appended : written).push(action.relativePath);\n } else if (hasLegacyHeader(existing)) {\n // 레거시 → 새 형식으로 덮어쓰기 (update 시 자동 마이그레이션)\n writeFileSync(absPath, action.content + '\\n', 'utf-8');\n written.push(action.relativePath);\n } else {\n // 순수 사용자 파일 → 최초 append\n const updated = existing.trimEnd() + '\\n\\n' + action.content + '\\n';\n writeFileSync(absPath, updated, 'utf-8');\n appended.push(action.relativePath);\n }\n }\n }\n\n return { written, appended, skipped };\n};\n","import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { SkillPackage } from '@/core/index.js';\n\nexport const installSkillPackages = (basePath: string, packages: readonly SkillPackage[]): string[] => {\n const writtenRoots: string[] = [];\n\n for (const skillPackage of packages) {\n const absRoot = resolve(basePath, skillPackage.rootDir);\n if (existsSync(absRoot)) {\n rmSync(absRoot, { recursive: true, force: true });\n }\n\n for (const file of skillPackage.files) {\n const absPath = resolve(basePath, file.relativePath);\n mkdirSync(dirname(absPath), { recursive: true });\n writeFileSync(absPath, file.content + '\\n', 'utf-8');\n }\n\n writtenRoots.push(skillPackage.rootDir);\n }\n\n return writtenRoots;\n};\n\nexport const removeDirectories = (basePath: string, relativeDirs: readonly string[]): string[] => {\n const removed: string[] = [];\n\n for (const relativeDir of relativeDirs) {\n const absPath = resolve(basePath, relativeDir);\n if (!existsSync(absPath)) continue;\n rmSync(absPath, { recursive: true, force: true });\n removed.push(relativeDir);\n }\n\n return removed;\n};\n","import * as p from '@clack/prompts';\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { deepMerge, deepRemoveKeys } from './deep-merge.util.js';\nimport { PROMPT_CANCELLED, type PromptCancelled } from './prompt-control.js';\n\nexport type SettingGroup = {\n value: string;\n label: string;\n hint: string;\n patch: Record<string, unknown>;\n};\n\nexport type ToolSettingsConfig = {\n dirName: string;\n fileName: string;\n promptMessage: string;\n groups: readonly SettingGroup[];\n};\n\nexport type SettingsUninstallStatus = 'deleted' | 'cleaned' | 'notFound';\n\nexport const promptToolSettings = async (\n config: ToolSettingsConfig,\n): Promise<readonly string[] | null | PromptCancelled> => {\n const want = await p.confirm({ message: config.promptMessage, initialValue: true });\n if (p.isCancel(want)) return PROMPT_CANCELLED;\n if (!want) return null;\n\n const selected = await p.multiselect<string>({\n message: '설치할 설정 항목을 선택하세요 (스페이스로 토글)',\n options: config.groups.map((g) => ({ value: g.value, label: g.label, hint: g.hint })),\n initialValues: config.groups.map((g) => g.value),\n required: false,\n });\n if (p.isCancel(selected)) return PROMPT_CANCELLED;\n return selected as string[];\n};\n\nexport const installToolSettings = (\n basePath: string,\n selectedValues: readonly string[],\n config: ToolSettingsConfig,\n): void => {\n if (selectedValues.length === 0) return;\n\n const settingsDir = join(basePath, config.dirName);\n const settingsPath = join(settingsDir, config.fileName);\n\n let existing: Record<string, unknown> = {};\n if (existsSync(settingsPath)) {\n try {\n existing = JSON.parse(readFileSync(settingsPath, 'utf-8')) as Record<string, unknown>;\n } catch {\n // parse 실패 시 덮어쓰기\n }\n }\n\n let merged: Record<string, unknown> = existing;\n for (const val of selectedValues) {\n const group = config.groups.find((g) => g.value === val);\n if (!group) continue;\n merged = deepMerge(merged, group.patch);\n }\n\n mkdirSync(settingsDir, { recursive: true });\n writeFileSync(settingsPath, JSON.stringify(merged, null, 2) + '\\n', 'utf-8');\n};\n\nexport const uninstallToolSettings = (\n basePath: string,\n selectedValues: readonly string[],\n config: ToolSettingsConfig,\n): SettingsUninstallStatus => {\n const settingsPath = join(basePath, config.dirName, config.fileName);\n\n if (!existsSync(settingsPath)) return 'notFound';\n\n let existing: Record<string, unknown> = {};\n try {\n existing = JSON.parse(readFileSync(settingsPath, 'utf-8')) as Record<string, unknown>;\n } catch {\n rmSync(settingsPath, { force: true });\n return 'deleted';\n }\n\n let result: Record<string, unknown> = existing;\n for (const val of selectedValues) {\n const group = config.groups.find((g) => g.value === val);\n if (!group) continue;\n result = deepRemoveKeys(result, group.patch) as Record<string, unknown>;\n }\n\n if (Object.keys(result).length === 0) {\n rmSync(settingsPath, { force: true });\n return 'deleted';\n }\n\n writeFileSync(settingsPath, JSON.stringify(result, null, 2) + '\\n', 'utf-8');\n return 'cleaned';\n};\n","export const deepMerge = (base: Record<string, unknown>, patch: Record<string, unknown>): Record<string, unknown> => {\n const result = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n typeof result[key] === 'object' &&\n result[key] !== null &&\n !Array.isArray(result[key])\n ) {\n result[key] = deepMerge(result[key] as Record<string, unknown>, value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n return result;\n};\n\nexport const deepRemoveKeys = (\n base: Record<string, unknown>,\n patch: Record<string, unknown>,\n): Record<string, unknown> => {\n const result = { ...base };\n for (const [key, value] of Object.entries(patch)) {\n if (!(key in result)) continue;\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n typeof result[key] === 'object' &&\n result[key] !== null &&\n !Array.isArray(result[key])\n ) {\n const nested = deepRemoveKeys(result[key] as Record<string, unknown>, value as Record<string, unknown>);\n if (Object.keys(nested).length === 0) {\n delete result[key];\n } else {\n result[key] = nested;\n }\n } else {\n delete result[key];\n }\n }\n return result;\n};\n","export const PROMPT_CANCELLED = Symbol('prompt-cancelled');\n\nexport type PromptCancelled = typeof PROMPT_CANCELLED;\n\nexport const isPromptCancelled = <T>(value: T | PromptCancelled): value is PromptCancelled =>\n value === PROMPT_CANCELLED;\n","import type { PromptCancelled } from './prompt-control.js';\nimport {\n type SettingsUninstallStatus,\n type ToolSettingsConfig,\n installToolSettings,\n promptToolSettings,\n uninstallToolSettings,\n} from './tool-settings.js';\n\nconst SETTING_GROUPS: ToolSettingsConfig['groups'] = [\n {\n value: 'ui',\n label: 'UI — 줄 번호 숨기기',\n hint: 'ui.showLineNumbers: false — 코드 복사 시 줄 번호가 포함되지 않도록 비활성화',\n patch: { ui: { showLineNumbers: false } },\n },\n {\n value: 'plan',\n label: 'Plan — 계획 파일 저장 및 모델 라우팅',\n hint: 'general.plan.directory: .gemini/plans, modelRouting: true — AI 계획을 파일로 저장하고 태스크별 최적 모델 자동 선택',\n patch: { general: { plan: { directory: '.gemini/plans', modelRouting: true } } },\n },\n {\n value: 'sessionRetention',\n label: 'Session Retention — 세션 30일 보존',\n hint: 'general.sessionRetention.maxAge: 30d — 이전 대화 컨텍스트를 30일간 유지',\n patch: { general: { sessionRetention: { maxAge: '30d' } } },\n },\n {\n value: 'experimental',\n label: 'Experimental — JIT 컨텍스트 + Plan 기능',\n hint: 'experimental.jitContext: true, plan: true — 서브디렉토리 컨텍스트 지연 로딩 및 계획 기능 실험적 활성화',\n patch: { experimental: { jitContext: true, plan: true } },\n },\n];\n\nconst CONFIG: ToolSettingsConfig = {\n dirName: '.gemini',\n fileName: 'settings.json',\n promptMessage: 'Gemini CLI 설정 파일(.gemini/settings.json)을 설치하시겠습니까?',\n groups: SETTING_GROUPS,\n};\n\n// PromptCancelled → 사용자 취소, null → \"No\", string[] → 선택된 항목\nexport const promptGeminiSettings = (): Promise<readonly string[] | null | PromptCancelled> =>\n promptToolSettings(CONFIG);\n\nexport const installGeminiSettings = (basePath: string, selectedValues: readonly string[]): void =>\n installToolSettings(basePath, selectedValues, CONFIG);\n\nexport type { SettingsUninstallStatus };\n\nexport const uninstallGeminiSettings = (basePath: string, selectedValues: readonly string[]): SettingsUninstallStatus =>\n uninstallToolSettings(basePath, selectedValues, CONFIG);\n","import type { PromptCancelled } from './prompt-control.js';\nimport {\n type SettingsUninstallStatus,\n type ToolSettingsConfig,\n installToolSettings,\n promptToolSettings,\n uninstallToolSettings,\n} from './tool-settings.js';\n\nconst SETTING_GROUPS: ToolSettingsConfig['groups'] = [\n {\n value: 'model',\n label: 'Model — Plan 모드 모델',\n hint: 'model: opusplan — Plan 모드에서 Opus 모델 사용',\n patch: { model: 'opusplan' },\n },\n {\n value: 'plansDirectory',\n label: 'Plans Directory — 계획 파일 저장 경로',\n hint: 'plansDirectory: ./.claude/plans — 계획 파일을 .claude/plans에 저장',\n patch: { plansDirectory: './.claude/plans' },\n },\n];\n\nconst CONFIG: ToolSettingsConfig = {\n dirName: '.claude',\n fileName: 'settings.local.json',\n promptMessage: 'Claude Code 설정 파일(.claude/settings.local.json)을 설치하시겠습니까?',\n groups: SETTING_GROUPS,\n};\n\n// PromptCancelled → 사용자 취소, null → \"No\", string[] → 선택된 항목\nexport const promptClaudeSettings = (): Promise<readonly string[] | null | PromptCancelled> =>\n promptToolSettings(CONFIG);\n\nexport const installClaudeSettings = (basePath: string, selectedValues: readonly string[]): void =>\n installToolSettings(basePath, selectedValues, CONFIG);\n\nexport type { SettingsUninstallStatus };\n\nexport const uninstallClaudeSettings = (basePath: string, selectedValues: readonly string[]): SettingsUninstallStatus =>\n uninstallToolSettings(basePath, selectedValues, CONFIG);\n","import * as p from '@clack/prompts';\nimport { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { PROMPT_CANCELLED, type PromptCancelled } from './prompt-control.js';\n\nconst PRETTIER_IGNORE_CONTENT = `# CLAUDE\n.claude/rules/\n**/CLAUDE.md\n\n# GEMINI\n**/GEMINI.md\n\n# CODEX\n**/AGENTS.md\n**/AGENTS.override.md\n\n.ai-ops-manifest.json`;\n\nconst SECTION_START = '# ai-ops:start';\nconst SECTION_END = '# ai-ops:end';\n\nconst wrapSection = (content: string): string => `${SECTION_START}\\n${content}\\n${SECTION_END}`;\n\nconst hasAiOpsSection = (content: string): boolean => content.includes(SECTION_START) && content.includes(SECTION_END);\n\nconst replaceSection = (content: string, newContent: string): string => {\n const lines = content.split('\\n');\n const result: string[] = [];\n let inside = false;\n let replaced = false;\n\n for (const line of lines) {\n if (line.trim() === SECTION_START) {\n inside = true;\n result.push(wrapSection(newContent));\n replaced = true;\n continue;\n }\n if (line.trim() === SECTION_END) {\n inside = false;\n continue;\n }\n if (!inside) result.push(line);\n }\n\n if (!replaced) result.push(wrapSection(newContent));\n return result.join('\\n');\n};\n\nconst stripAiOpsSection = (content: string): string => {\n const lines = content.split('\\n');\n const result: string[] = [];\n let inside = false;\n\n for (const line of lines) {\n if (line.trim() === SECTION_START) {\n inside = true;\n continue;\n }\n if (line.trim() === SECTION_END) {\n inside = false;\n continue;\n }\n if (!inside) result.push(line);\n }\n\n return result.join('\\n');\n};\n\nexport const promptPrettierIgnore = async (): Promise<boolean | PromptCancelled> => {\n const want = await p.confirm({\n message: '.prettierignore를 설치하시겠습니까? (VSCode Prettier 자동 포맷으로부터 AI 규칙 파일 보호)',\n initialValue: false,\n });\n if (p.isCancel(want)) return PROMPT_CANCELLED;\n return want;\n};\n\nexport const installPrettierIgnore = (basePath: string): void => {\n const filePath = join(basePath, '.prettierignore');\n const section = wrapSection(PRETTIER_IGNORE_CONTENT);\n\n if (!existsSync(filePath)) {\n writeFileSync(filePath, section + '\\n', 'utf-8');\n return;\n }\n\n const existing = readFileSync(filePath, 'utf-8');\n\n if (hasAiOpsSection(existing)) {\n writeFileSync(filePath, replaceSection(existing, PRETTIER_IGNORE_CONTENT), 'utf-8');\n return;\n }\n\n const separator = existing.endsWith('\\n') ? '\\n' : '\\n\\n';\n writeFileSync(filePath, existing + separator + section + '\\n', 'utf-8');\n};\n\nexport type PrettierIgnoreUninstallStatus = 'deleted' | 'cleaned' | 'notFound';\n\nexport const uninstallPrettierIgnore = (basePath: string): PrettierIgnoreUninstallStatus => {\n const filePath = join(basePath, '.prettierignore');\n if (!existsSync(filePath)) return 'notFound';\n\n const existing = readFileSync(filePath, 'utf-8');\n if (!hasAiOpsSection(existing)) return 'notFound';\n\n const stripped = stripAiOpsSection(existing).trim();\n if (stripped.length === 0) {\n rmSync(filePath, { force: true });\n return 'deleted';\n }\n\n writeFileSync(filePath, stripped + '\\n', 'utf-8');\n return 'cleaned';\n};\n","import { resolveCanonicalSkillId, SKILL_TOOL } from '@/core/index.js';\nimport type { InstalledSkill, ToolId } from '@/core/index.js';\n\nexport type SkillScope = InstalledSkill['scope'];\n\nexport const resolveSkillScope = (params: { global?: boolean; project?: boolean; scope?: string }): SkillScope => {\n if (params.scope !== undefined) {\n if (params.scope === 'user') return 'user';\n if (params.scope === 'project') return 'project';\n throw new Error(`Unsupported scope: ${params.scope}`);\n }\n\n if (params.project) return 'project';\n return 'user';\n};\n\nexport const resolveRequestedTools = (params: {\n requested?: readonly string[];\n supported: readonly string[];\n}): ToolId[] => {\n if (params.requested === undefined || params.requested.length === 0) {\n return [...params.supported] as ToolId[];\n }\n\n const supportedSet = new Set(params.supported);\n const invalid = params.requested.filter((tool) => !supportedSet.has(tool));\n if (invalid.length > 0) {\n throw new Error(`Unsupported tools requested: ${invalid.join(', ')}`);\n }\n\n return [...params.requested] as ToolId[];\n};\n\nconst TOOL_ORDER = [SKILL_TOOL.CLAUDE_CODE, SKILL_TOOL.CODEX, SKILL_TOOL.GEMINI] as const;\n\nexport const mergeSkillTools = (params: { existing?: readonly string[]; requested: readonly ToolId[] }): ToolId[] => {\n const merged = new Set([...(params.existing ?? []), ...params.requested]);\n return TOOL_ORDER.filter((tool) => merged.has(tool));\n};\n\nexport const subtractSkillTools = (params: {\n requested: readonly ToolId[];\n installed?: readonly string[];\n}): ToolId[] => {\n const installed = new Set(params.installed ?? []);\n return params.requested.filter((tool) => !installed.has(tool));\n};\n\nexport const upsertInstalledSkill = (\n installedSkills: readonly InstalledSkill[],\n nextSkill: InstalledSkill,\n): InstalledSkill[] => {\n const nextSkillId = resolveCanonicalSkillId(nextSkill.id);\n const remaining = installedSkills.filter((skill) => resolveCanonicalSkillId(skill.id) !== nextSkillId);\n return [...remaining, nextSkill];\n};\n\nexport const removeInstalledSkill = (installedSkills: readonly InstalledSkill[], skillId: string): InstalledSkill[] => {\n const targetSkillId = resolveCanonicalSkillId(skillId);\n return installedSkills.filter((skill) => resolveCanonicalSkillId(skill.id) !== targetSkillId);\n};\n\nexport const findInstalledSkill = (\n installedSkills: readonly InstalledSkill[],\n skillId: string,\n): InstalledSkill | undefined => {\n const targetSkillId = resolveCanonicalSkillId(skillId);\n return installedSkills.find((skill) => resolveCanonicalSkillId(skill.id) === targetSkillId);\n};\n","import * as p from '@clack/prompts';\nimport type { ToolId } from '@/core/index.js';\nimport {\n readManifest,\n resolveManifestPath,\n loadAllRules,\n loadAllSkills,\n loadPresets,\n renderForTool,\n buildInstallPlan,\n buildSkillInstallPlan,\n buildManifest,\n writeManifest,\n computeSourceHash,\n computeDiff,\n getCliVersion,\n resolveManifestProjectSkills,\n resolveManifestRules,\n} from '@/core/index.js';\nimport {\n resolveBasePath,\n resolveCompilerDataDir,\n resolvePresetsPath,\n resolveRulesDir,\n resolveSkillsDir,\n} from '../lib/paths.js';\nimport { installFiles } from '../lib/install.js';\nimport { installSkillPackages } from '../lib/skill-install.js';\nimport { installClaudeSettings } from '../lib/claude-settings.js';\nimport { installGeminiSettings } from '../lib/gemini-settings.js';\nimport { installPrettierIgnore } from '../lib/prettier-ignore.js';\n\nexport const updateCommand = async (opts: { force: boolean }): Promise<void> => {\n const basePath = resolveBasePath();\n const manifestPath = resolveManifestPath(basePath);\n\n p.intro('ai-ops update');\n\n const manifest = readManifest(manifestPath);\n if (!manifest) {\n p.log.error('manifest가 없습니다. 먼저 ai-ops init을 실행하세요.');\n process.exit(1);\n }\n\n const rulesDir = resolveRulesDir();\n const skillsDir = resolveSkillsDir();\n const presetsPath = resolvePresetsPath();\n const sourceHash = computeSourceHash(resolveCompilerDataDir());\n const cliVersion = getCliVersion();\n const allRules = loadAllRules(rulesDir);\n const allSkills = loadAllSkills(skillsDir);\n const presets = loadPresets(presetsPath);\n const resolvedRules = resolveManifestRules({\n manifest,\n allRules,\n presets,\n });\n const resolvedSkills = resolveManifestProjectSkills({\n manifest,\n allSkills,\n });\n\n const diffResult = computeDiff({\n previous: manifest,\n currentRules: resolvedRules.installedRules.map((rule) => rule.id),\n currentSourceHash: sourceHash,\n currentCliVersion: cliVersion,\n });\n\n if (diffResult.status === 'up-to-date' && !opts.force) {\n p.log.info('변경 사항이 없습니다.');\n p.outro('ai-ops update 완료');\n return;\n }\n\n const s = p.spinner();\n s.start('규칙 갱신 중...');\n\n const meta = { sourceHash, generatedAt: new Date().toISOString() };\n const allInstalledFiles: string[] = [];\n const allAppended: string[] = [];\n\n const installedSkills = resolvedSkills.map(({ skill, requestedTools }) => {\n const { packages, installedSkill } = buildSkillInstallPlan({\n skill,\n requestedTools,\n scope: 'project',\n });\n installSkillPackages(basePath, packages);\n return installedSkill;\n });\n\n if (manifest.workspaces) {\n // 모노레포: workspaces 기반 재설치\n const workspaceEntries = Object.entries(resolvedRules.workspaces ?? {});\n\n for (const toolIdStr of manifest.tools) {\n const toolId = toolIdStr as ToolId;\n const rulesToInstall = resolvedRules.installedRules;\n const workspaceMappings = workspaceEntries.map(([path, entry]) => ({\n path,\n ruleIds: entry.rules,\n }));\n const renderResult = renderForTool(toolId, rulesToInstall, workspaceMappings);\n const actions = buildInstallPlan({ toolId, renderResult, meta });\n const r = installFiles(basePath, actions, meta);\n allInstalledFiles.push(...r.written);\n allAppended.push(...r.appended);\n }\n } else {\n // 단일 프로젝트: installed_rules 기반 재설치\n const rulesToInstall = resolvedRules.installedRules;\n\n for (const toolIdStr of manifest.tools) {\n const toolId = toolIdStr as ToolId;\n const renderResult = renderForTool(toolId, rulesToInstall);\n const actions = buildInstallPlan({ toolId, renderResult, meta });\n const r = installFiles(basePath, actions, meta);\n allInstalledFiles.push(...r.written);\n allAppended.push(...r.appended);\n }\n }\n\n if (manifest.settings?.claude) {\n installClaudeSettings(basePath, manifest.settings.claude);\n }\n\n if (manifest.settings?.gemini) {\n installGeminiSettings(basePath, manifest.settings.gemini);\n }\n\n if (manifest.settings?.prettierignore) {\n installPrettierIgnore(basePath);\n }\n\n const newManifest = buildManifest({\n tools: manifest.tools,\n scope: manifest.scope,\n preset: manifest.preset,\n workspaces: resolvedRules.workspaces,\n installedRules: resolvedRules.installedRules.map((rule) => rule.id),\n installedFiles: allInstalledFiles.length > 0 ? allInstalledFiles : manifest.installed_files,\n installedSkills,\n appendedFiles: allAppended.length > 0 ? allAppended : manifest.appended_files,\n settings: manifest.settings\n ? {\n claude: manifest.settings.claude,\n gemini: manifest.settings.gemini,\n prettierignore: manifest.settings.prettierignore,\n }\n : undefined,\n cliVersion,\n sourceHash,\n });\n writeManifest(manifestPath, newManifest);\n\n s.stop('규칙 갱신 완료');\n p.outro('ai-ops update 완료');\n};\n","import * as p from '@clack/prompts';\nimport {\n readManifest,\n resolveManifestPath,\n computeSourceHash,\n computeDiff,\n loadAllRules,\n loadAllSkills,\n loadPresets,\n buildSkillInstallPlan,\n resolveManifestProjectSkills,\n resolveManifestRules,\n} from '@/core/index.js';\nimport {\n resolveBasePath,\n resolveCompilerDataDir,\n resolvePresetsPath,\n resolveRulesDir,\n resolveSkillsDir,\n} from '../lib/paths.js';\n\nexport const diffCommand = async (): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops diff');\n\n const manifest = readManifest(resolveManifestPath(basePath));\n if (!manifest) {\n p.log.error('manifest가 없습니다. 먼저 ai-ops init을 실행하세요.');\n process.exit(1);\n }\n\n const sourceHash = computeSourceHash(resolveCompilerDataDir());\n const allRules = loadAllRules(resolveRulesDir());\n const allSkills = loadAllSkills(resolveSkillsDir());\n const presets = loadPresets(resolvePresetsPath());\n const resolvedRules = resolveManifestRules({\n manifest,\n allRules,\n presets,\n });\n const resolvedSkills = resolveManifestProjectSkills({\n manifest,\n allSkills,\n });\n\n const result = computeDiff({\n previous: manifest,\n currentRules: resolvedRules.installedRules.map((rule) => rule.id),\n currentSourceHash: sourceHash,\n });\n\n const skillLines = resolvedSkills.map(({ skill, requestedTools }) => {\n const { installedSkill: next } = buildSkillInstallPlan({\n skill,\n requestedTools,\n scope: 'project',\n });\n const previous = (manifest.installed_skills ?? []).find((installedSkill) => installedSkill.id === skill.id);\n const previousHash = previous?.sourceHash ?? 'legacy';\n const changed = previousHash !== next.sourceHash;\n\n return `- ${skill.id}: ${changed ? 'changed' : 'up-to-date'} (${previousHash} -> ${next.sourceHash})`;\n });\n\n if (result.status === 'up-to-date') {\n p.log.success('변경 사항 없음. 최신 상태입니다.');\n } else {\n if (result.sourceChanged) {\n p.log.warn(`소스 변경 감지: ${manifest.sourceHash} → ${sourceHash}`);\n }\n if (result.added.length > 0) {\n p.log.info(`추가된 규칙: ${result.added.join(', ')}`);\n }\n if (result.removed.length > 0) {\n p.log.info(`제거된 규칙: ${result.removed.join(', ')}`);\n }\n }\n\n if (skillLines.length > 0) {\n p.log.info(`project skills:\\n${skillLines.map((line) => ` ${line}`).join('\\n')}`);\n }\n\n p.outro('ai-ops diff 완료');\n};\n","import * as p from '@clack/prompts';\nimport { rmSync } from 'node:fs';\nimport { readManifest, resolveManifestPath, inferInstalledFiles, MANIFEST_FILENAME } from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\nimport { removeFiles, cleanEmptyDirs, collectManagedDirs } from '../lib/uninstall.js';\nimport { removeDirectories } from '../lib/skill-install.js';\nimport { uninstallClaudeSettings } from '../lib/claude-settings.js';\nimport { uninstallGeminiSettings } from '../lib/gemini-settings.js';\nimport { uninstallPrettierIgnore } from '../lib/prettier-ignore.js';\n\nconst SETTINGS_PATHS = new Set(['.claude/settings.local.json', '.gemini/settings.json']);\n\nexport const uninstallCommand = async (): Promise<void> => {\n const basePath = resolveBasePath();\n const manifestPath = resolveManifestPath(basePath);\n\n p.intro('ai-ops uninstall');\n\n // 1. manifest 읽기\n const manifest = readManifest(manifestPath);\n if (!manifest) {\n p.log.error('manifest가 없습니다. 먼저 ai-ops init을 실행하세요.');\n process.exit(1);\n }\n\n // 2. 삭제 대상 결정 (managed 파일 + append된 파일, settings 파일 제외)\n const targetFiles = [\n ...(manifest.installed_files ?? inferInstalledFiles(manifest)),\n ...(manifest.appended_files ?? []),\n ].filter((f) => !SETTINGS_PATHS.has(f));\n const targetSkillDirs = (manifest.installed_skills ?? []).flatMap((skill) => skill.installed_paths);\n\n if (targetFiles.length === 0 && targetSkillDirs.length === 0) {\n p.log.warn('삭제할 파일이 없습니다.');\n p.outro('ai-ops uninstall 완료');\n return;\n }\n\n // 3. 삭제 대상 목록 출력\n if (targetFiles.length > 0) {\n p.log.info(`삭제 대상 파일 (${targetFiles.length}개):\\n${targetFiles.map((f) => ` ${f}`).join('\\n')}`);\n }\n if (targetSkillDirs.length > 0) {\n p.log.info(\n `삭제 대상 skill 디렉토리 (${targetSkillDirs.length}개):\\n${targetSkillDirs.map((f) => ` ${f}`).join('\\n')}`,\n );\n }\n\n // 4. confirm\n const confirmed = await p.confirm({\n message: '위 파일과 manifest를 모두 삭제하시겠습니까?',\n initialValue: false,\n });\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('취소됨');\n process.exit(0);\n }\n\n // 5. settings 파일 별도 처리\n const settingsMessages: string[] = [];\n if (manifest.settings?.claude) {\n const status = uninstallClaudeSettings(basePath, manifest.settings.claude);\n if (status === 'deleted') settingsMessages.push('삭제: .claude/settings.local.json');\n else if (status === 'cleaned')\n settingsMessages.push('ai-ops 키 제거 (사용자 설정 보존): .claude/settings.local.json');\n }\n if (manifest.settings?.gemini) {\n const status = uninstallGeminiSettings(basePath, manifest.settings.gemini);\n if (status === 'deleted') settingsMessages.push('삭제: .gemini/settings.json');\n else if (status === 'cleaned') settingsMessages.push('ai-ops 키 제거 (사용자 설정 보존): .gemini/settings.json');\n }\n const prettierStatus = uninstallPrettierIgnore(basePath);\n if (prettierStatus === 'deleted') settingsMessages.push('삭제: .prettierignore');\n else if (prettierStatus === 'cleaned') settingsMessages.push('ai-ops 섹션 제거 (사용자 내용 보존): .prettierignore');\n\n // 6. 파일 삭제\n const result = removeFiles(basePath, targetFiles);\n const removedSkillDirs = removeDirectories(basePath, targetSkillDirs);\n\n // 7. 빈 디렉토리 정리\n const dirs = collectManagedDirs(targetFiles);\n const removedDirs = cleanEmptyDirs(basePath, dirs);\n\n // 8. manifest 삭제\n rmSync(manifestPath, { force: true });\n\n // 9. 결과 요약\n if (result.deleted.length > 0) {\n p.log.success(`삭제 완료 (${result.deleted.length}개):\\n${result.deleted.map((f) => ` ${f}`).join('\\n')}`);\n }\n if (result.cleaned.length > 0) {\n p.log.success(\n `섹션 제거 완료 (사용자 내용 보존, ${result.cleaned.length}개):\\n${result.cleaned.map((f) => ` ${f}`).join('\\n')}`,\n );\n }\n if (result.skipped.length > 0) {\n p.log.warn(\n `건너뜀 (non-managed 파일 보호, ${result.skipped.length}개):\\n${result.skipped.map((f) => ` ${f}`).join('\\n')}`,\n );\n }\n if (result.notFound.length > 0) {\n p.log.info(`이미 없음 (${result.notFound.length}개):\\n${result.notFound.map((f) => ` ${f}`).join('\\n')}`);\n }\n if (removedDirs.length > 0) {\n p.log.info(`빈 디렉토리 정리 (${removedDirs.length}개):\\n${removedDirs.map((d) => ` ${d}`).join('\\n')}`);\n }\n if (removedSkillDirs.length > 0) {\n p.log.success(\n `skill 디렉토리 삭제 (${removedSkillDirs.length}개):\\n${removedSkillDirs.map((d) => ` ${d}`).join('\\n')}`,\n );\n }\n if (settingsMessages.length > 0) {\n p.log.success(`설정 파일 처리:\\n${settingsMessages.map((m) => ` ${m}`).join('\\n')}`);\n }\n\n p.log.success(`manifest 삭제: ${MANIFEST_FILENAME}`);\n p.outro('ai-ops uninstall 완료');\n};\n","import { existsSync, readFileSync, rmSync, readdirSync, writeFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport { hasAiOpsSection, stripAiOpsSection, hasLegacyHeader } from '@/core/index.js';\n\nexport type UninstallResult = {\n deleted: string[];\n cleaned: string[]; // 섹션만 제거된 파일 (append 되었던 파일)\n skipped: string[]; // non-managed 파일 (사용자 파일 보호)\n notFound: string[]; // 이미 삭제됨\n};\n\nexport const removeFiles = (basePath: string, relativePaths: readonly string[]): UninstallResult => {\n const deleted: string[] = [];\n const cleaned: string[] = [];\n const skipped: string[] = [];\n const notFound: string[] = [];\n\n for (const rel of relativePaths) {\n const absPath = resolve(basePath, rel);\n\n if (!existsSync(absPath)) {\n notFound.push(rel);\n continue;\n }\n\n const content = readFileSync(absPath, 'utf-8');\n\n if (hasAiOpsSection(content)) {\n const stripped = stripAiOpsSection(content);\n if (stripped.trim().length === 0) {\n rmSync(absPath);\n deleted.push(rel);\n } else {\n writeFileSync(absPath, stripped, 'utf-8');\n cleaned.push(rel);\n }\n } else if (hasLegacyHeader(content)) {\n rmSync(absPath);\n deleted.push(rel);\n } else {\n skipped.push(rel);\n }\n }\n\n return { deleted, cleaned, skipped, notFound };\n};\n\n/** 대상 디렉토리가 비어 있으면 삭제하고, 삭제한 경로 배열 반환 */\nexport const cleanEmptyDirs = (basePath: string, dirs: readonly string[]): string[] => {\n const removed: string[] = [];\n\n for (const dir of dirs) {\n const absDir = resolve(basePath, dir);\n if (!existsSync(absDir)) continue;\n\n try {\n const entries = readdirSync(absDir);\n if (entries.length === 0) {\n rmSync(absDir, { recursive: true });\n removed.push(dir);\n }\n } catch {\n // 삭제 실패는 무시\n }\n }\n\n return removed;\n};\n\n/** manifest의 installed_files에서 정리 대상 디렉토리 목록 추출 */\nexport const collectManagedDirs = (relativePaths: readonly string[]): string[] => {\n const dirs = new Set<string>();\n for (const rel of relativePaths) {\n const dir = dirname(rel);\n if (dir !== '.') {\n dirs.add(dir);\n }\n }\n return [...dirs];\n};\n","import * as p from '@clack/prompts';\nimport { rmSync } from 'node:fs';\nimport type { InstalledSkill, Skill, ToolId } from '@/core/index.js';\nimport {\n loadAllSkills,\n buildSkillInstallPlan,\n resolveManifestPath,\n readManifest,\n writeManifest,\n buildManifest,\n computeSourceHash,\n getCliVersion,\n readSkillRegistry,\n resolveSkillRegistryPath,\n writeSkillRegistry,\n resolveCanonicalSkillId,\n} from '@/core/index.js';\nimport { resolveBasePath, resolveCompilerDataDir, resolveSkillsDir, resolveUserBasePath } from '../lib/paths.js';\nimport {\n findInstalledSkill,\n mergeSkillTools,\n removeInstalledSkill,\n resolveRequestedTools,\n resolveSkillScope,\n upsertInstalledSkill,\n} from '../lib/skill-state.js';\nimport { installSkillPackages, removeDirectories } from '../lib/skill-install.js';\n\ntype SkillCommandOptions = {\n global?: boolean;\n project?: boolean;\n scope?: string;\n tool?: string[];\n};\n\nconst resolveScopeContext = (\n opts: SkillCommandOptions,\n): {\n scope: InstalledSkill['scope'];\n basePath: string;\n} => {\n const scope = resolveSkillScope(opts);\n return {\n scope,\n basePath: scope === 'project' ? resolveBasePath() : resolveUserBasePath(),\n };\n};\n\nconst loadCompilerInputs = (): {\n allSkills: ReturnType<typeof loadAllSkills>;\n sourceHash: string;\n cliVersion: string;\n} => {\n const compilerDataDir = resolveCompilerDataDir();\n return {\n allSkills: loadAllSkills(resolveSkillsDir()),\n sourceHash: computeSourceHash(compilerDataDir),\n cliVersion: getCliVersion(),\n };\n};\n\nconst resolveSkillById = (skills: readonly Skill[], skillId: string): Skill => {\n const canonicalSkillId = resolveCanonicalSkillId(skillId);\n const skill = skills.find((candidate) => candidate.id === canonicalSkillId);\n if (!skill) {\n throw new Error(`Unknown skill: ${skillId}`);\n }\n return skill;\n};\n\nconst assertScopeAllowed = (skill: Skill, scope: InstalledSkill['scope']): void => {\n if (!skill.install_scopes.includes(scope)) {\n throw new Error(`Skill ${skill.id} does not support ${scope} scope`);\n }\n};\n\nconst writeProjectSkillState = (params: {\n basePath: string;\n sourceHash: string;\n cliVersion: string;\n nextSkill?: InstalledSkill;\n removeSkillId?: string;\n}): void => {\n const manifestPath = resolveManifestPath(params.basePath);\n const previous = readManifest(manifestPath);\n const installedSkills = params.removeSkillId\n ? removeInstalledSkill(previous?.installed_skills ?? [], params.removeSkillId)\n : params.nextSkill\n ? upsertInstalledSkill(previous?.installed_skills ?? [], params.nextSkill)\n : (previous?.installed_skills ?? []);\n\n const nextTools =\n params.nextSkill !== undefined\n ? [...new Set([...(previous?.tools ?? []), ...params.nextSkill.tools])]\n : (previous?.tools ?? []);\n\n const hasProjectState =\n (previous?.installed_rules.length ?? 0) > 0 ||\n (previous?.installed_files?.length ?? 0) > 0 ||\n (previous?.appended_files?.length ?? 0) > 0 ||\n installedSkills.length > 0 ||\n previous?.settings !== undefined;\n\n if (!hasProjectState) {\n rmSync(manifestPath, { force: true });\n return;\n }\n\n const manifest = buildManifest({\n tools: nextTools.length > 0 ? nextTools : (params.nextSkill?.tools ?? ['codex']),\n scope: 'project',\n preset: previous?.preset,\n workspaces: previous?.workspaces,\n installedRules: previous?.installed_rules ?? [],\n installedFiles: previous?.installed_files,\n installedSkills,\n appendedFiles: previous?.appended_files,\n settings: previous?.settings,\n cliVersion: params.cliVersion,\n sourceHash: params.sourceHash,\n });\n\n writeManifest(manifestPath, manifest);\n};\n\nconst writeUserSkillState = (params: {\n basePath: string;\n cliVersion: string;\n nextSkill?: InstalledSkill;\n removeSkillId?: string;\n}): void => {\n const registryPath = resolveSkillRegistryPath(params.basePath);\n const previous = readSkillRegistry(registryPath);\n const skills = params.removeSkillId\n ? removeInstalledSkill(previous?.skills ?? [], params.removeSkillId)\n : params.nextSkill\n ? upsertInstalledSkill(previous?.skills ?? [], params.nextSkill)\n : (previous?.skills ?? []);\n\n if (skills.length === 0) {\n rmSync(registryPath, { force: true });\n return;\n }\n\n writeSkillRegistry(registryPath, {\n skills,\n cliVersion: params.cliVersion,\n generatedAt: new Date().toISOString(),\n });\n};\n\nconst readInstalledSkills = (scope: InstalledSkill['scope'], basePath: string): InstalledSkill[] => {\n if (scope === 'project') {\n return (readManifest(resolveManifestPath(basePath))?.installed_skills ?? []).map((installedSkill) => ({\n ...installedSkill,\n id: resolveCanonicalSkillId(installedSkill.id),\n }));\n }\n\n return (readSkillRegistry(resolveSkillRegistryPath(basePath))?.skills ?? []).map((installedSkill) => ({\n ...installedSkill,\n id: resolveCanonicalSkillId(installedSkill.id),\n }));\n};\n\nconst installSkill = (params: {\n skill: Skill;\n requestedTools: readonly ToolId[];\n scope: InstalledSkill['scope'];\n basePath: string;\n cliVersion: string;\n sourceHash: string;\n}): InstalledSkill => {\n const installedSkills = readInstalledSkills(params.scope, params.basePath);\n const existingInstalledSkill = findInstalledSkill(installedSkills, params.skill.id);\n const nextRequestedTools = mergeSkillTools({\n existing: existingInstalledSkill?.tools,\n requested: params.requestedTools,\n });\n const { packages, installedSkill } = buildSkillInstallPlan({\n skill: params.skill,\n requestedTools: nextRequestedTools,\n scope: params.scope,\n });\n installSkillPackages(params.basePath, packages);\n\n if (params.scope === 'project') {\n writeProjectSkillState({\n basePath: params.basePath,\n sourceHash: params.sourceHash,\n cliVersion: params.cliVersion,\n nextSkill: installedSkill,\n });\n } else {\n writeUserSkillState({\n basePath: params.basePath,\n cliVersion: params.cliVersion,\n nextSkill: installedSkill,\n });\n }\n\n return installedSkill;\n};\n\nexport const skillListCommand = async (opts: SkillCommandOptions): Promise<void> => {\n const { scope, basePath } = resolveScopeContext(opts);\n const { allSkills } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(scope, basePath);\n\n p.intro(`ai-ops skill list (${scope})`);\n const sections = [\n { kind: 'reference' as const, title: 'reference skills' },\n { kind: 'task' as const, title: 'task skills' },\n ]\n .map(({ kind, title }) => {\n const lines = allSkills\n .filter((skill) => skill.kind === kind)\n .map((skill) => {\n const installed = findInstalledSkill(installedSkills, skill.id);\n const suffix = installed ? `installed for ${installed.tools.join(', ')}` : 'not installed';\n return `- ${skill.id} (${skill.install_scopes.join(', ')}) - ${suffix}`;\n });\n\n if (lines.length === 0) {\n return null;\n }\n\n return `${title}\\n${lines.join('\\n')}`;\n })\n .filter((section): section is string => section !== null);\n\n p.log.info(sections.join('\\n\\n'));\n p.outro('ai-ops skill list 완료');\n};\n\nexport const skillInstallCommand = async (skillId: string, opts: SkillCommandOptions): Promise<void> => {\n const { scope, basePath } = resolveScopeContext(opts);\n const { allSkills, sourceHash, cliVersion } = loadCompilerInputs();\n const skill = resolveSkillById(allSkills, skillId);\n assertScopeAllowed(skill, scope);\n const requestedTools = resolveRequestedTools({ requested: opts.tool, supported: skill.supported_tools });\n\n p.intro(`ai-ops skill install ${skillId}`);\n const installedSkill = installSkill({\n skill,\n requestedTools,\n scope,\n basePath,\n cliVersion,\n sourceHash,\n });\n\n p.log.success(`설치 완료: ${installedSkill.id} (${installedSkill.installed_paths.join(', ')})`);\n p.outro('ai-ops skill install 완료');\n};\n\nexport const skillDiffCommand = async (skillId: string | undefined, opts: SkillCommandOptions): Promise<void> => {\n const { scope, basePath } = resolveScopeContext(opts);\n const { allSkills } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(scope, basePath);\n const targets = skillId ? installedSkills.filter((skill) => skill.id === skillId) : installedSkills;\n\n p.intro(`ai-ops skill diff (${scope})`);\n\n if (targets.length === 0) {\n p.log.warn('비교할 설치된 skill이 없습니다.');\n p.outro('ai-ops skill diff 완료');\n return;\n }\n\n const lines = targets.map((installedSkill) => {\n const skill = resolveSkillById(allSkills, installedSkill.id);\n const { installedSkill: next } = buildSkillInstallPlan({\n skill,\n requestedTools: installedSkill.tools,\n scope,\n });\n const changed = next.sourceHash !== installedSkill.sourceHash;\n return `- ${installedSkill.id}: ${changed ? 'changed' : 'up-to-date'} (${installedSkill.sourceHash} -> ${next.sourceHash})`;\n });\n\n p.log.info(lines.join('\\n'));\n p.outro('ai-ops skill diff 완료');\n};\n\nexport const skillUpdateCommand = async (skillId: string | undefined, opts: SkillCommandOptions): Promise<void> => {\n const { scope, basePath } = resolveScopeContext(opts);\n const { allSkills, sourceHash, cliVersion } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(scope, basePath);\n const targets = skillId ? installedSkills.filter((skill) => skill.id === skillId) : installedSkills;\n\n p.intro(`ai-ops skill update (${scope})`);\n\n if (targets.length === 0) {\n p.log.warn('갱신할 설치된 skill이 없습니다.');\n p.outro('ai-ops skill update 완료');\n return;\n }\n\n const nextInstalledSkills = targets.map((installedSkill) => {\n const skill = resolveSkillById(allSkills, installedSkill.id);\n const { packages, installedSkill: next } = buildSkillInstallPlan({\n skill,\n requestedTools: installedSkill.tools,\n scope,\n });\n installSkillPackages(basePath, packages);\n return next;\n });\n\n if (scope === 'project') {\n const manifestPath = resolveManifestPath(basePath);\n const previous = readManifest(manifestPath);\n if (!previous) {\n p.log.error('project manifest가 없습니다.');\n process.exit(1);\n }\n const untouched = (previous.installed_skills ?? []).filter(\n (installedSkill) => !nextInstalledSkills.some((next) => next.id === installedSkill.id),\n );\n writeManifest(\n manifestPath,\n buildManifest({\n tools: previous.tools,\n scope: previous.scope,\n preset: previous.preset,\n workspaces: previous.workspaces,\n installedRules: previous.installed_rules,\n installedFiles: previous.installed_files,\n installedSkills: [...untouched, ...nextInstalledSkills],\n appendedFiles: previous.appended_files,\n settings: previous.settings,\n cliVersion,\n sourceHash,\n }),\n );\n } else {\n const registryPath = resolveSkillRegistryPath(basePath);\n const previous = readSkillRegistry(registryPath);\n const untouched = (previous?.skills ?? []).filter(\n (installedSkill) => !nextInstalledSkills.some((next) => next.id === installedSkill.id),\n );\n writeSkillRegistry(registryPath, {\n skills: [...untouched, ...nextInstalledSkills],\n cliVersion,\n generatedAt: new Date().toISOString(),\n });\n }\n\n p.log.success(`갱신 완료: ${nextInstalledSkills.map((skill) => skill.id).join(', ')}`);\n p.outro('ai-ops skill update 완료');\n};\n\nexport const skillUninstallCommand = async (skillId: string, opts: SkillCommandOptions): Promise<void> => {\n const { scope, basePath } = resolveScopeContext(opts);\n const { sourceHash, cliVersion } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(scope, basePath);\n const installedSkill = findInstalledSkill(installedSkills, skillId);\n\n p.intro(`ai-ops skill uninstall ${skillId}`);\n\n if (!installedSkill) {\n p.log.warn('설치된 skill을 찾지 못했습니다.');\n p.outro('ai-ops skill uninstall 완료');\n return;\n }\n\n const removed = removeDirectories(basePath, installedSkill.installed_paths);\n\n if (scope === 'project') {\n writeProjectSkillState({\n basePath,\n sourceHash,\n cliVersion,\n removeSkillId: skillId,\n });\n } else {\n writeUserSkillState({\n basePath,\n cliVersion,\n removeSkillId: skillId,\n });\n }\n\n p.log.success(`제거 완료: ${removed.join(', ')}`);\n p.outro('ai-ops skill uninstall 완료');\n};\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport * as p from '@clack/prompts';\nimport { buildSpecInitPlan } from '@/core/index.js';\n\nexport const specInitCommand = async (opts: { force: boolean }): Promise<void> => {\n p.intro('ai-ops spec init');\n\n const specsDir = join(process.cwd(), 'specs');\n\n if (existsSync(specsDir) && !opts.force) {\n p.log.error('specs/ 디렉토리가 이미 존재합니다. 덮어쓰려면 --force 옵션을 사용하세요.');\n process.exit(1);\n }\n\n const actions = buildSpecInitPlan();\n\n for (const action of actions) {\n const dest = join(process.cwd(), action.relativePath);\n mkdirSync(dirname(dest), { recursive: true });\n writeFileSync(dest, action.content, 'utf-8');\n p.log.success(`생성: ${action.relativePath}`);\n }\n\n p.outro('ai-ops spec init 완료');\n};\n"],"mappings":"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","names":["p","z","z","z","z","z","z","z","z","parse","parse","join","p","join","global","domain","rootContent","domainFiles","join","readFileSync","readdirSync","join","resolve","resolve","readFileSync","readdirSync","join","join","readFileSync","dirname","join","join","readFileSync","dirname","preset","installedRules","mkdirSync","readFileSync","writeFileSync","dirname","join","join","readFileSync","mkdirSync","dirname","writeFileSync","join","join","join","join","dirname","resolve","fileURLToPath","__dirname","join","join","join","existsSync","readdirSync","join","resolve","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","resolve","resolve","existsSync","mkdirSync","dirname","writeFileSync","readFileSync","existsSync","mkdirSync","writeFileSync","dirname","resolve","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","rmSync","SETTING_GROUPS","CONFIG","p","existsSync","readFileSync","rmSync","writeFileSync","join","SECTION_START","SECTION_END","hasAiOpsSection","stripAiOpsSection","join","existsSync","writeFileSync","readFileSync","rmSync","spinner","p","p","p","rmSync","existsSync","readFileSync","rmSync","readdirSync","writeFileSync","resolve","dirname","resolve","existsSync","readFileSync","rmSync","writeFileSync","readdirSync","dirname","rmSync","p","rmSync","rmSync","existsSync","mkdirSync","writeFileSync","join","dirname","p","join","existsSync","mkdirSync","dirname","writeFileSync"]}
1
+ {"version":3,"sources":["../../src/bin/index.ts","../../src/commands/init.ts","../../src/core/schemas/rule.schema.ts","../../src/core/schemas/preset.schema.ts","../../src/core/schemas/skill.schema.ts","../../src/core/schemas/skill-catalog.schema.ts","../../src/core/schemas/skill-registry.schema.ts","../../src/core/schemas/subagent.schema.ts","../../src/core/schemas/project-layer.schema.ts","../../src/core/subagent-paths.ts","../../src/core/schemas/subagent-catalog.schema.ts","../../src/core/schemas/subagent-manifest.schema.ts","../../src/core/schemas/pack.schema.ts","../../src/core/schemas/manifest.schema.ts","../../src/core/loader.ts","../../src/core/frontmatter.ts","../../src/core/subagent-toml.ts","../../src/core/renderer.ts","../../src/core/skill-renderer.ts","../../src/core/source-hash.ts","../../src/core/subagent-renderer.ts","../../src/core/managed-header.ts","../../src/core/manifest-io.ts","../../src/core/manifest-resolution.ts","../../src/core/skill-registry-io.ts","../../src/core/subagent-manifest-io.ts","../../src/core/install-plan.ts","../../src/core/project-layer.ts","../../src/core/paths.ts","../../src/core/pack.ts","../../src/core/uninstall-plan.ts","../../src/lib/paths.ts","../../src/commands/project-layer-errors.ts","../../src/commands/update.ts","../../src/commands/diff.ts","../../src/commands/audit.ts","../../src/commands/uninstall.ts","../../src/commands/skill.ts","../../src/lib/skill-state.ts","../../src/lib/skill-install.ts","../../src/commands/subagent.ts","../../src/lib/subagent-install.ts","../../src/lib/subagent-state.ts","../../src/commands/pack.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { initCommand } from '../commands/init.js';\nimport { updateCommand } from '../commands/update.js';\nimport { diffCommand } from '../commands/diff.js';\nimport { auditCommand } from '../commands/audit.js';\nimport { uninstallCommand } from '../commands/uninstall.js';\nimport {\n skillDiffCommand,\n skillInstallCommand,\n skillListCommand,\n skillUninstallCommand,\n skillUpdateCommand,\n} from '../commands/skill.js';\nimport {\n subagentDiffCommand,\n subagentInstallCommand,\n subagentListCommand,\n subagentUninstallCommand,\n subagentUpdateCommand,\n} from '../commands/subagent.js';\nimport {\n packDiffCommand,\n packInstallCommand,\n packListCommand,\n packUninstallCommand,\n packUpdateCommand,\n} from '../commands/pack.js';\n\nconst program = new Command();\n\nprogram.name('ai-ops').description('AI agent operating layer manager').version('0.1.0');\n\nprogram\n .command('init')\n .description('project operating layer 초기 설치')\n .option('--tool <tool...>', '대상 도구 adapter 지정 (codex|gemini|claude-code)')\n .action((opts: { tool?: string[] }) => initCommand(opts));\n\nprogram\n .command('update')\n .description('project operating layer 갱신')\n .option('--force', '변경 없어도 강제 재설치', false)\n .action((opts: { force: boolean }) => updateCommand(opts));\n\nprogram\n .command('diff')\n .description('project operating layer drift 비교')\n .action(() => diffCommand());\n\nprogram\n .command('audit')\n .description('project operating layer 상태 검사')\n .action(() => auditCommand());\n\nprogram\n .command('uninstall')\n .description('project operating layer 제거')\n .option('--yes', '확인 프롬프트 없이 제거', false)\n .action((opts: { yes?: boolean }) => uninstallCommand(opts));\n\nconst skillCommand = program.command('skill').description('에이전트 skill 설치/조회/갱신');\n\nconst applySkillInstallOptions = (command: Command): Command => command.option('--tool <tool...>', '대상 도구 지정');\n\nskillCommand.command('list').description('사용 가능한 skill 목록').action(() => skillListCommand());\n\napplySkillInstallOptions(skillCommand.command('install <skillId>').description('skill 설치')).action((skillId, opts) =>\n skillInstallCommand(skillId, opts),\n);\n\nskillCommand\n .command('diff [skillId]')\n .description('skill 변경 비교')\n .action((skillId) => skillDiffCommand(skillId));\n\nskillCommand\n .command('update [skillId]')\n .description('skill 갱신')\n .action((skillId) => skillUpdateCommand(skillId));\n\nskillCommand\n .command('uninstall <skillId>')\n .description('skill 제거')\n .action((skillId) => skillUninstallCommand(skillId));\n\nconst subagentCommand = program.command('subagent').description('에이전트 subagent 설치/조회/갱신');\n\nconst applySubagentInstallOptions = (command: Command): Command => command.option('--tool <tool...>', '대상 도구 지정');\n\nsubagentCommand.command('list').description('사용 가능한 subagent 목록').action(() => subagentListCommand());\n\napplySubagentInstallOptions(subagentCommand.command('install <subagentId>').description('subagent 설치')).action(\n (subagentId, opts) => subagentInstallCommand(subagentId, opts),\n);\n\nsubagentCommand\n .command('diff [subagentId]')\n .description('subagent 변경 비교')\n .action((subagentId) => subagentDiffCommand(subagentId));\n\nsubagentCommand\n .command('update [subagentId]')\n .description('subagent 갱신')\n .action((subagentId) => subagentUpdateCommand(subagentId));\n\nsubagentCommand\n .command('uninstall <subagentId>')\n .description('subagent 제거')\n .action((subagentId) => subagentUninstallCommand(subagentId));\n\nconst packCommand = program.command('pack').description('optional project operating layer pack 설치/조회/갱신');\n\npackCommand.command('list').description('사용 가능한 pack 목록').action(() => packListCommand());\n\npackCommand\n .command('install <packId>')\n .description('pack 설치')\n .action((packId) => packInstallCommand(packId));\n\npackCommand\n .command('diff [packId]')\n .description('pack 변경 비교')\n .action((packId) => packDiffCommand(packId));\n\npackCommand\n .command('update [packId]')\n .description('pack 갱신')\n .action((packId) => packUpdateCommand(packId));\n\npackCommand\n .command('uninstall <packId>')\n .description('pack 제거')\n .action((packId) => packUninstallCommand(packId));\n\nprogram.parse();\n","import * as p from '@clack/prompts';\nimport {\n installProjectLayer,\n readProjectLayerManifest,\n resolveProjectLayerTools,\n type ProjectLayerTool,\n} from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\nimport { reportInvalidProjectLayerManifest, reportProjectLayerApplyError } from './project-layer-errors.js';\n\ntype InitCommandOptions = {\n tool?: string[];\n};\n\nconst TOOL_OPTIONS = [\n { value: 'codex' as ProjectLayerTool, label: 'Codex' },\n { value: 'gemini' as ProjectLayerTool, label: 'Gemini CLI' },\n { value: 'claude-code' as ProjectLayerTool, label: 'Claude Code' },\n];\n\nconst promptTools = async (): Promise<ProjectLayerTool[] | null> => {\n const selectedTools = await p.multiselect<ProjectLayerTool>({\n message: 'AI 도구 adapter를 선택하세요',\n options: TOOL_OPTIONS,\n initialValues: TOOL_OPTIONS.map((option) => option.value),\n required: true,\n });\n\n return p.isCancel(selectedTools) ? null : resolveProjectLayerTools(selectedTools);\n};\n\nexport const initCommand = async (opts: InitCommandOptions = {}): Promise<void> => {\n p.intro('ai-ops init');\n const basePath = resolveBasePath();\n\n const tools = opts.tool && opts.tool.length > 0 ? resolveProjectLayerTools(opts.tool) : await promptTools();\n if (tools === null) {\n p.cancel('취소됨');\n process.exit(0);\n }\n\n let previousManifest: ReturnType<typeof readProjectLayerManifest>;\n try {\n previousManifest = readProjectLayerManifest(basePath);\n } catch (error) {\n reportInvalidProjectLayerManifest({ error, outro: 'ai-ops init 실패' });\n return;\n }\n\n let result: ReturnType<typeof installProjectLayer>;\n try {\n result = installProjectLayer({\n basePath,\n tools,\n previousManifest,\n });\n } catch (error) {\n reportProjectLayerApplyError({ error, outro: 'ai-ops init 실패' });\n return;\n }\n\n p.log.success(`project operating layer 설치 완료: ${result.manifest.managed_files.length + result.manifest.project_files.length}개 파일`);\n p.log.info(`도구 adapter: ${result.manifest.tools.join(', ')}`);\n if (result.appended.length > 0) {\n p.log.info(`기존 파일에 managed section 추가:\\n${result.appended.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.refreshedProjectFiles.length > 0) {\n p.log.info(`unmodified project-owned 파일 갱신:\\n${result.refreshedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preservedProjectFiles.length > 0) {\n p.log.info(`기존 project-owned 파일 보존:\\n${result.preservedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n\n p.outro('ai-ops init 완료');\n};\n","/**\n * Rule = SSOT의 최소 지식 단위. 하나의 코딩 컨벤션/아키텍처 규칙을 YAML로 구조화한 것.\n */\nimport { z } from 'zod';\n\nexport const DecisionTableEntrySchema = z\n .object({\n when: z.string().min(1),\n then: z.string().min(1),\n /** 조건부 규칙에서 회피해야 할 패턴 */\n avoid: z.string().min(1).optional(),\n })\n .strict();\n\nexport const RuleContentSchema = z\n .object({\n /** Anti-pattern 규칙 ('하지 마라'). guidelines보다 항상 상단 렌더링 */\n constraints: z.array(z.string().min(1)).default([]),\n /** Positive 규칙 ('해라') */\n guidelines: z.array(z.string().min(1)),\n /** 조건부 규칙. when→then→avoid 구조 */\n decision_table: z.array(DecisionTableEntrySchema).optional(),\n })\n .strict();\n\nexport const RuleSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n category: z.string().min(1),\n tags: z.array(z.string().min(1)),\n /** 0-100. 높을수록 생성 파일 상단 배치 (U-shaped attention 최적화) */\n priority: z.number().int().min(0).max(100),\n supported_tools: z.array(z.string().min(1)).min(1).default(['claude-code', 'codex', 'gemini']),\n content: RuleContentSchema,\n })\n .strict();\n\nexport type DecisionTableEntry = z.infer<typeof DecisionTableEntrySchema>;\nexport type RuleContent = z.infer<typeof RuleContentSchema>;\nexport type Rule = z.infer<typeof RuleSchema>;\n","import { z } from 'zod';\n\nexport const PresetSchema = z\n .object({\n id: z\n .string()\n .regex(/^[a-z][a-z0-9-]*$/)\n .min(1),\n description: z.string().min(1),\n rules: z.array(z.string().min(1)).min(1),\n })\n .strict();\n\nexport type Preset = z.infer<typeof PresetSchema>;\n","import { z } from 'zod';\n\nexport const SKILL_KIND = {\n REFERENCE: 'reference',\n TASK: 'task',\n} as const;\n\nexport const SKILL_TOOL = {\n CLAUDE_CODE: 'claude-code',\n CODEX: 'codex',\n GEMINI: 'gemini',\n} as const;\n\nexport const SkillKindSchema = z.union([z.literal(SKILL_KIND.REFERENCE), z.literal(SKILL_KIND.TASK)]);\nexport const SkillToolSchema = z.union([\n z.literal(SKILL_TOOL.CLAUDE_CODE),\n z.literal(SKILL_TOOL.CODEX),\n z.literal(SKILL_TOOL.GEMINI),\n]);\n\nexport const SkillFileSchema = z\n .object({\n path: z.string().min(1),\n content: z.string(),\n })\n .strict();\n\nexport const SkillFrontmatterSchema = z\n .object({\n name: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'name must be kebab-case'),\n description: z.string().min(1),\n })\n .passthrough();\n\nexport type SkillFile = z.infer<typeof SkillFileSchema>;\nexport type SkillFrontmatter = z.infer<typeof SkillFrontmatterSchema>;\nexport type Skill = {\n id: string;\n kind: z.infer<typeof SkillKindSchema>;\n description: string;\n supported_tools: z.infer<typeof SkillToolSchema>[];\n groups: string[];\n included_in_presets: string[];\n directory: string;\n files: SkillFile[];\n};\n\nexport const InstalledSkillSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n kind: SkillKindSchema,\n tools: z.array(SkillToolSchema).min(1),\n installed_paths: z.array(z.string().min(1)).min(1),\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n })\n .strip();\n\nexport type InstalledSkill = z.infer<typeof InstalledSkillSchema>;\n","import { z } from 'zod';\nimport { SkillKindSchema, SkillToolSchema } from './skill.schema.js';\n\nconst SkillIdSchema = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case');\nconst SkillCatalogPathSchema = z\n .string()\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*)+$/, 'source_path must be relative kebab-case path');\n\nexport const SkillCatalogEntrySchema = z\n .object({\n id: SkillIdSchema,\n kind: SkillKindSchema,\n supported_tools: z.array(SkillToolSchema).min(1),\n groups: z.array(z.string().min(1)),\n included_in_presets: z.array(z.string().min(1)),\n source_path: SkillCatalogPathSchema,\n })\n .strict()\n .superRefine((entry, ctx) => {\n const expectedPrefix = entry.kind === 'reference' ? 'reference-skills/' : 'task-skills/';\n\n if (!entry.source_path.startsWith(expectedPrefix)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['source_path'],\n message: `source_path must start with ${expectedPrefix}`,\n });\n }\n });\n\nexport const SkillCatalogSchema = z\n .object({\n skills: z.array(SkillCatalogEntrySchema),\n })\n .strict();\n\nexport type SkillCatalogEntry = z.infer<typeof SkillCatalogEntrySchema>;\nexport type SkillCatalog = z.infer<typeof SkillCatalogSchema>;\n","import { z } from 'zod';\nimport { InstalledSkillSchema } from './skill.schema.js';\n\nexport const SkillRegistrySchema = z\n .object({\n skills: z.array(InstalledSkillSchema),\n cliVersion: z.string().optional(),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type SkillRegistry = z.infer<typeof SkillRegistrySchema>;\n","import { z } from 'zod';\nimport { SkillToolSchema } from './skill.schema.js';\nimport { isSafeProjectLayerPath } from './project-layer.schema.js';\nimport { buildSubagentRelativePath } from '../subagent-paths.js';\n\nexport const SubagentIdSchema = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case');\n\nexport const SubagentMarkdownFrontmatterSchema = z\n .object({\n name: SubagentIdSchema,\n description: z.string().min(1),\n })\n .passthrough();\n\nconst TomlValueSchema = z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]);\nconst SubagentInstalledPathSchema = z\n .string()\n .min(1)\n .refine(isSafeProjectLayerPath, 'installed path must be safe relative path');\n\nexport const CodexSubagentFrontmatterSchema = z\n .object({\n name: SubagentIdSchema,\n description: z.string().min(1),\n skill_names: z.array(SubagentIdSchema).optional(),\n })\n .catchall(TomlValueSchema);\n\nexport type SubagentMarkdownFrontmatter = z.infer<typeof SubagentMarkdownFrontmatterSchema>;\nexport type CodexSubagentFrontmatter = z.infer<typeof CodexSubagentFrontmatterSchema>;\n\nexport type Subagent = {\n id: string;\n supported_tools: z.infer<typeof SkillToolSchema>[];\n source_path: string;\n directory: string;\n prompt: string;\n frontmatter: {\n claude: {\n raw: string;\n parsed: SubagentMarkdownFrontmatter;\n };\n codex: {\n raw: string;\n parsed: CodexSubagentFrontmatter;\n };\n gemini: {\n raw: string;\n parsed: SubagentMarkdownFrontmatter;\n };\n };\n};\n\nexport const InstalledSubagentSchema = z\n .object({\n id: SubagentIdSchema,\n tools: z.array(SkillToolSchema).min(1),\n installed_paths: z.array(SubagentInstalledPathSchema).min(1),\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n })\n .strip()\n .superRefine((subagent, ctx) => {\n const expectedPaths = new Set(subagent.tools.map((tool) => buildSubagentRelativePath(subagent.id, tool)));\n const installedPaths = new Set(subagent.installed_paths);\n\n if (installedPaths.size !== subagent.installed_paths.length) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['installed_paths'],\n message: 'installed_paths must not contain duplicates',\n });\n return;\n }\n\n if (installedPaths.size !== expectedPaths.size) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['installed_paths'],\n message: 'installed_paths must match id and tools',\n });\n return;\n }\n\n for (const installedPath of installedPaths) {\n if (!expectedPaths.has(installedPath)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['installed_paths'],\n message: 'installed_paths must match id and tools',\n });\n return;\n }\n }\n });\n\nexport type InstalledSubagent = z.infer<typeof InstalledSubagentSchema>;\n","import { z } from 'zod';\n\nexport const ProjectLayerToolSchema = z.enum(['claude-code', 'codex', 'gemini']);\n\nexport const ProjectLayerDocumentStatusSchema = z.enum(['Active', 'Reserved', 'Draft', 'Archived']);\n\nconst ShortHashSchema = z.string().regex(/^[a-f0-9]{6}$/, 'hash must be 6 lowercase hex chars');\n\nexport const isSafeProjectLayerPath = (value: string): boolean => {\n if (value.length === 0) return false;\n if (value.includes('\\0')) return false;\n if (value.includes('\\\\')) return false;\n if (value.startsWith('/')) return false;\n if (/^[A-Za-z]:/.test(value)) return false;\n\n const segments = value.split('/');\n return segments.every((segment) => segment.length > 0 && segment !== '.' && segment !== '..');\n};\n\nconst ProjectLayerPathSchema = z\n .string()\n .min(1)\n .refine(isSafeProjectLayerPath, 'path must be a safe project-relative path');\n\nexport const ProjectLayerFrontmatterSchema = z\n .object({\n status: ProjectLayerDocumentStatusSchema,\n layer: z.string().min(1),\n owner: z.string().min(1),\n read_when: z.array(z.string().min(1)).min(1),\n update_when: z.array(z.string().min(1)).min(1),\n })\n .strict();\n\nexport const ProjectLayerManagedFileSchema = z\n .object({\n path: ProjectLayerPathSchema,\n sourceHash: ShortHashSchema,\n })\n .strict();\n\nexport const ProjectLayerProjectFileSchema = z\n .object({\n path: ProjectLayerPathSchema,\n templateHash: ShortHashSchema,\n created: z.boolean(),\n })\n .strict();\n\nexport const ProjectLayerPackFileRecordSchema = z\n .object({\n path: ProjectLayerPathSchema,\n sourceHash: ShortHashSchema,\n })\n .strict();\n\nexport const ProjectLayerPackRecordSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n sourceHash: ShortHashSchema,\n documents: z.array(ProjectLayerPackFileRecordSchema),\n files: z.array(ProjectLayerPackFileRecordSchema),\n installedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport const ProjectLayerManifestSchema = z\n .object({\n schemaVersion: z.literal(1),\n kind: z.literal('project-operating-layer'),\n tools: z.array(ProjectLayerToolSchema).min(1),\n managed_files: z.array(ProjectLayerManagedFileSchema),\n project_files: z.array(ProjectLayerProjectFileSchema),\n packs: z.array(ProjectLayerPackRecordSchema).default([]),\n settings: z.record(z.unknown()),\n sourceHash: ShortHashSchema,\n cliVersion: z.string().min(1),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport const ProjectLayerContextDocumentSchema = ProjectLayerFrontmatterSchema.extend({\n path: ProjectLayerPathSchema,\n contentHash: ShortHashSchema,\n}).strict();\n\nexport const ProjectLayerContextIndexSchema = z\n .object({\n schemaVersion: z.literal(1),\n kind: z.literal('context-layer-index'),\n documents: z.array(ProjectLayerContextDocumentSchema),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type ProjectLayerTool = z.infer<typeof ProjectLayerToolSchema>;\nexport type ProjectLayerDocumentStatus = z.infer<typeof ProjectLayerDocumentStatusSchema>;\nexport type ProjectLayerFrontmatter = z.infer<typeof ProjectLayerFrontmatterSchema>;\nexport type ProjectLayerManagedFile = z.infer<typeof ProjectLayerManagedFileSchema>;\nexport type ProjectLayerProjectFile = z.infer<typeof ProjectLayerProjectFileSchema>;\nexport type ProjectLayerPackFileRecord = z.infer<typeof ProjectLayerPackFileRecordSchema>;\nexport type ProjectLayerPackRecord = z.infer<typeof ProjectLayerPackRecordSchema>;\nexport type ProjectLayerManifest = z.infer<typeof ProjectLayerManifestSchema>;\nexport type ProjectLayerContextDocument = z.infer<typeof ProjectLayerContextDocumentSchema>;\nexport type ProjectLayerContextIndex = z.infer<typeof ProjectLayerContextIndexSchema>;\n","import { join } from 'node:path';\nimport type { ToolId } from './tool-output.js';\n\nconst SUBAGENT_TOOL_OUTPUTS: Readonly<Record<ToolId, { dir: string; extension: string }>> = {\n 'claude-code': {\n dir: '.claude/agents',\n extension: '.md',\n },\n codex: {\n dir: '.codex/agents',\n extension: '.toml',\n },\n gemini: {\n dir: '.gemini/agents',\n extension: '.md',\n },\n} as const;\n\nexport const buildSubagentRelativePath = (subagentId: string, toolId: ToolId): string => {\n const output = SUBAGENT_TOOL_OUTPUTS[toolId];\n return join(output.dir, `${subagentId}${output.extension}`);\n};\n","import { z } from 'zod';\nimport { SkillToolSchema } from './skill.schema.js';\nimport { SubagentIdSchema } from './subagent.schema.js';\n\nconst SubagentCatalogPathSchema = z\n .string()\n .regex(\n /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*)*$/,\n 'source_path must be relative kebab-case path',\n );\n\nexport const SubagentCatalogEntrySchema = z\n .object({\n id: SubagentIdSchema,\n supported_tools: z.array(SkillToolSchema).min(1),\n source_path: SubagentCatalogPathSchema,\n })\n .strict();\n\nexport const SubagentCatalogSchema = z\n .object({\n subagents: z.array(SubagentCatalogEntrySchema),\n })\n .strict();\n\nexport type SubagentCatalogEntry = z.infer<typeof SubagentCatalogEntrySchema>;\nexport type SubagentCatalog = z.infer<typeof SubagentCatalogSchema>;\n","import { z } from 'zod';\nimport { InstalledSubagentSchema } from './subagent.schema.js';\n\nexport const SubagentManifestSchema = z\n .object({\n subagents: z.array(InstalledSubagentSchema),\n cliVersion: z.string().optional(),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type SubagentManifest = z.infer<typeof SubagentManifestSchema>;\n","import { z } from 'zod';\n\nconst PackIdSchema = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case');\nconst PackSourcePathSchema = z\n .string()\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*)*$/, 'source_path must be relative kebab-case path');\n\nexport const PackCatalogEntrySchema = z\n .object({\n id: PackIdSchema,\n source_path: PackSourcePathSchema,\n })\n .strict();\n\nexport const PackCatalogSchema = z\n .object({\n packs: z.array(PackCatalogEntrySchema),\n })\n .strict();\n\nexport type PackCatalogEntry = z.infer<typeof PackCatalogEntrySchema>;\nexport type PackCatalog = z.infer<typeof PackCatalogSchema>;\n","/**\n * Manifest = 설치 추적 메타데이터. CLI가 이전 설치 상태를 기억하기 위한 JSON.\n */\nimport { z } from 'zod';\nimport { InstalledSkillSchema } from './skill.schema.js';\n\nexport const SCOPES = {\n PROJECT: 'project',\n} as const;\n\n/** init/update 시 선택된 settings 항목 추적 */\nconst SettingsConfigSchema = z\n .object({\n claude: z.array(z.string().min(1)).optional(),\n gemini: z.array(z.string().min(1)).optional(),\n prettierignore: z.boolean().optional(),\n })\n .strict();\n\nexport type SettingsConfig = z.infer<typeof SettingsConfigSchema>;\n\n/** 모노레포 워크스페이스별 preset + rules 추적 */\nconst WorkspaceEntrySchema = z\n .object({\n preset: z.string().min(1),\n rules: z.array(z.string().min(1)),\n })\n .strict();\n\nexport type WorkspaceEntry = z.infer<typeof WorkspaceEntrySchema>;\n\nexport const ManifestSchema = z\n .object({\n tools: z.array(z.string().min(1)).min(1),\n scope: z.literal('project'),\n /** 비모노레포 단일 preset */\n preset: z.string().min(1).optional(),\n /** 모노레포: workspace path → { preset, rules } */\n workspaces: z.record(z.string(), WorkspaceEntrySchema).optional(),\n installed_rules: z.array(z.string().min(1)),\n /** 실제 디스크에 쓰여진 파일 상대 경로 목록 (uninstall용). 기존 manifest 호환성 위해 optional */\n installed_files: z.array(z.string().min(1)).optional(),\n /** skill 설치 루트 디렉토리 목록 */\n installed_skills: z.array(InstalledSkillSchema).optional(),\n /** non-managed 파일에 섹션을 append한 경우 추적 (uninstall 시 섹션만 제거) */\n appended_files: z.array(z.string().min(1)).optional(),\n /** init 시 선택된 settings 항목 — update 시 재생성에 사용 */\n settings: SettingsConfigSchema.optional(),\n /** init/update 실행 시점의 CLI 패키지 버전 — 버전 변경 감지에 사용 */\n cliVersion: z.string().optional(),\n /** SSOT 데이터 파일들의 deterministic SHA-256 해시 (6자리 hex). diff/update 판단 기준 */\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n","import { readFileSync, readdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { parse } from 'yaml';\nimport { parseMarkdownFrontmatter } from './frontmatter.js';\nimport { parseFlatToml } from './subagent-toml.js';\nimport {\n CodexSubagentFrontmatterSchema,\n RuleSchema,\n PresetSchema,\n SkillCatalogSchema,\n SkillFrontmatterSchema,\n SubagentCatalogSchema,\n SubagentMarkdownFrontmatterSchema,\n} from './schemas/index.js';\nimport type { Rule, Preset, Skill, SkillCatalog, Subagent, SubagentCatalog } from './schemas/index.js';\n\n// priority 내림차순 정렬 (높을수록 상단 → U-shaped attention)\nexport const sortRulesByPriority = (rules: readonly Rule[]): Rule[] =>\n [...rules].sort((a, b) => b.priority - a.priority);\n\nconst deduplicateRulesById = (rules: readonly Rule[]): Rule[] => {\n const seen = new Set<string>();\n return rules.filter((rule) => {\n if (seen.has(rule.id)) return false;\n seen.add(rule.id);\n return true;\n });\n};\n\nconst resolveRuleById = (ruleId: string, allRules: readonly Rule[], context?: string): Rule => {\n const found = allRules.find((rule) => rule.id === ruleId);\n if (!found) {\n const suffix = context ? ` (from ${context})` : '';\n throw new Error(`Rule not found: ${ruleId}${suffix}`);\n }\n return found;\n};\n\n// presets.yaml의 Record<id, {description, rules}> → Preset[] 변환\nexport const parseRawPresets = (raw: Record<string, { description: string; rules: string[] }>): Preset[] =>\n Object.entries(raw).map(([id, value]) => PresetSchema.parse({ id, ...value }));\n\n// preset.rules 목록을 실제 core rule로 해석 + priority 정렬, 누락 시 throw\nexport const resolvePresetRules = (preset: Preset, allRules: readonly Rule[]): Rule[] => {\n const resolved = preset.rules.map((ruleId) => resolveRuleById(ruleId, allRules, preset.id));\n return sortRulesByPriority(deduplicateRulesById(resolved));\n};\n\nexport const resolvePresetSkills = (preset: Preset, allSkills: readonly Skill[]): Skill[] => {\n return allSkills\n .filter((skill) => skill.included_in_presets.includes(preset.id))\n .sort((a, b) => a.id.localeCompare(b.id));\n};\n\nexport const loadRuleFile = (filePath: string): Rule => {\n const raw = readFileSync(filePath, 'utf-8');\n return RuleSchema.parse(parse(raw));\n};\n\nconst loadSkillDirectoryFiles = (skillDir: string): Skill['files'] => {\n const files: Skill['files'] = [];\n\n const walk = (relativeDir = ''): void => {\n const absDir = relativeDir.length > 0 ? join(skillDir, relativeDir) : skillDir;\n const entries = readdirSync(absDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const nextRelativePath = relativeDir.length > 0 ? join(relativeDir, entry.name) : entry.name;\n if (entry.isDirectory()) {\n walk(nextRelativePath);\n continue;\n }\n\n files.push({\n path: nextRelativePath,\n content: readFileSync(join(skillDir, nextRelativePath), 'utf-8'),\n });\n }\n };\n\n walk();\n return files;\n};\n\n// readdirSync + .yaml 필터 + 파일명 sort(결정적 로딩) → priority 내림차순\nexport const loadAllRules = (rulesDir: string): Rule[] => {\n const files = readdirSync(rulesDir)\n .filter((f) => f.endsWith('.yaml'))\n .sort();\n const rules = files.map((f) => loadRuleFile(resolve(rulesDir, f)));\n return sortRulesByPriority(rules);\n};\n\nexport const loadSkillCatalog = (skillsDir: string): SkillCatalog =>\n SkillCatalogSchema.parse(JSON.parse(readFileSync(resolve(skillsDir, 'skill-registry.json'), 'utf-8')));\n\nexport const loadAllSkills = (skillsDir: string): Skill[] => {\n const catalog = loadSkillCatalog(skillsDir);\n const entries = [...catalog.skills].sort((a, b) => a.id.localeCompare(b.id));\n\n return entries.map((entry) => {\n const directory = resolve(skillsDir, entry.source_path);\n const skillMdPath = join(directory, 'SKILL.md');\n const rawSkillMd = readFileSync(skillMdPath, 'utf-8');\n const { frontmatter } = parseMarkdownFrontmatter(rawSkillMd);\n const parsed = SkillFrontmatterSchema.parse(frontmatter);\n if (parsed.name !== entry.id) {\n throw new Error(`Skill directory and frontmatter name mismatch: ${entry.id} != ${parsed.name}`);\n }\n\n const files = loadSkillDirectoryFiles(directory);\n if (entry.kind === 'reference' && !files.some((file) => file.path === 'references/reference.md')) {\n throw new Error(`Reference skill must include references/reference.md: ${parsed.name}`);\n }\n\n return {\n id: entry.id,\n kind: entry.kind,\n description: parsed.description,\n supported_tools: [...entry.supported_tools],\n groups: [...entry.groups],\n included_in_presets: [...entry.included_in_presets],\n directory,\n files,\n };\n });\n};\n\nconst readRequiredTextFile = (filePath: string): string => {\n try {\n return readFileSync(filePath, 'utf-8');\n } catch (error) {\n const cause = error instanceof Error ? `: ${error.message}` : '';\n throw new Error(`Required subagent source file is missing: ${filePath}${cause}`);\n }\n};\n\nconst assertSubagentFrontmatterName = (params: { id: string; tool: string; name: string }): void => {\n if (params.name !== params.id) {\n throw new Error(`Subagent ${params.tool} frontmatter name mismatch: ${params.id} != ${params.name}`);\n }\n};\n\nexport const loadSubagentCatalog = (subagentsDir: string): SubagentCatalog =>\n SubagentCatalogSchema.parse(JSON.parse(readFileSync(resolve(subagentsDir, 'subagent-registry.json'), 'utf-8')));\n\nexport const loadAllSubagents = (subagentsDir: string): Subagent[] => {\n const catalog = loadSubagentCatalog(subagentsDir);\n const entries = [...catalog.subagents].sort((a, b) => a.id.localeCompare(b.id));\n\n return entries.map((entry) => {\n const directory = resolve(subagentsDir, entry.source_path);\n const prompt = readRequiredTextFile(join(directory, 'PROMPT.md'));\n const claudeRaw = readRequiredTextFile(join(directory, 'claude.frontmatter.yaml'));\n const codexRaw = readRequiredTextFile(join(directory, 'codex.frontmatter.toml'));\n const geminiRaw = readRequiredTextFile(join(directory, 'gemini.frontmatter.yaml'));\n const claude = SubagentMarkdownFrontmatterSchema.parse(parse(claudeRaw));\n const codex = CodexSubagentFrontmatterSchema.parse(parseFlatToml(codexRaw));\n const gemini = SubagentMarkdownFrontmatterSchema.parse(parse(geminiRaw));\n\n assertSubagentFrontmatterName({ id: entry.id, tool: 'claude', name: claude.name });\n assertSubagentFrontmatterName({ id: entry.id, tool: 'codex', name: codex.name });\n assertSubagentFrontmatterName({ id: entry.id, tool: 'gemini', name: gemini.name });\n\n return {\n id: entry.id,\n supported_tools: [...entry.supported_tools],\n source_path: entry.source_path,\n directory,\n prompt,\n frontmatter: {\n claude: {\n raw: claudeRaw,\n parsed: claude,\n },\n codex: {\n raw: codexRaw,\n parsed: codex,\n },\n gemini: {\n raw: geminiRaw,\n parsed: gemini,\n },\n },\n };\n });\n};\n\nexport const loadPresets = (presetsPath: string): Preset[] => {\n const raw = readFileSync(presetsPath, 'utf-8');\n const data = parse(raw) as Record<string, { description: string; rules: string[] }>;\n return parseRawPresets(data);\n};\n","import { parse } from 'yaml';\n\nexport const parseMarkdownFrontmatter = (content: string): { frontmatter: unknown; body: string } => {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n?/);\n if (!match) {\n throw new Error('Missing YAML frontmatter');\n }\n\n return {\n frontmatter: parse(match[1]),\n body: content.slice(match[0].length),\n };\n};\n","type TomlPrimitive = string | number | boolean | string[];\n\nconst parseTomlValue = (value: string): TomlPrimitive => {\n const trimmed = value.trim();\n\n if (trimmed.startsWith('\"') || trimmed.startsWith('[')) {\n const parsed = JSON.parse(trimmed) as unknown;\n if (typeof parsed === 'string') {\n return parsed;\n }\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === 'string')) {\n return parsed;\n }\n throw new Error(`Unsupported TOML value: ${value}`);\n }\n\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n\n const numericValue = Number(trimmed);\n if (Number.isFinite(numericValue)) {\n return numericValue;\n }\n\n throw new Error(`Unsupported TOML value: ${value}`);\n};\n\nexport const parseFlatToml = (content: string): Record<string, TomlPrimitive> => {\n const result: Record<string, TomlPrimitive> = {};\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0 || trimmed.startsWith('#')) {\n continue;\n }\n\n const match = trimmed.match(/^([A-Za-z0-9_-]+)\\s*=\\s*(.+)$/);\n if (!match) {\n throw new Error(`Unsupported TOML line: ${line}`);\n }\n\n const [, key, value] = match;\n result[key] = parseTomlValue(value);\n }\n\n return result;\n};\n\nconst renderTomlValue = (value: TomlPrimitive): string => {\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return `[${value.map((item) => JSON.stringify(item)).join(', ')}]`;\n};\n\nexport const renderFlatToml = (entries: readonly [string, TomlPrimitive][]): string =>\n entries.map(([key, value]) => `${key} = ${renderTomlValue(value)}`).join('\\n');\n","import { join } from 'node:path';\nimport type { Rule, DecisionTableEntry } from './schemas/index.js';\nimport { GLOBAL_CATEGORIES, CLAUDE_CODE_PATH_GLOBS, TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { ToolId } from './tool-output.js';\n\n// \"react-typescript\" → \"React Typescript\"\nexport const ruleIdToTitle = (id: string): string =>\n id\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n\n// DecisionTableEntry[] → Markdown 테이블 (pipe 문자 &#124; escape)\nexport const renderDecisionTable = (entries: readonly DecisionTableEntry[]): string => {\n const escape = (s: string) => s.replace(/\\|/g, '&#124;');\n const hasAvoid = entries.some((e) => e.avoid !== undefined);\n\n const header = hasAvoid ? '| When | Then | Avoid |\\n|------|------|-------|' : '| When | Then |\\n|------|------|';\n\n const rows = entries.map((e) => {\n const when = escape(e.when);\n const then = escape(e.then);\n if (hasAvoid) {\n const avoid = e.avoid ? escape(e.avoid) : '';\n return `| ${when} | ${then} | ${avoid} |`;\n }\n return `| ${when} | ${then} |`;\n });\n\n return [header, ...rows].join('\\n');\n};\n\n// 단일 Rule → Markdown (빈 섹션 생략)\nexport const renderRuleToMarkdown = (rule: Rule): string => {\n const sections: string[] = [`# ${ruleIdToTitle(rule.id)}`];\n\n if (rule.content.constraints.length > 0) {\n sections.push('## Constraints');\n sections.push(rule.content.constraints.map((c) => `- ${c}`).join('\\n'));\n }\n\n if (rule.content.guidelines.length > 0) {\n sections.push('## Guidelines');\n sections.push(rule.content.guidelines.map((g) => `- ${g}`).join('\\n'));\n }\n\n if (rule.content.decision_table && rule.content.decision_table.length > 0) {\n sections.push('## Decision Table');\n sections.push(renderDecisionTable(rule.content.decision_table));\n }\n\n return sections.join('\\n\\n');\n};\n\n// Rule[] → 단일 Markdown (--- separator, single-file 모드용)\nexport const renderRulesToMarkdown = (rules: readonly Rule[]): string =>\n rules.map((rule) => renderRuleToMarkdown(rule)).join('\\n\\n---\\n\\n');\n\n// Rule이 global 카테고리에 속하는지 판별\nexport const isGlobalRule = (rule: Rule): boolean => (GLOBAL_CATEGORIES as readonly string[]).includes(rule.category);\n\n// Rule[] → { global, domain } 분리\nexport const partitionRules = (rules: readonly Rule[]): { global: Rule[]; domain: Rule[] } => {\n const global: Rule[] = [];\n const domain: Rule[] = [];\n for (const rule of rules) {\n if (isGlobalRule(rule)) {\n global.push(rule);\n } else {\n domain.push(rule);\n }\n }\n return { global, domain };\n};\n\n// glob 배열 → YAML frontmatter 블록\nexport const renderFrontmatter = (paths: readonly string[]): string => {\n const lines = paths.map((p) => ` - \"${p}\"`).join('\\n');\n return `---\\npaths:\\n${lines}\\n---`;\n};\n\nexport type WorkspaceMapping = {\n path: string;\n ruleIds: readonly string[];\n};\n\n// 단일 Rule → Claude Code용 Markdown\n// domain 룰이면서 glob 매핑이 있으면 paths: frontmatter 추가 (단일 프로젝트 전용)\n// global 룰 또는 매핑 없는 domain 룰 → frontmatter 없음\nexport const renderClaudeCodeRule = (rule: Rule): string => {\n const globs = CLAUDE_CODE_PATH_GLOBS[rule.id];\n if (!isGlobalRule(rule) && globs !== undefined) {\n return `${renderFrontmatter(globs)}\\n\\n${renderRuleToMarkdown(rule)}`;\n }\n return renderRuleToMarkdown(rule);\n};\n\n// 도구별 렌더링 결과 타입 (tagged union)\nexport type ClaudeCodeRenderResult = {\n tool: 'claude-code';\n files: { relativePath: string; content: string }[];\n};\n\nexport type CodexRenderResult = {\n tool: 'codex';\n rootContent: string;\n domainFiles: { workspacePath: string; content: string }[];\n};\n\nexport type GeminiRenderResult = {\n tool: 'gemini';\n rootContent: string;\n domainFiles: { workspacePath: string; content: string }[];\n};\n\nexport type ToolRenderResult = ClaudeCodeRenderResult | CodexRenderResult | GeminiRenderResult;\n\n// CLI 진입점: toolId + rules → 도구별 렌더링 결과\nexport const renderForTool = (\n toolId: ToolId,\n rules: readonly Rule[],\n workspaceMappings?: readonly WorkspaceMapping[],\n): ToolRenderResult => {\n const config = TOOL_OUTPUT_MAP[toolId];\n\n if (toolId === 'claude-code') {\n const { rulesDir, fileExtension } = config as (typeof TOOL_OUTPUT_MAP)['claude-code'];\n\n if (!workspaceMappings || workspaceMappings.length === 0) {\n // 단일 프로젝트: domain 룰에 paths: frontmatter (path-scoped)\n const files = rules.map((rule) => ({\n relativePath: join(rulesDir, `${rule.id}${fileExtension}`),\n content: renderClaudeCodeRule(rule),\n }));\n return { tool: 'claude-code', files };\n }\n\n // 모노레포: global → .claude/rules/, domain → {workspace}/CLAUDE.md (진짜 지연 로딩)\n const { global, domain } = partitionRules(rules);\n\n const globalFiles = global.map((rule) => ({\n relativePath: join(rulesDir, `${rule.id}${fileExtension}`),\n content: renderRuleToMarkdown(rule), // global은 frontmatter 불필요\n }));\n\n const workspaceFiles: { relativePath: string; content: string }[] = [];\n for (const ws of workspaceMappings) {\n const wsRules = domain.filter((r) => ws.ruleIds.includes(r.id));\n if (wsRules.length === 0) continue;\n workspaceFiles.push({\n relativePath: join(ws.path, 'CLAUDE.md'),\n content: renderRulesToMarkdown(wsRules),\n });\n }\n\n return { tool: 'claude-code', files: [...globalFiles, ...workspaceFiles] };\n }\n\n if (!workspaceMappings || workspaceMappings.length === 0) {\n // 단일 프로젝트: 모든 룰(global + domain)을 rootContent 하나로 합침\n const rootContent = renderRulesToMarkdown(rules);\n const domainFiles: { workspacePath: string; content: string }[] = [];\n\n if (toolId === 'codex') return { tool: 'codex', rootContent, domainFiles };\n return { tool: 'gemini', rootContent, domainFiles };\n }\n\n // 모노레포: global → rootContent, domain → workspace별 파일\n const { global, domain } = partitionRules(rules);\n const rootContent = renderRulesToMarkdown(global);\n const domainFiles: { workspacePath: string; content: string }[] = [];\n for (const ws of workspaceMappings) {\n const wsRules = domain.filter((r) => ws.ruleIds.includes(r.id));\n if (wsRules.length === 0) continue;\n domainFiles.push({\n workspacePath: ws.path,\n content: renderRulesToMarkdown(wsRules),\n });\n }\n\n if (toolId === 'codex') {\n return { tool: 'codex', rootContent, domainFiles };\n }\n\n // gemini\n return { tool: 'gemini', rootContent, domainFiles };\n};\n","import { join } from 'node:path';\nimport { computeInstalledSkillHash } from './source-hash.js';\nimport type { Skill, InstalledSkill } from './schemas/index.js';\nimport type { ToolId } from './tool-output.js';\n\nconst AGENT_SKILLS_DIR = '.agents/skills';\nconst CLAUDE_SKILLS_DIR = '.claude/skills';\n\ntype SkillPackageFile = {\n relativePath: string;\n content: string;\n};\n\nexport type SkillPackage = {\n skillId: string;\n rootDir: string;\n files: SkillPackageFile[];\n};\n\nconst buildRootDirs = (skillId: string, toolIds: readonly ToolId[]): string[] => {\n const dirs: string[] = [];\n if (toolIds.some((toolId) => toolId === 'codex' || toolId === 'gemini')) {\n dirs.push(join(AGENT_SKILLS_DIR, skillId));\n }\n if (toolIds.includes('claude-code')) {\n dirs.push(join(CLAUDE_SKILLS_DIR, skillId));\n }\n return dirs;\n};\n\nconst normalizeSelectedTools = (skill: Skill, requestedTools: readonly ToolId[]): ToolId[] => {\n const supportedToolSet = new Set(skill.supported_tools);\n return requestedTools.filter((toolId) => supportedToolSet.has(toolId));\n};\n\nexport const buildSkillInstallPlan = (params: {\n skill: Skill;\n requestedTools: readonly ToolId[];\n}): { packages: SkillPackage[]; installedSkill: InstalledSkill } => {\n const selectedTools = normalizeSelectedTools(params.skill, params.requestedTools);\n if (selectedTools.length === 0) {\n throw new Error(`Skill ${params.skill.id} does not support the requested tools`);\n }\n\n const rootDirs = buildRootDirs(params.skill.id, selectedTools);\n const skillHash = computeInstalledSkillHash({\n kind: params.skill.kind,\n description: params.skill.description,\n tools: selectedTools,\n files: params.skill.files.map((file) => `${file.path}:${file.content}`),\n });\n\n const packages = rootDirs.map((rootDir) => {\n const files: SkillPackageFile[] = params.skill.files.map((file) => ({\n relativePath: join(rootDir, file.path),\n content: file.content,\n }));\n\n return {\n skillId: params.skill.id,\n rootDir,\n files,\n };\n });\n\n return {\n packages,\n installedSkill: {\n id: params.skill.id,\n kind: params.skill.kind,\n tools: selectedTools,\n installed_paths: rootDirs,\n sourceHash: skillHash,\n },\n };\n};\n","import { createHash } from 'node:crypto';\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ManifestSchema } from './schemas/index.js';\nimport type { Manifest, InstalledSkill } from './schemas/index.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n// dist/bin/index.js(bundle) 기준: ../../package.json = apps/cli/package.json\nexport const getCliVersion = (): string => {\n try {\n const pkgPath = resolve(__dirname, '..', '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { version: string };\n return pkg.version;\n } catch {\n return 'unknown';\n }\n};\n\n// 문자열 배열 → SHA-256 → 6-hex (caller가 정렬 책임)\nexport const computeHash = (contents: readonly string[]): string =>\n createHash('sha256').update(contents.join('')).digest('hex').slice(0, 6);\n\nconst loadSortedFileContents = (dirPath: string): string[] => {\n const files = readdirSync(dirPath)\n .filter((f) => f.endsWith('.yaml'))\n .sort();\n\n return files.map((f) => readFileSync(resolve(dirPath, f), 'utf-8'));\n};\n\nconst loadDirectoryContents = (baseDir: string): string[] => {\n const contents: string[] = [];\n\n const walk = (relativeDir = ''): void => {\n const absDir = relativeDir.length > 0 ? join(baseDir, relativeDir) : baseDir;\n const entries = readdirSync(absDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const nextRelativePath = relativeDir.length > 0 ? join(relativeDir, entry.name) : entry.name;\n if (entry.isDirectory()) {\n walk(nextRelativePath);\n continue;\n }\n contents.push(`${nextRelativePath}:${readFileSync(join(baseDir, nextRelativePath), 'utf-8')}`);\n }\n };\n\n walk();\n return contents;\n};\n\nconst loadSkillTreeContents = (skillsDir: string): string[] => {\n const contents: string[] = [];\n const registryPath = resolve(skillsDir, 'skill-registry.json');\n\n if (existsSync(registryPath)) {\n contents.push(`skill-registry.json:${readFileSync(registryPath, 'utf-8')}`);\n }\n\n for (const directoryName of ['reference-skills', 'task-skills']) {\n const directoryPath = resolve(skillsDir, directoryName);\n if (!existsSync(directoryPath)) {\n continue;\n }\n\n const directoryContents = loadDirectoryContents(directoryPath).map((content) => `${directoryName}/${content}`);\n contents.push(...directoryContents);\n }\n\n return contents;\n};\n\n// compiler data 전체(rules, skills, presets) 해시\nexport const computeSourceHash = (dataDir: string): string => {\n const ruleContents = loadSortedFileContents(resolve(dataDir, 'rules'));\n const skillContents = loadSkillTreeContents(resolve(dataDir, 'skills'));\n const presetsContent = readFileSync(resolve(dataDir, 'presets.yaml'), 'utf-8');\n return computeHash([...ruleContents, ...skillContents, presetsContent]);\n};\n\nexport const computeInstalledSkillHash = (params: {\n kind: InstalledSkill['kind'];\n description: string;\n tools: readonly string[];\n files: readonly string[];\n}): string => computeHash([params.kind, params.description, ...[...params.tools].sort(), ...[...params.files].sort()]);\n\nexport const computeInstalledSubagentHash = (params: {\n id: string;\n tools: readonly string[];\n prompt: string;\n metadataFiles: readonly string[];\n}): string => computeHash([params.id, params.prompt, ...[...params.tools].sort(), ...[...params.metadataFiles].sort()]);\n\n// Manifest Builder (Pure, 단 generatedAt에 현재 시각 사용)\nexport const buildManifest = (params: {\n tools: readonly string[];\n scope: 'project';\n preset?: string;\n workspaces?: Record<string, { preset: string; rules: string[] }>;\n installedRules: readonly string[];\n installedFiles?: readonly string[];\n installedSkills?: readonly InstalledSkill[];\n appendedFiles?: readonly string[];\n settings?: { claude?: readonly string[]; gemini?: readonly string[]; prettierignore?: boolean };\n cliVersion?: string;\n sourceHash: string;\n}): Manifest =>\n ManifestSchema.parse({\n tools: [...params.tools],\n scope: params.scope,\n preset: params.preset,\n workspaces: params.workspaces,\n installed_rules: [...params.installedRules],\n installed_files: params.installedFiles ? [...params.installedFiles] : undefined,\n installed_skills: params.installedSkills ? [...params.installedSkills] : undefined,\n appended_files: params.appendedFiles && params.appendedFiles.length > 0 ? [...params.appendedFiles] : undefined,\n settings: params.settings\n ? {\n claude: params.settings.claude ? [...params.settings.claude] : undefined,\n gemini: params.settings.gemini ? [...params.settings.gemini] : undefined,\n prettierignore: params.settings.prettierignore,\n }\n : undefined,\n cliVersion: params.cliVersion,\n sourceHash: params.sourceHash,\n generatedAt: new Date().toISOString(),\n });\n","import { resolve } from 'node:path';\nimport { computeInstalledSubagentHash } from './source-hash.js';\nimport { buildSubagentRelativePath } from './subagent-paths.js';\nimport { renderFlatToml } from './subagent-toml.js';\nimport type { CodexSubagentFrontmatter, InstalledSubagent, Subagent } from './schemas/index.js';\nimport type { ToolId } from './tool-output.js';\n\ntype SubagentPackageFile = {\n relativePath: string;\n content: string;\n};\n\nexport type SubagentPackage = {\n subagentId: string;\n files: SubagentPackageFile[];\n};\n\nexport type RequiredSubagentSkill = {\n tool: ToolId;\n skillName: string;\n path: string;\n};\n\nconst normalizeSelectedTools = (subagent: Subagent, requestedTools: readonly ToolId[]): ToolId[] => {\n const supportedToolSet = new Set(subagent.supported_tools);\n return requestedTools.filter((toolId) => supportedToolSet.has(toolId));\n};\n\nconst renderMarkdownSubagent = (params: { rawFrontmatter: string; prompt: string }): string =>\n `---\\n${params.rawFrontmatter.trimEnd()}\\n---\\n\\n${params.prompt.trimEnd()}\\n`;\n\nconst getCodexTomlEntries = (frontmatter: CodexSubagentFrontmatter): [string, string | number | boolean | string[]][] =>\n Object.entries(frontmatter).filter(\n (entry): entry is [string, string | number | boolean | string[]] =>\n entry[0] !== 'skill_names' &&\n (typeof entry[1] === 'string' ||\n typeof entry[1] === 'number' ||\n typeof entry[1] === 'boolean' ||\n (Array.isArray(entry[1]) && entry[1].every((item) => typeof item === 'string'))),\n );\n\nconst renderCodexSubagent = (params: {\n frontmatter: CodexSubagentFrontmatter;\n prompt: string;\n userBasePath: string;\n}): string => {\n const metadata = renderFlatToml(getCodexTomlEntries(params.frontmatter));\n const skills = (params.frontmatter.skill_names ?? []).map((skillName) => {\n const skillPath = resolve(params.userBasePath, '.agents', 'skills', skillName, 'SKILL.md');\n return `[[skills.config]]\\npath = ${JSON.stringify(skillPath)}\\nenabled = true`;\n });\n const sections = [\n metadata,\n `developer_instructions = ${JSON.stringify(params.prompt.trimEnd())}`,\n ...skills,\n ].filter((section) => section.length > 0);\n\n return sections.join('\\n\\n') + '\\n';\n};\n\nconst renderSubagentForTool = (params: { subagent: Subagent; toolId: ToolId; userBasePath: string }): string => {\n if (params.toolId === 'claude-code') {\n return renderMarkdownSubagent({\n rawFrontmatter: params.subagent.frontmatter.claude.raw,\n prompt: params.subagent.prompt,\n });\n }\n\n if (params.toolId === 'gemini') {\n return renderMarkdownSubagent({\n rawFrontmatter: params.subagent.frontmatter.gemini.raw,\n prompt: params.subagent.prompt,\n });\n }\n\n return renderCodexSubagent({\n frontmatter: params.subagent.frontmatter.codex.parsed,\n prompt: params.subagent.prompt,\n userBasePath: params.userBasePath,\n });\n};\n\nconst getSelectedMetadataFiles = (subagent: Subagent, selectedTools: readonly ToolId[]): string[] =>\n selectedTools.map((toolId) => {\n if (toolId === 'claude-code') return `claude:${subagent.frontmatter.claude.raw}`;\n if (toolId === 'gemini') return `gemini:${subagent.frontmatter.gemini.raw}`;\n return `codex:${subagent.frontmatter.codex.raw}`;\n });\n\nconst getStringArray = (value: unknown): string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter((item): item is string => typeof item === 'string');\n};\n\nconst buildRequiredSubagentSkills = (params: {\n subagent: Subagent;\n selectedTools: readonly ToolId[];\n userBasePath: string;\n}): RequiredSubagentSkill[] => {\n const required: RequiredSubagentSkill[] = [];\n\n if (params.selectedTools.includes('codex')) {\n for (const skillName of params.subagent.frontmatter.codex.parsed.skill_names ?? []) {\n required.push({\n tool: 'codex',\n skillName,\n path: resolve(params.userBasePath, '.agents', 'skills', skillName, 'SKILL.md'),\n });\n }\n }\n\n if (params.selectedTools.includes('claude-code')) {\n for (const skillName of getStringArray(params.subagent.frontmatter.claude.parsed['skills'])) {\n required.push({\n tool: 'claude-code',\n skillName,\n path: resolve(params.userBasePath, '.claude', 'skills', skillName, 'SKILL.md'),\n });\n }\n }\n\n return required;\n};\n\nexport const buildSubagentInstallPlan = (params: {\n subagent: Subagent;\n requestedTools: readonly ToolId[];\n userBasePath: string;\n}): {\n packages: SubagentPackage[];\n installedSubagent: InstalledSubagent;\n requiredSkills: RequiredSubagentSkill[];\n} => {\n const selectedTools = normalizeSelectedTools(params.subagent, params.requestedTools);\n if (selectedTools.length === 0) {\n throw new Error(`Subagent ${params.subagent.id} does not support the requested tools`);\n }\n\n const files = selectedTools.map((toolId) => ({\n relativePath: buildSubagentRelativePath(params.subagent.id, toolId),\n content: renderSubagentForTool({\n subagent: params.subagent,\n toolId,\n userBasePath: params.userBasePath,\n }),\n }));\n const subagentHash = computeInstalledSubagentHash({\n id: params.subagent.id,\n tools: selectedTools,\n prompt: params.subagent.prompt,\n metadataFiles: getSelectedMetadataFiles(params.subagent, selectedTools),\n });\n\n return {\n packages: [\n {\n subagentId: params.subagent.id,\n files,\n },\n ],\n installedSubagent: {\n id: params.subagent.id,\n tools: selectedTools,\n installed_paths: files.map((file) => file.relativePath),\n sourceHash: subagentHash,\n },\n requiredSkills: buildRequiredSubagentSkills({\n subagent: params.subagent,\n selectedTools,\n userBasePath: params.userBasePath,\n }),\n };\n};\n","const MANAGED_MARKER = '<!-- managed by ai-ops -->';\nconst META_PATTERN = /^<!-- sourceHash: ([a-f0-9]{6}) \\| generatedAt: (.+) -->$/;\n\nconst SECTION_START = '<!-- ai-ops:start -->';\nconst SECTION_END = '<!-- ai-ops:end -->';\n\nexport const hasLegacyHeader = (content: string): boolean => content.includes(MANAGED_MARKER);\n\nexport const wrapWithSection = (content: string, meta: { sourceHash: string; generatedAt: string }): string => {\n const metaLine = `<!-- sourceHash: ${meta.sourceHash} | generatedAt: ${meta.generatedAt} -->`;\n return `${SECTION_START}\\n${metaLine}\\n\\n${content}\\n${SECTION_END}`;\n};\n\nexport const hasAiOpsSection = (content: string): boolean =>\n content.includes(SECTION_START) && content.includes(SECTION_END);\n\nexport const stripAiOpsSection = (content: string): string => {\n const startIdx = content.indexOf(SECTION_START);\n const endIdx = content.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return content;\n\n const before = content.slice(0, startIdx).trimEnd();\n const after = content.slice(endIdx + SECTION_END.length).trimStart();\n return before + (after ? '\\n\\n' + after : '') + '\\n';\n};\n\nexport const extractAiOpsSectionContent = (content: string): string | null => {\n const startIdx = content.indexOf(SECTION_START);\n const endIdx = content.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return null;\n\n const section = content.slice(startIdx + SECTION_START.length, endIdx).trim();\n const lines = section.split('\\n');\n const [, ...contentLines] = lines;\n return contentLines.join('\\n').trimStart();\n};\n\nexport const replaceAiOpsSection = (existing: string, newSection: string): string => {\n const startIdx = existing.indexOf(SECTION_START);\n const endIdx = existing.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return existing;\n\n const before = existing.slice(0, startIdx).trimEnd();\n const after = existing.slice(endIdx + SECTION_END.length).trimStart();\n\n // filter(Boolean)으로 빈 before/after 제거 → 불필요한 선행 \\n\\n 방지\n return [before, newSection, after].filter(Boolean).join('\\n\\n') + '\\n';\n};\n\nexport const parseAiOpsMeta = (content: string): { sourceHash: string; generatedAt: string } | null => {\n const startIdx = content.indexOf(SECTION_START);\n if (startIdx === -1) return null;\n\n const lines = content.slice(startIdx).split('\\n');\n // lines[0] = '<!-- ai-ops:start -->', lines[1] = meta line\n const metaLine = lines[1] ?? '';\n const match = META_PATTERN.exec(metaLine);\n if (!match) return null;\n\n return { sourceHash: match[1], generatedAt: match[2] };\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { ManifestSchema } from './schemas/index.js';\nimport type { Manifest } from './schemas/index.js';\n\nexport const MANIFEST_FILENAME = '.ai-ops-manifest.json';\n\n// Pure\nexport const parseManifest = (json: string): Manifest => ManifestSchema.parse(JSON.parse(json));\n\nexport const serializeManifest = (manifest: Manifest): string => JSON.stringify(manifest, null, 2) + '\\n';\n\n// I/O\nexport const resolveManifestPath = (basePath: string): string => join(basePath, MANIFEST_FILENAME);\n\nexport const readManifest = (manifestPath: string): Manifest | null => {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf-8');\n } catch {\n return null;\n }\n return parseManifest(raw);\n};\n\nexport const writeManifest = (manifestPath: string, manifest: Manifest): void => {\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeManifest(manifest), 'utf-8');\n};\n","import type { Manifest, Preset, Rule } from './schemas/index.js';\nimport { resolvePresetRules } from './loader.js';\n\nconst LEGACY_SKILL_ID_MAP = {\n 'engineering-standards-pack': 'backend-service-standards',\n} as const;\n\nexport const resolveCanonicalSkillId = (skillId: string): string =>\n LEGACY_SKILL_ID_MAP[skillId as keyof typeof LEGACY_SKILL_ID_MAP] ?? skillId;\n\nconst resolveRulesFromIds = (ruleIds: readonly string[], allRules: readonly Rule[]): Rule[] => {\n const ruleMap = new Map(allRules.map((rule) => [rule.id, rule]));\n const seen = new Set<string>();\n const resolved = ruleIds.flatMap((ruleId) => {\n const rule = ruleMap.get(ruleId);\n if (!rule || seen.has(rule.id)) {\n return [];\n }\n seen.add(rule.id);\n return [rule];\n });\n\n return [...resolved].sort((a, b) => b.priority - a.priority);\n};\n\nconst resolvePresetById = (presetId: string | undefined, presets: readonly Preset[]): Preset | undefined => {\n if (presetId === undefined) {\n return undefined;\n }\n\n return presets.find((preset) => preset.id === presetId);\n};\n\nexport const resolveManifestRules = (params: {\n manifest: Manifest;\n allRules: readonly Rule[];\n presets: readonly Preset[];\n}): {\n installedRules: Rule[];\n workspaces?: Record<string, { preset: string; rules: string[] }>;\n} => {\n const { manifest, allRules, presets } = params;\n\n if (manifest.workspaces) {\n const resolvedWorkspaces = Object.fromEntries(\n Object.entries(manifest.workspaces).map(([workspacePath, entry]) => {\n const preset = resolvePresetById(entry.preset, presets);\n const rules = preset ? resolvePresetRules(preset, allRules) : resolveRulesFromIds(entry.rules, allRules);\n\n return [\n workspacePath,\n {\n preset: entry.preset,\n rules: rules.map((rule) => rule.id),\n },\n ];\n }),\n );\n\n const installedRules = resolveRulesFromIds(\n Object.values(resolvedWorkspaces).flatMap((entry) => entry.rules),\n allRules,\n );\n\n return {\n installedRules,\n workspaces: resolvedWorkspaces,\n };\n }\n\n const preset = resolvePresetById(manifest.preset, presets);\n const installedRules = preset\n ? resolvePresetRules(preset, allRules)\n : resolveRulesFromIds(manifest.installed_rules, allRules);\n\n return {\n installedRules,\n };\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { SkillRegistrySchema } from './schemas/index.js';\nimport type { SkillRegistry } from './schemas/index.js';\n\nexport const SKILL_REGISTRY_FILENAME = 'skills-manifest.json';\n\nexport const parseSkillRegistry = (json: string): SkillRegistry => SkillRegistrySchema.parse(JSON.parse(json));\n\nexport const serializeSkillRegistry = (registry: SkillRegistry): string => JSON.stringify(registry, null, 2) + '\\n';\n\nexport const resolveSkillRegistryPath = (userBasePath: string): string =>\n join(userBasePath, '.ai-ops', SKILL_REGISTRY_FILENAME);\n\nexport const readSkillRegistry = (registryPath: string): SkillRegistry | null => {\n let raw: string;\n try {\n raw = readFileSync(registryPath, 'utf-8');\n } catch {\n return null;\n }\n\n return parseSkillRegistry(raw);\n};\n\nexport const writeSkillRegistry = (registryPath: string, registry: SkillRegistry): void => {\n mkdirSync(dirname(registryPath), { recursive: true });\n writeFileSync(registryPath, serializeSkillRegistry(registry), 'utf-8');\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { SubagentManifestSchema } from './schemas/index.js';\nimport type { SubagentManifest } from './schemas/index.js';\n\nexport const SUBAGENT_MANIFEST_FILENAME = 'subagents-manifest.json';\n\nexport const parseSubagentManifest = (json: string): SubagentManifest =>\n SubagentManifestSchema.parse(JSON.parse(json));\n\nexport const serializeSubagentManifest = (manifest: SubagentManifest): string => JSON.stringify(manifest, null, 2) + '\\n';\n\nexport const resolveSubagentManifestPath = (userBasePath: string): string =>\n join(userBasePath, '.ai-ops', SUBAGENT_MANIFEST_FILENAME);\n\nexport const readSubagentManifest = (manifestPath: string): SubagentManifest | null => {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf-8');\n } catch {\n return null;\n }\n\n return parseSubagentManifest(raw);\n};\n\nexport const writeSubagentManifest = (manifestPath: string, manifest: SubagentManifest): void => {\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeSubagentManifest(manifest), 'utf-8');\n};\n","import { join } from 'node:path';\nimport { wrapWithSection } from './managed-header.js';\nimport { TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { ToolId } from './tool-output.js';\nimport type { ToolRenderResult } from './renderer.js';\n\n// Codex has no settings.json — plan directory convention must live in AGENTS.md\nconst CODEX_PLAN_BODY =\n '## Plan Snapshot (Plan mode only)\\n\\n' +\n '- This rule applies only when Codex is running in `collaboration_mode=Plan`.\\n' +\n '- Before implementation (file edits/creates, installs, commits) and before leaving Plan mode, save the latest plan content to `.codex/plans/YYYYMMDD_<topic>.md`.\\n' +\n '- In `Default` mode, do not automatically create or update plan files.';\n\nexport type FileAction = {\n relativePath: string;\n content: string;\n};\n\nexport const buildInstallPlan = (params: {\n toolId: ToolId;\n renderResult: ToolRenderResult;\n meta: { sourceHash: string; generatedAt: string };\n}): readonly FileAction[] => {\n const { toolId, renderResult, meta } = params;\n\n if (toolId === 'claude-code' && renderResult.tool === 'claude-code') {\n return renderResult.files.map(({ relativePath, content }) => ({\n relativePath,\n content: wrapWithSection(content, meta),\n }));\n }\n\n if (toolId === 'codex' && renderResult.tool === 'codex') {\n const config = TOOL_OUTPUT_MAP['codex'];\n const actions: FileAction[] = [];\n\n // CODEX_PLAN_BODY is always written to root AGENTS.md regardless of whether global rules exist\n const rootContent = renderResult.rootContent\n ? renderResult.rootContent + '\\n\\n---\\n\\n' + CODEX_PLAN_BODY\n : CODEX_PLAN_BODY;\n\n actions.push({\n relativePath: join(config.dir, config.rootFileName),\n content: wrapWithSection(rootContent, meta),\n });\n\n for (const df of renderResult.domainFiles) {\n actions.push({\n relativePath: join(df.workspacePath, config.domainFileName),\n content: wrapWithSection(df.content, meta),\n });\n }\n\n return actions;\n }\n\n if (toolId === 'gemini' && renderResult.tool === 'gemini') {\n const config = TOOL_OUTPUT_MAP['gemini'];\n const actions: FileAction[] = [];\n\n if (renderResult.rootContent) {\n actions.push({\n relativePath: join(config.dir, config.rootFileName),\n content: wrapWithSection(renderResult.rootContent, meta),\n });\n }\n\n for (const df of renderResult.domainFiles) {\n actions.push({\n relativePath: join(df.workspacePath, config.domainFileName),\n content: wrapWithSection(df.content, meta),\n });\n }\n\n return actions;\n }\n\n return [];\n};\n","import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path';\nimport { parseMarkdownFrontmatter } from './frontmatter.js';\nimport {\n extractAiOpsSectionContent,\n hasAiOpsSection,\n hasLegacyHeader,\n parseAiOpsMeta,\n replaceAiOpsSection,\n stripAiOpsSection,\n wrapWithSection,\n} from './managed-header.js';\nimport { COMPILER_DATA_DIR } from './paths.js';\nimport { computeHash, getCliVersion } from './source-hash.js';\nimport {\n ProjectLayerContextIndexSchema,\n ProjectLayerFrontmatterSchema,\n ProjectLayerManifestSchema,\n ProjectLayerToolSchema,\n isSafeProjectLayerPath,\n} from './schemas/index.js';\nimport type {\n ProjectLayerContextDocument,\n ProjectLayerContextIndex,\n ProjectLayerFrontmatter,\n ProjectLayerManifest,\n ProjectLayerPackFileRecord,\n ProjectLayerPackRecord,\n ProjectLayerProjectFile,\n ProjectLayerTool,\n} from './schemas/index.js';\n\n// ----- types -----\n\nexport type ProjectLayerFileOwnership = 'managed' | 'project';\n\nexport type ProjectLayerTemplateSpec = {\n path: string;\n content: string;\n ownership: ProjectLayerFileOwnership;\n frontmatter: ProjectLayerFrontmatter;\n contentHash: string;\n};\n\nexport type ProjectLayerInstallResult = {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n written: string[];\n appended: string[];\n createdProjectFiles: string[];\n refreshedProjectFiles: string[];\n preservedProjectFiles: string[];\n};\n\nexport type ProjectLayerRemoveResult = {\n deleted: string[];\n cleaned: string[];\n preserved: string[];\n notFound: string[];\n};\n\nexport type ProjectLayerIssueLevel = 'error' | 'warning';\n\nexport type ProjectLayerIssue = {\n level: ProjectLayerIssueLevel;\n code: string;\n message: string;\n};\n\nexport type ProjectLayerReport = {\n currentSourceHash: string | null;\n issues: ProjectLayerIssue[];\n};\n\ntype DocsStatusEntry = {\n path: string;\n status: string;\n owner: string;\n};\n\ntype ManagedInstallResult = {\n written: string[];\n appended: string[];\n};\n\ntype ProjectFileInstallResult = {\n records: ProjectLayerProjectFile[];\n created: string[];\n refreshed: string[];\n preserved: string[];\n};\n\nexport type ProjectLayerDocumentReadResult = ProjectLayerContextDocument & {\n content: string;\n};\n\n// ----- constants -----\n\nexport const PROJECT_LAYER_MANIFEST_RELATIVE_PATH = '.ai-ops/manifest.json';\nexport const PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH = '.ai-ops/context-layer.json';\n\nconst CONTEXT_LAYER_DATA_DIR = join(COMPILER_DATA_DIR, 'context-layer');\n\nconst TOOL_ORDER = ['codex', 'gemini', 'claude-code'] as const satisfies readonly ProjectLayerTool[];\n\nconst DEFAULT_TOOLS = TOOL_ORDER;\n\nconst TEMPLATE_PATHS = [\n 'AGENTS.md',\n 'GEMINI.md',\n 'CLAUDE.md',\n 'docs/agent/workflow.md',\n 'docs/agent/rules/routing-rules.md',\n 'docs/agent/rules/doc-update-rules.md',\n 'docs/agent/rules/stop-rules.md',\n 'docs/agent/checks/impact-checklist.md',\n 'docs/agent/checks/review-checklist.md',\n 'docs/agent/maps/codebase-map.md',\n 'docs/business/business-rules.md',\n 'docs/docs-status.md',\n] as const;\n\nconst PROJECT_OWNED_PATHS = new Set<string>([\n 'docs/docs-status.md',\n 'docs/agent/maps/codebase-map.md',\n 'docs/business/business-rules.md',\n]);\n\nconst RESERVED_DOCUMENT_WARNINGS = [\n '판단 근거로 사용하지 마세요',\n 'Do not use this document as current decision-making evidence',\n] as const;\n\n// ----- path helpers -----\n\nexport const resolveProjectLayerManifestPath = (basePath: string): string =>\n join(basePath, PROJECT_LAYER_MANIFEST_RELATIVE_PATH);\n\nexport const resolveProjectLayerContextIndexPath = (basePath: string): string =>\n join(basePath, PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH);\n\nconst resolveTemplatePath = (relativePath: string): string => join(CONTEXT_LAYER_DATA_DIR, relativePath);\n\nconst toRelativeDir = (relativePath: string): string => dirname(relativePath);\n\nexport const resolveProjectLayerFilePath = (basePath: string, relativePath: string): string => {\n if (!isSafeProjectLayerPath(relativePath)) {\n throw new Error(`Unsafe project layer path: ${relativePath}`);\n }\n\n const absoluteBasePath = resolve(basePath);\n const absolutePath = resolve(absoluteBasePath, relativePath);\n const relativeFromBase = relative(absoluteBasePath, absolutePath);\n\n if (relativeFromBase === '' || relativeFromBase.startsWith('..') || isAbsolute(relativeFromBase)) {\n throw new Error(`Unsafe project layer path: ${relativePath}`);\n }\n\n return absolutePath;\n};\n\n// ----- parsing and serialization -----\n\nexport const parseProjectLayerManifest = (json: string): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse(JSON.parse(json));\n\nexport const serializeProjectLayerManifest = (manifest: ProjectLayerManifest): string =>\n JSON.stringify(manifest, null, 2) + '\\n';\n\nexport const parseProjectLayerContextIndex = (json: string): ProjectLayerContextIndex =>\n ProjectLayerContextIndexSchema.parse(JSON.parse(json));\n\nexport const serializeProjectLayerContextIndex = (contextIndex: ProjectLayerContextIndex): string =>\n JSON.stringify(contextIndex, null, 2) + '\\n';\n\nconst parseProjectLayerFrontmatter = (content: string): ProjectLayerFrontmatter => {\n const { frontmatter } = parseMarkdownFrontmatter(content);\n return ProjectLayerFrontmatterSchema.parse(frontmatter);\n};\n\nexport const parseProjectLayerDocument = (path: string, rawContent: string): ProjectLayerDocumentReadResult => {\n const managedContent = extractAiOpsSectionContent(rawContent);\n const content = managedContent ?? rawContent;\n const frontmatter = parseProjectLayerFrontmatter(content);\n\n return {\n path,\n status: frontmatter.status,\n layer: frontmatter.layer,\n owner: frontmatter.owner,\n read_when: frontmatter.read_when,\n update_when: frontmatter.update_when,\n contentHash: computeHash([content.trimEnd()]),\n content,\n };\n};\n\nconst parseDocsStatusEntries = (content: string): DocsStatusEntry[] => {\n const document = parseProjectLayerDocument('docs/docs-status.md', content);\n const rows = document.content\n .split('\\n')\n .filter((line) => line.trim().startsWith('|'))\n .map((line) => line.trim());\n\n return rows.flatMap((line) => {\n const cells = line\n .split('|')\n .map((cell) => cell.trim())\n .filter((cell) => cell.length > 0);\n\n if (cells.length < 3) return [];\n if (cells[0] === 'path') return [];\n if (cells[0].startsWith('---')) return [];\n\n return [\n {\n path: cells[0],\n status: cells[1],\n owner: cells[2],\n },\n ];\n });\n};\n\n// ----- template loading -----\n\nexport const resolveProjectLayerTools = (requestedTools?: readonly string[]): ProjectLayerTool[] => {\n if (requestedTools === undefined || requestedTools.length === 0) {\n return [...DEFAULT_TOOLS];\n }\n\n const parsedTools = requestedTools.map((tool) => ProjectLayerToolSchema.parse(tool));\n const toolSet = new Set(parsedTools);\n return TOOL_ORDER.filter((tool) => toolSet.has(tool));\n};\n\nconst shouldIncludeTemplate = (relativePath: string, tools: readonly ProjectLayerTool[]): boolean => {\n if (relativePath === 'GEMINI.md') return tools.includes('gemini');\n if (relativePath === 'CLAUDE.md') return tools.includes('claude-code');\n return true;\n};\n\nconst buildDocsStatusRows = (specs: readonly ProjectLayerTemplateSpec[]): string =>\n specs.map((spec) => `| ${spec.path} | ${spec.frontmatter.status} | ${spec.frontmatter.owner} |`).join('\\n');\n\nconst includesReservedDocumentWarning = (content: string): boolean =>\n RESERVED_DOCUMENT_WARNINGS.some((warning) => content.includes(warning));\n\nconst loadTemplateSpec = (relativePath: string, content: string): ProjectLayerTemplateSpec => {\n const frontmatter = parseProjectLayerFrontmatter(content);\n const ownership = PROJECT_OWNED_PATHS.has(relativePath) ? 'project' : 'managed';\n\n if (frontmatter.status === 'Reserved' && !includesReservedDocumentWarning(content)) {\n throw new Error(`Reserved template must include warning text: ${relativePath}`);\n }\n\n return {\n path: relativePath,\n content,\n ownership,\n frontmatter,\n contentHash: computeHash([content.trimEnd()]),\n };\n};\n\nexport const loadProjectLayerTemplateSpecs = (\n tools: readonly ProjectLayerTool[],\n): readonly ProjectLayerTemplateSpec[] => {\n const selectedPaths = TEMPLATE_PATHS.filter((relativePath) => shouldIncludeTemplate(relativePath, tools));\n const nonStatusSpecs = selectedPaths\n .filter((relativePath) => relativePath !== 'docs/docs-status.md')\n .map((relativePath) => loadTemplateSpec(relativePath, readFileSync(resolveTemplatePath(relativePath), 'utf-8')));\n\n const statusTemplate = readFileSync(resolveTemplatePath('docs/docs-status.md'), 'utf-8');\n const statusPlaceholderSpec = loadTemplateSpec('docs/docs-status.md', statusTemplate);\n const specsForStatus = [...nonStatusSpecs, statusPlaceholderSpec].sort((a, b) => a.path.localeCompare(b.path));\n const statusContent = statusTemplate.replace('{{documents_table}}', buildDocsStatusRows(specsForStatus));\n const statusSpec = loadTemplateSpec('docs/docs-status.md', statusContent);\n\n return [...nonStatusSpecs, statusSpec].sort((a, b) => a.path.localeCompare(b.path));\n};\n\nexport const computeProjectLayerSourceHash = (specs: readonly ProjectLayerTemplateSpec[]): string =>\n computeHash(specs.map((spec) => `${spec.path}:${spec.content}`));\n\n// ----- manifest and index I/O -----\n\nexport const readProjectLayerManifest = (basePath: string): ProjectLayerManifest | null => {\n try {\n return parseProjectLayerManifest(readFileSync(resolveProjectLayerManifestPath(basePath), 'utf-8'));\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n};\n\nexport const writeProjectLayerManifest = (basePath: string, manifest: ProjectLayerManifest): void => {\n const manifestPath = resolveProjectLayerManifestPath(basePath);\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeProjectLayerManifest(manifest), 'utf-8');\n};\n\nexport const readProjectLayerContextIndex = (basePath: string): ProjectLayerContextIndex | null => {\n try {\n return parseProjectLayerContextIndex(readFileSync(resolveProjectLayerContextIndexPath(basePath), 'utf-8'));\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n};\n\nexport const writeProjectLayerContextIndex = (basePath: string, contextIndex: ProjectLayerContextIndex): void => {\n const contextIndexPath = resolveProjectLayerContextIndexPath(basePath);\n mkdirSync(dirname(contextIndexPath), { recursive: true });\n writeFileSync(contextIndexPath, serializeProjectLayerContextIndex(contextIndex), 'utf-8');\n};\n\n// ----- install and update -----\n\nconst installManagedFiles = (\n basePath: string,\n specs: readonly ProjectLayerTemplateSpec[],\n meta: { sourceHash: string; generatedAt: string },\n): ManagedInstallResult => {\n const written: string[] = [];\n const appended: string[] = [];\n\n for (const spec of specs) {\n const absolutePath = resolveProjectLayerFilePath(basePath, spec.path);\n const wrappedContent = wrapWithSection(spec.content, meta);\n\n if (!existsSync(absolutePath)) {\n mkdirSync(dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, wrappedContent + '\\n', 'utf-8');\n written.push(spec.path);\n continue;\n }\n\n const existing = readFileSync(absolutePath, 'utf-8');\n if (hasAiOpsSection(existing)) {\n writeFileSync(absolutePath, replaceAiOpsSection(existing, wrappedContent), 'utf-8');\n const stripped = stripAiOpsSection(existing);\n (stripped.trim().length > 0 ? appended : written).push(spec.path);\n continue;\n }\n\n if (hasLegacyHeader(existing)) {\n writeFileSync(absolutePath, wrappedContent + '\\n', 'utf-8');\n written.push(spec.path);\n continue;\n }\n\n writeFileSync(absolutePath, existing.trimEnd() + '\\n\\n' + wrappedContent + '\\n', 'utf-8');\n appended.push(spec.path);\n }\n\n return { written, appended };\n};\n\nconst installProjectFiles = (params: {\n basePath: string;\n specs: readonly ProjectLayerTemplateSpec[];\n previousProjectFiles?: readonly ProjectLayerProjectFile[];\n}): ProjectFileInstallResult => {\n const records: ProjectLayerProjectFile[] = [];\n const created: string[] = [];\n const refreshed: string[] = [];\n const preserved: string[] = [];\n const previousByPath = new Map((params.previousProjectFiles ?? []).map((file) => [file.path, file]));\n\n for (const spec of params.specs) {\n const absolutePath = resolveProjectLayerFilePath(params.basePath, spec.path);\n const previous = previousByPath.get(spec.path);\n\n if (!existsSync(absolutePath)) {\n mkdirSync(dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, spec.content + '\\n', 'utf-8');\n created.push(spec.path);\n records.push({\n path: spec.path,\n templateHash: spec.contentHash,\n created: true,\n });\n continue;\n }\n\n const existingContent = readFileSync(absolutePath, 'utf-8').trimEnd();\n const existingHash = computeHash([existingContent]);\n\n if (previous?.created === true && existingHash === previous.templateHash) {\n if (existingHash !== spec.contentHash) {\n writeFileSync(absolutePath, spec.content + '\\n', 'utf-8');\n refreshed.push(spec.path);\n } else {\n preserved.push(spec.path);\n }\n\n records.push({\n path: spec.path,\n templateHash: spec.contentHash,\n created: true,\n });\n continue;\n }\n\n preserved.push(spec.path);\n records.push({\n path: spec.path,\n templateHash: previous?.templateHash ?? spec.contentHash,\n created: previous?.created ?? false,\n });\n }\n\n return { records, created, refreshed, preserved };\n};\n\nconst buildContextIndexFromDisk = (params: {\n basePath: string;\n documentPaths: readonly string[];\n generatedAt: string;\n}): ProjectLayerContextIndex => {\n const documents = params.documentPaths.map((path) =>\n parseProjectLayerDocument(path, readFileSync(resolveProjectLayerFilePath(params.basePath, path), 'utf-8')),\n );\n\n return ProjectLayerContextIndexSchema.parse({\n schemaVersion: 1,\n kind: 'context-layer-index',\n documents: documents.map(({ content: _content, ...document }) => document),\n generatedAt: params.generatedAt,\n });\n};\n\nconst computeProjectFileHash = (basePath: string, relativePath: string): string =>\n computeHash([readFileSync(resolveProjectLayerFilePath(basePath, relativePath), 'utf-8').trimEnd()]);\n\nconst collectDocumentPathsFromManifest = (manifest: ProjectLayerManifest): string[] =>\n [\n ...manifest.managed_files.map((file) => file.path),\n ...manifest.project_files.map((file) => file.path),\n ...manifest.packs.flatMap((pack) => pack.documents.map((file) => file.path)),\n ].sort();\n\nconst buildDocsStatusRowsFromDisk = (params: {\n basePath: string;\n documentPaths: readonly string[];\n}): string[] =>\n params.documentPaths.map((path) => {\n const document = parseProjectLayerDocument(path, readFileSync(resolveProjectLayerFilePath(params.basePath, path), 'utf-8'));\n return `| ${document.path} | ${document.status} | ${document.owner} |`;\n });\n\nconst replaceDocsStatusRows = (content: string, rows: readonly string[]): string => {\n const lines = content.trimEnd().split('\\n');\n const headerIndex = lines.findIndex((line) => line.trim() === '| path | status | owner |');\n const dividerIndex = headerIndex + 1;\n\n if (headerIndex < 0 || !lines[dividerIndex]?.trim().startsWith('| ---')) {\n throw new Error('docs/docs-status.md table header not found');\n }\n\n let tableEndIndex = dividerIndex + 1;\n while (tableEndIndex < lines.length && lines[tableEndIndex]?.trim().startsWith('|')) {\n tableEndIndex += 1;\n }\n\n return [...lines.slice(0, dividerIndex + 1), ...rows, ...lines.slice(tableEndIndex)].join('\\n') + '\\n';\n};\n\nconst updateDocsStatusTable = (basePath: string, documentPaths: readonly string[]): { beforeHash: string; afterHash: string } => {\n const docsStatusPath = 'docs/docs-status.md';\n const absolutePath = resolveProjectLayerFilePath(basePath, docsStatusPath);\n const beforeHash = computeProjectFileHash(basePath, docsStatusPath);\n const rows = buildDocsStatusRowsFromDisk({ basePath, documentPaths });\n const nextContent = replaceDocsStatusRows(readFileSync(absolutePath, 'utf-8'), rows);\n writeFileSync(absolutePath, nextContent, 'utf-8');\n\n return {\n beforeHash,\n afterHash: computeProjectFileHash(basePath, docsStatusPath),\n };\n};\n\nconst updateDocsStatusProjectFileRecord = (params: {\n manifest: ProjectLayerManifest;\n beforeHash: string;\n afterHash: string;\n}): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n ...params.manifest,\n project_files: params.manifest.project_files.map((file) => {\n if (file.path !== 'docs/docs-status.md' || !file.created || file.templateHash !== params.beforeHash) {\n return file;\n }\n\n return {\n ...file,\n templateHash: params.afterHash,\n };\n }),\n });\n\nexport const refreshProjectLayerDerivedState = (params: {\n basePath: string;\n manifest: ProjectLayerManifest;\n generatedAt: string;\n}): {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n} => {\n const documentPaths = collectDocumentPathsFromManifest(params.manifest);\n const docsStatusHashes = updateDocsStatusTable(params.basePath, documentPaths);\n const manifest = updateDocsStatusProjectFileRecord({\n manifest: params.manifest,\n beforeHash: docsStatusHashes.beforeHash,\n afterHash: docsStatusHashes.afterHash,\n });\n const contextIndex = buildContextIndexFromDisk({\n basePath: params.basePath,\n documentPaths,\n generatedAt: params.generatedAt,\n });\n\n writeProjectLayerContextIndex(params.basePath, contextIndex);\n\n return {\n manifest,\n contextIndex,\n };\n};\n\nconst buildProjectLayerManifest = (params: {\n tools: readonly ProjectLayerTool[];\n managedFiles: readonly string[];\n projectFiles: readonly ProjectLayerProjectFile[];\n packs: readonly ProjectLayerPackRecord[];\n sourceHash: string;\n cliVersion: string;\n generatedAt: string;\n settings?: Record<string, unknown>;\n}): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n schemaVersion: 1,\n kind: 'project-operating-layer',\n tools: [...params.tools],\n managed_files: params.managedFiles.map((path) => ({\n path,\n sourceHash: params.sourceHash,\n })),\n project_files: [...params.projectFiles],\n packs: [...params.packs],\n settings: params.settings ?? {},\n sourceHash: params.sourceHash,\n cliVersion: params.cliVersion,\n generatedAt: params.generatedAt,\n });\n\nconst retireUnselectedManagedFiles = (params: {\n basePath: string;\n previousManifest: ProjectLayerManifest | null;\n nextManagedPaths: readonly string[];\n}): void => {\n if (!params.previousManifest) return;\n\n const nextManagedPathSet = new Set(params.nextManagedPaths);\n for (const file of params.previousManifest.managed_files) {\n if (!nextManagedPathSet.has(file.path)) {\n removeManagedProjectFile(params.basePath, file.path);\n }\n }\n};\n\nexport const installProjectLayer = (params: {\n basePath: string;\n tools: readonly ProjectLayerTool[];\n previousManifest?: ProjectLayerManifest | null;\n}): ProjectLayerInstallResult => {\n const previousManifest =\n params.previousManifest === undefined ? readProjectLayerManifest(params.basePath) : params.previousManifest;\n const specs = loadProjectLayerTemplateSpecs(params.tools);\n const sourceHash = computeProjectLayerSourceHash(specs);\n const generatedAt = new Date().toISOString();\n const managedSpecs = specs.filter((spec) => spec.ownership === 'managed');\n const projectSpecs = specs.filter((spec) => spec.ownership === 'project');\n const managedPaths = managedSpecs.map((spec) => spec.path);\n retireUnselectedManagedFiles({\n basePath: params.basePath,\n previousManifest,\n nextManagedPaths: managedPaths,\n });\n const managedResult = installManagedFiles(params.basePath, managedSpecs, { sourceHash, generatedAt });\n const projectResult = installProjectFiles({\n basePath: params.basePath,\n specs: projectSpecs,\n previousProjectFiles: previousManifest?.project_files,\n });\n const provisionalManifest = buildProjectLayerManifest({\n tools: params.tools,\n managedFiles: managedPaths,\n projectFiles: projectResult.records,\n packs: previousManifest?.packs ?? [],\n sourceHash,\n cliVersion: getCliVersion(),\n generatedAt,\n settings: previousManifest?.settings,\n });\n const { manifest, contextIndex } = refreshProjectLayerDerivedState({\n basePath: params.basePath,\n manifest: provisionalManifest,\n generatedAt,\n });\n\n writeProjectLayerManifest(params.basePath, manifest);\n\n return {\n manifest,\n contextIndex,\n written: managedResult.written,\n appended: managedResult.appended,\n createdProjectFiles: projectResult.created,\n refreshedProjectFiles: projectResult.refreshed,\n preservedProjectFiles: projectResult.preserved,\n };\n};\n\nexport const updateProjectLayer = (params: {\n basePath: string;\n manifest: ProjectLayerManifest;\n}): ProjectLayerInstallResult => {\n const specs = loadProjectLayerTemplateSpecs(params.manifest.tools);\n const sourceHash = computeProjectLayerSourceHash(specs);\n const generatedAt = new Date().toISOString();\n const managedSpecs = specs.filter((spec) => spec.ownership === 'managed');\n const projectSpecs = specs.filter((spec) => spec.ownership === 'project');\n const managedResult = installManagedFiles(params.basePath, managedSpecs, { sourceHash, generatedAt });\n const projectResult = installProjectFiles({\n basePath: params.basePath,\n specs: projectSpecs,\n previousProjectFiles: params.manifest.project_files,\n });\n const provisionalManifest = buildProjectLayerManifest({\n tools: params.manifest.tools,\n managedFiles: managedSpecs.map((spec) => spec.path),\n projectFiles: projectResult.records,\n packs: params.manifest.packs,\n sourceHash,\n cliVersion: getCliVersion(),\n generatedAt,\n settings: params.manifest.settings,\n });\n const { manifest, contextIndex } = refreshProjectLayerDerivedState({\n basePath: params.basePath,\n manifest: provisionalManifest,\n generatedAt,\n });\n\n writeProjectLayerManifest(params.basePath, manifest);\n\n return {\n manifest,\n contextIndex,\n written: managedResult.written,\n appended: managedResult.appended,\n createdProjectFiles: projectResult.created,\n refreshedProjectFiles: projectResult.refreshed,\n preservedProjectFiles: projectResult.preserved,\n };\n};\n\n// ----- diff and audit -----\n\nconst issue = (level: ProjectLayerIssueLevel, code: string, message: string): ProjectLayerIssue => ({\n level,\n code,\n message,\n});\n\nconst readDocumentSafely = (basePath: string, path: string): ProjectLayerDocumentReadResult | ProjectLayerIssue => {\n try {\n const absolutePath = resolveProjectLayerFilePath(basePath, path);\n if (!existsSync(absolutePath)) {\n return issue('error', 'missing-file', `파일 없음: ${path}`);\n }\n\n return parseProjectLayerDocument(path, readFileSync(absolutePath, 'utf-8'));\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n return issue('error', 'invalid-frontmatter', `${path} frontmatter 파싱 실패: ${reason}`);\n }\n};\n\nconst buildContextIndexMap = (contextIndex: ProjectLayerContextIndex | null): Map<string, ProjectLayerContextDocument> =>\n new Map((contextIndex?.documents ?? []).map((document) => [document.path, document]));\n\nconst compareArray = (left: readonly string[], right: readonly string[]): boolean =>\n left.length === right.length && left.every((value, index) => value === right[index]);\n\nconst compareContextDocument = (params: {\n expected: ProjectLayerDocumentReadResult;\n indexed: ProjectLayerContextDocument | undefined;\n}): ProjectLayerIssue[] => {\n const indexed = params.indexed;\n if (indexed === undefined) {\n return [issue('error', 'context-missing-document', `context-layer 누락: ${params.expected.path}`)];\n }\n\n const issues: ProjectLayerIssue[] = [];\n const scalarKeys = ['status', 'layer', 'owner', 'contentHash'] as const;\n\n for (const key of scalarKeys) {\n if (params.expected[key] !== indexed[key]) {\n issues.push(\n issue('error', 'context-document-mismatch', `${params.expected.path} context ${key} 불일치`),\n );\n }\n }\n\n if (!compareArray(params.expected.read_when, indexed.read_when)) {\n issues.push(issue('error', 'context-document-mismatch', `${params.expected.path} context read_when 불일치`));\n }\n\n if (!compareArray(params.expected.update_when, indexed.update_when)) {\n issues.push(issue('error', 'context-document-mismatch', `${params.expected.path} context update_when 불일치`));\n }\n\n return issues;\n};\n\nconst compareDocsStatusEntry = (params: {\n expected: ProjectLayerDocumentReadResult;\n entry: DocsStatusEntry | undefined;\n}): ProjectLayerIssue[] => {\n const entry = params.entry;\n if (entry === undefined) {\n return [issue('error', 'docs-status-missing-document', `docs-status 누락: ${params.expected.path}`)];\n }\n\n const issues: ProjectLayerIssue[] = [];\n if (entry.status !== params.expected.status) {\n issues.push(issue('error', 'docs-status-mismatch', `${params.expected.path} docs-status status 불일치`));\n }\n\n if (entry.owner !== params.expected.owner) {\n issues.push(issue('error', 'docs-status-mismatch', `${params.expected.path} docs-status owner 불일치`));\n }\n\n return issues;\n};\n\nexport const diffProjectLayer = (basePath: string): ProjectLayerReport => {\n let manifest: ProjectLayerManifest | null;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n return {\n currentSourceHash: null,\n issues: [issue('error', 'invalid-manifest', `${PROJECT_LAYER_MANIFEST_RELATIVE_PATH} 파싱 실패: ${reason}`)],\n };\n }\n\n if (!manifest) {\n return {\n currentSourceHash: null,\n issues: [issue('error', 'missing-manifest', `${PROJECT_LAYER_MANIFEST_RELATIVE_PATH}가 없습니다.`)],\n };\n }\n\n const specs = loadProjectLayerTemplateSpecs(manifest.tools);\n const currentSourceHash = computeProjectLayerSourceHash(specs);\n let contextIndex: ProjectLayerContextIndex | null = null;\n const issues: ProjectLayerIssue[] = [];\n\n try {\n contextIndex = readProjectLayerContextIndex(basePath);\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n issues.push(\n issue('error', 'invalid-context-index', `${PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH} 파싱 실패: ${reason}`),\n );\n }\n\n const contextMap = buildContextIndexMap(contextIndex);\n const expectedManagedPaths = new Set(specs.filter((spec) => spec.ownership === 'managed').map((spec) => spec.path));\n const manifestManagedPaths = new Set(manifest.managed_files.map((file) => file.path));\n\n if (manifest.sourceHash !== currentSourceHash) {\n issues.push(\n issue('warning', 'source-hash-drift', `template sourceHash 변경: ${manifest.sourceHash} -> ${currentSourceHash}`),\n );\n }\n\n if (contextIndex === null) {\n issues.push(issue('error', 'missing-context-index', `${PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH}가 없습니다.`));\n }\n\n for (const expectedPath of expectedManagedPaths) {\n if (!manifestManagedPaths.has(expectedPath)) {\n issues.push(issue('error', 'manifest-missing-managed-file', `manifest managed_files 누락: ${expectedPath}`));\n }\n }\n\n for (const file of manifest.managed_files) {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n issues.push(issue('error', 'missing-file', `파일 없음: ${file.path}`));\n continue;\n }\n\n const content = readFileSync(absolutePath, 'utf-8');\n const meta = parseAiOpsMeta(content);\n if (!meta) {\n issues.push(issue('error', 'missing-managed-section', `managed section 메타 없음: ${file.path}`));\n continue;\n }\n\n if (meta.sourceHash !== currentSourceHash) {\n issues.push(\n issue('warning', 'managed-source-hash-drift', `${file.path} sourceHash 변경: ${meta.sourceHash} -> ${currentSourceHash}`),\n );\n }\n }\n\n for (const file of manifest.project_files) {\n if (!existsSync(resolveProjectLayerFilePath(basePath, file.path))) {\n issues.push(issue('error', 'missing-file', `파일 없음: ${file.path}`));\n }\n }\n\n for (const pack of manifest.packs) {\n for (const file of [...pack.documents, ...pack.files]) {\n if (!existsSync(resolveProjectLayerFilePath(basePath, file.path))) {\n issues.push(issue('error', 'missing-file', `파일 없음: ${file.path}`));\n }\n }\n }\n\n for (const path of collectDocumentPathsFromManifest(manifest)) {\n const document = readDocumentSafely(basePath, path);\n if ('code' in document) {\n issues.push(document);\n continue;\n }\n issues.push(...compareContextDocument({ expected: document, indexed: contextMap.get(path) }));\n }\n\n return { currentSourceHash, issues };\n};\n\nexport const auditProjectLayer = (basePath: string): ProjectLayerReport => {\n const diffReport = diffProjectLayer(basePath);\n let manifest: ProjectLayerManifest | null;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch {\n return diffReport;\n }\n\n if (!manifest) {\n return diffReport;\n }\n\n let contextIndex: ProjectLayerContextIndex | null = null;\n try {\n contextIndex = readProjectLayerContextIndex(basePath);\n } catch {\n contextIndex = null;\n }\n const documentPaths = collectDocumentPathsFromManifest(manifest);\n const documentPathSet = new Set(documentPaths);\n const contextPathSet = new Set(contextIndex?.documents.map((document) => document.path) ?? []);\n const issues = [...diffReport.issues];\n const docsStatusPath = resolveProjectLayerFilePath(basePath, 'docs/docs-status.md');\n\n if (!existsSync(docsStatusPath)) {\n issues.push(issue('error', 'missing-docs-status', 'docs/docs-status.md가 없습니다.'));\n return { currentSourceHash: diffReport.currentSourceHash, issues };\n }\n\n let docsStatusEntries: DocsStatusEntry[] = [];\n try {\n docsStatusEntries = parseDocsStatusEntries(readFileSync(docsStatusPath, 'utf-8'));\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n issues.push(issue('error', 'invalid-docs-status', `docs/docs-status.md 파싱 실패: ${reason}`));\n }\n\n const docsStatusMap = new Map(docsStatusEntries.map((entry) => [entry.path, entry]));\n\n for (const path of documentPaths) {\n const document = readDocumentSafely(basePath, path);\n if ('code' in document) {\n continue;\n }\n\n issues.push(...compareDocsStatusEntry({ expected: document, entry: docsStatusMap.get(path) }));\n }\n\n for (const entry of docsStatusEntries) {\n if (!documentPathSet.has(entry.path)) {\n issues.push(issue('warning', 'docs-status-extra-document', `docs-status에 manifest 외 문서가 있습니다: ${entry.path}`));\n }\n }\n\n for (const contextPath of contextPathSet) {\n if (!documentPathSet.has(contextPath)) {\n issues.push(issue('warning', 'context-extra-document', `context-layer에 manifest 외 문서가 있습니다: ${contextPath}`));\n }\n }\n\n return { currentSourceHash: diffReport.currentSourceHash, issues };\n};\n\n// ----- uninstall -----\n\nfunction removeManagedProjectFile(basePath: string, relativePath: string): ProjectLayerRemoveResult {\n const absolutePath = resolveProjectLayerFilePath(basePath, relativePath);\n if (!existsSync(absolutePath)) {\n return { deleted: [], cleaned: [], preserved: [], notFound: [relativePath] };\n }\n\n const content = readFileSync(absolutePath, 'utf-8');\n if (!hasAiOpsSection(content)) {\n return { deleted: [], cleaned: [], preserved: [relativePath], notFound: [] };\n }\n\n const stripped = stripAiOpsSection(content);\n if (stripped.trim().length === 0) {\n rmSync(absolutePath);\n return { deleted: [relativePath], cleaned: [], preserved: [], notFound: [] };\n }\n\n writeFileSync(absolutePath, stripped, 'utf-8');\n return { deleted: [], cleaned: [relativePath], preserved: [], notFound: [] };\n}\n\nconst removeCreateOnlyProjectFile = (basePath: string, file: ProjectLayerProjectFile): ProjectLayerRemoveResult => {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n return { deleted: [], cleaned: [], preserved: [], notFound: [file.path] };\n }\n\n const content = readFileSync(absolutePath, 'utf-8').trimEnd();\n const currentHash = computeHash([content]);\n if (file.created && currentHash === file.templateHash) {\n rmSync(absolutePath);\n return { deleted: [file.path], cleaned: [], preserved: [], notFound: [] };\n }\n\n return { deleted: [], cleaned: [], preserved: [file.path], notFound: [] };\n};\n\nconst removePackOwnedFile = (basePath: string, file: ProjectLayerPackFileRecord): ProjectLayerRemoveResult => {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n return { deleted: [], cleaned: [], preserved: [], notFound: [file.path] };\n }\n\n const currentHash = computeHash([readFileSync(absolutePath, 'utf-8').trimEnd()]);\n if (currentHash === file.sourceHash) {\n rmSync(absolutePath);\n return { deleted: [file.path], cleaned: [], preserved: [], notFound: [] };\n }\n\n return { deleted: [], cleaned: [], preserved: [file.path], notFound: [] };\n};\n\nconst mergeRemoveResults = (results: readonly ProjectLayerRemoveResult[]): ProjectLayerRemoveResult => ({\n deleted: results.flatMap((result) => result.deleted),\n cleaned: results.flatMap((result) => result.cleaned),\n preserved: results.flatMap((result) => result.preserved),\n notFound: results.flatMap((result) => result.notFound),\n});\n\nconst removeEmptyDirs = (basePath: string, relativePaths: readonly string[]): void => {\n const dirs = [...new Set(relativePaths.map(toRelativeDir).filter((dir) => dir !== '.'))].sort(\n (a, b) => b.length - a.length,\n );\n\n for (const dir of [...dirs, '.ai-ops']) {\n const absoluteDir = resolveProjectLayerFilePath(basePath, dir);\n if (!existsSync(absoluteDir)) continue;\n\n try {\n if (readdirSync(absoluteDir).length === 0) {\n rmSync(absoluteDir, { recursive: true });\n }\n } catch {\n // Ignore cleanup failures.\n }\n }\n};\n\nexport const uninstallProjectLayer = (basePath: string, manifest: ProjectLayerManifest): ProjectLayerRemoveResult => {\n const managedResults = manifest.managed_files.map((file) => removeManagedProjectFile(basePath, file.path));\n const projectResults = manifest.project_files.map((file) => removeCreateOnlyProjectFile(basePath, file));\n const packResults = manifest.packs.flatMap((pack) =>\n [...pack.documents, ...pack.files].map((file) => removePackOwnedFile(basePath, file)),\n );\n const stateFiles = [PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH, PROJECT_LAYER_MANIFEST_RELATIVE_PATH];\n\n for (const stateFile of stateFiles) {\n rmSync(resolveProjectLayerFilePath(basePath, stateFile), { force: true });\n }\n\n const result = mergeRemoveResults([...managedResults, ...projectResults, ...packResults]);\n removeEmptyDirs(basePath, [...result.deleted, ...stateFiles]);\n return result;\n};\n","import { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// src/core/* 또는 dist/bin/index.js 기준에서도 공통으로 패키지 루트/data를 가리키도록 계산\n// src/core/paths.ts → ../../data = apps/cli/data\n// dist/bin/index.js (bundle) → ../../data = apps/cli/data\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport const COMPILER_DATA_DIR = resolve(__dirname, '..', '..', 'data');\n","import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path';\nimport { parseMarkdownFrontmatter } from './frontmatter.js';\nimport {\n PackCatalogSchema,\n ProjectLayerFrontmatterSchema,\n ProjectLayerManifestSchema,\n isSafeProjectLayerPath,\n} from './schemas/index.js';\nimport type {\n PackCatalog,\n ProjectLayerContextIndex,\n ProjectLayerManifest,\n ProjectLayerPackFileRecord,\n ProjectLayerPackRecord,\n} from './schemas/index.js';\nimport { computeHash, getCliVersion } from './source-hash.js';\nimport { COMPILER_DATA_DIR } from './paths.js';\nimport {\n readProjectLayerManifest,\n refreshProjectLayerDerivedState,\n resolveProjectLayerFilePath,\n writeProjectLayerManifest,\n} from './project-layer.js';\n\n// ----- types -----\n\nexport type ProjectLayerPackSourceFile = {\n path: string;\n content: string;\n sourceHash: string;\n};\n\nexport type ProjectLayerPackSource = {\n id: string;\n sourceHash: string;\n documents: ProjectLayerPackSourceFile[];\n files: ProjectLayerPackSourceFile[];\n};\n\nexport type ProjectLayerPackApplyResult = {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n written: string[];\n refreshed: string[];\n preserved: string[];\n deleted: string[];\n notFound: string[];\n};\n\nexport type ProjectLayerPackIssueLevel = 'error' | 'warning';\n\nexport type ProjectLayerPackIssue = {\n level: ProjectLayerPackIssueLevel;\n code: string;\n message: string;\n};\n\nexport type ProjectLayerPackReport = {\n issues: ProjectLayerPackIssue[];\n};\n\ntype PackFileApplyResult = {\n written: string[];\n refreshed: string[];\n preserved: string[];\n deleted: string[];\n notFound: string[];\n};\n\n// ----- constants -----\n\nconst PACK_REGISTRY_FILENAME = 'pack-registry.json';\nconst SPEC_LIFECYCLE_PACK_ID = 'spec-lifecycle';\nconst PACK_INSTALL_ROOT = 'docs/specs/';\nconst RESERVED_DOCUMENT_WARNINGS = [\n '판단 근거로 사용하지 마세요',\n 'Do not use this document as current decision-making evidence',\n] as const;\nconst DEFAULT_PACKS_DIR = join(COMPILER_DATA_DIR, 'packs');\n\n// ----- source loading -----\n\nconst includesReservedDocumentWarning = (content: string): boolean =>\n RESERVED_DOCUMENT_WARNINGS.some((warning) => content.includes(warning));\n\nconst readPackCatalog = (packsDir: string): PackCatalog =>\n PackCatalogSchema.parse(JSON.parse(readFileSync(join(packsDir, PACK_REGISTRY_FILENAME), 'utf-8')));\n\nconst assertPackInstallPath = (path: string): void => {\n if (!isSafeProjectLayerPath(path) || !path.startsWith(PACK_INSTALL_ROOT)) {\n throw new Error(`Unsafe pack path: ${path}`);\n }\n};\n\nconst readPackSourceFiles = (packDir: string): ProjectLayerPackSourceFile[] => {\n const files: ProjectLayerPackSourceFile[] = [];\n\n const walk = (relativeDir = ''): void => {\n const absoluteDir = relativeDir.length > 0 ? join(packDir, relativeDir) : packDir;\n const entries = readdirSync(absoluteDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const nextRelativePath = relativeDir.length > 0 ? join(relativeDir, entry.name) : entry.name;\n if (entry.isDirectory()) {\n walk(nextRelativePath);\n continue;\n }\n\n assertPackInstallPath(nextRelativePath);\n const content = readFileSync(join(packDir, nextRelativePath), 'utf-8');\n files.push({\n path: nextRelativePath,\n content,\n sourceHash: computeHash([content.trimEnd()]),\n });\n }\n };\n\n walk();\n return files;\n};\n\nconst splitPackSourceFiles = (files: readonly ProjectLayerPackSourceFile[]): {\n documents: ProjectLayerPackSourceFile[];\n files: ProjectLayerPackSourceFile[];\n} => {\n const documents: ProjectLayerPackSourceFile[] = [];\n const regularFiles: ProjectLayerPackSourceFile[] = [];\n\n for (const file of files) {\n if (!file.path.endsWith('.md')) {\n regularFiles.push(file);\n continue;\n }\n\n const { frontmatter } = parseMarkdownFrontmatter(file.content);\n const parsed = ProjectLayerFrontmatterSchema.parse(frontmatter);\n if (parsed.status === 'Reserved' && !includesReservedDocumentWarning(file.content)) {\n throw new Error(`Reserved pack document must include warning text: ${file.path}`);\n }\n documents.push(file);\n }\n\n return { documents, files: regularFiles };\n};\n\nexport const loadAllPacks = (packsDir: string): ProjectLayerPackSource[] => {\n const catalog = readPackCatalog(packsDir);\n const entries = [...catalog.packs].sort((a, b) => a.id.localeCompare(b.id));\n\n return entries.map((entry) => {\n if (entry.id !== SPEC_LIFECYCLE_PACK_ID) {\n throw new Error(`Unsupported pack id: ${entry.id}`);\n }\n\n const packDir = resolve(packsDir, entry.source_path);\n const relativeFromPacks = relative(resolve(packsDir), packDir);\n if (relativeFromPacks.length === 0 || relativeFromPacks.startsWith('..') || isAbsolute(relativeFromPacks)) {\n throw new Error(`Pack source path escapes packs dir: ${entry.source_path}`);\n }\n\n const files = readPackSourceFiles(packDir);\n const split = splitPackSourceFiles(files);\n\n return {\n id: entry.id,\n sourceHash: computeHash(files.map((file) => `${file.path}:${file.content}`).sort()),\n documents: split.documents,\n files: split.files,\n };\n });\n};\n\nconst resolvePackById = (packsDir: string, packId: string): ProjectLayerPackSource => {\n const pack = loadAllPacks(packsDir).find((candidate) => candidate.id === packId);\n if (!pack) {\n throw new Error(`Unknown pack: ${packId}`);\n }\n return pack;\n};\n\n// ----- file application -----\n\nconst serializePackFileContent = (content: string): string => (content.length === 0 ? '' : content.trimEnd() + '\\n');\n\nconst readProjectFileHash = (basePath: string, relativePath: string): string =>\n computeHash([readFileSync(resolveProjectLayerFilePath(basePath, relativePath), 'utf-8').trimEnd()]);\n\nconst writePackFile = (basePath: string, file: ProjectLayerPackSourceFile): void => {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n mkdirSync(dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, serializePackFileContent(file.content), 'utf-8');\n};\n\nconst buildPackFileRecords = (files: readonly ProjectLayerPackSourceFile[]): ProjectLayerPackFileRecord[] =>\n files.map((file) => ({\n path: file.path,\n sourceHash: file.sourceHash,\n }));\n\nconst buildPackRecord = (params: {\n pack: ProjectLayerPackSource;\n installedAt: string;\n}): ProjectLayerPackRecord => ({\n id: params.pack.id,\n sourceHash: params.pack.sourceHash,\n documents: buildPackFileRecords(params.pack.documents),\n files: buildPackFileRecords(params.pack.files),\n installedAt: params.installedAt,\n});\n\nconst applyPackSourceFiles = (params: {\n basePath: string;\n pack: ProjectLayerPackSource;\n previousRecord: ProjectLayerPackRecord | null;\n}): PackFileApplyResult => {\n const written: string[] = [];\n const refreshed: string[] = [];\n const preserved: string[] = [];\n const deleted: string[] = [];\n const notFound: string[] = [];\n const sourceFiles = [...params.pack.documents, ...params.pack.files];\n const sourceByPath = new Map(sourceFiles.map((file) => [file.path, file]));\n const previousByPath = new Map(\n [...(params.previousRecord?.documents ?? []), ...(params.previousRecord?.files ?? [])].map((file) => [\n file.path,\n file,\n ]),\n );\n\n for (const file of sourceFiles) {\n const absolutePath = resolveProjectLayerFilePath(params.basePath, file.path);\n const previous = previousByPath.get(file.path);\n\n if (!existsSync(absolutePath)) {\n writePackFile(params.basePath, file);\n written.push(file.path);\n continue;\n }\n\n if (previous === undefined) {\n preserved.push(file.path);\n continue;\n }\n\n const currentHash = readProjectFileHash(params.basePath, file.path);\n if (currentHash !== previous.sourceHash) {\n preserved.push(file.path);\n continue;\n }\n\n if (currentHash !== file.sourceHash) {\n writePackFile(params.basePath, file);\n refreshed.push(file.path);\n }\n }\n\n for (const previous of previousByPath.values()) {\n if (sourceByPath.has(previous.path)) {\n continue;\n }\n\n const absolutePath = resolveProjectLayerFilePath(params.basePath, previous.path);\n if (!existsSync(absolutePath)) {\n notFound.push(previous.path);\n continue;\n }\n\n if (readProjectFileHash(params.basePath, previous.path) === previous.sourceHash) {\n rmSync(absolutePath);\n deleted.push(previous.path);\n } else {\n preserved.push(previous.path);\n }\n }\n\n return { written, refreshed, preserved, deleted, notFound };\n};\n\nconst removePackFiles = (basePath: string, record: ProjectLayerPackRecord): PackFileApplyResult => {\n const deleted: string[] = [];\n const preserved: string[] = [];\n const notFound: string[] = [];\n\n for (const file of [...record.documents, ...record.files]) {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n notFound.push(file.path);\n continue;\n }\n\n if (readProjectFileHash(basePath, file.path) === file.sourceHash) {\n rmSync(absolutePath);\n deleted.push(file.path);\n } else {\n preserved.push(file.path);\n }\n }\n\n return { written: [], refreshed: [], preserved, deleted, notFound };\n};\n\nconst removeEmptyDirs = (basePath: string, relativePaths: readonly string[]): void => {\n const dirs = [...new Set(relativePaths.map((path) => dirname(path)).filter((dir) => dir !== '.'))].sort(\n (a, b) => b.length - a.length,\n );\n\n for (const dir of dirs) {\n const absoluteDir = resolveProjectLayerFilePath(basePath, dir);\n if (!existsSync(absoluteDir)) {\n continue;\n }\n\n try {\n if (readdirSync(absoluteDir).length === 0) {\n rmSync(absoluteDir, { recursive: true });\n }\n } catch {\n // Directory cleanup is best-effort only.\n }\n }\n};\n\n// ----- manifest updates -----\n\nconst requireProjectLayerManifest = (basePath: string): ProjectLayerManifest => {\n const manifest = readProjectLayerManifest(basePath);\n if (!manifest) {\n throw new Error('.ai-ops/manifest.json이 없습니다. 먼저 ai-ops init을 실행하세요.');\n }\n return manifest;\n};\n\nconst upsertPackRecord = (\n manifest: ProjectLayerManifest,\n record: ProjectLayerPackRecord,\n generatedAt: string,\n): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n ...manifest,\n packs: [...manifest.packs.filter((pack) => pack.id !== record.id), record],\n cliVersion: getCliVersion(),\n generatedAt,\n });\n\nconst removePackRecord = (manifest: ProjectLayerManifest, packId: string, generatedAt: string): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n ...manifest,\n packs: manifest.packs.filter((pack) => pack.id !== packId),\n cliVersion: getCliVersion(),\n generatedAt,\n });\n\nconst writeManifestWithDerivedState = (params: {\n basePath: string;\n manifest: ProjectLayerManifest;\n generatedAt: string;\n}): {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n} => {\n const derived = refreshProjectLayerDerivedState({\n basePath: params.basePath,\n manifest: params.manifest,\n generatedAt: params.generatedAt,\n });\n writeProjectLayerManifest(params.basePath, derived.manifest);\n return derived;\n};\n\n// ----- lifecycle -----\n\nexport const installProjectLayerPack = (params: {\n basePath: string;\n packId: string;\n packsDir?: string;\n}): ProjectLayerPackApplyResult => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const previousRecord = manifest.packs.find((pack) => pack.id === params.packId);\n if (previousRecord) {\n return updateProjectLayerPack(params);\n }\n\n const pack = resolvePackById(params.packsDir ?? DEFAULT_PACKS_DIR, params.packId);\n const installedAt = new Date().toISOString();\n const applyResult = applyPackSourceFiles({ basePath: params.basePath, pack, previousRecord: null });\n const nextManifest = upsertPackRecord(manifest, buildPackRecord({ pack, installedAt }), installedAt);\n const derived = writeManifestWithDerivedState({\n basePath: params.basePath,\n manifest: nextManifest,\n generatedAt: installedAt,\n });\n\n return { ...applyResult, manifest: derived.manifest, contextIndex: derived.contextIndex };\n};\n\nexport const updateProjectLayerPack = (params: {\n basePath: string;\n packId: string;\n packsDir?: string;\n}): ProjectLayerPackApplyResult => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const previousRecord = manifest.packs.find((pack) => pack.id === params.packId);\n if (!previousRecord) {\n throw new Error(`설치된 pack을 찾지 못했습니다: ${params.packId}`);\n }\n\n const pack = resolvePackById(params.packsDir ?? DEFAULT_PACKS_DIR, params.packId);\n const generatedAt = new Date().toISOString();\n const applyResult = applyPackSourceFiles({ basePath: params.basePath, pack, previousRecord });\n const nextManifest = upsertPackRecord(\n manifest,\n buildPackRecord({ pack, installedAt: previousRecord.installedAt }),\n generatedAt,\n );\n const derived = writeManifestWithDerivedState({\n basePath: params.basePath,\n manifest: nextManifest,\n generatedAt,\n });\n\n removeEmptyDirs(params.basePath, applyResult.deleted);\n return { ...applyResult, manifest: derived.manifest, contextIndex: derived.contextIndex };\n};\n\nexport const uninstallProjectLayerPack = (params: {\n basePath: string;\n packId: string;\n}): ProjectLayerPackApplyResult => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const previousRecord = manifest.packs.find((pack) => pack.id === params.packId);\n if (!previousRecord) {\n throw new Error(`설치된 pack을 찾지 못했습니다: ${params.packId}`);\n }\n\n const generatedAt = new Date().toISOString();\n const applyResult = removePackFiles(params.basePath, previousRecord);\n const nextManifest = removePackRecord(manifest, params.packId, generatedAt);\n const derived = writeManifestWithDerivedState({\n basePath: params.basePath,\n manifest: nextManifest,\n generatedAt,\n });\n\n removeEmptyDirs(params.basePath, applyResult.deleted);\n return { ...applyResult, manifest: derived.manifest, contextIndex: derived.contextIndex };\n};\n\n// ----- diff -----\n\nconst packIssue = (\n level: ProjectLayerPackIssueLevel,\n code: string,\n message: string,\n): ProjectLayerPackIssue => ({\n level,\n code,\n message,\n});\n\nexport const diffProjectLayerPack = (params: {\n basePath: string;\n packId?: string;\n packsDir?: string;\n}): ProjectLayerPackReport => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const targets = params.packId ? manifest.packs.filter((pack) => pack.id === params.packId) : manifest.packs;\n const issues: ProjectLayerPackIssue[] = [];\n\n if (targets.length === 0) {\n return { issues: [packIssue('warning', 'missing-pack', '비교할 설치된 pack이 없습니다.')] };\n }\n\n for (const record of targets) {\n const pack = resolvePackById(params.packsDir ?? DEFAULT_PACKS_DIR, record.id);\n if (record.sourceHash !== pack.sourceHash) {\n issues.push(\n packIssue('warning', 'pack-source-hash-drift', `${record.id} sourceHash 변경: ${record.sourceHash} -> ${pack.sourceHash}`),\n );\n }\n\n for (const file of [...record.documents, ...record.files]) {\n const absolutePath = resolveProjectLayerFilePath(params.basePath, file.path);\n if (!existsSync(absolutePath)) {\n issues.push(packIssue('error', 'missing-file', `파일 없음: ${file.path}`));\n }\n }\n }\n\n return { issues };\n};\n","import { join } from 'node:path';\nimport { TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { Manifest } from './schemas/index.js';\n\n/**\n * manifest에 installed_files가 없는 구버전 manifest를 위한 fallback.\n * manifest의 tools/workspaces/installed_rules 정보를 기반으로\n * 실제 설치됐을 파일 경로를 역산한다.\n */\nexport const inferInstalledFiles = (manifest: Manifest): string[] => {\n const files: string[] = [];\n const isMonorepo = manifest.workspaces !== undefined;\n\n for (const toolId of manifest.tools) {\n if (toolId === 'claude-code') {\n // claude-code: .claude/rules/{ruleId}.md\n const config = TOOL_OUTPUT_MAP['claude-code'];\n for (const ruleId of manifest.installed_rules) {\n files.push(join(config.rulesDir, `${ruleId}${config.fileExtension}`));\n }\n } else if (toolId === 'codex') {\n const config = TOOL_OUTPUT_MAP['codex'];\n if (!isMonorepo) {\n // 비모노: .codex/AGENTS.md + .codex/AGENTS.override.md (domain 있으면)\n files.push(join(config.dir, config.rootFileName));\n files.push(join(config.dir, config.domainFileName));\n } else {\n // 모노: .codex/AGENTS.md (global) + {workspace}/AGENTS.override.md (domain)\n files.push(join(config.dir, config.rootFileName));\n for (const ws of Object.keys(manifest.workspaces ?? {})) {\n files.push(join(ws, config.domainFileName));\n }\n }\n } else if (toolId === 'gemini') {\n const config = TOOL_OUTPUT_MAP['gemini'];\n if (!isMonorepo) {\n // 비모노: .gemini/GEMINI.md\n files.push(join(config.dir, config.rootFileName));\n } else {\n // 모노: .gemini/GEMINI.md (global) + {workspace}/GEMINI.md (domain)\n files.push(join(config.dir, config.rootFileName));\n for (const ws of Object.keys(manifest.workspaces ?? {})) {\n files.push(join(ws, config.domainFileName));\n }\n }\n }\n }\n\n // 중복 제거 (codex 비모노에서 rootFileName === domainFileName인 경우 대비)\n return [...new Set(files)];\n};\n","import { join } from 'node:path';\nimport { COMPILER_DATA_DIR } from '@/core/index.js';\n\nexport const resolveCompilerDataDir = (): string => COMPILER_DATA_DIR;\n\nexport const resolveRulesDir = (): string => join(COMPILER_DATA_DIR, 'rules');\n\nexport const resolveSkillsDir = (): string => join(COMPILER_DATA_DIR, 'skills');\n\nexport const resolveSubagentsDir = (): string => join(COMPILER_DATA_DIR, 'subagents');\n\nexport const resolvePacksDir = (): string => join(COMPILER_DATA_DIR, 'packs');\n\nexport const resolveReferenceSkillsDir = (): string => join(resolveSkillsDir(), 'reference-skills');\n\nexport const resolveTaskSkillsDir = (): string => join(resolveSkillsDir(), 'task-skills');\n\nexport const resolveSkillCatalogPath = (): string => join(resolveSkillsDir(), 'skill-registry.json');\n\nexport const resolvePresetsPath = (): string => join(COMPILER_DATA_DIR, 'presets.yaml');\n\n// project-only 설치 기준 디렉토리\nexport const resolveBasePath = (): string => process.cwd();\n\nexport const resolveUserBasePath = (): string => {\n const userBasePath = process.env.AI_OPS_HOME ?? process.env.HOME;\n if (!userBasePath) {\n throw new Error('AI_OPS_HOME or HOME is required for global asset commands');\n }\n return userBasePath;\n};\n","import * as p from '@clack/prompts';\nimport { ZodError } from 'zod';\n\nexport const formatProjectLayerCommandError = (error: unknown): string => {\n if (error instanceof ZodError) {\n return error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : 'manifest';\n return `${path}: ${issue.message}`;\n })\n .join('; ');\n }\n\n return error instanceof Error ? error.message : 'unknown error';\n};\n\nexport const reportInvalidProjectLayerManifest = (params: { error: unknown; outro: string }): void => {\n const reason = formatProjectLayerCommandError(params.error);\n p.log.error(`[invalid-manifest] .ai-ops/manifest.json 파싱 실패: ${reason}`);\n process.exitCode = 1;\n p.outro(params.outro);\n};\n\nexport const reportProjectLayerApplyError = (params: { error: unknown; outro: string }): void => {\n const reason = formatProjectLayerCommandError(params.error);\n p.log.error(`[project-layer-apply] project operating layer 적용 실패: ${reason}`);\n process.exitCode = 1;\n p.outro(params.outro);\n};\n","import * as p from '@clack/prompts';\nimport {\n diffProjectLayer,\n readProjectLayerManifest,\n updateProjectLayer,\n} from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\nimport { reportInvalidProjectLayerManifest, reportProjectLayerApplyError } from './project-layer-errors.js';\n\nexport const updateCommand = async (opts: { force: boolean }): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops update');\n\n let manifest: ReturnType<typeof readProjectLayerManifest>;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch (error) {\n reportInvalidProjectLayerManifest({ error, outro: 'ai-ops update 실패' });\n return;\n }\n\n if (!manifest) {\n p.log.error('.ai-ops/manifest.json이 없습니다. 먼저 ai-ops init을 실행하세요.');\n process.exit(1);\n }\n\n const diffReport = diffProjectLayer(basePath);\n if (diffReport.issues.length === 0 && !opts.force) {\n p.log.info('변경 사항이 없습니다.');\n p.outro('ai-ops update 완료');\n return;\n }\n\n let result: ReturnType<typeof updateProjectLayer>;\n try {\n result = updateProjectLayer({ basePath, manifest });\n } catch (error) {\n reportProjectLayerApplyError({ error, outro: 'ai-ops update 실패' });\n return;\n }\n\n p.log.success(`managed 파일 갱신: ${result.manifest.managed_files.length}개`);\n if (result.createdProjectFiles.length > 0) {\n p.log.info(`누락된 project-owned 파일 복구:\\n${result.createdProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.refreshedProjectFiles.length > 0) {\n p.log.info(`unmodified project-owned 파일 갱신:\\n${result.refreshedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preservedProjectFiles.length > 0) {\n p.log.info(`project-owned 파일 보존:\\n${result.preservedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n\n p.outro('ai-ops update 완료');\n};\n","import * as p from '@clack/prompts';\nimport { diffProjectLayer } from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\n\nexport const diffCommand = async (): Promise<void> => {\n p.intro('ai-ops diff');\n\n const report = diffProjectLayer(resolveBasePath());\n if (report.issues.length === 0) {\n p.log.success('변경 사항 없음. 최신 상태입니다.');\n p.outro('ai-ops diff 완료');\n return;\n }\n\n for (const item of report.issues) {\n const line = `[${item.code}] ${item.message}`;\n if (item.level === 'error') {\n p.log.error(line);\n } else {\n p.log.warn(line);\n }\n }\n\n if (report.issues.some((item) => item.level === 'error')) {\n process.exitCode = 1;\n }\n\n p.outro('ai-ops diff 완료');\n};\n","import * as p from '@clack/prompts';\nimport { auditProjectLayer } from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\n\nexport const auditCommand = async (): Promise<void> => {\n p.intro('ai-ops audit');\n\n const report = auditProjectLayer(resolveBasePath());\n if (report.issues.length === 0) {\n p.log.success('audit 통과. manifest, context-layer, frontmatter, docs-status가 일치합니다.');\n p.outro('ai-ops audit 완료');\n return;\n }\n\n for (const item of report.issues) {\n const line = `[${item.code}] ${item.message}`;\n if (item.level === 'error') {\n p.log.error(line);\n } else {\n p.log.warn(line);\n }\n }\n\n if (report.issues.some((item) => item.level === 'error')) {\n process.exitCode = 1;\n }\n\n p.outro('ai-ops audit 완료');\n};\n","import * as p from '@clack/prompts';\nimport { readProjectLayerManifest, uninstallProjectLayer } from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\nimport { reportInvalidProjectLayerManifest, reportProjectLayerApplyError } from './project-layer-errors.js';\n\ntype UninstallCommandOptions = {\n yes?: boolean;\n};\n\nexport const uninstallCommand = async (opts: UninstallCommandOptions = {}): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops uninstall');\n\n let manifest: ReturnType<typeof readProjectLayerManifest>;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch (error) {\n reportInvalidProjectLayerManifest({ error, outro: 'ai-ops uninstall 실패' });\n return;\n }\n\n if (!manifest) {\n p.log.error('.ai-ops/manifest.json이 없습니다. project operating layer가 설치되어 있지 않습니다.');\n process.exitCode = 1;\n p.outro('ai-ops uninstall 실패');\n return;\n }\n\n const targetFiles = [\n ...manifest.managed_files.map((file) => file.path),\n ...manifest.project_files.map((file) => file.path),\n '.ai-ops/context-layer.json',\n '.ai-ops/manifest.json',\n ];\n\n p.log.info(`처리 대상 (${targetFiles.length}개):\\n${targetFiles.map((file) => ` ${file}`).join('\\n')}`);\n\n if (!opts.yes) {\n const confirmed = await p.confirm({\n message: 'project operating layer를 제거하시겠습니까?',\n initialValue: false,\n });\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('취소됨');\n process.exit(0);\n }\n }\n\n let result: ReturnType<typeof uninstallProjectLayer>;\n try {\n result = uninstallProjectLayer(basePath, manifest);\n } catch (error) {\n reportProjectLayerApplyError({ error, outro: 'ai-ops uninstall 실패' });\n return;\n }\n\n if (result.deleted.length > 0) {\n p.log.success(`삭제 완료:\\n${result.deleted.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.cleaned.length > 0) {\n p.log.success(`managed section 제거, 사용자 내용 보존:\\n${result.cleaned.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`수정되었거나 기존에 있던 project-owned 파일 보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.notFound.length > 0) {\n p.log.info(`이미 없음:\\n${result.notFound.map((file) => ` ${file}`).join('\\n')}`);\n }\n\n p.outro('ai-ops uninstall 완료');\n};\n","import * as p from '@clack/prompts';\nimport { rmSync } from 'node:fs';\nimport type { InstalledSkill, Skill, ToolId } from '@/core/index.js';\nimport {\n loadAllSkills,\n buildSkillInstallPlan,\n getCliVersion,\n readSkillRegistry,\n resolveSkillRegistryPath,\n writeSkillRegistry,\n resolveCanonicalSkillId,\n} from '@/core/index.js';\nimport { resolveSkillsDir, resolveUserBasePath } from '../lib/paths.js';\nimport {\n findInstalledSkill,\n mergeSkillTools,\n removeInstalledSkill,\n resolveRequestedTools,\n upsertInstalledSkill,\n} from '../lib/skill-state.js';\nimport { installSkillPackages, removeDirectories } from '../lib/skill-install.js';\n\ntype SkillCommandOptions = {\n tool?: string[];\n};\n\nconst loadCompilerInputs = (): {\n allSkills: ReturnType<typeof loadAllSkills>;\n cliVersion: string;\n} => {\n return {\n allSkills: loadAllSkills(resolveSkillsDir()),\n cliVersion: getCliVersion(),\n };\n};\n\nconst resolveSkillById = (skills: readonly Skill[], skillId: string): Skill => {\n const canonicalSkillId = resolveCanonicalSkillId(skillId);\n const skill = skills.find((candidate) => candidate.id === canonicalSkillId);\n if (!skill) {\n throw new Error(`Unknown skill: ${skillId}`);\n }\n return skill;\n};\n\nconst writeUserSkillState = (params: {\n basePath: string;\n cliVersion: string;\n nextSkill?: InstalledSkill;\n removeSkillId?: string;\n}): void => {\n const registryPath = resolveSkillRegistryPath(params.basePath);\n const previous = readSkillRegistry(registryPath);\n const skills = params.removeSkillId\n ? removeInstalledSkill(previous?.skills ?? [], params.removeSkillId)\n : params.nextSkill\n ? upsertInstalledSkill(previous?.skills ?? [], params.nextSkill)\n : (previous?.skills ?? []);\n\n if (skills.length === 0) {\n rmSync(registryPath, { force: true });\n return;\n }\n\n writeSkillRegistry(registryPath, {\n skills,\n cliVersion: params.cliVersion,\n generatedAt: new Date().toISOString(),\n });\n};\n\nconst readInstalledSkills = (basePath: string): InstalledSkill[] => {\n return (readSkillRegistry(resolveSkillRegistryPath(basePath))?.skills ?? []).map((installedSkill) => ({\n ...installedSkill,\n id: resolveCanonicalSkillId(installedSkill.id),\n }));\n};\n\nconst installSkill = (params: {\n skill: Skill;\n requestedTools: readonly ToolId[];\n basePath: string;\n cliVersion: string;\n}): InstalledSkill => {\n const installedSkills = readInstalledSkills(params.basePath);\n const existingInstalledSkill = findInstalledSkill(installedSkills, params.skill.id);\n const nextRequestedTools = mergeSkillTools({\n existing: existingInstalledSkill?.tools,\n requested: params.requestedTools,\n });\n const { packages, installedSkill } = buildSkillInstallPlan({\n skill: params.skill,\n requestedTools: nextRequestedTools,\n });\n installSkillPackages(params.basePath, packages);\n\n writeUserSkillState({\n basePath: params.basePath,\n cliVersion: params.cliVersion,\n nextSkill: installedSkill,\n });\n\n return installedSkill;\n};\n\nexport const skillListCommand = async (): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n\n p.intro('ai-ops skill list');\n const sections = [\n { kind: 'reference' as const, title: 'reference skills' },\n { kind: 'task' as const, title: 'task skills' },\n ]\n .map(({ kind, title }) => {\n const lines = allSkills\n .filter((skill) => skill.kind === kind)\n .map((skill) => {\n const installed = findInstalledSkill(installedSkills, skill.id);\n const suffix = installed ? `installed for ${installed.tools.join(', ')}` : 'not installed';\n return `- ${skill.id} - ${suffix}`;\n });\n\n if (lines.length === 0) {\n return null;\n }\n\n return `${title}\\n${lines.join('\\n')}`;\n })\n .filter((section): section is string => section !== null);\n\n p.log.info(sections.join('\\n\\n'));\n p.outro('ai-ops skill list 완료');\n};\n\nexport const skillInstallCommand = async (skillId: string, opts: SkillCommandOptions): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills, cliVersion } = loadCompilerInputs();\n const skill = resolveSkillById(allSkills, skillId);\n const requestedTools = resolveRequestedTools({ requested: opts.tool, supported: skill.supported_tools });\n\n p.intro(`ai-ops skill install ${skillId}`);\n const installedSkill = installSkill({\n skill,\n requestedTools,\n basePath,\n cliVersion,\n });\n\n p.log.success(`설치 완료: ${installedSkill.id} (${installedSkill.installed_paths.join(', ')})`);\n p.outro('ai-ops skill install 완료');\n};\n\nexport const skillDiffCommand = async (skillId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n const targets = skillId ? installedSkills.filter((skill) => skill.id === skillId) : installedSkills;\n\n p.intro('ai-ops skill diff');\n\n if (targets.length === 0) {\n p.log.warn('비교할 설치된 skill이 없습니다.');\n p.outro('ai-ops skill diff 완료');\n return;\n }\n\n const lines = targets.map((installedSkill) => {\n const skill = resolveSkillById(allSkills, installedSkill.id);\n const { installedSkill: next } = buildSkillInstallPlan({\n skill,\n requestedTools: installedSkill.tools,\n });\n const changed = next.sourceHash !== installedSkill.sourceHash;\n return `- ${installedSkill.id}: ${changed ? 'changed' : 'up-to-date'} (${installedSkill.sourceHash} -> ${next.sourceHash})`;\n });\n\n p.log.info(lines.join('\\n'));\n p.outro('ai-ops skill diff 완료');\n};\n\nexport const skillUpdateCommand = async (skillId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills, cliVersion } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n const targets = skillId ? installedSkills.filter((skill) => skill.id === skillId) : installedSkills;\n\n p.intro('ai-ops skill update');\n\n if (targets.length === 0) {\n p.log.warn('갱신할 설치된 skill이 없습니다.');\n p.outro('ai-ops skill update 완료');\n return;\n }\n\n const nextInstalledSkills = targets.map((installedSkill) => {\n const skill = resolveSkillById(allSkills, installedSkill.id);\n const { packages, installedSkill: next } = buildSkillInstallPlan({\n skill,\n requestedTools: installedSkill.tools,\n });\n installSkillPackages(basePath, packages);\n return next;\n });\n\n const registryPath = resolveSkillRegistryPath(basePath);\n const previous = readSkillRegistry(registryPath);\n const nextSkillIds = new Set(nextInstalledSkills.map((skill) => skill.id));\n const untouched = (previous?.skills ?? []).filter(\n (installedSkill) => !nextSkillIds.has(resolveCanonicalSkillId(installedSkill.id)),\n );\n writeSkillRegistry(registryPath, {\n skills: [...untouched, ...nextInstalledSkills],\n cliVersion,\n generatedAt: new Date().toISOString(),\n });\n\n p.log.success(`갱신 완료: ${nextInstalledSkills.map((skill) => skill.id).join(', ')}`);\n p.outro('ai-ops skill update 완료');\n};\n\nexport const skillUninstallCommand = async (skillId: string): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { cliVersion } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n const installedSkill = findInstalledSkill(installedSkills, skillId);\n\n p.intro(`ai-ops skill uninstall ${skillId}`);\n\n if (!installedSkill) {\n p.log.warn('설치된 skill을 찾지 못했습니다.');\n p.outro('ai-ops skill uninstall 완료');\n return;\n }\n\n const removed = removeDirectories(basePath, installedSkill.installed_paths);\n\n writeUserSkillState({\n basePath,\n cliVersion,\n removeSkillId: skillId,\n });\n\n p.log.success(`제거 완료: ${removed.join(', ')}`);\n p.outro('ai-ops skill uninstall 완료');\n};\n","import { resolveCanonicalSkillId, SKILL_TOOL } from '@/core/index.js';\nimport type { InstalledSkill, ToolId } from '@/core/index.js';\n\nexport const resolveRequestedTools = (params: {\n requested?: readonly string[];\n supported: readonly string[];\n}): ToolId[] => {\n if (params.requested === undefined || params.requested.length === 0) {\n return [...params.supported] as ToolId[];\n }\n\n const supportedSet = new Set(params.supported);\n const invalid = params.requested.filter((tool) => !supportedSet.has(tool));\n if (invalid.length > 0) {\n throw new Error(`Unsupported tools requested: ${invalid.join(', ')}`);\n }\n\n return [...params.requested] as ToolId[];\n};\n\nconst TOOL_ORDER = [SKILL_TOOL.CLAUDE_CODE, SKILL_TOOL.CODEX, SKILL_TOOL.GEMINI] as const;\n\nexport const mergeSkillTools = (params: { existing?: readonly string[]; requested: readonly ToolId[] }): ToolId[] => {\n const merged = new Set([...(params.existing ?? []), ...params.requested]);\n return TOOL_ORDER.filter((tool) => merged.has(tool));\n};\n\nexport const subtractSkillTools = (params: {\n requested: readonly ToolId[];\n installed?: readonly string[];\n}): ToolId[] => {\n const installed = new Set(params.installed ?? []);\n return params.requested.filter((tool) => !installed.has(tool));\n};\n\nexport const upsertInstalledSkill = (\n installedSkills: readonly InstalledSkill[],\n nextSkill: InstalledSkill,\n): InstalledSkill[] => {\n const nextSkillId = resolveCanonicalSkillId(nextSkill.id);\n const remaining = installedSkills.filter((skill) => resolveCanonicalSkillId(skill.id) !== nextSkillId);\n return [...remaining, nextSkill];\n};\n\nexport const removeInstalledSkill = (installedSkills: readonly InstalledSkill[], skillId: string): InstalledSkill[] => {\n const targetSkillId = resolveCanonicalSkillId(skillId);\n return installedSkills.filter((skill) => resolveCanonicalSkillId(skill.id) !== targetSkillId);\n};\n\nexport const findInstalledSkill = (\n installedSkills: readonly InstalledSkill[],\n skillId: string,\n): InstalledSkill | undefined => {\n const targetSkillId = resolveCanonicalSkillId(skillId);\n return installedSkills.find((skill) => resolveCanonicalSkillId(skill.id) === targetSkillId);\n};\n","import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { SkillPackage } from '@/core/index.js';\n\nexport const installSkillPackages = (basePath: string, packages: readonly SkillPackage[]): string[] => {\n const writtenRoots: string[] = [];\n\n for (const skillPackage of packages) {\n const absRoot = resolve(basePath, skillPackage.rootDir);\n if (existsSync(absRoot)) {\n rmSync(absRoot, { recursive: true, force: true });\n }\n\n for (const file of skillPackage.files) {\n const absPath = resolve(basePath, file.relativePath);\n mkdirSync(dirname(absPath), { recursive: true });\n writeFileSync(absPath, file.content + '\\n', 'utf-8');\n }\n\n writtenRoots.push(skillPackage.rootDir);\n }\n\n return writtenRoots;\n};\n\nexport const removeDirectories = (basePath: string, relativeDirs: readonly string[]): string[] => {\n const removed: string[] = [];\n\n for (const relativeDir of relativeDirs) {\n const absPath = resolve(basePath, relativeDir);\n if (!existsSync(absPath)) continue;\n rmSync(absPath, { recursive: true, force: true });\n removed.push(relativeDir);\n }\n\n return removed;\n};\n","import * as p from '@clack/prompts';\nimport { existsSync, rmSync } from 'node:fs';\nimport type { InstalledSubagent, Subagent, ToolId } from '@/core/index.js';\nimport {\n buildSubagentInstallPlan,\n getCliVersion,\n loadAllSubagents,\n readSubagentManifest,\n resolveSubagentManifestPath,\n writeSubagentManifest,\n} from '@/core/index.js';\nimport { resolveSubagentsDir, resolveUserBasePath } from '../lib/paths.js';\nimport { installSubagentPackages, removeSubagentFiles } from '../lib/subagent-install.js';\nimport {\n findInstalledSubagent,\n mergeSubagentTools,\n removeInstalledSubagent,\n resolveInstalledSubagentPaths,\n resolveRequestedSubagentTools,\n upsertInstalledSubagent,\n} from '../lib/subagent-state.js';\n\ntype SubagentCommandOptions = {\n tool?: string[];\n};\n\nconst loadCompilerInputs = (): {\n allSubagents: ReturnType<typeof loadAllSubagents>;\n cliVersion: string;\n} => {\n return {\n allSubagents: loadAllSubagents(resolveSubagentsDir()),\n cliVersion: getCliVersion(),\n };\n};\n\nconst resolveSubagentById = (subagents: readonly Subagent[], subagentId: string): Subagent => {\n const subagent = subagents.find((candidate) => candidate.id === subagentId);\n if (!subagent) {\n throw new Error(`Unknown subagent: ${subagentId}`);\n }\n return subagent;\n};\n\nconst writeUserSubagentState = (params: {\n basePath: string;\n cliVersion: string;\n nextSubagent?: InstalledSubagent;\n removeSubagentId?: string;\n}): void => {\n const manifestPath = resolveSubagentManifestPath(params.basePath);\n const previous = readSubagentManifest(manifestPath);\n const subagents = params.removeSubagentId\n ? removeInstalledSubagent(previous?.subagents ?? [], params.removeSubagentId)\n : params.nextSubagent\n ? upsertInstalledSubagent(previous?.subagents ?? [], params.nextSubagent)\n : (previous?.subagents ?? []);\n\n if (subagents.length === 0) {\n rmSync(manifestPath, { force: true });\n return;\n }\n\n writeSubagentManifest(manifestPath, {\n subagents,\n cliVersion: params.cliVersion,\n generatedAt: new Date().toISOString(),\n });\n};\n\nconst readInstalledSubagents = (basePath: string): InstalledSubagent[] =>\n readSubagentManifest(resolveSubagentManifestPath(basePath))?.subagents ?? [];\n\nconst warnMissingSkills = (requiredSkills: ReturnType<typeof buildSubagentInstallPlan>['requiredSkills']): void => {\n const missing = requiredSkills.filter((skill) => !existsSync(skill.path));\n if (missing.length === 0) {\n return;\n }\n\n p.log.warn(\n [\n '필요한 skill이 아직 설치되지 않았습니다. subagent 설치는 계속 진행합니다.',\n ...missing.map((skill) => `- ${skill.tool}:${skill.skillName} (${skill.path})`),\n ].join('\\n'),\n );\n};\n\nconst installSubagent = (params: {\n subagent: Subagent;\n requestedTools: readonly ToolId[];\n basePath: string;\n cliVersion: string;\n}): InstalledSubagent => {\n const installedSubagents = readInstalledSubagents(params.basePath);\n const existingInstalledSubagent = findInstalledSubagent(installedSubagents, params.subagent.id);\n const nextRequestedTools = mergeSubagentTools({\n existing: existingInstalledSubagent?.tools,\n requested: params.requestedTools,\n });\n const { packages, installedSubagent, requiredSkills } = buildSubagentInstallPlan({\n subagent: params.subagent,\n requestedTools: nextRequestedTools,\n userBasePath: params.basePath,\n });\n installSubagentPackages(params.basePath, packages);\n warnMissingSkills(requiredSkills);\n\n writeUserSubagentState({\n basePath: params.basePath,\n cliVersion: params.cliVersion,\n nextSubagent: installedSubagent,\n });\n\n return installedSubagent;\n};\n\nexport const subagentListCommand = async (): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents } = loadCompilerInputs();\n const installedSubagents = readInstalledSubagents(basePath);\n\n p.intro('ai-ops subagent list');\n const lines = allSubagents.map((subagent) => {\n const installed = findInstalledSubagent(installedSubagents, subagent.id);\n const suffix = installed ? `installed for ${installed.tools.join(', ')}` : 'not installed';\n return `- ${subagent.id} - ${suffix}`;\n });\n\n p.log.info(lines.join('\\n'));\n p.outro('ai-ops subagent list 완료');\n};\n\nexport const subagentInstallCommand = async (subagentId: string, opts: SubagentCommandOptions): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents, cliVersion } = loadCompilerInputs();\n const subagent = resolveSubagentById(allSubagents, subagentId);\n const requestedTools = resolveRequestedSubagentTools({ requested: opts.tool, supported: subagent.supported_tools });\n\n p.intro(`ai-ops subagent install ${subagentId}`);\n const installedSubagent = installSubagent({\n subagent,\n requestedTools,\n basePath,\n cliVersion,\n });\n\n p.log.success(`설치 완료: ${installedSubagent.id} (${installedSubagent.installed_paths.join(', ')})`);\n p.outro('ai-ops subagent install 완료');\n};\n\nexport const subagentDiffCommand = async (subagentId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents } = loadCompilerInputs();\n const installedSubagents = readInstalledSubagents(basePath);\n const targets = subagentId\n ? installedSubagents.filter((subagent) => subagent.id === subagentId)\n : installedSubagents;\n\n p.intro('ai-ops subagent diff');\n\n if (targets.length === 0) {\n p.log.warn('비교할 설치된 subagent가 없습니다.');\n p.outro('ai-ops subagent diff 완료');\n return;\n }\n\n const lines = targets.map((installedSubagent) => {\n const subagent = resolveSubagentById(allSubagents, installedSubagent.id);\n const { installedSubagent: next } = buildSubagentInstallPlan({\n subagent,\n requestedTools: installedSubagent.tools,\n userBasePath: basePath,\n });\n const changed = next.sourceHash !== installedSubagent.sourceHash;\n return `- ${installedSubagent.id}: ${changed ? 'changed' : 'up-to-date'} (${installedSubagent.sourceHash} -> ${next.sourceHash})`;\n });\n\n p.log.info(lines.join('\\n'));\n p.outro('ai-ops subagent diff 완료');\n};\n\nexport const subagentUpdateCommand = async (subagentId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents, cliVersion } = loadCompilerInputs();\n const installedSubagents = readInstalledSubagents(basePath);\n const targets = subagentId\n ? installedSubagents.filter((subagent) => subagent.id === subagentId)\n : installedSubagents;\n\n p.intro('ai-ops subagent update');\n\n if (targets.length === 0) {\n p.log.warn('갱신할 설치된 subagent가 없습니다.');\n p.outro('ai-ops subagent update 완료');\n return;\n }\n\n const nextInstalledSubagents = targets.map((installedSubagent) => {\n const subagent = resolveSubagentById(allSubagents, installedSubagent.id);\n const { packages, installedSubagent: next, requiredSkills } = buildSubagentInstallPlan({\n subagent,\n requestedTools: installedSubagent.tools,\n userBasePath: basePath,\n });\n installSubagentPackages(basePath, packages);\n warnMissingSkills(requiredSkills);\n return next;\n });\n\n const manifestPath = resolveSubagentManifestPath(basePath);\n const previous = readSubagentManifest(manifestPath);\n const nextSubagentIds = new Set(nextInstalledSubagents.map((subagent) => subagent.id));\n const untouched = (previous?.subagents ?? []).filter((subagent) => !nextSubagentIds.has(subagent.id));\n writeSubagentManifest(manifestPath, {\n subagents: [...untouched, ...nextInstalledSubagents],\n cliVersion,\n generatedAt: new Date().toISOString(),\n });\n\n p.log.success(`갱신 완료: ${nextInstalledSubagents.map((subagent) => subagent.id).join(', ')}`);\n p.outro('ai-ops subagent update 완료');\n};\n\nexport const subagentUninstallCommand = async (subagentId: string): Promise<void> => {\n const basePath = resolveUserBasePath();\n const cliVersion = getCliVersion();\n const installedSubagents = readInstalledSubagents(basePath);\n const installedSubagent = findInstalledSubagent(installedSubagents, subagentId);\n\n p.intro(`ai-ops subagent uninstall ${subagentId}`);\n\n if (!installedSubagent) {\n p.log.warn('설치된 subagent를 찾지 못했습니다.');\n p.outro('ai-ops subagent uninstall 완료');\n return;\n }\n\n const removed = removeSubagentFiles(basePath, resolveInstalledSubagentPaths(installedSubagent));\n\n writeUserSubagentState({\n basePath,\n cliVersion,\n removeSubagentId: subagentId,\n });\n\n p.log.success(`제거 완료: ${removed.join(', ')}`);\n p.outro('ai-ops subagent uninstall 완료');\n};\n","import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, relative, resolve } from 'node:path';\nimport type { SubagentPackage } from '@/core/index.js';\n\nconst resolveInsideBasePath = (basePath: string, relativePath: string): string => {\n const absBasePath = resolve(basePath);\n const absPath = resolve(absBasePath, relativePath);\n const fromBase = relative(absBasePath, absPath);\n\n if (fromBase.length === 0 || fromBase.startsWith('..') || isAbsolute(fromBase)) {\n throw new Error(`Subagent path escapes AI_OPS_HOME: ${relativePath}`);\n }\n\n return absPath;\n};\n\nexport const installSubagentPackages = (basePath: string, packages: readonly SubagentPackage[]): string[] => {\n const written: string[] = [];\n\n for (const subagentPackage of packages) {\n for (const file of subagentPackage.files) {\n const absPath = resolveInsideBasePath(basePath, file.relativePath);\n if (existsSync(absPath)) {\n rmSync(absPath, { recursive: true, force: true });\n }\n mkdirSync(dirname(absPath), { recursive: true });\n writeFileSync(absPath, file.content.trimEnd() + '\\n', 'utf-8');\n written.push(file.relativePath);\n }\n }\n\n return written;\n};\n\nexport const removeSubagentFiles = (basePath: string, relativePaths: readonly string[]): string[] => {\n const removed: string[] = [];\n\n for (const relativePath of relativePaths) {\n const absPath = resolveInsideBasePath(basePath, relativePath);\n if (!existsSync(absPath)) continue;\n rmSync(absPath, { recursive: true, force: true });\n removed.push(relativePath);\n }\n\n return removed;\n};\n","import { buildSubagentRelativePath, SKILL_TOOL } from '@/core/index.js';\nimport type { InstalledSubagent, ToolId } from '@/core/index.js';\n\nexport const resolveRequestedSubagentTools = (params: {\n requested?: readonly string[];\n supported: readonly string[];\n}): ToolId[] => {\n if (params.requested === undefined || params.requested.length === 0) {\n return [...params.supported] as ToolId[];\n }\n\n const supportedSet = new Set(params.supported);\n const invalid = params.requested.filter((tool) => !supportedSet.has(tool));\n if (invalid.length > 0) {\n throw new Error(`Unsupported tools requested: ${invalid.join(', ')}`);\n }\n\n return [...params.requested] as ToolId[];\n};\n\nconst TOOL_ORDER = [SKILL_TOOL.CLAUDE_CODE, SKILL_TOOL.CODEX, SKILL_TOOL.GEMINI] as const;\n\nexport const mergeSubagentTools = (params: { existing?: readonly string[]; requested: readonly ToolId[] }): ToolId[] => {\n const merged = new Set([...(params.existing ?? []), ...params.requested]);\n return TOOL_ORDER.filter((tool) => merged.has(tool));\n};\n\nexport const upsertInstalledSubagent = (\n installedSubagents: readonly InstalledSubagent[],\n nextSubagent: InstalledSubagent,\n): InstalledSubagent[] => {\n const remaining = installedSubagents.filter((subagent) => subagent.id !== nextSubagent.id);\n return [...remaining, nextSubagent];\n};\n\nexport const removeInstalledSubagent = (\n installedSubagents: readonly InstalledSubagent[],\n subagentId: string,\n): InstalledSubagent[] => installedSubagents.filter((subagent) => subagent.id !== subagentId);\n\nexport const findInstalledSubagent = (\n installedSubagents: readonly InstalledSubagent[],\n subagentId: string,\n): InstalledSubagent | undefined => installedSubagents.find((subagent) => subagent.id === subagentId);\n\nexport const resolveInstalledSubagentPaths = (installedSubagent: InstalledSubagent): string[] =>\n installedSubagent.tools.map((tool) => buildSubagentRelativePath(installedSubagent.id, tool));\n","import * as p from '@clack/prompts';\nimport {\n diffProjectLayerPack,\n installProjectLayerPack,\n loadAllPacks,\n readProjectLayerManifest,\n uninstallProjectLayerPack,\n updateProjectLayerPack,\n} from '@/core/index.js';\nimport type { ProjectLayerManifest } from '@/core/index.js';\nimport { resolveBasePath, resolvePacksDir } from '../lib/paths.js';\n\nconst readManifestForPackCommand = (basePath: string): ProjectLayerManifest | null => {\n try {\n return readProjectLayerManifest(basePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'unknown error';\n p.log.error(`.ai-ops/manifest.json 파싱 실패: ${message}`);\n process.exitCode = 1;\n return null;\n }\n};\n\nconst reportPackError = (error: unknown): void => {\n const message = error instanceof Error ? error.message : 'unknown error';\n p.log.error(message);\n process.exitCode = 1;\n};\n\nexport const packListCommand = async (): Promise<void> => {\n const basePath = resolveBasePath();\n const packs = loadAllPacks(resolvePacksDir());\n const manifest = readManifestForPackCommand(basePath);\n const installedPackIds = new Set(manifest?.packs.map((pack) => pack.id) ?? []);\n\n p.intro('ai-ops pack list');\n p.log.info(\n packs\n .map((pack) => {\n const suffix = installedPackIds.has(pack.id) ? 'installed' : 'not installed';\n return `- ${pack.id} - ${suffix}`;\n })\n .join('\\n'),\n );\n p.outro('ai-ops pack list 완료');\n};\n\nexport const packInstallCommand = async (packId: string): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro(`ai-ops pack install ${packId}`);\n try {\n const result = installProjectLayerPack({ basePath, packId, packsDir: resolvePacksDir() });\n p.log.success(`pack 설치 완료: ${packId}`);\n if (result.written.length > 0) {\n p.log.info(`생성:\\n${result.written.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.refreshed.length > 0) {\n p.log.info(`갱신:\\n${result.refreshed.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack install 완료');\n};\n\nexport const packDiffCommand = async (packId: string | undefined): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops pack diff');\n try {\n const report = diffProjectLayerPack({ basePath, packId, packsDir: resolvePacksDir() });\n if (report.issues.length === 0) {\n p.log.success('변경 사항 없음. pack이 최신 상태입니다.');\n p.outro('ai-ops pack diff 완료');\n return;\n }\n\n for (const item of report.issues) {\n const line = `[${item.code}] ${item.message}`;\n if (item.level === 'error') {\n p.log.error(line);\n } else {\n p.log.warn(line);\n }\n }\n\n if (report.issues.some((item) => item.level === 'error')) {\n process.exitCode = 1;\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack diff 완료');\n};\n\nexport const packUpdateCommand = async (packId: string | undefined): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops pack update');\n try {\n const manifest = readManifestForPackCommand(basePath);\n if (!manifest) {\n p.log.error('.ai-ops/manifest.json이 없습니다. 먼저 ai-ops init을 실행하세요.');\n process.exitCode = 1;\n p.outro('ai-ops pack update 완료');\n return;\n }\n\n const targetPackIds = packId ? [packId] : manifest.packs.map((pack) => pack.id);\n if (targetPackIds.length === 0) {\n p.log.warn('갱신할 설치된 pack이 없습니다.');\n p.outro('ai-ops pack update 완료');\n return;\n }\n\n for (const targetPackId of targetPackIds) {\n const result = updateProjectLayerPack({ basePath, packId: targetPackId, packsDir: resolvePacksDir() });\n p.log.success(`pack 갱신 완료: ${targetPackId}`);\n if (result.refreshed.length > 0) {\n p.log.info(`갱신:\\n${result.refreshed.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack update 완료');\n};\n\nexport const packUninstallCommand = async (packId: string): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro(`ai-ops pack uninstall ${packId}`);\n try {\n const result = uninstallProjectLayerPack({ basePath, packId });\n p.log.success(`pack 제거 완료: ${packId}`);\n if (result.deleted.length > 0) {\n p.log.info(`삭제:\\n${result.deleted.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack uninstall 완료');\n};\n"],"mappings":"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","names":["p","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","join","parse","join","join","parse","join","join","readFileSync","readdirSync","join","resolve","resolve","readFileSync","join","resolve","normalizeSelectedTools","resolve","readFileSync","dirname","join","mkdirSync","readFileSync","writeFileSync","dirname","join","join","readFileSync","mkdirSync","dirname","writeFileSync","mkdirSync","readFileSync","writeFileSync","dirname","join","join","readFileSync","mkdirSync","dirname","writeFileSync","join","existsSync","mkdirSync","readFileSync","readdirSync","writeFileSync","dirname","join","resolve","dirname","resolve","fileURLToPath","__dirname","join","dirname","resolve","readFileSync","mkdirSync","writeFileSync","existsSync","readdirSync","existsSync","mkdirSync","readFileSync","readdirSync","rmSync","writeFileSync","dirname","isAbsolute","join","relative","resolve","RESERVED_DOCUMENT_WARNINGS","join","includesReservedDocumentWarning","readFileSync","readdirSync","resolve","relative","isAbsolute","mkdirSync","dirname","writeFileSync","existsSync","rmSync","removeEmptyDirs","pack","join","join","join","issue","p","p","p","p","p","rmSync","TOOL_ORDER","existsSync","mkdirSync","rmSync","writeFileSync","dirname","resolve","rmSync","p","existsSync","rmSync","existsSync","mkdirSync","rmSync","writeFileSync","dirname","isAbsolute","relative","resolve","TOOL_ORDER","loadCompilerInputs","rmSync","existsSync","p"]}