@anvia/cli 1.1.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +48 -0
  2. package/dist/chunk-ERCP4EIZ.js +607 -0
  3. package/dist/chunk-ERCP4EIZ.js.map +1 -0
  4. package/dist/cli.js +287 -33
  5. package/dist/cli.js.map +1 -1
  6. package/dist/index.d.ts +81 -1
  7. package/dist/index.js +27 -3
  8. package/dist/skills/anvia-agent/SKILL.md +59 -0
  9. package/dist/skills/anvia-agent/references/agent-options.md +83 -0
  10. package/dist/skills/anvia-agent/references/providers.md +22 -0
  11. package/dist/skills/anvia-agent/references/teams.md +84 -0
  12. package/dist/skills/anvia-agent/references/tools.md +71 -0
  13. package/dist/skills/anvia-agent/scripts/check-agent.sh +99 -0
  14. package/dist/skills/anvia-channels/SKILL.md +59 -0
  15. package/dist/skills/anvia-channels/references/adapters.md +53 -0
  16. package/dist/skills/anvia-channels/references/channel-agent.md +52 -0
  17. package/dist/skills/anvia-channels/references/delivery.md +53 -0
  18. package/dist/skills/anvia-channels/scripts/check-channels.sh +79 -0
  19. package/dist/skills/anvia-chat/SKILL.md +61 -0
  20. package/dist/skills/anvia-chat/references/react-ui.md +104 -0
  21. package/dist/skills/anvia-chat/references/server-protocol.md +53 -0
  22. package/dist/skills/anvia-chat/references/transports-state.md +71 -0
  23. package/dist/skills/anvia-chat/scripts/check-chat-boundary.sh +70 -0
  24. package/dist/skills/anvia-evals/SKILL.md +51 -0
  25. package/dist/skills/anvia-evals/references/judges.md +61 -0
  26. package/dist/skills/anvia-evals/references/metrics.md +45 -0
  27. package/dist/skills/anvia-evals/references/running.md +62 -0
  28. package/dist/skills/anvia-evals/scripts/check-evals.sh +73 -0
  29. package/dist/skills/anvia-mcp/SKILL.md +49 -0
  30. package/dist/skills/anvia-mcp/references/clients.md +73 -0
  31. package/dist/skills/anvia-mcp/references/safety.md +25 -0
  32. package/dist/skills/anvia-mcp/scripts/check-mcp.sh +73 -0
  33. package/dist/skills/anvia-pipeline/SKILL.md +52 -0
  34. package/dist/skills/anvia-pipeline/references/agents-extract.md +62 -0
  35. package/dist/skills/anvia-pipeline/references/steps-compose.md +63 -0
  36. package/dist/skills/anvia-pipeline/scripts/check-pipeline.sh +69 -0
  37. package/dist/skills/anvia-rag/SKILL.md +50 -0
  38. package/dist/skills/anvia-rag/references/graph-rag.md +115 -0
  39. package/dist/skills/anvia-rag/references/pipeline.md +81 -0
  40. package/dist/skills/anvia-rag/references/rag-tool.md +43 -0
  41. package/dist/skills/anvia-rag/references/stores.md +68 -0
  42. package/dist/skills/anvia-rag/scripts/check-rag.sh +75 -0
  43. package/dist/skills/anvia-studio/SKILL.md +45 -0
  44. package/dist/skills/anvia-studio/references/inspect.md +33 -0
  45. package/dist/skills/anvia-studio/references/observe.md +34 -0
  46. package/dist/skills/anvia-studio/references/serve.md +65 -0
  47. package/dist/skills/anvia-studio/scripts/check-studio.sh +59 -0
  48. package/dist/skills/release-notes/SKILL.md +18 -0
  49. package/dist/skills/release-notes/references/style.md +6 -0
  50. package/dist/skills/release-notes/scripts/draft.sh +22 -0
  51. package/package.json +3 -3
  52. package/dist/chunk-TE2ODJOV.js +0 -135
  53. package/dist/chunk-TE2ODJOV.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry.ts","../src/skills/discovery.ts","../src/skills/write.ts","../src/skills/adapters/agents-doc.ts","../src/skills/adapters/claude.ts","../src/skills/adapters/skill-tree.ts","../src/skills/adapters/cursor-rules.ts","../src/skills/types.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport const registryItemNames = [\n \"chat\",\n \"thread\",\n \"message\",\n \"composer\",\n \"attachment\",\n \"markdown\",\n \"tool-fallback\",\n] as const;\n\nexport type RegistryItemName = (typeof registryItemNames)[number];\n\ntype RegistryFile = {\n content: string;\n path: string;\n target: string;\n type: \"registry:component\";\n};\n\ntype RegistryCss = {\n [rule: string]: RegistryCss | string;\n};\n\nexport type AnviaRegistryItem = {\n $schema: string;\n css?: RegistryCss;\n dependencies: string[];\n description: string;\n files: RegistryFile[];\n name: RegistryItemName;\n title: string;\n type: \"registry:block\" | \"registry:component\";\n};\n\nconst itemFiles: Record<RegistryItemName, readonly string[]> = {\n attachment: [\"attachment.tsx\"],\n chat: [\n \"attachment.tsx\",\n \"markdown.tsx\",\n \"tool-fallback.tsx\",\n \"message.tsx\",\n \"composer.tsx\",\n \"thread.tsx\",\n \"chat.tsx\",\n ],\n composer: [\"attachment.tsx\", \"composer.tsx\"],\n markdown: [\"markdown.tsx\"],\n message: [\"attachment.tsx\", \"markdown.tsx\", \"tool-fallback.tsx\", \"message.tsx\"],\n thread: [\"attachment.tsx\", \"markdown.tsx\", \"tool-fallback.tsx\", \"message.tsx\", \"thread.tsx\"],\n \"tool-fallback\": [\"tool-fallback.tsx\"],\n};\n\nconst revealCss = {\n \"@keyframes anvia-stream-gradient-settle\": {\n to: {\n opacity: \"1\",\n },\n },\n \"@layer components\": {\n '.anvia-markdown [data-state=\"revealing\"]': {\n animation:\n \"anvia-stream-gradient-settle var(--anvia-stream-reveal-duration, 180ms) linear both\",\n opacity: \"var(--anvia-stream-reveal-opacity, 1)\",\n },\n \"@media (prefers-reduced-motion: reduce)\": {\n '.anvia-markdown [data-state=\"revealing\"]': {\n animation: \"none\",\n opacity: \"1\",\n },\n },\n },\n} satisfies RegistryCss;\n\nexport function createRegistryItem(\n name: RegistryItemName,\n options: { packageVersion?: string; registryDirectory?: string } = {},\n): AnviaRegistryItem {\n const packageVersion = options.packageVersion ?? currentPackageVersion();\n const registryDirectory = options.registryDirectory ?? bundledRegistryDirectory();\n\n const files = itemFiles[name].map((filename) => ({\n content: readFileSync(join(registryDirectory, filename), \"utf8\"),\n path: `registry/anvia/${filename}`,\n target: `@components/anvia/${filename}`,\n type: \"registry:component\" as const,\n }));\n\n const item: AnviaRegistryItem = {\n $schema: \"https://ui.shadcn.com/schema/registry-item.json\",\n dependencies: [`@anvia/react-ui@${packageVersion}`],\n description: registryItemDescription(name),\n files,\n name,\n title: `Anvia ${name}`,\n type: files.length === 1 ? \"registry:component\" : \"registry:block\",\n };\n\n if (name === \"chat\" || name === \"markdown\" || name === \"message\" || name === \"thread\") {\n item.css = revealCss;\n }\n\n return item;\n}\n\nexport function initializeProject(\n options: { cwd?: string; force?: boolean; template?: \"next\" | \"vite\" } = {},\n): void {\n const cwd = options.cwd ?? process.cwd();\n\n const args = [\"init\", \"--cwd\", cwd, \"--yes\", \"--no-monorepo\", \"--base\", \"radix\"];\n\n if (options.template !== undefined) {\n args.push(\"--template\", options.template);\n }\n\n if (options.force === true) {\n args.push(\"--force\");\n }\n\n runShadcn(args);\n}\n\nexport function addRegistryItem(\n name: RegistryItemName,\n options: { cwd?: string; overwrite?: boolean } = {},\n): void {\n const cwd = options.cwd ?? process.cwd();\n const temporaryDirectory = mkdtempSync(join(tmpdir(), \"anvia-registry-\"));\n const itemPath = join(temporaryDirectory, `${name}.json`);\n\n try {\n writeFileSync(itemPath, `${JSON.stringify(createRegistryItem(name), null, 2)}\\n`);\n\n const args = [\"add\", itemPath, \"--cwd\", cwd, \"--yes\"];\n\n if (options.overwrite === true) {\n args.push(\"--overwrite\");\n }\n\n runShadcn(args);\n } finally {\n rmSync(temporaryDirectory, { force: true, recursive: true });\n }\n}\n\nexport function isRegistryItemName(value: string): value is RegistryItemName {\n return registryItemNames.includes(value as RegistryItemName);\n}\n\nexport type InstalledFileStatus = \"up-to-date\" | \"modified\" | \"missing\";\n\nexport type InstalledItemFile = {\n filename: string;\n path: string;\n status: InstalledFileStatus;\n};\n\nexport type InstalledItemReport = {\n name: RegistryItemName;\n installed: boolean;\n complete: boolean;\n files: InstalledItemFile[];\n};\n\nexport function inspectInstalledItems(\n options: {\n cwd?: string;\n items?: readonly RegistryItemName[];\n registryDirectory?: string;\n } = {},\n): InstalledItemReport[] {\n const names = options.items ?? registryItemNames;\n const directory = componentsDirectory(options);\n const registry = options.registryDirectory ?? bundledRegistryDirectory();\n\n return names.map((name) => {\n const files = itemFiles[name].map((filename) => {\n const path = join(directory, \"anvia\", filename);\n\n let status: InstalledFileStatus = \"missing\";\n\n if (existsSync(path)) {\n const installed = readFileSync(path, \"utf8\");\n status = installed === registryFileContent(registry, filename) ? \"up-to-date\" : \"modified\";\n }\n\n return { filename, path, status };\n });\n\n return {\n name,\n installed: files.some((file) => file.status !== \"missing\"),\n complete: files.every((file) => file.status !== \"missing\"),\n files,\n };\n });\n}\n\nexport function updateInstalledItems(\n options: {\n cwd?: string;\n items?: readonly RegistryItemName[];\n overwrite?: boolean;\n registryDirectory?: string;\n } = {},\n): { report: InstalledItemReport[]; updated: string[] } {\n const registry = options.registryDirectory ?? bundledRegistryDirectory();\n const report = inspectInstalledItems(options);\n const updated: string[] = [];\n\n if (options.overwrite === true) {\n const actionable = new Map<string, string>();\n\n for (const item of report) {\n if (!item.installed) {\n continue;\n }\n\n for (const file of item.files) {\n if (file.status === \"up-to-date\" || actionable.has(file.path)) {\n continue;\n }\n\n actionable.set(file.path, registryFileContent(registry, file.filename));\n }\n }\n\n for (const [path, content] of actionable) {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, content);\n updated.push(path);\n }\n }\n\n return { report, updated };\n}\n\nexport function closestRegistryItemName(value: string): RegistryItemName | undefined {\n let best: RegistryItemName | undefined;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n for (const name of registryItemNames) {\n const distance = levenshteinDistance(value, name);\n\n if (distance < bestDistance) {\n bestDistance = distance;\n best = name;\n }\n }\n\n return bestDistance <= 2 ? best : undefined;\n}\n\nfunction componentsDirectory(options: { cwd?: string } = {}): string {\n const cwd = options.cwd ?? process.cwd();\n const manifestPath = join(cwd, \"components.json\");\n\n let manifest: { aliases?: { components?: string } };\n\n try {\n manifest = JSON.parse(stripJsonComments(readFileSync(manifestPath, \"utf8\"))) as {\n aliases?: { components?: string };\n };\n } catch {\n throw new Error(`Missing or unreadable components.json in ${cwd}. Run \\`anvia init\\` first.`);\n }\n\n const alias = manifest.aliases?.components ?? \"@/components\";\n\n return resolveAliasDirectory(cwd, alias);\n}\n\nfunction resolveAliasDirectory(cwd: string, alias: string): string {\n for (const configName of [\"tsconfig.json\", \"jsconfig.json\"]) {\n let config: { compilerOptions?: { baseUrl?: string; paths?: Record<string, string[]> } };\n\n try {\n config = JSON.parse(stripJsonComments(readFileSync(join(cwd, configName), \"utf8\"))) as {\n compilerOptions?: { baseUrl?: string; paths?: Record<string, string[]> };\n };\n } catch {\n continue;\n }\n\n const paths = config.compilerOptions?.paths;\n\n if (paths === undefined) {\n continue;\n }\n\n const target = resolveAliasTarget(alias, paths);\n\n if (target === undefined) {\n continue;\n }\n\n return join(cwd, config.compilerOptions?.baseUrl ?? \".\", target);\n }\n\n throw new Error(\n `Cannot resolve the components alias \"${alias}\" from tsconfig.json or jsconfig.json in ${cwd}.`,\n );\n}\n\nfunction resolveAliasTarget(alias: string, paths: Record<string, string[]>): string | undefined {\n for (const [key, targets] of Object.entries(paths)) {\n const target = targets[0];\n\n if (target === undefined) {\n continue;\n }\n\n if (key.endsWith(\"/*\")) {\n const prefix = key.slice(0, -2);\n\n if (alias === prefix) {\n return target.replace(/\\/\\*$/, \"\");\n }\n\n if (alias.startsWith(`${prefix}/`)) {\n return join(target.replace(/\\/\\*$/, \"\"), alias.slice(prefix.length + 1));\n }\n } else if (key === alias) {\n return target;\n }\n }\n\n return undefined;\n}\n\nfunction stripJsonComments(source: string): string {\n let result = \"\";\n let inString = false;\n let escaped = false;\n\n for (let index = 0; index < source.length; index += 1) {\n const character = source[index];\n\n if (inString) {\n result += character;\n\n if (escaped) {\n escaped = false;\n } else if (character === \"\\\\\") {\n escaped = true;\n } else if (character === '\"') {\n inString = false;\n }\n\n continue;\n }\n\n if (character === '\"') {\n inString = true;\n result += character;\n continue;\n }\n\n if (character === \"/\" && source[index + 1] === \"/\") {\n while (index < source.length && source[index] !== \"\\n\") {\n index += 1;\n }\n continue;\n }\n\n result += character;\n }\n\n return result;\n}\n\nfunction registryFileContent(registryDirectory: string, filename: string): string {\n return readFileSync(join(registryDirectory, filename), \"utf8\");\n}\n\nfunction levenshteinDistance(left: string, right: string): number {\n const previous = Array.from({ length: right.length + 1 }, (_, index) => index);\n\n for (let i = 1; i <= left.length; i += 1) {\n let diagonal = previous[0]!;\n previous[0] = i;\n\n for (let j = 1; j <= right.length; j += 1) {\n const above = previous[j]!;\n previous[j] = Math.min(\n above + 1,\n previous[j - 1]! + 1,\n diagonal + (left[i - 1] === right[j - 1] ? 0 : 1),\n );\n diagonal = above;\n }\n }\n\n return previous[right.length]!;\n}\n\nfunction runShadcn(args: string[]): void {\n const require = createRequire(import.meta.url);\n const shadcnEntry = require.resolve(\"shadcn\");\n\n const result = spawnSync(process.execPath, [shadcnEntry, ...args], {\n encoding: \"utf8\",\n stdio: \"inherit\",\n });\n\n if (result.error !== undefined) {\n throw result.error;\n }\n\n if (result.status !== 0) {\n throw new Error(`shadcn ${args[0] ?? \"command\"} failed with exit code ${result.status}.`);\n }\n}\n\nfunction bundledRegistryDirectory(): string {\n return fileURLToPath(new URL(\"./registry/\", import.meta.url));\n}\n\nfunction currentPackageVersion(): string {\n const manifestPath = fileURLToPath(new URL(\"../package.json\", import.meta.url));\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as { version?: unknown };\n\n if (typeof manifest.version !== \"string\") {\n throw new Error(`Missing package version in ${basename(manifestPath)}.`);\n }\n\n return manifest.version;\n}\n\nfunction registryItemDescription(name: RegistryItemName): string {\n if (name === \"chat\") {\n return \"A complete editable Anvia chat interface.\";\n }\n\n return `Editable Anvia ${name} UI.`;\n}\n","import { readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function bundledSkillsDirectory(): string {\n // Resolved at runtime from the bundled dist/*.js output, where\n // copy-skills.mjs places the assets in dist/skills/. Keep this relative to\n // the bundle (./skills/), not to this source file's location.\n return fileURLToPath(new URL(\"./skills/\", import.meta.url));\n}\n\nexport function skillNames(options: { skillsDirectory?: string } = {}): string[] {\n const directory = options.skillsDirectory ?? bundledSkillsDirectory();\n\n return readdirSync(directory, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort();\n}\n\nexport function skillsTargetDirectory(options: { cwd?: string; dir?: string } = {}): string {\n const cwd = options.cwd ?? process.cwd();\n\n return join(cwd, options.dir ?? \"skills\");\n}\n\nexport function collectSkillFiles(root: string): string[] {\n const files: string[] = [];\n\n const visit = (directory: string, prefix: string): void => {\n const entries = readdirSync(directory, { withFileTypes: true }).sort((left, right) =>\n left.name.localeCompare(right.name),\n );\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n visit(join(directory, entry.name), `${prefix}${entry.name}/`);\n } else if (entry.isFile()) {\n files.push(`${prefix}${entry.name}`);\n }\n }\n };\n\n visit(root, \"\");\n\n return files;\n}\n\nexport function skillDescription(skillsDirectory: string, name: string): string {\n const source = readFileSync(join(skillsDirectory, name, \"SKILL.md\"), \"utf8\");\n\n return (/^description:\\s*(.+)$/m.exec(source)?.[1] ?? \"\").trim();\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { syncAgentsDoc } from \"./adapters/agents-doc\";\nimport { syncClaudeSkills } from \"./adapters/claude\";\nimport { syncCursorRules } from \"./adapters/cursor-rules\";\nimport { syncSkillTree } from \"./adapters/skill-tree\";\nimport {\n bundledSkillsDirectory,\n collectSkillFiles,\n skillNames,\n skillsTargetDirectory,\n} from \"./discovery\";\nimport type {\n InstalledSkillReport,\n SkillsOptions,\n SkillsTarget,\n SkillsTargetResult,\n SkillsWriteMode,\n SkillsWriteResult,\n} from \"./types\";\n\nexport function inspectInstalledSkills(options: SkillsOptions = {}): InstalledSkillReport[] {\n const skillsDirectory = options.skillsDirectory ?? bundledSkillsDirectory();\n const target = skillsTargetDirectory(options);\n\n return skillNames({ skillsDirectory }).map((name) => {\n const files = collectSkillFiles(join(skillsDirectory, name)).map((relativePath) => {\n const path = join(target, name, relativePath);\n\n let status: InstalledSkillReport[\"files\"][number][\"status\"] = \"missing\";\n\n if (existsSync(path)) {\n const installed = readFileSync(path, \"utf8\");\n const source = readFileSync(join(skillsDirectory, name, relativePath), \"utf8\");\n status = installed === source ? \"up-to-date\" : \"modified\";\n }\n\n return { relativePath, path, status };\n });\n\n return {\n name,\n installed: files.some((file) => file.status !== \"missing\"),\n complete: files.every((file) => file.status !== \"missing\"),\n files,\n };\n });\n}\n\nexport function initSkills(options: SkillsOptions & { force?: boolean } = {}): SkillsWriteResult {\n return writeSkills({ ...options, mode: \"init\" });\n}\n\nexport function updateSkills(options: SkillsOptions & { force?: boolean } = {}): SkillsWriteResult {\n return writeSkills({ ...options, mode: \"update\" });\n}\n\nfunction writeSkills(\n options: SkillsOptions & { force?: boolean; mode: SkillsWriteMode },\n): SkillsWriteResult {\n const skillsDirectory = options.skillsDirectory ?? bundledSkillsDirectory();\n const cwd = options.cwd ?? process.cwd();\n const force = options.force === true;\n\n // Generated pointers (AGENTS.md section, Cursor rules) must reference the\n // directory the canonical copy actually lands in.\n const canonicalDir = options.dir ?? \"skills\";\n\n const targets = new Set<SkillsTarget>(options.targets ?? [\"anvia\"]);\n\n // The ./skills copy is the canonical content every pointer-based adapter\n // references, so it is always written; the target flags add adapters on top.\n targets.add(\"anvia\");\n\n const results: SkillsTargetResult[] = [];\n\n const anvia = syncSkillTree({\n skillsDirectory,\n targetRoot: skillsTargetDirectory(options),\n force,\n mode: options.mode,\n });\n results.push({ target: \"anvia\", ...anvia });\n\n if (targets.has(\"claude\")) {\n const claude = syncClaudeSkills({ cwd, skillsDirectory, force, mode: options.mode });\n results.push({ target: \"claude\", ...claude });\n }\n\n if (targets.has(\"cursor\")) {\n const cursor = syncCursorRules({\n skillsDirectory,\n rulesDirectory: join(cwd, \".cursor\", \"rules\"),\n canonicalDir,\n force,\n mode: options.mode,\n });\n results.push({ target: \"cursor\", ...cursor });\n }\n\n if (targets.has(\"agents\") || targets.has(\"codex\")) {\n const doc = syncAgentsDoc({\n agentsPath: join(cwd, \"AGENTS.md\"),\n skillsDirectory,\n canonicalDir,\n });\n const target: SkillsTarget = targets.has(\"agents\") ? \"agents\" : \"codex\";\n results.push({ target, ...doc });\n }\n\n return {\n report: inspectInstalledSkills(options),\n created: anvia.created,\n updated: anvia.updated,\n targets: results,\n };\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nimport { skillDescription, skillNames } from \"../discovery\";\nimport type { SkillsSyncOutcome } from \"../types\";\n\nexport const agentsSectionStart = \"<!-- anvia-skills:start -->\";\nexport const agentsSectionEnd = \"<!-- anvia-skills:end -->\";\n\nexport type AgentsDocSyncOptions = {\n agentsPath: string;\n skillsDirectory: string;\n canonicalDir: string;\n};\n\n/**\n * Maintain only the marker-owned `<!-- anvia-skills:* -->` section of\n * AGENTS.md. Everything outside the markers is left untouched.\n */\nexport function syncAgentsDoc(options: AgentsDocSyncOptions): SkillsSyncOutcome {\n const section = agentsSkillsSection(options.skillsDirectory, options.canonicalDir);\n\n if (!existsSync(options.agentsPath)) {\n mkdirSync(dirname(options.agentsPath), { recursive: true });\n writeFileSync(options.agentsPath, `# AGENTS.md\\n\\n${section}\\n`);\n\n return { created: [options.agentsPath], updated: [], skipped: 0 };\n }\n\n const existing = readFileSync(options.agentsPath, \"utf8\");\n const startIndex = existing.indexOf(agentsSectionStart);\n const endIndex = existing.indexOf(agentsSectionEnd);\n\n let next: string;\n\n if (startIndex === -1 || endIndex === -1) {\n next = `${existing.replace(/\\n+$/, \"\")}\\n\\n${section}\\n`;\n } else {\n next =\n existing.slice(0, startIndex) + section + existing.slice(endIndex + agentsSectionEnd.length);\n }\n\n if (next === existing) {\n return { created: [], updated: [], skipped: 0 };\n }\n\n writeFileSync(options.agentsPath, next);\n\n return { created: [], updated: [options.agentsPath], skipped: 0 };\n}\n\nexport function agentsSkillsSection(skillsDirectory: string, canonicalDir: string): string {\n const lines = skillNames({ skillsDirectory }).map(\n (name) => `- \\`${canonicalDir}/${name}/SKILL.md\\` — ${skillDescription(skillsDirectory, name)}`,\n );\n\n return [\n agentsSectionStart,\n \"## Anvia Agent Skills\",\n \"\",\n `This project keeps Anvia Agent Skills in \\`${canonicalDir}/\\`. When a task matches a skill, read`,\n \"its `SKILL.md` first and follow it, including the `references/` files and `scripts/`\",\n \"it points to. Run skill scripts with `sh` when they help verify the work.\",\n \"\",\n ...lines,\n agentsSectionEnd,\n ].join(\"\\n\");\n}\n","import { join } from \"node:path\";\n\nimport type { SkillsSyncOutcome, SkillsWriteMode } from \"../types\";\nimport { syncSkillTree } from \"./skill-tree\";\n\nexport type ClaudeSyncOptions = {\n cwd: string;\n skillsDirectory: string;\n force: boolean;\n mode: SkillsWriteMode;\n};\n\n/**\n * Write the self-contained `.claude/skills/<name>/` copy. Unlike the Cursor\n * and AGENTS.md adapters, this one duplicates content so Claude Code works\n * without resolving pointers back into `./skills`.\n */\nexport function syncClaudeSkills(options: ClaudeSyncOptions): SkillsSyncOutcome {\n return syncSkillTree({\n skillsDirectory: options.skillsDirectory,\n targetRoot: join(options.cwd, \".claude\", \"skills\"),\n force: options.force,\n mode: options.mode,\n });\n}\n","import { chmodSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nimport { collectSkillFiles, skillNames } from \"../discovery\";\nimport type { SkillsSyncOutcome, SkillsWriteMode } from \"../types\";\n\nexport type SkillTreeSyncOptions = {\n skillsDirectory: string;\n targetRoot: string;\n force: boolean;\n mode: SkillsWriteMode;\n};\n\n/**\n * Copy the canonical `./skills/<name>/` tree (used by the `anvia` target and\n * the self-contained `.claude/skills/<name>/` copy).\n */\nexport function syncSkillTree(options: SkillTreeSyncOptions): SkillsSyncOutcome {\n const created: string[] = [];\n const updated: string[] = [];\n let skipped = 0;\n\n for (const name of skillNames({ skillsDirectory: options.skillsDirectory })) {\n const sourceRoot = join(options.skillsDirectory, name);\n const targetRoot = join(options.targetRoot, name);\n const sourceFiles = collectSkillFiles(sourceRoot);\n\n if (options.mode === \"update\" && !isSkillInstalled(targetRoot, sourceFiles)) {\n continue;\n }\n\n for (const relativePath of sourceFiles) {\n const outcome = syncOneFile(sourceRoot, targetRoot, relativePath, options);\n\n if (outcome === \"created\") {\n created.push(join(targetRoot, relativePath));\n } else if (outcome === \"updated\") {\n updated.push(join(targetRoot, relativePath));\n } else if (outcome === \"skipped\") {\n skipped += 1;\n }\n }\n }\n\n return { created, updated, skipped };\n}\n\nfunction isSkillInstalled(targetRoot: string, sourceFiles: string[]): boolean {\n return sourceFiles.some((file) => existsSync(join(targetRoot, file)));\n}\n\nfunction syncOneFile(\n sourceRoot: string,\n targetRoot: string,\n relativePath: string,\n options: Pick<SkillTreeSyncOptions, \"force\" | \"mode\">,\n): \"created\" | \"updated\" | \"unchanged\" | \"skipped\" {\n const sourcePath = join(sourceRoot, relativePath);\n const targetPath = join(targetRoot, relativePath);\n const content = readFileSync(sourcePath, \"utf8\");\n\n if (!existsSync(targetPath)) {\n if (options.mode === \"update\" && !options.force) {\n return \"skipped\";\n }\n\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, content);\n chmodSync(targetPath, statSync(sourcePath).mode & 0o777);\n\n return \"created\";\n }\n\n if (readFileSync(targetPath, \"utf8\") === content) {\n return \"unchanged\";\n }\n\n if (!options.force) {\n return \"skipped\";\n }\n\n writeFileSync(targetPath, content);\n chmodSync(targetPath, statSync(sourcePath).mode & 0o777);\n\n return \"updated\";\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nimport { skillDescription, skillNames } from \"../discovery\";\nimport type { SkillsSyncOutcome, SkillsWriteMode } from \"../types\";\n\nexport type CursorRulesSyncOptions = {\n skillsDirectory: string;\n rulesDirectory: string;\n canonicalDir: string;\n force: boolean;\n mode: SkillsWriteMode;\n};\n\n/**\n * Write one `.cursor/rules/<skill>.mdc` pointer per skill. The rule body stays\n * small on purpose: it points Cursor back at the canonical `./skills` copy.\n */\nexport function syncCursorRules(options: CursorRulesSyncOptions): SkillsSyncOutcome {\n const created: string[] = [];\n const updated: string[] = [];\n let skipped = 0;\n\n for (const name of skillNames({ skillsDirectory: options.skillsDirectory })) {\n // Skill directory names already carry their `anvia-` prefix (except the\n // release-notes demo), so the rule file is simply `<name>.mdc`.\n const targetPath = join(options.rulesDirectory, `${name}.mdc`);\n const content = cursorRuleContent(options.skillsDirectory, name, options.canonicalDir);\n\n if (!existsSync(targetPath)) {\n if (options.mode === \"update\" && !options.force) {\n continue;\n }\n\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, content);\n created.push(targetPath);\n continue;\n }\n\n if (readFileSync(targetPath, \"utf8\") === content) {\n continue;\n }\n\n if (!options.force) {\n skipped += 1;\n continue;\n }\n\n writeFileSync(targetPath, content);\n updated.push(targetPath);\n }\n\n return { created, updated, skipped };\n}\n\nexport function cursorRuleContent(\n skillsDirectory: string,\n name: string,\n canonicalDir: string,\n): string {\n const description = skillDescription(skillsDirectory, name).replace(/\"/g, '\\\\\"');\n\n return [\n \"---\",\n `description: \"${description}\"`,\n \"alwaysApply: false\",\n \"---\",\n \"\",\n `When a task matches this skill, read \\`${canonicalDir}/${name}/SKILL.md\\` at the project root and`,\n \"follow it, including the `references/` files and `scripts/` it points to. Run skill\",\n \"scripts with `sh` when they help verify the work.\",\n \"\",\n ].join(\"\\n\");\n}\n","export type SkillFileStatus = \"up-to-date\" | \"modified\" | \"missing\";\n\nexport type InstalledSkillFile = {\n relativePath: string;\n path: string;\n status: SkillFileStatus;\n};\n\nexport type InstalledSkillReport = {\n name: string;\n installed: boolean;\n complete: boolean;\n files: InstalledSkillFile[];\n};\n\nexport const skillsTargetNames = [\"anvia\", \"claude\", \"codex\", \"cursor\", \"agents\"] as const;\n\nexport type SkillsTarget = (typeof skillsTargetNames)[number];\n\nexport function isSkillsTarget(value: string): value is SkillsTarget {\n return (skillsTargetNames as readonly string[]).includes(value);\n}\n\nexport type SkillsTargetResult = {\n target: SkillsTarget;\n created: string[];\n updated: string[];\n skipped: number;\n};\n\nexport type SkillsWriteResult = {\n report: InstalledSkillReport[];\n created: string[];\n updated: string[];\n targets: SkillsTargetResult[];\n};\n\nexport type SkillsOptions = {\n cwd?: string;\n dir?: string;\n skillsDirectory?: string;\n targets?: readonly SkillsTarget[];\n};\n\nexport type SkillsWriteMode = \"init\" | \"update\";\n\nexport type SkillsSyncOutcome = {\n created: string[];\n updated: string[];\n skipped: number;\n};\n"],"mappings":";AAAA,SAAS,iBAAiB;AAC1B,SAAS,YAAY,WAAW,aAAa,cAAc,QAAQ,qBAAqB;AACxF,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AACvB,SAAS,UAAU,SAAS,YAAY;AACxC,SAAS,qBAAqB;AAEvB,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA0BA,IAAM,YAAyD;AAAA,EAC7D,YAAY,CAAC,gBAAgB;AAAA,EAC7B,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAU,CAAC,kBAAkB,cAAc;AAAA,EAC3C,UAAU,CAAC,cAAc;AAAA,EACzB,SAAS,CAAC,kBAAkB,gBAAgB,qBAAqB,aAAa;AAAA,EAC9E,QAAQ,CAAC,kBAAkB,gBAAgB,qBAAqB,eAAe,YAAY;AAAA,EAC3F,iBAAiB,CAAC,mBAAmB;AACvC;AAEA,IAAM,YAAY;AAAA,EAChB,2CAA2C;AAAA,IACzC,IAAI;AAAA,MACF,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,qBAAqB;AAAA,IACnB,4CAA4C;AAAA,MAC1C,WACE;AAAA,MACF,SAAS;AAAA,IACX;AAAA,IACA,2CAA2C;AAAA,MACzC,4CAA4C;AAAA,QAC1C,WAAW;AAAA,QACX,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,mBACd,MACA,UAAmE,CAAC,GACjD;AACnB,QAAM,iBAAiB,QAAQ,kBAAkB,sBAAsB;AACvE,QAAM,oBAAoB,QAAQ,qBAAqB,yBAAyB;AAEhF,QAAM,QAAQ,UAAU,IAAI,EAAE,IAAI,CAAC,cAAc;AAAA,IAC/C,SAAS,aAAa,KAAK,mBAAmB,QAAQ,GAAG,MAAM;AAAA,IAC/D,MAAM,kBAAkB,QAAQ;AAAA,IAChC,QAAQ,qBAAqB,QAAQ;AAAA,IACrC,MAAM;AAAA,EACR,EAAE;AAEF,QAAM,OAA0B;AAAA,IAC9B,SAAS;AAAA,IACT,cAAc,CAAC,mBAAmB,cAAc,EAAE;AAAA,IAClD,aAAa,wBAAwB,IAAI;AAAA,IACzC;AAAA,IACA;AAAA,IACA,OAAO,SAAS,IAAI;AAAA,IACpB,MAAM,MAAM,WAAW,IAAI,uBAAuB;AAAA,EACpD;AAEA,MAAI,SAAS,UAAU,SAAS,cAAc,SAAS,aAAa,SAAS,UAAU;AACrF,SAAK,MAAM;AAAA,EACb;AAEA,SAAO;AACT;AAEO,SAAS,kBACd,UAAyE,CAAC,GACpE;AACN,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AAEvC,QAAM,OAAO,CAAC,QAAQ,SAAS,KAAK,SAAS,iBAAiB,UAAU,OAAO;AAE/E,MAAI,QAAQ,aAAa,QAAW;AAClC,SAAK,KAAK,cAAc,QAAQ,QAAQ;AAAA,EAC1C;AAEA,MAAI,QAAQ,UAAU,MAAM;AAC1B,SAAK,KAAK,SAAS;AAAA,EACrB;AAEA,YAAU,IAAI;AAChB;AAEO,SAAS,gBACd,MACA,UAAiD,CAAC,GAC5C;AACN,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,qBAAqB,YAAY,KAAK,OAAO,GAAG,iBAAiB,CAAC;AACxE,QAAM,WAAW,KAAK,oBAAoB,GAAG,IAAI,OAAO;AAExD,MAAI;AACF,kBAAc,UAAU,GAAG,KAAK,UAAU,mBAAmB,IAAI,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAEhF,UAAM,OAAO,CAAC,OAAO,UAAU,SAAS,KAAK,OAAO;AAEpD,QAAI,QAAQ,cAAc,MAAM;AAC9B,WAAK,KAAK,aAAa;AAAA,IACzB;AAEA,cAAU,IAAI;AAAA,EAChB,UAAE;AACA,WAAO,oBAAoB,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,EAC7D;AACF;AAEO,SAAS,mBAAmB,OAA0C;AAC3E,SAAO,kBAAkB,SAAS,KAAyB;AAC7D;AAiBO,SAAS,sBACd,UAII,CAAC,GACkB;AACvB,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,YAAY,oBAAoB,OAAO;AAC7C,QAAM,WAAW,QAAQ,qBAAqB,yBAAyB;AAEvE,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,UAAM,QAAQ,UAAU,IAAI,EAAE,IAAI,CAAC,aAAa;AAC9C,YAAM,OAAO,KAAK,WAAW,SAAS,QAAQ;AAE9C,UAAI,SAA8B;AAElC,UAAI,WAAW,IAAI,GAAG;AACpB,cAAM,YAAY,aAAa,MAAM,MAAM;AAC3C,iBAAS,cAAc,oBAAoB,UAAU,QAAQ,IAAI,eAAe;AAAA,MAClF;AAEA,aAAO,EAAE,UAAU,MAAM,OAAO;AAAA,IAClC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,SAAS;AAAA,MACzD,UAAU,MAAM,MAAM,CAAC,SAAS,KAAK,WAAW,SAAS;AAAA,MACzD;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,qBACd,UAKI,CAAC,GACiD;AACtD,QAAM,WAAW,QAAQ,qBAAqB,yBAAyB;AACvE,QAAM,SAAS,sBAAsB,OAAO;AAC5C,QAAM,UAAoB,CAAC;AAE3B,MAAI,QAAQ,cAAc,MAAM;AAC9B,UAAM,aAAa,oBAAI,IAAoB;AAE3C,eAAW,QAAQ,QAAQ;AACzB,UAAI,CAAC,KAAK,WAAW;AACnB;AAAA,MACF;AAEA,iBAAW,QAAQ,KAAK,OAAO;AAC7B,YAAI,KAAK,WAAW,gBAAgB,WAAW,IAAI,KAAK,IAAI,GAAG;AAC7D;AAAA,QACF;AAEA,mBAAW,IAAI,KAAK,MAAM,oBAAoB,UAAU,KAAK,QAAQ,CAAC;AAAA,MACxE;AAAA,IACF;AAEA,eAAW,CAAC,MAAM,OAAO,KAAK,YAAY;AACxC,gBAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,oBAAc,MAAM,OAAO;AAC3B,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEO,SAAS,wBAAwB,OAA6C;AACnF,MAAI;AACJ,MAAI,eAAe,OAAO;AAE1B,aAAW,QAAQ,mBAAmB;AACpC,UAAM,WAAW,oBAAoB,OAAO,IAAI;AAEhD,QAAI,WAAW,cAAc;AAC3B,qBAAe;AACf,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,gBAAgB,IAAI,OAAO;AACpC;AAEA,SAAS,oBAAoB,UAA4B,CAAC,GAAW;AACnE,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,eAAe,KAAK,KAAK,iBAAiB;AAEhD,MAAI;AAEJ,MAAI;AACF,eAAW,KAAK,MAAM,kBAAkB,aAAa,cAAc,MAAM,CAAC,CAAC;AAAA,EAG7E,QAAQ;AACN,UAAM,IAAI,MAAM,4CAA4C,GAAG,6BAA6B;AAAA,EAC9F;AAEA,QAAM,QAAQ,SAAS,SAAS,cAAc;AAE9C,SAAO,sBAAsB,KAAK,KAAK;AACzC;AAEA,SAAS,sBAAsB,KAAa,OAAuB;AACjE,aAAW,cAAc,CAAC,iBAAiB,eAAe,GAAG;AAC3D,QAAI;AAEJ,QAAI;AACF,eAAS,KAAK,MAAM,kBAAkB,aAAa,KAAK,KAAK,UAAU,GAAG,MAAM,CAAC,CAAC;AAAA,IAGpF,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,QAAQ,OAAO,iBAAiB;AAEtC,QAAI,UAAU,QAAW;AACvB;AAAA,IACF;AAEA,UAAM,SAAS,mBAAmB,OAAO,KAAK;AAE9C,QAAI,WAAW,QAAW;AACxB;AAAA,IACF;AAEA,WAAO,KAAK,KAAK,OAAO,iBAAiB,WAAW,KAAK,MAAM;AAAA,EACjE;AAEA,QAAM,IAAI;AAAA,IACR,wCAAwC,KAAK,4CAA4C,GAAG;AAAA,EAC9F;AACF;AAEA,SAAS,mBAAmB,OAAe,OAAqD;AAC9F,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,UAAM,SAAS,QAAQ,CAAC;AAExB,QAAI,WAAW,QAAW;AACxB;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,IAAI,GAAG;AACtB,YAAM,SAAS,IAAI,MAAM,GAAG,EAAE;AAE9B,UAAI,UAAU,QAAQ;AACpB,eAAO,OAAO,QAAQ,SAAS,EAAE;AAAA,MACnC;AAEA,UAAI,MAAM,WAAW,GAAG,MAAM,GAAG,GAAG;AAClC,eAAO,KAAK,OAAO,QAAQ,SAAS,EAAE,GAAG,MAAM,MAAM,OAAO,SAAS,CAAC,CAAC;AAAA,MACzE;AAAA,IACF,WAAW,QAAQ,OAAO;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAwB;AACjD,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,UAAU;AAEd,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,UAAM,YAAY,OAAO,KAAK;AAE9B,QAAI,UAAU;AACZ,gBAAU;AAEV,UAAI,SAAS;AACX,kBAAU;AAAA,MACZ,WAAW,cAAc,MAAM;AAC7B,kBAAU;AAAA,MACZ,WAAW,cAAc,KAAK;AAC5B,mBAAW;AAAA,MACb;AAEA;AAAA,IACF;AAEA,QAAI,cAAc,KAAK;AACrB,iBAAW;AACX,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,cAAc,OAAO,OAAO,QAAQ,CAAC,MAAM,KAAK;AAClD,aAAO,QAAQ,OAAO,UAAU,OAAO,KAAK,MAAM,MAAM;AACtD,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AAEA,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,mBAA2B,UAA0B;AAChF,SAAO,aAAa,KAAK,mBAAmB,QAAQ,GAAG,MAAM;AAC/D;AAEA,SAAS,oBAAoB,MAAc,OAAuB;AAChE,QAAM,WAAW,MAAM,KAAK,EAAE,QAAQ,MAAM,SAAS,EAAE,GAAG,CAAC,GAAG,UAAU,KAAK;AAE7E,WAAS,IAAI,GAAG,KAAK,KAAK,QAAQ,KAAK,GAAG;AACxC,QAAI,WAAW,SAAS,CAAC;AACzB,aAAS,CAAC,IAAI;AAEd,aAAS,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,GAAG;AACzC,YAAM,QAAQ,SAAS,CAAC;AACxB,eAAS,CAAC,IAAI,KAAK;AAAA,QACjB,QAAQ;AAAA,QACR,SAAS,IAAI,CAAC,IAAK;AAAA,QACnB,YAAY,KAAK,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,IAAI;AAAA,MACjD;AACA,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,SAAO,SAAS,MAAM,MAAM;AAC9B;AAEA,SAAS,UAAU,MAAsB;AACvC,QAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,QAAM,cAAcA,SAAQ,QAAQ,QAAQ;AAE5C,QAAM,SAAS,UAAU,QAAQ,UAAU,CAAC,aAAa,GAAG,IAAI,GAAG;AAAA,IACjE,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AAED,MAAI,OAAO,UAAU,QAAW;AAC9B,UAAM,OAAO;AAAA,EACf;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,UAAU,KAAK,CAAC,KAAK,SAAS,0BAA0B,OAAO,MAAM,GAAG;AAAA,EAC1F;AACF;AAEA,SAAS,2BAAmC;AAC1C,SAAO,cAAc,IAAI,IAAI,eAAe,YAAY,GAAG,CAAC;AAC9D;AAEA,SAAS,wBAAgC;AACvC,QAAM,eAAe,cAAc,IAAI,IAAI,mBAAmB,YAAY,GAAG,CAAC;AAC9E,QAAM,WAAW,KAAK,MAAM,aAAa,cAAc,MAAM,CAAC;AAE9D,MAAI,OAAO,SAAS,YAAY,UAAU;AACxC,UAAM,IAAI,MAAM,8BAA8B,SAAS,YAAY,CAAC,GAAG;AAAA,EACzE;AAEA,SAAO,SAAS;AAClB;AAEA,SAAS,wBAAwB,MAAgC;AAC/D,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,kBAAkB,IAAI;AAC/B;;;AC1bA,SAAS,aAAa,gBAAAC,qBAAoB;AAC1C,SAAS,QAAAC,aAAY;AACrB,SAAS,iBAAAC,sBAAqB;AAEvB,SAAS,yBAAiC;AAI/C,SAAOA,eAAc,IAAI,IAAI,aAAa,YAAY,GAAG,CAAC;AAC5D;AAEO,SAAS,WAAW,UAAwC,CAAC,GAAa;AAC/E,QAAM,YAAY,QAAQ,mBAAmB,uBAAuB;AAEpE,SAAO,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC,EAClD,OAAO,CAAC,UAAU,MAAM,YAAY,CAAC,EACrC,IAAI,CAAC,UAAU,MAAM,IAAI,EACzB,KAAK;AACV;AAEO,SAAS,sBAAsB,UAA0C,CAAC,GAAW;AAC1F,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AAEvC,SAAOD,MAAK,KAAK,QAAQ,OAAO,QAAQ;AAC1C;AAEO,SAAS,kBAAkB,MAAwB;AACxD,QAAM,QAAkB,CAAC;AAEzB,QAAM,QAAQ,CAAC,WAAmB,WAAyB;AACzD,UAAM,UAAU,YAAY,WAAW,EAAE,eAAe,KAAK,CAAC,EAAE;AAAA,MAAK,CAAC,MAAM,UAC1E,KAAK,KAAK,cAAc,MAAM,IAAI;AAAA,IACpC;AAEA,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,YAAY,GAAG;AACvB,cAAMA,MAAK,WAAW,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,MAAM,IAAI,GAAG;AAAA,MAC9D,WAAW,MAAM,OAAO,GAAG;AACzB,cAAM,KAAK,GAAG,MAAM,GAAG,MAAM,IAAI,EAAE;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,EAAE;AAEd,SAAO;AACT;AAEO,SAAS,iBAAiB,iBAAyB,MAAsB;AAC9E,QAAM,SAASD,cAAaC,MAAK,iBAAiB,MAAM,UAAU,GAAG,MAAM;AAE3E,UAAQ,yBAAyB,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI,KAAK;AACjE;;;ACpDA,SAAS,cAAAE,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,gBAAe;AAKjB,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AAYzB,SAAS,cAAc,SAAkD;AAC9E,QAAM,UAAU,oBAAoB,QAAQ,iBAAiB,QAAQ,YAAY;AAEjF,MAAI,CAACC,YAAW,QAAQ,UAAU,GAAG;AACnC,IAAAC,WAAUC,SAAQ,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,IAAAC,eAAc,QAAQ,YAAY;AAAA;AAAA,EAAkB,OAAO;AAAA,CAAI;AAE/D,WAAO,EAAE,SAAS,CAAC,QAAQ,UAAU,GAAG,SAAS,CAAC,GAAG,SAAS,EAAE;AAAA,EAClE;AAEA,QAAM,WAAWC,cAAa,QAAQ,YAAY,MAAM;AACxD,QAAM,aAAa,SAAS,QAAQ,kBAAkB;AACtD,QAAM,WAAW,SAAS,QAAQ,gBAAgB;AAElD,MAAI;AAEJ,MAAI,eAAe,MAAM,aAAa,IAAI;AACxC,WAAO,GAAG,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAAA;AAAA,EAAO,OAAO;AAAA;AAAA,EACtD,OAAO;AACL,WACE,SAAS,MAAM,GAAG,UAAU,IAAI,UAAU,SAAS,MAAM,WAAW,iBAAiB,MAAM;AAAA,EAC/F;AAEA,MAAI,SAAS,UAAU;AACrB,WAAO,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,EAAE;AAAA,EAChD;AAEA,EAAAD,eAAc,QAAQ,YAAY,IAAI;AAEtC,SAAO,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,QAAQ,UAAU,GAAG,SAAS,EAAE;AAClE;AAEO,SAAS,oBAAoB,iBAAyB,cAA8B;AACzF,QAAM,QAAQ,WAAW,EAAE,gBAAgB,CAAC,EAAE;AAAA,IAC5C,CAAC,SAAS,OAAO,YAAY,IAAI,IAAI,sBAAiB,iBAAiB,iBAAiB,IAAI,CAAC;AAAA,EAC/F;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,8CAA8C,YAAY;AAAA,IAC1D;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;ACnEA,SAAS,QAAAE,aAAY;;;ACArB,SAAS,WAAW,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,UAAU,iBAAAC,sBAAqB;AACxF,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAgBvB,SAAS,cAAc,SAAkD;AAC9E,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,MAAI,UAAU;AAEd,aAAW,QAAQ,WAAW,EAAE,iBAAiB,QAAQ,gBAAgB,CAAC,GAAG;AAC3E,UAAM,aAAaC,MAAK,QAAQ,iBAAiB,IAAI;AACrD,UAAM,aAAaA,MAAK,QAAQ,YAAY,IAAI;AAChD,UAAM,cAAc,kBAAkB,UAAU;AAEhD,QAAI,QAAQ,SAAS,YAAY,CAAC,iBAAiB,YAAY,WAAW,GAAG;AAC3E;AAAA,IACF;AAEA,eAAW,gBAAgB,aAAa;AACtC,YAAM,UAAU,YAAY,YAAY,YAAY,cAAc,OAAO;AAEzE,UAAI,YAAY,WAAW;AACzB,gBAAQ,KAAKA,MAAK,YAAY,YAAY,CAAC;AAAA,MAC7C,WAAW,YAAY,WAAW;AAChC,gBAAQ,KAAKA,MAAK,YAAY,YAAY,CAAC;AAAA,MAC7C,WAAW,YAAY,WAAW;AAChC,mBAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,SAAS,QAAQ;AACrC;AAEA,SAAS,iBAAiB,YAAoB,aAAgC;AAC5E,SAAO,YAAY,KAAK,CAAC,SAASC,YAAWD,MAAK,YAAY,IAAI,CAAC,CAAC;AACtE;AAEA,SAAS,YACP,YACA,YACA,cACA,SACiD;AACjD,QAAM,aAAaA,MAAK,YAAY,YAAY;AAChD,QAAM,aAAaA,MAAK,YAAY,YAAY;AAChD,QAAM,UAAUE,cAAa,YAAY,MAAM;AAE/C,MAAI,CAACD,YAAW,UAAU,GAAG;AAC3B,QAAI,QAAQ,SAAS,YAAY,CAAC,QAAQ,OAAO;AAC/C,aAAO;AAAA,IACT;AAEA,IAAAE,WAAUC,SAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,IAAAC,eAAc,YAAY,OAAO;AACjC,cAAU,YAAY,SAAS,UAAU,EAAE,OAAO,GAAK;AAEvD,WAAO;AAAA,EACT;AAEA,MAAIH,cAAa,YAAY,MAAM,MAAM,SAAS;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,OAAO;AAClB,WAAO;AAAA,EACT;AAEA,EAAAG,eAAc,YAAY,OAAO;AACjC,YAAU,YAAY,SAAS,UAAU,EAAE,OAAO,GAAK;AAEvD,SAAO;AACT;;;ADpEO,SAAS,iBAAiB,SAA+C;AAC9E,SAAO,cAAc;AAAA,IACnB,iBAAiB,QAAQ;AAAA,IACzB,YAAYC,MAAK,QAAQ,KAAK,WAAW,QAAQ;AAAA,IACjD,OAAO,QAAQ;AAAA,IACf,MAAM,QAAQ;AAAA,EAChB,CAAC;AACH;;;AExBA,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAiBvB,SAAS,gBAAgB,SAAoD;AAClF,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,MAAI,UAAU;AAEd,aAAW,QAAQ,WAAW,EAAE,iBAAiB,QAAQ,gBAAgB,CAAC,GAAG;AAG3E,UAAM,aAAaC,MAAK,QAAQ,gBAAgB,GAAG,IAAI,MAAM;AAC7D,UAAM,UAAU,kBAAkB,QAAQ,iBAAiB,MAAM,QAAQ,YAAY;AAErF,QAAI,CAACC,YAAW,UAAU,GAAG;AAC3B,UAAI,QAAQ,SAAS,YAAY,CAAC,QAAQ,OAAO;AAC/C;AAAA,MACF;AAEA,MAAAC,WAAUC,SAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,MAAAC,eAAc,YAAY,OAAO;AACjC,cAAQ,KAAK,UAAU;AACvB;AAAA,IACF;AAEA,QAAIC,cAAa,YAAY,MAAM,MAAM,SAAS;AAChD;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,OAAO;AAClB,iBAAW;AACX;AAAA,IACF;AAEA,IAAAD,eAAc,YAAY,OAAO;AACjC,YAAQ,KAAK,UAAU;AAAA,EACzB;AAEA,SAAO,EAAE,SAAS,SAAS,QAAQ;AACrC;AAEO,SAAS,kBACd,iBACA,MACA,cACQ;AACR,QAAM,cAAc,iBAAiB,iBAAiB,IAAI,EAAE,QAAQ,MAAM,KAAK;AAE/E,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,WAAW;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA,0CAA0C,YAAY,IAAI,IAAI;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;AJpDO,SAAS,uBAAuB,UAAyB,CAAC,GAA2B;AAC1F,QAAM,kBAAkB,QAAQ,mBAAmB,uBAAuB;AAC1E,QAAM,SAAS,sBAAsB,OAAO;AAE5C,SAAO,WAAW,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,SAAS;AACnD,UAAM,QAAQ,kBAAkBE,MAAK,iBAAiB,IAAI,CAAC,EAAE,IAAI,CAAC,iBAAiB;AACjF,YAAM,OAAOA,MAAK,QAAQ,MAAM,YAAY;AAE5C,UAAI,SAA0D;AAE9D,UAAIC,YAAW,IAAI,GAAG;AACpB,cAAM,YAAYC,cAAa,MAAM,MAAM;AAC3C,cAAM,SAASA,cAAaF,MAAK,iBAAiB,MAAM,YAAY,GAAG,MAAM;AAC7E,iBAAS,cAAc,SAAS,eAAe;AAAA,MACjD;AAEA,aAAO,EAAE,cAAc,MAAM,OAAO;AAAA,IACtC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,SAAS;AAAA,MACzD,UAAU,MAAM,MAAM,CAAC,SAAS,KAAK,WAAW,SAAS;AAAA,MACzD;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,WAAW,UAA+C,CAAC,GAAsB;AAC/F,SAAO,YAAY,EAAE,GAAG,SAAS,MAAM,OAAO,CAAC;AACjD;AAEO,SAAS,aAAa,UAA+C,CAAC,GAAsB;AACjG,SAAO,YAAY,EAAE,GAAG,SAAS,MAAM,SAAS,CAAC;AACnD;AAEA,SAAS,YACP,SACmB;AACnB,QAAM,kBAAkB,QAAQ,mBAAmB,uBAAuB;AAC1E,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,QAAQ,QAAQ,UAAU;AAIhC,QAAM,eAAe,QAAQ,OAAO;AAEpC,QAAM,UAAU,IAAI,IAAkB,QAAQ,WAAW,CAAC,OAAO,CAAC;AAIlE,UAAQ,IAAI,OAAO;AAEnB,QAAM,UAAgC,CAAC;AAEvC,QAAM,QAAQ,cAAc;AAAA,IAC1B;AAAA,IACA,YAAY,sBAAsB,OAAO;AAAA,IACzC;AAAA,IACA,MAAM,QAAQ;AAAA,EAChB,CAAC;AACD,UAAQ,KAAK,EAAE,QAAQ,SAAS,GAAG,MAAM,CAAC;AAE1C,MAAI,QAAQ,IAAI,QAAQ,GAAG;AACzB,UAAM,SAAS,iBAAiB,EAAE,KAAK,iBAAiB,OAAO,MAAM,QAAQ,KAAK,CAAC;AACnF,YAAQ,KAAK,EAAE,QAAQ,UAAU,GAAG,OAAO,CAAC;AAAA,EAC9C;AAEA,MAAI,QAAQ,IAAI,QAAQ,GAAG;AACzB,UAAM,SAAS,gBAAgB;AAAA,MAC7B;AAAA,MACA,gBAAgBA,MAAK,KAAK,WAAW,OAAO;AAAA,MAC5C;AAAA,MACA;AAAA,MACA,MAAM,QAAQ;AAAA,IAChB,CAAC;AACD,YAAQ,KAAK,EAAE,QAAQ,UAAU,GAAG,OAAO,CAAC;AAAA,EAC9C;AAEA,MAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,OAAO,GAAG;AACjD,UAAM,MAAM,cAAc;AAAA,MACxB,YAAYA,MAAK,KAAK,WAAW;AAAA,MACjC;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,SAAuB,QAAQ,IAAI,QAAQ,IAAI,WAAW;AAChE,YAAQ,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,QAAQ,uBAAuB,OAAO;AAAA,IACtC,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,SAAS;AAAA,EACX;AACF;;;AKtGO,IAAM,oBAAoB,CAAC,SAAS,UAAU,SAAS,UAAU,QAAQ;AAIzE,SAAS,eAAe,OAAsC;AACnE,SAAQ,kBAAwC,SAAS,KAAK;AAChE;","names":["require","readFileSync","join","fileURLToPath","existsSync","readFileSync","join","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","existsSync","mkdirSync","dirname","writeFileSync","readFileSync","join","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","join","existsSync","readFileSync","mkdirSync","dirname","writeFileSync","join","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","join","existsSync","mkdirSync","dirname","writeFileSync","readFileSync","join","existsSync","readFileSync"]}
