ai-ops-cli 0.2.3 → 0.2.6

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.
@@ -19,6 +19,8 @@ content:
19
19
  - 'For non-trivial business rules, start with a failing test (TDD).'
20
20
  - 'Use a functional-core / imperative-shell structure.'
21
21
  - 'Use immutable updates (const/final, copy/spread patterns).'
22
+ - 'Within a file, order declarations by role: types → constants → validators/guards → helper functions → main logic/exports.'
23
+ - 'When a file contains multiple semantic groups, add section divider comments (e.g., // ----- types -----) between groups.'
22
24
  decision_table:
23
25
  - when: 'Implementing complex business logic'
24
26
  then: 'Write failing tests first, then implement pure functions'
@@ -28,3 +30,6 @@ content:
28
30
  avoid: 'Early shared abstraction'
29
31
  - when: 'Similar code appears in three or more places'
30
32
  then: 'Extract a clearly named shared function'
33
+ - when: 'A file has two or more distinct semantic groups (types, constants, logic, etc.)'
34
+ then: 'Order declarations by role and add section divider comments between groups'
35
+ avoid: 'Flat interleaving of unrelated declarations without visual separation'
@@ -29,6 +29,7 @@
29
29
  - Do not handwrite data classes.
30
30
  - Do not use Navigator 1.0 push/pop APIs for routing.
31
31
  - Do not manually implement JSON serialization.
32
+ - Do not duplicate server-owned API data into shared preferences, secure storage, or long-lived UI state.
32
33
 
33
34
  ## App Frontend Library Guidelines
34
35
 
@@ -38,6 +39,7 @@
38
39
  - Create one shared Dio instance via Riverpod DI.
39
40
  - Use shared_preferences or flutter_secure_storage by data sensitivity.
40
41
  - Use cached_network_image for network image caching.
42
+ - Treat remote API data as server-owned state exposed through Riverpod providers.
41
43
  - Use very_good_analysis and treat warnings as CI failures.
42
44
  - Use intl or easy_localization with ARB-based translations.
43
45
 
@@ -45,6 +47,8 @@
45
47
 
46
48
  - When state is local and ephemeral, keep it local.
47
49
  - When state is shared or long-lived, use Riverpod Notifier or AsyncNotifier.
50
+ - When async data comes from an external API, keep cache freshness, invalidation, and reload behavior explicit in the provider or repository boundary.
51
+ - When persisted app state is needed, persist only preferences, session bootstrap data, or explicitly designed offline state.
48
52
  - When HTTP API calls are needed, use one DI-injected Dio client.
49
53
  - When network images are rendered, use cached_network_image.
50
54
  - When code generation is required, run build_runner instead of editing generated code.
@@ -33,6 +33,7 @@
33
33
  - Do not build conditional className strings manually.
34
34
  - Do not install parallel UI kits next to shadcn/ui.
35
35
  - Do not use Redux, Recoil, or MobX for local UI state.
36
+ - Do not mirror server-owned API responses into Zustand or browser persistence.
36
37
 
37
38
  ## Web Frontend Library Guidelines
38
39
 
@@ -42,6 +43,9 @@
42
43
  - Render Recharts only inside client components.
43
44
  - Mount one Sonner toaster at the app root.
44
45
  - Sanitize user HTML before `dangerouslySetInnerHTML`.
46
+ - Use TanStack Query or SWR for client-side REST/HTTP server state.
47
+ - Use Zustand for client-owned UI and application state.
48
+ - Use Zustand persist only for preferences, draft UI state, or explicit session restoration.
45
49
  - Use Vitest and Testing Library.
46
50
 
47
51
  ## Decision Rules
@@ -52,3 +56,5 @@
52
56
  - When form validation is needed, use zod with react-hook-form.
53
57
  - When parsing an ISO date string, use `parseISO()` from date-fns; avoid `new Date(string)`.
54
58
  - When client UI state is needed, use a zustand slice.
59
+ - When client-side server state is needed, define stale time, invalidation triggers, refetch behavior, and optimistic rollback behavior.
60
+ - When derived state can be calculated from query data or store state, calculate it instead of storing a synchronized copy.
@@ -6,12 +6,14 @@
6
6
  - Do not handwrite operation/result types or rely on unchecked casts.
7
7
  - Do not treat HTTP 200 as success when `errors[]` exists.
8
8
  - Do not create per-feature client instances when shared auth/cache behavior is expected.
9
+ - Do not duplicate GraphQL query results into Zustand, Riverpod, or local persistent storage.
9
10
 
10
11
  ## Guidelines
11
12
 
12
13
  - Use generated GraphQL documents and types from codegen artifacts.
13
14
  - Keep one configured provider/client at the app root.
14
15
  - Set cache and fetch policy explicitly per operation.
16
+ - Use the GraphQL client cache as the source of truth for GraphQL server state.
15
17
  - Co-locate `.graphql` documents and fragments with the consuming feature.
