ai-ops-cli 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/index.js +39 -13
- package/dist/bin/index.js.map +1 -1
- package/package.json +1 -1
package/dist/bin/index.js.map
CHANGED
|
@@ -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/subagent.schema.ts","../../src/core/schemas/project-layer.schema.ts","../../src/core/subagent-paths.ts","../../src/core/schemas/subagent-catalog.schema.ts","../../src/core/schemas/subagent-manifest.schema.ts","../../src/core/schemas/pack.schema.ts","../../src/core/schemas/manifest.schema.ts","../../src/core/loader.ts","../../src/core/frontmatter.ts","../../src/core/subagent-toml.ts","../../src/core/renderer.ts","../../src/core/skill-renderer.ts","../../src/core/source-hash.ts","../../src/core/subagent-renderer.ts","../../src/core/managed-header.ts","../../src/core/manifest-io.ts","../../src/core/manifest-resolution.ts","../../src/core/skill-registry-io.ts","../../src/core/subagent-manifest-io.ts","../../src/core/install-plan.ts","../../src/core/project-layer.ts","../../src/core/paths.ts","../../src/core/pack.ts","../../src/core/uninstall-plan.ts","../../src/lib/paths.ts","../../src/commands/project-layer-errors.ts","../../src/commands/update.ts","../../src/commands/diff.ts","../../src/commands/audit.ts","../../src/commands/uninstall.ts","../../src/commands/skill.ts","../../src/lib/skill-state.ts","../../src/lib/skill-install.ts","../../src/commands/subagent.ts","../../src/lib/subagent-install.ts","../../src/lib/subagent-state.ts","../../src/commands/pack.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { initCommand } from '../commands/init.js';\nimport { updateCommand } from '../commands/update.js';\nimport { diffCommand } from '../commands/diff.js';\nimport { auditCommand } from '../commands/audit.js';\nimport { uninstallCommand } from '../commands/uninstall.js';\nimport {\n skillDiffCommand,\n skillInstallCommand,\n skillListCommand,\n skillUninstallCommand,\n skillUpdateCommand,\n} from '../commands/skill.js';\nimport {\n subagentDiffCommand,\n subagentInstallCommand,\n subagentListCommand,\n subagentUninstallCommand,\n subagentUpdateCommand,\n} from '../commands/subagent.js';\nimport {\n packDiffCommand,\n packInstallCommand,\n packListCommand,\n packUninstallCommand,\n packUpdateCommand,\n} from '../commands/pack.js';\n\nconst program = new Command();\n\nprogram.name('ai-ops').description('AI agent operating layer manager').version('0.1.0');\n\nprogram\n .command('init')\n .description('project operating layer 초기 설치')\n .option('--tool <tool...>', '대상 도구 adapter 지정 (codex|gemini|claude-code)')\n .action((opts: { tool?: string[] }) => initCommand(opts));\n\nprogram\n .command('update')\n .description('project operating layer 갱신')\n .option('--force', '변경 없어도 강제 재설치', false)\n .action((opts: { force: boolean }) => updateCommand(opts));\n\nprogram\n .command('diff')\n .description('project operating layer drift 비교')\n .action(() => diffCommand());\n\nprogram\n .command('audit')\n .description('project operating layer 상태 검사')\n .action(() => auditCommand());\n\nprogram\n .command('uninstall')\n .description('project operating layer 제거')\n .option('--yes', '확인 프롬프트 없이 제거', false)\n .action((opts: { yes?: boolean }) => uninstallCommand(opts));\n\nconst skillCommand = program.command('skill').description('에이전트 skill 설치/조회/갱신');\n\nconst applySkillInstallOptions = (command: Command): Command => command.option('--tool <tool...>', '대상 도구 지정');\n\nskillCommand.command('list').description('사용 가능한 skill 목록').action(() => skillListCommand());\n\napplySkillInstallOptions(skillCommand.command('install <skillId>').description('skill 설치')).action((skillId, opts) =>\n skillInstallCommand(skillId, opts),\n);\n\nskillCommand\n .command('diff [skillId]')\n .description('skill 변경 비교')\n .action((skillId) => skillDiffCommand(skillId));\n\nskillCommand\n .command('update [skillId]')\n .description('skill 갱신')\n .action((skillId) => skillUpdateCommand(skillId));\n\nskillCommand\n .command('uninstall <skillId>')\n .description('skill 제거')\n .action((skillId) => skillUninstallCommand(skillId));\n\nconst subagentCommand = program.command('subagent').description('에이전트 subagent 설치/조회/갱신');\n\nconst applySubagentInstallOptions = (command: Command): Command => command.option('--tool <tool...>', '대상 도구 지정');\n\nsubagentCommand.command('list').description('사용 가능한 subagent 목록').action(() => subagentListCommand());\n\napplySubagentInstallOptions(subagentCommand.command('install <subagentId>').description('subagent 설치')).action(\n (subagentId, opts) => subagentInstallCommand(subagentId, opts),\n);\n\nsubagentCommand\n .command('diff [subagentId]')\n .description('subagent 변경 비교')\n .action((subagentId) => subagentDiffCommand(subagentId));\n\nsubagentCommand\n .command('update [subagentId]')\n .description('subagent 갱신')\n .action((subagentId) => subagentUpdateCommand(subagentId));\n\nsubagentCommand\n .command('uninstall <subagentId>')\n .description('subagent 제거')\n .action((subagentId) => subagentUninstallCommand(subagentId));\n\nconst packCommand = program.command('pack').description('optional project operating layer pack 설치/조회/갱신');\n\npackCommand.command('list').description('사용 가능한 pack 목록').action(() => packListCommand());\n\npackCommand\n .command('install <packId>')\n .description('pack 설치')\n .action((packId) => packInstallCommand(packId));\n\npackCommand\n .command('diff [packId]')\n .description('pack 변경 비교')\n .action((packId) => packDiffCommand(packId));\n\npackCommand\n .command('update [packId]')\n .description('pack 갱신')\n .action((packId) => packUpdateCommand(packId));\n\npackCommand\n .command('uninstall <packId>')\n .description('pack 제거')\n .action((packId) => packUninstallCommand(packId));\n\nprogram.parse();\n","import * as p from '@clack/prompts';\nimport {\n installProjectLayer,\n readProjectLayerManifest,\n resolveProjectLayerTools,\n type ProjectLayerTool,\n} from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\nimport { reportInvalidProjectLayerManifest, reportProjectLayerApplyError } from './project-layer-errors.js';\n\ntype InitCommandOptions = {\n tool?: string[];\n};\n\nconst TOOL_OPTIONS = [\n { value: 'codex' as ProjectLayerTool, label: 'Codex' },\n { value: 'gemini' as ProjectLayerTool, label: 'Gemini CLI' },\n { value: 'claude-code' as ProjectLayerTool, label: 'Claude Code' },\n];\n\nconst promptTools = async (): Promise<ProjectLayerTool[] | null> => {\n const selectedTools = await p.multiselect<ProjectLayerTool>({\n message: 'AI 도구 adapter를 선택하세요',\n options: TOOL_OPTIONS,\n initialValues: TOOL_OPTIONS.map((option) => option.value),\n required: true,\n });\n\n return p.isCancel(selectedTools) ? null : resolveProjectLayerTools(selectedTools);\n};\n\nexport const initCommand = async (opts: InitCommandOptions = {}): Promise<void> => {\n p.intro('ai-ops init');\n const basePath = resolveBasePath();\n\n const tools = opts.tool && opts.tool.length > 0 ? resolveProjectLayerTools(opts.tool) : await promptTools();\n if (tools === null) {\n p.cancel('취소됨');\n process.exit(0);\n }\n\n let previousManifest: ReturnType<typeof readProjectLayerManifest>;\n try {\n previousManifest = readProjectLayerManifest(basePath);\n } catch (error) {\n reportInvalidProjectLayerManifest({ error, outro: 'ai-ops init 실패' });\n return;\n }\n\n let result: ReturnType<typeof installProjectLayer>;\n try {\n result = installProjectLayer({\n basePath,\n tools,\n previousManifest,\n });\n } catch (error) {\n reportProjectLayerApplyError({ error, outro: 'ai-ops init 실패' });\n return;\n }\n\n p.log.success(`project operating layer 설치 완료: ${result.manifest.managed_files.length + result.manifest.project_files.length}개 파일`);\n p.log.info(`도구 adapter: ${result.manifest.tools.join(', ')}`);\n if (result.appended.length > 0) {\n p.log.info(`기존 파일에 managed section 추가:\\n${result.appended.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.refreshedProjectFiles.length > 0) {\n p.log.info(`unmodified project-owned 파일 갱신:\\n${result.refreshedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preservedProjectFiles.length > 0) {\n p.log.info(`기존 project-owned 파일 보존:\\n${result.preservedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n\n p.outro('ai-ops init 완료');\n};\n","/**\n * Rule = SSOT의 최소 지식 단위. 하나의 코딩 컨벤션/아키텍처 규칙을 YAML로 구조화한 것.\n */\nimport { z } from 'zod';\n\nexport const DecisionTableEntrySchema = z\n .object({\n when: z.string().min(1),\n then: z.string().min(1),\n /** 조건부 규칙에서 회피해야 할 패턴 */\n avoid: z.string().min(1).optional(),\n })\n .strict();\n\nexport const RuleContentSchema = z\n .object({\n /** Anti-pattern 규칙 ('하지 마라'). guidelines보다 항상 상단 렌더링 */\n constraints: z.array(z.string().min(1)).default([]),\n /** Positive 규칙 ('해라') */\n guidelines: z.array(z.string().min(1)),\n /** 조건부 규칙. when→then→avoid 구조 */\n decision_table: z.array(DecisionTableEntrySchema).optional(),\n })\n .strict();\n\nexport const RuleSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n category: z.string().min(1),\n tags: z.array(z.string().min(1)),\n /** 0-100. 높을수록 생성 파일 상단 배치 (U-shaped attention 최적화) */\n priority: z.number().int().min(0).max(100),\n supported_tools: z.array(z.string().min(1)).min(1).default(['claude-code', 'codex', 'gemini']),\n content: RuleContentSchema,\n })\n .strict();\n\nexport type DecisionTableEntry = z.infer<typeof DecisionTableEntrySchema>;\nexport type RuleContent = z.infer<typeof RuleContentSchema>;\nexport type Rule = z.infer<typeof RuleSchema>;\n","import { z } from 'zod';\n\nexport const PresetSchema = z\n .object({\n id: z\n .string()\n .regex(/^[a-z][a-z0-9-]*$/)\n .min(1),\n description: z.string().min(1),\n rules: z.array(z.string().min(1)).min(1),\n })\n .strict();\n\nexport type Preset = z.infer<typeof PresetSchema>;\n","import { z } from 'zod';\n\nexport const SKILL_KIND = {\n REFERENCE: 'reference',\n TASK: 'task',\n} as const;\n\nexport const SKILL_TOOL = {\n CLAUDE_CODE: 'claude-code',\n CODEX: 'codex',\n GEMINI: 'gemini',\n} as const;\n\nexport const SkillKindSchema = z.union([z.literal(SKILL_KIND.REFERENCE), z.literal(SKILL_KIND.TASK)]);\nexport const SkillToolSchema = z.union([\n z.literal(SKILL_TOOL.CLAUDE_CODE),\n z.literal(SKILL_TOOL.CODEX),\n z.literal(SKILL_TOOL.GEMINI),\n]);\n\nexport const SkillFileSchema = z\n .object({\n path: z.string().min(1),\n content: z.string(),\n })\n .strict();\n\nexport const SkillFrontmatterSchema = z\n .object({\n name: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'name must be kebab-case'),\n description: z.string().min(1),\n })\n .passthrough();\n\nexport type SkillFile = z.infer<typeof SkillFileSchema>;\nexport type SkillFrontmatter = z.infer<typeof SkillFrontmatterSchema>;\nexport type Skill = {\n id: string;\n kind: z.infer<typeof SkillKindSchema>;\n description: string;\n supported_tools: z.infer<typeof SkillToolSchema>[];\n groups: string[];\n included_in_presets: string[];\n directory: string;\n files: SkillFile[];\n};\n\nexport const InstalledSkillSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n kind: SkillKindSchema,\n tools: z.array(SkillToolSchema).min(1),\n installed_paths: z.array(z.string().min(1)).min(1),\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n })\n .strip();\n\nexport type InstalledSkill = z.infer<typeof InstalledSkillSchema>;\n","import { z } from 'zod';\nimport { SkillKindSchema, SkillToolSchema } from './skill.schema.js';\n\nconst SkillIdSchema = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case');\nconst SkillCatalogPathSchema = z\n .string()\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*)+$/, 'source_path must be relative kebab-case path');\n\nexport const SkillCatalogEntrySchema = z\n .object({\n id: SkillIdSchema,\n kind: SkillKindSchema,\n supported_tools: z.array(SkillToolSchema).min(1),\n groups: z.array(z.string().min(1)),\n included_in_presets: z.array(z.string().min(1)),\n source_path: SkillCatalogPathSchema,\n })\n .strict()\n .superRefine((entry, ctx) => {\n const expectedPrefix = entry.kind === 'reference' ? 'reference-skills/' : 'task-skills/';\n\n if (!entry.source_path.startsWith(expectedPrefix)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['source_path'],\n message: `source_path must start with ${expectedPrefix}`,\n });\n }\n });\n\nexport const SkillCatalogSchema = z\n .object({\n skills: z.array(SkillCatalogEntrySchema),\n })\n .strict();\n\nexport type SkillCatalogEntry = z.infer<typeof SkillCatalogEntrySchema>;\nexport type SkillCatalog = z.infer<typeof SkillCatalogSchema>;\n","import { z } from 'zod';\nimport { InstalledSkillSchema } from './skill.schema.js';\n\nexport const SkillRegistrySchema = z\n .object({\n skills: z.array(InstalledSkillSchema),\n cliVersion: z.string().optional(),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type SkillRegistry = z.infer<typeof SkillRegistrySchema>;\n","import { z } from 'zod';\nimport { SkillToolSchema } from './skill.schema.js';\nimport { isSafeProjectLayerPath } from './project-layer.schema.js';\nimport { buildSubagentRelativePath } from '../subagent-paths.js';\n\nexport const SubagentIdSchema = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case');\n\nexport const SubagentMarkdownFrontmatterSchema = z\n .object({\n name: SubagentIdSchema,\n description: z.string().min(1),\n })\n .passthrough();\n\nconst TomlValueSchema = z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]);\nconst SubagentInstalledPathSchema = z\n .string()\n .min(1)\n .refine(isSafeProjectLayerPath, 'installed path must be safe relative path');\n\nexport const CodexSubagentFrontmatterSchema = z\n .object({\n name: SubagentIdSchema,\n description: z.string().min(1),\n skill_names: z.array(SubagentIdSchema).optional(),\n })\n .catchall(TomlValueSchema);\n\nexport type SubagentMarkdownFrontmatter = z.infer<typeof SubagentMarkdownFrontmatterSchema>;\nexport type CodexSubagentFrontmatter = z.infer<typeof CodexSubagentFrontmatterSchema>;\n\nexport type Subagent = {\n id: string;\n supported_tools: z.infer<typeof SkillToolSchema>[];\n source_path: string;\n directory: string;\n prompt: string;\n frontmatter: {\n claude: {\n raw: string;\n parsed: SubagentMarkdownFrontmatter;\n };\n codex: {\n raw: string;\n parsed: CodexSubagentFrontmatter;\n };\n gemini: {\n raw: string;\n parsed: SubagentMarkdownFrontmatter;\n };\n };\n};\n\nexport const InstalledSubagentSchema = z\n .object({\n id: SubagentIdSchema,\n tools: z.array(SkillToolSchema).min(1),\n installed_paths: z.array(SubagentInstalledPathSchema).min(1),\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n })\n .strip()\n .superRefine((subagent, ctx) => {\n const expectedPaths = new Set(subagent.tools.map((tool) => buildSubagentRelativePath(subagent.id, tool)));\n const installedPaths = new Set(subagent.installed_paths);\n\n if (installedPaths.size !== subagent.installed_paths.length) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['installed_paths'],\n message: 'installed_paths must not contain duplicates',\n });\n return;\n }\n\n if (installedPaths.size !== expectedPaths.size) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['installed_paths'],\n message: 'installed_paths must match id and tools',\n });\n return;\n }\n\n for (const installedPath of installedPaths) {\n if (!expectedPaths.has(installedPath)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['installed_paths'],\n message: 'installed_paths must match id and tools',\n });\n return;\n }\n }\n });\n\nexport type InstalledSubagent = z.infer<typeof InstalledSubagentSchema>;\n","import { z } from 'zod';\n\nexport const ProjectLayerToolSchema = z.enum(['claude-code', 'codex', 'gemini']);\n\nexport const ProjectLayerDocumentStatusSchema = z.enum(['Active', 'Reserved', 'Draft', 'Archived']);\n\nconst ShortHashSchema = z.string().regex(/^[a-f0-9]{6}$/, 'hash must be 6 lowercase hex chars');\n\nexport const isSafeProjectLayerPath = (value: string): boolean => {\n if (value.length === 0) return false;\n if (value.includes('\\0')) return false;\n if (value.includes('\\\\')) return false;\n if (value.startsWith('/')) return false;\n if (/^[A-Za-z]:/.test(value)) return false;\n\n const segments = value.split('/');\n return segments.every((segment) => segment.length > 0 && segment !== '.' && segment !== '..');\n};\n\nconst ProjectLayerPathSchema = z\n .string()\n .min(1)\n .refine(isSafeProjectLayerPath, 'path must be a safe project-relative path');\n\nexport const ProjectLayerFrontmatterSchema = z\n .object({\n status: ProjectLayerDocumentStatusSchema,\n layer: z.string().min(1),\n owner: z.string().min(1),\n read_when: z.array(z.string().min(1)).min(1),\n update_when: z.array(z.string().min(1)).min(1),\n })\n .strict();\n\nexport const ProjectLayerManagedFileSchema = z\n .object({\n path: ProjectLayerPathSchema,\n sourceHash: ShortHashSchema,\n })\n .strict();\n\nexport const ProjectLayerProjectFileSchema = z\n .object({\n path: ProjectLayerPathSchema,\n templateHash: ShortHashSchema,\n created: z.boolean(),\n })\n .strict();\n\nexport const ProjectLayerPackFileRecordSchema = z\n .object({\n path: ProjectLayerPathSchema,\n sourceHash: ShortHashSchema,\n })\n .strict();\n\nexport const ProjectLayerPackRecordSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n sourceHash: ShortHashSchema,\n documents: z.array(ProjectLayerPackFileRecordSchema),\n files: z.array(ProjectLayerPackFileRecordSchema),\n installedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport const ProjectLayerManifestSchema = z\n .object({\n schemaVersion: z.literal(1),\n kind: z.literal('project-operating-layer'),\n tools: z.array(ProjectLayerToolSchema).min(1),\n managed_files: z.array(ProjectLayerManagedFileSchema),\n project_files: z.array(ProjectLayerProjectFileSchema),\n packs: z.array(ProjectLayerPackRecordSchema).default([]),\n settings: z.record(z.unknown()),\n sourceHash: ShortHashSchema,\n cliVersion: z.string().min(1),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport const ProjectLayerContextDocumentSchema = ProjectLayerFrontmatterSchema.extend({\n path: ProjectLayerPathSchema,\n contentHash: ShortHashSchema,\n}).strict();\n\nexport const ProjectLayerContextIndexSchema = z\n .object({\n schemaVersion: z.literal(1),\n kind: z.literal('context-layer-index'),\n documents: z.array(ProjectLayerContextDocumentSchema),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type ProjectLayerTool = z.infer<typeof ProjectLayerToolSchema>;\nexport type ProjectLayerDocumentStatus = z.infer<typeof ProjectLayerDocumentStatusSchema>;\nexport type ProjectLayerFrontmatter = z.infer<typeof ProjectLayerFrontmatterSchema>;\nexport type ProjectLayerManagedFile = z.infer<typeof ProjectLayerManagedFileSchema>;\nexport type ProjectLayerProjectFile = z.infer<typeof ProjectLayerProjectFileSchema>;\nexport type ProjectLayerPackFileRecord = z.infer<typeof ProjectLayerPackFileRecordSchema>;\nexport type ProjectLayerPackRecord = z.infer<typeof ProjectLayerPackRecordSchema>;\nexport type ProjectLayerManifest = z.infer<typeof ProjectLayerManifestSchema>;\nexport type ProjectLayerContextDocument = z.infer<typeof ProjectLayerContextDocumentSchema>;\nexport type ProjectLayerContextIndex = z.infer<typeof ProjectLayerContextIndexSchema>;\n","import { join } from 'node:path';\nimport type { ToolId } from './tool-output.js';\n\nconst SUBAGENT_TOOL_OUTPUTS: Readonly<Record<ToolId, { dir: string; extension: string }>> = {\n 'claude-code': {\n dir: '.claude/agents',\n extension: '.md',\n },\n codex: {\n dir: '.codex/agents',\n extension: '.toml',\n },\n gemini: {\n dir: '.gemini/agents',\n extension: '.md',\n },\n} as const;\n\nexport const buildSubagentRelativePath = (subagentId: string, toolId: ToolId): string => {\n const output = SUBAGENT_TOOL_OUTPUTS[toolId];\n return join(output.dir, `${subagentId}${output.extension}`);\n};\n","import { z } from 'zod';\nimport { SkillToolSchema } from './skill.schema.js';\nimport { SubagentIdSchema } from './subagent.schema.js';\n\nconst SubagentCatalogPathSchema = z\n .string()\n .regex(\n /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*)*$/,\n 'source_path must be relative kebab-case path',\n );\n\nexport const SubagentCatalogEntrySchema = z\n .object({\n id: SubagentIdSchema,\n supported_tools: z.array(SkillToolSchema).min(1),\n source_path: SubagentCatalogPathSchema,\n })\n .strict();\n\nexport const SubagentCatalogSchema = z\n .object({\n subagents: z.array(SubagentCatalogEntrySchema),\n })\n .strict();\n\nexport type SubagentCatalogEntry = z.infer<typeof SubagentCatalogEntrySchema>;\nexport type SubagentCatalog = z.infer<typeof SubagentCatalogSchema>;\n","import { z } from 'zod';\nimport { InstalledSubagentSchema } from './subagent.schema.js';\n\nexport const SubagentManifestSchema = z\n .object({\n subagents: z.array(InstalledSubagentSchema),\n cliVersion: z.string().optional(),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type SubagentManifest = z.infer<typeof SubagentManifestSchema>;\n","import { z } from 'zod';\n\nconst PackIdSchema = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case');\nconst PackSourcePathSchema = z\n .string()\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*)*$/, 'source_path must be relative kebab-case path');\n\nexport const PackCatalogEntrySchema = z\n .object({\n id: PackIdSchema,\n source_path: PackSourcePathSchema,\n })\n .strict();\n\nexport const PackCatalogSchema = z\n .object({\n packs: z.array(PackCatalogEntrySchema),\n })\n .strict();\n\nexport type PackCatalogEntry = z.infer<typeof PackCatalogEntrySchema>;\nexport type PackCatalog = z.infer<typeof PackCatalogSchema>;\n","/**\n * Manifest = 설치 추적 메타데이터. CLI가 이전 설치 상태를 기억하기 위한 JSON.\n */\nimport { z } from 'zod';\nimport { InstalledSkillSchema } from './skill.schema.js';\n\nexport const SCOPES = {\n PROJECT: 'project',\n} as const;\n\n/** init/update 시 선택된 settings 항목 추적 */\nconst SettingsConfigSchema = z\n .object({\n claude: z.array(z.string().min(1)).optional(),\n gemini: z.array(z.string().min(1)).optional(),\n prettierignore: z.boolean().optional(),\n })\n .strict();\n\nexport type SettingsConfig = z.infer<typeof SettingsConfigSchema>;\n\n/** 모노레포 워크스페이스별 preset + rules 추적 */\nconst WorkspaceEntrySchema = z\n .object({\n preset: z.string().min(1),\n rules: z.array(z.string().min(1)),\n })\n .strict();\n\nexport type WorkspaceEntry = z.infer<typeof WorkspaceEntrySchema>;\n\nexport const ManifestSchema = z\n .object({\n tools: z.array(z.string().min(1)).min(1),\n scope: z.literal('project'),\n /** 비모노레포 단일 preset */\n preset: z.string().min(1).optional(),\n /** 모노레포: workspace path → { preset, rules } */\n workspaces: z.record(z.string(), WorkspaceEntrySchema).optional(),\n installed_rules: z.array(z.string().min(1)),\n /** 실제 디스크에 쓰여진 파일 상대 경로 목록 (uninstall용). 기존 manifest 호환성 위해 optional */\n installed_files: z.array(z.string().min(1)).optional(),\n /** skill 설치 루트 디렉토리 목록 */\n installed_skills: z.array(InstalledSkillSchema).optional(),\n /** non-managed 파일에 섹션을 append한 경우 추적 (uninstall 시 섹션만 제거) */\n appended_files: z.array(z.string().min(1)).optional(),\n /** init 시 선택된 settings 항목 — update 시 재생성에 사용 */\n settings: SettingsConfigSchema.optional(),\n /** init/update 실행 시점의 CLI 패키지 버전 — 버전 변경 감지에 사용 */\n cliVersion: z.string().optional(),\n /** SSOT 데이터 파일들의 deterministic SHA-256 해시 (6자리 hex). diff/update 판단 기준 */\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n","import { readFileSync, readdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { parse } from 'yaml';\nimport { parseMarkdownFrontmatter } from './frontmatter.js';\nimport { parseFlatToml } from './subagent-toml.js';\nimport {\n CodexSubagentFrontmatterSchema,\n RuleSchema,\n PresetSchema,\n SkillCatalogSchema,\n SkillFrontmatterSchema,\n SubagentCatalogSchema,\n SubagentMarkdownFrontmatterSchema,\n} from './schemas/index.js';\nimport type { Rule, Preset, Skill, SkillCatalog, Subagent, SubagentCatalog } from './schemas/index.js';\n\n// priority 내림차순 정렬 (높을수록 상단 → U-shaped attention)\nexport const sortRulesByPriority = (rules: readonly Rule[]): Rule[] =>\n [...rules].sort((a, b) => b.priority - a.priority);\n\nconst deduplicateRulesById = (rules: readonly Rule[]): Rule[] => {\n const seen = new Set<string>();\n return rules.filter((rule) => {\n if (seen.has(rule.id)) return false;\n seen.add(rule.id);\n return true;\n });\n};\n\nconst resolveRuleById = (ruleId: string, allRules: readonly Rule[], context?: string): Rule => {\n const found = allRules.find((rule) => rule.id === ruleId);\n if (!found) {\n const suffix = context ? ` (from ${context})` : '';\n throw new Error(`Rule not found: ${ruleId}${suffix}`);\n }\n return found;\n};\n\n// legacy preset Record<id, {description, rules}> → Preset[] 변환\nexport const parseRawPresets = (raw: Record<string, { description: string; rules: string[] }>): Preset[] =>\n Object.entries(raw).map(([id, value]) => PresetSchema.parse({ id, ...value }));\n\n// preset.rules 목록을 실제 core rule로 해석 + priority 정렬, 누락 시 throw\nexport const resolvePresetRules = (preset: Preset, allRules: readonly Rule[]): Rule[] => {\n const resolved = preset.rules.map((ruleId) => resolveRuleById(ruleId, allRules, preset.id));\n return sortRulesByPriority(deduplicateRulesById(resolved));\n};\n\nexport const resolvePresetSkills = (preset: Preset, allSkills: readonly Skill[]): Skill[] => {\n return allSkills\n .filter((skill) => skill.included_in_presets.includes(preset.id))\n .sort((a, b) => a.id.localeCompare(b.id));\n};\n\nexport const loadRuleFile = (filePath: string): Rule => {\n const raw = readFileSync(filePath, 'utf-8');\n return RuleSchema.parse(parse(raw));\n};\n\nconst loadSkillDirectoryFiles = (skillDir: string): Skill['files'] => {\n const files: Skill['files'] = [];\n\n const walk = (relativeDir = ''): void => {\n const absDir = relativeDir.length > 0 ? join(skillDir, relativeDir) : skillDir;\n const entries = readdirSync(absDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const nextRelativePath = relativeDir.length > 0 ? join(relativeDir, entry.name) : entry.name;\n if (entry.isDirectory()) {\n walk(nextRelativePath);\n continue;\n }\n\n files.push({\n path: nextRelativePath,\n content: readFileSync(join(skillDir, nextRelativePath), 'utf-8'),\n });\n }\n };\n\n walk();\n return files;\n};\n\n// readdirSync + .yaml 필터 + 파일명 sort(결정적 로딩) → priority 내림차순\nexport const loadAllRules = (rulesDir: string): Rule[] => {\n const files = readdirSync(rulesDir)\n .filter((f) => f.endsWith('.yaml'))\n .sort();\n const rules = files.map((f) => loadRuleFile(resolve(rulesDir, f)));\n return sortRulesByPriority(rules);\n};\n\nexport const loadSkillCatalog = (skillsDir: string): SkillCatalog =>\n SkillCatalogSchema.parse(JSON.parse(readFileSync(resolve(skillsDir, 'skill-registry.json'), 'utf-8')));\n\nexport const loadAllSkills = (skillsDir: string): Skill[] => {\n const catalog = loadSkillCatalog(skillsDir);\n const entries = [...catalog.skills].sort((a, b) => a.id.localeCompare(b.id));\n\n return entries.map((entry) => {\n const directory = resolve(skillsDir, entry.source_path);\n const skillMdPath = join(directory, 'SKILL.md');\n const rawSkillMd = readFileSync(skillMdPath, 'utf-8');\n const { frontmatter } = parseMarkdownFrontmatter(rawSkillMd);\n const parsed = SkillFrontmatterSchema.parse(frontmatter);\n if (parsed.name !== entry.id) {\n throw new Error(`Skill directory and frontmatter name mismatch: ${entry.id} != ${parsed.name}`);\n }\n\n const files = loadSkillDirectoryFiles(directory);\n if (entry.kind === 'reference' && !files.some((file) => file.path === 'references/reference.md')) {\n throw new Error(`Reference skill must include references/reference.md: ${parsed.name}`);\n }\n\n return {\n id: entry.id,\n kind: entry.kind,\n description: parsed.description,\n supported_tools: [...entry.supported_tools],\n groups: [...entry.groups],\n included_in_presets: [...entry.included_in_presets],\n directory,\n files,\n };\n });\n};\n\nconst readRequiredTextFile = (filePath: string): string => {\n try {\n return readFileSync(filePath, 'utf-8');\n } catch (error) {\n const cause = error instanceof Error ? `: ${error.message}` : '';\n throw new Error(`Required subagent source file is missing: ${filePath}${cause}`);\n }\n};\n\nconst assertSubagentFrontmatterName = (params: { id: string; tool: string; name: string }): void => {\n if (params.name !== params.id) {\n throw new Error(`Subagent ${params.tool} frontmatter name mismatch: ${params.id} != ${params.name}`);\n }\n};\n\nexport const loadSubagentCatalog = (subagentsDir: string): SubagentCatalog =>\n SubagentCatalogSchema.parse(JSON.parse(readFileSync(resolve(subagentsDir, 'subagent-registry.json'), 'utf-8')));\n\nexport const loadAllSubagents = (subagentsDir: string): Subagent[] => {\n const catalog = loadSubagentCatalog(subagentsDir);\n const entries = [...catalog.subagents].sort((a, b) => a.id.localeCompare(b.id));\n\n return entries.map((entry) => {\n const directory = resolve(subagentsDir, entry.source_path);\n const prompt = readRequiredTextFile(join(directory, 'PROMPT.md'));\n const claudeRaw = readRequiredTextFile(join(directory, 'claude.frontmatter.yaml'));\n const codexRaw = readRequiredTextFile(join(directory, 'codex.frontmatter.toml'));\n const geminiRaw = readRequiredTextFile(join(directory, 'gemini.frontmatter.yaml'));\n const claude = SubagentMarkdownFrontmatterSchema.parse(parse(claudeRaw));\n const codex = CodexSubagentFrontmatterSchema.parse(parseFlatToml(codexRaw));\n const gemini = SubagentMarkdownFrontmatterSchema.parse(parse(geminiRaw));\n\n assertSubagentFrontmatterName({ id: entry.id, tool: 'claude', name: claude.name });\n assertSubagentFrontmatterName({ id: entry.id, tool: 'codex', name: codex.name });\n assertSubagentFrontmatterName({ id: entry.id, tool: 'gemini', name: gemini.name });\n\n return {\n id: entry.id,\n supported_tools: [...entry.supported_tools],\n source_path: entry.source_path,\n directory,\n prompt,\n frontmatter: {\n claude: {\n raw: claudeRaw,\n parsed: claude,\n },\n codex: {\n raw: codexRaw,\n parsed: codex,\n },\n gemini: {\n raw: geminiRaw,\n parsed: gemini,\n },\n },\n };\n });\n};\n\nexport const loadPresets = (presetsPath: string): Preset[] => {\n const raw = readFileSync(presetsPath, 'utf-8');\n const data = parse(raw) as Record<string, { description: string; rules: string[] }>;\n return parseRawPresets(data);\n};\n","import { parse } from 'yaml';\n\nexport const parseMarkdownFrontmatter = (content: string): { frontmatter: unknown; body: string } => {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n?/);\n if (!match) {\n throw new Error('Missing YAML frontmatter');\n }\n\n return {\n frontmatter: parse(match[1]),\n body: content.slice(match[0].length),\n };\n};\n","type TomlPrimitive = string | number | boolean | string[];\n\nconst parseTomlValue = (value: string): TomlPrimitive => {\n const trimmed = value.trim();\n\n if (trimmed.startsWith('\"') || trimmed.startsWith('[')) {\n const parsed = JSON.parse(trimmed) as unknown;\n if (typeof parsed === 'string') {\n return parsed;\n }\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === 'string')) {\n return parsed;\n }\n throw new Error(`Unsupported TOML value: ${value}`);\n }\n\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n\n const numericValue = Number(trimmed);\n if (Number.isFinite(numericValue)) {\n return numericValue;\n }\n\n throw new Error(`Unsupported TOML value: ${value}`);\n};\n\nexport const parseFlatToml = (content: string): Record<string, TomlPrimitive> => {\n const result: Record<string, TomlPrimitive> = {};\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0 || trimmed.startsWith('#')) {\n continue;\n }\n\n const match = trimmed.match(/^([A-Za-z0-9_-]+)\\s*=\\s*(.+)$/);\n if (!match) {\n throw new Error(`Unsupported TOML line: ${line}`);\n }\n\n const [, key, value] = match;\n result[key] = parseTomlValue(value);\n }\n\n return result;\n};\n\nconst renderTomlValue = (value: TomlPrimitive): string => {\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return `[${value.map((item) => JSON.stringify(item)).join(', ')}]`;\n};\n\nexport const renderFlatToml = (entries: readonly [string, TomlPrimitive][]): string =>\n entries.map(([key, value]) => `${key} = ${renderTomlValue(value)}`).join('\\n');\n","import { join } from 'node:path';\nimport type { Rule, DecisionTableEntry } from './schemas/index.js';\nimport { GLOBAL_CATEGORIES, CLAUDE_CODE_PATH_GLOBS, TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { ToolId } from './tool-output.js';\n\n// \"react-typescript\" → \"React Typescript\"\nexport const ruleIdToTitle = (id: string): string =>\n id\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n\n// DecisionTableEntry[] → Markdown 테이블 (pipe 문자 | escape)\nexport const renderDecisionTable = (entries: readonly DecisionTableEntry[]): string => {\n const escape = (s: string) => s.replace(/\\|/g, '|');\n const hasAvoid = entries.some((e) => e.avoid !== undefined);\n\n const header = hasAvoid ? '| When | Then | Avoid |\\n|------|------|-------|' : '| When | Then |\\n|------|------|';\n\n const rows = entries.map((e) => {\n const when = escape(e.when);\n const then = escape(e.then);\n if (hasAvoid) {\n const avoid = e.avoid ? escape(e.avoid) : '';\n return `| ${when} | ${then} | ${avoid} |`;\n }\n return `| ${when} | ${then} |`;\n });\n\n return [header, ...rows].join('\\n');\n};\n\n// 단일 Rule → Markdown (빈 섹션 생략)\nexport const renderRuleToMarkdown = (rule: Rule): string => {\n const sections: string[] = [`# ${ruleIdToTitle(rule.id)}`];\n\n if (rule.content.constraints.length > 0) {\n sections.push('## Constraints');\n sections.push(rule.content.constraints.map((c) => `- ${c}`).join('\\n'));\n }\n\n if (rule.content.guidelines.length > 0) {\n sections.push('## Guidelines');\n sections.push(rule.content.guidelines.map((g) => `- ${g}`).join('\\n'));\n }\n\n if (rule.content.decision_table && rule.content.decision_table.length > 0) {\n sections.push('## Decision Table');\n sections.push(renderDecisionTable(rule.content.decision_table));\n }\n\n return sections.join('\\n\\n');\n};\n\n// Rule[] → 단일 Markdown (--- separator, single-file 모드용)\nexport const renderRulesToMarkdown = (rules: readonly Rule[]): string =>\n rules.map((rule) => renderRuleToMarkdown(rule)).join('\\n\\n---\\n\\n');\n\n// Rule이 global 카테고리에 속하는지 판별\nexport const isGlobalRule = (rule: Rule): boolean => (GLOBAL_CATEGORIES as readonly string[]).includes(rule.category);\n\n// Rule[] → { global, domain } 분리\nexport const partitionRules = (rules: readonly Rule[]): { global: Rule[]; domain: Rule[] } => {\n const global: Rule[] = [];\n const domain: Rule[] = [];\n for (const rule of rules) {\n if (isGlobalRule(rule)) {\n global.push(rule);\n } else {\n domain.push(rule);\n }\n }\n return { global, domain };\n};\n\n// glob 배열 → YAML frontmatter 블록\nexport const renderFrontmatter = (paths: readonly string[]): string => {\n const lines = paths.map((p) => ` - \"${p}\"`).join('\\n');\n return `---\\npaths:\\n${lines}\\n---`;\n};\n\nexport type WorkspaceMapping = {\n path: string;\n ruleIds: readonly string[];\n};\n\n// 단일 Rule → Claude Code용 Markdown\n// domain 룰이면서 glob 매핑이 있으면 paths: frontmatter 추가 (단일 프로젝트 전용)\n// global 룰 또는 매핑 없는 domain 룰 → frontmatter 없음\nexport const renderClaudeCodeRule = (rule: Rule): string => {\n const globs = CLAUDE_CODE_PATH_GLOBS[rule.id];\n if (!isGlobalRule(rule) && globs !== undefined) {\n return `${renderFrontmatter(globs)}\\n\\n${renderRuleToMarkdown(rule)}`;\n }\n return renderRuleToMarkdown(rule);\n};\n\n// 도구별 렌더링 결과 타입 (tagged union)\nexport type ClaudeCodeRenderResult = {\n tool: 'claude-code';\n files: { relativePath: string; content: string }[];\n};\n\nexport type CodexRenderResult = {\n tool: 'codex';\n rootContent: string;\n domainFiles: { workspacePath: string; content: string }[];\n};\n\nexport type GeminiRenderResult = {\n tool: 'gemini';\n rootContent: string;\n domainFiles: { workspacePath: string; content: string }[];\n};\n\nexport type ToolRenderResult = ClaudeCodeRenderResult | CodexRenderResult | GeminiRenderResult;\n\n// CLI 진입점: toolId + rules → 도구별 렌더링 결과\nexport const renderForTool = (\n toolId: ToolId,\n rules: readonly Rule[],\n workspaceMappings?: readonly WorkspaceMapping[],\n): ToolRenderResult => {\n const config = TOOL_OUTPUT_MAP[toolId];\n\n if (toolId === 'claude-code') {\n const { rulesDir, fileExtension } = config as (typeof TOOL_OUTPUT_MAP)['claude-code'];\n\n if (!workspaceMappings || workspaceMappings.length === 0) {\n // 단일 프로젝트: domain 룰에 paths: frontmatter (path-scoped)\n const files = rules.map((rule) => ({\n relativePath: join(rulesDir, `${rule.id}${fileExtension}`),\n content: renderClaudeCodeRule(rule),\n }));\n return { tool: 'claude-code', files };\n }\n\n // 모노레포: global → .claude/rules/, domain → {workspace}/CLAUDE.md (진짜 지연 로딩)\n const { global, domain } = partitionRules(rules);\n\n const globalFiles = global.map((rule) => ({\n relativePath: join(rulesDir, `${rule.id}${fileExtension}`),\n content: renderRuleToMarkdown(rule), // global은 frontmatter 불필요\n }));\n\n const workspaceFiles: { relativePath: string; content: string }[] = [];\n for (const ws of workspaceMappings) {\n const wsRules = domain.filter((r) => ws.ruleIds.includes(r.id));\n if (wsRules.length === 0) continue;\n workspaceFiles.push({\n relativePath: join(ws.path, 'CLAUDE.md'),\n content: renderRulesToMarkdown(wsRules),\n });\n }\n\n return { tool: 'claude-code', files: [...globalFiles, ...workspaceFiles] };\n }\n\n if (!workspaceMappings || workspaceMappings.length === 0) {\n // 단일 프로젝트: 모든 룰(global + domain)을 rootContent 하나로 합침\n const rootContent = renderRulesToMarkdown(rules);\n const domainFiles: { workspacePath: string; content: string }[] = [];\n\n if (toolId === 'codex') return { tool: 'codex', rootContent, domainFiles };\n return { tool: 'gemini', rootContent, domainFiles };\n }\n\n // 모노레포: global → rootContent, domain → workspace별 파일\n const { global, domain } = partitionRules(rules);\n const rootContent = renderRulesToMarkdown(global);\n const domainFiles: { workspacePath: string; content: string }[] = [];\n for (const ws of workspaceMappings) {\n const wsRules = domain.filter((r) => ws.ruleIds.includes(r.id));\n if (wsRules.length === 0) continue;\n domainFiles.push({\n workspacePath: ws.path,\n content: renderRulesToMarkdown(wsRules),\n });\n }\n\n if (toolId === 'codex') {\n return { tool: 'codex', rootContent, domainFiles };\n }\n\n // gemini\n return { tool: 'gemini', rootContent, domainFiles };\n};\n","import { join } from 'node:path';\nimport { computeInstalledSkillHash } from './source-hash.js';\nimport type { Skill, InstalledSkill } from './schemas/index.js';\nimport type { ToolId } from './tool-output.js';\n\nconst AGENT_SKILLS_DIR = '.agents/skills';\nconst CLAUDE_SKILLS_DIR = '.claude/skills';\n\ntype SkillPackageFile = {\n relativePath: string;\n content: string;\n};\n\nexport type SkillPackage = {\n skillId: string;\n rootDir: string;\n files: SkillPackageFile[];\n};\n\nconst buildRootDirs = (skillId: string, toolIds: readonly ToolId[]): string[] => {\n const dirs: string[] = [];\n if (toolIds.some((toolId) => toolId === 'codex' || toolId === 'gemini')) {\n dirs.push(join(AGENT_SKILLS_DIR, skillId));\n }\n if (toolIds.includes('claude-code')) {\n dirs.push(join(CLAUDE_SKILLS_DIR, skillId));\n }\n return dirs;\n};\n\nconst normalizeSelectedTools = (skill: Skill, requestedTools: readonly ToolId[]): ToolId[] => {\n const supportedToolSet = new Set(skill.supported_tools);\n return requestedTools.filter((toolId) => supportedToolSet.has(toolId));\n};\n\nexport const buildSkillInstallPlan = (params: {\n skill: Skill;\n requestedTools: readonly ToolId[];\n}): { packages: SkillPackage[]; installedSkill: InstalledSkill } => {\n const selectedTools = normalizeSelectedTools(params.skill, params.requestedTools);\n if (selectedTools.length === 0) {\n throw new Error(`Skill ${params.skill.id} does not support the requested tools`);\n }\n\n const rootDirs = buildRootDirs(params.skill.id, selectedTools);\n const skillHash = computeInstalledSkillHash({\n kind: params.skill.kind,\n description: params.skill.description,\n tools: selectedTools,\n files: params.skill.files.map((file) => `${file.path}:${file.content}`),\n });\n\n const packages = rootDirs.map((rootDir) => {\n const files: SkillPackageFile[] = params.skill.files.map((file) => ({\n relativePath: join(rootDir, file.path),\n content: file.content,\n }));\n\n return {\n skillId: params.skill.id,\n rootDir,\n files,\n };\n });\n\n return {\n packages,\n installedSkill: {\n id: params.skill.id,\n kind: params.skill.kind,\n tools: selectedTools,\n installed_paths: rootDirs,\n sourceHash: skillHash,\n },\n };\n};\n","import { createHash } from 'node:crypto';\nimport { 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 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\n// compiler data 전체(context-layer, skills, packs, subagents) 해시\nexport const computeSourceHash = (dataDir: string): string => {\n return computeHash(loadDirectoryContents(resolve(dataDir)));\n};\n\nexport const computeInstalledSkillHash = (params: {\n kind: InstalledSkill['kind'];\n description: string;\n tools: readonly string[];\n files: readonly string[];\n}): string => computeHash([params.kind, params.description, ...[...params.tools].sort(), ...[...params.files].sort()]);\n\nexport const computeInstalledSubagentHash = (params: {\n id: string;\n tools: readonly string[];\n prompt: string;\n metadataFiles: readonly string[];\n}): string => computeHash([params.id, params.prompt, ...[...params.tools].sort(), ...[...params.metadataFiles].sort()]);\n\n// Manifest Builder (Pure, 단 generatedAt에 현재 시각 사용)\nexport const buildManifest = (params: {\n tools: readonly string[];\n scope: 'project';\n preset?: string;\n workspaces?: Record<string, { preset: string; rules: string[] }>;\n installedRules: readonly string[];\n installedFiles?: readonly string[];\n installedSkills?: readonly InstalledSkill[];\n appendedFiles?: readonly string[];\n settings?: { claude?: readonly string[]; gemini?: readonly string[]; prettierignore?: boolean };\n cliVersion?: string;\n sourceHash: string;\n}): Manifest =>\n ManifestSchema.parse({\n tools: [...params.tools],\n scope: params.scope,\n preset: params.preset,\n workspaces: params.workspaces,\n installed_rules: [...params.installedRules],\n installed_files: params.installedFiles ? [...params.installedFiles] : undefined,\n installed_skills: params.installedSkills ? [...params.installedSkills] : undefined,\n appended_files: params.appendedFiles && params.appendedFiles.length > 0 ? [...params.appendedFiles] : undefined,\n settings: params.settings\n ? {\n claude: params.settings.claude ? [...params.settings.claude] : undefined,\n gemini: params.settings.gemini ? [...params.settings.gemini] : undefined,\n prettierignore: params.settings.prettierignore,\n }\n : undefined,\n cliVersion: params.cliVersion,\n sourceHash: params.sourceHash,\n generatedAt: new Date().toISOString(),\n });\n","import { resolve } from 'node:path';\nimport { computeInstalledSubagentHash } from './source-hash.js';\nimport { buildSubagentRelativePath } from './subagent-paths.js';\nimport { renderFlatToml } from './subagent-toml.js';\nimport type { CodexSubagentFrontmatter, InstalledSubagent, Subagent } from './schemas/index.js';\nimport type { ToolId } from './tool-output.js';\n\ntype SubagentPackageFile = {\n relativePath: string;\n content: string;\n};\n\nexport type SubagentPackage = {\n subagentId: string;\n files: SubagentPackageFile[];\n};\n\nexport type RequiredSubagentSkill = {\n tool: ToolId;\n skillName: string;\n path: string;\n};\n\nconst normalizeSelectedTools = (subagent: Subagent, requestedTools: readonly ToolId[]): ToolId[] => {\n const supportedToolSet = new Set(subagent.supported_tools);\n return requestedTools.filter((toolId) => supportedToolSet.has(toolId));\n};\n\nconst renderMarkdownSubagent = (params: { rawFrontmatter: string; prompt: string }): string =>\n `---\\n${params.rawFrontmatter.trimEnd()}\\n---\\n\\n${params.prompt.trimEnd()}\\n`;\n\nconst getCodexTomlEntries = (frontmatter: CodexSubagentFrontmatter): [string, string | number | boolean | string[]][] =>\n Object.entries(frontmatter).filter(\n (entry): entry is [string, string | number | boolean | string[]] =>\n entry[0] !== 'skill_names' &&\n (typeof entry[1] === 'string' ||\n typeof entry[1] === 'number' ||\n typeof entry[1] === 'boolean' ||\n (Array.isArray(entry[1]) && entry[1].every((item) => typeof item === 'string'))),\n );\n\nconst renderCodexSubagent = (params: {\n frontmatter: CodexSubagentFrontmatter;\n prompt: string;\n userBasePath: string;\n}): string => {\n const metadata = renderFlatToml(getCodexTomlEntries(params.frontmatter));\n const skills = (params.frontmatter.skill_names ?? []).map((skillName) => {\n const skillPath = resolve(params.userBasePath, '.agents', 'skills', skillName, 'SKILL.md');\n return `[[skills.config]]\\npath = ${JSON.stringify(skillPath)}\\nenabled = true`;\n });\n const sections = [\n metadata,\n `developer_instructions = ${JSON.stringify(params.prompt.trimEnd())}`,\n ...skills,\n ].filter((section) => section.length > 0);\n\n return sections.join('\\n\\n') + '\\n';\n};\n\nconst renderSubagentForTool = (params: { subagent: Subagent; toolId: ToolId; userBasePath: string }): string => {\n if (params.toolId === 'claude-code') {\n return renderMarkdownSubagent({\n rawFrontmatter: params.subagent.frontmatter.claude.raw,\n prompt: params.subagent.prompt,\n });\n }\n\n if (params.toolId === 'gemini') {\n return renderMarkdownSubagent({\n rawFrontmatter: params.subagent.frontmatter.gemini.raw,\n prompt: params.subagent.prompt,\n });\n }\n\n return renderCodexSubagent({\n frontmatter: params.subagent.frontmatter.codex.parsed,\n prompt: params.subagent.prompt,\n userBasePath: params.userBasePath,\n });\n};\n\nconst getSelectedMetadataFiles = (subagent: Subagent, selectedTools: readonly ToolId[]): string[] =>\n selectedTools.map((toolId) => {\n if (toolId === 'claude-code') return `claude:${subagent.frontmatter.claude.raw}`;\n if (toolId === 'gemini') return `gemini:${subagent.frontmatter.gemini.raw}`;\n return `codex:${subagent.frontmatter.codex.raw}`;\n });\n\nconst getStringArray = (value: unknown): string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter((item): item is string => typeof item === 'string');\n};\n\nconst buildRequiredSubagentSkills = (params: {\n subagent: Subagent;\n selectedTools: readonly ToolId[];\n userBasePath: string;\n}): RequiredSubagentSkill[] => {\n const required: RequiredSubagentSkill[] = [];\n\n if (params.selectedTools.includes('codex')) {\n for (const skillName of params.subagent.frontmatter.codex.parsed.skill_names ?? []) {\n required.push({\n tool: 'codex',\n skillName,\n path: resolve(params.userBasePath, '.agents', 'skills', skillName, 'SKILL.md'),\n });\n }\n }\n\n if (params.selectedTools.includes('claude-code')) {\n for (const skillName of getStringArray(params.subagent.frontmatter.claude.parsed['skills'])) {\n required.push({\n tool: 'claude-code',\n skillName,\n path: resolve(params.userBasePath, '.claude', 'skills', skillName, 'SKILL.md'),\n });\n }\n }\n\n return required;\n};\n\nexport const buildSubagentInstallPlan = (params: {\n subagent: Subagent;\n requestedTools: readonly ToolId[];\n userBasePath: string;\n}): {\n packages: SubagentPackage[];\n installedSubagent: InstalledSubagent;\n requiredSkills: RequiredSubagentSkill[];\n} => {\n const selectedTools = normalizeSelectedTools(params.subagent, params.requestedTools);\n if (selectedTools.length === 0) {\n throw new Error(`Subagent ${params.subagent.id} does not support the requested tools`);\n }\n\n const files = selectedTools.map((toolId) => ({\n relativePath: buildSubagentRelativePath(params.subagent.id, toolId),\n content: renderSubagentForTool({\n subagent: params.subagent,\n toolId,\n userBasePath: params.userBasePath,\n }),\n }));\n const subagentHash = computeInstalledSubagentHash({\n id: params.subagent.id,\n tools: selectedTools,\n prompt: params.subagent.prompt,\n metadataFiles: getSelectedMetadataFiles(params.subagent, selectedTools),\n });\n\n return {\n packages: [\n {\n subagentId: params.subagent.id,\n files,\n },\n ],\n installedSubagent: {\n id: params.subagent.id,\n tools: selectedTools,\n installed_paths: files.map((file) => file.relativePath),\n sourceHash: subagentHash,\n },\n requiredSkills: buildRequiredSubagentSkills({\n subagent: params.subagent,\n selectedTools,\n userBasePath: params.userBasePath,\n }),\n };\n};\n","const MANAGED_MARKER = '<!-- managed by ai-ops -->';\nconst META_PATTERN = /^<!-- sourceHash: ([a-f0-9]{6}) \\| generatedAt: (.+) -->$/;\n\nconst SECTION_START = '<!-- ai-ops:start -->';\nconst SECTION_END = '<!-- ai-ops:end -->';\n\nexport const hasLegacyHeader = (content: string): boolean => content.includes(MANAGED_MARKER);\n\nexport const wrapWithSection = (content: string, meta: { sourceHash: string; generatedAt: string }): string => {\n const metaLine = `<!-- sourceHash: ${meta.sourceHash} | generatedAt: ${meta.generatedAt} -->`;\n return `${SECTION_START}\\n${metaLine}\\n\\n${content}\\n${SECTION_END}`;\n};\n\nexport const hasAiOpsSection = (content: string): boolean =>\n content.includes(SECTION_START) && content.includes(SECTION_END);\n\nexport const stripAiOpsSection = (content: string): string => {\n const startIdx = content.indexOf(SECTION_START);\n const endIdx = content.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return content;\n\n const before = content.slice(0, startIdx).trimEnd();\n const after = content.slice(endIdx + SECTION_END.length).trimStart();\n return before + (after ? '\\n\\n' + after : '') + '\\n';\n};\n\nexport const extractAiOpsSectionContent = (content: string): string | null => {\n const startIdx = content.indexOf(SECTION_START);\n const endIdx = content.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return null;\n\n const section = content.slice(startIdx + SECTION_START.length, endIdx).trim();\n const lines = section.split('\\n');\n const [, ...contentLines] = lines;\n return contentLines.join('\\n').trimStart();\n};\n\nexport const replaceAiOpsSection = (existing: string, newSection: string): string => {\n const startIdx = existing.indexOf(SECTION_START);\n const endIdx = existing.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return existing;\n\n const before = existing.slice(0, startIdx).trimEnd();\n const after = existing.slice(endIdx + SECTION_END.length).trimStart();\n\n // filter(Boolean)으로 빈 before/after 제거 → 불필요한 선행 \\n\\n 방지\n return [before, newSection, after].filter(Boolean).join('\\n\\n') + '\\n';\n};\n\nexport const parseAiOpsMeta = (content: string): { sourceHash: string; generatedAt: string } | null => {\n const startIdx = content.indexOf(SECTION_START);\n if (startIdx === -1) return null;\n\n const lines = content.slice(startIdx).split('\\n');\n // lines[0] = '<!-- ai-ops:start -->', lines[1] = meta line\n const metaLine = lines[1] ?? '';\n const match = META_PATTERN.exec(metaLine);\n if (!match) return null;\n\n return { sourceHash: match[1], generatedAt: match[2] };\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { ManifestSchema } from './schemas/index.js';\nimport type { Manifest } from './schemas/index.js';\n\nexport const MANIFEST_FILENAME = '.ai-ops-manifest.json';\n\n// Pure\nexport const parseManifest = (json: string): Manifest => ManifestSchema.parse(JSON.parse(json));\n\nexport const serializeManifest = (manifest: Manifest): string => JSON.stringify(manifest, null, 2) + '\\n';\n\n// I/O\nexport const resolveManifestPath = (basePath: string): string => join(basePath, MANIFEST_FILENAME);\n\nexport const readManifest = (manifestPath: string): Manifest | null => {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf-8');\n } catch {\n return null;\n }\n return parseManifest(raw);\n};\n\nexport const writeManifest = (manifestPath: string, manifest: Manifest): void => {\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeManifest(manifest), 'utf-8');\n};\n","import type { Manifest, Preset, Rule } from './schemas/index.js';\nimport { resolvePresetRules } from './loader.js';\n\nconst LEGACY_SKILL_ID_MAP = {\n 'engineering-standards-pack': 'backend-service-standards',\n} as const;\n\nexport const resolveCanonicalSkillId = (skillId: string): string =>\n LEGACY_SKILL_ID_MAP[skillId as keyof typeof LEGACY_SKILL_ID_MAP] ?? skillId;\n\nconst resolveRulesFromIds = (ruleIds: readonly string[], allRules: readonly Rule[]): Rule[] => {\n const ruleMap = new Map(allRules.map((rule) => [rule.id, rule]));\n const seen = new Set<string>();\n const resolved = ruleIds.flatMap((ruleId) => {\n const rule = ruleMap.get(ruleId);\n if (!rule || seen.has(rule.id)) {\n return [];\n }\n seen.add(rule.id);\n return [rule];\n });\n\n return [...resolved].sort((a, b) => b.priority - a.priority);\n};\n\nconst resolvePresetById = (presetId: string | undefined, presets: readonly Preset[]): Preset | undefined => {\n if (presetId === undefined) {\n return undefined;\n }\n\n return presets.find((preset) => preset.id === presetId);\n};\n\nexport const resolveManifestRules = (params: {\n manifest: Manifest;\n allRules: readonly Rule[];\n presets: readonly Preset[];\n}): {\n installedRules: Rule[];\n workspaces?: Record<string, { preset: string; rules: string[] }>;\n} => {\n const { manifest, allRules, presets } = params;\n\n if (manifest.workspaces) {\n const resolvedWorkspaces = Object.fromEntries(\n Object.entries(manifest.workspaces).map(([workspacePath, entry]) => {\n const preset = resolvePresetById(entry.preset, presets);\n const rules = preset ? resolvePresetRules(preset, allRules) : resolveRulesFromIds(entry.rules, allRules);\n\n return [\n workspacePath,\n {\n preset: entry.preset,\n rules: rules.map((rule) => rule.id),\n },\n ];\n }),\n );\n\n const installedRules = resolveRulesFromIds(\n Object.values(resolvedWorkspaces).flatMap((entry) => entry.rules),\n allRules,\n );\n\n return {\n installedRules,\n workspaces: resolvedWorkspaces,\n };\n }\n\n const preset = resolvePresetById(manifest.preset, presets);\n const installedRules = preset\n ? resolvePresetRules(preset, allRules)\n : resolveRulesFromIds(manifest.installed_rules, allRules);\n\n return {\n installedRules,\n };\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { SkillRegistrySchema } from './schemas/index.js';\nimport type { SkillRegistry } from './schemas/index.js';\n\nexport const SKILL_REGISTRY_FILENAME = 'skills-manifest.json';\n\nexport const parseSkillRegistry = (json: string): SkillRegistry => SkillRegistrySchema.parse(JSON.parse(json));\n\nexport const serializeSkillRegistry = (registry: SkillRegistry): string => JSON.stringify(registry, null, 2) + '\\n';\n\nexport const resolveSkillRegistryPath = (userBasePath: string): string =>\n join(userBasePath, '.ai-ops', SKILL_REGISTRY_FILENAME);\n\nexport const readSkillRegistry = (registryPath: string): SkillRegistry | null => {\n let raw: string;\n try {\n raw = readFileSync(registryPath, 'utf-8');\n } catch {\n return null;\n }\n\n return parseSkillRegistry(raw);\n};\n\nexport const writeSkillRegistry = (registryPath: string, registry: SkillRegistry): void => {\n mkdirSync(dirname(registryPath), { recursive: true });\n writeFileSync(registryPath, serializeSkillRegistry(registry), 'utf-8');\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { SubagentManifestSchema } from './schemas/index.js';\nimport type { SubagentManifest } from './schemas/index.js';\n\nexport const SUBAGENT_MANIFEST_FILENAME = 'subagents-manifest.json';\n\nexport const parseSubagentManifest = (json: string): SubagentManifest =>\n SubagentManifestSchema.parse(JSON.parse(json));\n\nexport const serializeSubagentManifest = (manifest: SubagentManifest): string => JSON.stringify(manifest, null, 2) + '\\n';\n\nexport const resolveSubagentManifestPath = (userBasePath: string): string =>\n join(userBasePath, '.ai-ops', SUBAGENT_MANIFEST_FILENAME);\n\nexport const readSubagentManifest = (manifestPath: string): SubagentManifest | null => {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf-8');\n } catch {\n return null;\n }\n\n return parseSubagentManifest(raw);\n};\n\nexport const writeSubagentManifest = (manifestPath: string, manifest: SubagentManifest): void => {\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeSubagentManifest(manifest), 'utf-8');\n};\n","import { join } from 'node:path';\nimport { wrapWithSection } from './managed-header.js';\nimport { TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { ToolId } from './tool-output.js';\nimport type { ToolRenderResult } from './renderer.js';\n\n// Codex has no settings.json — plan directory convention must live in AGENTS.md\nconst CODEX_PLAN_BODY =\n '## Plan Snapshot (Plan mode only)\\n\\n' +\n '- This rule applies only when Codex is running in `collaboration_mode=Plan`.\\n' +\n '- Before implementation (file edits/creates, installs, commits) and before leaving Plan mode, save the latest plan content to `.codex/plans/YYYYMMDD_<topic>.md`.\\n' +\n '- In `Default` mode, do not automatically create or update plan files.';\n\nexport type FileAction = {\n relativePath: string;\n content: string;\n};\n\nexport const buildInstallPlan = (params: {\n toolId: ToolId;\n renderResult: ToolRenderResult;\n meta: { sourceHash: string; generatedAt: string };\n}): readonly FileAction[] => {\n const { toolId, renderResult, meta } = params;\n\n if (toolId === 'claude-code' && renderResult.tool === 'claude-code') {\n return renderResult.files.map(({ relativePath, content }) => ({\n relativePath,\n content: wrapWithSection(content, meta),\n }));\n }\n\n if (toolId === 'codex' && renderResult.tool === 'codex') {\n const config = TOOL_OUTPUT_MAP['codex'];\n const actions: FileAction[] = [];\n\n // CODEX_PLAN_BODY is always written to root AGENTS.md regardless of whether global rules exist\n const rootContent = renderResult.rootContent\n ? renderResult.rootContent + '\\n\\n---\\n\\n' + CODEX_PLAN_BODY\n : CODEX_PLAN_BODY;\n\n actions.push({\n relativePath: join(config.dir, config.rootFileName),\n content: wrapWithSection(rootContent, meta),\n });\n\n for (const df of renderResult.domainFiles) {\n actions.push({\n relativePath: join(df.workspacePath, config.domainFileName),\n content: wrapWithSection(df.content, meta),\n });\n }\n\n return actions;\n }\n\n if (toolId === 'gemini' && renderResult.tool === 'gemini') {\n const config = TOOL_OUTPUT_MAP['gemini'];\n const actions: FileAction[] = [];\n\n if (renderResult.rootContent) {\n actions.push({\n relativePath: join(config.dir, config.rootFileName),\n content: wrapWithSection(renderResult.rootContent, meta),\n });\n }\n\n for (const df of renderResult.domainFiles) {\n actions.push({\n relativePath: join(df.workspacePath, config.domainFileName),\n content: wrapWithSection(df.content, meta),\n });\n }\n\n return actions;\n }\n\n return [];\n};\n","import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path';\nimport { parseMarkdownFrontmatter } from './frontmatter.js';\nimport {\n extractAiOpsSectionContent,\n hasAiOpsSection,\n hasLegacyHeader,\n parseAiOpsMeta,\n replaceAiOpsSection,\n stripAiOpsSection,\n wrapWithSection,\n} from './managed-header.js';\nimport { COMPILER_DATA_DIR } from './paths.js';\nimport { computeHash, getCliVersion } from './source-hash.js';\nimport {\n ProjectLayerContextIndexSchema,\n ProjectLayerFrontmatterSchema,\n ProjectLayerManifestSchema,\n ProjectLayerToolSchema,\n isSafeProjectLayerPath,\n} from './schemas/index.js';\nimport type {\n ProjectLayerContextDocument,\n ProjectLayerContextIndex,\n ProjectLayerFrontmatter,\n ProjectLayerManifest,\n ProjectLayerPackFileRecord,\n ProjectLayerPackRecord,\n ProjectLayerProjectFile,\n ProjectLayerTool,\n} from './schemas/index.js';\n\n// ----- types -----\n\nexport type ProjectLayerFileOwnership = 'managed' | 'project';\n\nexport type ProjectLayerTemplateSpec = {\n path: string;\n content: string;\n ownership: ProjectLayerFileOwnership;\n frontmatter: ProjectLayerFrontmatter;\n contentHash: string;\n};\n\nexport type ProjectLayerInstallResult = {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n written: string[];\n appended: string[];\n createdProjectFiles: string[];\n refreshedProjectFiles: string[];\n preservedProjectFiles: string[];\n};\n\nexport type ProjectLayerRemoveResult = {\n deleted: string[];\n cleaned: string[];\n preserved: string[];\n notFound: string[];\n};\n\nexport type ProjectLayerIssueLevel = 'error' | 'warning';\n\nexport type ProjectLayerIssue = {\n level: ProjectLayerIssueLevel;\n code: string;\n message: string;\n};\n\nexport type ProjectLayerReport = {\n currentSourceHash: string | null;\n issues: ProjectLayerIssue[];\n};\n\ntype DocsStatusEntry = {\n path: string;\n status: string;\n owner: string;\n};\n\ntype ManagedInstallResult = {\n written: string[];\n appended: string[];\n};\n\ntype ProjectFileInstallResult = {\n records: ProjectLayerProjectFile[];\n created: string[];\n refreshed: string[];\n preserved: string[];\n};\n\nexport type ProjectLayerDocumentReadResult = ProjectLayerContextDocument & {\n content: string;\n};\n\n// ----- constants -----\n\nexport const PROJECT_LAYER_MANIFEST_RELATIVE_PATH = '.ai-ops/manifest.json';\nexport const PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH = '.ai-ops/context-layer.json';\n\nconst CONTEXT_LAYER_DATA_DIR = join(COMPILER_DATA_DIR, 'context-layer');\n\nconst TOOL_ORDER = ['codex', 'gemini', 'claude-code'] as const satisfies readonly ProjectLayerTool[];\n\nconst DEFAULT_TOOLS = TOOL_ORDER;\n\nconst TEMPLATE_PATHS = [\n 'AGENTS.md',\n 'GEMINI.md',\n 'CLAUDE.md',\n 'docs/agent/workflow.md',\n 'docs/agent/rules/00-agent-baseline.md',\n 'docs/agent/rules/routing-rules.md',\n 'docs/agent/rules/doc-update-rules.md',\n 'docs/agent/rules/stop-rules.md',\n 'docs/agent/checks/impact-checklist.md',\n 'docs/agent/checks/review-checklist.md',\n 'docs/agent/maps/codebase-map.md',\n 'docs/business/business-rules.md',\n 'docs/docs-status.md',\n] as const;\n\nconst PROJECT_OWNED_PATHS = new Set<string>([\n 'docs/docs-status.md',\n 'docs/agent/maps/codebase-map.md',\n 'docs/business/business-rules.md',\n]);\n\nconst RESERVED_DOCUMENT_WARNINGS = [\n '판단 근거로 사용하지 마세요',\n 'Do not use this document as current decision-making evidence',\n] as const;\n\n// ----- path helpers -----\n\nexport const resolveProjectLayerManifestPath = (basePath: string): string =>\n join(basePath, PROJECT_LAYER_MANIFEST_RELATIVE_PATH);\n\nexport const resolveProjectLayerContextIndexPath = (basePath: string): string =>\n join(basePath, PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH);\n\nconst resolveTemplatePath = (relativePath: string): string => join(CONTEXT_LAYER_DATA_DIR, relativePath);\n\nconst toRelativeDir = (relativePath: string): string => dirname(relativePath);\n\nexport const resolveProjectLayerFilePath = (basePath: string, relativePath: string): string => {\n if (!isSafeProjectLayerPath(relativePath)) {\n throw new Error(`Unsafe project layer path: ${relativePath}`);\n }\n\n const absoluteBasePath = resolve(basePath);\n const absolutePath = resolve(absoluteBasePath, relativePath);\n const relativeFromBase = relative(absoluteBasePath, absolutePath);\n\n if (relativeFromBase === '' || relativeFromBase.startsWith('..') || isAbsolute(relativeFromBase)) {\n throw new Error(`Unsafe project layer path: ${relativePath}`);\n }\n\n return absolutePath;\n};\n\n// ----- parsing and serialization -----\n\nexport const parseProjectLayerManifest = (json: string): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse(JSON.parse(json));\n\nexport const serializeProjectLayerManifest = (manifest: ProjectLayerManifest): string =>\n JSON.stringify(manifest, null, 2) + '\\n';\n\nexport const parseProjectLayerContextIndex = (json: string): ProjectLayerContextIndex =>\n ProjectLayerContextIndexSchema.parse(JSON.parse(json));\n\nexport const serializeProjectLayerContextIndex = (contextIndex: ProjectLayerContextIndex): string =>\n JSON.stringify(contextIndex, null, 2) + '\\n';\n\nconst parseProjectLayerFrontmatter = (content: string): ProjectLayerFrontmatter => {\n const { frontmatter } = parseMarkdownFrontmatter(content);\n return ProjectLayerFrontmatterSchema.parse(frontmatter);\n};\n\nexport const parseProjectLayerDocument = (path: string, rawContent: string): ProjectLayerDocumentReadResult => {\n const managedContent = extractAiOpsSectionContent(rawContent);\n const content = managedContent ?? rawContent;\n const frontmatter = parseProjectLayerFrontmatter(content);\n\n return {\n path,\n status: frontmatter.status,\n layer: frontmatter.layer,\n owner: frontmatter.owner,\n read_when: frontmatter.read_when,\n update_when: frontmatter.update_when,\n contentHash: computeHash([content.trimEnd()]),\n content,\n };\n};\n\nconst parseDocsStatusEntries = (content: string): DocsStatusEntry[] => {\n const document = parseProjectLayerDocument('docs/docs-status.md', content);\n const rows = document.content\n .split('\\n')\n .filter((line) => line.trim().startsWith('|'))\n .map((line) => line.trim());\n\n return rows.flatMap((line) => {\n const cells = line\n .split('|')\n .map((cell) => cell.trim())\n .filter((cell) => cell.length > 0);\n\n if (cells.length < 3) return [];\n if (cells[0] === 'path') return [];\n if (cells[0].startsWith('---')) return [];\n\n return [\n {\n path: cells[0],\n status: cells[1],\n owner: cells[2],\n },\n ];\n });\n};\n\n// ----- template loading -----\n\nexport const resolveProjectLayerTools = (requestedTools?: readonly string[]): ProjectLayerTool[] => {\n if (requestedTools === undefined || requestedTools.length === 0) {\n return [...DEFAULT_TOOLS];\n }\n\n const parsedTools = requestedTools.map((tool) => ProjectLayerToolSchema.parse(tool));\n const toolSet = new Set(parsedTools);\n return TOOL_ORDER.filter((tool) => toolSet.has(tool));\n};\n\nconst shouldIncludeTemplate = (relativePath: string, tools: readonly ProjectLayerTool[]): boolean => {\n if (relativePath === 'GEMINI.md') return tools.includes('gemini');\n if (relativePath === 'CLAUDE.md') return tools.includes('claude-code');\n return true;\n};\n\nconst buildDocsStatusRows = (specs: readonly ProjectLayerTemplateSpec[]): string =>\n specs.map((spec) => `| ${spec.path} | ${spec.frontmatter.status} | ${spec.frontmatter.owner} |`).join('\\n');\n\nconst includesReservedDocumentWarning = (content: string): boolean =>\n RESERVED_DOCUMENT_WARNINGS.some((warning) => content.includes(warning));\n\nconst loadTemplateSpec = (relativePath: string, content: string): ProjectLayerTemplateSpec => {\n const frontmatter = parseProjectLayerFrontmatter(content);\n const ownership = PROJECT_OWNED_PATHS.has(relativePath) ? 'project' : 'managed';\n\n if (frontmatter.status === 'Reserved' && !includesReservedDocumentWarning(content)) {\n throw new Error(`Reserved template must include warning text: ${relativePath}`);\n }\n\n return {\n path: relativePath,\n content,\n ownership,\n frontmatter,\n contentHash: computeHash([content.trimEnd()]),\n };\n};\n\nexport const loadProjectLayerTemplateSpecs = (\n tools: readonly ProjectLayerTool[],\n): readonly ProjectLayerTemplateSpec[] => {\n const selectedPaths = TEMPLATE_PATHS.filter((relativePath) => shouldIncludeTemplate(relativePath, tools));\n const nonStatusSpecs = selectedPaths\n .filter((relativePath) => relativePath !== 'docs/docs-status.md')\n .map((relativePath) => loadTemplateSpec(relativePath, readFileSync(resolveTemplatePath(relativePath), 'utf-8')));\n\n const statusTemplate = readFileSync(resolveTemplatePath('docs/docs-status.md'), 'utf-8');\n const statusPlaceholderSpec = loadTemplateSpec('docs/docs-status.md', statusTemplate);\n const specsForStatus = [...nonStatusSpecs, statusPlaceholderSpec].sort((a, b) => a.path.localeCompare(b.path));\n const statusContent = statusTemplate.replace('{{documents_table}}', buildDocsStatusRows(specsForStatus));\n const statusSpec = loadTemplateSpec('docs/docs-status.md', statusContent);\n\n return [...nonStatusSpecs, statusSpec].sort((a, b) => a.path.localeCompare(b.path));\n};\n\nexport const computeProjectLayerSourceHash = (specs: readonly ProjectLayerTemplateSpec[]): string =>\n computeHash(specs.map((spec) => `${spec.path}:${spec.content}`));\n\n// ----- manifest and index I/O -----\n\nexport const readProjectLayerManifest = (basePath: string): ProjectLayerManifest | null => {\n try {\n return parseProjectLayerManifest(readFileSync(resolveProjectLayerManifestPath(basePath), 'utf-8'));\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n};\n\nexport const writeProjectLayerManifest = (basePath: string, manifest: ProjectLayerManifest): void => {\n const manifestPath = resolveProjectLayerManifestPath(basePath);\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeProjectLayerManifest(manifest), 'utf-8');\n};\n\nexport const readProjectLayerContextIndex = (basePath: string): ProjectLayerContextIndex | null => {\n try {\n return parseProjectLayerContextIndex(readFileSync(resolveProjectLayerContextIndexPath(basePath), 'utf-8'));\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n};\n\nexport const writeProjectLayerContextIndex = (basePath: string, contextIndex: ProjectLayerContextIndex): void => {\n const contextIndexPath = resolveProjectLayerContextIndexPath(basePath);\n mkdirSync(dirname(contextIndexPath), { recursive: true });\n writeFileSync(contextIndexPath, serializeProjectLayerContextIndex(contextIndex), 'utf-8');\n};\n\n// ----- install and update -----\n\nconst installManagedFiles = (\n basePath: string,\n specs: readonly ProjectLayerTemplateSpec[],\n meta: { sourceHash: string; generatedAt: string },\n): ManagedInstallResult => {\n const written: string[] = [];\n const appended: string[] = [];\n\n for (const spec of specs) {\n const absolutePath = resolveProjectLayerFilePath(basePath, spec.path);\n const wrappedContent = wrapWithSection(spec.content, meta);\n\n if (!existsSync(absolutePath)) {\n mkdirSync(dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, wrappedContent + '\\n', 'utf-8');\n written.push(spec.path);\n continue;\n }\n\n const existing = readFileSync(absolutePath, 'utf-8');\n if (hasAiOpsSection(existing)) {\n writeFileSync(absolutePath, replaceAiOpsSection(existing, wrappedContent), 'utf-8');\n const stripped = stripAiOpsSection(existing);\n (stripped.trim().length > 0 ? appended : written).push(spec.path);\n continue;\n }\n\n if (hasLegacyHeader(existing)) {\n writeFileSync(absolutePath, wrappedContent + '\\n', 'utf-8');\n written.push(spec.path);\n continue;\n }\n\n writeFileSync(absolutePath, existing.trimEnd() + '\\n\\n' + wrappedContent + '\\n', 'utf-8');\n appended.push(spec.path);\n }\n\n return { written, appended };\n};\n\nconst installProjectFiles = (params: {\n basePath: string;\n specs: readonly ProjectLayerTemplateSpec[];\n previousProjectFiles?: readonly ProjectLayerProjectFile[];\n}): ProjectFileInstallResult => {\n const records: ProjectLayerProjectFile[] = [];\n const created: string[] = [];\n const refreshed: string[] = [];\n const preserved: string[] = [];\n const previousByPath = new Map((params.previousProjectFiles ?? []).map((file) => [file.path, file]));\n\n for (const spec of params.specs) {\n const absolutePath = resolveProjectLayerFilePath(params.basePath, spec.path);\n const previous = previousByPath.get(spec.path);\n\n if (!existsSync(absolutePath)) {\n mkdirSync(dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, spec.content + '\\n', 'utf-8');\n created.push(spec.path);\n records.push({\n path: spec.path,\n templateHash: spec.contentHash,\n created: true,\n });\n continue;\n }\n\n const existingContent = readFileSync(absolutePath, 'utf-8').trimEnd();\n const existingHash = computeHash([existingContent]);\n\n if (previous?.created === true && existingHash === previous.templateHash) {\n if (existingHash !== spec.contentHash) {\n writeFileSync(absolutePath, spec.content + '\\n', 'utf-8');\n refreshed.push(spec.path);\n } else {\n preserved.push(spec.path);\n }\n\n records.push({\n path: spec.path,\n templateHash: spec.contentHash,\n created: true,\n });\n continue;\n }\n\n preserved.push(spec.path);\n records.push({\n path: spec.path,\n templateHash: previous?.templateHash ?? spec.contentHash,\n created: previous?.created ?? false,\n });\n }\n\n return { records, created, refreshed, preserved };\n};\n\nconst buildContextIndexFromDisk = (params: {\n basePath: string;\n documentPaths: readonly string[];\n generatedAt: string;\n}): ProjectLayerContextIndex => {\n const documents = params.documentPaths.map((path) =>\n parseProjectLayerDocument(path, readFileSync(resolveProjectLayerFilePath(params.basePath, path), 'utf-8')),\n );\n\n return ProjectLayerContextIndexSchema.parse({\n schemaVersion: 1,\n kind: 'context-layer-index',\n documents: documents.map(({ content: _content, ...document }) => document),\n generatedAt: params.generatedAt,\n });\n};\n\nconst computeProjectFileHash = (basePath: string, relativePath: string): string =>\n computeHash([readFileSync(resolveProjectLayerFilePath(basePath, relativePath), 'utf-8').trimEnd()]);\n\nconst collectDocumentPathsFromManifest = (manifest: ProjectLayerManifest): string[] =>\n [\n ...manifest.managed_files.map((file) => file.path),\n ...manifest.project_files.map((file) => file.path),\n ...manifest.packs.flatMap((pack) => pack.documents.map((file) => file.path)),\n ].sort();\n\nconst buildDocsStatusRowsFromDisk = (params: {\n basePath: string;\n documentPaths: readonly string[];\n}): string[] =>\n params.documentPaths.map((path) => {\n const document = parseProjectLayerDocument(path, readFileSync(resolveProjectLayerFilePath(params.basePath, path), 'utf-8'));\n return `| ${document.path} | ${document.status} | ${document.owner} |`;\n });\n\nconst replaceDocsStatusRows = (content: string, rows: readonly string[]): string => {\n const lines = content.trimEnd().split('\\n');\n const headerIndex = lines.findIndex((line) => line.trim() === '| path | status | owner |');\n const dividerIndex = headerIndex + 1;\n\n if (headerIndex < 0 || !lines[dividerIndex]?.trim().startsWith('| ---')) {\n throw new Error('docs/docs-status.md table header not found');\n }\n\n let tableEndIndex = dividerIndex + 1;\n while (tableEndIndex < lines.length && lines[tableEndIndex]?.trim().startsWith('|')) {\n tableEndIndex += 1;\n }\n\n return [...lines.slice(0, dividerIndex + 1), ...rows, ...lines.slice(tableEndIndex)].join('\\n') + '\\n';\n};\n\nconst updateDocsStatusTable = (basePath: string, documentPaths: readonly string[]): { beforeHash: string; afterHash: string } => {\n const docsStatusPath = 'docs/docs-status.md';\n const absolutePath = resolveProjectLayerFilePath(basePath, docsStatusPath);\n const beforeHash = computeProjectFileHash(basePath, docsStatusPath);\n const rows = buildDocsStatusRowsFromDisk({ basePath, documentPaths });\n const nextContent = replaceDocsStatusRows(readFileSync(absolutePath, 'utf-8'), rows);\n writeFileSync(absolutePath, nextContent, 'utf-8');\n\n return {\n beforeHash,\n afterHash: computeProjectFileHash(basePath, docsStatusPath),\n };\n};\n\nconst updateDocsStatusProjectFileRecord = (params: {\n manifest: ProjectLayerManifest;\n beforeHash: string;\n afterHash: string;\n}): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n ...params.manifest,\n project_files: params.manifest.project_files.map((file) => {\n if (file.path !== 'docs/docs-status.md' || !file.created || file.templateHash !== params.beforeHash) {\n return file;\n }\n\n return {\n ...file,\n templateHash: params.afterHash,\n };\n }),\n });\n\nexport const refreshProjectLayerDerivedState = (params: {\n basePath: string;\n manifest: ProjectLayerManifest;\n generatedAt: string;\n}): {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n} => {\n const documentPaths = collectDocumentPathsFromManifest(params.manifest);\n const docsStatusHashes = updateDocsStatusTable(params.basePath, documentPaths);\n const manifest = updateDocsStatusProjectFileRecord({\n manifest: params.manifest,\n beforeHash: docsStatusHashes.beforeHash,\n afterHash: docsStatusHashes.afterHash,\n });\n const contextIndex = buildContextIndexFromDisk({\n basePath: params.basePath,\n documentPaths,\n generatedAt: params.generatedAt,\n });\n\n writeProjectLayerContextIndex(params.basePath, contextIndex);\n\n return {\n manifest,\n contextIndex,\n };\n};\n\nconst buildProjectLayerManifest = (params: {\n tools: readonly ProjectLayerTool[];\n managedFiles: readonly string[];\n projectFiles: readonly ProjectLayerProjectFile[];\n packs: readonly ProjectLayerPackRecord[];\n sourceHash: string;\n cliVersion: string;\n generatedAt: string;\n settings?: Record<string, unknown>;\n}): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n schemaVersion: 1,\n kind: 'project-operating-layer',\n tools: [...params.tools],\n managed_files: params.managedFiles.map((path) => ({\n path,\n sourceHash: params.sourceHash,\n })),\n project_files: [...params.projectFiles],\n packs: [...params.packs],\n settings: params.settings ?? {},\n sourceHash: params.sourceHash,\n cliVersion: params.cliVersion,\n generatedAt: params.generatedAt,\n });\n\nconst retireUnselectedManagedFiles = (params: {\n basePath: string;\n previousManifest: ProjectLayerManifest | null;\n nextManagedPaths: readonly string[];\n}): void => {\n if (!params.previousManifest) return;\n\n const nextManagedPathSet = new Set(params.nextManagedPaths);\n for (const file of params.previousManifest.managed_files) {\n if (!nextManagedPathSet.has(file.path)) {\n removeManagedProjectFile(params.basePath, file.path);\n }\n }\n};\n\nexport const installProjectLayer = (params: {\n basePath: string;\n tools: readonly ProjectLayerTool[];\n previousManifest?: ProjectLayerManifest | null;\n}): ProjectLayerInstallResult => {\n const previousManifest =\n params.previousManifest === undefined ? readProjectLayerManifest(params.basePath) : params.previousManifest;\n const specs = loadProjectLayerTemplateSpecs(params.tools);\n const sourceHash = computeProjectLayerSourceHash(specs);\n const generatedAt = new Date().toISOString();\n const managedSpecs = specs.filter((spec) => spec.ownership === 'managed');\n const projectSpecs = specs.filter((spec) => spec.ownership === 'project');\n const managedPaths = managedSpecs.map((spec) => spec.path);\n retireUnselectedManagedFiles({\n basePath: params.basePath,\n previousManifest,\n nextManagedPaths: managedPaths,\n });\n const managedResult = installManagedFiles(params.basePath, managedSpecs, { sourceHash, generatedAt });\n const projectResult = installProjectFiles({\n basePath: params.basePath,\n specs: projectSpecs,\n previousProjectFiles: previousManifest?.project_files,\n });\n const provisionalManifest = buildProjectLayerManifest({\n tools: params.tools,\n managedFiles: managedPaths,\n projectFiles: projectResult.records,\n packs: previousManifest?.packs ?? [],\n sourceHash,\n cliVersion: getCliVersion(),\n generatedAt,\n settings: previousManifest?.settings,\n });\n const { manifest, contextIndex } = refreshProjectLayerDerivedState({\n basePath: params.basePath,\n manifest: provisionalManifest,\n generatedAt,\n });\n\n writeProjectLayerManifest(params.basePath, manifest);\n\n return {\n manifest,\n contextIndex,\n written: managedResult.written,\n appended: managedResult.appended,\n createdProjectFiles: projectResult.created,\n refreshedProjectFiles: projectResult.refreshed,\n preservedProjectFiles: projectResult.preserved,\n };\n};\n\nexport const updateProjectLayer = (params: {\n basePath: string;\n manifest: ProjectLayerManifest;\n}): ProjectLayerInstallResult => {\n const specs = loadProjectLayerTemplateSpecs(params.manifest.tools);\n const sourceHash = computeProjectLayerSourceHash(specs);\n const generatedAt = new Date().toISOString();\n const managedSpecs = specs.filter((spec) => spec.ownership === 'managed');\n const projectSpecs = specs.filter((spec) => spec.ownership === 'project');\n const managedResult = installManagedFiles(params.basePath, managedSpecs, { sourceHash, generatedAt });\n const projectResult = installProjectFiles({\n basePath: params.basePath,\n specs: projectSpecs,\n previousProjectFiles: params.manifest.project_files,\n });\n const provisionalManifest = buildProjectLayerManifest({\n tools: params.manifest.tools,\n managedFiles: managedSpecs.map((spec) => spec.path),\n projectFiles: projectResult.records,\n packs: params.manifest.packs,\n sourceHash,\n cliVersion: getCliVersion(),\n generatedAt,\n settings: params.manifest.settings,\n });\n const { manifest, contextIndex } = refreshProjectLayerDerivedState({\n basePath: params.basePath,\n manifest: provisionalManifest,\n generatedAt,\n });\n\n writeProjectLayerManifest(params.basePath, manifest);\n\n return {\n manifest,\n contextIndex,\n written: managedResult.written,\n appended: managedResult.appended,\n createdProjectFiles: projectResult.created,\n refreshedProjectFiles: projectResult.refreshed,\n preservedProjectFiles: projectResult.preserved,\n };\n};\n\n// ----- diff and audit -----\n\nconst issue = (level: ProjectLayerIssueLevel, code: string, message: string): ProjectLayerIssue => ({\n level,\n code,\n message,\n});\n\nconst readDocumentSafely = (basePath: string, path: string): ProjectLayerDocumentReadResult | ProjectLayerIssue => {\n try {\n const absolutePath = resolveProjectLayerFilePath(basePath, path);\n if (!existsSync(absolutePath)) {\n return issue('error', 'missing-file', `파일 없음: ${path}`);\n }\n\n return parseProjectLayerDocument(path, readFileSync(absolutePath, 'utf-8'));\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n return issue('error', 'invalid-frontmatter', `${path} frontmatter 파싱 실패: ${reason}`);\n }\n};\n\nconst buildContextIndexMap = (contextIndex: ProjectLayerContextIndex | null): Map<string, ProjectLayerContextDocument> =>\n new Map((contextIndex?.documents ?? []).map((document) => [document.path, document]));\n\nconst compareArray = (left: readonly string[], right: readonly string[]): boolean =>\n left.length === right.length && left.every((value, index) => value === right[index]);\n\nconst compareContextDocument = (params: {\n expected: ProjectLayerDocumentReadResult;\n indexed: ProjectLayerContextDocument | undefined;\n}): ProjectLayerIssue[] => {\n const indexed = params.indexed;\n if (indexed === undefined) {\n return [issue('error', 'context-missing-document', `context-layer 누락: ${params.expected.path}`)];\n }\n\n const issues: ProjectLayerIssue[] = [];\n const scalarKeys = ['status', 'layer', 'owner', 'contentHash'] as const;\n\n for (const key of scalarKeys) {\n if (params.expected[key] !== indexed[key]) {\n issues.push(\n issue('error', 'context-document-mismatch', `${params.expected.path} context ${key} 불일치`),\n );\n }\n }\n\n if (!compareArray(params.expected.read_when, indexed.read_when)) {\n issues.push(issue('error', 'context-document-mismatch', `${params.expected.path} context read_when 불일치`));\n }\n\n if (!compareArray(params.expected.update_when, indexed.update_when)) {\n issues.push(issue('error', 'context-document-mismatch', `${params.expected.path} context update_when 불일치`));\n }\n\n return issues;\n};\n\nconst compareDocsStatusEntry = (params: {\n expected: ProjectLayerDocumentReadResult;\n entry: DocsStatusEntry | undefined;\n}): ProjectLayerIssue[] => {\n const entry = params.entry;\n if (entry === undefined) {\n return [issue('error', 'docs-status-missing-document', `docs-status 누락: ${params.expected.path}`)];\n }\n\n const issues: ProjectLayerIssue[] = [];\n if (entry.status !== params.expected.status) {\n issues.push(issue('error', 'docs-status-mismatch', `${params.expected.path} docs-status status 불일치`));\n }\n\n if (entry.owner !== params.expected.owner) {\n issues.push(issue('error', 'docs-status-mismatch', `${params.expected.path} docs-status owner 불일치`));\n }\n\n return issues;\n};\n\nexport const diffProjectLayer = (basePath: string): ProjectLayerReport => {\n let manifest: ProjectLayerManifest | null;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n return {\n currentSourceHash: null,\n issues: [issue('error', 'invalid-manifest', `${PROJECT_LAYER_MANIFEST_RELATIVE_PATH} 파싱 실패: ${reason}`)],\n };\n }\n\n if (!manifest) {\n return {\n currentSourceHash: null,\n issues: [issue('error', 'missing-manifest', `${PROJECT_LAYER_MANIFEST_RELATIVE_PATH}가 없습니다.`)],\n };\n }\n\n const specs = loadProjectLayerTemplateSpecs(manifest.tools);\n const currentSourceHash = computeProjectLayerSourceHash(specs);\n let contextIndex: ProjectLayerContextIndex | null = null;\n const issues: ProjectLayerIssue[] = [];\n\n try {\n contextIndex = readProjectLayerContextIndex(basePath);\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n issues.push(\n issue('error', 'invalid-context-index', `${PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH} 파싱 실패: ${reason}`),\n );\n }\n\n const contextMap = buildContextIndexMap(contextIndex);\n const expectedManagedPaths = new Set(specs.filter((spec) => spec.ownership === 'managed').map((spec) => spec.path));\n const manifestManagedPaths = new Set(manifest.managed_files.map((file) => file.path));\n\n if (manifest.sourceHash !== currentSourceHash) {\n issues.push(\n issue('warning', 'source-hash-drift', `template sourceHash 변경: ${manifest.sourceHash} -> ${currentSourceHash}`),\n );\n }\n\n if (contextIndex === null) {\n issues.push(issue('error', 'missing-context-index', `${PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH}가 없습니다.`));\n }\n\n for (const expectedPath of expectedManagedPaths) {\n if (!manifestManagedPaths.has(expectedPath)) {\n issues.push(issue('error', 'manifest-missing-managed-file', `manifest managed_files 누락: ${expectedPath}`));\n }\n }\n\n for (const file of manifest.managed_files) {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n issues.push(issue('error', 'missing-file', `파일 없음: ${file.path}`));\n continue;\n }\n\n const content = readFileSync(absolutePath, 'utf-8');\n const meta = parseAiOpsMeta(content);\n if (!meta) {\n issues.push(issue('error', 'missing-managed-section', `managed section 메타 없음: ${file.path}`));\n continue;\n }\n\n if (meta.sourceHash !== currentSourceHash) {\n issues.push(\n issue('warning', 'managed-source-hash-drift', `${file.path} sourceHash 변경: ${meta.sourceHash} -> ${currentSourceHash}`),\n );\n }\n }\n\n for (const file of manifest.project_files) {\n if (!existsSync(resolveProjectLayerFilePath(basePath, file.path))) {\n issues.push(issue('error', 'missing-file', `파일 없음: ${file.path}`));\n }\n }\n\n for (const pack of manifest.packs) {\n for (const file of [...pack.documents, ...pack.files]) {\n if (!existsSync(resolveProjectLayerFilePath(basePath, file.path))) {\n issues.push(issue('error', 'missing-file', `파일 없음: ${file.path}`));\n }\n }\n }\n\n for (const path of collectDocumentPathsFromManifest(manifest)) {\n const document = readDocumentSafely(basePath, path);\n if ('code' in document) {\n issues.push(document);\n continue;\n }\n issues.push(...compareContextDocument({ expected: document, indexed: contextMap.get(path) }));\n }\n\n return { currentSourceHash, issues };\n};\n\nexport const auditProjectLayer = (basePath: string): ProjectLayerReport => {\n const diffReport = diffProjectLayer(basePath);\n let manifest: ProjectLayerManifest | null;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch {\n return diffReport;\n }\n\n if (!manifest) {\n return diffReport;\n }\n\n let contextIndex: ProjectLayerContextIndex | null = null;\n try {\n contextIndex = readProjectLayerContextIndex(basePath);\n } catch {\n contextIndex = null;\n }\n const documentPaths = collectDocumentPathsFromManifest(manifest);\n const documentPathSet = new Set(documentPaths);\n const contextPathSet = new Set(contextIndex?.documents.map((document) => document.path) ?? []);\n const issues = [...diffReport.issues];\n const docsStatusPath = resolveProjectLayerFilePath(basePath, 'docs/docs-status.md');\n\n if (!existsSync(docsStatusPath)) {\n issues.push(issue('error', 'missing-docs-status', 'docs/docs-status.md가 없습니다.'));\n return { currentSourceHash: diffReport.currentSourceHash, issues };\n }\n\n let docsStatusEntries: DocsStatusEntry[] = [];\n try {\n docsStatusEntries = parseDocsStatusEntries(readFileSync(docsStatusPath, 'utf-8'));\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n issues.push(issue('error', 'invalid-docs-status', `docs/docs-status.md 파싱 실패: ${reason}`));\n }\n\n const docsStatusMap = new Map(docsStatusEntries.map((entry) => [entry.path, entry]));\n\n for (const path of documentPaths) {\n const document = readDocumentSafely(basePath, path);\n if ('code' in document) {\n continue;\n }\n\n issues.push(...compareDocsStatusEntry({ expected: document, entry: docsStatusMap.get(path) }));\n }\n\n for (const entry of docsStatusEntries) {\n if (!documentPathSet.has(entry.path)) {\n issues.push(issue('warning', 'docs-status-extra-document', `docs-status에 manifest 외 문서가 있습니다: ${entry.path}`));\n }\n }\n\n for (const contextPath of contextPathSet) {\n if (!documentPathSet.has(contextPath)) {\n issues.push(issue('warning', 'context-extra-document', `context-layer에 manifest 외 문서가 있습니다: ${contextPath}`));\n }\n }\n\n return { currentSourceHash: diffReport.currentSourceHash, issues };\n};\n\n// ----- uninstall -----\n\nfunction removeManagedProjectFile(basePath: string, relativePath: string): ProjectLayerRemoveResult {\n const absolutePath = resolveProjectLayerFilePath(basePath, relativePath);\n if (!existsSync(absolutePath)) {\n return { deleted: [], cleaned: [], preserved: [], notFound: [relativePath] };\n }\n\n const content = readFileSync(absolutePath, 'utf-8');\n if (!hasAiOpsSection(content)) {\n return { deleted: [], cleaned: [], preserved: [relativePath], notFound: [] };\n }\n\n const stripped = stripAiOpsSection(content);\n if (stripped.trim().length === 0) {\n rmSync(absolutePath);\n return { deleted: [relativePath], cleaned: [], preserved: [], notFound: [] };\n }\n\n writeFileSync(absolutePath, stripped, 'utf-8');\n return { deleted: [], cleaned: [relativePath], preserved: [], notFound: [] };\n}\n\nconst removeCreateOnlyProjectFile = (basePath: string, file: ProjectLayerProjectFile): ProjectLayerRemoveResult => {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n return { deleted: [], cleaned: [], preserved: [], notFound: [file.path] };\n }\n\n const content = readFileSync(absolutePath, 'utf-8').trimEnd();\n const currentHash = computeHash([content]);\n if (file.created && currentHash === file.templateHash) {\n rmSync(absolutePath);\n return { deleted: [file.path], cleaned: [], preserved: [], notFound: [] };\n }\n\n return { deleted: [], cleaned: [], preserved: [file.path], notFound: [] };\n};\n\nconst removePackOwnedFile = (basePath: string, file: ProjectLayerPackFileRecord): ProjectLayerRemoveResult => {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n return { deleted: [], cleaned: [], preserved: [], notFound: [file.path] };\n }\n\n const currentHash = computeHash([readFileSync(absolutePath, 'utf-8').trimEnd()]);\n if (currentHash === file.sourceHash) {\n rmSync(absolutePath);\n return { deleted: [file.path], cleaned: [], preserved: [], notFound: [] };\n }\n\n return { deleted: [], cleaned: [], preserved: [file.path], notFound: [] };\n};\n\nconst mergeRemoveResults = (results: readonly ProjectLayerRemoveResult[]): ProjectLayerRemoveResult => ({\n deleted: results.flatMap((result) => result.deleted),\n cleaned: results.flatMap((result) => result.cleaned),\n preserved: results.flatMap((result) => result.preserved),\n notFound: results.flatMap((result) => result.notFound),\n});\n\nconst removeEmptyDirs = (basePath: string, relativePaths: readonly string[]): void => {\n const dirs = [...new Set(relativePaths.map(toRelativeDir).filter((dir) => dir !== '.'))].sort(\n (a, b) => b.length - a.length,\n );\n\n for (const dir of [...dirs, '.ai-ops']) {\n const absoluteDir = resolveProjectLayerFilePath(basePath, dir);\n if (!existsSync(absoluteDir)) continue;\n\n try {\n if (readdirSync(absoluteDir).length === 0) {\n rmSync(absoluteDir, { recursive: true });\n }\n } catch {\n // Ignore cleanup failures.\n }\n }\n};\n\nexport const uninstallProjectLayer = (basePath: string, manifest: ProjectLayerManifest): ProjectLayerRemoveResult => {\n const managedResults = manifest.managed_files.map((file) => removeManagedProjectFile(basePath, file.path));\n const projectResults = manifest.project_files.map((file) => removeCreateOnlyProjectFile(basePath, file));\n const packResults = manifest.packs.flatMap((pack) =>\n [...pack.documents, ...pack.files].map((file) => removePackOwnedFile(basePath, file)),\n );\n const stateFiles = [PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH, PROJECT_LAYER_MANIFEST_RELATIVE_PATH];\n\n for (const stateFile of stateFiles) {\n rmSync(resolveProjectLayerFilePath(basePath, stateFile), { force: true });\n }\n\n const result = mergeRemoveResults([...managedResults, ...projectResults, ...packResults]);\n removeEmptyDirs(basePath, [...result.deleted, ...stateFiles]);\n return result;\n};\n","import { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// src/core/* 또는 dist/bin/index.js 기준에서도 공통으로 패키지 루트/data를 가리키도록 계산\n// src/core/paths.ts → ../../data = apps/cli/data\n// dist/bin/index.js (bundle) → ../../data = apps/cli/data\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport const COMPILER_DATA_DIR = resolve(__dirname, '..', '..', 'data');\n","import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path';\nimport { parseMarkdownFrontmatter } from './frontmatter.js';\nimport {\n PackCatalogSchema,\n ProjectLayerFrontmatterSchema,\n ProjectLayerManifestSchema,\n isSafeProjectLayerPath,\n} from './schemas/index.js';\nimport type {\n PackCatalog,\n ProjectLayerContextIndex,\n ProjectLayerManifest,\n ProjectLayerPackFileRecord,\n ProjectLayerPackRecord,\n} from './schemas/index.js';\nimport { computeHash, getCliVersion } from './source-hash.js';\nimport { COMPILER_DATA_DIR } from './paths.js';\nimport {\n readProjectLayerManifest,\n refreshProjectLayerDerivedState,\n resolveProjectLayerFilePath,\n writeProjectLayerManifest,\n} from './project-layer.js';\n\n// ----- types -----\n\nexport type ProjectLayerPackSourceFile = {\n path: string;\n content: string;\n sourceHash: string;\n};\n\nexport type ProjectLayerPackSource = {\n id: string;\n sourceHash: string;\n documents: ProjectLayerPackSourceFile[];\n files: ProjectLayerPackSourceFile[];\n};\n\nexport type ProjectLayerPackApplyResult = {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n written: string[];\n refreshed: string[];\n preserved: string[];\n deleted: string[];\n notFound: string[];\n};\n\nexport type ProjectLayerPackIssueLevel = 'error' | 'warning';\n\nexport type ProjectLayerPackIssue = {\n level: ProjectLayerPackIssueLevel;\n code: string;\n message: string;\n};\n\nexport type ProjectLayerPackReport = {\n issues: ProjectLayerPackIssue[];\n};\n\ntype PackFileApplyResult = {\n written: string[];\n refreshed: string[];\n preserved: string[];\n deleted: string[];\n notFound: string[];\n};\n\n// ----- constants -----\n\nconst PACK_REGISTRY_FILENAME = 'pack-registry.json';\nconst SPEC_LIFECYCLE_PACK_ID = 'spec-lifecycle';\nconst PACK_INSTALL_ROOT = 'docs/specs/';\nconst RESERVED_DOCUMENT_WARNINGS = [\n '판단 근거로 사용하지 마세요',\n 'Do not use this document as current decision-making evidence',\n] as const;\nconst DEFAULT_PACKS_DIR = join(COMPILER_DATA_DIR, 'packs');\n\n// ----- source loading -----\n\nconst includesReservedDocumentWarning = (content: string): boolean =>\n RESERVED_DOCUMENT_WARNINGS.some((warning) => content.includes(warning));\n\nconst readPackCatalog = (packsDir: string): PackCatalog =>\n PackCatalogSchema.parse(JSON.parse(readFileSync(join(packsDir, PACK_REGISTRY_FILENAME), 'utf-8')));\n\nconst assertPackInstallPath = (path: string): void => {\n if (!isSafeProjectLayerPath(path) || !path.startsWith(PACK_INSTALL_ROOT)) {\n throw new Error(`Unsafe pack path: ${path}`);\n }\n};\n\nconst readPackSourceFiles = (packDir: string): ProjectLayerPackSourceFile[] => {\n const files: ProjectLayerPackSourceFile[] = [];\n\n const walk = (relativeDir = ''): void => {\n const absoluteDir = relativeDir.length > 0 ? join(packDir, relativeDir) : packDir;\n const entries = readdirSync(absoluteDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const nextRelativePath = relativeDir.length > 0 ? join(relativeDir, entry.name) : entry.name;\n if (entry.isDirectory()) {\n walk(nextRelativePath);\n continue;\n }\n\n assertPackInstallPath(nextRelativePath);\n const content = readFileSync(join(packDir, nextRelativePath), 'utf-8');\n files.push({\n path: nextRelativePath,\n content,\n sourceHash: computeHash([content.trimEnd()]),\n });\n }\n };\n\n walk();\n return files;\n};\n\nconst splitPackSourceFiles = (files: readonly ProjectLayerPackSourceFile[]): {\n documents: ProjectLayerPackSourceFile[];\n files: ProjectLayerPackSourceFile[];\n} => {\n const documents: ProjectLayerPackSourceFile[] = [];\n const regularFiles: ProjectLayerPackSourceFile[] = [];\n\n for (const file of files) {\n if (!file.path.endsWith('.md')) {\n regularFiles.push(file);\n continue;\n }\n\n const { frontmatter } = parseMarkdownFrontmatter(file.content);\n const parsed = ProjectLayerFrontmatterSchema.parse(frontmatter);\n if (parsed.status === 'Reserved' && !includesReservedDocumentWarning(file.content)) {\n throw new Error(`Reserved pack document must include warning text: ${file.path}`);\n }\n documents.push(file);\n }\n\n return { documents, files: regularFiles };\n};\n\nexport const loadAllPacks = (packsDir: string): ProjectLayerPackSource[] => {\n const catalog = readPackCatalog(packsDir);\n const entries = [...catalog.packs].sort((a, b) => a.id.localeCompare(b.id));\n\n return entries.map((entry) => {\n if (entry.id !== SPEC_LIFECYCLE_PACK_ID) {\n throw new Error(`Unsupported pack id: ${entry.id}`);\n }\n\n const packDir = resolve(packsDir, entry.source_path);\n const relativeFromPacks = relative(resolve(packsDir), packDir);\n if (relativeFromPacks.length === 0 || relativeFromPacks.startsWith('..') || isAbsolute(relativeFromPacks)) {\n throw new Error(`Pack source path escapes packs dir: ${entry.source_path}`);\n }\n\n const files = readPackSourceFiles(packDir);\n const split = splitPackSourceFiles(files);\n\n return {\n id: entry.id,\n sourceHash: computeHash(files.map((file) => `${file.path}:${file.content}`).sort()),\n documents: split.documents,\n files: split.files,\n };\n });\n};\n\nconst resolvePackById = (packsDir: string, packId: string): ProjectLayerPackSource => {\n const pack = loadAllPacks(packsDir).find((candidate) => candidate.id === packId);\n if (!pack) {\n throw new Error(`Unknown pack: ${packId}`);\n }\n return pack;\n};\n\n// ----- file application -----\n\nconst serializePackFileContent = (content: string): string => (content.length === 0 ? '' : content.trimEnd() + '\\n');\n\nconst readProjectFileHash = (basePath: string, relativePath: string): string =>\n computeHash([readFileSync(resolveProjectLayerFilePath(basePath, relativePath), 'utf-8').trimEnd()]);\n\nconst writePackFile = (basePath: string, file: ProjectLayerPackSourceFile): void => {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n mkdirSync(dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, serializePackFileContent(file.content), 'utf-8');\n};\n\nconst buildPackFileRecords = (files: readonly ProjectLayerPackSourceFile[]): ProjectLayerPackFileRecord[] =>\n files.map((file) => ({\n path: file.path,\n sourceHash: file.sourceHash,\n }));\n\nconst buildPackRecord = (params: {\n pack: ProjectLayerPackSource;\n installedAt: string;\n}): ProjectLayerPackRecord => ({\n id: params.pack.id,\n sourceHash: params.pack.sourceHash,\n documents: buildPackFileRecords(params.pack.documents),\n files: buildPackFileRecords(params.pack.files),\n installedAt: params.installedAt,\n});\n\nconst applyPackSourceFiles = (params: {\n basePath: string;\n pack: ProjectLayerPackSource;\n previousRecord: ProjectLayerPackRecord | null;\n}): PackFileApplyResult => {\n const written: string[] = [];\n const refreshed: string[] = [];\n const preserved: string[] = [];\n const deleted: string[] = [];\n const notFound: string[] = [];\n const sourceFiles = [...params.pack.documents, ...params.pack.files];\n const sourceByPath = new Map(sourceFiles.map((file) => [file.path, file]));\n const previousByPath = new Map(\n [...(params.previousRecord?.documents ?? []), ...(params.previousRecord?.files ?? [])].map((file) => [\n file.path,\n file,\n ]),\n );\n\n for (const file of sourceFiles) {\n const absolutePath = resolveProjectLayerFilePath(params.basePath, file.path);\n const previous = previousByPath.get(file.path);\n\n if (!existsSync(absolutePath)) {\n writePackFile(params.basePath, file);\n written.push(file.path);\n continue;\n }\n\n if (previous === undefined) {\n preserved.push(file.path);\n continue;\n }\n\n const currentHash = readProjectFileHash(params.basePath, file.path);\n if (currentHash !== previous.sourceHash) {\n preserved.push(file.path);\n continue;\n }\n\n if (currentHash !== file.sourceHash) {\n writePackFile(params.basePath, file);\n refreshed.push(file.path);\n }\n }\n\n for (const previous of previousByPath.values()) {\n if (sourceByPath.has(previous.path)) {\n continue;\n }\n\n const absolutePath = resolveProjectLayerFilePath(params.basePath, previous.path);\n if (!existsSync(absolutePath)) {\n notFound.push(previous.path);\n continue;\n }\n\n if (readProjectFileHash(params.basePath, previous.path) === previous.sourceHash) {\n rmSync(absolutePath);\n deleted.push(previous.path);\n } else {\n preserved.push(previous.path);\n }\n }\n\n return { written, refreshed, preserved, deleted, notFound };\n};\n\nconst removePackFiles = (basePath: string, record: ProjectLayerPackRecord): PackFileApplyResult => {\n const deleted: string[] = [];\n const preserved: string[] = [];\n const notFound: string[] = [];\n\n for (const file of [...record.documents, ...record.files]) {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n notFound.push(file.path);\n continue;\n }\n\n if (readProjectFileHash(basePath, file.path) === file.sourceHash) {\n rmSync(absolutePath);\n deleted.push(file.path);\n } else {\n preserved.push(file.path);\n }\n }\n\n return { written: [], refreshed: [], preserved, deleted, notFound };\n};\n\nconst removeEmptyDirs = (basePath: string, relativePaths: readonly string[]): void => {\n const dirs = [...new Set(relativePaths.map((path) => dirname(path)).filter((dir) => dir !== '.'))].sort(\n (a, b) => b.length - a.length,\n );\n\n for (const dir of dirs) {\n const absoluteDir = resolveProjectLayerFilePath(basePath, dir);\n if (!existsSync(absoluteDir)) {\n continue;\n }\n\n try {\n if (readdirSync(absoluteDir).length === 0) {\n rmSync(absoluteDir, { recursive: true });\n }\n } catch {\n // Directory cleanup is best-effort only.\n }\n }\n};\n\n// ----- manifest updates -----\n\nconst requireProjectLayerManifest = (basePath: string): ProjectLayerManifest => {\n const manifest = readProjectLayerManifest(basePath);\n if (!manifest) {\n throw new Error('.ai-ops/manifest.json이 없습니다. 먼저 ai-ops init을 실행하세요.');\n }\n return manifest;\n};\n\nconst upsertPackRecord = (\n manifest: ProjectLayerManifest,\n record: ProjectLayerPackRecord,\n generatedAt: string,\n): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n ...manifest,\n packs: [...manifest.packs.filter((pack) => pack.id !== record.id), record],\n cliVersion: getCliVersion(),\n generatedAt,\n });\n\nconst removePackRecord = (manifest: ProjectLayerManifest, packId: string, generatedAt: string): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n ...manifest,\n packs: manifest.packs.filter((pack) => pack.id !== packId),\n cliVersion: getCliVersion(),\n generatedAt,\n });\n\nconst writeManifestWithDerivedState = (params: {\n basePath: string;\n manifest: ProjectLayerManifest;\n generatedAt: string;\n}): {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n} => {\n const derived = refreshProjectLayerDerivedState({\n basePath: params.basePath,\n manifest: params.manifest,\n generatedAt: params.generatedAt,\n });\n writeProjectLayerManifest(params.basePath, derived.manifest);\n return derived;\n};\n\n// ----- lifecycle -----\n\nexport const installProjectLayerPack = (params: {\n basePath: string;\n packId: string;\n packsDir?: string;\n}): ProjectLayerPackApplyResult => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const previousRecord = manifest.packs.find((pack) => pack.id === params.packId);\n if (previousRecord) {\n return updateProjectLayerPack(params);\n }\n\n const pack = resolvePackById(params.packsDir ?? DEFAULT_PACKS_DIR, params.packId);\n const installedAt = new Date().toISOString();\n const applyResult = applyPackSourceFiles({ basePath: params.basePath, pack, previousRecord: null });\n const nextManifest = upsertPackRecord(manifest, buildPackRecord({ pack, installedAt }), installedAt);\n const derived = writeManifestWithDerivedState({\n basePath: params.basePath,\n manifest: nextManifest,\n generatedAt: installedAt,\n });\n\n return { ...applyResult, manifest: derived.manifest, contextIndex: derived.contextIndex };\n};\n\nexport const updateProjectLayerPack = (params: {\n basePath: string;\n packId: string;\n packsDir?: string;\n}): ProjectLayerPackApplyResult => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const previousRecord = manifest.packs.find((pack) => pack.id === params.packId);\n if (!previousRecord) {\n throw new Error(`설치된 pack을 찾지 못했습니다: ${params.packId}`);\n }\n\n const pack = resolvePackById(params.packsDir ?? DEFAULT_PACKS_DIR, params.packId);\n const generatedAt = new Date().toISOString();\n const applyResult = applyPackSourceFiles({ basePath: params.basePath, pack, previousRecord });\n const nextManifest = upsertPackRecord(\n manifest,\n buildPackRecord({ pack, installedAt: previousRecord.installedAt }),\n generatedAt,\n );\n const derived = writeManifestWithDerivedState({\n basePath: params.basePath,\n manifest: nextManifest,\n generatedAt,\n });\n\n removeEmptyDirs(params.basePath, applyResult.deleted);\n return { ...applyResult, manifest: derived.manifest, contextIndex: derived.contextIndex };\n};\n\nexport const uninstallProjectLayerPack = (params: {\n basePath: string;\n packId: string;\n}): ProjectLayerPackApplyResult => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const previousRecord = manifest.packs.find((pack) => pack.id === params.packId);\n if (!previousRecord) {\n throw new Error(`설치된 pack을 찾지 못했습니다: ${params.packId}`);\n }\n\n const generatedAt = new Date().toISOString();\n const applyResult = removePackFiles(params.basePath, previousRecord);\n const nextManifest = removePackRecord(manifest, params.packId, generatedAt);\n const derived = writeManifestWithDerivedState({\n basePath: params.basePath,\n manifest: nextManifest,\n generatedAt,\n });\n\n removeEmptyDirs(params.basePath, applyResult.deleted);\n return { ...applyResult, manifest: derived.manifest, contextIndex: derived.contextIndex };\n};\n\n// ----- diff -----\n\nconst packIssue = (\n level: ProjectLayerPackIssueLevel,\n code: string,\n message: string,\n): ProjectLayerPackIssue => ({\n level,\n code,\n message,\n});\n\nexport const diffProjectLayerPack = (params: {\n basePath: string;\n packId?: string;\n packsDir?: string;\n}): ProjectLayerPackReport => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const targets = params.packId ? manifest.packs.filter((pack) => pack.id === params.packId) : manifest.packs;\n const issues: ProjectLayerPackIssue[] = [];\n\n if (targets.length === 0) {\n return { issues: [packIssue('warning', 'missing-pack', '비교할 설치된 pack이 없습니다.')] };\n }\n\n for (const record of targets) {\n const pack = resolvePackById(params.packsDir ?? DEFAULT_PACKS_DIR, record.id);\n if (record.sourceHash !== pack.sourceHash) {\n issues.push(\n packIssue('warning', 'pack-source-hash-drift', `${record.id} sourceHash 변경: ${record.sourceHash} -> ${pack.sourceHash}`),\n );\n }\n\n for (const file of [...record.documents, ...record.files]) {\n const absolutePath = resolveProjectLayerFilePath(params.basePath, file.path);\n if (!existsSync(absolutePath)) {\n issues.push(packIssue('error', 'missing-file', `파일 없음: ${file.path}`));\n }\n }\n }\n\n return { issues };\n};\n","import { join } from 'node:path';\nimport { TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { Manifest } from './schemas/index.js';\n\n/**\n * manifest에 installed_files가 없는 구버전 manifest를 위한 fallback.\n * manifest의 tools/workspaces/installed_rules 정보를 기반으로\n * 실제 설치됐을 파일 경로를 역산한다.\n */\nexport const inferInstalledFiles = (manifest: Manifest): string[] => {\n const files: string[] = [];\n const isMonorepo = manifest.workspaces !== undefined;\n\n for (const toolId of manifest.tools) {\n if (toolId === 'claude-code') {\n // claude-code: .claude/rules/{ruleId}.md\n const config = TOOL_OUTPUT_MAP['claude-code'];\n for (const ruleId of manifest.installed_rules) {\n files.push(join(config.rulesDir, `${ruleId}${config.fileExtension}`));\n }\n } else if (toolId === 'codex') {\n const config = TOOL_OUTPUT_MAP['codex'];\n if (!isMonorepo) {\n // 비모노: .codex/AGENTS.md + .codex/AGENTS.override.md (domain 있으면)\n files.push(join(config.dir, config.rootFileName));\n files.push(join(config.dir, config.domainFileName));\n } else {\n // 모노: .codex/AGENTS.md (global) + {workspace}/AGENTS.override.md (domain)\n files.push(join(config.dir, config.rootFileName));\n for (const ws of Object.keys(manifest.workspaces ?? {})) {\n files.push(join(ws, config.domainFileName));\n }\n }\n } else if (toolId === 'gemini') {\n const config = TOOL_OUTPUT_MAP['gemini'];\n if (!isMonorepo) {\n // 비모노: .gemini/GEMINI.md\n files.push(join(config.dir, config.rootFileName));\n } else {\n // 모노: .gemini/GEMINI.md (global) + {workspace}/GEMINI.md (domain)\n files.push(join(config.dir, config.rootFileName));\n for (const ws of Object.keys(manifest.workspaces ?? {})) {\n files.push(join(ws, config.domainFileName));\n }\n }\n }\n }\n\n // 중복 제거 (codex 비모노에서 rootFileName === domainFileName인 경우 대비)\n return [...new Set(files)];\n};\n","import { join } from 'node:path';\nimport { COMPILER_DATA_DIR } from '@/core/index.js';\n\nexport const resolveCompilerDataDir = (): string => COMPILER_DATA_DIR;\n\nexport const resolveSkillsDir = (): string => join(COMPILER_DATA_DIR, 'skills');\n\nexport const resolveSubagentsDir = (): string => join(COMPILER_DATA_DIR, 'subagents');\n\nexport const resolvePacksDir = (): string => join(COMPILER_DATA_DIR, 'packs');\n\nexport const resolveReferenceSkillsDir = (): string => join(resolveSkillsDir(), 'reference-skills');\n\nexport const resolveTaskSkillsDir = (): string => join(resolveSkillsDir(), 'task-skills');\n\nexport const resolveSkillCatalogPath = (): string => join(resolveSkillsDir(), 'skill-registry.json');\n\n// project-only 설치 기준 디렉토리\nexport const resolveBasePath = (): string => process.cwd();\n\nexport const resolveUserBasePath = (): string => {\n const userBasePath = process.env.AI_OPS_HOME ?? process.env.HOME;\n if (!userBasePath) {\n throw new Error('AI_OPS_HOME or HOME is required for global asset commands');\n }\n return userBasePath;\n};\n","import * as p from '@clack/prompts';\nimport { ZodError } from 'zod';\n\nexport const formatProjectLayerCommandError = (error: unknown): string => {\n if (error instanceof ZodError) {\n return error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : 'manifest';\n return `${path}: ${issue.message}`;\n })\n .join('; ');\n }\n\n return error instanceof Error ? error.message : 'unknown error';\n};\n\nexport const reportInvalidProjectLayerManifest = (params: { error: unknown; outro: string }): void => {\n const reason = formatProjectLayerCommandError(params.error);\n p.log.error(`[invalid-manifest] .ai-ops/manifest.json 파싱 실패: ${reason}`);\n process.exitCode = 1;\n p.outro(params.outro);\n};\n\nexport const reportProjectLayerApplyError = (params: { error: unknown; outro: string }): void => {\n const reason = formatProjectLayerCommandError(params.error);\n p.log.error(`[project-layer-apply] project operating layer 적용 실패: ${reason}`);\n process.exitCode = 1;\n p.outro(params.outro);\n};\n","import * as p from '@clack/prompts';\nimport {\n diffProjectLayer,\n readProjectLayerManifest,\n updateProjectLayer,\n} from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\nimport { reportInvalidProjectLayerManifest, reportProjectLayerApplyError } from './project-layer-errors.js';\n\nexport const updateCommand = async (opts: { force: boolean }): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops update');\n\n let manifest: ReturnType<typeof readProjectLayerManifest>;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch (error) {\n reportInvalidProjectLayerManifest({ error, outro: 'ai-ops update 실패' });\n return;\n }\n\n if (!manifest) {\n p.log.error('.ai-ops/manifest.json이 없습니다. 먼저 ai-ops init을 실행하세요.');\n process.exit(1);\n }\n\n const diffReport = diffProjectLayer(basePath);\n if (diffReport.issues.length === 0 && !opts.force) {\n p.log.info('변경 사항이 없습니다.');\n p.outro('ai-ops update 완료');\n return;\n }\n\n let result: ReturnType<typeof updateProjectLayer>;\n try {\n result = updateProjectLayer({ basePath, manifest });\n } catch (error) {\n reportProjectLayerApplyError({ error, outro: 'ai-ops update 실패' });\n return;\n }\n\n p.log.success(`managed 파일 갱신: ${result.manifest.managed_files.length}개`);\n if (result.createdProjectFiles.length > 0) {\n p.log.info(`누락된 project-owned 파일 복구:\\n${result.createdProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.refreshedProjectFiles.length > 0) {\n p.log.info(`unmodified project-owned 파일 갱신:\\n${result.refreshedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preservedProjectFiles.length > 0) {\n p.log.info(`project-owned 파일 보존:\\n${result.preservedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n\n p.outro('ai-ops update 완료');\n};\n","import * as p from '@clack/prompts';\nimport { diffProjectLayer } from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\n\nexport const diffCommand = async (): Promise<void> => {\n p.intro('ai-ops diff');\n\n const report = diffProjectLayer(resolveBasePath());\n if (report.issues.length === 0) {\n p.log.success('변경 사항 없음. 최신 상태입니다.');\n p.outro('ai-ops diff 완료');\n return;\n }\n\n for (const item of report.issues) {\n const line = `[${item.code}] ${item.message}`;\n if (item.level === 'error') {\n p.log.error(line);\n } else {\n p.log.warn(line);\n }\n }\n\n if (report.issues.some((item) => item.level === 'error')) {\n process.exitCode = 1;\n }\n\n p.outro('ai-ops diff 완료');\n};\n","import * as p from '@clack/prompts';\nimport { auditProjectLayer } from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\n\nexport const auditCommand = async (): Promise<void> => {\n p.intro('ai-ops audit');\n\n const report = auditProjectLayer(resolveBasePath());\n if (report.issues.length === 0) {\n p.log.success('audit 통과. manifest, context-layer, frontmatter, docs-status가 일치합니다.');\n p.outro('ai-ops audit 완료');\n return;\n }\n\n for (const item of report.issues) {\n const line = `[${item.code}] ${item.message}`;\n if (item.level === 'error') {\n p.log.error(line);\n } else {\n p.log.warn(line);\n }\n }\n\n if (report.issues.some((item) => item.level === 'error')) {\n process.exitCode = 1;\n }\n\n p.outro('ai-ops audit 완료');\n};\n","import * as p from '@clack/prompts';\nimport { readProjectLayerManifest, uninstallProjectLayer } from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\nimport { reportInvalidProjectLayerManifest, reportProjectLayerApplyError } from './project-layer-errors.js';\n\ntype UninstallCommandOptions = {\n yes?: boolean;\n};\n\nexport const uninstallCommand = async (opts: UninstallCommandOptions = {}): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops uninstall');\n\n let manifest: ReturnType<typeof readProjectLayerManifest>;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch (error) {\n reportInvalidProjectLayerManifest({ error, outro: 'ai-ops uninstall 실패' });\n return;\n }\n\n if (!manifest) {\n p.log.error('.ai-ops/manifest.json이 없습니다. project operating layer가 설치되어 있지 않습니다.');\n process.exitCode = 1;\n p.outro('ai-ops uninstall 실패');\n return;\n }\n\n const targetFiles = [\n ...manifest.managed_files.map((file) => file.path),\n ...manifest.project_files.map((file) => file.path),\n '.ai-ops/context-layer.json',\n '.ai-ops/manifest.json',\n ];\n\n p.log.info(`처리 대상 (${targetFiles.length}개):\\n${targetFiles.map((file) => ` ${file}`).join('\\n')}`);\n\n if (!opts.yes) {\n const confirmed = await p.confirm({\n message: 'project operating layer를 제거하시겠습니까?',\n initialValue: false,\n });\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('취소됨');\n process.exit(0);\n }\n }\n\n let result: ReturnType<typeof uninstallProjectLayer>;\n try {\n result = uninstallProjectLayer(basePath, manifest);\n } catch (error) {\n reportProjectLayerApplyError({ error, outro: 'ai-ops uninstall 실패' });\n return;\n }\n\n if (result.deleted.length > 0) {\n p.log.success(`삭제 완료:\\n${result.deleted.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.cleaned.length > 0) {\n p.log.success(`managed section 제거, 사용자 내용 보존:\\n${result.cleaned.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`수정되었거나 기존에 있던 project-owned 파일 보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.notFound.length > 0) {\n p.log.info(`이미 없음:\\n${result.notFound.map((file) => ` ${file}`).join('\\n')}`);\n }\n\n p.outro('ai-ops uninstall 완료');\n};\n","import * as p from '@clack/prompts';\nimport { rmSync } from 'node:fs';\nimport type { InstalledSkill, Skill, ToolId } from '@/core/index.js';\nimport {\n loadAllSkills,\n buildSkillInstallPlan,\n getCliVersion,\n readSkillRegistry,\n resolveSkillRegistryPath,\n writeSkillRegistry,\n resolveCanonicalSkillId,\n} from '@/core/index.js';\nimport { resolveSkillsDir, resolveUserBasePath } from '../lib/paths.js';\nimport {\n findInstalledSkill,\n mergeSkillTools,\n removeInstalledSkill,\n resolveRequestedTools,\n upsertInstalledSkill,\n} from '../lib/skill-state.js';\nimport { installSkillPackages, removeDirectories } from '../lib/skill-install.js';\n\ntype SkillCommandOptions = {\n tool?: string[];\n};\n\nconst loadCompilerInputs = (): {\n allSkills: ReturnType<typeof loadAllSkills>;\n cliVersion: string;\n} => {\n return {\n allSkills: loadAllSkills(resolveSkillsDir()),\n cliVersion: getCliVersion(),\n };\n};\n\nconst resolveSkillById = (skills: readonly Skill[], skillId: string): Skill => {\n const canonicalSkillId = resolveCanonicalSkillId(skillId);\n const skill = skills.find((candidate) => candidate.id === canonicalSkillId);\n if (!skill) {\n throw new Error(`Unknown skill: ${skillId}`);\n }\n return skill;\n};\n\nconst writeUserSkillState = (params: {\n basePath: string;\n cliVersion: string;\n nextSkill?: InstalledSkill;\n removeSkillId?: string;\n}): void => {\n const registryPath = resolveSkillRegistryPath(params.basePath);\n const previous = readSkillRegistry(registryPath);\n const skills = params.removeSkillId\n ? removeInstalledSkill(previous?.skills ?? [], params.removeSkillId)\n : params.nextSkill\n ? upsertInstalledSkill(previous?.skills ?? [], params.nextSkill)\n : (previous?.skills ?? []);\n\n if (skills.length === 0) {\n rmSync(registryPath, { force: true });\n return;\n }\n\n writeSkillRegistry(registryPath, {\n skills,\n cliVersion: params.cliVersion,\n generatedAt: new Date().toISOString(),\n });\n};\n\nconst readInstalledSkills = (basePath: string): InstalledSkill[] => {\n return (readSkillRegistry(resolveSkillRegistryPath(basePath))?.skills ?? []).map((installedSkill) => ({\n ...installedSkill,\n id: resolveCanonicalSkillId(installedSkill.id),\n }));\n};\n\nconst installSkill = (params: {\n skill: Skill;\n requestedTools: readonly ToolId[];\n basePath: string;\n cliVersion: string;\n}): InstalledSkill => {\n const installedSkills = readInstalledSkills(params.basePath);\n const existingInstalledSkill = findInstalledSkill(installedSkills, params.skill.id);\n const nextRequestedTools = mergeSkillTools({\n existing: existingInstalledSkill?.tools,\n requested: params.requestedTools,\n });\n const { packages, installedSkill } = buildSkillInstallPlan({\n skill: params.skill,\n requestedTools: nextRequestedTools,\n });\n installSkillPackages(params.basePath, packages);\n\n writeUserSkillState({\n basePath: params.basePath,\n cliVersion: params.cliVersion,\n nextSkill: installedSkill,\n });\n\n return installedSkill;\n};\n\nexport const skillListCommand = async (): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n\n p.intro('ai-ops skill list');\n const sections = [\n { kind: 'reference' as const, title: 'reference skills' },\n { kind: 'task' as const, title: 'task skills' },\n ]\n .map(({ kind, title }) => {\n const lines = allSkills\n .filter((skill) => skill.kind === kind)\n .map((skill) => {\n const installed = findInstalledSkill(installedSkills, skill.id);\n const suffix = installed ? `installed for ${installed.tools.join(', ')}` : 'not installed';\n return `- ${skill.id} - ${suffix}`;\n });\n\n if (lines.length === 0) {\n return null;\n }\n\n return `${title}\\n${lines.join('\\n')}`;\n })\n .filter((section): section is string => section !== null);\n\n p.log.info(sections.join('\\n\\n'));\n p.outro('ai-ops skill list 완료');\n};\n\nexport const skillInstallCommand = async (skillId: string, opts: SkillCommandOptions): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills, cliVersion } = loadCompilerInputs();\n const skill = resolveSkillById(allSkills, skillId);\n const requestedTools = resolveRequestedTools({ requested: opts.tool, supported: skill.supported_tools });\n\n p.intro(`ai-ops skill install ${skillId}`);\n const installedSkill = installSkill({\n skill,\n requestedTools,\n basePath,\n cliVersion,\n });\n\n p.log.success(`설치 완료: ${installedSkill.id} (${installedSkill.installed_paths.join(', ')})`);\n p.outro('ai-ops skill install 완료');\n};\n\nexport const skillDiffCommand = async (skillId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n const targets = skillId ? installedSkills.filter((skill) => skill.id === skillId) : installedSkills;\n\n p.intro('ai-ops skill diff');\n\n if (targets.length === 0) {\n p.log.warn('비교할 설치된 skill이 없습니다.');\n p.outro('ai-ops skill diff 완료');\n return;\n }\n\n const lines = targets.map((installedSkill) => {\n const skill = resolveSkillById(allSkills, installedSkill.id);\n const { installedSkill: next } = buildSkillInstallPlan({\n skill,\n requestedTools: installedSkill.tools,\n });\n const changed = next.sourceHash !== installedSkill.sourceHash;\n return `- ${installedSkill.id}: ${changed ? 'changed' : 'up-to-date'} (${installedSkill.sourceHash} -> ${next.sourceHash})`;\n });\n\n p.log.info(lines.join('\\n'));\n p.outro('ai-ops skill diff 완료');\n};\n\nexport const skillUpdateCommand = async (skillId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills, cliVersion } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n const targets = skillId ? installedSkills.filter((skill) => skill.id === skillId) : installedSkills;\n\n p.intro('ai-ops skill update');\n\n if (targets.length === 0) {\n p.log.warn('갱신할 설치된 skill이 없습니다.');\n p.outro('ai-ops skill update 완료');\n return;\n }\n\n const nextInstalledSkills = targets.map((installedSkill) => {\n const skill = resolveSkillById(allSkills, installedSkill.id);\n const { packages, installedSkill: next } = buildSkillInstallPlan({\n skill,\n requestedTools: installedSkill.tools,\n });\n installSkillPackages(basePath, packages);\n return next;\n });\n\n const registryPath = resolveSkillRegistryPath(basePath);\n const previous = readSkillRegistry(registryPath);\n const nextSkillIds = new Set(nextInstalledSkills.map((skill) => skill.id));\n const untouched = (previous?.skills ?? []).filter(\n (installedSkill) => !nextSkillIds.has(resolveCanonicalSkillId(installedSkill.id)),\n );\n writeSkillRegistry(registryPath, {\n skills: [...untouched, ...nextInstalledSkills],\n cliVersion,\n generatedAt: new Date().toISOString(),\n });\n\n p.log.success(`갱신 완료: ${nextInstalledSkills.map((skill) => skill.id).join(', ')}`);\n p.outro('ai-ops skill update 완료');\n};\n\nexport const skillUninstallCommand = async (skillId: string): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { cliVersion } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n const installedSkill = findInstalledSkill(installedSkills, skillId);\n\n p.intro(`ai-ops skill uninstall ${skillId}`);\n\n if (!installedSkill) {\n p.log.warn('설치된 skill을 찾지 못했습니다.');\n p.outro('ai-ops skill uninstall 완료');\n return;\n }\n\n const removed = removeDirectories(basePath, installedSkill.installed_paths);\n\n writeUserSkillState({\n basePath,\n cliVersion,\n removeSkillId: skillId,\n });\n\n p.log.success(`제거 완료: ${removed.join(', ')}`);\n p.outro('ai-ops skill uninstall 완료');\n};\n","import { resolveCanonicalSkillId, SKILL_TOOL } from '@/core/index.js';\nimport type { InstalledSkill, ToolId } from '@/core/index.js';\n\nexport const resolveRequestedTools = (params: {\n requested?: readonly string[];\n supported: readonly string[];\n}): ToolId[] => {\n if (params.requested === undefined || params.requested.length === 0) {\n return [...params.supported] as ToolId[];\n }\n\n const supportedSet = new Set(params.supported);\n const invalid = params.requested.filter((tool) => !supportedSet.has(tool));\n if (invalid.length > 0) {\n throw new Error(`Unsupported tools requested: ${invalid.join(', ')}`);\n }\n\n return [...params.requested] as ToolId[];\n};\n\nconst TOOL_ORDER = [SKILL_TOOL.CLAUDE_CODE, SKILL_TOOL.CODEX, SKILL_TOOL.GEMINI] as const;\n\nexport const mergeSkillTools = (params: { existing?: readonly string[]; requested: readonly ToolId[] }): ToolId[] => {\n const merged = new Set([...(params.existing ?? []), ...params.requested]);\n return TOOL_ORDER.filter((tool) => merged.has(tool));\n};\n\nexport const subtractSkillTools = (params: {\n requested: readonly ToolId[];\n installed?: readonly string[];\n}): ToolId[] => {\n const installed = new Set(params.installed ?? []);\n return params.requested.filter((tool) => !installed.has(tool));\n};\n\nexport const upsertInstalledSkill = (\n installedSkills: readonly InstalledSkill[],\n nextSkill: InstalledSkill,\n): InstalledSkill[] => {\n const nextSkillId = resolveCanonicalSkillId(nextSkill.id);\n const remaining = installedSkills.filter((skill) => resolveCanonicalSkillId(skill.id) !== nextSkillId);\n return [...remaining, nextSkill];\n};\n\nexport const removeInstalledSkill = (installedSkills: readonly InstalledSkill[], skillId: string): InstalledSkill[] => {\n const targetSkillId = resolveCanonicalSkillId(skillId);\n return installedSkills.filter((skill) => resolveCanonicalSkillId(skill.id) !== targetSkillId);\n};\n\nexport const findInstalledSkill = (\n installedSkills: readonly InstalledSkill[],\n skillId: string,\n): InstalledSkill | undefined => {\n const targetSkillId = resolveCanonicalSkillId(skillId);\n return installedSkills.find((skill) => resolveCanonicalSkillId(skill.id) === targetSkillId);\n};\n","import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { SkillPackage } from '@/core/index.js';\n\nexport const installSkillPackages = (basePath: string, packages: readonly SkillPackage[]): string[] => {\n const writtenRoots: string[] = [];\n\n for (const skillPackage of packages) {\n const absRoot = resolve(basePath, skillPackage.rootDir);\n if (existsSync(absRoot)) {\n rmSync(absRoot, { recursive: true, force: true });\n }\n\n for (const file of skillPackage.files) {\n const absPath = resolve(basePath, file.relativePath);\n mkdirSync(dirname(absPath), { recursive: true });\n writeFileSync(absPath, file.content + '\\n', 'utf-8');\n }\n\n writtenRoots.push(skillPackage.rootDir);\n }\n\n return writtenRoots;\n};\n\nexport const removeDirectories = (basePath: string, relativeDirs: readonly string[]): string[] => {\n const removed: string[] = [];\n\n for (const relativeDir of relativeDirs) {\n const absPath = resolve(basePath, relativeDir);\n if (!existsSync(absPath)) continue;\n rmSync(absPath, { recursive: true, force: true });\n removed.push(relativeDir);\n }\n\n return removed;\n};\n","import * as p from '@clack/prompts';\nimport { existsSync, rmSync } from 'node:fs';\nimport type { InstalledSubagent, Subagent, ToolId } from '@/core/index.js';\nimport {\n buildSubagentInstallPlan,\n getCliVersion,\n loadAllSubagents,\n readSubagentManifest,\n resolveSubagentManifestPath,\n writeSubagentManifest,\n} from '@/core/index.js';\nimport { resolveSubagentsDir, resolveUserBasePath } from '../lib/paths.js';\nimport { installSubagentPackages, removeSubagentFiles } from '../lib/subagent-install.js';\nimport {\n findInstalledSubagent,\n mergeSubagentTools,\n removeInstalledSubagent,\n resolveInstalledSubagentPaths,\n resolveRequestedSubagentTools,\n upsertInstalledSubagent,\n} from '../lib/subagent-state.js';\n\ntype SubagentCommandOptions = {\n tool?: string[];\n};\n\nconst loadCompilerInputs = (): {\n allSubagents: ReturnType<typeof loadAllSubagents>;\n cliVersion: string;\n} => {\n return {\n allSubagents: loadAllSubagents(resolveSubagentsDir()),\n cliVersion: getCliVersion(),\n };\n};\n\nconst resolveSubagentById = (subagents: readonly Subagent[], subagentId: string): Subagent => {\n const subagent = subagents.find((candidate) => candidate.id === subagentId);\n if (!subagent) {\n throw new Error(`Unknown subagent: ${subagentId}`);\n }\n return subagent;\n};\n\nconst writeUserSubagentState = (params: {\n basePath: string;\n cliVersion: string;\n nextSubagent?: InstalledSubagent;\n removeSubagentId?: string;\n}): void => {\n const manifestPath = resolveSubagentManifestPath(params.basePath);\n const previous = readSubagentManifest(manifestPath);\n const subagents = params.removeSubagentId\n ? removeInstalledSubagent(previous?.subagents ?? [], params.removeSubagentId)\n : params.nextSubagent\n ? upsertInstalledSubagent(previous?.subagents ?? [], params.nextSubagent)\n : (previous?.subagents ?? []);\n\n if (subagents.length === 0) {\n rmSync(manifestPath, { force: true });\n return;\n }\n\n writeSubagentManifest(manifestPath, {\n subagents,\n cliVersion: params.cliVersion,\n generatedAt: new Date().toISOString(),\n });\n};\n\nconst readInstalledSubagents = (basePath: string): InstalledSubagent[] =>\n readSubagentManifest(resolveSubagentManifestPath(basePath))?.subagents ?? [];\n\nconst warnMissingSkills = (requiredSkills: ReturnType<typeof buildSubagentInstallPlan>['requiredSkills']): void => {\n const missing = requiredSkills.filter((skill) => !existsSync(skill.path));\n if (missing.length === 0) {\n return;\n }\n\n p.log.warn(\n [\n '필요한 skill이 아직 설치되지 않았습니다. subagent 설치는 계속 진행합니다.',\n ...missing.map((skill) => `- ${skill.tool}:${skill.skillName} (${skill.path})`),\n ].join('\\n'),\n );\n};\n\nconst installSubagent = (params: {\n subagent: Subagent;\n requestedTools: readonly ToolId[];\n basePath: string;\n cliVersion: string;\n}): InstalledSubagent => {\n const installedSubagents = readInstalledSubagents(params.basePath);\n const existingInstalledSubagent = findInstalledSubagent(installedSubagents, params.subagent.id);\n const nextRequestedTools = mergeSubagentTools({\n existing: existingInstalledSubagent?.tools,\n requested: params.requestedTools,\n });\n const { packages, installedSubagent, requiredSkills } = buildSubagentInstallPlan({\n subagent: params.subagent,\n requestedTools: nextRequestedTools,\n userBasePath: params.basePath,\n });\n installSubagentPackages(params.basePath, packages);\n warnMissingSkills(requiredSkills);\n\n writeUserSubagentState({\n basePath: params.basePath,\n cliVersion: params.cliVersion,\n nextSubagent: installedSubagent,\n });\n\n return installedSubagent;\n};\n\nexport const subagentListCommand = async (): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents } = loadCompilerInputs();\n const installedSubagents = readInstalledSubagents(basePath);\n\n p.intro('ai-ops subagent list');\n const lines = allSubagents.map((subagent) => {\n const installed = findInstalledSubagent(installedSubagents, subagent.id);\n const suffix = installed ? `installed for ${installed.tools.join(', ')}` : 'not installed';\n return `- ${subagent.id} - ${suffix}`;\n });\n\n p.log.info(lines.join('\\n'));\n p.outro('ai-ops subagent list 완료');\n};\n\nexport const subagentInstallCommand = async (subagentId: string, opts: SubagentCommandOptions): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents, cliVersion } = loadCompilerInputs();\n const subagent = resolveSubagentById(allSubagents, subagentId);\n const requestedTools = resolveRequestedSubagentTools({ requested: opts.tool, supported: subagent.supported_tools });\n\n p.intro(`ai-ops subagent install ${subagentId}`);\n const installedSubagent = installSubagent({\n subagent,\n requestedTools,\n basePath,\n cliVersion,\n });\n\n p.log.success(`설치 완료: ${installedSubagent.id} (${installedSubagent.installed_paths.join(', ')})`);\n p.outro('ai-ops subagent install 완료');\n};\n\nexport const subagentDiffCommand = async (subagentId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents } = loadCompilerInputs();\n const installedSubagents = readInstalledSubagents(basePath);\n const targets = subagentId\n ? installedSubagents.filter((subagent) => subagent.id === subagentId)\n : installedSubagents;\n\n p.intro('ai-ops subagent diff');\n\n if (targets.length === 0) {\n p.log.warn('비교할 설치된 subagent가 없습니다.');\n p.outro('ai-ops subagent diff 완료');\n return;\n }\n\n const lines = targets.map((installedSubagent) => {\n const subagent = resolveSubagentById(allSubagents, installedSubagent.id);\n const { installedSubagent: next } = buildSubagentInstallPlan({\n subagent,\n requestedTools: installedSubagent.tools,\n userBasePath: basePath,\n });\n const changed = next.sourceHash !== installedSubagent.sourceHash;\n return `- ${installedSubagent.id}: ${changed ? 'changed' : 'up-to-date'} (${installedSubagent.sourceHash} -> ${next.sourceHash})`;\n });\n\n p.log.info(lines.join('\\n'));\n p.outro('ai-ops subagent diff 완료');\n};\n\nexport const subagentUpdateCommand = async (subagentId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents, cliVersion } = loadCompilerInputs();\n const installedSubagents = readInstalledSubagents(basePath);\n const targets = subagentId\n ? installedSubagents.filter((subagent) => subagent.id === subagentId)\n : installedSubagents;\n\n p.intro('ai-ops subagent update');\n\n if (targets.length === 0) {\n p.log.warn('갱신할 설치된 subagent가 없습니다.');\n p.outro('ai-ops subagent update 완료');\n return;\n }\n\n const nextInstalledSubagents = targets.map((installedSubagent) => {\n const subagent = resolveSubagentById(allSubagents, installedSubagent.id);\n const { packages, installedSubagent: next, requiredSkills } = buildSubagentInstallPlan({\n subagent,\n requestedTools: installedSubagent.tools,\n userBasePath: basePath,\n });\n installSubagentPackages(basePath, packages);\n warnMissingSkills(requiredSkills);\n return next;\n });\n\n const manifestPath = resolveSubagentManifestPath(basePath);\n const previous = readSubagentManifest(manifestPath);\n const nextSubagentIds = new Set(nextInstalledSubagents.map((subagent) => subagent.id));\n const untouched = (previous?.subagents ?? []).filter((subagent) => !nextSubagentIds.has(subagent.id));\n writeSubagentManifest(manifestPath, {\n subagents: [...untouched, ...nextInstalledSubagents],\n cliVersion,\n generatedAt: new Date().toISOString(),\n });\n\n p.log.success(`갱신 완료: ${nextInstalledSubagents.map((subagent) => subagent.id).join(', ')}`);\n p.outro('ai-ops subagent update 완료');\n};\n\nexport const subagentUninstallCommand = async (subagentId: string): Promise<void> => {\n const basePath = resolveUserBasePath();\n const cliVersion = getCliVersion();\n const installedSubagents = readInstalledSubagents(basePath);\n const installedSubagent = findInstalledSubagent(installedSubagents, subagentId);\n\n p.intro(`ai-ops subagent uninstall ${subagentId}`);\n\n if (!installedSubagent) {\n p.log.warn('설치된 subagent를 찾지 못했습니다.');\n p.outro('ai-ops subagent uninstall 완료');\n return;\n }\n\n const removed = removeSubagentFiles(basePath, resolveInstalledSubagentPaths(installedSubagent));\n\n writeUserSubagentState({\n basePath,\n cliVersion,\n removeSubagentId: subagentId,\n });\n\n p.log.success(`제거 완료: ${removed.join(', ')}`);\n p.outro('ai-ops subagent uninstall 완료');\n};\n","import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, relative, resolve } from 'node:path';\nimport type { SubagentPackage } from '@/core/index.js';\n\nconst resolveInsideBasePath = (basePath: string, relativePath: string): string => {\n const absBasePath = resolve(basePath);\n const absPath = resolve(absBasePath, relativePath);\n const fromBase = relative(absBasePath, absPath);\n\n if (fromBase.length === 0 || fromBase.startsWith('..') || isAbsolute(fromBase)) {\n throw new Error(`Subagent path escapes AI_OPS_HOME: ${relativePath}`);\n }\n\n return absPath;\n};\n\nexport const installSubagentPackages = (basePath: string, packages: readonly SubagentPackage[]): string[] => {\n const written: string[] = [];\n\n for (const subagentPackage of packages) {\n for (const file of subagentPackage.files) {\n const absPath = resolveInsideBasePath(basePath, file.relativePath);\n if (existsSync(absPath)) {\n rmSync(absPath, { recursive: true, force: true });\n }\n mkdirSync(dirname(absPath), { recursive: true });\n writeFileSync(absPath, file.content.trimEnd() + '\\n', 'utf-8');\n written.push(file.relativePath);\n }\n }\n\n return written;\n};\n\nexport const removeSubagentFiles = (basePath: string, relativePaths: readonly string[]): string[] => {\n const removed: string[] = [];\n\n for (const relativePath of relativePaths) {\n const absPath = resolveInsideBasePath(basePath, relativePath);\n if (!existsSync(absPath)) continue;\n rmSync(absPath, { recursive: true, force: true });\n removed.push(relativePath);\n }\n\n return removed;\n};\n","import { buildSubagentRelativePath, SKILL_TOOL } from '@/core/index.js';\nimport type { InstalledSubagent, ToolId } from '@/core/index.js';\n\nexport const resolveRequestedSubagentTools = (params: {\n requested?: readonly string[];\n supported: readonly string[];\n}): ToolId[] => {\n if (params.requested === undefined || params.requested.length === 0) {\n return [...params.supported] as ToolId[];\n }\n\n const supportedSet = new Set(params.supported);\n const invalid = params.requested.filter((tool) => !supportedSet.has(tool));\n if (invalid.length > 0) {\n throw new Error(`Unsupported tools requested: ${invalid.join(', ')}`);\n }\n\n return [...params.requested] as ToolId[];\n};\n\nconst TOOL_ORDER = [SKILL_TOOL.CLAUDE_CODE, SKILL_TOOL.CODEX, SKILL_TOOL.GEMINI] as const;\n\nexport const mergeSubagentTools = (params: { existing?: readonly string[]; requested: readonly ToolId[] }): ToolId[] => {\n const merged = new Set([...(params.existing ?? []), ...params.requested]);\n return TOOL_ORDER.filter((tool) => merged.has(tool));\n};\n\nexport const upsertInstalledSubagent = (\n installedSubagents: readonly InstalledSubagent[],\n nextSubagent: InstalledSubagent,\n): InstalledSubagent[] => {\n const remaining = installedSubagents.filter((subagent) => subagent.id !== nextSubagent.id);\n return [...remaining, nextSubagent];\n};\n\nexport const removeInstalledSubagent = (\n installedSubagents: readonly InstalledSubagent[],\n subagentId: string,\n): InstalledSubagent[] => installedSubagents.filter((subagent) => subagent.id !== subagentId);\n\nexport const findInstalledSubagent = (\n installedSubagents: readonly InstalledSubagent[],\n subagentId: string,\n): InstalledSubagent | undefined => installedSubagents.find((subagent) => subagent.id === subagentId);\n\nexport const resolveInstalledSubagentPaths = (installedSubagent: InstalledSubagent): string[] =>\n installedSubagent.tools.map((tool) => buildSubagentRelativePath(installedSubagent.id, tool));\n","import * as p from '@clack/prompts';\nimport {\n diffProjectLayerPack,\n installProjectLayerPack,\n loadAllPacks,\n readProjectLayerManifest,\n uninstallProjectLayerPack,\n updateProjectLayerPack,\n} from '@/core/index.js';\nimport type { ProjectLayerManifest } from '@/core/index.js';\nimport { resolveBasePath, resolvePacksDir } from '../lib/paths.js';\n\nconst readManifestForPackCommand = (basePath: string): ProjectLayerManifest | null => {\n try {\n return readProjectLayerManifest(basePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'unknown error';\n p.log.error(`.ai-ops/manifest.json 파싱 실패: ${message}`);\n process.exitCode = 1;\n return null;\n }\n};\n\nconst reportPackError = (error: unknown): void => {\n const message = error instanceof Error ? error.message : 'unknown error';\n p.log.error(message);\n process.exitCode = 1;\n};\n\nexport const packListCommand = async (): Promise<void> => {\n const basePath = resolveBasePath();\n const packs = loadAllPacks(resolvePacksDir());\n const manifest = readManifestForPackCommand(basePath);\n const installedPackIds = new Set(manifest?.packs.map((pack) => pack.id) ?? []);\n\n p.intro('ai-ops pack list');\n p.log.info(\n packs\n .map((pack) => {\n const suffix = installedPackIds.has(pack.id) ? 'installed' : 'not installed';\n return `- ${pack.id} - ${suffix}`;\n })\n .join('\\n'),\n );\n p.outro('ai-ops pack list 완료');\n};\n\nexport const packInstallCommand = async (packId: string): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro(`ai-ops pack install ${packId}`);\n try {\n const result = installProjectLayerPack({ basePath, packId, packsDir: resolvePacksDir() });\n p.log.success(`pack 설치 완료: ${packId}`);\n if (result.written.length > 0) {\n p.log.info(`생성:\\n${result.written.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.refreshed.length > 0) {\n p.log.info(`갱신:\\n${result.refreshed.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack install 완료');\n};\n\nexport const packDiffCommand = async (packId: string | undefined): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops pack diff');\n try {\n const report = diffProjectLayerPack({ basePath, packId, packsDir: resolvePacksDir() });\n if (report.issues.length === 0) {\n p.log.success('변경 사항 없음. pack이 최신 상태입니다.');\n p.outro('ai-ops pack diff 완료');\n return;\n }\n\n for (const item of report.issues) {\n const line = `[${item.code}] ${item.message}`;\n if (item.level === 'error') {\n p.log.error(line);\n } else {\n p.log.warn(line);\n }\n }\n\n if (report.issues.some((item) => item.level === 'error')) {\n process.exitCode = 1;\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack diff 완료');\n};\n\nexport const packUpdateCommand = async (packId: string | undefined): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops pack update');\n try {\n const manifest = readManifestForPackCommand(basePath);\n if (!manifest) {\n p.log.error('.ai-ops/manifest.json이 없습니다. 먼저 ai-ops init을 실행하세요.');\n process.exitCode = 1;\n p.outro('ai-ops pack update 완료');\n return;\n }\n\n const targetPackIds = packId ? [packId] : manifest.packs.map((pack) => pack.id);\n if (targetPackIds.length === 0) {\n p.log.warn('갱신할 설치된 pack이 없습니다.');\n p.outro('ai-ops pack update 완료');\n return;\n }\n\n for (const targetPackId of targetPackIds) {\n const result = updateProjectLayerPack({ basePath, packId: targetPackId, packsDir: resolvePacksDir() });\n p.log.success(`pack 갱신 완료: ${targetPackId}`);\n if (result.refreshed.length > 0) {\n p.log.info(`갱신:\\n${result.refreshed.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack update 완료');\n};\n\nexport const packUninstallCommand = async (packId: string): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro(`ai-ops pack uninstall ${packId}`);\n try {\n const result = uninstallProjectLayerPack({ basePath, packId });\n p.log.success(`pack 제거 완료: ${packId}`);\n if (result.deleted.length > 0) {\n p.log.info(`삭제:\\n${result.deleted.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack uninstall 완료');\n};\n"],"mappings":"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","names":["p","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","join","parse","join","join","parse","join","join","readFileSync","readdirSync","join","resolve","resolve","readFileSync","join","resolve","normalizeSelectedTools","resolve","readFileSync","dirname","join","mkdirSync","readFileSync","writeFileSync","dirname","join","join","readFileSync","mkdirSync","dirname","writeFileSync","mkdirSync","readFileSync","writeFileSync","dirname","join","join","readFileSync","mkdirSync","dirname","writeFileSync","join","mkdirSync","readFileSync","readdirSync","writeFileSync","dirname","join","resolve","dirname","resolve","fileURLToPath","__dirname","join","dirname","resolve","readFileSync","mkdirSync","writeFileSync","readdirSync","existsSync","mkdirSync","readFileSync","readdirSync","rmSync","writeFileSync","dirname","isAbsolute","join","relative","resolve","RESERVED_DOCUMENT_WARNINGS","join","includesReservedDocumentWarning","readFileSync","readdirSync","resolve","relative","isAbsolute","mkdirSync","dirname","writeFileSync","existsSync","rmSync","removeEmptyDirs","pack","join","join","join","issue","p","p","p","p","p","rmSync","TOOL_ORDER","existsSync","mkdirSync","rmSync","writeFileSync","dirname","resolve","rmSync","p","existsSync","rmSync","existsSync","mkdirSync","rmSync","writeFileSync","dirname","isAbsolute","relative","resolve","TOOL_ORDER","loadCompilerInputs","rmSync","existsSync","p"]}
|
|
1
|
+
{"version":3,"sources":["../../src/bin/index.ts","../../src/commands/init.ts","../../src/core/schemas/rule.schema.ts","../../src/core/schemas/preset.schema.ts","../../src/core/schemas/skill.schema.ts","../../src/core/schemas/skill-catalog.schema.ts","../../src/core/schemas/skill-registry.schema.ts","../../src/core/schemas/subagent.schema.ts","../../src/core/schemas/project-layer.schema.ts","../../src/core/subagent-paths.ts","../../src/core/schemas/subagent-catalog.schema.ts","../../src/core/schemas/subagent-manifest.schema.ts","../../src/core/schemas/pack.schema.ts","../../src/core/schemas/manifest.schema.ts","../../src/core/loader.ts","../../src/core/frontmatter.ts","../../src/core/subagent-toml.ts","../../src/core/renderer.ts","../../src/core/skill-renderer.ts","../../src/core/source-hash.ts","../../src/core/subagent-renderer.ts","../../src/core/managed-header.ts","../../src/core/manifest-io.ts","../../src/core/manifest-resolution.ts","../../src/core/skill-registry-io.ts","../../src/core/subagent-manifest-io.ts","../../src/core/install-plan.ts","../../src/core/project-layer.ts","../../src/core/paths.ts","../../src/core/pack.ts","../../src/core/uninstall-plan.ts","../../src/lib/paths.ts","../../src/commands/project-layer-errors.ts","../../src/commands/update.ts","../../src/commands/diff.ts","../../src/commands/audit.ts","../../src/commands/uninstall.ts","../../src/commands/skill.ts","../../src/lib/skill-state.ts","../../src/lib/skill-install.ts","../../src/commands/subagent.ts","../../src/lib/subagent-install.ts","../../src/lib/subagent-state.ts","../../src/commands/pack.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { initCommand } from '../commands/init.js';\nimport { updateCommand } from '../commands/update.js';\nimport { diffCommand } from '../commands/diff.js';\nimport { auditCommand } from '../commands/audit.js';\nimport { uninstallCommand } from '../commands/uninstall.js';\nimport {\n skillDiffCommand,\n skillInstallCommand,\n skillListCommand,\n skillUninstallCommand,\n skillUpdateCommand,\n} from '../commands/skill.js';\nimport {\n subagentDiffCommand,\n subagentInstallCommand,\n subagentListCommand,\n subagentUninstallCommand,\n subagentUpdateCommand,\n} from '../commands/subagent.js';\nimport {\n packDiffCommand,\n packInstallCommand,\n packListCommand,\n packUninstallCommand,\n packUpdateCommand,\n} from '../commands/pack.js';\n\nconst program = new Command();\n\nprogram.name('ai-ops').description('AI agent operating layer manager').version('0.1.0');\n\nprogram\n .command('init')\n .description('project operating layer 초기 설치')\n .option('--tool <tool...>', '대상 도구 adapter 지정 (codex|gemini|claude-code)')\n .action((opts: { tool?: string[] }) => initCommand(opts));\n\nprogram\n .command('update')\n .description('project operating layer 갱신')\n .option('--force', '변경 없어도 강제 재설치', false)\n .action((opts: { force: boolean }) => updateCommand(opts));\n\nprogram\n .command('diff')\n .description('project operating layer drift 비교')\n .action(() => diffCommand());\n\nprogram\n .command('audit')\n .description('project operating layer 상태 검사')\n .action(() => auditCommand());\n\nprogram\n .command('uninstall')\n .description('project operating layer 제거')\n .option('--yes', '확인 프롬프트 없이 제거', false)\n .action((opts: { yes?: boolean }) => uninstallCommand(opts));\n\nconst skillCommand = program.command('skill').description('에이전트 skill 설치/조회/갱신');\n\nconst applySkillInstallOptions = (command: Command): Command => command.option('--tool <tool...>', '대상 도구 지정');\n\nskillCommand.command('list').description('사용 가능한 skill 목록').action(() => skillListCommand());\n\napplySkillInstallOptions(skillCommand.command('install <skillId>').description('skill 설치')).action((skillId, opts) =>\n skillInstallCommand(skillId, opts),\n);\n\nskillCommand\n .command('diff [skillId]')\n .description('skill 변경 비교')\n .action((skillId) => skillDiffCommand(skillId));\n\nskillCommand\n .command('update [skillId]')\n .description('skill 갱신')\n .action((skillId) => skillUpdateCommand(skillId));\n\nskillCommand\n .command('uninstall <skillId>')\n .description('skill 제거')\n .action((skillId) => skillUninstallCommand(skillId));\n\nconst subagentCommand = program.command('subagent').description('에이전트 subagent 설치/조회/갱신');\n\nconst applySubagentInstallOptions = (command: Command): Command => command.option('--tool <tool...>', '대상 도구 지정');\n\nsubagentCommand.command('list').description('사용 가능한 subagent 목록').action(() => subagentListCommand());\n\napplySubagentInstallOptions(subagentCommand.command('install <subagentId>').description('subagent 설치')).action(\n (subagentId, opts) => subagentInstallCommand(subagentId, opts),\n);\n\nsubagentCommand\n .command('diff [subagentId]')\n .description('subagent 변경 비교')\n .action((subagentId) => subagentDiffCommand(subagentId));\n\nsubagentCommand\n .command('update [subagentId]')\n .description('subagent 갱신')\n .action((subagentId) => subagentUpdateCommand(subagentId));\n\nsubagentCommand\n .command('uninstall <subagentId>')\n .description('subagent 제거')\n .action((subagentId) => subagentUninstallCommand(subagentId));\n\nconst packCommand = program.command('pack').description('optional project operating layer pack 설치/조회/갱신');\n\npackCommand.command('list').description('사용 가능한 pack 목록').action(() => packListCommand());\n\npackCommand\n .command('install <packId>')\n .description('pack 설치')\n .action((packId) => packInstallCommand(packId));\n\npackCommand\n .command('diff [packId]')\n .description('pack 변경 비교')\n .action((packId) => packDiffCommand(packId));\n\npackCommand\n .command('update [packId]')\n .description('pack 갱신')\n .action((packId) => packUpdateCommand(packId));\n\npackCommand\n .command('uninstall <packId>')\n .description('pack 제거')\n .action((packId) => packUninstallCommand(packId));\n\nprogram.parse();\n","import * as p from '@clack/prompts';\nimport {\n installProjectLayer,\n readProjectLayerManifest,\n resolveProjectLayerTools,\n type ProjectLayerTool,\n} from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\nimport { reportInvalidProjectLayerManifest, reportProjectLayerApplyError } from './project-layer-errors.js';\n\ntype InitCommandOptions = {\n tool?: string[];\n};\n\nconst TOOL_OPTIONS = [\n { value: 'codex' as ProjectLayerTool, label: 'Codex' },\n { value: 'gemini' as ProjectLayerTool, label: 'Gemini CLI' },\n { value: 'claude-code' as ProjectLayerTool, label: 'Claude Code' },\n];\n\nconst promptTools = async (): Promise<ProjectLayerTool[] | null> => {\n const selectedTools = await p.multiselect<ProjectLayerTool>({\n message: 'AI 도구 adapter를 선택하세요',\n options: TOOL_OPTIONS,\n initialValues: TOOL_OPTIONS.map((option) => option.value),\n required: true,\n });\n\n return p.isCancel(selectedTools) ? null : resolveProjectLayerTools(selectedTools);\n};\n\nexport const initCommand = async (opts: InitCommandOptions = {}): Promise<void> => {\n p.intro('ai-ops init');\n const basePath = resolveBasePath();\n\n const tools = opts.tool && opts.tool.length > 0 ? resolveProjectLayerTools(opts.tool) : await promptTools();\n if (tools === null) {\n p.cancel('취소됨');\n process.exit(0);\n }\n\n let previousManifest: ReturnType<typeof readProjectLayerManifest>;\n try {\n previousManifest = readProjectLayerManifest(basePath);\n } catch (error) {\n reportInvalidProjectLayerManifest({ error, outro: 'ai-ops init 실패' });\n return;\n }\n\n let result: ReturnType<typeof installProjectLayer>;\n try {\n result = installProjectLayer({\n basePath,\n tools,\n previousManifest,\n });\n } catch (error) {\n reportProjectLayerApplyError({ error, outro: 'ai-ops init 실패' });\n return;\n }\n\n p.log.success(`project operating layer 설치 완료: ${result.manifest.managed_files.length + result.manifest.project_files.length}개 파일`);\n p.log.info(`도구 adapter: ${result.manifest.tools.join(', ')}`);\n if (result.appended.length > 0) {\n p.log.info(`기존 파일에 managed section 추가:\\n${result.appended.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.refreshedProjectFiles.length > 0) {\n p.log.info(`unmodified project-owned 파일 갱신:\\n${result.refreshedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preservedProjectFiles.length > 0) {\n p.log.info(`기존 project-owned 파일 보존:\\n${result.preservedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n\n p.outro('ai-ops init 완료');\n};\n","/**\n * Rule = SSOT의 최소 지식 단위. 하나의 코딩 컨벤션/아키텍처 규칙을 YAML로 구조화한 것.\n */\nimport { z } from 'zod';\n\nexport const DecisionTableEntrySchema = z\n .object({\n when: z.string().min(1),\n then: z.string().min(1),\n /** 조건부 규칙에서 회피해야 할 패턴 */\n avoid: z.string().min(1).optional(),\n })\n .strict();\n\nexport const RuleContentSchema = z\n .object({\n /** Anti-pattern 규칙 ('하지 마라'). guidelines보다 항상 상단 렌더링 */\n constraints: z.array(z.string().min(1)).default([]),\n /** Positive 규칙 ('해라') */\n guidelines: z.array(z.string().min(1)),\n /** 조건부 규칙. when→then→avoid 구조 */\n decision_table: z.array(DecisionTableEntrySchema).optional(),\n })\n .strict();\n\nexport const RuleSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n category: z.string().min(1),\n tags: z.array(z.string().min(1)),\n /** 0-100. 높을수록 생성 파일 상단 배치 (U-shaped attention 최적화) */\n priority: z.number().int().min(0).max(100),\n supported_tools: z.array(z.string().min(1)).min(1).default(['claude-code', 'codex', 'gemini']),\n content: RuleContentSchema,\n })\n .strict();\n\nexport type DecisionTableEntry = z.infer<typeof DecisionTableEntrySchema>;\nexport type RuleContent = z.infer<typeof RuleContentSchema>;\nexport type Rule = z.infer<typeof RuleSchema>;\n","import { z } from 'zod';\n\nexport const PresetSchema = z\n .object({\n id: z\n .string()\n .regex(/^[a-z][a-z0-9-]*$/)\n .min(1),\n description: z.string().min(1),\n rules: z.array(z.string().min(1)).min(1),\n })\n .strict();\n\nexport type Preset = z.infer<typeof PresetSchema>;\n","import { z } from 'zod';\n\nexport const SKILL_KIND = {\n REFERENCE: 'reference',\n TASK: 'task',\n} as const;\n\nexport const SKILL_TOOL = {\n CLAUDE_CODE: 'claude-code',\n CODEX: 'codex',\n GEMINI: 'gemini',\n} as const;\n\nexport const SkillKindSchema = z.union([z.literal(SKILL_KIND.REFERENCE), z.literal(SKILL_KIND.TASK)]);\nexport const SkillToolSchema = z.union([\n z.literal(SKILL_TOOL.CLAUDE_CODE),\n z.literal(SKILL_TOOL.CODEX),\n z.literal(SKILL_TOOL.GEMINI),\n]);\n\nexport const SkillFileSchema = z\n .object({\n path: z.string().min(1),\n content: z.string(),\n })\n .strict();\n\nexport const SkillFrontmatterSchema = z\n .object({\n name: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'name must be kebab-case'),\n description: z.string().min(1),\n })\n .passthrough();\n\nexport type SkillFile = z.infer<typeof SkillFileSchema>;\nexport type SkillFrontmatter = z.infer<typeof SkillFrontmatterSchema>;\nexport type Skill = {\n id: string;\n kind: z.infer<typeof SkillKindSchema>;\n description: string;\n supported_tools: z.infer<typeof SkillToolSchema>[];\n groups: string[];\n included_in_presets: string[];\n directory: string;\n files: SkillFile[];\n};\n\nexport const InstalledSkillSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n kind: SkillKindSchema,\n tools: z.array(SkillToolSchema).min(1),\n installed_paths: z.array(z.string().min(1)).min(1),\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n })\n .strip();\n\nexport type InstalledSkill = z.infer<typeof InstalledSkillSchema>;\n","import { z } from 'zod';\nimport { SkillKindSchema, SkillToolSchema } from './skill.schema.js';\n\nconst SkillIdSchema = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case');\nconst SkillCatalogPathSchema = z\n .string()\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*)+$/, 'source_path must be relative kebab-case path');\n\nexport const SkillCatalogEntrySchema = z\n .object({\n id: SkillIdSchema,\n kind: SkillKindSchema,\n supported_tools: z.array(SkillToolSchema).min(1),\n groups: z.array(z.string().min(1)),\n included_in_presets: z.array(z.string().min(1)),\n source_path: SkillCatalogPathSchema,\n })\n .strict()\n .superRefine((entry, ctx) => {\n const expectedPrefix = entry.kind === 'reference' ? 'reference-skills/' : 'task-skills/';\n\n if (!entry.source_path.startsWith(expectedPrefix)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['source_path'],\n message: `source_path must start with ${expectedPrefix}`,\n });\n }\n });\n\nexport const SkillCatalogSchema = z\n .object({\n skills: z.array(SkillCatalogEntrySchema),\n })\n .strict();\n\nexport type SkillCatalogEntry = z.infer<typeof SkillCatalogEntrySchema>;\nexport type SkillCatalog = z.infer<typeof SkillCatalogSchema>;\n","import { z } from 'zod';\nimport { InstalledSkillSchema } from './skill.schema.js';\n\nexport const SkillRegistrySchema = z\n .object({\n skills: z.array(InstalledSkillSchema),\n cliVersion: z.string().optional(),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type SkillRegistry = z.infer<typeof SkillRegistrySchema>;\n","import { z } from 'zod';\nimport { SkillToolSchema } from './skill.schema.js';\nimport { isSafeProjectLayerPath } from './project-layer.schema.js';\nimport { buildSubagentRelativePath } from '../subagent-paths.js';\n\nexport const SubagentIdSchema = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case');\n\nexport const SubagentMarkdownFrontmatterSchema = z\n .object({\n name: SubagentIdSchema,\n description: z.string().min(1),\n })\n .passthrough();\n\nconst TomlValueSchema = z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]);\nconst SubagentInstalledPathSchema = z\n .string()\n .min(1)\n .refine(isSafeProjectLayerPath, 'installed path must be safe relative path');\n\nexport const CodexSubagentFrontmatterSchema = z\n .object({\n name: SubagentIdSchema,\n description: z.string().min(1),\n skill_names: z.array(SubagentIdSchema).optional(),\n })\n .catchall(TomlValueSchema);\n\nexport type SubagentMarkdownFrontmatter = z.infer<typeof SubagentMarkdownFrontmatterSchema>;\nexport type CodexSubagentFrontmatter = z.infer<typeof CodexSubagentFrontmatterSchema>;\n\nexport type Subagent = {\n id: string;\n supported_tools: z.infer<typeof SkillToolSchema>[];\n source_path: string;\n directory: string;\n prompt: string;\n frontmatter: {\n claude: {\n raw: string;\n parsed: SubagentMarkdownFrontmatter;\n };\n codex: {\n raw: string;\n parsed: CodexSubagentFrontmatter;\n };\n gemini: {\n raw: string;\n parsed: SubagentMarkdownFrontmatter;\n };\n };\n};\n\nexport const InstalledSubagentSchema = z\n .object({\n id: SubagentIdSchema,\n tools: z.array(SkillToolSchema).min(1),\n installed_paths: z.array(SubagentInstalledPathSchema).min(1),\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n })\n .strip()\n .superRefine((subagent, ctx) => {\n const expectedPaths = new Set(subagent.tools.map((tool) => buildSubagentRelativePath(subagent.id, tool)));\n const installedPaths = new Set(subagent.installed_paths);\n\n if (installedPaths.size !== subagent.installed_paths.length) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['installed_paths'],\n message: 'installed_paths must not contain duplicates',\n });\n return;\n }\n\n if (installedPaths.size !== expectedPaths.size) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['installed_paths'],\n message: 'installed_paths must match id and tools',\n });\n return;\n }\n\n for (const installedPath of installedPaths) {\n if (!expectedPaths.has(installedPath)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['installed_paths'],\n message: 'installed_paths must match id and tools',\n });\n return;\n }\n }\n });\n\nexport type InstalledSubagent = z.infer<typeof InstalledSubagentSchema>;\n","import { z } from 'zod';\n\nexport const ProjectLayerToolSchema = z.enum(['claude-code', 'codex', 'gemini']);\n\nexport const ProjectLayerDocumentStatusSchema = z.enum(['Active', 'Reserved', 'Draft', 'Archived']);\n\nconst ShortHashSchema = z.string().regex(/^[a-f0-9]{6}$/, 'hash must be 6 lowercase hex chars');\n\nexport const isSafeProjectLayerPath = (value: string): boolean => {\n if (value.length === 0) return false;\n if (value.includes('\\0')) return false;\n if (value.includes('\\\\')) return false;\n if (value.startsWith('/')) return false;\n if (/^[A-Za-z]:/.test(value)) return false;\n\n const segments = value.split('/');\n return segments.every((segment) => segment.length > 0 && segment !== '.' && segment !== '..');\n};\n\nconst ProjectLayerPathSchema = z\n .string()\n .min(1)\n .refine(isSafeProjectLayerPath, 'path must be a safe project-relative path');\n\nexport const ProjectLayerFrontmatterSchema = z\n .object({\n status: ProjectLayerDocumentStatusSchema,\n layer: z.string().min(1),\n owner: z.string().min(1),\n read_when: z.array(z.string().min(1)).min(1),\n update_when: z.array(z.string().min(1)).min(1),\n })\n .strict();\n\nexport const ProjectLayerManagedFileSchema = z\n .object({\n path: ProjectLayerPathSchema,\n sourceHash: ShortHashSchema,\n })\n .strict();\n\nexport const ProjectLayerProjectFileSchema = z\n .object({\n path: ProjectLayerPathSchema,\n templateHash: ShortHashSchema,\n created: z.boolean(),\n })\n .strict();\n\nexport const ProjectLayerPackFileRecordSchema = z\n .object({\n path: ProjectLayerPathSchema,\n sourceHash: ShortHashSchema,\n })\n .strict();\n\nexport const ProjectLayerPackRecordSchema = z\n .object({\n id: z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case'),\n sourceHash: ShortHashSchema,\n documents: z.array(ProjectLayerPackFileRecordSchema),\n files: z.array(ProjectLayerPackFileRecordSchema),\n installedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport const ProjectLayerManifestSchema = z\n .object({\n schemaVersion: z.literal(1),\n kind: z.literal('project-operating-layer'),\n tools: z.array(ProjectLayerToolSchema).min(1),\n managed_files: z.array(ProjectLayerManagedFileSchema),\n project_files: z.array(ProjectLayerProjectFileSchema),\n packs: z.array(ProjectLayerPackRecordSchema).default([]),\n settings: z.record(z.unknown()),\n sourceHash: ShortHashSchema,\n cliVersion: z.string().min(1),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport const ProjectLayerContextDocumentSchema = ProjectLayerFrontmatterSchema.extend({\n path: ProjectLayerPathSchema,\n contentHash: ShortHashSchema,\n}).strict();\n\nexport const ProjectLayerContextIndexSchema = z\n .object({\n schemaVersion: z.literal(1),\n kind: z.literal('context-layer-index'),\n documents: z.array(ProjectLayerContextDocumentSchema),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type ProjectLayerTool = z.infer<typeof ProjectLayerToolSchema>;\nexport type ProjectLayerDocumentStatus = z.infer<typeof ProjectLayerDocumentStatusSchema>;\nexport type ProjectLayerFrontmatter = z.infer<typeof ProjectLayerFrontmatterSchema>;\nexport type ProjectLayerManagedFile = z.infer<typeof ProjectLayerManagedFileSchema>;\nexport type ProjectLayerProjectFile = z.infer<typeof ProjectLayerProjectFileSchema>;\nexport type ProjectLayerPackFileRecord = z.infer<typeof ProjectLayerPackFileRecordSchema>;\nexport type ProjectLayerPackRecord = z.infer<typeof ProjectLayerPackRecordSchema>;\nexport type ProjectLayerManifest = z.infer<typeof ProjectLayerManifestSchema>;\nexport type ProjectLayerContextDocument = z.infer<typeof ProjectLayerContextDocumentSchema>;\nexport type ProjectLayerContextIndex = z.infer<typeof ProjectLayerContextIndexSchema>;\n","import { join } from 'node:path';\nimport type { ToolId } from './tool-output.js';\n\nconst SUBAGENT_TOOL_OUTPUTS: Readonly<Record<ToolId, { dir: string; extension: string }>> = {\n 'claude-code': {\n dir: '.claude/agents',\n extension: '.md',\n },\n codex: {\n dir: '.codex/agents',\n extension: '.toml',\n },\n gemini: {\n dir: '.gemini/agents',\n extension: '.md',\n },\n} as const;\n\nexport const buildSubagentRelativePath = (subagentId: string, toolId: ToolId): string => {\n const output = SUBAGENT_TOOL_OUTPUTS[toolId];\n return join(output.dir, `${subagentId}${output.extension}`);\n};\n","import { z } from 'zod';\nimport { SkillToolSchema } from './skill.schema.js';\nimport { SubagentIdSchema } from './subagent.schema.js';\n\nconst SubagentCatalogPathSchema = z\n .string()\n .regex(\n /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*)*$/,\n 'source_path must be relative kebab-case path',\n );\n\nexport const SubagentCatalogEntrySchema = z\n .object({\n id: SubagentIdSchema,\n supported_tools: z.array(SkillToolSchema).min(1),\n source_path: SubagentCatalogPathSchema,\n })\n .strict();\n\nexport const SubagentCatalogSchema = z\n .object({\n subagents: z.array(SubagentCatalogEntrySchema),\n })\n .strict();\n\nexport type SubagentCatalogEntry = z.infer<typeof SubagentCatalogEntrySchema>;\nexport type SubagentCatalog = z.infer<typeof SubagentCatalogSchema>;\n","import { z } from 'zod';\nimport { InstalledSubagentSchema } from './subagent.schema.js';\n\nexport const SubagentManifestSchema = z\n .object({\n subagents: z.array(InstalledSubagentSchema),\n cliVersion: z.string().optional(),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type SubagentManifest = z.infer<typeof SubagentManifestSchema>;\n","import { z } from 'zod';\n\nconst PackIdSchema = z.string().regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'id must be kebab-case');\nconst PackSourcePathSchema = z\n .string()\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*(?:\\/[a-z0-9]+(?:-[a-z0-9]+)*)*$/, 'source_path must be relative kebab-case path');\n\nexport const PackCatalogEntrySchema = z\n .object({\n id: PackIdSchema,\n source_path: PackSourcePathSchema,\n })\n .strict();\n\nexport const PackCatalogSchema = z\n .object({\n packs: z.array(PackCatalogEntrySchema),\n })\n .strict();\n\nexport type PackCatalogEntry = z.infer<typeof PackCatalogEntrySchema>;\nexport type PackCatalog = z.infer<typeof PackCatalogSchema>;\n","/**\n * Manifest = 설치 추적 메타데이터. CLI가 이전 설치 상태를 기억하기 위한 JSON.\n */\nimport { z } from 'zod';\nimport { InstalledSkillSchema } from './skill.schema.js';\n\nexport const SCOPES = {\n PROJECT: 'project',\n} as const;\n\n/** init/update 시 선택된 settings 항목 추적 */\nconst SettingsConfigSchema = z\n .object({\n claude: z.array(z.string().min(1)).optional(),\n gemini: z.array(z.string().min(1)).optional(),\n prettierignore: z.boolean().optional(),\n })\n .strict();\n\nexport type SettingsConfig = z.infer<typeof SettingsConfigSchema>;\n\n/** 모노레포 워크스페이스별 preset + rules 추적 */\nconst WorkspaceEntrySchema = z\n .object({\n preset: z.string().min(1),\n rules: z.array(z.string().min(1)),\n })\n .strict();\n\nexport type WorkspaceEntry = z.infer<typeof WorkspaceEntrySchema>;\n\nexport const ManifestSchema = z\n .object({\n tools: z.array(z.string().min(1)).min(1),\n scope: z.literal('project'),\n /** 비모노레포 단일 preset */\n preset: z.string().min(1).optional(),\n /** 모노레포: workspace path → { preset, rules } */\n workspaces: z.record(z.string(), WorkspaceEntrySchema).optional(),\n installed_rules: z.array(z.string().min(1)),\n /** 실제 디스크에 쓰여진 파일 상대 경로 목록 (uninstall용). 기존 manifest 호환성 위해 optional */\n installed_files: z.array(z.string().min(1)).optional(),\n /** skill 설치 루트 디렉토리 목록 */\n installed_skills: z.array(InstalledSkillSchema).optional(),\n /** non-managed 파일에 섹션을 append한 경우 추적 (uninstall 시 섹션만 제거) */\n appended_files: z.array(z.string().min(1)).optional(),\n /** init 시 선택된 settings 항목 — update 시 재생성에 사용 */\n settings: SettingsConfigSchema.optional(),\n /** init/update 실행 시점의 CLI 패키지 버전 — 버전 변경 감지에 사용 */\n cliVersion: z.string().optional(),\n /** SSOT 데이터 파일들의 deterministic SHA-256 해시 (6자리 hex). diff/update 판단 기준 */\n sourceHash: z.string().regex(/^[a-f0-9]{6}$/, 'sourceHash must be 6 lowercase hex chars'),\n generatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n","import { readFileSync, readdirSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { parse } from 'yaml';\nimport { parseMarkdownFrontmatter } from './frontmatter.js';\nimport { parseFlatToml } from './subagent-toml.js';\nimport {\n CodexSubagentFrontmatterSchema,\n RuleSchema,\n PresetSchema,\n SkillCatalogSchema,\n SkillFrontmatterSchema,\n SubagentCatalogSchema,\n SubagentMarkdownFrontmatterSchema,\n} from './schemas/index.js';\nimport type { Rule, Preset, Skill, SkillCatalog, Subagent, SubagentCatalog } from './schemas/index.js';\n\n// priority 내림차순 정렬 (높을수록 상단 → U-shaped attention)\nexport const sortRulesByPriority = (rules: readonly Rule[]): Rule[] =>\n [...rules].sort((a, b) => b.priority - a.priority);\n\nconst deduplicateRulesById = (rules: readonly Rule[]): Rule[] => {\n const seen = new Set<string>();\n return rules.filter((rule) => {\n if (seen.has(rule.id)) return false;\n seen.add(rule.id);\n return true;\n });\n};\n\nconst resolveRuleById = (ruleId: string, allRules: readonly Rule[], context?: string): Rule => {\n const found = allRules.find((rule) => rule.id === ruleId);\n if (!found) {\n const suffix = context ? ` (from ${context})` : '';\n throw new Error(`Rule not found: ${ruleId}${suffix}`);\n }\n return found;\n};\n\n// legacy preset Record<id, {description, rules}> → Preset[] 변환\nexport const parseRawPresets = (raw: Record<string, { description: string; rules: string[] }>): Preset[] =>\n Object.entries(raw).map(([id, value]) => PresetSchema.parse({ id, ...value }));\n\n// preset.rules 목록을 실제 core rule로 해석 + priority 정렬, 누락 시 throw\nexport const resolvePresetRules = (preset: Preset, allRules: readonly Rule[]): Rule[] => {\n const resolved = preset.rules.map((ruleId) => resolveRuleById(ruleId, allRules, preset.id));\n return sortRulesByPriority(deduplicateRulesById(resolved));\n};\n\nexport const resolvePresetSkills = (preset: Preset, allSkills: readonly Skill[]): Skill[] => {\n return allSkills\n .filter((skill) => skill.included_in_presets.includes(preset.id))\n .sort((a, b) => a.id.localeCompare(b.id));\n};\n\nexport const loadRuleFile = (filePath: string): Rule => {\n const raw = readFileSync(filePath, 'utf-8');\n return RuleSchema.parse(parse(raw));\n};\n\nconst loadSkillDirectoryFiles = (skillDir: string): Skill['files'] => {\n const files: Skill['files'] = [];\n\n const walk = (relativeDir = ''): void => {\n const absDir = relativeDir.length > 0 ? join(skillDir, relativeDir) : skillDir;\n const entries = readdirSync(absDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const nextRelativePath = relativeDir.length > 0 ? join(relativeDir, entry.name) : entry.name;\n if (entry.isDirectory()) {\n walk(nextRelativePath);\n continue;\n }\n\n files.push({\n path: nextRelativePath,\n content: readFileSync(join(skillDir, nextRelativePath), 'utf-8'),\n });\n }\n };\n\n walk();\n return files;\n};\n\n// readdirSync + .yaml 필터 + 파일명 sort(결정적 로딩) → priority 내림차순\nexport const loadAllRules = (rulesDir: string): Rule[] => {\n const files = readdirSync(rulesDir)\n .filter((f) => f.endsWith('.yaml'))\n .sort();\n const rules = files.map((f) => loadRuleFile(resolve(rulesDir, f)));\n return sortRulesByPriority(rules);\n};\n\nexport const loadSkillCatalog = (skillsDir: string): SkillCatalog =>\n SkillCatalogSchema.parse(JSON.parse(readFileSync(resolve(skillsDir, 'skill-registry.json'), 'utf-8')));\n\nexport const loadAllSkills = (skillsDir: string): Skill[] => {\n const catalog = loadSkillCatalog(skillsDir);\n const entries = [...catalog.skills].sort((a, b) => a.id.localeCompare(b.id));\n\n return entries.map((entry) => {\n const directory = resolve(skillsDir, entry.source_path);\n const skillMdPath = join(directory, 'SKILL.md');\n const rawSkillMd = readFileSync(skillMdPath, 'utf-8');\n const { frontmatter } = parseMarkdownFrontmatter(rawSkillMd);\n const parsed = SkillFrontmatterSchema.parse(frontmatter);\n if (parsed.name !== entry.id) {\n throw new Error(`Skill directory and frontmatter name mismatch: ${entry.id} != ${parsed.name}`);\n }\n\n const files = loadSkillDirectoryFiles(directory);\n if (entry.kind === 'reference' && !files.some((file) => file.path === 'references/reference.md')) {\n throw new Error(`Reference skill must include references/reference.md: ${parsed.name}`);\n }\n\n return {\n id: entry.id,\n kind: entry.kind,\n description: parsed.description,\n supported_tools: [...entry.supported_tools],\n groups: [...entry.groups],\n included_in_presets: [...entry.included_in_presets],\n directory,\n files,\n };\n });\n};\n\nconst readRequiredTextFile = (filePath: string): string => {\n try {\n return readFileSync(filePath, 'utf-8');\n } catch (error) {\n const cause = error instanceof Error ? `: ${error.message}` : '';\n throw new Error(`Required subagent source file is missing: ${filePath}${cause}`);\n }\n};\n\nconst assertSubagentFrontmatterName = (params: { id: string; tool: string; name: string }): void => {\n if (params.name !== params.id) {\n throw new Error(`Subagent ${params.tool} frontmatter name mismatch: ${params.id} != ${params.name}`);\n }\n};\n\nexport const loadSubagentCatalog = (subagentsDir: string): SubagentCatalog =>\n SubagentCatalogSchema.parse(JSON.parse(readFileSync(resolve(subagentsDir, 'subagent-registry.json'), 'utf-8')));\n\nexport const loadAllSubagents = (subagentsDir: string): Subagent[] => {\n const catalog = loadSubagentCatalog(subagentsDir);\n const entries = [...catalog.subagents].sort((a, b) => a.id.localeCompare(b.id));\n\n return entries.map((entry) => {\n const directory = resolve(subagentsDir, entry.source_path);\n const prompt = readRequiredTextFile(join(directory, 'PROMPT.md'));\n const claudeRaw = readRequiredTextFile(join(directory, 'claude.frontmatter.yaml'));\n const codexRaw = readRequiredTextFile(join(directory, 'codex.frontmatter.toml'));\n const geminiRaw = readRequiredTextFile(join(directory, 'gemini.frontmatter.yaml'));\n const claude = SubagentMarkdownFrontmatterSchema.parse(parse(claudeRaw));\n const codex = CodexSubagentFrontmatterSchema.parse(parseFlatToml(codexRaw));\n const gemini = SubagentMarkdownFrontmatterSchema.parse(parse(geminiRaw));\n\n assertSubagentFrontmatterName({ id: entry.id, tool: 'claude', name: claude.name });\n assertSubagentFrontmatterName({ id: entry.id, tool: 'codex', name: codex.name });\n assertSubagentFrontmatterName({ id: entry.id, tool: 'gemini', name: gemini.name });\n\n return {\n id: entry.id,\n supported_tools: [...entry.supported_tools],\n source_path: entry.source_path,\n directory,\n prompt,\n frontmatter: {\n claude: {\n raw: claudeRaw,\n parsed: claude,\n },\n codex: {\n raw: codexRaw,\n parsed: codex,\n },\n gemini: {\n raw: geminiRaw,\n parsed: gemini,\n },\n },\n };\n });\n};\n\nexport const loadPresets = (presetsPath: string): Preset[] => {\n const raw = readFileSync(presetsPath, 'utf-8');\n const data = parse(raw) as Record<string, { description: string; rules: string[] }>;\n return parseRawPresets(data);\n};\n","import { parse } from 'yaml';\n\nexport const parseMarkdownFrontmatter = (content: string): { frontmatter: unknown; body: string } => {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---\\n?/);\n if (!match) {\n throw new Error('Missing YAML frontmatter');\n }\n\n return {\n frontmatter: parse(match[1]),\n body: content.slice(match[0].length),\n };\n};\n","type TomlPrimitive = string | number | boolean | string[];\n\nconst parseTomlValue = (value: string): TomlPrimitive => {\n const trimmed = value.trim();\n\n if (trimmed.startsWith('\"') || trimmed.startsWith('[')) {\n const parsed = JSON.parse(trimmed) as unknown;\n if (typeof parsed === 'string') {\n return parsed;\n }\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === 'string')) {\n return parsed;\n }\n throw new Error(`Unsupported TOML value: ${value}`);\n }\n\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n\n const numericValue = Number(trimmed);\n if (Number.isFinite(numericValue)) {\n return numericValue;\n }\n\n throw new Error(`Unsupported TOML value: ${value}`);\n};\n\nexport const parseFlatToml = (content: string): Record<string, TomlPrimitive> => {\n const result: Record<string, TomlPrimitive> = {};\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0 || trimmed.startsWith('#')) {\n continue;\n }\n\n const match = trimmed.match(/^([A-Za-z0-9_-]+)\\s*=\\s*(.+)$/);\n if (!match) {\n throw new Error(`Unsupported TOML line: ${line}`);\n }\n\n const [, key, value] = match;\n result[key] = parseTomlValue(value);\n }\n\n return result;\n};\n\nconst renderTomlValue = (value: TomlPrimitive): string => {\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n return `[${value.map((item) => JSON.stringify(item)).join(', ')}]`;\n};\n\nexport const renderFlatToml = (entries: readonly [string, TomlPrimitive][]): string =>\n entries.map(([key, value]) => `${key} = ${renderTomlValue(value)}`).join('\\n');\n","import { join } from 'node:path';\nimport type { Rule, DecisionTableEntry } from './schemas/index.js';\nimport { GLOBAL_CATEGORIES, CLAUDE_CODE_PATH_GLOBS, TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { ToolId } from './tool-output.js';\n\n// \"react-typescript\" → \"React Typescript\"\nexport const ruleIdToTitle = (id: string): string =>\n id\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n\n// DecisionTableEntry[] → Markdown 테이블 (pipe 문자 | escape)\nexport const renderDecisionTable = (entries: readonly DecisionTableEntry[]): string => {\n const escape = (s: string) => s.replace(/\\|/g, '|');\n const hasAvoid = entries.some((e) => e.avoid !== undefined);\n\n const header = hasAvoid ? '| When | Then | Avoid |\\n|------|------|-------|' : '| When | Then |\\n|------|------|';\n\n const rows = entries.map((e) => {\n const when = escape(e.when);\n const then = escape(e.then);\n if (hasAvoid) {\n const avoid = e.avoid ? escape(e.avoid) : '';\n return `| ${when} | ${then} | ${avoid} |`;\n }\n return `| ${when} | ${then} |`;\n });\n\n return [header, ...rows].join('\\n');\n};\n\n// 단일 Rule → Markdown (빈 섹션 생략)\nexport const renderRuleToMarkdown = (rule: Rule): string => {\n const sections: string[] = [`# ${ruleIdToTitle(rule.id)}`];\n\n if (rule.content.constraints.length > 0) {\n sections.push('## Constraints');\n sections.push(rule.content.constraints.map((c) => `- ${c}`).join('\\n'));\n }\n\n if (rule.content.guidelines.length > 0) {\n sections.push('## Guidelines');\n sections.push(rule.content.guidelines.map((g) => `- ${g}`).join('\\n'));\n }\n\n if (rule.content.decision_table && rule.content.decision_table.length > 0) {\n sections.push('## Decision Table');\n sections.push(renderDecisionTable(rule.content.decision_table));\n }\n\n return sections.join('\\n\\n');\n};\n\n// Rule[] → 단일 Markdown (--- separator, single-file 모드용)\nexport const renderRulesToMarkdown = (rules: readonly Rule[]): string =>\n rules.map((rule) => renderRuleToMarkdown(rule)).join('\\n\\n---\\n\\n');\n\n// Rule이 global 카테고리에 속하는지 판별\nexport const isGlobalRule = (rule: Rule): boolean => (GLOBAL_CATEGORIES as readonly string[]).includes(rule.category);\n\n// Rule[] → { global, domain } 분리\nexport const partitionRules = (rules: readonly Rule[]): { global: Rule[]; domain: Rule[] } => {\n const global: Rule[] = [];\n const domain: Rule[] = [];\n for (const rule of rules) {\n if (isGlobalRule(rule)) {\n global.push(rule);\n } else {\n domain.push(rule);\n }\n }\n return { global, domain };\n};\n\n// glob 배열 → YAML frontmatter 블록\nexport const renderFrontmatter = (paths: readonly string[]): string => {\n const lines = paths.map((p) => ` - \"${p}\"`).join('\\n');\n return `---\\npaths:\\n${lines}\\n---`;\n};\n\nexport type WorkspaceMapping = {\n path: string;\n ruleIds: readonly string[];\n};\n\n// 단일 Rule → Claude Code용 Markdown\n// domain 룰이면서 glob 매핑이 있으면 paths: frontmatter 추가 (단일 프로젝트 전용)\n// global 룰 또는 매핑 없는 domain 룰 → frontmatter 없음\nexport const renderClaudeCodeRule = (rule: Rule): string => {\n const globs = CLAUDE_CODE_PATH_GLOBS[rule.id];\n if (!isGlobalRule(rule) && globs !== undefined) {\n return `${renderFrontmatter(globs)}\\n\\n${renderRuleToMarkdown(rule)}`;\n }\n return renderRuleToMarkdown(rule);\n};\n\n// 도구별 렌더링 결과 타입 (tagged union)\nexport type ClaudeCodeRenderResult = {\n tool: 'claude-code';\n files: { relativePath: string; content: string }[];\n};\n\nexport type CodexRenderResult = {\n tool: 'codex';\n rootContent: string;\n domainFiles: { workspacePath: string; content: string }[];\n};\n\nexport type GeminiRenderResult = {\n tool: 'gemini';\n rootContent: string;\n domainFiles: { workspacePath: string; content: string }[];\n};\n\nexport type ToolRenderResult = ClaudeCodeRenderResult | CodexRenderResult | GeminiRenderResult;\n\n// CLI 진입점: toolId + rules → 도구별 렌더링 결과\nexport const renderForTool = (\n toolId: ToolId,\n rules: readonly Rule[],\n workspaceMappings?: readonly WorkspaceMapping[],\n): ToolRenderResult => {\n const config = TOOL_OUTPUT_MAP[toolId];\n\n if (toolId === 'claude-code') {\n const { rulesDir, fileExtension } = config as (typeof TOOL_OUTPUT_MAP)['claude-code'];\n\n if (!workspaceMappings || workspaceMappings.length === 0) {\n // 단일 프로젝트: domain 룰에 paths: frontmatter (path-scoped)\n const files = rules.map((rule) => ({\n relativePath: join(rulesDir, `${rule.id}${fileExtension}`),\n content: renderClaudeCodeRule(rule),\n }));\n return { tool: 'claude-code', files };\n }\n\n // 모노레포: global → .claude/rules/, domain → {workspace}/CLAUDE.md (진짜 지연 로딩)\n const { global, domain } = partitionRules(rules);\n\n const globalFiles = global.map((rule) => ({\n relativePath: join(rulesDir, `${rule.id}${fileExtension}`),\n content: renderRuleToMarkdown(rule), // global은 frontmatter 불필요\n }));\n\n const workspaceFiles: { relativePath: string; content: string }[] = [];\n for (const ws of workspaceMappings) {\n const wsRules = domain.filter((r) => ws.ruleIds.includes(r.id));\n if (wsRules.length === 0) continue;\n workspaceFiles.push({\n relativePath: join(ws.path, 'CLAUDE.md'),\n content: renderRulesToMarkdown(wsRules),\n });\n }\n\n return { tool: 'claude-code', files: [...globalFiles, ...workspaceFiles] };\n }\n\n if (!workspaceMappings || workspaceMappings.length === 0) {\n // 단일 프로젝트: 모든 룰(global + domain)을 rootContent 하나로 합침\n const rootContent = renderRulesToMarkdown(rules);\n const domainFiles: { workspacePath: string; content: string }[] = [];\n\n if (toolId === 'codex') return { tool: 'codex', rootContent, domainFiles };\n return { tool: 'gemini', rootContent, domainFiles };\n }\n\n // 모노레포: global → rootContent, domain → workspace별 파일\n const { global, domain } = partitionRules(rules);\n const rootContent = renderRulesToMarkdown(global);\n const domainFiles: { workspacePath: string; content: string }[] = [];\n for (const ws of workspaceMappings) {\n const wsRules = domain.filter((r) => ws.ruleIds.includes(r.id));\n if (wsRules.length === 0) continue;\n domainFiles.push({\n workspacePath: ws.path,\n content: renderRulesToMarkdown(wsRules),\n });\n }\n\n if (toolId === 'codex') {\n return { tool: 'codex', rootContent, domainFiles };\n }\n\n // gemini\n return { tool: 'gemini', rootContent, domainFiles };\n};\n","import { join } from 'node:path';\nimport { computeInstalledSkillHash } from './source-hash.js';\nimport type { Skill, InstalledSkill } from './schemas/index.js';\nimport type { ToolId } from './tool-output.js';\n\nconst AGENT_SKILLS_DIR = '.agents/skills';\nconst CLAUDE_SKILLS_DIR = '.claude/skills';\n\ntype SkillPackageFile = {\n relativePath: string;\n content: string;\n};\n\nexport type SkillPackage = {\n skillId: string;\n rootDir: string;\n files: SkillPackageFile[];\n};\n\nconst buildRootDirs = (skillId: string, toolIds: readonly ToolId[]): string[] => {\n const dirs: string[] = [];\n if (toolIds.some((toolId) => toolId === 'codex' || toolId === 'gemini')) {\n dirs.push(join(AGENT_SKILLS_DIR, skillId));\n }\n if (toolIds.includes('claude-code')) {\n dirs.push(join(CLAUDE_SKILLS_DIR, skillId));\n }\n return dirs;\n};\n\nconst normalizeSelectedTools = (skill: Skill, requestedTools: readonly ToolId[]): ToolId[] => {\n const supportedToolSet = new Set(skill.supported_tools);\n return requestedTools.filter((toolId) => supportedToolSet.has(toolId));\n};\n\nexport const buildSkillInstallPlan = (params: {\n skill: Skill;\n requestedTools: readonly ToolId[];\n}): { packages: SkillPackage[]; installedSkill: InstalledSkill } => {\n const selectedTools = normalizeSelectedTools(params.skill, params.requestedTools);\n if (selectedTools.length === 0) {\n throw new Error(`Skill ${params.skill.id} does not support the requested tools`);\n }\n\n const rootDirs = buildRootDirs(params.skill.id, selectedTools);\n const skillHash = computeInstalledSkillHash({\n kind: params.skill.kind,\n description: params.skill.description,\n tools: selectedTools,\n files: params.skill.files.map((file) => `${file.path}:${file.content}`),\n });\n\n const packages = rootDirs.map((rootDir) => {\n const files: SkillPackageFile[] = params.skill.files.map((file) => ({\n relativePath: join(rootDir, file.path),\n content: file.content,\n }));\n\n return {\n skillId: params.skill.id,\n rootDir,\n files,\n };\n });\n\n return {\n packages,\n installedSkill: {\n id: params.skill.id,\n kind: params.skill.kind,\n tools: selectedTools,\n installed_paths: rootDirs,\n sourceHash: skillHash,\n },\n };\n};\n","import { createHash } from 'node:crypto';\nimport { 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 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\n// compiler data 전체(context-layer, skills, packs, subagents) 해시\nexport const computeSourceHash = (dataDir: string): string => {\n return computeHash(loadDirectoryContents(resolve(dataDir)));\n};\n\nexport const computeInstalledSkillHash = (params: {\n kind: InstalledSkill['kind'];\n description: string;\n tools: readonly string[];\n files: readonly string[];\n}): string => computeHash([params.kind, params.description, ...[...params.tools].sort(), ...[...params.files].sort()]);\n\nexport const computeInstalledSubagentHash = (params: {\n id: string;\n tools: readonly string[];\n prompt: string;\n metadataFiles: readonly string[];\n}): string => computeHash([params.id, params.prompt, ...[...params.tools].sort(), ...[...params.metadataFiles].sort()]);\n\n// Manifest Builder (Pure, 단 generatedAt에 현재 시각 사용)\nexport const buildManifest = (params: {\n tools: readonly string[];\n scope: 'project';\n preset?: string;\n workspaces?: Record<string, { preset: string; rules: string[] }>;\n installedRules: readonly string[];\n installedFiles?: readonly string[];\n installedSkills?: readonly InstalledSkill[];\n appendedFiles?: readonly string[];\n settings?: { claude?: readonly string[]; gemini?: readonly string[]; prettierignore?: boolean };\n cliVersion?: string;\n sourceHash: string;\n}): Manifest =>\n ManifestSchema.parse({\n tools: [...params.tools],\n scope: params.scope,\n preset: params.preset,\n workspaces: params.workspaces,\n installed_rules: [...params.installedRules],\n installed_files: params.installedFiles ? [...params.installedFiles] : undefined,\n installed_skills: params.installedSkills ? [...params.installedSkills] : undefined,\n appended_files: params.appendedFiles && params.appendedFiles.length > 0 ? [...params.appendedFiles] : undefined,\n settings: params.settings\n ? {\n claude: params.settings.claude ? [...params.settings.claude] : undefined,\n gemini: params.settings.gemini ? [...params.settings.gemini] : undefined,\n prettierignore: params.settings.prettierignore,\n }\n : undefined,\n cliVersion: params.cliVersion,\n sourceHash: params.sourceHash,\n generatedAt: new Date().toISOString(),\n });\n","import { resolve } from 'node:path';\nimport { computeInstalledSubagentHash } from './source-hash.js';\nimport { buildSubagentRelativePath } from './subagent-paths.js';\nimport { renderFlatToml } from './subagent-toml.js';\nimport type { CodexSubagentFrontmatter, InstalledSubagent, Subagent } from './schemas/index.js';\nimport type { ToolId } from './tool-output.js';\n\ntype SubagentPackageFile = {\n relativePath: string;\n content: string;\n};\n\nexport type SubagentPackage = {\n subagentId: string;\n files: SubagentPackageFile[];\n};\n\nexport type RequiredSubagentSkill = {\n tool: ToolId;\n skillName: string;\n path: string;\n};\n\nconst normalizeSelectedTools = (subagent: Subagent, requestedTools: readonly ToolId[]): ToolId[] => {\n const supportedToolSet = new Set(subagent.supported_tools);\n return requestedTools.filter((toolId) => supportedToolSet.has(toolId));\n};\n\nconst renderMarkdownSubagent = (params: { rawFrontmatter: string; prompt: string }): string =>\n `---\\n${params.rawFrontmatter.trimEnd()}\\n---\\n\\n${params.prompt.trimEnd()}\\n`;\n\nconst getCodexTomlEntries = (frontmatter: CodexSubagentFrontmatter): [string, string | number | boolean | string[]][] =>\n Object.entries(frontmatter).filter(\n (entry): entry is [string, string | number | boolean | string[]] =>\n entry[0] !== 'skill_names' &&\n (typeof entry[1] === 'string' ||\n typeof entry[1] === 'number' ||\n typeof entry[1] === 'boolean' ||\n (Array.isArray(entry[1]) && entry[1].every((item) => typeof item === 'string'))),\n );\n\nconst renderCodexSubagent = (params: {\n frontmatter: CodexSubagentFrontmatter;\n prompt: string;\n userBasePath: string;\n}): string => {\n const metadata = renderFlatToml(getCodexTomlEntries(params.frontmatter));\n const skills = (params.frontmatter.skill_names ?? []).map((skillName) => {\n const skillPath = resolve(params.userBasePath, '.agents', 'skills', skillName, 'SKILL.md');\n return `[[skills.config]]\\npath = ${JSON.stringify(skillPath)}\\nenabled = true`;\n });\n const sections = [\n metadata,\n `developer_instructions = ${JSON.stringify(params.prompt.trimEnd())}`,\n ...skills,\n ].filter((section) => section.length > 0);\n\n return sections.join('\\n\\n') + '\\n';\n};\n\nconst renderSubagentForTool = (params: { subagent: Subagent; toolId: ToolId; userBasePath: string }): string => {\n if (params.toolId === 'claude-code') {\n return renderMarkdownSubagent({\n rawFrontmatter: params.subagent.frontmatter.claude.raw,\n prompt: params.subagent.prompt,\n });\n }\n\n if (params.toolId === 'gemini') {\n return renderMarkdownSubagent({\n rawFrontmatter: params.subagent.frontmatter.gemini.raw,\n prompt: params.subagent.prompt,\n });\n }\n\n return renderCodexSubagent({\n frontmatter: params.subagent.frontmatter.codex.parsed,\n prompt: params.subagent.prompt,\n userBasePath: params.userBasePath,\n });\n};\n\nconst getSelectedMetadataFiles = (subagent: Subagent, selectedTools: readonly ToolId[]): string[] =>\n selectedTools.map((toolId) => {\n if (toolId === 'claude-code') return `claude:${subagent.frontmatter.claude.raw}`;\n if (toolId === 'gemini') return `gemini:${subagent.frontmatter.gemini.raw}`;\n return `codex:${subagent.frontmatter.codex.raw}`;\n });\n\nconst getStringArray = (value: unknown): string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter((item): item is string => typeof item === 'string');\n};\n\nconst buildRequiredSubagentSkills = (params: {\n subagent: Subagent;\n selectedTools: readonly ToolId[];\n userBasePath: string;\n}): RequiredSubagentSkill[] => {\n const required: RequiredSubagentSkill[] = [];\n\n if (params.selectedTools.includes('codex')) {\n for (const skillName of params.subagent.frontmatter.codex.parsed.skill_names ?? []) {\n required.push({\n tool: 'codex',\n skillName,\n path: resolve(params.userBasePath, '.agents', 'skills', skillName, 'SKILL.md'),\n });\n }\n }\n\n if (params.selectedTools.includes('claude-code')) {\n for (const skillName of getStringArray(params.subagent.frontmatter.claude.parsed['skills'])) {\n required.push({\n tool: 'claude-code',\n skillName,\n path: resolve(params.userBasePath, '.claude', 'skills', skillName, 'SKILL.md'),\n });\n }\n }\n\n return required;\n};\n\nexport const buildSubagentInstallPlan = (params: {\n subagent: Subagent;\n requestedTools: readonly ToolId[];\n userBasePath: string;\n}): {\n packages: SubagentPackage[];\n installedSubagent: InstalledSubagent;\n requiredSkills: RequiredSubagentSkill[];\n} => {\n const selectedTools = normalizeSelectedTools(params.subagent, params.requestedTools);\n if (selectedTools.length === 0) {\n throw new Error(`Subagent ${params.subagent.id} does not support the requested tools`);\n }\n\n const files = selectedTools.map((toolId) => ({\n relativePath: buildSubagentRelativePath(params.subagent.id, toolId),\n content: renderSubagentForTool({\n subagent: params.subagent,\n toolId,\n userBasePath: params.userBasePath,\n }),\n }));\n const subagentHash = computeInstalledSubagentHash({\n id: params.subagent.id,\n tools: selectedTools,\n prompt: params.subagent.prompt,\n metadataFiles: getSelectedMetadataFiles(params.subagent, selectedTools),\n });\n\n return {\n packages: [\n {\n subagentId: params.subagent.id,\n files,\n },\n ],\n installedSubagent: {\n id: params.subagent.id,\n tools: selectedTools,\n installed_paths: files.map((file) => file.relativePath),\n sourceHash: subagentHash,\n },\n requiredSkills: buildRequiredSubagentSkills({\n subagent: params.subagent,\n selectedTools,\n userBasePath: params.userBasePath,\n }),\n };\n};\n","const MANAGED_MARKER = '<!-- managed by ai-ops -->';\nconst META_PATTERN = /^<!-- sourceHash: ([a-f0-9]{6}) \\| generatedAt: (.+) -->$/;\n\nconst SECTION_START = '<!-- ai-ops:start -->';\nconst SECTION_END = '<!-- ai-ops:end -->';\n\nexport const hasLegacyHeader = (content: string): boolean => content.includes(MANAGED_MARKER);\n\nexport const wrapWithSection = (content: string, meta: { sourceHash: string; generatedAt: string }): string => {\n const metaLine = `<!-- sourceHash: ${meta.sourceHash} | generatedAt: ${meta.generatedAt} -->`;\n return `${SECTION_START}\\n${metaLine}\\n\\n${content}\\n${SECTION_END}`;\n};\n\nexport const hasAiOpsSection = (content: string): boolean =>\n content.includes(SECTION_START) && content.includes(SECTION_END);\n\nexport const stripAiOpsSection = (content: string): string => {\n const startIdx = content.indexOf(SECTION_START);\n const endIdx = content.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return content;\n\n const before = content.slice(0, startIdx).trimEnd();\n const after = content.slice(endIdx + SECTION_END.length).trimStart();\n return before + (after ? '\\n\\n' + after : '') + '\\n';\n};\n\nexport const extractAiOpsSectionContent = (content: string): string | null => {\n const startIdx = content.indexOf(SECTION_START);\n const endIdx = content.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return null;\n\n const section = content.slice(startIdx + SECTION_START.length, endIdx).trim();\n const lines = section.split('\\n');\n const [, ...contentLines] = lines;\n return contentLines.join('\\n').trimStart();\n};\n\nexport const replaceAiOpsSection = (existing: string, newSection: string): string => {\n const startIdx = existing.indexOf(SECTION_START);\n const endIdx = existing.indexOf(SECTION_END);\n if (startIdx === -1 || endIdx === -1) return existing;\n\n const before = existing.slice(0, startIdx).trimEnd();\n const after = existing.slice(endIdx + SECTION_END.length).trimStart();\n\n // filter(Boolean)으로 빈 before/after 제거 → 불필요한 선행 \\n\\n 방지\n return [before, newSection, after].filter(Boolean).join('\\n\\n') + '\\n';\n};\n\nexport const parseAiOpsMeta = (content: string): { sourceHash: string; generatedAt: string } | null => {\n const startIdx = content.indexOf(SECTION_START);\n if (startIdx === -1) return null;\n\n const lines = content.slice(startIdx).split('\\n');\n // lines[0] = '<!-- ai-ops:start -->', lines[1] = meta line\n const metaLine = lines[1] ?? '';\n const match = META_PATTERN.exec(metaLine);\n if (!match) return null;\n\n return { sourceHash: match[1], generatedAt: match[2] };\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { ManifestSchema } from './schemas/index.js';\nimport type { Manifest } from './schemas/index.js';\n\nexport const MANIFEST_FILENAME = '.ai-ops-manifest.json';\n\n// Pure\nexport const parseManifest = (json: string): Manifest => ManifestSchema.parse(JSON.parse(json));\n\nexport const serializeManifest = (manifest: Manifest): string => JSON.stringify(manifest, null, 2) + '\\n';\n\n// I/O\nexport const resolveManifestPath = (basePath: string): string => join(basePath, MANIFEST_FILENAME);\n\nexport const readManifest = (manifestPath: string): Manifest | null => {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf-8');\n } catch {\n return null;\n }\n return parseManifest(raw);\n};\n\nexport const writeManifest = (manifestPath: string, manifest: Manifest): void => {\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeManifest(manifest), 'utf-8');\n};\n","import type { Manifest, Preset, Rule } from './schemas/index.js';\nimport { resolvePresetRules } from './loader.js';\n\nconst LEGACY_SKILL_ID_MAP = {\n 'engineering-standards-pack': 'backend-service-standards',\n} as const;\n\nexport const resolveCanonicalSkillId = (skillId: string): string =>\n LEGACY_SKILL_ID_MAP[skillId as keyof typeof LEGACY_SKILL_ID_MAP] ?? skillId;\n\nconst resolveRulesFromIds = (ruleIds: readonly string[], allRules: readonly Rule[]): Rule[] => {\n const ruleMap = new Map(allRules.map((rule) => [rule.id, rule]));\n const seen = new Set<string>();\n const resolved = ruleIds.flatMap((ruleId) => {\n const rule = ruleMap.get(ruleId);\n if (!rule || seen.has(rule.id)) {\n return [];\n }\n seen.add(rule.id);\n return [rule];\n });\n\n return [...resolved].sort((a, b) => b.priority - a.priority);\n};\n\nconst resolvePresetById = (presetId: string | undefined, presets: readonly Preset[]): Preset | undefined => {\n if (presetId === undefined) {\n return undefined;\n }\n\n return presets.find((preset) => preset.id === presetId);\n};\n\nexport const resolveManifestRules = (params: {\n manifest: Manifest;\n allRules: readonly Rule[];\n presets: readonly Preset[];\n}): {\n installedRules: Rule[];\n workspaces?: Record<string, { preset: string; rules: string[] }>;\n} => {\n const { manifest, allRules, presets } = params;\n\n if (manifest.workspaces) {\n const resolvedWorkspaces = Object.fromEntries(\n Object.entries(manifest.workspaces).map(([workspacePath, entry]) => {\n const preset = resolvePresetById(entry.preset, presets);\n const rules = preset ? resolvePresetRules(preset, allRules) : resolveRulesFromIds(entry.rules, allRules);\n\n return [\n workspacePath,\n {\n preset: entry.preset,\n rules: rules.map((rule) => rule.id),\n },\n ];\n }),\n );\n\n const installedRules = resolveRulesFromIds(\n Object.values(resolvedWorkspaces).flatMap((entry) => entry.rules),\n allRules,\n );\n\n return {\n installedRules,\n workspaces: resolvedWorkspaces,\n };\n }\n\n const preset = resolvePresetById(manifest.preset, presets);\n const installedRules = preset\n ? resolvePresetRules(preset, allRules)\n : resolveRulesFromIds(manifest.installed_rules, allRules);\n\n return {\n installedRules,\n };\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { SkillRegistrySchema } from './schemas/index.js';\nimport type { SkillRegistry } from './schemas/index.js';\n\nexport const SKILL_REGISTRY_FILENAME = 'skills-manifest.json';\n\nexport const parseSkillRegistry = (json: string): SkillRegistry => SkillRegistrySchema.parse(JSON.parse(json));\n\nexport const serializeSkillRegistry = (registry: SkillRegistry): string => JSON.stringify(registry, null, 2) + '\\n';\n\nexport const resolveSkillRegistryPath = (userBasePath: string): string =>\n join(userBasePath, '.ai-ops', SKILL_REGISTRY_FILENAME);\n\nexport const readSkillRegistry = (registryPath: string): SkillRegistry | null => {\n let raw: string;\n try {\n raw = readFileSync(registryPath, 'utf-8');\n } catch {\n return null;\n }\n\n return parseSkillRegistry(raw);\n};\n\nexport const writeSkillRegistry = (registryPath: string, registry: SkillRegistry): void => {\n mkdirSync(dirname(registryPath), { recursive: true });\n writeFileSync(registryPath, serializeSkillRegistry(registry), 'utf-8');\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { SubagentManifestSchema } from './schemas/index.js';\nimport type { SubagentManifest } from './schemas/index.js';\n\nexport const SUBAGENT_MANIFEST_FILENAME = 'subagents-manifest.json';\n\nexport const parseSubagentManifest = (json: string): SubagentManifest =>\n SubagentManifestSchema.parse(JSON.parse(json));\n\nexport const serializeSubagentManifest = (manifest: SubagentManifest): string => JSON.stringify(manifest, null, 2) + '\\n';\n\nexport const resolveSubagentManifestPath = (userBasePath: string): string =>\n join(userBasePath, '.ai-ops', SUBAGENT_MANIFEST_FILENAME);\n\nexport const readSubagentManifest = (manifestPath: string): SubagentManifest | null => {\n let raw: string;\n try {\n raw = readFileSync(manifestPath, 'utf-8');\n } catch {\n return null;\n }\n\n return parseSubagentManifest(raw);\n};\n\nexport const writeSubagentManifest = (manifestPath: string, manifest: SubagentManifest): void => {\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeSubagentManifest(manifest), 'utf-8');\n};\n","import { join } from 'node:path';\nimport { wrapWithSection } from './managed-header.js';\nimport { TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { ToolId } from './tool-output.js';\nimport type { ToolRenderResult } from './renderer.js';\n\n// Codex has no settings.json — plan directory convention must live in AGENTS.md\nconst CODEX_PLAN_BODY =\n '## Plan Snapshot (Plan mode only)\\n\\n' +\n '- This rule applies only when Codex is running in `collaboration_mode=Plan`.\\n' +\n '- Before implementation (file edits/creates, installs, commits) and before leaving Plan mode, save the latest plan content to `.codex/plans/YYYYMMDD_<topic>.md`.\\n' +\n '- In `Default` mode, do not automatically create or update plan files.';\n\nexport type FileAction = {\n relativePath: string;\n content: string;\n};\n\nexport const buildInstallPlan = (params: {\n toolId: ToolId;\n renderResult: ToolRenderResult;\n meta: { sourceHash: string; generatedAt: string };\n}): readonly FileAction[] => {\n const { toolId, renderResult, meta } = params;\n\n if (toolId === 'claude-code' && renderResult.tool === 'claude-code') {\n return renderResult.files.map(({ relativePath, content }) => ({\n relativePath,\n content: wrapWithSection(content, meta),\n }));\n }\n\n if (toolId === 'codex' && renderResult.tool === 'codex') {\n const config = TOOL_OUTPUT_MAP['codex'];\n const actions: FileAction[] = [];\n\n // CODEX_PLAN_BODY is always written to root AGENTS.md regardless of whether global rules exist\n const rootContent = renderResult.rootContent\n ? renderResult.rootContent + '\\n\\n---\\n\\n' + CODEX_PLAN_BODY\n : CODEX_PLAN_BODY;\n\n actions.push({\n relativePath: join(config.dir, config.rootFileName),\n content: wrapWithSection(rootContent, meta),\n });\n\n for (const df of renderResult.domainFiles) {\n actions.push({\n relativePath: join(df.workspacePath, config.domainFileName),\n content: wrapWithSection(df.content, meta),\n });\n }\n\n return actions;\n }\n\n if (toolId === 'gemini' && renderResult.tool === 'gemini') {\n const config = TOOL_OUTPUT_MAP['gemini'];\n const actions: FileAction[] = [];\n\n if (renderResult.rootContent) {\n actions.push({\n relativePath: join(config.dir, config.rootFileName),\n content: wrapWithSection(renderResult.rootContent, meta),\n });\n }\n\n for (const df of renderResult.domainFiles) {\n actions.push({\n relativePath: join(df.workspacePath, config.domainFileName),\n content: wrapWithSection(df.content, meta),\n });\n }\n\n return actions;\n }\n\n return [];\n};\n","import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path';\nimport { parseMarkdownFrontmatter } from './frontmatter.js';\nimport {\n extractAiOpsSectionContent,\n hasAiOpsSection,\n hasLegacyHeader,\n parseAiOpsMeta,\n replaceAiOpsSection,\n stripAiOpsSection,\n wrapWithSection,\n} from './managed-header.js';\nimport { COMPILER_DATA_DIR } from './paths.js';\nimport { computeHash, getCliVersion } from './source-hash.js';\nimport {\n ProjectLayerContextIndexSchema,\n ProjectLayerFrontmatterSchema,\n ProjectLayerManifestSchema,\n ProjectLayerToolSchema,\n isSafeProjectLayerPath,\n} from './schemas/index.js';\nimport type {\n ProjectLayerContextDocument,\n ProjectLayerContextIndex,\n ProjectLayerFrontmatter,\n ProjectLayerManifest,\n ProjectLayerPackFileRecord,\n ProjectLayerPackRecord,\n ProjectLayerProjectFile,\n ProjectLayerTool,\n} from './schemas/index.js';\n\n// ----- types -----\n\nexport type ProjectLayerFileOwnership = 'managed' | 'project';\n\nexport type ProjectLayerTemplateSpec = {\n path: string;\n content: string;\n ownership: ProjectLayerFileOwnership;\n frontmatter: ProjectLayerFrontmatter;\n contentHash: string;\n};\n\nexport type ProjectLayerInstallResult = {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n written: string[];\n appended: string[];\n createdProjectFiles: string[];\n refreshedProjectFiles: string[];\n preservedProjectFiles: string[];\n};\n\nexport type ProjectLayerRemoveResult = {\n deleted: string[];\n cleaned: string[];\n preserved: string[];\n notFound: string[];\n};\n\nexport type ProjectLayerIssueLevel = 'error' | 'warning';\n\nexport type ProjectLayerIssue = {\n level: ProjectLayerIssueLevel;\n code: string;\n message: string;\n};\n\nexport type ProjectLayerReport = {\n currentSourceHash: string | null;\n issues: ProjectLayerIssue[];\n};\n\ntype DocsStatusEntry = {\n path: string;\n status: string;\n owner: string;\n};\n\ntype DocsStatusTableBounds = {\n headerIndex: number;\n dividerIndex: number;\n tableEndIndex: number;\n};\n\ntype ManagedInstallResult = {\n written: string[];\n appended: string[];\n};\n\ntype ProjectFileInstallResult = {\n records: ProjectLayerProjectFile[];\n created: string[];\n refreshed: string[];\n preserved: string[];\n};\n\nexport type ProjectLayerDocumentReadResult = ProjectLayerContextDocument & {\n content: string;\n};\n\n// ----- constants -----\n\nexport const PROJECT_LAYER_MANIFEST_RELATIVE_PATH = '.ai-ops/manifest.json';\nexport const PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH = '.ai-ops/context-layer.json';\n\nconst CONTEXT_LAYER_DATA_DIR = join(COMPILER_DATA_DIR, 'context-layer');\n\nconst TOOL_ORDER = ['codex', 'gemini', 'claude-code'] as const satisfies readonly ProjectLayerTool[];\n\nconst DEFAULT_TOOLS = TOOL_ORDER;\n\nconst TEMPLATE_PATHS = [\n 'AGENTS.md',\n 'GEMINI.md',\n 'CLAUDE.md',\n 'docs/agent/workflow.md',\n 'docs/agent/rules/00-agent-baseline.md',\n 'docs/agent/rules/routing-rules.md',\n 'docs/agent/rules/doc-update-rules.md',\n 'docs/agent/rules/stop-rules.md',\n 'docs/agent/checks/impact-checklist.md',\n 'docs/agent/checks/review-checklist.md',\n 'docs/agent/maps/codebase-map.md',\n 'docs/business/business-rules.md',\n 'docs/docs-status.md',\n] as const;\n\nconst PROJECT_OWNED_PATHS = new Set<string>([\n 'docs/docs-status.md',\n 'docs/agent/maps/codebase-map.md',\n 'docs/business/business-rules.md',\n]);\n\nconst RESERVED_DOCUMENT_WARNINGS = [\n '판단 근거로 사용하지 마세요',\n 'Do not use this document as current decision-making evidence',\n] as const;\n\n// ----- path helpers -----\n\nexport const resolveProjectLayerManifestPath = (basePath: string): string =>\n join(basePath, PROJECT_LAYER_MANIFEST_RELATIVE_PATH);\n\nexport const resolveProjectLayerContextIndexPath = (basePath: string): string =>\n join(basePath, PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH);\n\nconst resolveTemplatePath = (relativePath: string): string => join(CONTEXT_LAYER_DATA_DIR, relativePath);\n\nconst toRelativeDir = (relativePath: string): string => dirname(relativePath);\n\nexport const resolveProjectLayerFilePath = (basePath: string, relativePath: string): string => {\n if (!isSafeProjectLayerPath(relativePath)) {\n throw new Error(`Unsafe project layer path: ${relativePath}`);\n }\n\n const absoluteBasePath = resolve(basePath);\n const absolutePath = resolve(absoluteBasePath, relativePath);\n const relativeFromBase = relative(absoluteBasePath, absolutePath);\n\n if (relativeFromBase === '' || relativeFromBase.startsWith('..') || isAbsolute(relativeFromBase)) {\n throw new Error(`Unsafe project layer path: ${relativePath}`);\n }\n\n return absolutePath;\n};\n\n// ----- parsing and serialization -----\n\nexport const parseProjectLayerManifest = (json: string): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse(JSON.parse(json));\n\nexport const serializeProjectLayerManifest = (manifest: ProjectLayerManifest): string =>\n JSON.stringify(manifest, null, 2) + '\\n';\n\nexport const parseProjectLayerContextIndex = (json: string): ProjectLayerContextIndex =>\n ProjectLayerContextIndexSchema.parse(JSON.parse(json));\n\nexport const serializeProjectLayerContextIndex = (contextIndex: ProjectLayerContextIndex): string =>\n JSON.stringify(contextIndex, null, 2) + '\\n';\n\nconst parseProjectLayerFrontmatter = (content: string): ProjectLayerFrontmatter => {\n const { frontmatter } = parseMarkdownFrontmatter(content);\n return ProjectLayerFrontmatterSchema.parse(frontmatter);\n};\n\nexport const parseProjectLayerDocument = (path: string, rawContent: string): ProjectLayerDocumentReadResult => {\n const managedContent = extractAiOpsSectionContent(rawContent);\n const content = managedContent ?? rawContent;\n const frontmatter = parseProjectLayerFrontmatter(content);\n\n return {\n path,\n status: frontmatter.status,\n layer: frontmatter.layer,\n owner: frontmatter.owner,\n read_when: frontmatter.read_when,\n update_when: frontmatter.update_when,\n contentHash: computeHash([content.trimEnd()]),\n content,\n };\n};\n\nconst parseMarkdownTableCells = (line: string): string[] | null => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('|') || !trimmed.endsWith('|')) {\n return null;\n }\n\n return trimmed\n .slice(1, -1)\n .split('|')\n .map((cell) => cell.trim());\n};\n\nconst isDocsStatusHeaderLine = (line: string): boolean => {\n const cells = parseMarkdownTableCells(line);\n return (\n cells !== null &&\n cells.length === 3 &&\n cells[0] === 'path' &&\n cells[1] === 'status' &&\n cells[2] === 'owner'\n );\n};\n\nconst isMarkdownDividerCell = (cell: string): boolean => /^:?-{3,}:?$/.test(cell);\n\nconst isDocsStatusDividerLine = (line: string): boolean => {\n const cells = parseMarkdownTableCells(line);\n return cells !== null && cells.length === 3 && cells.every(isMarkdownDividerCell);\n};\n\nconst findDocsStatusTableBounds = (lines: readonly string[]): DocsStatusTableBounds | null => {\n const headerIndex = lines.findIndex(isDocsStatusHeaderLine);\n const dividerIndex = headerIndex + 1;\n\n if (headerIndex < 0 || !isDocsStatusDividerLine(lines[dividerIndex] ?? '')) {\n return null;\n }\n\n let tableEndIndex = dividerIndex + 1;\n while (tableEndIndex < lines.length && parseMarkdownTableCells(lines[tableEndIndex] ?? '') !== null) {\n tableEndIndex += 1;\n }\n\n return { headerIndex, dividerIndex, tableEndIndex };\n};\n\nconst parseDocsStatusEntries = (content: string): DocsStatusEntry[] => {\n const document = parseProjectLayerDocument('docs/docs-status.md', content);\n const lines = document.content.split('\\n');\n const tableBounds = findDocsStatusTableBounds(lines);\n if (tableBounds === null) {\n return [];\n }\n\n const rows = lines.slice(tableBounds.dividerIndex + 1, tableBounds.tableEndIndex);\n\n return rows.flatMap((line) => {\n const cells = parseMarkdownTableCells(line);\n if (cells === null || cells.length < 3) return [];\n\n return [\n {\n path: cells[0],\n status: cells[1],\n owner: cells[2],\n },\n ];\n });\n};\n\n// ----- template loading -----\n\nexport const resolveProjectLayerTools = (requestedTools?: readonly string[]): ProjectLayerTool[] => {\n if (requestedTools === undefined || requestedTools.length === 0) {\n return [...DEFAULT_TOOLS];\n }\n\n const parsedTools = requestedTools.map((tool) => ProjectLayerToolSchema.parse(tool));\n const toolSet = new Set(parsedTools);\n return TOOL_ORDER.filter((tool) => toolSet.has(tool));\n};\n\nconst shouldIncludeTemplate = (relativePath: string, tools: readonly ProjectLayerTool[]): boolean => {\n if (relativePath === 'GEMINI.md') return tools.includes('gemini');\n if (relativePath === 'CLAUDE.md') return tools.includes('claude-code');\n return true;\n};\n\nconst buildDocsStatusRows = (specs: readonly ProjectLayerTemplateSpec[]): string =>\n specs.map((spec) => `| ${spec.path} | ${spec.frontmatter.status} | ${spec.frontmatter.owner} |`).join('\\n');\n\nconst includesReservedDocumentWarning = (content: string): boolean =>\n RESERVED_DOCUMENT_WARNINGS.some((warning) => content.includes(warning));\n\nconst loadTemplateSpec = (relativePath: string, content: string): ProjectLayerTemplateSpec => {\n const frontmatter = parseProjectLayerFrontmatter(content);\n const ownership = PROJECT_OWNED_PATHS.has(relativePath) ? 'project' : 'managed';\n\n if (frontmatter.status === 'Reserved' && !includesReservedDocumentWarning(content)) {\n throw new Error(`Reserved template must include warning text: ${relativePath}`);\n }\n\n return {\n path: relativePath,\n content,\n ownership,\n frontmatter,\n contentHash: computeHash([content.trimEnd()]),\n };\n};\n\nexport const loadProjectLayerTemplateSpecs = (\n tools: readonly ProjectLayerTool[],\n): readonly ProjectLayerTemplateSpec[] => {\n const selectedPaths = TEMPLATE_PATHS.filter((relativePath) => shouldIncludeTemplate(relativePath, tools));\n const nonStatusSpecs = selectedPaths\n .filter((relativePath) => relativePath !== 'docs/docs-status.md')\n .map((relativePath) => loadTemplateSpec(relativePath, readFileSync(resolveTemplatePath(relativePath), 'utf-8')));\n\n const statusTemplate = readFileSync(resolveTemplatePath('docs/docs-status.md'), 'utf-8');\n const statusPlaceholderSpec = loadTemplateSpec('docs/docs-status.md', statusTemplate);\n const specsForStatus = [...nonStatusSpecs, statusPlaceholderSpec].sort((a, b) => a.path.localeCompare(b.path));\n const statusContent = statusTemplate.replace('{{documents_table}}', buildDocsStatusRows(specsForStatus));\n const statusSpec = loadTemplateSpec('docs/docs-status.md', statusContent);\n\n return [...nonStatusSpecs, statusSpec].sort((a, b) => a.path.localeCompare(b.path));\n};\n\nexport const computeProjectLayerSourceHash = (specs: readonly ProjectLayerTemplateSpec[]): string =>\n computeHash(specs.map((spec) => `${spec.path}:${spec.content}`));\n\n// ----- manifest and index I/O -----\n\nexport const readProjectLayerManifest = (basePath: string): ProjectLayerManifest | null => {\n try {\n return parseProjectLayerManifest(readFileSync(resolveProjectLayerManifestPath(basePath), 'utf-8'));\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n};\n\nexport const writeProjectLayerManifest = (basePath: string, manifest: ProjectLayerManifest): void => {\n const manifestPath = resolveProjectLayerManifestPath(basePath);\n mkdirSync(dirname(manifestPath), { recursive: true });\n writeFileSync(manifestPath, serializeProjectLayerManifest(manifest), 'utf-8');\n};\n\nexport const readProjectLayerContextIndex = (basePath: string): ProjectLayerContextIndex | null => {\n try {\n return parseProjectLayerContextIndex(readFileSync(resolveProjectLayerContextIndexPath(basePath), 'utf-8'));\n } catch (error) {\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n};\n\nexport const writeProjectLayerContextIndex = (basePath: string, contextIndex: ProjectLayerContextIndex): void => {\n const contextIndexPath = resolveProjectLayerContextIndexPath(basePath);\n mkdirSync(dirname(contextIndexPath), { recursive: true });\n writeFileSync(contextIndexPath, serializeProjectLayerContextIndex(contextIndex), 'utf-8');\n};\n\n// ----- install and update -----\n\nconst installManagedFiles = (\n basePath: string,\n specs: readonly ProjectLayerTemplateSpec[],\n meta: { sourceHash: string; generatedAt: string },\n): ManagedInstallResult => {\n const written: string[] = [];\n const appended: string[] = [];\n\n for (const spec of specs) {\n const absolutePath = resolveProjectLayerFilePath(basePath, spec.path);\n const wrappedContent = wrapWithSection(spec.content, meta);\n\n if (!existsSync(absolutePath)) {\n mkdirSync(dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, wrappedContent + '\\n', 'utf-8');\n written.push(spec.path);\n continue;\n }\n\n const existing = readFileSync(absolutePath, 'utf-8');\n if (hasAiOpsSection(existing)) {\n writeFileSync(absolutePath, replaceAiOpsSection(existing, wrappedContent), 'utf-8');\n const stripped = stripAiOpsSection(existing);\n (stripped.trim().length > 0 ? appended : written).push(spec.path);\n continue;\n }\n\n if (hasLegacyHeader(existing)) {\n writeFileSync(absolutePath, wrappedContent + '\\n', 'utf-8');\n written.push(spec.path);\n continue;\n }\n\n writeFileSync(absolutePath, existing.trimEnd() + '\\n\\n' + wrappedContent + '\\n', 'utf-8');\n appended.push(spec.path);\n }\n\n return { written, appended };\n};\n\nconst installProjectFiles = (params: {\n basePath: string;\n specs: readonly ProjectLayerTemplateSpec[];\n previousProjectFiles?: readonly ProjectLayerProjectFile[];\n}): ProjectFileInstallResult => {\n const records: ProjectLayerProjectFile[] = [];\n const created: string[] = [];\n const refreshed: string[] = [];\n const preserved: string[] = [];\n const previousByPath = new Map((params.previousProjectFiles ?? []).map((file) => [file.path, file]));\n\n for (const spec of params.specs) {\n const absolutePath = resolveProjectLayerFilePath(params.basePath, spec.path);\n const previous = previousByPath.get(spec.path);\n\n if (!existsSync(absolutePath)) {\n mkdirSync(dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, spec.content + '\\n', 'utf-8');\n created.push(spec.path);\n records.push({\n path: spec.path,\n templateHash: spec.contentHash,\n created: true,\n });\n continue;\n }\n\n const existingContent = readFileSync(absolutePath, 'utf-8').trimEnd();\n const existingHash = computeHash([existingContent]);\n\n if (previous?.created === true && existingHash === previous.templateHash) {\n if (existingHash !== spec.contentHash) {\n writeFileSync(absolutePath, spec.content + '\\n', 'utf-8');\n refreshed.push(spec.path);\n } else {\n preserved.push(spec.path);\n }\n\n records.push({\n path: spec.path,\n templateHash: spec.contentHash,\n created: true,\n });\n continue;\n }\n\n preserved.push(spec.path);\n records.push({\n path: spec.path,\n templateHash: previous?.templateHash ?? spec.contentHash,\n created: previous?.created ?? false,\n });\n }\n\n return { records, created, refreshed, preserved };\n};\n\nconst buildContextIndexFromDisk = (params: {\n basePath: string;\n documentPaths: readonly string[];\n generatedAt: string;\n}): ProjectLayerContextIndex => {\n const documents = params.documentPaths.map((path) =>\n parseProjectLayerDocument(path, readFileSync(resolveProjectLayerFilePath(params.basePath, path), 'utf-8')),\n );\n\n return ProjectLayerContextIndexSchema.parse({\n schemaVersion: 1,\n kind: 'context-layer-index',\n documents: documents.map(({ content: _content, ...document }) => document),\n generatedAt: params.generatedAt,\n });\n};\n\nconst computeProjectFileHash = (basePath: string, relativePath: string): string =>\n computeHash([readFileSync(resolveProjectLayerFilePath(basePath, relativePath), 'utf-8').trimEnd()]);\n\nconst collectDocumentPathsFromManifest = (manifest: ProjectLayerManifest): string[] =>\n [\n ...manifest.managed_files.map((file) => file.path),\n ...manifest.project_files.map((file) => file.path),\n ...manifest.packs.flatMap((pack) => pack.documents.map((file) => file.path)),\n ].sort();\n\nconst buildDocsStatusRowsFromDisk = (params: {\n basePath: string;\n documentPaths: readonly string[];\n}): string[] =>\n params.documentPaths.map((path) => {\n const document = parseProjectLayerDocument(path, readFileSync(resolveProjectLayerFilePath(params.basePath, path), 'utf-8'));\n return `| ${document.path} | ${document.status} | ${document.owner} |`;\n });\n\nconst replaceDocsStatusRows = (content: string, rows: readonly string[]): string => {\n const lines = content.trimEnd().split('\\n');\n const tableBounds = findDocsStatusTableBounds(lines);\n\n if (tableBounds === null) {\n throw new Error('docs/docs-status.md table header not found');\n }\n\n return (\n [...lines.slice(0, tableBounds.dividerIndex + 1), ...rows, ...lines.slice(tableBounds.tableEndIndex)].join('\\n') +\n '\\n'\n );\n};\n\nconst updateDocsStatusTable = (basePath: string, documentPaths: readonly string[]): { beforeHash: string; afterHash: string } => {\n const docsStatusPath = 'docs/docs-status.md';\n const absolutePath = resolveProjectLayerFilePath(basePath, docsStatusPath);\n const beforeHash = computeProjectFileHash(basePath, docsStatusPath);\n const rows = buildDocsStatusRowsFromDisk({ basePath, documentPaths });\n const nextContent = replaceDocsStatusRows(readFileSync(absolutePath, 'utf-8'), rows);\n writeFileSync(absolutePath, nextContent, 'utf-8');\n\n return {\n beforeHash,\n afterHash: computeProjectFileHash(basePath, docsStatusPath),\n };\n};\n\nconst updateDocsStatusProjectFileRecord = (params: {\n manifest: ProjectLayerManifest;\n beforeHash: string;\n afterHash: string;\n}): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n ...params.manifest,\n project_files: params.manifest.project_files.map((file) => {\n if (file.path !== 'docs/docs-status.md' || !file.created || file.templateHash !== params.beforeHash) {\n return file;\n }\n\n return {\n ...file,\n templateHash: params.afterHash,\n };\n }),\n });\n\nexport const refreshProjectLayerDerivedState = (params: {\n basePath: string;\n manifest: ProjectLayerManifest;\n generatedAt: string;\n}): {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n} => {\n const documentPaths = collectDocumentPathsFromManifest(params.manifest);\n const docsStatusHashes = updateDocsStatusTable(params.basePath, documentPaths);\n const manifest = updateDocsStatusProjectFileRecord({\n manifest: params.manifest,\n beforeHash: docsStatusHashes.beforeHash,\n afterHash: docsStatusHashes.afterHash,\n });\n const contextIndex = buildContextIndexFromDisk({\n basePath: params.basePath,\n documentPaths,\n generatedAt: params.generatedAt,\n });\n\n writeProjectLayerContextIndex(params.basePath, contextIndex);\n\n return {\n manifest,\n contextIndex,\n };\n};\n\nconst buildProjectLayerManifest = (params: {\n tools: readonly ProjectLayerTool[];\n managedFiles: readonly string[];\n projectFiles: readonly ProjectLayerProjectFile[];\n packs: readonly ProjectLayerPackRecord[];\n sourceHash: string;\n cliVersion: string;\n generatedAt: string;\n settings?: Record<string, unknown>;\n}): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n schemaVersion: 1,\n kind: 'project-operating-layer',\n tools: [...params.tools],\n managed_files: params.managedFiles.map((path) => ({\n path,\n sourceHash: params.sourceHash,\n })),\n project_files: [...params.projectFiles],\n packs: [...params.packs],\n settings: params.settings ?? {},\n sourceHash: params.sourceHash,\n cliVersion: params.cliVersion,\n generatedAt: params.generatedAt,\n });\n\nconst retireUnselectedManagedFiles = (params: {\n basePath: string;\n previousManifest: ProjectLayerManifest | null;\n nextManagedPaths: readonly string[];\n}): void => {\n if (!params.previousManifest) return;\n\n const nextManagedPathSet = new Set(params.nextManagedPaths);\n for (const file of params.previousManifest.managed_files) {\n if (!nextManagedPathSet.has(file.path)) {\n removeManagedProjectFile(params.basePath, file.path);\n }\n }\n};\n\nexport const installProjectLayer = (params: {\n basePath: string;\n tools: readonly ProjectLayerTool[];\n previousManifest?: ProjectLayerManifest | null;\n}): ProjectLayerInstallResult => {\n const previousManifest =\n params.previousManifest === undefined ? readProjectLayerManifest(params.basePath) : params.previousManifest;\n const specs = loadProjectLayerTemplateSpecs(params.tools);\n const sourceHash = computeProjectLayerSourceHash(specs);\n const generatedAt = new Date().toISOString();\n const managedSpecs = specs.filter((spec) => spec.ownership === 'managed');\n const projectSpecs = specs.filter((spec) => spec.ownership === 'project');\n const managedPaths = managedSpecs.map((spec) => spec.path);\n retireUnselectedManagedFiles({\n basePath: params.basePath,\n previousManifest,\n nextManagedPaths: managedPaths,\n });\n const managedResult = installManagedFiles(params.basePath, managedSpecs, { sourceHash, generatedAt });\n const projectResult = installProjectFiles({\n basePath: params.basePath,\n specs: projectSpecs,\n previousProjectFiles: previousManifest?.project_files,\n });\n const provisionalManifest = buildProjectLayerManifest({\n tools: params.tools,\n managedFiles: managedPaths,\n projectFiles: projectResult.records,\n packs: previousManifest?.packs ?? [],\n sourceHash,\n cliVersion: getCliVersion(),\n generatedAt,\n settings: previousManifest?.settings,\n });\n const { manifest, contextIndex } = refreshProjectLayerDerivedState({\n basePath: params.basePath,\n manifest: provisionalManifest,\n generatedAt,\n });\n\n writeProjectLayerManifest(params.basePath, manifest);\n\n return {\n manifest,\n contextIndex,\n written: managedResult.written,\n appended: managedResult.appended,\n createdProjectFiles: projectResult.created,\n refreshedProjectFiles: projectResult.refreshed,\n preservedProjectFiles: projectResult.preserved,\n };\n};\n\nexport const updateProjectLayer = (params: {\n basePath: string;\n manifest: ProjectLayerManifest;\n}): ProjectLayerInstallResult => {\n const specs = loadProjectLayerTemplateSpecs(params.manifest.tools);\n const sourceHash = computeProjectLayerSourceHash(specs);\n const generatedAt = new Date().toISOString();\n const managedSpecs = specs.filter((spec) => spec.ownership === 'managed');\n const projectSpecs = specs.filter((spec) => spec.ownership === 'project');\n const managedResult = installManagedFiles(params.basePath, managedSpecs, { sourceHash, generatedAt });\n const projectResult = installProjectFiles({\n basePath: params.basePath,\n specs: projectSpecs,\n previousProjectFiles: params.manifest.project_files,\n });\n const provisionalManifest = buildProjectLayerManifest({\n tools: params.manifest.tools,\n managedFiles: managedSpecs.map((spec) => spec.path),\n projectFiles: projectResult.records,\n packs: params.manifest.packs,\n sourceHash,\n cliVersion: getCliVersion(),\n generatedAt,\n settings: params.manifest.settings,\n });\n const { manifest, contextIndex } = refreshProjectLayerDerivedState({\n basePath: params.basePath,\n manifest: provisionalManifest,\n generatedAt,\n });\n\n writeProjectLayerManifest(params.basePath, manifest);\n\n return {\n manifest,\n contextIndex,\n written: managedResult.written,\n appended: managedResult.appended,\n createdProjectFiles: projectResult.created,\n refreshedProjectFiles: projectResult.refreshed,\n preservedProjectFiles: projectResult.preserved,\n };\n};\n\n// ----- diff and audit -----\n\nconst issue = (level: ProjectLayerIssueLevel, code: string, message: string): ProjectLayerIssue => ({\n level,\n code,\n message,\n});\n\nconst readDocumentSafely = (basePath: string, path: string): ProjectLayerDocumentReadResult | ProjectLayerIssue => {\n try {\n const absolutePath = resolveProjectLayerFilePath(basePath, path);\n if (!existsSync(absolutePath)) {\n return issue('error', 'missing-file', `파일 없음: ${path}`);\n }\n\n return parseProjectLayerDocument(path, readFileSync(absolutePath, 'utf-8'));\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n return issue('error', 'invalid-frontmatter', `${path} frontmatter 파싱 실패: ${reason}`);\n }\n};\n\nconst buildContextIndexMap = (contextIndex: ProjectLayerContextIndex | null): Map<string, ProjectLayerContextDocument> =>\n new Map((contextIndex?.documents ?? []).map((document) => [document.path, document]));\n\nconst compareArray = (left: readonly string[], right: readonly string[]): boolean =>\n left.length === right.length && left.every((value, index) => value === right[index]);\n\nconst compareContextDocument = (params: {\n expected: ProjectLayerDocumentReadResult;\n indexed: ProjectLayerContextDocument | undefined;\n}): ProjectLayerIssue[] => {\n const indexed = params.indexed;\n if (indexed === undefined) {\n return [issue('error', 'context-missing-document', `context-layer 누락: ${params.expected.path}`)];\n }\n\n const issues: ProjectLayerIssue[] = [];\n const scalarKeys = ['status', 'layer', 'owner', 'contentHash'] as const;\n\n for (const key of scalarKeys) {\n if (params.expected[key] !== indexed[key]) {\n issues.push(\n issue('error', 'context-document-mismatch', `${params.expected.path} context ${key} 불일치`),\n );\n }\n }\n\n if (!compareArray(params.expected.read_when, indexed.read_when)) {\n issues.push(issue('error', 'context-document-mismatch', `${params.expected.path} context read_when 불일치`));\n }\n\n if (!compareArray(params.expected.update_when, indexed.update_when)) {\n issues.push(issue('error', 'context-document-mismatch', `${params.expected.path} context update_when 불일치`));\n }\n\n return issues;\n};\n\nconst compareDocsStatusEntry = (params: {\n expected: ProjectLayerDocumentReadResult;\n entry: DocsStatusEntry | undefined;\n}): ProjectLayerIssue[] => {\n const entry = params.entry;\n if (entry === undefined) {\n return [issue('error', 'docs-status-missing-document', `docs-status 누락: ${params.expected.path}`)];\n }\n\n const issues: ProjectLayerIssue[] = [];\n if (entry.status !== params.expected.status) {\n issues.push(issue('error', 'docs-status-mismatch', `${params.expected.path} docs-status status 불일치`));\n }\n\n if (entry.owner !== params.expected.owner) {\n issues.push(issue('error', 'docs-status-mismatch', `${params.expected.path} docs-status owner 불일치`));\n }\n\n return issues;\n};\n\nexport const diffProjectLayer = (basePath: string): ProjectLayerReport => {\n let manifest: ProjectLayerManifest | null;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n return {\n currentSourceHash: null,\n issues: [issue('error', 'invalid-manifest', `${PROJECT_LAYER_MANIFEST_RELATIVE_PATH} 파싱 실패: ${reason}`)],\n };\n }\n\n if (!manifest) {\n return {\n currentSourceHash: null,\n issues: [issue('error', 'missing-manifest', `${PROJECT_LAYER_MANIFEST_RELATIVE_PATH}가 없습니다.`)],\n };\n }\n\n const specs = loadProjectLayerTemplateSpecs(manifest.tools);\n const currentSourceHash = computeProjectLayerSourceHash(specs);\n let contextIndex: ProjectLayerContextIndex | null = null;\n const issues: ProjectLayerIssue[] = [];\n\n try {\n contextIndex = readProjectLayerContextIndex(basePath);\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n issues.push(\n issue('error', 'invalid-context-index', `${PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH} 파싱 실패: ${reason}`),\n );\n }\n\n const contextMap = buildContextIndexMap(contextIndex);\n const expectedManagedPaths = new Set(specs.filter((spec) => spec.ownership === 'managed').map((spec) => spec.path));\n const manifestManagedPaths = new Set(manifest.managed_files.map((file) => file.path));\n\n if (manifest.sourceHash !== currentSourceHash) {\n issues.push(\n issue('warning', 'source-hash-drift', `template sourceHash 변경: ${manifest.sourceHash} -> ${currentSourceHash}`),\n );\n }\n\n if (contextIndex === null) {\n issues.push(issue('error', 'missing-context-index', `${PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH}가 없습니다.`));\n }\n\n for (const expectedPath of expectedManagedPaths) {\n if (!manifestManagedPaths.has(expectedPath)) {\n issues.push(issue('error', 'manifest-missing-managed-file', `manifest managed_files 누락: ${expectedPath}`));\n }\n }\n\n for (const file of manifest.managed_files) {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n issues.push(issue('error', 'missing-file', `파일 없음: ${file.path}`));\n continue;\n }\n\n const content = readFileSync(absolutePath, 'utf-8');\n const meta = parseAiOpsMeta(content);\n if (!meta) {\n issues.push(issue('error', 'missing-managed-section', `managed section 메타 없음: ${file.path}`));\n continue;\n }\n\n if (meta.sourceHash !== currentSourceHash) {\n issues.push(\n issue('warning', 'managed-source-hash-drift', `${file.path} sourceHash 변경: ${meta.sourceHash} -> ${currentSourceHash}`),\n );\n }\n }\n\n for (const file of manifest.project_files) {\n if (!existsSync(resolveProjectLayerFilePath(basePath, file.path))) {\n issues.push(issue('error', 'missing-file', `파일 없음: ${file.path}`));\n }\n }\n\n for (const pack of manifest.packs) {\n for (const file of [...pack.documents, ...pack.files]) {\n if (!existsSync(resolveProjectLayerFilePath(basePath, file.path))) {\n issues.push(issue('error', 'missing-file', `파일 없음: ${file.path}`));\n }\n }\n }\n\n for (const path of collectDocumentPathsFromManifest(manifest)) {\n const document = readDocumentSafely(basePath, path);\n if ('code' in document) {\n issues.push(document);\n continue;\n }\n issues.push(...compareContextDocument({ expected: document, indexed: contextMap.get(path) }));\n }\n\n return { currentSourceHash, issues };\n};\n\nexport const auditProjectLayer = (basePath: string): ProjectLayerReport => {\n const diffReport = diffProjectLayer(basePath);\n let manifest: ProjectLayerManifest | null;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch {\n return diffReport;\n }\n\n if (!manifest) {\n return diffReport;\n }\n\n let contextIndex: ProjectLayerContextIndex | null = null;\n try {\n contextIndex = readProjectLayerContextIndex(basePath);\n } catch {\n contextIndex = null;\n }\n const documentPaths = collectDocumentPathsFromManifest(manifest);\n const documentPathSet = new Set(documentPaths);\n const contextPathSet = new Set(contextIndex?.documents.map((document) => document.path) ?? []);\n const issues = [...diffReport.issues];\n const docsStatusPath = resolveProjectLayerFilePath(basePath, 'docs/docs-status.md');\n\n if (!existsSync(docsStatusPath)) {\n issues.push(issue('error', 'missing-docs-status', 'docs/docs-status.md가 없습니다.'));\n return { currentSourceHash: diffReport.currentSourceHash, issues };\n }\n\n let docsStatusEntries: DocsStatusEntry[] = [];\n try {\n docsStatusEntries = parseDocsStatusEntries(readFileSync(docsStatusPath, 'utf-8'));\n } catch (error) {\n const reason = error instanceof Error ? error.message : 'unknown error';\n issues.push(issue('error', 'invalid-docs-status', `docs/docs-status.md 파싱 실패: ${reason}`));\n }\n\n const docsStatusMap = new Map(docsStatusEntries.map((entry) => [entry.path, entry]));\n\n for (const path of documentPaths) {\n const document = readDocumentSafely(basePath, path);\n if ('code' in document) {\n continue;\n }\n\n issues.push(...compareDocsStatusEntry({ expected: document, entry: docsStatusMap.get(path) }));\n }\n\n for (const entry of docsStatusEntries) {\n if (!documentPathSet.has(entry.path)) {\n issues.push(issue('warning', 'docs-status-extra-document', `docs-status에 manifest 외 문서가 있습니다: ${entry.path}`));\n }\n }\n\n for (const contextPath of contextPathSet) {\n if (!documentPathSet.has(contextPath)) {\n issues.push(issue('warning', 'context-extra-document', `context-layer에 manifest 외 문서가 있습니다: ${contextPath}`));\n }\n }\n\n return { currentSourceHash: diffReport.currentSourceHash, issues };\n};\n\n// ----- uninstall -----\n\nfunction removeManagedProjectFile(basePath: string, relativePath: string): ProjectLayerRemoveResult {\n const absolutePath = resolveProjectLayerFilePath(basePath, relativePath);\n if (!existsSync(absolutePath)) {\n return { deleted: [], cleaned: [], preserved: [], notFound: [relativePath] };\n }\n\n const content = readFileSync(absolutePath, 'utf-8');\n if (!hasAiOpsSection(content)) {\n return { deleted: [], cleaned: [], preserved: [relativePath], notFound: [] };\n }\n\n const stripped = stripAiOpsSection(content);\n if (stripped.trim().length === 0) {\n rmSync(absolutePath);\n return { deleted: [relativePath], cleaned: [], preserved: [], notFound: [] };\n }\n\n writeFileSync(absolutePath, stripped, 'utf-8');\n return { deleted: [], cleaned: [relativePath], preserved: [], notFound: [] };\n}\n\nconst removeCreateOnlyProjectFile = (basePath: string, file: ProjectLayerProjectFile): ProjectLayerRemoveResult => {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n return { deleted: [], cleaned: [], preserved: [], notFound: [file.path] };\n }\n\n const content = readFileSync(absolutePath, 'utf-8').trimEnd();\n const currentHash = computeHash([content]);\n if (file.created && currentHash === file.templateHash) {\n rmSync(absolutePath);\n return { deleted: [file.path], cleaned: [], preserved: [], notFound: [] };\n }\n\n return { deleted: [], cleaned: [], preserved: [file.path], notFound: [] };\n};\n\nconst removePackOwnedFile = (basePath: string, file: ProjectLayerPackFileRecord): ProjectLayerRemoveResult => {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n return { deleted: [], cleaned: [], preserved: [], notFound: [file.path] };\n }\n\n const currentHash = computeHash([readFileSync(absolutePath, 'utf-8').trimEnd()]);\n if (currentHash === file.sourceHash) {\n rmSync(absolutePath);\n return { deleted: [file.path], cleaned: [], preserved: [], notFound: [] };\n }\n\n return { deleted: [], cleaned: [], preserved: [file.path], notFound: [] };\n};\n\nconst mergeRemoveResults = (results: readonly ProjectLayerRemoveResult[]): ProjectLayerRemoveResult => ({\n deleted: results.flatMap((result) => result.deleted),\n cleaned: results.flatMap((result) => result.cleaned),\n preserved: results.flatMap((result) => result.preserved),\n notFound: results.flatMap((result) => result.notFound),\n});\n\nconst removeEmptyDirs = (basePath: string, relativePaths: readonly string[]): void => {\n const dirs = [...new Set(relativePaths.map(toRelativeDir).filter((dir) => dir !== '.'))].sort(\n (a, b) => b.length - a.length,\n );\n\n for (const dir of [...dirs, '.ai-ops']) {\n const absoluteDir = resolveProjectLayerFilePath(basePath, dir);\n if (!existsSync(absoluteDir)) continue;\n\n try {\n if (readdirSync(absoluteDir).length === 0) {\n rmSync(absoluteDir, { recursive: true });\n }\n } catch {\n // Ignore cleanup failures.\n }\n }\n};\n\nexport const uninstallProjectLayer = (basePath: string, manifest: ProjectLayerManifest): ProjectLayerRemoveResult => {\n const managedResults = manifest.managed_files.map((file) => removeManagedProjectFile(basePath, file.path));\n const projectResults = manifest.project_files.map((file) => removeCreateOnlyProjectFile(basePath, file));\n const packResults = manifest.packs.flatMap((pack) =>\n [...pack.documents, ...pack.files].map((file) => removePackOwnedFile(basePath, file)),\n );\n const stateFiles = [PROJECT_LAYER_CONTEXT_INDEX_RELATIVE_PATH, PROJECT_LAYER_MANIFEST_RELATIVE_PATH];\n\n for (const stateFile of stateFiles) {\n rmSync(resolveProjectLayerFilePath(basePath, stateFile), { force: true });\n }\n\n const result = mergeRemoveResults([...managedResults, ...projectResults, ...packResults]);\n removeEmptyDirs(basePath, [...result.deleted, ...stateFiles]);\n return result;\n};\n","import { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// src/core/* 또는 dist/bin/index.js 기준에서도 공통으로 패키지 루트/data를 가리키도록 계산\n// src/core/paths.ts → ../../data = apps/cli/data\n// dist/bin/index.js (bundle) → ../../data = apps/cli/data\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nexport const COMPILER_DATA_DIR = resolve(__dirname, '..', '..', 'data');\n","import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path';\nimport { parseMarkdownFrontmatter } from './frontmatter.js';\nimport {\n PackCatalogSchema,\n ProjectLayerFrontmatterSchema,\n ProjectLayerManifestSchema,\n isSafeProjectLayerPath,\n} from './schemas/index.js';\nimport type {\n PackCatalog,\n ProjectLayerContextIndex,\n ProjectLayerManifest,\n ProjectLayerPackFileRecord,\n ProjectLayerPackRecord,\n} from './schemas/index.js';\nimport { computeHash, getCliVersion } from './source-hash.js';\nimport { COMPILER_DATA_DIR } from './paths.js';\nimport {\n readProjectLayerManifest,\n refreshProjectLayerDerivedState,\n resolveProjectLayerFilePath,\n writeProjectLayerManifest,\n} from './project-layer.js';\n\n// ----- types -----\n\nexport type ProjectLayerPackSourceFile = {\n path: string;\n content: string;\n sourceHash: string;\n};\n\nexport type ProjectLayerPackSource = {\n id: string;\n sourceHash: string;\n documents: ProjectLayerPackSourceFile[];\n files: ProjectLayerPackSourceFile[];\n};\n\nexport type ProjectLayerPackApplyResult = {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n written: string[];\n refreshed: string[];\n preserved: string[];\n deleted: string[];\n notFound: string[];\n};\n\nexport type ProjectLayerPackIssueLevel = 'error' | 'warning';\n\nexport type ProjectLayerPackIssue = {\n level: ProjectLayerPackIssueLevel;\n code: string;\n message: string;\n};\n\nexport type ProjectLayerPackReport = {\n issues: ProjectLayerPackIssue[];\n};\n\ntype PackFileApplyResult = {\n written: string[];\n refreshed: string[];\n preserved: string[];\n deleted: string[];\n notFound: string[];\n};\n\n// ----- constants -----\n\nconst PACK_REGISTRY_FILENAME = 'pack-registry.json';\nconst SPEC_LIFECYCLE_PACK_ID = 'spec-lifecycle';\nconst PACK_INSTALL_ROOT = 'docs/specs/';\nconst RESERVED_DOCUMENT_WARNINGS = [\n '판단 근거로 사용하지 마세요',\n 'Do not use this document as current decision-making evidence',\n] as const;\nconst DEFAULT_PACKS_DIR = join(COMPILER_DATA_DIR, 'packs');\n\n// ----- source loading -----\n\nconst includesReservedDocumentWarning = (content: string): boolean =>\n RESERVED_DOCUMENT_WARNINGS.some((warning) => content.includes(warning));\n\nconst readPackCatalog = (packsDir: string): PackCatalog =>\n PackCatalogSchema.parse(JSON.parse(readFileSync(join(packsDir, PACK_REGISTRY_FILENAME), 'utf-8')));\n\nconst assertPackInstallPath = (path: string): void => {\n if (!isSafeProjectLayerPath(path) || !path.startsWith(PACK_INSTALL_ROOT)) {\n throw new Error(`Unsafe pack path: ${path}`);\n }\n};\n\nconst readPackSourceFiles = (packDir: string): ProjectLayerPackSourceFile[] => {\n const files: ProjectLayerPackSourceFile[] = [];\n\n const walk = (relativeDir = ''): void => {\n const absoluteDir = relativeDir.length > 0 ? join(packDir, relativeDir) : packDir;\n const entries = readdirSync(absoluteDir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of entries) {\n const nextRelativePath = relativeDir.length > 0 ? join(relativeDir, entry.name) : entry.name;\n if (entry.isDirectory()) {\n walk(nextRelativePath);\n continue;\n }\n\n assertPackInstallPath(nextRelativePath);\n const content = readFileSync(join(packDir, nextRelativePath), 'utf-8');\n files.push({\n path: nextRelativePath,\n content,\n sourceHash: computeHash([content.trimEnd()]),\n });\n }\n };\n\n walk();\n return files;\n};\n\nconst splitPackSourceFiles = (files: readonly ProjectLayerPackSourceFile[]): {\n documents: ProjectLayerPackSourceFile[];\n files: ProjectLayerPackSourceFile[];\n} => {\n const documents: ProjectLayerPackSourceFile[] = [];\n const regularFiles: ProjectLayerPackSourceFile[] = [];\n\n for (const file of files) {\n if (!file.path.endsWith('.md')) {\n regularFiles.push(file);\n continue;\n }\n\n const { frontmatter } = parseMarkdownFrontmatter(file.content);\n const parsed = ProjectLayerFrontmatterSchema.parse(frontmatter);\n if (parsed.status === 'Reserved' && !includesReservedDocumentWarning(file.content)) {\n throw new Error(`Reserved pack document must include warning text: ${file.path}`);\n }\n documents.push(file);\n }\n\n return { documents, files: regularFiles };\n};\n\nexport const loadAllPacks = (packsDir: string): ProjectLayerPackSource[] => {\n const catalog = readPackCatalog(packsDir);\n const entries = [...catalog.packs].sort((a, b) => a.id.localeCompare(b.id));\n\n return entries.map((entry) => {\n if (entry.id !== SPEC_LIFECYCLE_PACK_ID) {\n throw new Error(`Unsupported pack id: ${entry.id}`);\n }\n\n const packDir = resolve(packsDir, entry.source_path);\n const relativeFromPacks = relative(resolve(packsDir), packDir);\n if (relativeFromPacks.length === 0 || relativeFromPacks.startsWith('..') || isAbsolute(relativeFromPacks)) {\n throw new Error(`Pack source path escapes packs dir: ${entry.source_path}`);\n }\n\n const files = readPackSourceFiles(packDir);\n const split = splitPackSourceFiles(files);\n\n return {\n id: entry.id,\n sourceHash: computeHash(files.map((file) => `${file.path}:${file.content}`).sort()),\n documents: split.documents,\n files: split.files,\n };\n });\n};\n\nconst resolvePackById = (packsDir: string, packId: string): ProjectLayerPackSource => {\n const pack = loadAllPacks(packsDir).find((candidate) => candidate.id === packId);\n if (!pack) {\n throw new Error(`Unknown pack: ${packId}`);\n }\n return pack;\n};\n\n// ----- file application -----\n\nconst serializePackFileContent = (content: string): string => (content.length === 0 ? '' : content.trimEnd() + '\\n');\n\nconst readProjectFileHash = (basePath: string, relativePath: string): string =>\n computeHash([readFileSync(resolveProjectLayerFilePath(basePath, relativePath), 'utf-8').trimEnd()]);\n\nconst writePackFile = (basePath: string, file: ProjectLayerPackSourceFile): void => {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n mkdirSync(dirname(absolutePath), { recursive: true });\n writeFileSync(absolutePath, serializePackFileContent(file.content), 'utf-8');\n};\n\nconst buildPackFileRecords = (files: readonly ProjectLayerPackSourceFile[]): ProjectLayerPackFileRecord[] =>\n files.map((file) => ({\n path: file.path,\n sourceHash: file.sourceHash,\n }));\n\nconst buildPackRecord = (params: {\n pack: ProjectLayerPackSource;\n installedAt: string;\n}): ProjectLayerPackRecord => ({\n id: params.pack.id,\n sourceHash: params.pack.sourceHash,\n documents: buildPackFileRecords(params.pack.documents),\n files: buildPackFileRecords(params.pack.files),\n installedAt: params.installedAt,\n});\n\nconst applyPackSourceFiles = (params: {\n basePath: string;\n pack: ProjectLayerPackSource;\n previousRecord: ProjectLayerPackRecord | null;\n}): PackFileApplyResult => {\n const written: string[] = [];\n const refreshed: string[] = [];\n const preserved: string[] = [];\n const deleted: string[] = [];\n const notFound: string[] = [];\n const sourceFiles = [...params.pack.documents, ...params.pack.files];\n const sourceByPath = new Map(sourceFiles.map((file) => [file.path, file]));\n const previousByPath = new Map(\n [...(params.previousRecord?.documents ?? []), ...(params.previousRecord?.files ?? [])].map((file) => [\n file.path,\n file,\n ]),\n );\n\n for (const file of sourceFiles) {\n const absolutePath = resolveProjectLayerFilePath(params.basePath, file.path);\n const previous = previousByPath.get(file.path);\n\n if (!existsSync(absolutePath)) {\n writePackFile(params.basePath, file);\n written.push(file.path);\n continue;\n }\n\n if (previous === undefined) {\n preserved.push(file.path);\n continue;\n }\n\n const currentHash = readProjectFileHash(params.basePath, file.path);\n if (currentHash !== previous.sourceHash) {\n preserved.push(file.path);\n continue;\n }\n\n if (currentHash !== file.sourceHash) {\n writePackFile(params.basePath, file);\n refreshed.push(file.path);\n }\n }\n\n for (const previous of previousByPath.values()) {\n if (sourceByPath.has(previous.path)) {\n continue;\n }\n\n const absolutePath = resolveProjectLayerFilePath(params.basePath, previous.path);\n if (!existsSync(absolutePath)) {\n notFound.push(previous.path);\n continue;\n }\n\n if (readProjectFileHash(params.basePath, previous.path) === previous.sourceHash) {\n rmSync(absolutePath);\n deleted.push(previous.path);\n } else {\n preserved.push(previous.path);\n }\n }\n\n return { written, refreshed, preserved, deleted, notFound };\n};\n\nconst removePackFiles = (basePath: string, record: ProjectLayerPackRecord): PackFileApplyResult => {\n const deleted: string[] = [];\n const preserved: string[] = [];\n const notFound: string[] = [];\n\n for (const file of [...record.documents, ...record.files]) {\n const absolutePath = resolveProjectLayerFilePath(basePath, file.path);\n if (!existsSync(absolutePath)) {\n notFound.push(file.path);\n continue;\n }\n\n if (readProjectFileHash(basePath, file.path) === file.sourceHash) {\n rmSync(absolutePath);\n deleted.push(file.path);\n } else {\n preserved.push(file.path);\n }\n }\n\n return { written: [], refreshed: [], preserved, deleted, notFound };\n};\n\nconst removeEmptyDirs = (basePath: string, relativePaths: readonly string[]): void => {\n const dirs = [...new Set(relativePaths.map((path) => dirname(path)).filter((dir) => dir !== '.'))].sort(\n (a, b) => b.length - a.length,\n );\n\n for (const dir of dirs) {\n const absoluteDir = resolveProjectLayerFilePath(basePath, dir);\n if (!existsSync(absoluteDir)) {\n continue;\n }\n\n try {\n if (readdirSync(absoluteDir).length === 0) {\n rmSync(absoluteDir, { recursive: true });\n }\n } catch {\n // Directory cleanup is best-effort only.\n }\n }\n};\n\n// ----- manifest updates -----\n\nconst requireProjectLayerManifest = (basePath: string): ProjectLayerManifest => {\n const manifest = readProjectLayerManifest(basePath);\n if (!manifest) {\n throw new Error('.ai-ops/manifest.json이 없습니다. 먼저 ai-ops init을 실행하세요.');\n }\n return manifest;\n};\n\nconst upsertPackRecord = (\n manifest: ProjectLayerManifest,\n record: ProjectLayerPackRecord,\n generatedAt: string,\n): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n ...manifest,\n packs: [...manifest.packs.filter((pack) => pack.id !== record.id), record],\n cliVersion: getCliVersion(),\n generatedAt,\n });\n\nconst removePackRecord = (manifest: ProjectLayerManifest, packId: string, generatedAt: string): ProjectLayerManifest =>\n ProjectLayerManifestSchema.parse({\n ...manifest,\n packs: manifest.packs.filter((pack) => pack.id !== packId),\n cliVersion: getCliVersion(),\n generatedAt,\n });\n\nconst writeManifestWithDerivedState = (params: {\n basePath: string;\n manifest: ProjectLayerManifest;\n generatedAt: string;\n}): {\n manifest: ProjectLayerManifest;\n contextIndex: ProjectLayerContextIndex;\n} => {\n const derived = refreshProjectLayerDerivedState({\n basePath: params.basePath,\n manifest: params.manifest,\n generatedAt: params.generatedAt,\n });\n writeProjectLayerManifest(params.basePath, derived.manifest);\n return derived;\n};\n\n// ----- lifecycle -----\n\nexport const installProjectLayerPack = (params: {\n basePath: string;\n packId: string;\n packsDir?: string;\n}): ProjectLayerPackApplyResult => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const previousRecord = manifest.packs.find((pack) => pack.id === params.packId);\n if (previousRecord) {\n return updateProjectLayerPack(params);\n }\n\n const pack = resolvePackById(params.packsDir ?? DEFAULT_PACKS_DIR, params.packId);\n const installedAt = new Date().toISOString();\n const applyResult = applyPackSourceFiles({ basePath: params.basePath, pack, previousRecord: null });\n const nextManifest = upsertPackRecord(manifest, buildPackRecord({ pack, installedAt }), installedAt);\n const derived = writeManifestWithDerivedState({\n basePath: params.basePath,\n manifest: nextManifest,\n generatedAt: installedAt,\n });\n\n return { ...applyResult, manifest: derived.manifest, contextIndex: derived.contextIndex };\n};\n\nexport const updateProjectLayerPack = (params: {\n basePath: string;\n packId: string;\n packsDir?: string;\n}): ProjectLayerPackApplyResult => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const previousRecord = manifest.packs.find((pack) => pack.id === params.packId);\n if (!previousRecord) {\n throw new Error(`설치된 pack을 찾지 못했습니다: ${params.packId}`);\n }\n\n const pack = resolvePackById(params.packsDir ?? DEFAULT_PACKS_DIR, params.packId);\n const generatedAt = new Date().toISOString();\n const applyResult = applyPackSourceFiles({ basePath: params.basePath, pack, previousRecord });\n const nextManifest = upsertPackRecord(\n manifest,\n buildPackRecord({ pack, installedAt: previousRecord.installedAt }),\n generatedAt,\n );\n const derived = writeManifestWithDerivedState({\n basePath: params.basePath,\n manifest: nextManifest,\n generatedAt,\n });\n\n removeEmptyDirs(params.basePath, applyResult.deleted);\n return { ...applyResult, manifest: derived.manifest, contextIndex: derived.contextIndex };\n};\n\nexport const uninstallProjectLayerPack = (params: {\n basePath: string;\n packId: string;\n}): ProjectLayerPackApplyResult => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const previousRecord = manifest.packs.find((pack) => pack.id === params.packId);\n if (!previousRecord) {\n throw new Error(`설치된 pack을 찾지 못했습니다: ${params.packId}`);\n }\n\n const generatedAt = new Date().toISOString();\n const applyResult = removePackFiles(params.basePath, previousRecord);\n const nextManifest = removePackRecord(manifest, params.packId, generatedAt);\n const derived = writeManifestWithDerivedState({\n basePath: params.basePath,\n manifest: nextManifest,\n generatedAt,\n });\n\n removeEmptyDirs(params.basePath, applyResult.deleted);\n return { ...applyResult, manifest: derived.manifest, contextIndex: derived.contextIndex };\n};\n\n// ----- diff -----\n\nconst packIssue = (\n level: ProjectLayerPackIssueLevel,\n code: string,\n message: string,\n): ProjectLayerPackIssue => ({\n level,\n code,\n message,\n});\n\nexport const diffProjectLayerPack = (params: {\n basePath: string;\n packId?: string;\n packsDir?: string;\n}): ProjectLayerPackReport => {\n const manifest = requireProjectLayerManifest(params.basePath);\n const targets = params.packId ? manifest.packs.filter((pack) => pack.id === params.packId) : manifest.packs;\n const issues: ProjectLayerPackIssue[] = [];\n\n if (targets.length === 0) {\n return { issues: [packIssue('warning', 'missing-pack', '비교할 설치된 pack이 없습니다.')] };\n }\n\n for (const record of targets) {\n const pack = resolvePackById(params.packsDir ?? DEFAULT_PACKS_DIR, record.id);\n if (record.sourceHash !== pack.sourceHash) {\n issues.push(\n packIssue('warning', 'pack-source-hash-drift', `${record.id} sourceHash 변경: ${record.sourceHash} -> ${pack.sourceHash}`),\n );\n }\n\n for (const file of [...record.documents, ...record.files]) {\n const absolutePath = resolveProjectLayerFilePath(params.basePath, file.path);\n if (!existsSync(absolutePath)) {\n issues.push(packIssue('error', 'missing-file', `파일 없음: ${file.path}`));\n }\n }\n }\n\n return { issues };\n};\n","import { join } from 'node:path';\nimport { TOOL_OUTPUT_MAP } from './tool-output.js';\nimport type { Manifest } from './schemas/index.js';\n\n/**\n * manifest에 installed_files가 없는 구버전 manifest를 위한 fallback.\n * manifest의 tools/workspaces/installed_rules 정보를 기반으로\n * 실제 설치됐을 파일 경로를 역산한다.\n */\nexport const inferInstalledFiles = (manifest: Manifest): string[] => {\n const files: string[] = [];\n const isMonorepo = manifest.workspaces !== undefined;\n\n for (const toolId of manifest.tools) {\n if (toolId === 'claude-code') {\n // claude-code: .claude/rules/{ruleId}.md\n const config = TOOL_OUTPUT_MAP['claude-code'];\n for (const ruleId of manifest.installed_rules) {\n files.push(join(config.rulesDir, `${ruleId}${config.fileExtension}`));\n }\n } else if (toolId === 'codex') {\n const config = TOOL_OUTPUT_MAP['codex'];\n if (!isMonorepo) {\n // 비모노: .codex/AGENTS.md + .codex/AGENTS.override.md (domain 있으면)\n files.push(join(config.dir, config.rootFileName));\n files.push(join(config.dir, config.domainFileName));\n } else {\n // 모노: .codex/AGENTS.md (global) + {workspace}/AGENTS.override.md (domain)\n files.push(join(config.dir, config.rootFileName));\n for (const ws of Object.keys(manifest.workspaces ?? {})) {\n files.push(join(ws, config.domainFileName));\n }\n }\n } else if (toolId === 'gemini') {\n const config = TOOL_OUTPUT_MAP['gemini'];\n if (!isMonorepo) {\n // 비모노: .gemini/GEMINI.md\n files.push(join(config.dir, config.rootFileName));\n } else {\n // 모노: .gemini/GEMINI.md (global) + {workspace}/GEMINI.md (domain)\n files.push(join(config.dir, config.rootFileName));\n for (const ws of Object.keys(manifest.workspaces ?? {})) {\n files.push(join(ws, config.domainFileName));\n }\n }\n }\n }\n\n // 중복 제거 (codex 비모노에서 rootFileName === domainFileName인 경우 대비)\n return [...new Set(files)];\n};\n","import { join } from 'node:path';\nimport { COMPILER_DATA_DIR } from '@/core/index.js';\n\nexport const resolveCompilerDataDir = (): string => COMPILER_DATA_DIR;\n\nexport const resolveSkillsDir = (): string => join(COMPILER_DATA_DIR, 'skills');\n\nexport const resolveSubagentsDir = (): string => join(COMPILER_DATA_DIR, 'subagents');\n\nexport const resolvePacksDir = (): string => join(COMPILER_DATA_DIR, 'packs');\n\nexport const resolveReferenceSkillsDir = (): string => join(resolveSkillsDir(), 'reference-skills');\n\nexport const resolveTaskSkillsDir = (): string => join(resolveSkillsDir(), 'task-skills');\n\nexport const resolveSkillCatalogPath = (): string => join(resolveSkillsDir(), 'skill-registry.json');\n\n// project-only 설치 기준 디렉토리\nexport const resolveBasePath = (): string => process.cwd();\n\nexport const resolveUserBasePath = (): string => {\n const userBasePath = process.env.AI_OPS_HOME ?? process.env.HOME;\n if (!userBasePath) {\n throw new Error('AI_OPS_HOME or HOME is required for global asset commands');\n }\n return userBasePath;\n};\n","import * as p from '@clack/prompts';\nimport { ZodError } from 'zod';\n\nexport const formatProjectLayerCommandError = (error: unknown): string => {\n if (error instanceof ZodError) {\n return error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : 'manifest';\n return `${path}: ${issue.message}`;\n })\n .join('; ');\n }\n\n return error instanceof Error ? error.message : 'unknown error';\n};\n\nexport const reportInvalidProjectLayerManifest = (params: { error: unknown; outro: string }): void => {\n const reason = formatProjectLayerCommandError(params.error);\n p.log.error(`[invalid-manifest] .ai-ops/manifest.json 파싱 실패: ${reason}`);\n process.exitCode = 1;\n p.outro(params.outro);\n};\n\nexport const reportProjectLayerApplyError = (params: { error: unknown; outro: string }): void => {\n const reason = formatProjectLayerCommandError(params.error);\n p.log.error(`[project-layer-apply] project operating layer 적용 실패: ${reason}`);\n process.exitCode = 1;\n p.outro(params.outro);\n};\n","import * as p from '@clack/prompts';\nimport {\n diffProjectLayer,\n readProjectLayerManifest,\n updateProjectLayer,\n} from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\nimport { reportInvalidProjectLayerManifest, reportProjectLayerApplyError } from './project-layer-errors.js';\n\nexport const updateCommand = async (opts: { force: boolean }): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops update');\n\n let manifest: ReturnType<typeof readProjectLayerManifest>;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch (error) {\n reportInvalidProjectLayerManifest({ error, outro: 'ai-ops update 실패' });\n return;\n }\n\n if (!manifest) {\n p.log.error('.ai-ops/manifest.json이 없습니다. 먼저 ai-ops init을 실행하세요.');\n process.exit(1);\n }\n\n const diffReport = diffProjectLayer(basePath);\n if (diffReport.issues.length === 0 && !opts.force) {\n p.log.info('변경 사항이 없습니다.');\n p.outro('ai-ops update 완료');\n return;\n }\n\n let result: ReturnType<typeof updateProjectLayer>;\n try {\n result = updateProjectLayer({ basePath, manifest });\n } catch (error) {\n reportProjectLayerApplyError({ error, outro: 'ai-ops update 실패' });\n return;\n }\n\n p.log.success(`managed 파일 갱신: ${result.manifest.managed_files.length}개`);\n if (result.createdProjectFiles.length > 0) {\n p.log.info(`누락된 project-owned 파일 복구:\\n${result.createdProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.refreshedProjectFiles.length > 0) {\n p.log.info(`unmodified project-owned 파일 갱신:\\n${result.refreshedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preservedProjectFiles.length > 0) {\n p.log.info(`project-owned 파일 보존:\\n${result.preservedProjectFiles.map((file) => ` ${file}`).join('\\n')}`);\n }\n\n p.outro('ai-ops update 완료');\n};\n","import * as p from '@clack/prompts';\nimport { diffProjectLayer } from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\n\nexport const diffCommand = async (): Promise<void> => {\n p.intro('ai-ops diff');\n\n const report = diffProjectLayer(resolveBasePath());\n if (report.issues.length === 0) {\n p.log.success('변경 사항 없음. 최신 상태입니다.');\n p.outro('ai-ops diff 완료');\n return;\n }\n\n for (const item of report.issues) {\n const line = `[${item.code}] ${item.message}`;\n if (item.level === 'error') {\n p.log.error(line);\n } else {\n p.log.warn(line);\n }\n }\n\n if (report.issues.some((item) => item.level === 'error')) {\n process.exitCode = 1;\n }\n\n p.outro('ai-ops diff 완료');\n};\n","import * as p from '@clack/prompts';\nimport { auditProjectLayer } from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\n\nexport const auditCommand = async (): Promise<void> => {\n p.intro('ai-ops audit');\n\n const report = auditProjectLayer(resolveBasePath());\n if (report.issues.length === 0) {\n p.log.success('audit 통과. manifest, context-layer, frontmatter, docs-status가 일치합니다.');\n p.outro('ai-ops audit 완료');\n return;\n }\n\n for (const item of report.issues) {\n const line = `[${item.code}] ${item.message}`;\n if (item.level === 'error') {\n p.log.error(line);\n } else {\n p.log.warn(line);\n }\n }\n\n if (report.issues.some((item) => item.level === 'error')) {\n process.exitCode = 1;\n }\n\n p.outro('ai-ops audit 완료');\n};\n","import * as p from '@clack/prompts';\nimport { readProjectLayerManifest, uninstallProjectLayer } from '@/core/index.js';\nimport { resolveBasePath } from '../lib/paths.js';\nimport { reportInvalidProjectLayerManifest, reportProjectLayerApplyError } from './project-layer-errors.js';\n\ntype UninstallCommandOptions = {\n yes?: boolean;\n};\n\nexport const uninstallCommand = async (opts: UninstallCommandOptions = {}): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops uninstall');\n\n let manifest: ReturnType<typeof readProjectLayerManifest>;\n try {\n manifest = readProjectLayerManifest(basePath);\n } catch (error) {\n reportInvalidProjectLayerManifest({ error, outro: 'ai-ops uninstall 실패' });\n return;\n }\n\n if (!manifest) {\n p.log.error('.ai-ops/manifest.json이 없습니다. project operating layer가 설치되어 있지 않습니다.');\n process.exitCode = 1;\n p.outro('ai-ops uninstall 실패');\n return;\n }\n\n const targetFiles = [\n ...manifest.managed_files.map((file) => file.path),\n ...manifest.project_files.map((file) => file.path),\n '.ai-ops/context-layer.json',\n '.ai-ops/manifest.json',\n ];\n\n p.log.info(`처리 대상 (${targetFiles.length}개):\\n${targetFiles.map((file) => ` ${file}`).join('\\n')}`);\n\n if (!opts.yes) {\n const confirmed = await p.confirm({\n message: 'project operating layer를 제거하시겠습니까?',\n initialValue: false,\n });\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('취소됨');\n process.exit(0);\n }\n }\n\n let result: ReturnType<typeof uninstallProjectLayer>;\n try {\n result = uninstallProjectLayer(basePath, manifest);\n } catch (error) {\n reportProjectLayerApplyError({ error, outro: 'ai-ops uninstall 실패' });\n return;\n }\n\n if (result.deleted.length > 0) {\n p.log.success(`삭제 완료:\\n${result.deleted.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.cleaned.length > 0) {\n p.log.success(`managed section 제거, 사용자 내용 보존:\\n${result.cleaned.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`수정되었거나 기존에 있던 project-owned 파일 보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.notFound.length > 0) {\n p.log.info(`이미 없음:\\n${result.notFound.map((file) => ` ${file}`).join('\\n')}`);\n }\n\n p.outro('ai-ops uninstall 완료');\n};\n","import * as p from '@clack/prompts';\nimport { rmSync } from 'node:fs';\nimport type { InstalledSkill, Skill, ToolId } from '@/core/index.js';\nimport {\n loadAllSkills,\n buildSkillInstallPlan,\n getCliVersion,\n readSkillRegistry,\n resolveSkillRegistryPath,\n writeSkillRegistry,\n resolveCanonicalSkillId,\n} from '@/core/index.js';\nimport { resolveSkillsDir, resolveUserBasePath } from '../lib/paths.js';\nimport {\n findInstalledSkill,\n mergeSkillTools,\n removeInstalledSkill,\n resolveRequestedTools,\n upsertInstalledSkill,\n} from '../lib/skill-state.js';\nimport { installSkillPackages, removeDirectories } from '../lib/skill-install.js';\n\ntype SkillCommandOptions = {\n tool?: string[];\n};\n\nconst loadCompilerInputs = (): {\n allSkills: ReturnType<typeof loadAllSkills>;\n cliVersion: string;\n} => {\n return {\n allSkills: loadAllSkills(resolveSkillsDir()),\n cliVersion: getCliVersion(),\n };\n};\n\nconst resolveSkillById = (skills: readonly Skill[], skillId: string): Skill => {\n const canonicalSkillId = resolveCanonicalSkillId(skillId);\n const skill = skills.find((candidate) => candidate.id === canonicalSkillId);\n if (!skill) {\n throw new Error(`Unknown skill: ${skillId}`);\n }\n return skill;\n};\n\nconst writeUserSkillState = (params: {\n basePath: string;\n cliVersion: string;\n nextSkill?: InstalledSkill;\n removeSkillId?: string;\n}): void => {\n const registryPath = resolveSkillRegistryPath(params.basePath);\n const previous = readSkillRegistry(registryPath);\n const skills = params.removeSkillId\n ? removeInstalledSkill(previous?.skills ?? [], params.removeSkillId)\n : params.nextSkill\n ? upsertInstalledSkill(previous?.skills ?? [], params.nextSkill)\n : (previous?.skills ?? []);\n\n if (skills.length === 0) {\n rmSync(registryPath, { force: true });\n return;\n }\n\n writeSkillRegistry(registryPath, {\n skills,\n cliVersion: params.cliVersion,\n generatedAt: new Date().toISOString(),\n });\n};\n\nconst readInstalledSkills = (basePath: string): InstalledSkill[] => {\n return (readSkillRegistry(resolveSkillRegistryPath(basePath))?.skills ?? []).map((installedSkill) => ({\n ...installedSkill,\n id: resolveCanonicalSkillId(installedSkill.id),\n }));\n};\n\nconst installSkill = (params: {\n skill: Skill;\n requestedTools: readonly ToolId[];\n basePath: string;\n cliVersion: string;\n}): InstalledSkill => {\n const installedSkills = readInstalledSkills(params.basePath);\n const existingInstalledSkill = findInstalledSkill(installedSkills, params.skill.id);\n const nextRequestedTools = mergeSkillTools({\n existing: existingInstalledSkill?.tools,\n requested: params.requestedTools,\n });\n const { packages, installedSkill } = buildSkillInstallPlan({\n skill: params.skill,\n requestedTools: nextRequestedTools,\n });\n installSkillPackages(params.basePath, packages);\n\n writeUserSkillState({\n basePath: params.basePath,\n cliVersion: params.cliVersion,\n nextSkill: installedSkill,\n });\n\n return installedSkill;\n};\n\nexport const skillListCommand = async (): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n\n p.intro('ai-ops skill list');\n const sections = [\n { kind: 'reference' as const, title: 'reference skills' },\n { kind: 'task' as const, title: 'task skills' },\n ]\n .map(({ kind, title }) => {\n const lines = allSkills\n .filter((skill) => skill.kind === kind)\n .map((skill) => {\n const installed = findInstalledSkill(installedSkills, skill.id);\n const suffix = installed ? `installed for ${installed.tools.join(', ')}` : 'not installed';\n return `- ${skill.id} - ${suffix}`;\n });\n\n if (lines.length === 0) {\n return null;\n }\n\n return `${title}\\n${lines.join('\\n')}`;\n })\n .filter((section): section is string => section !== null);\n\n p.log.info(sections.join('\\n\\n'));\n p.outro('ai-ops skill list 완료');\n};\n\nexport const skillInstallCommand = async (skillId: string, opts: SkillCommandOptions): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills, cliVersion } = loadCompilerInputs();\n const skill = resolveSkillById(allSkills, skillId);\n const requestedTools = resolveRequestedTools({ requested: opts.tool, supported: skill.supported_tools });\n\n p.intro(`ai-ops skill install ${skillId}`);\n const installedSkill = installSkill({\n skill,\n requestedTools,\n basePath,\n cliVersion,\n });\n\n p.log.success(`설치 완료: ${installedSkill.id} (${installedSkill.installed_paths.join(', ')})`);\n p.outro('ai-ops skill install 완료');\n};\n\nexport const skillDiffCommand = async (skillId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n const targets = skillId ? installedSkills.filter((skill) => skill.id === skillId) : installedSkills;\n\n p.intro('ai-ops skill diff');\n\n if (targets.length === 0) {\n p.log.warn('비교할 설치된 skill이 없습니다.');\n p.outro('ai-ops skill diff 완료');\n return;\n }\n\n const lines = targets.map((installedSkill) => {\n const skill = resolveSkillById(allSkills, installedSkill.id);\n const { installedSkill: next } = buildSkillInstallPlan({\n skill,\n requestedTools: installedSkill.tools,\n });\n const changed = next.sourceHash !== installedSkill.sourceHash;\n return `- ${installedSkill.id}: ${changed ? 'changed' : 'up-to-date'} (${installedSkill.sourceHash} -> ${next.sourceHash})`;\n });\n\n p.log.info(lines.join('\\n'));\n p.outro('ai-ops skill diff 완료');\n};\n\nexport const skillUpdateCommand = async (skillId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSkills, cliVersion } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n const targets = skillId ? installedSkills.filter((skill) => skill.id === skillId) : installedSkills;\n\n p.intro('ai-ops skill update');\n\n if (targets.length === 0) {\n p.log.warn('갱신할 설치된 skill이 없습니다.');\n p.outro('ai-ops skill update 완료');\n return;\n }\n\n const nextInstalledSkills = targets.map((installedSkill) => {\n const skill = resolveSkillById(allSkills, installedSkill.id);\n const { packages, installedSkill: next } = buildSkillInstallPlan({\n skill,\n requestedTools: installedSkill.tools,\n });\n installSkillPackages(basePath, packages);\n return next;\n });\n\n const registryPath = resolveSkillRegistryPath(basePath);\n const previous = readSkillRegistry(registryPath);\n const nextSkillIds = new Set(nextInstalledSkills.map((skill) => skill.id));\n const untouched = (previous?.skills ?? []).filter(\n (installedSkill) => !nextSkillIds.has(resolveCanonicalSkillId(installedSkill.id)),\n );\n writeSkillRegistry(registryPath, {\n skills: [...untouched, ...nextInstalledSkills],\n cliVersion,\n generatedAt: new Date().toISOString(),\n });\n\n p.log.success(`갱신 완료: ${nextInstalledSkills.map((skill) => skill.id).join(', ')}`);\n p.outro('ai-ops skill update 완료');\n};\n\nexport const skillUninstallCommand = async (skillId: string): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { cliVersion } = loadCompilerInputs();\n const installedSkills = readInstalledSkills(basePath);\n const installedSkill = findInstalledSkill(installedSkills, skillId);\n\n p.intro(`ai-ops skill uninstall ${skillId}`);\n\n if (!installedSkill) {\n p.log.warn('설치된 skill을 찾지 못했습니다.');\n p.outro('ai-ops skill uninstall 완료');\n return;\n }\n\n const removed = removeDirectories(basePath, installedSkill.installed_paths);\n\n writeUserSkillState({\n basePath,\n cliVersion,\n removeSkillId: skillId,\n });\n\n p.log.success(`제거 완료: ${removed.join(', ')}`);\n p.outro('ai-ops skill uninstall 완료');\n};\n","import { resolveCanonicalSkillId, SKILL_TOOL } from '@/core/index.js';\nimport type { InstalledSkill, ToolId } from '@/core/index.js';\n\nexport const resolveRequestedTools = (params: {\n requested?: readonly string[];\n supported: readonly string[];\n}): ToolId[] => {\n if (params.requested === undefined || params.requested.length === 0) {\n return [...params.supported] as ToolId[];\n }\n\n const supportedSet = new Set(params.supported);\n const invalid = params.requested.filter((tool) => !supportedSet.has(tool));\n if (invalid.length > 0) {\n throw new Error(`Unsupported tools requested: ${invalid.join(', ')}`);\n }\n\n return [...params.requested] as ToolId[];\n};\n\nconst TOOL_ORDER = [SKILL_TOOL.CLAUDE_CODE, SKILL_TOOL.CODEX, SKILL_TOOL.GEMINI] as const;\n\nexport const mergeSkillTools = (params: { existing?: readonly string[]; requested: readonly ToolId[] }): ToolId[] => {\n const merged = new Set([...(params.existing ?? []), ...params.requested]);\n return TOOL_ORDER.filter((tool) => merged.has(tool));\n};\n\nexport const subtractSkillTools = (params: {\n requested: readonly ToolId[];\n installed?: readonly string[];\n}): ToolId[] => {\n const installed = new Set(params.installed ?? []);\n return params.requested.filter((tool) => !installed.has(tool));\n};\n\nexport const upsertInstalledSkill = (\n installedSkills: readonly InstalledSkill[],\n nextSkill: InstalledSkill,\n): InstalledSkill[] => {\n const nextSkillId = resolveCanonicalSkillId(nextSkill.id);\n const remaining = installedSkills.filter((skill) => resolveCanonicalSkillId(skill.id) !== nextSkillId);\n return [...remaining, nextSkill];\n};\n\nexport const removeInstalledSkill = (installedSkills: readonly InstalledSkill[], skillId: string): InstalledSkill[] => {\n const targetSkillId = resolveCanonicalSkillId(skillId);\n return installedSkills.filter((skill) => resolveCanonicalSkillId(skill.id) !== targetSkillId);\n};\n\nexport const findInstalledSkill = (\n installedSkills: readonly InstalledSkill[],\n skillId: string,\n): InstalledSkill | undefined => {\n const targetSkillId = resolveCanonicalSkillId(skillId);\n return installedSkills.find((skill) => resolveCanonicalSkillId(skill.id) === targetSkillId);\n};\n","import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { SkillPackage } from '@/core/index.js';\n\nexport const installSkillPackages = (basePath: string, packages: readonly SkillPackage[]): string[] => {\n const writtenRoots: string[] = [];\n\n for (const skillPackage of packages) {\n const absRoot = resolve(basePath, skillPackage.rootDir);\n if (existsSync(absRoot)) {\n rmSync(absRoot, { recursive: true, force: true });\n }\n\n for (const file of skillPackage.files) {\n const absPath = resolve(basePath, file.relativePath);\n mkdirSync(dirname(absPath), { recursive: true });\n writeFileSync(absPath, file.content + '\\n', 'utf-8');\n }\n\n writtenRoots.push(skillPackage.rootDir);\n }\n\n return writtenRoots;\n};\n\nexport const removeDirectories = (basePath: string, relativeDirs: readonly string[]): string[] => {\n const removed: string[] = [];\n\n for (const relativeDir of relativeDirs) {\n const absPath = resolve(basePath, relativeDir);\n if (!existsSync(absPath)) continue;\n rmSync(absPath, { recursive: true, force: true });\n removed.push(relativeDir);\n }\n\n return removed;\n};\n","import * as p from '@clack/prompts';\nimport { existsSync, rmSync } from 'node:fs';\nimport type { InstalledSubagent, Subagent, ToolId } from '@/core/index.js';\nimport {\n buildSubagentInstallPlan,\n getCliVersion,\n loadAllSubagents,\n readSubagentManifest,\n resolveSubagentManifestPath,\n writeSubagentManifest,\n} from '@/core/index.js';\nimport { resolveSubagentsDir, resolveUserBasePath } from '../lib/paths.js';\nimport { installSubagentPackages, removeSubagentFiles } from '../lib/subagent-install.js';\nimport {\n findInstalledSubagent,\n mergeSubagentTools,\n removeInstalledSubagent,\n resolveInstalledSubagentPaths,\n resolveRequestedSubagentTools,\n upsertInstalledSubagent,\n} from '../lib/subagent-state.js';\n\ntype SubagentCommandOptions = {\n tool?: string[];\n};\n\nconst loadCompilerInputs = (): {\n allSubagents: ReturnType<typeof loadAllSubagents>;\n cliVersion: string;\n} => {\n return {\n allSubagents: loadAllSubagents(resolveSubagentsDir()),\n cliVersion: getCliVersion(),\n };\n};\n\nconst resolveSubagentById = (subagents: readonly Subagent[], subagentId: string): Subagent => {\n const subagent = subagents.find((candidate) => candidate.id === subagentId);\n if (!subagent) {\n throw new Error(`Unknown subagent: ${subagentId}`);\n }\n return subagent;\n};\n\nconst writeUserSubagentState = (params: {\n basePath: string;\n cliVersion: string;\n nextSubagent?: InstalledSubagent;\n removeSubagentId?: string;\n}): void => {\n const manifestPath = resolveSubagentManifestPath(params.basePath);\n const previous = readSubagentManifest(manifestPath);\n const subagents = params.removeSubagentId\n ? removeInstalledSubagent(previous?.subagents ?? [], params.removeSubagentId)\n : params.nextSubagent\n ? upsertInstalledSubagent(previous?.subagents ?? [], params.nextSubagent)\n : (previous?.subagents ?? []);\n\n if (subagents.length === 0) {\n rmSync(manifestPath, { force: true });\n return;\n }\n\n writeSubagentManifest(manifestPath, {\n subagents,\n cliVersion: params.cliVersion,\n generatedAt: new Date().toISOString(),\n });\n};\n\nconst readInstalledSubagents = (basePath: string): InstalledSubagent[] =>\n readSubagentManifest(resolveSubagentManifestPath(basePath))?.subagents ?? [];\n\nconst warnMissingSkills = (requiredSkills: ReturnType<typeof buildSubagentInstallPlan>['requiredSkills']): void => {\n const missing = requiredSkills.filter((skill) => !existsSync(skill.path));\n if (missing.length === 0) {\n return;\n }\n\n p.log.warn(\n [\n '필요한 skill이 아직 설치되지 않았습니다. subagent 설치는 계속 진행합니다.',\n ...missing.map((skill) => `- ${skill.tool}:${skill.skillName} (${skill.path})`),\n ].join('\\n'),\n );\n};\n\nconst installSubagent = (params: {\n subagent: Subagent;\n requestedTools: readonly ToolId[];\n basePath: string;\n cliVersion: string;\n}): InstalledSubagent => {\n const installedSubagents = readInstalledSubagents(params.basePath);\n const existingInstalledSubagent = findInstalledSubagent(installedSubagents, params.subagent.id);\n const nextRequestedTools = mergeSubagentTools({\n existing: existingInstalledSubagent?.tools,\n requested: params.requestedTools,\n });\n const { packages, installedSubagent, requiredSkills } = buildSubagentInstallPlan({\n subagent: params.subagent,\n requestedTools: nextRequestedTools,\n userBasePath: params.basePath,\n });\n installSubagentPackages(params.basePath, packages);\n warnMissingSkills(requiredSkills);\n\n writeUserSubagentState({\n basePath: params.basePath,\n cliVersion: params.cliVersion,\n nextSubagent: installedSubagent,\n });\n\n return installedSubagent;\n};\n\nexport const subagentListCommand = async (): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents } = loadCompilerInputs();\n const installedSubagents = readInstalledSubagents(basePath);\n\n p.intro('ai-ops subagent list');\n const lines = allSubagents.map((subagent) => {\n const installed = findInstalledSubagent(installedSubagents, subagent.id);\n const suffix = installed ? `installed for ${installed.tools.join(', ')}` : 'not installed';\n return `- ${subagent.id} - ${suffix}`;\n });\n\n p.log.info(lines.join('\\n'));\n p.outro('ai-ops subagent list 완료');\n};\n\nexport const subagentInstallCommand = async (subagentId: string, opts: SubagentCommandOptions): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents, cliVersion } = loadCompilerInputs();\n const subagent = resolveSubagentById(allSubagents, subagentId);\n const requestedTools = resolveRequestedSubagentTools({ requested: opts.tool, supported: subagent.supported_tools });\n\n p.intro(`ai-ops subagent install ${subagentId}`);\n const installedSubagent = installSubagent({\n subagent,\n requestedTools,\n basePath,\n cliVersion,\n });\n\n p.log.success(`설치 완료: ${installedSubagent.id} (${installedSubagent.installed_paths.join(', ')})`);\n p.outro('ai-ops subagent install 완료');\n};\n\nexport const subagentDiffCommand = async (subagentId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents } = loadCompilerInputs();\n const installedSubagents = readInstalledSubagents(basePath);\n const targets = subagentId\n ? installedSubagents.filter((subagent) => subagent.id === subagentId)\n : installedSubagents;\n\n p.intro('ai-ops subagent diff');\n\n if (targets.length === 0) {\n p.log.warn('비교할 설치된 subagent가 없습니다.');\n p.outro('ai-ops subagent diff 완료');\n return;\n }\n\n const lines = targets.map((installedSubagent) => {\n const subagent = resolveSubagentById(allSubagents, installedSubagent.id);\n const { installedSubagent: next } = buildSubagentInstallPlan({\n subagent,\n requestedTools: installedSubagent.tools,\n userBasePath: basePath,\n });\n const changed = next.sourceHash !== installedSubagent.sourceHash;\n return `- ${installedSubagent.id}: ${changed ? 'changed' : 'up-to-date'} (${installedSubagent.sourceHash} -> ${next.sourceHash})`;\n });\n\n p.log.info(lines.join('\\n'));\n p.outro('ai-ops subagent diff 완료');\n};\n\nexport const subagentUpdateCommand = async (subagentId: string | undefined): Promise<void> => {\n const basePath = resolveUserBasePath();\n const { allSubagents, cliVersion } = loadCompilerInputs();\n const installedSubagents = readInstalledSubagents(basePath);\n const targets = subagentId\n ? installedSubagents.filter((subagent) => subagent.id === subagentId)\n : installedSubagents;\n\n p.intro('ai-ops subagent update');\n\n if (targets.length === 0) {\n p.log.warn('갱신할 설치된 subagent가 없습니다.');\n p.outro('ai-ops subagent update 완료');\n return;\n }\n\n const nextInstalledSubagents = targets.map((installedSubagent) => {\n const subagent = resolveSubagentById(allSubagents, installedSubagent.id);\n const { packages, installedSubagent: next, requiredSkills } = buildSubagentInstallPlan({\n subagent,\n requestedTools: installedSubagent.tools,\n userBasePath: basePath,\n });\n installSubagentPackages(basePath, packages);\n warnMissingSkills(requiredSkills);\n return next;\n });\n\n const manifestPath = resolveSubagentManifestPath(basePath);\n const previous = readSubagentManifest(manifestPath);\n const nextSubagentIds = new Set(nextInstalledSubagents.map((subagent) => subagent.id));\n const untouched = (previous?.subagents ?? []).filter((subagent) => !nextSubagentIds.has(subagent.id));\n writeSubagentManifest(manifestPath, {\n subagents: [...untouched, ...nextInstalledSubagents],\n cliVersion,\n generatedAt: new Date().toISOString(),\n });\n\n p.log.success(`갱신 완료: ${nextInstalledSubagents.map((subagent) => subagent.id).join(', ')}`);\n p.outro('ai-ops subagent update 완료');\n};\n\nexport const subagentUninstallCommand = async (subagentId: string): Promise<void> => {\n const basePath = resolveUserBasePath();\n const cliVersion = getCliVersion();\n const installedSubagents = readInstalledSubagents(basePath);\n const installedSubagent = findInstalledSubagent(installedSubagents, subagentId);\n\n p.intro(`ai-ops subagent uninstall ${subagentId}`);\n\n if (!installedSubagent) {\n p.log.warn('설치된 subagent를 찾지 못했습니다.');\n p.outro('ai-ops subagent uninstall 완료');\n return;\n }\n\n const removed = removeSubagentFiles(basePath, resolveInstalledSubagentPaths(installedSubagent));\n\n writeUserSubagentState({\n basePath,\n cliVersion,\n removeSubagentId: subagentId,\n });\n\n p.log.success(`제거 완료: ${removed.join(', ')}`);\n p.outro('ai-ops subagent uninstall 완료');\n};\n","import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, relative, resolve } from 'node:path';\nimport type { SubagentPackage } from '@/core/index.js';\n\nconst resolveInsideBasePath = (basePath: string, relativePath: string): string => {\n const absBasePath = resolve(basePath);\n const absPath = resolve(absBasePath, relativePath);\n const fromBase = relative(absBasePath, absPath);\n\n if (fromBase.length === 0 || fromBase.startsWith('..') || isAbsolute(fromBase)) {\n throw new Error(`Subagent path escapes AI_OPS_HOME: ${relativePath}`);\n }\n\n return absPath;\n};\n\nexport const installSubagentPackages = (basePath: string, packages: readonly SubagentPackage[]): string[] => {\n const written: string[] = [];\n\n for (const subagentPackage of packages) {\n for (const file of subagentPackage.files) {\n const absPath = resolveInsideBasePath(basePath, file.relativePath);\n if (existsSync(absPath)) {\n rmSync(absPath, { recursive: true, force: true });\n }\n mkdirSync(dirname(absPath), { recursive: true });\n writeFileSync(absPath, file.content.trimEnd() + '\\n', 'utf-8');\n written.push(file.relativePath);\n }\n }\n\n return written;\n};\n\nexport const removeSubagentFiles = (basePath: string, relativePaths: readonly string[]): string[] => {\n const removed: string[] = [];\n\n for (const relativePath of relativePaths) {\n const absPath = resolveInsideBasePath(basePath, relativePath);\n if (!existsSync(absPath)) continue;\n rmSync(absPath, { recursive: true, force: true });\n removed.push(relativePath);\n }\n\n return removed;\n};\n","import { buildSubagentRelativePath, SKILL_TOOL } from '@/core/index.js';\nimport type { InstalledSubagent, ToolId } from '@/core/index.js';\n\nexport const resolveRequestedSubagentTools = (params: {\n requested?: readonly string[];\n supported: readonly string[];\n}): ToolId[] => {\n if (params.requested === undefined || params.requested.length === 0) {\n return [...params.supported] as ToolId[];\n }\n\n const supportedSet = new Set(params.supported);\n const invalid = params.requested.filter((tool) => !supportedSet.has(tool));\n if (invalid.length > 0) {\n throw new Error(`Unsupported tools requested: ${invalid.join(', ')}`);\n }\n\n return [...params.requested] as ToolId[];\n};\n\nconst TOOL_ORDER = [SKILL_TOOL.CLAUDE_CODE, SKILL_TOOL.CODEX, SKILL_TOOL.GEMINI] as const;\n\nexport const mergeSubagentTools = (params: { existing?: readonly string[]; requested: readonly ToolId[] }): ToolId[] => {\n const merged = new Set([...(params.existing ?? []), ...params.requested]);\n return TOOL_ORDER.filter((tool) => merged.has(tool));\n};\n\nexport const upsertInstalledSubagent = (\n installedSubagents: readonly InstalledSubagent[],\n nextSubagent: InstalledSubagent,\n): InstalledSubagent[] => {\n const remaining = installedSubagents.filter((subagent) => subagent.id !== nextSubagent.id);\n return [...remaining, nextSubagent];\n};\n\nexport const removeInstalledSubagent = (\n installedSubagents: readonly InstalledSubagent[],\n subagentId: string,\n): InstalledSubagent[] => installedSubagents.filter((subagent) => subagent.id !== subagentId);\n\nexport const findInstalledSubagent = (\n installedSubagents: readonly InstalledSubagent[],\n subagentId: string,\n): InstalledSubagent | undefined => installedSubagents.find((subagent) => subagent.id === subagentId);\n\nexport const resolveInstalledSubagentPaths = (installedSubagent: InstalledSubagent): string[] =>\n installedSubagent.tools.map((tool) => buildSubagentRelativePath(installedSubagent.id, tool));\n","import * as p from '@clack/prompts';\nimport {\n diffProjectLayerPack,\n installProjectLayerPack,\n loadAllPacks,\n readProjectLayerManifest,\n uninstallProjectLayerPack,\n updateProjectLayerPack,\n} from '@/core/index.js';\nimport type { ProjectLayerManifest } from '@/core/index.js';\nimport { resolveBasePath, resolvePacksDir } from '../lib/paths.js';\n\nconst readManifestForPackCommand = (basePath: string): ProjectLayerManifest | null => {\n try {\n return readProjectLayerManifest(basePath);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'unknown error';\n p.log.error(`.ai-ops/manifest.json 파싱 실패: ${message}`);\n process.exitCode = 1;\n return null;\n }\n};\n\nconst reportPackError = (error: unknown): void => {\n const message = error instanceof Error ? error.message : 'unknown error';\n p.log.error(message);\n process.exitCode = 1;\n};\n\nexport const packListCommand = async (): Promise<void> => {\n const basePath = resolveBasePath();\n const packs = loadAllPacks(resolvePacksDir());\n const manifest = readManifestForPackCommand(basePath);\n const installedPackIds = new Set(manifest?.packs.map((pack) => pack.id) ?? []);\n\n p.intro('ai-ops pack list');\n p.log.info(\n packs\n .map((pack) => {\n const suffix = installedPackIds.has(pack.id) ? 'installed' : 'not installed';\n return `- ${pack.id} - ${suffix}`;\n })\n .join('\\n'),\n );\n p.outro('ai-ops pack list 완료');\n};\n\nexport const packInstallCommand = async (packId: string): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro(`ai-ops pack install ${packId}`);\n try {\n const result = installProjectLayerPack({ basePath, packId, packsDir: resolvePacksDir() });\n p.log.success(`pack 설치 완료: ${packId}`);\n if (result.written.length > 0) {\n p.log.info(`생성:\\n${result.written.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.refreshed.length > 0) {\n p.log.info(`갱신:\\n${result.refreshed.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack install 완료');\n};\n\nexport const packDiffCommand = async (packId: string | undefined): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops pack diff');\n try {\n const report = diffProjectLayerPack({ basePath, packId, packsDir: resolvePacksDir() });\n if (report.issues.length === 0) {\n p.log.success('변경 사항 없음. pack이 최신 상태입니다.');\n p.outro('ai-ops pack diff 완료');\n return;\n }\n\n for (const item of report.issues) {\n const line = `[${item.code}] ${item.message}`;\n if (item.level === 'error') {\n p.log.error(line);\n } else {\n p.log.warn(line);\n }\n }\n\n if (report.issues.some((item) => item.level === 'error')) {\n process.exitCode = 1;\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack diff 완료');\n};\n\nexport const packUpdateCommand = async (packId: string | undefined): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro('ai-ops pack update');\n try {\n const manifest = readManifestForPackCommand(basePath);\n if (!manifest) {\n p.log.error('.ai-ops/manifest.json이 없습니다. 먼저 ai-ops init을 실행하세요.');\n process.exitCode = 1;\n p.outro('ai-ops pack update 완료');\n return;\n }\n\n const targetPackIds = packId ? [packId] : manifest.packs.map((pack) => pack.id);\n if (targetPackIds.length === 0) {\n p.log.warn('갱신할 설치된 pack이 없습니다.');\n p.outro('ai-ops pack update 완료');\n return;\n }\n\n for (const targetPackId of targetPackIds) {\n const result = updateProjectLayerPack({ basePath, packId: targetPackId, packsDir: resolvePacksDir() });\n p.log.success(`pack 갱신 완료: ${targetPackId}`);\n if (result.refreshed.length > 0) {\n p.log.info(`갱신:\\n${result.refreshed.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack update 완료');\n};\n\nexport const packUninstallCommand = async (packId: string): Promise<void> => {\n const basePath = resolveBasePath();\n\n p.intro(`ai-ops pack uninstall ${packId}`);\n try {\n const result = uninstallProjectLayerPack({ basePath, packId });\n p.log.success(`pack 제거 완료: ${packId}`);\n if (result.deleted.length > 0) {\n p.log.info(`삭제:\\n${result.deleted.map((file) => ` ${file}`).join('\\n')}`);\n }\n if (result.preserved.length > 0) {\n p.log.info(`보존:\\n${result.preserved.map((file) => ` ${file}`).join('\\n')}`);\n }\n } catch (error) {\n reportPackError(error);\n }\n p.outro('ai-ops pack uninstall 완료');\n};\n"],"mappings":"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","names":["p","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","join","parse","join","join","parse","join","join","readFileSync","readdirSync","join","resolve","resolve","readFileSync","join","resolve","normalizeSelectedTools","resolve","readFileSync","dirname","join","mkdirSync","readFileSync","writeFileSync","dirname","join","join","readFileSync","mkdirSync","dirname","writeFileSync","mkdirSync","readFileSync","writeFileSync","dirname","join","join","readFileSync","mkdirSync","dirname","writeFileSync","join","mkdirSync","readFileSync","readdirSync","writeFileSync","dirname","join","resolve","dirname","resolve","fileURLToPath","__dirname","join","dirname","resolve","readFileSync","mkdirSync","writeFileSync","readdirSync","existsSync","mkdirSync","readFileSync","readdirSync","rmSync","writeFileSync","dirname","isAbsolute","join","relative","resolve","RESERVED_DOCUMENT_WARNINGS","join","includesReservedDocumentWarning","readFileSync","readdirSync","resolve","relative","isAbsolute","mkdirSync","dirname","writeFileSync","existsSync","rmSync","removeEmptyDirs","pack","join","join","join","issue","p","p","p","p","p","rmSync","TOOL_ORDER","existsSync","mkdirSync","rmSync","writeFileSync","dirname","resolve","rmSync","p","existsSync","rmSync","existsSync","mkdirSync","rmSync","writeFileSync","dirname","isAbsolute","relative","resolve","TOOL_ORDER","loadCompilerInputs","rmSync","existsSync","p"]}
|