package/dist/cli.js CHANGED
@@ -1,57 +1,311 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  addRegistryItem,
4
+ closestRegistryItemName,
5
+ initSkills,
4
6
  initializeProject,
5
7
  isRegistryItemName,
6
- registryItemNames
7
- } from "./chunk-TE2ODJOV.js";
8
+ isSkillsTarget,
9
+ registryItemNames,
10
+ skillNames,
11
+ updateInstalledItems,
12
+ updateSkills
13
+ } from "./chunk-ERCP4EIZ.js";
14
+
15
+ // src/cli/options.ts
16
+ function optionValue(args, name) {
17
+ const index = args.indexOf(name);
18
+ if (index === -1) {
19
+ return void 0;
20
+ }
21
+ const value = args[index + 1];
22
+ if (value === void 0 || value.startsWith("--")) {
23
+ throw new Error(`${name} requires a value.`);
24
+ }
25
+ return value;
26
+ }
27
+
28
+ // src/cli/skills-output.ts
29
+ function printAdapterTargets(targets, anviaChanged) {
30
+ let changed = anviaChanged;
31
+ for (const target of targets) {
32
+ if (target.target === "anvia") {
33
+ continue;
34
+ }
35
+ const written = target.created.length + target.updated.length;
36
+ changed += written;
37
+ if (target.target === "agents" || target.target === "codex") {
38
+ printAgentsTarget(target);
39
+ continue;
40
+ }
41
+ const label = target.target === "claude" ? ".claude/skills" : ".cursor/rules";
42
+ if (written === 0) {
43
+ printUpToDate(label, target.skipped);
44
+ continue;
45
+ }
46
+ console.log(`${label}: synced ${written} ${written === 1 ? "file" : "files"}.`);
47
+ }
48
+ if (changed === 0) {
49
+ console.log("No skill files changed.");
50
+ }
51
+ }
52
+ function reportSkills(result, mode) {
53
+ const createdPaths = new Set(result.created);
54
+ const updatedPaths = new Set(result.updated);
55
+ const isWritten = (path) => createdPaths.has(path) || updatedPaths.has(path);
56
+ let changeCount = 0;
57
+ for (const skill of result.report) {
58
+ const createdCount = skill.files.filter((file) => createdPaths.has(file.path)).length;
59
+ const updatedCount = skill.files.filter((file) => updatedPaths.has(file.path)).length;
60
+ const changedCount = createdCount + updatedCount;
61
+ const skippedCount = skill.files.filter(
62
+ (file) => file.status === "modified" && !isWritten(file.path)
63
+ ).length;
64
+ const skipNote = skippedCount > 0 ? ` skipped ${skippedCount} modified ${skippedCount === 1 ? "file" : "files"} (use --force to overwrite).` : void 0;
65
+ changeCount += changedCount;
66
+ if (changedCount === 0) {
67
+ reportUnchangedSkill(skill.name, skill.installed, skipNote);
68
+ continue;
69
+ }
70
+ if (mode === "init") {
71
+ reportChangedSkillInit(skill.name, createdCount, updatedCount, skipNote);
72
+ continue;
73
+ }
74
+ console.log(
75
+ `skills/${skill.name}: updated ${changedCount} ${changedCount === 1 ? "file" : "files"}.`
76
+ );
77
+ }
78
+ return changeCount;
79
+ }
80
+ function printAgentsTarget(target) {
81
+ if (target.created.length > 0) {
82
+ console.log("Created AGENTS.md (Anvia skills section).");
83
+ } else if (target.updated.length > 0) {
84
+ console.log("Updated AGENTS.md (Anvia skills section).");
85
+ } else {
86
+ console.log("AGENTS.md: up to date.");
87
+ }
88
+ }
89
+ function printUpToDate(label, skipped) {
90
+ if (skipped > 0) {
91
+ console.log(
92
+ `${label}: skipped ${skipped} modified ${skipped === 1 ? "file" : "files"} (use --force to overwrite).`
93
+ );
94
+ return;
95
+ }
96
+ console.log(`${label}: up to date.`);
97
+ }
98
+ function reportUnchangedSkill(name, installed, skipNote) {
99
+ if (!installed) {
100
+ console.log(`skills/${name}: not installed. Run \`anvia skills init\` first.`);
101
+ return;
102
+ }
103
+ if (skipNote !== void 0) {
104
+ console.log(`skills/${name}: ${skipNote.trimStart()}`);
105
+ return;
106
+ }
107
+ console.log(`skills/${name}: up to date.`);
108
+ }
109
+ function reportChangedSkillInit(name, createdCount, updatedCount, skipNote) {
110
+ if (createdCount > 0) {
111
+ const updatedNote = updatedCount > 0 ? `, updated ${updatedCount}` : "";
112
+ console.log(
113
+ `Created skills/${name} (${createdCount} ${createdCount === 1 ? "file" : "files"}${updatedNote}).`
114
+ );
115
+ } else {
116
+ console.log(
117
+ `Updated skills/${name} (${updatedCount} ${updatedCount === 1 ? "file" : "files"}).`
118
+ );
119
+ }
120
+ if (skipNote !== void 0) {
121
+ console.log(skipNote);
122
+ }
123
+ }
124
+
125
+ // src/cli/skills-targets.ts
126
+ var targetFlags = [
127
+ ["--claude", "claude"],
128
+ ["--codex", "codex"],
129
+ ["--cursor", "cursor"],
130
+ ["--agents", "agents"]
131
+ ];
132
+ function parseSkillsTargets(args) {
133
+ const targets = [];
134
+ for (const [flag, target] of targetFlags) {
135
+ if (args.includes(flag) && isSkillsTarget(target)) {
136
+ targets.push(target);
137
+ }
138
+ }
139
+ return targets;
140
+ }
8
141
 