16
18
  - Normalize GraphQL errors and extensions into a shared UI error model.
17
19
 
@@ -20,3 +22,4 @@
20
22
  - When a new query or mutation document is added, regenerate codegen artifacts before committing.
21
23
  - When a mutation can return data and business errors together, preserve partial success and surface typed errors.
22
24
  - When freshness requirements differ, choose fetch policy deliberately instead of relying on defaults.
25
+ - When a mutation changes cached entities, update the normalized cache or invalidate/refetch the affected operations deliberately.
package/dist/bin/index.js CHANGED
@@ -823,7 +823,7 @@ var SPEC_README_TEMPLATE = `# Specs
823
823
  \`\`\`
824
824
  specs/
825
825
  \u251C\u2500\u2500 baseline/ # \uAE30\uC900 spec \uBB38\uC11C (\uCD08\uAE30 \uC694\uAD6C\uC0AC\uD56D, \uD655\uC815\uB41C \uC2A4\uD399)
826
- \u2514\u2500\u2500 delta/ # \uBCC0\uACBD spec \uBB38\uC11C (\uAE30\uC900 \uB300\uBE44 \uCD94\uAC00/\uC218\uC815 \uC0AC\uD56D)
826
+ \u2514\u2500\u2500 initial-build/ # \uCD08\uAE30 \uAD6C\uCD95 spec \uBB38\uC11C
827
827
  \`\`\`
828
828
 
829
829
  ## \uC0AC\uC6A9 \uBC29\uBC95
@@ -835,19 +835,19 @@ specs/
835
835
  - \uD30C\uC77C\uBA85: \`<feature-name>.md\` (kebab-case)
836
836
  - \uB0B4\uC6A9: \uC694\uAD6C\uC0AC\uD56D, \uB3C4\uBA54\uC778 \uC6A9\uC5B4, \uC81C\uC57D \uC870\uAC74 \uB4F1
837
837
 
838
- ### delta
838
+ ### initial-build
839
839
 
840
- \uAE30\uC900 \uC2A4\uD399 \uB300\uBE44 \uBCC0\uACBD\uB418\uB294 \uB0B4\uC6A9\uC744 \`delta/\` \uB514\uB809\uD1A0\uB9AC\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4.
840
+ \uCD08\uAE30 \uAD6C\uCD95 \uBC94\uC704\uC640 \uAD6C\uD604 \uACC4\uD68D\uC744 \`initial-build/\` \uB514\uB809\uD1A0\uB9AC\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4.
841
841
 
842
842
  - \uD30C\uC77C\uBA85: \`<YYYYMMDD>-<feature-name>.md\`
843
- - \uB0B4\uC6A9: \uBCC0\uACBD \uC774\uC720, \uBCC0\uACBD \uC804/\uD6C4 \uBE44\uAD50, \uC601\uD5A5 \uBC94\uC704 \uB4F1
843
+ - \uB0B4\uC6A9: \uCD08\uAE30 \uAD6C\uD604 \uBC94\uC704, \uC0AC\uC6A9\uC790 \uD750\uB984, \uB370\uC774\uD130 \uBAA8\uB378, API \uACC4\uC57D, \uAC80\uC99D \uAE30\uC900 \uB4F1
844
844
  `;
845
845
 
846
846
  // src/core/spec-plan.ts
847
847
  var buildSpecInitPlan = () => [
848
848
  { relativePath: "specs/README.md", content: SPEC_README_TEMPLATE },
849
849
  { relativePath: "specs/baseline/.gitkeep", content: "" },
850
- { relativePath: "specs/delta/.gitkeep", content: "" }
850
+ { relativePath: "specs/initial-build/.gitkeep", content: "" }
851
851
  ];
852
852
 
853
853
  // src/core/uninstall-plan.ts
@@ -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└── delta/ # 변경 spec 문서 (기준 대비 추가/수정 사항)\n\\`\\`\\`\n\n## 사용 방법\n\n### baseline\n\n프로젝트의 초기 또는 확정된 스펙 문서를 \\`baseline/\\` 디렉토리에 저장합니다.\n\n- 파일명: \\`<feature-name>.md\\` (kebab-case)\n- 내용: 요구사항, 도메인 용어, 제약 조건 등\n\n### delta\n\n기준 스펙 대비 변경되는 내용을 \\`delta/\\` 디렉토리에 저장합니다.\n\n- 파일명: \\`<YYYYMMDD>-<feature-name>.md\\`\n- 내용: 변경 이유, 변경 전/후 비교, 영향 범위 등\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/delta/.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/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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-ops-cli",
3
- "version": "0.2.3",
3
+ "version": "0.2.6",
4
4
  "description": "CLI for ai-ops scaffolding — manage AI tool rules and presets",
5
5
  "license": "MIT",
6
6
  "repository": {