9
142
  // src/cli.ts
10
143
  function main(args) {
11
144
  const [command, ...commandArgs] = args;
12
145
  const cwd = optionValue(commandArgs, "--cwd");
146
+ const dir = optionValue(commandArgs, "--dir");
13
147
  const positional = commandArgs.filter(
14
- (value, index) => !value.startsWith("--") && (index === 0 || commandArgs[index - 1] !== "--cwd")
148
+ (value, index) => !value.startsWith("--") && (index === 0 || commandArgs[index - 1] !== "--cwd" && commandArgs[index - 1] !== "--dir")
15
149
  );
16
150
  if (command === "init") {
17
- const value = positional[0];
18
- if (positional.length > 1 || value !== void 0 && value !== "next" && value !== "vite") {
19
- throw new Error("The init template must be next or vite.");
20
- }
21
- const options = {
22
- force: commandArgs.includes("--force")
23
- };
24
- if (cwd !== void 0) options.cwd = cwd;
25
- if (value === "next" || value === "vite") options.template = value;
26
- initializeProject(options);
27
- console.log("Anvia UI configuration is ready.");
151
+ handleInit(commandArgs, positional, cwd);
28
152
  return;
29
153
  }
30
154
  if (command === "add") {
31
- const value = positional[0];
32
- if (value === void 0 || positional.length !== 1 || !isRegistryItemName(value)) {
33
- throw new Error(`Choose an item: ${registryItemNames.join(", ")}.`);
155
+ handleAdd(commandArgs, positional, cwd);
156
+ return;
157
+ }
158
+ if (command === "update") {
159
+ handleUpdate(commandArgs, positional, cwd);
160
+ return;
161
+ }
162
+ if (command === "skills") {
163
+ handleSkills(commandArgs, positional, cwd, dir);
164
+ return;
165
+ }
166
+ printUsage();
167
+ }
168
+ function handleInit(commandArgs, positional, cwd) {
169
+ const value = positional[0];
170
+ if (positional.length > 1 || value !== void 0 && value !== "next" && value !== "vite") {
171
+ throw new Error("The init template must be next or vite.");
172
+ }
173
+ const options = {
174
+ force: commandArgs.includes("--force")
175
+ };
176
+ if (cwd !== void 0) {
177
+ options.cwd = cwd;
178
+ }
179
+ if (value === "next" || value === "vite") {
180
+ options.template = value;
181
+ }
182
+ initializeProject(options);
183
+ console.log("Anvia UI configuration is ready.");
184
+ }
185
+ function handleAdd(commandArgs, positional, cwd) {
186
+ const value = positional[0];
187
+ if (value === void 0 || positional.length !== 1 || !isRegistryItemName(value)) {
188
+ throw new Error(`Choose an item: ${registryItemNames.join(", ")}.`);
189
+ }
190
+ const options = {
191
+ overwrite: commandArgs.includes("--overwrite")
192
+ };
193
+ if (cwd !== void 0) {
194
+ options.cwd = cwd;
195
+ }
196
+ addRegistryItem(value, options);
197
+ console.log(`Added Anvia ${value}.`);
198
+ }
199
+ function handleUpdate(commandArgs, positional, cwd) {
200
+ const items = positional.map((value) => {
201
+ if (isRegistryItemName(value)) {
202
+ return value;
34
203
  }
35
- const options = {
36
- overwrite: commandArgs.includes("--overwrite")
37
- };
38
- if (cwd !== void 0) options.cwd = cwd;
39
- addRegistryItem(value, options);
40
- console.log(`Added Anvia ${value}.`);
204
+ const suggestion = closestRegistryItemName(value);
205
+ const suffix = suggestion === void 0 ? "" : ` Did you mean "${suggestion}"?`;
206
+ throw new Error(
207
+ `Unknown registry item "${value}".${suffix} Choose an item: ${registryItemNames.join(", ")}.`
208
+ );
209
+ });
210
+ const overwrite = commandArgs.includes("--overwrite");
211
+ const options = { overwrite };
212
+ if (cwd !== void 0) {
213
+ options.cwd = cwd;
214
+ }
215
+ if (items.length > 0) {
216
+ options.items = items;
217
+ }
218
+ const { report, updated } = updateInstalledItems(options);
219
+ if (overwrite === true) {
220
+ reportOverwriteResult(report, new Set(updated), updated.length);
41
221
  return;
42
222
  }
43
- console.log(`Usage:
44
- anvia init [next|vite] [--cwd <path>] [--force]
45
- anvia add <${registryItemNames.join("|")}> [--cwd <path>] [--overwrite]`);
223
+ reportDryRunResult(report);
46
224
  }
47
- function optionValue(args, name) {
48
- const index = args.indexOf(name);
49
- if (index === -1) return void 0;
50
- const value = args[index + 1];
51
- if (value === void 0 || value.startsWith("--")) {
52
- throw new Error(`${name} requires a value.`);
225
+ function handleSkills(commandArgs, positional, cwd, dir) {
226
+ const action = positional[0];
227
+ if (positional.length > 1 || action !== "init" && action !== "update" && action !== "list") {
228
+ throw new Error("Choose a skills action: init, update, list.");
53
229
  }
54
- return value;
230
+ if (action === "list") {
231
+ const names = skillNames();
232
+ for (const name of names) {
233
+ console.log(`skills/${name}`);
234
+ }
235
+ console.log(
236
+ `${names.length} skills available. Run \`anvia skills init\` to copy them into your project.`
237
+ );
238
+ return;
239
+ }
240
+ const skillsOptions = {
241
+ force: commandArgs.includes("--force")
242
+ };
243
+ if (cwd !== void 0) {
244
+ skillsOptions.cwd = cwd;
245
+ }
246
+ if (dir !== void 0) {
247
+ skillsOptions.dir = dir;
248
+ }
249
+ const targets = parseSkillsTargets(commandArgs);
250
+ if (targets.length > 0) {
251
+ skillsOptions.targets = targets;
252
+ }
253
+ if (action === "init") {
254
+ const result2 = initSkills(skillsOptions);
255
+ const changed2 = reportSkills(result2, "init");
256
+ printAdapterTargets(result2.targets, changed2);
257
+ const canonicalDir = dir ?? "skills";
258
+ console.log(
259
+ `Anvia skills are ready in ./${canonicalDir} \u2014 Anvia knowledge for your coding agent.`
260
+ );
261
+ console.log(
262
+ `Your agent reads ./${canonicalDir}/<skill>/SKILL.md directly, or through the adapters above.`
263
+ );
264
+ return;
265
+ }
266
+ const result = updateSkills(skillsOptions);
267
+ const changed = reportSkills(result, "update");
268
+ printAdapterTargets(result.targets, changed);
269
+ }
270
+ function reportOverwriteResult(report, updatedPaths, updatedCount) {
271
+ for (const item of report) {
272
+ if (!item.installed) {
273
+ console.log(`Anvia ${item.name}: not installed. Use \`anvia add ${item.name}\` first.`);
274
+ continue;
275
+ }
276
+ const changed = item.files.some(
277
+ (file) => file.status !== "up-to-date" && updatedPaths.has(file.path)
278
+ );
279
+ console.log(`Anvia ${item.name}: ${changed ? "updated" : "up to date"}.`);
280
+ }
281
+ console.log(
282
+ updatedCount === 0 ? "All installed Anvia components are up to date." : `Updated ${updatedCount} ${updatedCount === 1 ? "file" : "files"}.`
283
+ );
284
+ }
285
+ function reportDryRunResult(report) {
286
+ let changeCount = 0;
287
+ for (const item of report) {
288
+ if (!item.installed) {
289
+ console.log(`Anvia ${item.name}: not installed.`);
290
+ continue;
291
+ }
292
+ for (const file of item.files) {
293
+ if (file.status !== "up-to-date") {
294
+ changeCount += 1;
295
+ }
296
+ console.log(`Anvia ${item.name}: ${file.status} ${file.path}`);
297
+ }
298
+ }
299
+ console.log(
300
+ changeCount === 0 ? "Everything is up to date." : `Found ${changeCount} out-of-date ${changeCount === 1 ? "file" : "files"}. Re-run with --overwrite to apply.`
301
+ );
302
+ }
303
+ function printUsage() {
304
+ console.log(`Usage:
305
+ anvia init [next|vite] [--cwd <path>] [--force]
306
+ anvia add <${registryItemNames.join("|")}> [--cwd <path>] [--overwrite]
307
+ anvia update [${registryItemNames.join("|")}] [--cwd <path>] [--overwrite]
308
+ anvia skills <init|update|list> [--claude] [--codex] [--cursor] [--agents] [--dir <path>] [--force] [--cwd <path>]`);
55
309
  }
56
310
  try {
57
311
  main(process.argv.slice(2));
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { addRegistryItem, initializeProject, isRegistryItemName, registryItemNames } from \"./index\";\n\nfunction main(args: string[]): void {\n const [command, ...commandArgs] = args;\n const cwd = optionValue(commandArgs, \"--cwd\");\n const positional = commandArgs.filter(\n (value, index) =>\n !value.startsWith(\"--\") && (index === 0 || commandArgs[index - 1] !== \"--cwd\"),\n );\n\n if (command === \"init\") {\n const value = positional[0];\n if (positional.length > 1 || (value !== undefined && value !== \"next\" && value !== \"vite\")) {\n throw new Error(\"The init template must be next or vite.\");\n }\n const options: Parameters<typeof initializeProject>[0] = {\n force: commandArgs.includes(\"--force\"),\n };\n if (cwd !== undefined) options.cwd = cwd;\n if (value === \"next\" || value === \"vite\") options.template = value;\n initializeProject(options);\n console.log(\"Anvia UI configuration is ready.\");\n return;\n }\n\n if (command === \"add\") {\n const value = positional[0];\n if (value === undefined || positional.length !== 1 || !isRegistryItemName(value)) {\n throw new Error(`Choose an item: ${registryItemNames.join(\", \")}.`);\n }\n const options: Parameters<typeof addRegistryItem>[1] = {\n overwrite: commandArgs.includes(\"--overwrite\"),\n };\n if (cwd !== undefined) options.cwd = cwd;\n addRegistryItem(value, options);\n console.log(`Added Anvia ${value}.`);\n return;\n }\n\n console.log(`Usage:\n anvia init [next|vite] [--cwd <path>] [--force]\n anvia add <${registryItemNames.join(\"|\")}> [--cwd <path>] [--overwrite]`);\n}\n\nfunction optionValue(args: string[], name: string): string | undefined {\n const index = args.indexOf(name);\n if (index === -1) return undefined;\n const value = args[index + 1];\n if (value === undefined || value.startsWith(\"--\")) {\n throw new Error(`${name} requires a value.`);\n }\n return value;\n}\n\ntry {\n main(process.argv.slice(2));\n} catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n}\n"],"mappings":";;;;;;;;;AAGA,SAAS,KAAK,MAAsB;AAClC,QAAM,CAAC,SAAS,GAAG,WAAW,IAAI;AAClC,QAAM,MAAM,YAAY,aAAa,OAAO;AAC5C,QAAM,aAAa,YAAY;AAAA,IAC7B,CAAC,OAAO,UACN,CAAC,MAAM,WAAW,IAAI,MAAM,UAAU,KAAK,YAAY,QAAQ,CAAC,MAAM;AAAA,EAC1E;AAEA,MAAI,YAAY,QAAQ;AACtB,UAAM,QAAQ,WAAW,CAAC;AAC1B,QAAI,WAAW,SAAS,KAAM,UAAU,UAAa,UAAU,UAAU,UAAU,QAAS;AAC1F,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AACA,UAAM,UAAmD;AAAA,MACvD,OAAO,YAAY,SAAS,SAAS;AAAA,IACvC;AACA,QAAI,QAAQ,OAAW,SAAQ,MAAM;AACrC,QAAI,UAAU,UAAU,UAAU,OAAQ,SAAQ,WAAW;AAC7D,sBAAkB,OAAO;AACzB,YAAQ,IAAI,kCAAkC;AAC9C;AAAA,EACF;AAEA,MAAI,YAAY,OAAO;AACrB,UAAM,QAAQ,WAAW,CAAC;AAC1B,QAAI,UAAU,UAAa,WAAW,WAAW,KAAK,CAAC,mBAAmB,KAAK,GAAG;AAChF,YAAM,IAAI,MAAM,mBAAmB,kBAAkB,KAAK,IAAI,CAAC,GAAG;AAAA,IACpE;AACA,UAAM,UAAiD;AAAA,MACrD,WAAW,YAAY,SAAS,aAAa;AAAA,IAC/C;AACA,QAAI,QAAQ,OAAW,SAAQ,MAAM;AACrC,oBAAgB,OAAO,OAAO;AAC9B,YAAQ,IAAI,eAAe,KAAK,GAAG;AACnC;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA;AAAA,eAEC,kBAAkB,KAAK,GAAG,CAAC,gCAAgC;AAC1E;AAEA,SAAS,YAAY,MAAgB,MAAkC;AACrE,QAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,MAAI,UAAU,GAAI,QAAO;AACzB,QAAM,QAAQ,KAAK,QAAQ,CAAC;AAC5B,MAAI,UAAU,UAAa,MAAM,WAAW,IAAI,GAAG;AACjD,UAAM,IAAI,MAAM,GAAG,IAAI,oBAAoB;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,IAAI;AACF,OAAK,QAAQ,KAAK,MAAM,CAAC,CAAC;AAC5B,SAAS,OAAO;AACd,UAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,UAAQ,WAAW;AACrB;","names":[]}
1
+ {"version":3,"sources":["../src/cli/options.ts","../src/cli/skills-output.ts","../src/cli/skills-targets.ts","../src/cli.ts"],"sourcesContent":["export function optionValue(args: string[], name: string): string | undefined {\n const index = args.indexOf(name);\n\n if (index === -1) {\n return undefined;\n }\n\n const value = args[index + 1];\n\n if (value === undefined || value.startsWith(\"--\")) {\n throw new Error(`${name} requires a value.`);\n }\n\n return value;\n}\n","import type { SkillsTargetResult, SkillsWriteResult } from \"../index\";\n\nexport function printAdapterTargets(targets: SkillsTargetResult[], anviaChanged: number): void {\n let changed = anviaChanged;\n\n for (const target of targets) {\n if (target.target === \"anvia\") {\n continue;\n }\n\n const written = target.created.length + target.updated.length;\n changed += written;\n\n if (target.target === \"agents\" || target.target === \"codex\") {\n printAgentsTarget(target);\n continue;\n }\n\n const label = target.target === \"claude\" ? \".claude/skills\" : \".cursor/rules\";\n\n if (written === 0) {\n printUpToDate(label, target.skipped);\n continue;\n }\n\n console.log(`${label}: synced ${written} ${written === 1 ? \"file\" : \"files\"}.`);\n }\n\n if (changed === 0) {\n console.log(\"No skill files changed.\");\n }\n}\n\nexport function reportSkills(result: SkillsWriteResult, mode: \"init\" | \"update\"): number {\n const createdPaths = new Set(result.created);\n const updatedPaths = new Set(result.updated);\n const isWritten = (path: string): boolean => createdPaths.has(path) || updatedPaths.has(path);\n\n let changeCount = 0;\n\n for (const skill of result.report) {\n const createdCount = skill.files.filter((file) => createdPaths.has(file.path)).length;\n const updatedCount = skill.files.filter((file) => updatedPaths.has(file.path)).length;\n const changedCount = createdCount + updatedCount;\n const skippedCount = skill.files.filter(\n (file) => file.status === \"modified\" && !isWritten(file.path),\n ).length;\n\n const skipNote =\n skippedCount > 0\n ? ` skipped ${skippedCount} modified ${skippedCount === 1 ? \"file\" : \"files\"} (use --force to overwrite).`\n : undefined;\n\n changeCount += changedCount;\n\n if (changedCount === 0) {\n reportUnchangedSkill(skill.name, skill.installed, skipNote);\n continue;\n }\n\n if (mode === \"init\") {\n reportChangedSkillInit(skill.name, createdCount, updatedCount, skipNote);\n continue;\n }\n\n console.log(\n `skills/${skill.name}: updated ${changedCount} ${changedCount === 1 ? \"file\" : \"files\"}.`,\n );\n }\n\n return changeCount;\n}\n\nfunction printAgentsTarget(target: SkillsTargetResult): void {\n if (target.created.length > 0) {\n console.log(\"Created AGENTS.md (Anvia skills section).\");\n } else if (target.updated.length > 0) {\n console.log(\"Updated AGENTS.md (Anvia skills section).\");\n } else {\n console.log(\"AGENTS.md: up to date.\");\n }\n}\n\nfunction printUpToDate(label: string, skipped: number): void {\n if (skipped > 0) {\n console.log(\n `${label}: skipped ${skipped} modified ${skipped === 1 ? \"file\" : \"files\"} (use --force to overwrite).`,\n );\n return;\n }\n\n console.log(`${label}: up to date.`);\n}\n\nfunction reportUnchangedSkill(\n name: string,\n installed: boolean,\n skipNote: string | undefined,\n): void {\n if (!installed) {\n console.log(`skills/${name}: not installed. Run \\`anvia skills init\\` first.`);\n return;\n }\n\n if (skipNote !== undefined) {\n console.log(`skills/${name}: ${skipNote.trimStart()}`);\n return;\n }\n\n console.log(`skills/${name}: up to date.`);\n}\n\nfunction reportChangedSkillInit(\n name: string,\n createdCount: number,\n updatedCount: number,\n skipNote: string | undefined,\n): void {\n if (createdCount > 0) {\n const updatedNote = updatedCount > 0 ? `, updated ${updatedCount}` : \"\";\n console.log(\n `Created skills/${name} (${createdCount} ${createdCount === 1 ? \"file\" : \"files\"}${updatedNote}).`,\n );\n } else {\n console.log(\n `Updated skills/${name} (${updatedCount} ${updatedCount === 1 ? \"file\" : \"files\"}).`,\n );\n }\n\n if (skipNote !== undefined) {\n console.log(skipNote);\n }\n}\n","import { isSkillsTarget, type SkillsTarget } from \"../index\";\n\nconst targetFlags = [\n [\"--claude\", \"claude\"],\n [\"--codex\", \"codex\"],\n [\"--cursor\", \"cursor\"],\n [\"--agents\", \"agents\"],\n] as const;\n\nexport function parseSkillsTargets(args: string[]): SkillsTarget[] {\n const targets: SkillsTarget[] = [];\n\n for (const [flag, target] of targetFlags) {\n if (args.includes(flag) && isSkillsTarget(target)) {\n targets.push(target);\n }\n }\n\n return targets;\n}\n","#!/usr/bin/env node\nimport {\n addRegistryItem,\n closestRegistryItemName,\n initSkills,\n initializeProject,\n isRegistryItemName,\n registryItemNames,\n skillNames,\n updateInstalledItems,\n updateSkills,\n} from \"./index\";\nimport { optionValue } from \"./cli/options\";\nimport { printAdapterTargets, reportSkills } from \"./cli/skills-output\";\nimport { parseSkillsTargets } from \"./cli/skills-targets\";\n\nfunction main(args: string[]): void {\n const [command, ...commandArgs] = args;\n const cwd = optionValue(commandArgs, \"--cwd\");\n const dir = optionValue(commandArgs, \"--dir\");\n\n const positional = commandArgs.filter(\n (value, index) =>\n !value.startsWith(\"--\") &&\n (index === 0 || (commandArgs[index - 1] !== \"--cwd\" && commandArgs[index - 1] !== \"--dir\")),\n );\n\n if (command === \"init\") {\n handleInit(commandArgs, positional, cwd);\n return;\n }\n\n if (command === \"add\") {\n handleAdd(commandArgs, positional, cwd);\n return;\n }\n\n if (command === \"update\") {\n handleUpdate(commandArgs, positional, cwd);\n return;\n }\n\n if (command === \"skills\") {\n handleSkills(commandArgs, positional, cwd, dir);\n return;\n }\n\n printUsage();\n}\n\nfunction handleInit(commandArgs: string[], positional: string[], cwd: string | undefined): void {\n const value = positional[0];\n\n if (positional.length > 1 || (value !== undefined && value !== \"next\" && value !== \"vite\")) {\n throw new Error(\"The init template must be next or vite.\");\n }\n\n const options: Parameters<typeof initializeProject>[0] = {\n force: commandArgs.includes(\"--force\"),\n };\n\n if (cwd !== undefined) {\n options.cwd = cwd;\n }\n\n if (value === \"next\" || value === \"vite\") {\n options.template = value;\n }\n\n initializeProject(options);\n\n console.log(\"Anvia UI configuration is ready.\");\n}\n\nfunction handleAdd(commandArgs: string[], positional: string[], cwd: string | undefined): void {\n const value = positional[0];\n\n if (value === undefined || positional.length !== 1 || !isRegistryItemName(value)) {\n throw new Error(`Choose an item: ${registryItemNames.join(\", \")}.`);\n }\n\n const options: Parameters<typeof addRegistryItem>[1] = {\n overwrite: commandArgs.includes(\"--overwrite\"),\n };\n\n if (cwd !== undefined) {\n options.cwd = cwd;\n }\n\n addRegistryItem(value, options);\n\n console.log(`Added Anvia ${value}.`);\n}\n\nfunction handleUpdate(commandArgs: string[], positional: string[], cwd: string | undefined): void {\n const items = positional.map((value) => {\n if (isRegistryItemName(value)) {\n return value;\n }\n\n const suggestion = closestRegistryItemName(value);\n const suffix = suggestion === undefined ? \"\" : ` Did you mean \"${suggestion}\"?`;\n\n throw new Error(\n `Unknown registry item \"${value}\".${suffix} Choose an item: ${registryItemNames.join(\", \")}.`,\n );\n });\n\n const overwrite = commandArgs.includes(\"--overwrite\");\n\n const options: Parameters<typeof updateInstalledItems>[0] = { overwrite };\n\n if (cwd !== undefined) {\n options.cwd = cwd;\n }\n\n if (items.length > 0) {\n options.items = items;\n }\n\n const { report, updated } = updateInstalledItems(options);\n\n if (overwrite === true) {\n reportOverwriteResult(report, new Set(updated), updated.length);\n return;\n }\n\n reportDryRunResult(report);\n}\n\nfunction handleSkills(\n commandArgs: string[],\n positional: string[],\n cwd: string | undefined,\n dir: string | undefined,\n): void {\n const action = positional[0];\n\n if (positional.length > 1 || (action !== \"init\" && action !== \"update\" && action !== \"list\")) {\n throw new Error(\"Choose a skills action: init, update, list.\");\n }\n\n if (action === \"list\") {\n const names = skillNames();\n\n for (const name of names) {\n console.log(`skills/${name}`);\n }\n\n console.log(\n `${names.length} skills available. Run \\`anvia skills init\\` to copy them into your project.`,\n );\n\n return;\n }\n\n const skillsOptions: Parameters<typeof initSkills>[0] = {\n force: commandArgs.includes(\"--force\"),\n };\n\n if (cwd !== undefined) {\n skillsOptions.cwd = cwd;\n }\n\n if (dir !== undefined) {\n skillsOptions.dir = dir;\n }\n\n const targets = parseSkillsTargets(commandArgs);\n\n if (targets.length > 0) {\n skillsOptions.targets = targets;\n }\n\n if (action === \"init\") {\n const result = initSkills(skillsOptions);\n const changed = reportSkills(result, \"init\");\n printAdapterTargets(result.targets, changed);\n\n const canonicalDir = dir ?? \"skills\";\n\n console.log(\n `Anvia skills are ready in ./${canonicalDir} — Anvia knowledge for your coding agent.`,\n );\n console.log(\n `Your agent reads ./${canonicalDir}/<skill>/SKILL.md directly, or through the adapters above.`,\n );\n\n return;\n }\n\n const result = updateSkills(skillsOptions);\n const changed = reportSkills(result, \"update\");\n printAdapterTargets(result.targets, changed);\n}\n\nfunction reportOverwriteResult(\n report: ReturnType<typeof updateInstalledItems>[\"report\"],\n updatedPaths: Set<string>,\n updatedCount: number,\n): void {\n for (const item of report) {\n if (!item.installed) {\n console.log(`Anvia ${item.name}: not installed. Use \\`anvia add ${item.name}\\` first.`);\n continue;\n }\n\n const changed = item.files.some(\n (file) => file.status !== \"up-to-date\" && updatedPaths.has(file.path),\n );\n\n console.log(`Anvia ${item.name}: ${changed ? \"updated\" : \"up to date\"}.`);\n }\n\n console.log(\n updatedCount === 0\n ? \"All installed Anvia components are up to date.\"\n : `Updated ${updatedCount} ${updatedCount === 1 ? \"file\" : \"files\"}.`,\n );\n}\n\nfunction reportDryRunResult(report: ReturnType<typeof updateInstalledItems>[\"report\"]): void {\n let changeCount = 0;\n\n for (const item of report) {\n if (!item.installed) {\n console.log(`Anvia ${item.name}: not installed.`);\n continue;\n }\n\n for (const file of item.files) {\n if (file.status !== \"up-to-date\") {\n changeCount += 1;\n }\n\n console.log(`Anvia ${item.name}: ${file.status} ${file.path}`);\n }\n }\n\n console.log(\n changeCount === 0\n ? \"Everything is up to date.\"\n : `Found ${changeCount} out-of-date ${changeCount === 1 ? \"file\" : \"files\"}. Re-run with --overwrite to apply.`,\n );\n}\n\nfunction printUsage(): void {\n console.log(`Usage:\n anvia init [next|vite] [--cwd <path>] [--force]\n anvia add <${registryItemNames.join(\"|\")}> [--cwd <path>] [--overwrite]\n anvia update [${registryItemNames.join(\"|\")}] [--cwd <path>] [--overwrite]\n anvia skills <init|update|list> [--claude] [--codex] [--cursor] [--agents] [--dir <path>] [--force] [--cwd <path>]`);\n}\n\ntry {\n main(process.argv.slice(2));\n} catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n}\n"],"mappings":"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","names":["result","changed"]}
package/dist/index.d.ts CHANGED
@@ -33,5 +33,85 @@ declare function addRegistryItem(name: RegistryItemName, options?: {
33
33
  overwrite?: boolean;
34
34
  }): void;
35
35
  declare function isRegistryItemName(value: string): value is RegistryItemName;
36
+ type InstalledFileStatus = "up-to-date" | "modified" | "missing";
37
+ type InstalledItemFile = {
38
+ filename: string;
39
+ path: string;
40
+ status: InstalledFileStatus;
41
+ };
42
+ type InstalledItemReport = {
43
+ name: RegistryItemName;
44
+ installed: boolean;
45
+ complete: boolean;
46
+ files: InstalledItemFile[];
47
+ };
48
+ declare function inspectInstalledItems(options?: {
49
+ cwd?: string;
50
+ items?: readonly RegistryItemName[];
51
+ registryDirectory?: string;
52
+ }): InstalledItemReport[];
53
+ declare function updateInstalledItems(options?: {
54
+ cwd?: string;
55
+ items?: readonly RegistryItemName[];
56
+ overwrite?: boolean;
57
+ registryDirectory?: string;
58
+ }): {
59
+ report: InstalledItemReport[];
60
+ updated: string[];
61
+ };
62
+ declare function closestRegistryItemName(value: string): RegistryItemName | undefined;
63
+
64
+ declare function bundledSkillsDirectory(): string;
65
+ declare function skillNames(options?: {
66
+ skillsDirectory?: string;
67
+ }): string[];
68
+ declare function skillsTargetDirectory(options?: {
69
+ cwd?: string;
70
+ dir?: string;
71
+ }): string;
72
+ declare function collectSkillFiles(root: string): string[];
73
+
74
+ type SkillFileStatus = "up-to-date" | "modified" | "missing";
75
+ type InstalledSkillFile = {
76
+ relativePath: string;
77
+ path: string;
78
+ status: SkillFileStatus;
79
+ };
80
+ type InstalledSkillReport = {
81
+ name: string;
82
+ installed: boolean;
83
+ complete: boolean;
84
+ files: InstalledSkillFile[];
85
+ };
86
+ declare const skillsTargetNames: readonly ["anvia", "claude", "codex", "cursor", "agents"];
87
+ type SkillsTarget = (typeof skillsTargetNames)[number];
88
+ declare function isSkillsTarget(value: string): value is SkillsTarget;
89
+ type SkillsTargetResult = {
90
+ target: SkillsTarget;
91
+ created: string[];
92
+ updated: string[];
93
+ skipped: number;
94
+ };
95
+ type SkillsWriteResult = {
96
+ report: InstalledSkillReport[];
97
+ created: string[];
98
+ updated: string[];
99
+ targets: SkillsTargetResult[];
100
+ };
101
+ type SkillsOptions = {
102
+ cwd?: string;
103
+ dir?: string;
104
+ skillsDirectory?: string;
105
+ targets?: readonly SkillsTarget[];
106
+ };
107
+ type SkillsWriteMode = "init" | "update";
108
+
109
+ declare function inspectInstalledSkills(options?: SkillsOptions): InstalledSkillReport[];
110
+ declare function initSkills(options?: SkillsOptions & {
111
+ force?: boolean;
112
+ }): SkillsWriteResult;
113
+ declare function updateSkills(options?: SkillsOptions & {
114
+ force?: boolean;
115
+ }): SkillsWriteResult;
36
116
 
37
- export { type AnviaRegistryItem, type RegistryItemName, addRegistryItem, createRegistryItem, initializeProject, isRegistryItemName, registryItemNames };
117
+ export { type AnviaRegistryItem, type InstalledFileStatus, type InstalledItemFile, type InstalledItemReport, type InstalledSkillFile, type InstalledSkillReport, type RegistryItemName, type SkillFileStatus, type SkillsOptions, type SkillsTarget, type SkillsTargetResult, type SkillsWriteMode, type SkillsWriteResult, addRegistryItem, bundledSkillsDirectory, closestRegistryItemName, collectSkillFiles, createRegistryItem, initSkills, initializeProject, inspectInstalledItems, inspectInstalledSkills, isRegistryItemName, isSkillsTarget, registryItemNames, skillNames, skillsTargetDirectory, skillsTargetNames, updateInstalledItems, updateSkills };
package/dist/index.js CHANGED
@@ -1,15 +1,39 @@
1
1
  import {
2
2
  addRegistryItem,
3
+ bundledSkillsDirectory,
4
+ closestRegistryItemName,
5
+ collectSkillFiles,
3
6
  createRegistryItem,
7
+ initSkills,
4
8
  initializeProject,
9
+ inspectInstalledItems,
10
+ inspectInstalledSkills,
5
11
  isRegistryItemName,
6
- registryItemNames
7
- } from "./chunk-TE2ODJOV.js";
12
+ isSkillsTarget,
13
+ registryItemNames,
14
+ skillNames,
15
+ skillsTargetDirectory,
16
+ skillsTargetNames,
17
+ updateInstalledItems,
18
+ updateSkills
19
+ } from "./chunk-ERCP4EIZ.js";
8
20
  export {
9
21
  addRegistryItem,
22
+ bundledSkillsDirectory,
23
+ closestRegistryItemName,
24
+ collectSkillFiles,
10
25
  createRegistryItem,
26
+ initSkills,
11
27
  initializeProject,
28
+ inspectInstalledItems,
29
+ inspectInstalledSkills,
12
30
  isRegistryItemName,
13
- registryItemNames
31
+ isSkillsTarget,
32
+ registryItemNames,
33
+ skillNames,
34
+ skillsTargetDirectory,
35
+ skillsTargetNames,
36
+ updateInstalledItems,
37
+ updateSkills
14
38
  };
15
39
  //# sourceMappingURL=index.js.map