skills-master 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bin.ts","../src/types.ts","../src/schema/projectConfig.ts","../src/core/yaml.ts","../src/emitters/util.ts","../src/emitters/claude.ts","../src/core/condense.ts","../src/emitters/cursor.ts","../src/emitters/copilot.ts","../src/emitters/agents.ts","../src/emitters/index.ts","../src/core/project.ts","../src/schema/lockfile.ts","../src/util/log.ts","../src/commands/init.ts","../src/content/source.ts","../src/core/discover.ts","../src/core/parse.ts","../src/schema/frontmatter.ts","../src/core/registry-build.ts","../src/core/install.ts","../src/core/compile.ts","../src/core/writer.ts","../src/core/markers.ts","../src/core/hash.ts","../src/core/gitignore.ts","../src/commands/add.ts","../src/commands/update.ts","../src/commands/remove.ts","../src/commands/doctor.ts","../src/commands/catalog.ts","../src/core/lint.ts","../src/commands/lint.ts","../src/commands/registry.ts","../src/schema/registry.ts","../src/commands/marketplace.ts","../src/commands/new.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { ALL_TARGETS, type TargetId } from \"./types\";\nimport { initCommand } from \"./commands/init\";\nimport { addCommand } from \"./commands/add\";\nimport { updateCommand } from \"./commands/update\";\nimport { removeCommand } from \"./commands/remove\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport { listCommand, searchCommand, viewCommand } from \"./commands/catalog\";\nimport { lintCommand } from \"./commands/lint\";\nimport { registryBuildCommand } from \"./commands/registry\";\nimport { marketplaceBuildCommand } from \"./commands/marketplace\";\nimport { newSkillCommand } from \"./commands/new\";\nimport { log } from \"./util/log\";\n\nconst VALID = new Set<string>(ALL_TARGETS);\n\nfunction parseTargets(value?: string): TargetId[] | undefined {\n if (!value) return undefined;\n if (value === \"all\") return ALL_TARGETS;\n const ids = value.split(\",\").map((s) => s.trim()).filter(Boolean);\n for (const id of ids) {\n if (!VALID.has(id)) {\n throw new Error(`Unknown target \"${id}\". Valid: ${[...VALID, \"all\"].join(\", \")}.`);\n }\n }\n return ids as TargetId[];\n}\n\nasync function run(fn: () => Promise<unknown> | unknown, exitOnFalse = false): Promise<void> {\n try {\n const result = await fn();\n if (exitOnFalse && result === false) process.exitCode = 1;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n}\n\nconst program = new Command();\nprogram\n .name(\"skills-master\")\n .description(\"Install tool-agnostic Apple development skills into any AI coding tool.\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"init\")\n .description(\"Detect tools and write skills-master.json\")\n .option(\"--target <list>\", \"comma list or 'all'\")\n .option(\"--ref <ref>\", \"content git ref\")\n .option(\"--no-commit\", \"gitignore generated files instead of committing them\")\n .option(\"--force\", \"overwrite an existing config\")\n .action((opts) =>\n run(() =>\n initCommand({\n cwd: process.cwd(),\n targets: parseTargets(opts.target),\n commit: opts.commit,\n contentRef: opts.ref,\n force: opts.force,\n }),\n ),\n );\n\nprogram\n .command(\"list\")\n .description(\"List available skills\")\n .option(\"--domain <domain>\", \"e.g. apple, android\")\n .option(\"--class <class>\")\n .option(\"--category <category>\")\n .option(\"--platform <platform>\")\n .option(\"--json\")\n .option(\"--content <dir>\", \"local skills directory\")\n .option(\"--ref <ref>\")\n .action((opts) =>\n run(() =>\n listCommand({\n cwd: process.cwd(),\n domain: opts.domain,\n class: opts.class,\n category: opts.category,\n platform: opts.platform,\n json: opts.json,\n content: opts.content,\n ref: opts.ref,\n }),\n ),\n );\n\nprogram\n .command(\"search <query>\")\n .description(\"Search skills by name, description, tags\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((query, opts) =>\n run(() => searchCommand({ cwd: process.cwd(), query, content: opts.content, ref: opts.ref })),\n );\n\nprogram\n .command(\"view <name>\")\n .description(\"Show a skill's metadata and body\")\n .option(\"--raw\", \"print the raw SKILL.md body\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((name, opts) =>\n run(() =>\n viewCommand({ cwd: process.cwd(), name, raw: opts.raw, content: opts.content, ref: opts.ref }),\n ),\n );\n\nprogram\n .command(\"add <names...>\")\n .description(\"Install skills (by name, category, or class) into your tools\")\n .option(\"--target <list>\", \"comma list or 'all'\")\n .option(\"--with-pairs\", \"also install paired (code<->design) skills\")\n .option(\"--dry-run\", \"preview without writing\")\n .option(\"--overwrite\", \"overwrite changed files without asking\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((names, opts) =>\n run(() =>\n addCommand({\n cwd: process.cwd(),\n names,\n targets: parseTargets(opts.target),\n withPairs: opts.withPairs,\n dryRun: opts.dryRun,\n overwrite: opts.overwrite,\n content: opts.content,\n ref: opts.ref,\n }),\n ),\n );\n\nprogram\n .command(\"update [names...]\")\n .description(\"Re-install skills whose content changed\")\n .option(\"--dry-run\")\n .option(\"--overwrite\", \"force re-install, replacing local edits\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((names, opts) =>\n run(() =>\n updateCommand({\n cwd: process.cwd(),\n names,\n dryRun: opts.dryRun,\n overwrite: opts.overwrite,\n content: opts.content,\n ref: opts.ref,\n }),\n ),\n );\n\nprogram\n .command(\"remove <names...>\")\n .description(\"Remove installed skills\")\n .option(\"--target <list>\", \"comma list or 'all'\")\n .option(\"--dry-run\")\n .action((names, opts) =>\n run(() =>\n removeCommand({ cwd: process.cwd(), names, targets: parseTargets(opts.target), dryRun: opts.dryRun }),\n ),\n );\n\nprogram\n .command(\"doctor\")\n .description(\"Check installed skills for drift and missing files\")\n .action(() => run(() => doctorCommand({ cwd: process.cwd() })));\n\nprogram\n .command(\"lint\")\n .description(\"Validate the skill library (maintainer command)\")\n .option(\"--content <dir>\")\n .action((opts) => run(() => lintCommand({ cwd: process.cwd(), content: opts.content }), true));\n\nprogram\n .command(\"new <spec>\")\n .description(\"Scaffold a new skill: class/category/name (maintainer command)\")\n .option(\"--content <dir>\")\n .option(\"--force\")\n .action((spec, opts) =>\n run(() => newSkillCommand({ cwd: process.cwd(), spec, content: opts.content, force: opts.force })),\n );\n\nconst registry = program.command(\"registry\").description(\"Registry maintenance\");\nregistry\n .command(\"build\")\n .description(\"Generate registry.json from the skill tree\")\n .option(\"--content <dir>\")\n .option(\"--check\", \"verify the committed registry.json is current (CI)\")\n .option(\"--version <v>\")\n .action((opts) =>\n run(\n () => registryBuildCommand({ cwd: process.cwd(), content: opts.content, check: opts.check, version: opts.version }),\n true,\n ),\n );\n\nconst marketplace = program.command(\"marketplace\").description(\"Claude marketplace maintenance\");\nmarketplace\n .command(\"build\")\n .description(\"Generate .claude-plugin/marketplace.json and per-class plugins\")\n .option(\"--content <dir>\")\n .option(\"--out <dir>\", \"output root\")\n .option(\"--version <v>\")\n .action((opts) =>\n run(() =>\n marketplaceBuildCommand({ cwd: process.cwd(), content: opts.content, out: opts.out, version: opts.version }),\n ),\n );\n\nprogram.parseAsync(process.argv);\n","/**\n * Shared types for the skills-master compiler.\n *\n * The canonical authored unit is a *skill*: a directory containing a `SKILL.md`\n * (frontmatter + body) plus optional on-demand resource files. An *emitter*\n * projects a parsed skill into the files a particular AI tool expects.\n */\n\nimport type { Frontmatter } from \"./schema/frontmatter\";\n\nexport type { Frontmatter } from \"./schema/frontmatter\";\n\n/** The four AI-tool targets shipped at launch. */\nexport type TargetId = \"claude\" | \"cursor\" | \"copilot\" | \"agents\";\n\nexport const ALL_TARGETS: TargetId[] = [\"claude\", \"cursor\", \"copilot\", \"agents\"];\n\n/** On-demand \"Level 3\" resource files that may sit beside a SKILL.md. */\nexport interface SkillResources {\n reference?: string;\n examples?: string;\n checklist?: string;\n}\n\nexport const RESOURCE_FILES = {\n reference: \"reference.md\",\n examples: \"examples.md\",\n checklist: \"checklist.md\",\n} as const;\n\nexport type ResourceKey = keyof typeof RESOURCE_FILES;\n\n/** A skill after its SKILL.md and resource files have been read and validated. */\nexport interface ParsedSkill {\n /** kebab-case name; equals the leaf folder name. */\n name: string;\n /** absolute path to the skill's source directory. */\n dir: string;\n /** path relative to the skills root, e.g. `code/app-frameworks/swiftdata-modeling`. */\n relPath: string;\n /** validated, normalized frontmatter. */\n frontmatter: Frontmatter;\n /** markdown body (everything after the frontmatter). */\n body: string;\n /** raw text of any present resource files. */\n resources: SkillResources;\n}\n\n/**\n * Output file modes:\n * - `whole` — the emitter owns the entire file (overwrite as a unit).\n * - `block` — the emitter owns only a marked region inside a shared file.\n */\nexport type FileMode = \"whole\" | \"block\";\n\nexport interface EmittedFile {\n /** path relative to the consuming project root. */\n path: string;\n /** for `whole`: the full file contents. for `block`: the managed region body. */\n contents: string;\n mode: FileMode;\n /** required for `block` mode — identifies the managed region (usually the skill name). */\n blockId?: string;\n /** for `block` mode — written into the BEGIN marker for drift detection. */\n blockVersion?: string;\n}\n\nexport interface EmitContext {\n /** absolute path to the consuming project root. */\n projectRoot: string;\n /** effective per-target output paths (already merged with defaults). */\n paths: Record<TargetId, string>;\n}\n\nexport interface Emitter {\n id: TargetId | (string & {});\n /** human label for logs. */\n label: string;\n /** detect whether this tool is present in a project (used by auto-detect). */\n detect(projectRoot: string): boolean;\n /** project a skill into target files. */\n emit(skill: ParsedSkill, ctx: EmitContext): EmittedFile[];\n}\n\n/** Result of applying a single EmittedFile to disk. */\nexport type WriteAction = \"created\" | \"updated\" | \"unchanged\" | \"skipped\";\n\nexport interface WriteResult {\n path: string;\n mode: FileMode;\n blockId?: string;\n action: WriteAction;\n}\n","import { z } from \"zod\";\nimport type { TargetId } from \"../types\";\n\nexport const TargetIdSchema = z.enum([\"claude\", \"cursor\", \"copilot\", \"agents\"]);\n\n/** Default output location per target, relative to the project root. */\nexport const DEFAULT_PATHS: Record<TargetId, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/rules\",\n copilot: \".github\",\n agents: \"AGENTS.md\",\n};\n\nexport const ProjectConfigSchema = z\n .object({\n $schema: z.string().optional(),\n /** Git ref of the content repo to install from (tag/branch/sha). */\n contentRef: z.string().default(\"main\"),\n /**\n * Targets to emit. Empty array means \"auto-detect on every run\".\n */\n targets: z.array(TargetIdSchema).default([]),\n /** Per-target output path overrides (merged over DEFAULT_PATHS). */\n paths: z\n .object({\n claude: z.string(),\n cursor: z.string(),\n copilot: z.string(),\n agents: z.string(),\n })\n .partial()\n .default({}),\n scope: z.enum([\"project\"]).default(\"project\"),\n /** true = commit generated files; false = add them to .gitignore. */\n commit: z.boolean().default(true),\n })\n .strict();\n\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\n\nexport const CONFIG_FILENAME = \"skills-master.json\";\nexport const LOCKFILE_NAME = \"skills-master.lock.json\";\n\n/** Resolve effective output paths by merging overrides over the defaults. */\nexport function resolvePaths(cfg: ProjectConfig): Record<TargetId, string> {\n return { ...DEFAULT_PATHS, ...cfg.paths } as Record<TargetId, string>;\n}\n","import YAML from \"yaml\";\n\n/**\n * Serialize a frontmatter object to a deterministic YAML block (no `---` fences).\n * Insertion order of keys is preserved, so emitters control field order.\n * Long strings are not wrapped (lineWidth: 0), keeping descriptions on one line.\n */\nexport function toYaml(obj: Record<string, unknown>): string {\n return YAML.stringify(obj, { lineWidth: 0 }).trimEnd();\n}\n\n/** Wrap a YAML block in `---` fences for embedding at the top of a Markdown file. */\nexport function frontmatterBlock(obj: Record<string, unknown>): string {\n return `---\\n${toYaml(obj)}\\n---`;\n}\n\n/**\n * Build a full Markdown document from a frontmatter object and a body.\n * Guarantees exactly one blank line between the frontmatter and the body.\n */\nexport function withFrontmatter(obj: Record<string, unknown>, body: string): string {\n return `${frontmatterBlock(obj)}\\n\\n${body.trim()}\\n`;\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Frontmatter } from \"../schema/frontmatter\";\n\n/** True when `rel` exists under the project root (used for tool auto-detection). */\nexport function existsRel(root: string, rel: string): boolean {\n return existsSync(join(root, rel));\n}\n\nconst ACRONYMS: Record<string, string> = {\n hig: \"HIG\",\n ui: \"UI\",\n ml: \"ML\",\n ar: \"AR\",\n av: \"AV\",\n os: \"OS\",\n ci: \"CI\",\n cd: \"CD\",\n url: \"URL\",\n api: \"API\",\n sf: \"SF\",\n spm: \"SPM\",\n ios: \"iOS\",\n ipados: \"iPadOS\",\n macos: \"macOS\",\n tvos: \"tvOS\",\n visionos: \"visionOS\",\n watchos: \"watchOS\",\n};\n\n/** Human title derived from a kebab-case skill name (e.g. \"hig-sheets\" → \"HIG Sheets\"). */\nexport function titleFromName(name: string): string {\n return name\n .split(\"-\")\n .filter(Boolean)\n .map((w) => ACRONYMS[w] ?? w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\n/** Comma-join a skill's globs, or undefined if it declares none. */\nexport function globsToString(fm: Frontmatter): string | undefined {\n const g = fm.globs;\n if (!g || g.length === 0) return undefined;\n return g.join(\",\");\n}\n\n/** True when the skill ships any on-demand resource files. */\nexport function hasResources(resources: {\n reference?: string;\n examples?: string;\n checklist?: string;\n}): boolean {\n return Boolean(resources.reference || resources.examples || resources.checklist);\n}\n","import { RESOURCE_FILES, type Emitter, type EmittedFile, type ResourceKey } from \"../types\";\nimport { withFrontmatter } from \"../core/yaml\";\nimport { existsRel } from \"./util\";\n\n/**\n * Claude Code emitter — the lossless, native projection.\n * Writes `.claude/skills/<name>/SKILL.md` plus verbatim copies of any resource\n * files, preserving progressive disclosure. The `x-skills-master` block is\n * dropped; the body (including links to resource files, which are co-located)\n * is kept exactly.\n */\nexport const claudeEmitter: Emitter = {\n id: \"claude\",\n label: \"Claude Code\",\n detect: (root) => existsRel(root, \".claude\"),\n emit(skill, ctx): EmittedFile[] {\n const dir = `${ctx.paths.claude}/${skill.name}`;\n const fm = {\n name: skill.frontmatter.name,\n description: skill.frontmatter.description,\n };\n const files: EmittedFile[] = [\n {\n path: `${dir}/SKILL.md`,\n contents: withFrontmatter(fm, skill.body),\n mode: \"whole\",\n },\n ];\n for (const key of Object.keys(RESOURCE_FILES) as ResourceKey[]) {\n const text = skill.resources[key];\n if (text) {\n files.push({\n path: `${dir}/${RESOURCE_FILES[key]}`,\n contents: text.trimEnd() + \"\\n\",\n mode: \"whole\",\n });\n }\n }\n return files;\n },\n};\n","/**\n * Condense a canonical SKILL.md body for single-file targets (Cursor, Copilot,\n * AGENTS.md) that cannot carry on-demand resource files.\n *\n * - Links to reference.md / examples.md / checklist.md are flattened to plain\n * text and a one-line pointer to the full skill is appended (\"drop-and-note\").\n * - The `## Open question` section can optionally be summarized to a single\n * tradeoff line for terse targets.\n */\n\nconst L3_LINK_RE =\n /\\[([^\\]]+)\\]\\((?:\\.\\/)?(reference|examples|checklist)\\.md(?:#[^)]*)?\\)/g;\n\nexport interface CondenseOptions {\n /** \"keep\" (default) leaves the section intact; \"summarize\" collapses it. */\n openQuestion?: \"keep\" | \"summarize\";\n /** whether the source skill had any resource files (drives the pointer note). */\n hadResources?: boolean;\n /** how to refer to the full skill in the appended note. */\n fullSkillNote?: string;\n}\n\nconst DEFAULT_NOTE =\n \"Extended reference and worked examples are available in the full Claude Code skill for this topic.\";\n\nexport function condenseBody(body: string, opts: CondenseOptions = {}): string {\n let out = body;\n let strippedLink = false;\n\n out = out.replace(L3_LINK_RE, (_m, text: string) => {\n strippedLink = true;\n return text;\n });\n\n if (opts.openQuestion === \"summarize\") {\n out = summarizeOpenQuestion(out);\n }\n\n out = out.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\n if (opts.hadResources || strippedLink) {\n out += `\\n\\n> ${opts.fullSkillNote ?? DEFAULT_NOTE}`;\n }\n\n return out + \"\\n\";\n}\n\nfunction summarizeOpenQuestion(body: string): string {\n const re = /^## Open question[ \\t]*\\n([\\s\\S]*?)(?=\\n## |\\s*$)/m;\n return body.replace(re, (_m, section: string) => {\n const firstPara = section.trim().split(/\\n\\s*\\n/)[0]?.replace(/\\s+/g, \" \").trim() ?? \"\";\n return `## Open question\\n\\nTradeoff: ${firstPara}\\n`;\n });\n}\n","import { type Emitter, type EmittedFile } from \"../types\";\nimport { withFrontmatter } from \"../core/yaml\";\nimport { condenseBody } from \"../core/condense\";\nimport { existsRel, globsToString, hasResources } from \"./util\";\n\n/**\n * Cursor emitter — `.cursor/rules/<name>.mdc`, a single file.\n * Frontmatter is exactly the three fields Cursor understands:\n * - `globs` present → Auto-Attached rule\n * - `globs` absent → Agent-Requested rule (description-driven)\n * A skills library never sets `alwaysApply: true` (that would inject every\n * skill into every chat).\n */\nexport const cursorEmitter: Emitter = {\n id: \"cursor\",\n label: \"Cursor\",\n detect: (root) => existsRel(root, \".cursor\"),\n emit(skill, ctx): EmittedFile[] {\n const globs = globsToString(skill.frontmatter);\n const fm: Record<string, unknown> = {\n description: skill.frontmatter.description,\n };\n if (globs) fm.globs = globs;\n fm.alwaysApply = false;\n\n const body = condenseBody(skill.body, {\n openQuestion: \"keep\",\n hadResources: hasResources(skill.resources),\n });\n\n return [\n {\n path: `${ctx.paths.cursor}/${skill.name}.mdc`,\n contents: withFrontmatter(fm, body),\n mode: \"whole\",\n },\n ];\n },\n};\n","import { type Emitter, type EmittedFile } from \"../types\";\nimport { withFrontmatter } from \"../core/yaml\";\nimport { condenseBody } from \"../core/condense\";\nimport { existsRel, globsToString, hasResources, titleFromName } from \"./util\";\n\n/**\n * GitHub Copilot emitter — two outputs:\n * 1. `.github/instructions/<name>.instructions.md` (whole file) with the\n * required `applyTo` glob and the condensed body.\n * 2. a one-line pointer block in `.github/copilot-instructions.md` (managed\n * via sentinel markers) so the always-loaded root file stays small.\n */\nexport const copilotEmitter: Emitter = {\n id: \"copilot\",\n label: \"GitHub Copilot\",\n detect: (root) => existsRel(root, \".github\"),\n emit(skill, ctx): EmittedFile[] {\n const base = ctx.paths.copilot; // e.g. \".github\"\n const instructionsPath = `${base}/instructions/${skill.name}.instructions.md`;\n const applyTo = globsToString(skill.frontmatter) ?? \"**\";\n\n const fm = {\n applyTo,\n description: skill.frontmatter.description,\n };\n const body = condenseBody(skill.body, {\n openQuestion: \"keep\",\n hadResources: hasResources(skill.resources),\n });\n\n const pointer = `For ${titleFromName(skill.name)} guidance, see \\`${instructionsPath}\\`.`;\n\n return [\n {\n path: instructionsPath,\n contents: withFrontmatter(fm, body),\n mode: \"whole\",\n },\n {\n path: `${base}/copilot-instructions.md`,\n contents: pointer,\n mode: \"block\",\n blockId: skill.name,\n blockVersion: skill.frontmatter[\"x-skills-master\"].version,\n },\n ];\n },\n};\n","import { type Emitter, type EmittedFile } from \"../types\";\nimport { condenseBody } from \"../core/condense\";\nimport { existsRel, hasResources, titleFromName } from \"./util\";\n\n/**\n * AGENTS.md emitter — the broad cross-tool standard. Plain Markdown, no\n * frontmatter (per the spec). Each skill becomes a `###` section inside a\n * sentinel-managed block so installs compose and updates stay surgical.\n * Bodies are summarized aggressively (this file is read in full by many tools).\n */\nexport const agentsEmitter: Emitter = {\n id: \"agents\",\n label: \"AGENTS.md\",\n detect: (root) => existsRel(root, \"AGENTS.md\"),\n emit(skill, ctx): EmittedFile[] {\n const body = condenseBody(skill.body, {\n openQuestion: \"summarize\",\n hadResources: hasResources(skill.resources),\n });\n const section = `### ${titleFromName(skill.name)}\\n\\n${body.trim()}`;\n return [\n {\n path: ctx.paths.agents,\n contents: section,\n mode: \"block\",\n blockId: skill.name,\n blockVersion: skill.frontmatter[\"x-skills-master\"].version,\n },\n ];\n },\n};\n","import type { Emitter, TargetId } from \"../types\";\nimport { claudeEmitter } from \"./claude\";\nimport { cursorEmitter } from \"./cursor\";\nimport { copilotEmitter } from \"./copilot\";\nimport { agentsEmitter } from \"./agents\";\n\n/**\n * The emitter registry. Adding support for a new tool (Windsurf, Cline, …) is a\n * one-line change here plus a new emitter file — the rest of the pipeline is\n * generic over the `Emitter` interface.\n */\nexport const EMITTERS: Emitter[] = [\n claudeEmitter,\n cursorEmitter,\n copilotEmitter,\n agentsEmitter,\n];\n\nconst BY_ID = new Map<string, Emitter>(EMITTERS.map((e) => [e.id, e]));\n\nexport function getEmitter(id: string): Emitter | undefined {\n return BY_ID.get(id);\n}\n\n/** Detect which targets are present in a project. */\nexport function detectTargets(projectRoot: string): TargetId[] {\n return EMITTERS.filter((e) => e.detect(projectRoot)).map((e) => e.id as TargetId);\n}\n\nexport { claudeEmitter, cursorEmitter, copilotEmitter, agentsEmitter };\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n CONFIG_FILENAME,\n LOCKFILE_NAME,\n ProjectConfigSchema,\n type ProjectConfig,\n} from \"../schema/projectConfig\";\nimport { LockfileSchema, emptyLockfile, type Lockfile } from \"../schema/lockfile\";\n\nexport function configPath(root: string): string {\n return join(root, CONFIG_FILENAME);\n}\nexport function lockfilePath(root: string): string {\n return join(root, LOCKFILE_NAME);\n}\n\nexport function loadConfig(root: string): ProjectConfig | null {\n const p = configPath(root);\n if (!existsSync(p)) return null;\n return ProjectConfigSchema.parse(JSON.parse(readFileSync(p, \"utf8\")));\n}\n\n/** Load config, or return parsed defaults if none exists. */\nexport function loadConfigOrDefault(root: string): ProjectConfig {\n return loadConfig(root) ?? ProjectConfigSchema.parse({});\n}\n\nexport function saveConfig(root: string, cfg: ProjectConfig): void {\n const withSchema = { $schema: \"https://skills-master.dev/schema/config.json\", ...cfg };\n writeFileSync(configPath(root), JSON.stringify(withSchema, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport function loadLockfile(root: string): Lockfile {\n const p = lockfilePath(root);\n if (!existsSync(p)) return emptyLockfile();\n return LockfileSchema.parse(JSON.parse(readFileSync(p, \"utf8\")));\n}\n\nexport function saveLockfile(root: string, lock: Lockfile): void {\n writeFileSync(lockfilePath(root), JSON.stringify(lock, null, 2) + \"\\n\", \"utf8\");\n}\n","import { z } from \"zod\";\n\n/** Records, per target, which files an install produced and their content hash. */\nexport const EmittedTargetSchema = z.object({\n /** whole-file outputs owned by this target for this skill. */\n files: z.array(z.string()).default([]),\n /** shared file this skill writes a managed block into (block-mode targets). */\n block: z.string().optional(),\n /** sha256 of the concatenated emitted contents, for drift detection. */\n hash: z.string(),\n});\n\nexport const LockedSkillSchema = z.object({\n /** resolved skill version at install time. */\n version: z.string(),\n /** sha256 of the canonical SKILL.md + resource files at install time. */\n sourceHash: z.string(),\n /** targets this skill was emitted to. */\n emitted: z.record(z.string(), EmittedTargetSchema),\n});\n\nexport const LockfileSchema = z.object({\n lockfileVersion: z.literal(1).default(1),\n contentRef: z.string().default(\"main\"),\n skills: z.record(z.string(), LockedSkillSchema).default({}),\n});\n\nexport type EmittedTarget = z.infer<typeof EmittedTargetSchema>;\nexport type LockedSkill = z.infer<typeof LockedSkillSchema>;\nexport type Lockfile = z.infer<typeof LockfileSchema>;\n\nexport function emptyLockfile(contentRef = \"main\"): Lockfile {\n return { lockfileVersion: 1, contentRef, skills: {} };\n}\n","/* Minimal, dependency-free logger so core modules don't couple to a prompt lib. */\n\nlet quiet = false;\nexport function setQuiet(v: boolean): void {\n quiet = v;\n}\n\nconst sym = {\n info: \"•\",\n ok: \"✓\",\n warn: \"!\",\n err: \"✗\",\n};\n\nexport const log = {\n plain(msg: string): void {\n if (!quiet) console.log(msg);\n },\n info(msg: string): void {\n if (!quiet) console.log(`${sym.info} ${msg}`);\n },\n success(msg: string): void {\n if (!quiet) console.log(`${sym.ok} ${msg}`);\n },\n warn(msg: string): void {\n if (!quiet) console.warn(`${sym.warn} ${msg}`);\n },\n error(msg: string): void {\n console.error(`${sym.err} ${msg}`);\n },\n};\n","import { ProjectConfigSchema, type ProjectConfig } from \"../schema/projectConfig\";\nimport { ALL_TARGETS, type TargetId } from \"../types\";\nimport { detectTargets } from \"../emitters\";\nimport { loadConfig, saveConfig } from \"../core/project\";\nimport { log } from \"../util/log\";\n\nexport interface InitOptions {\n cwd: string;\n /** explicit target set; if omitted, auto-detect (falling back to all). */\n targets?: TargetId[];\n commit?: boolean;\n contentRef?: string;\n force?: boolean;\n}\n\nexport function initCommand(opts: InitOptions): ProjectConfig {\n const existing = loadConfig(opts.cwd);\n if (existing && !opts.force) {\n log.warn(`skills-master.json already exists — leaving it untouched (use --force to overwrite).`);\n return existing;\n }\n\n let targets = opts.targets;\n if (!targets || targets.length === 0) {\n const detected = detectTargets(opts.cwd);\n if (detected.length > 0) {\n targets = detected;\n log.info(`Detected tools: ${detected.join(\", \")}`);\n } else {\n targets = ALL_TARGETS;\n log.info(`No tools detected — defaulting to all targets (${ALL_TARGETS.join(\", \")}).`);\n }\n }\n\n const cfg = ProjectConfigSchema.parse({\n contentRef: opts.contentRef ?? \"main\",\n targets,\n commit: opts.commit ?? true,\n });\n saveConfig(opts.cwd, cfg);\n log.success(`Wrote skills-master.json (targets: ${targets.join(\", \")}, commit: ${cfg.commit}).`);\n return cfg;\n}\n","import { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, isAbsolute, join, resolve } from \"node:path\";\nimport { findSkillDirs } from \"../core/discover\";\nimport { loadSkill } from \"../core/parse\";\nimport { buildRegistry } from \"../core/registry-build\";\nimport type { Registry } from \"../schema/registry\";\nimport type { ParsedSkill } from \"../types\";\n\n/** Default content repo (override with SKILLS_MASTER_REPO). */\nconst DEFAULT_REPO = \"github:iChintanSoni/skills-master\";\n\n/** A resolved, on-disk skills tree the CLI reads from. */\nexport class ContentSource {\n constructor(public readonly root: string) {}\n\n skillDirs(): string[] {\n return findSkillDirs(this.root);\n }\n\n findDir(name: string): string | undefined {\n const dirs = this.skillDirs();\n return dirs.find((d) => basename(d) === name) ?? dirs.find((d) => safeName(d, this.root) === name);\n }\n\n loadSkill(name: string): ParsedSkill {\n const dir = this.findDir(name);\n if (!dir) throw new Error(`Skill \"${name}\" not found in content at ${this.root}`);\n return loadSkill(dir, this.root);\n }\n\n registry(): Registry {\n return buildRegistry(this.root);\n }\n}\n\nfunction safeName(dir: string, root: string): string {\n try {\n return loadSkill(dir, root).name;\n } catch {\n return \"\";\n }\n}\n\nexport interface ResolveContentOptions {\n /** explicit path to a local skills directory. */\n content?: string;\n /** git ref for remote fetch. */\n ref?: string;\n /** start dir for the upward repo search. */\n cwd?: string;\n}\n\n/**\n * Resolve where skill content lives, in priority order:\n * 1. explicit `--content <dir>`\n * 2. SKILLS_MASTER_CONTENT env var\n * 3. a `skills/` directory in this repo (dev convenience, searched upward)\n * 4. remote fetch via giget (published content)\n */\nexport async function resolveContent(opts: ResolveContentOptions = {}): Promise<ContentSource> {\n if (opts.content) {\n const root = isAbsolute(opts.content) ? opts.content : resolve(process.cwd(), opts.content);\n return new ContentSource(root);\n }\n const env = process.env.SKILLS_MASTER_CONTENT;\n if (env) return new ContentSource(resolve(env));\n\n const local = findLocalSkillsDir(opts.cwd ?? process.cwd());\n if (local) return new ContentSource(local);\n\n return new ContentSource(await fetchRemote(opts.ref ?? \"main\"));\n}\n\n/** Walk upward looking for a sibling `skills/` directory (the dev repo). */\nfunction findLocalSkillsDir(start: string): string | null {\n let dir = resolve(start);\n for (let i = 0; i < 8; i++) {\n const candidate = join(dir, \"skills\");\n if (existsSync(join(dir, \"pnpm-workspace.yaml\")) && existsSync(candidate)) return candidate;\n const parent = resolve(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/** Download the `skills/` subtree of the content repo to a local cache. */\nasync function fetchRemote(ref: string): Promise<string> {\n const repo = process.env.SKILLS_MASTER_REPO ?? DEFAULT_REPO;\n const cacheDir = join(homedir(), \".skills-master-cache\", ref.replace(/[^\\w.-]/g, \"_\"));\n const { downloadTemplate } = await import(\"giget\");\n const { dir } = await downloadTemplate(`${repo}/skills#${ref}`, {\n dir: cacheDir,\n force: true,\n forceClean: true,\n });\n return dir;\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\n\nconst SKILL_FILE = \"SKILL.md\";\nconst IGNORE = new Set([\"node_modules\", \".git\", \"dist\", \".cache\"]);\n\n/**\n * Recursively find every directory under `skillsRoot` that contains a SKILL.md.\n * Returns absolute directory paths, sorted for deterministic output.\n */\nexport function findSkillDirs(skillsRoot: string): string[] {\n const found: string[] = [];\n if (!existsSync(skillsRoot)) return found;\n\n const walk = (dir: string): void => {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n if (entries.includes(SKILL_FILE)) found.push(dir);\n for (const entry of entries) {\n if (IGNORE.has(entry) || entry.startsWith(\".\")) continue;\n const full = join(dir, entry);\n let isDir = false;\n try {\n isDir = statSync(full).isDirectory();\n } catch {\n isDir = false;\n }\n if (isDir) walk(full);\n }\n };\n\n walk(skillsRoot);\n return found.sort();\n}\n\n/** Path of a skill dir relative to the skills root (uses forward slashes). */\nexport function relPathOf(skillsRoot: string, dir: string): string {\n return relative(skillsRoot, dir).split(/[\\\\/]/).join(\"/\");\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport { FrontmatterSchema, type Frontmatter } from \"../schema/frontmatter\";\nimport {\n RESOURCE_FILES,\n type ParsedSkill,\n type ResourceKey,\n type SkillResources,\n} from \"../types\";\nimport { relPathOf } from \"./discover\";\n\nexport interface RawSkill {\n dir: string;\n relPath: string;\n /** leaf folder name (the expected `name`). */\n folderName: string;\n /** unvalidated frontmatter object. */\n data: Record<string, unknown>;\n body: string;\n resources: SkillResources;\n skillMdPath: string;\n /** full unparsed SKILL.md text (used for YAML-hazard linting). */\n rawText: string;\n}\n\n/** Read a skill directory's SKILL.md and resource files without validating. */\nexport function loadRawSkill(dir: string, skillsRoot: string): RawSkill {\n const skillMdPath = join(dir, \"SKILL.md\");\n const rawText = readFileSync(skillMdPath, \"utf8\");\n const parsed = matter(rawText);\n\n const resources: SkillResources = {};\n for (const key of Object.keys(RESOURCE_FILES) as ResourceKey[]) {\n const p = join(dir, RESOURCE_FILES[key]);\n if (existsSync(p)) resources[key] = readFileSync(p, \"utf8\");\n }\n\n return {\n dir,\n relPath: relPathOf(skillsRoot, dir),\n folderName: basename(dir),\n data: parsed.data as Record<string, unknown>,\n body: parsed.content.replace(/^\\n+/, \"\").trimEnd(),\n resources,\n skillMdPath,\n rawText,\n };\n}\n\nexport class SkillValidationError extends Error {\n constructor(\n public readonly relPath: string,\n public readonly issues: string[],\n ) {\n super(`Invalid skill \"${relPath}\":\\n - ${issues.join(\"\\n - \")}`);\n this.name = \"SkillValidationError\";\n }\n}\n\n/** Validate raw frontmatter; returns the typed frontmatter or a list of issues. */\nexport function validateFrontmatter(\n data: Record<string, unknown>,\n): { ok: true; value: Frontmatter } | { ok: false; issues: string[] } {\n const result = FrontmatterSchema.safeParse(data);\n if (result.success) return { ok: true, value: result.data };\n const issues = result.error.issues.map((i) => {\n const path = i.path.join(\".\");\n return path ? `${path}: ${i.message}` : i.message;\n });\n return { ok: false, issues };\n}\n\n/** Load and validate a skill directory into a ParsedSkill (throws on failure). */\nexport function loadSkill(dir: string, skillsRoot: string): ParsedSkill {\n const raw = loadRawSkill(dir, skillsRoot);\n const validated = validateFrontmatter(raw.data);\n if (!validated.ok) throw new SkillValidationError(raw.relPath, validated.issues);\n return {\n name: validated.value.name,\n dir: raw.dir,\n relPath: raw.relPath,\n frontmatter: validated.value,\n body: raw.body,\n resources: raw.resources,\n };\n}\n","import { z } from \"zod\";\nimport semver from \"semver\";\n\n/** kebab-case, used for skill `name` and `pairs_with` references. */\nexport const NAME_RE = /^[a-z0-9-]{1,64}$/;\nexport const ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport const StabilitySchema = z.enum([\"stable\", \"emerging\", \"contested\"]);\nexport type Stability = z.infer<typeof StabilitySchema>;\n\n/**\n * Skill classes are reusable across domains (Apple, Android, web, …):\n * - code → produces compilable code\n * - design → produces UX/design critique (e.g. Apple HIG, Material)\n * - lang-tooling → cross-cutting language/build/test/ship guidance\n * - overview → decision-guidance routers\n */\nexport const SkillClassSchema = z.enum([\n \"code\",\n \"design\",\n \"lang-tooling\",\n \"overview\",\n]);\nexport type SkillClass = z.infer<typeof SkillClassSchema>;\n\n/** Maps a skill `class` to its directory name within a domain in `skills/<domain>/`. */\nexport const CLASS_DIR: Record<SkillClass, string> = {\n code: \"code\",\n design: \"design\",\n \"lang-tooling\": \"lang-tooling\",\n overview: \"overviews\",\n};\n\n/**\n * Our private metadata block. Stripped from every projected output.\n * Domain-agnostic by design: `domain` namespaces a technology ecosystem\n * (apple, android, web, …); `platforms` and `requires` are free-form so each\n * domain defines its own vocabulary (ios/android/wear-os; {ios:\"17\"} / {android:\"14\"}).\n */\nexport const XSkillsMasterSchema = z\n .object({\n domain: z.string().min(1),\n class: SkillClassSchema,\n category: z.string().min(1),\n platforms: z.array(z.string().min(1)).min(1),\n /** domain-defined version requirements, e.g. { ios: \"17\", swift: \"6.0\" }. */\n requires: z.record(z.string(), z.string()).optional(),\n pairs_with: z.array(z.string().regex(NAME_RE)).default([]),\n /** citation URLs to canonical docs — never verbatim content. */\n sources: z.array(z.string().url()).default([]),\n snapshot_date: z.string().regex(ISO_DATE_RE, \"must be an ISO date (YYYY-MM-DD)\"),\n stability: StabilitySchema,\n version: z\n .string()\n .refine((v) => semver.valid(v) != null, \"must be a valid semver version\"),\n })\n .strict();\nexport type XSkillsMaster = z.infer<typeof XSkillsMasterSchema>;\n\n/** `globs` may be authored as a string or array; normalized to an array. */\nconst GlobsSchema = z\n .union([z.string(), z.array(z.string())])\n .transform((g) => (Array.isArray(g) ? g : [g]))\n .optional();\n\nexport const FrontmatterSchema = z\n .object({\n name: z.string().regex(NAME_RE, \"must be kebab-case ([a-z0-9-], <=64 chars)\"),\n description: z\n .string()\n .min(1, \"description is required\")\n .max(1024, \"description must be <= 1024 characters\"),\n globs: GlobsSchema,\n tags: z.array(z.string()).default([]),\n \"x-skills-master\": XSkillsMasterSchema,\n })\n // Tolerate tool-native extras (e.g. allowed-tools) without failing validation.\n .passthrough();\nexport type Frontmatter = z.infer<typeof FrontmatterSchema>;\n","import { findSkillDirs } from \"./discover\";\nimport { loadSkill } from \"./parse\";\nimport type { Registry, RegistryEntry } from \"../schema/registry\";\n\n/**\n * Build the catalog from the skill tree. Output is deterministic (no timestamp)\n * so a committed `registry.json` can be drift-checked in CI.\n */\nexport function buildRegistry(skillsRoot: string, version = \"0.1.0\"): Registry {\n const dirs = findSkillDirs(skillsRoot);\n const skills: RegistryEntry[] = dirs.map((dir) => {\n const s = loadSkill(dir, skillsRoot);\n const xm = s.frontmatter[\"x-skills-master\"];\n return {\n name: s.name,\n domain: xm.domain,\n class: xm.class,\n category: xm.category,\n description: s.frontmatter.description,\n platforms: xm.platforms,\n stability: xm.stability,\n version: xm.version,\n tags: s.frontmatter.tags ?? [],\n pairs_with: xm.pairs_with,\n path: s.relPath,\n resources: {\n reference: Boolean(s.resources.reference),\n examples: Boolean(s.resources.examples),\n checklist: Boolean(s.resources.checklist),\n },\n };\n });\n skills.sort((a, b) => a.name.localeCompare(b.name));\n return {\n $schema: \"https://skills-master.dev/schema/registry.json\",\n version,\n skills,\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ParsedSkill, TargetId } from \"../types\";\nimport type { LockedSkill } from \"../schema/lockfile\";\nimport { compileSkill } from \"./compile\";\nimport { applyFiles, type ApplyOptions, type DetailedWriteResult } from \"./writer\";\nimport { sha256 } from \"./hash\";\n\nexport interface InstallResult {\n name: string;\n version: string;\n results: DetailedWriteResult[];\n locked: LockedSkill;\n}\n\n/** Hash a skill's canonical source for drift detection. */\nexport function sourceHashOf(skill: ParsedSkill): string {\n const xm = skill.frontmatter[\"x-skills-master\"];\n return sha256(\n skill.relPath,\n xm.version,\n skill.frontmatter.description,\n skill.body,\n skill.resources.reference ?? \"\",\n skill.resources.examples ?? \"\",\n skill.resources.checklist ?? \"\",\n );\n}\n\n/**\n * Hash the given whole-file outputs as they currently exist on disk. Both the\n * lockfile (at install time) and the `update`/`doctor` drift checks use this\n * one function, so a clean install always reconciles.\n */\nexport function diskHash(projectRoot: string, relPaths: string[]): string {\n const sorted = [...relPaths].sort((a, b) => a.localeCompare(b));\n const parts: string[] = [];\n for (const p of sorted) {\n const abs = join(projectRoot, p);\n const contents = existsSync(abs) ? readFileSync(abs, \"utf8\") : \"<<missing>>\";\n parts.push(p, contents);\n }\n return sha256(...parts);\n}\n\n/** Compile a skill to the given targets and write the outputs to a project. */\nexport function installSkill(\n projectRoot: string,\n skill: ParsedSkill,\n targets: TargetId[],\n paths: Record<TargetId, string>,\n opts: ApplyOptions = {},\n): InstallResult {\n const compiled = compileSkill(skill, targets, { projectRoot, paths });\n const allFiles = compiled.flatMap((c) => c.files);\n const results = applyFiles(projectRoot, allFiles, opts);\n\n const emitted: LockedSkill[\"emitted\"] = {};\n for (const c of compiled) {\n const whole = c.files.filter((f) => f.mode === \"whole\").map((f) => f.path);\n const block = c.files.find((f) => f.mode === \"block\")?.path;\n // Hash covers only whole-file outputs (block files are marker-managed and\n // safe to reconcile). Computed from disk after writing so the lockfile\n // records what actually landed; in dry-run nothing is written or saved.\n const hash = opts.dryRun ? sha256(\"dry-run\", ...whole) : diskHash(projectRoot, whole);\n emitted[c.target] = { files: whole, ...(block ? { block } : {}), hash };\n }\n\n const version = skill.frontmatter[\"x-skills-master\"].version;\n return {\n name: skill.name,\n version,\n results,\n locked: { version, sourceHash: sourceHashOf(skill), emitted },\n };\n}\n","import type { EmitContext, EmittedFile, ParsedSkill, TargetId } from \"../types\";\nimport { getEmitter } from \"../emitters\";\n\nexport interface CompiledTarget {\n target: TargetId;\n files: EmittedFile[];\n}\n\n/** Run the emitters for the requested targets over a single skill. */\nexport function compileSkill(\n skill: ParsedSkill,\n targets: TargetId[],\n ctx: EmitContext,\n): CompiledTarget[] {\n const out: CompiledTarget[] = [];\n for (const target of targets) {\n const emitter = getEmitter(target);\n if (!emitter) throw new Error(`Unknown target: ${target}`);\n out.push({ target, files: emitter.emit(skill, ctx) });\n }\n return out;\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, rmdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { EmittedFile, WriteAction, WriteResult } from \"../types\";\nimport { hasBlock, removeBlock, upsertBlock } from \"./markers\";\n\nexport type ConflictChoice = \"overwrite\" | \"skip\";\n\nexport interface ApplyOptions {\n dryRun?: boolean;\n /** force-overwrite changed whole-files without asking. */\n overwrite?: boolean;\n /** called for a changed whole-file when neither overwrite nor dryRun is set. */\n onConflict?: (path: string) => ConflictChoice;\n}\n\nexport interface DetailedWriteResult extends WriteResult {\n /** previous file contents (whole-file) when it changed — for diff previews. */\n before?: string;\n /** new file contents (whole-file) when it changed. */\n after?: string;\n}\n\nfunction ensureDir(absPath: string): void {\n mkdirSync(dirname(absPath), { recursive: true });\n}\n\nfunction applyWhole(\n projectRoot: string,\n file: EmittedFile,\n opts: ApplyOptions,\n): DetailedWriteResult {\n const abs = join(projectRoot, file.path);\n const exists = existsSync(abs);\n const next = file.contents;\n\n if (!exists) {\n if (!opts.dryRun) {\n ensureDir(abs);\n writeFileSync(abs, next, \"utf8\");\n }\n return { path: file.path, mode: \"whole\", action: \"created\", after: next };\n }\n\n const current = readFileSync(abs, \"utf8\");\n if (current === next) {\n return { path: file.path, mode: \"whole\", action: \"unchanged\" };\n }\n\n // changed\n let choice: ConflictChoice = \"overwrite\";\n if (!opts.overwrite) {\n choice = opts.onConflict ? opts.onConflict(file.path) : opts.dryRun ? \"overwrite\" : \"skip\";\n }\n if (choice === \"skip\") {\n return { path: file.path, mode: \"whole\", action: \"skipped\", before: current, after: next };\n }\n if (!opts.dryRun) writeFileSync(abs, next, \"utf8\");\n return { path: file.path, mode: \"whole\", action: \"updated\", before: current, after: next };\n}\n\nfunction applyBlock(\n projectRoot: string,\n file: EmittedFile,\n opts: ApplyOptions,\n): DetailedWriteResult {\n const abs = join(projectRoot, file.path);\n const exists = existsSync(abs);\n const current = exists ? readFileSync(abs, \"utf8\") : \"\";\n const blockId = file.blockId!;\n const next = upsertBlock(current, blockId, file.contents, file.blockVersion);\n\n let action: WriteAction;\n if (current === next) action = \"unchanged\";\n else if (!exists || !hasBlock(current, blockId)) action = \"created\";\n else action = \"updated\";\n\n if (action !== \"unchanged\" && !opts.dryRun) {\n ensureDir(abs);\n writeFileSync(abs, next, \"utf8\");\n }\n return { path: file.path, mode: \"block\", blockId, action };\n}\n\n/** Apply a batch of emitted files to a project. */\nexport function applyFiles(\n projectRoot: string,\n files: EmittedFile[],\n opts: ApplyOptions = {},\n): DetailedWriteResult[] {\n return files.map((f) =>\n f.mode === \"block\" ? applyBlock(projectRoot, f, opts) : applyWhole(projectRoot, f, opts),\n );\n}\n\n/** Remove now-empty ancestor directories of the given files, up to (not incl.) the project root. */\nexport function pruneEmptyDirs(projectRoot: string, relFilePaths: string[], dryRun = false): void {\n if (dryRun) return;\n const seen = new Set<string>();\n for (const rel of relFilePaths) {\n let dir = dirname(join(projectRoot, rel));\n while (dir.startsWith(projectRoot) && dir !== projectRoot && !seen.has(dir)) {\n seen.add(dir);\n try {\n if (existsSync(dir) && readdirSync(dir).length === 0) {\n rmdirSync(dir);\n dir = dirname(dir);\n } else break;\n } catch {\n break;\n }\n }\n }\n}\n\n/** Remove a whole-file output. */\nexport function removeWholeFile(projectRoot: string, relPath: string, dryRun = false): boolean {\n const abs = join(projectRoot, relPath);\n if (!existsSync(abs)) return false;\n if (!dryRun) rmSync(abs);\n return true;\n}\n\n/**\n * Remove a managed block from a shared file. Deletes the file if it becomes\n * empty. Returns true if anything changed.\n */\nexport function removeBlockFromFile(\n projectRoot: string,\n relPath: string,\n blockId: string,\n dryRun = false,\n): boolean {\n const abs = join(projectRoot, relPath);\n if (!existsSync(abs)) return false;\n const current = readFileSync(abs, \"utf8\");\n if (!hasBlock(current, blockId)) return false;\n const next = removeBlock(current, blockId);\n if (!dryRun) {\n if (next.trim().length === 0) rmSync(abs);\n else writeFileSync(abs, next, \"utf8\");\n }\n return true;\n}\n","/**\n * Sentinel-marker management for shared files (AGENTS.md, copilot-instructions.md).\n *\n * A managed region looks like:\n *\n * <!-- BEGIN skills-master:<id> v<version> -->\n * ...generated content...\n * <!-- END skills-master:<id> -->\n *\n * Only the bytes between (and including) the markers are ever touched, so any\n * hand-written content elsewhere in the file is preserved.\n */\n\nconst PREFIX = \"skills-master\";\n\nfunction escapeRe(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function beginMarker(id: string, version?: string): string {\n return version\n ? `<!-- BEGIN ${PREFIX}:${id} v${version} -->`\n : `<!-- BEGIN ${PREFIX}:${id} -->`;\n}\n\nexport function endMarker(id: string): string {\n return `<!-- END ${PREFIX}:${id} -->`;\n}\n\nfunction blockRegex(id: string): RegExp {\n const esc = escapeRe(id);\n return new RegExp(\n `[ \\\\t]*<!-- BEGIN ${PREFIX}:${esc}(?: v[^>]*)? -->[\\\\s\\\\S]*?<!-- END ${PREFIX}:${esc} -->`,\n );\n}\n\n/** Build a complete managed block (markers + body). */\nexport function renderBlock(id: string, body: string, version?: string): string {\n return `${beginMarker(id, version)}\\n${body.trim()}\\n${endMarker(id)}`;\n}\n\nexport function hasBlock(file: string, id: string): boolean {\n return blockRegex(id).test(file);\n}\n\n/** Read the inner body of a managed block, or null if absent. */\nexport function readBlock(file: string, id: string): string | null {\n const m = blockRegex(id).exec(file);\n if (!m) return null;\n const inner = m[0]\n .replace(new RegExp(`^[ \\\\t]*<!-- BEGIN ${PREFIX}:${escapeRe(id)}(?: v[^>]*)? -->\\\\n?`), \"\")\n .replace(new RegExp(`\\\\n?<!-- END ${PREFIX}:${escapeRe(id)} -->$`), \"\");\n return inner;\n}\n\n/** Read the version recorded in a block's BEGIN marker, or null. */\nexport function readBlockVersion(file: string, id: string): string | null {\n const m = new RegExp(\n `<!-- BEGIN ${PREFIX}:${escapeRe(id)} v([^\\\\s>]+) -->`,\n ).exec(file);\n return m && m[1] ? m[1] : null;\n}\n\n/**\n * Insert or replace a managed block. Returns the new file contents.\n * If the block is absent it is appended, separated by a blank line.\n */\nexport function upsertBlock(\n file: string,\n id: string,\n body: string,\n version?: string,\n): string {\n const block = renderBlock(id, body, version);\n const re = blockRegex(id);\n if (re.test(file)) {\n return file.replace(re, block);\n }\n const base = file.replace(/\\s+$/, \"\");\n if (base.length === 0) return block + \"\\n\";\n return `${base}\\n\\n${block}\\n`;\n}\n\n/**\n * Remove a managed block (and a trailing blank line). Returns the new contents.\n * If the file becomes empty (only whitespace), returns the empty string so the\n * caller can delete it.\n */\nexport function removeBlock(file: string, id: string): string {\n const re = new RegExp(blockRegex(id).source + `\\\\n?\\\\n?`);\n const next = file.replace(re, \"\");\n return next.trim().length === 0 ? \"\" : next.replace(/\\n{3,}/g, \"\\n\\n\").trimEnd() + \"\\n\";\n}\n","import { createHash } from \"node:crypto\";\n\n/** Deterministic sha256 of one or more strings, prefixed `sha256:`. */\nexport function sha256(...parts: string[]): string {\n const h = createHash(\"sha256\");\n for (const p of parts) {\n h.update(p, \"utf8\");\n h.update(\"\u0000\"); // domain separator between parts\n }\n return \"sha256:\" + h.digest(\"hex\");\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/** Ensure each entry appears in the project's .gitignore (idempotent). */\nexport function ensureGitignored(root: string, entries: string[]): void {\n const p = join(root, \".gitignore\");\n const current = existsSync(p) ? readFileSync(p, \"utf8\") : \"\";\n const lines = new Set(current.split(\"\\n\").map((l) => l.trim()));\n const missing = entries.filter((e) => !lines.has(e));\n if (missing.length === 0) return;\n const header = current.includes(\"# skills-master\") ? \"\" : \"\\n# skills-master generated outputs\\n\";\n const next = current.replace(/\\s*$/, \"\") + header + missing.join(\"\\n\") + \"\\n\";\n writeFileSync(p, next, \"utf8\");\n}\n","import { resolvePaths } from \"../schema/projectConfig\";\nimport { ALL_TARGETS, type TargetId } from \"../types\";\nimport { detectTargets } from \"../emitters\";\nimport { resolveContent } from \"../content/source\";\nimport { installSkill } from \"../core/install\";\nimport {\n loadConfig,\n loadConfigOrDefault,\n loadLockfile,\n saveConfig,\n saveLockfile,\n} from \"../core/project\";\nimport { ensureGitignored } from \"../core/gitignore\";\nimport type { ConflictChoice } from \"../core/writer\";\nimport { log } from \"../util/log\";\n\nexport interface AddOptions {\n cwd: string;\n /** skill names, category names, or class names to install. */\n names: string[];\n targets?: TargetId[];\n content?: string;\n ref?: string;\n withPairs?: boolean;\n dryRun?: boolean;\n overwrite?: boolean;\n /** interactive conflict resolver (bin supplies this on a TTY). */\n onConflict?: (path: string) => ConflictChoice;\n}\n\nexport interface AddResult {\n targets: TargetId[];\n installed: { name: string; version: string }[];\n skipped: string[];\n}\n\nexport async function addCommand(opts: AddOptions): Promise<AddResult> {\n const cfg = loadConfigOrDefault(opts.cwd);\n const hadConfig = loadConfig(opts.cwd) != null;\n\n let targets = opts.targets?.length ? opts.targets : cfg.targets;\n if (!targets.length) targets = detectTargets(opts.cwd);\n if (!targets.length) targets = ALL_TARGETS;\n\n const content = await resolveContent({\n content: opts.content,\n ref: opts.ref ?? cfg.contentRef,\n cwd: opts.cwd,\n });\n const registry = content.registry();\n const byName = new Map(registry.skills.map((s) => [s.name, s]));\n\n // Resolve tokens → concrete skill names (name > category > class).\n const selected = new Set<string>();\n const skipped: string[] = [];\n for (const token of opts.names) {\n if (byName.has(token)) {\n selected.add(token);\n continue;\n }\n const byCategory = registry.skills.filter((s) => s.category === token);\n const byClass = registry.skills.filter((s) => s.class === token);\n const group = byCategory.length ? byCategory : byClass;\n if (group.length) {\n group.forEach((s) => selected.add(s.name));\n } else {\n log.warn(`No skill, category, or class matches \"${token}\".`);\n skipped.push(token);\n }\n }\n\n if (opts.withPairs) {\n for (const name of [...selected]) {\n for (const pair of byName.get(name)?.pairs_with ?? []) {\n if (byName.has(pair)) selected.add(pair);\n else log.warn(`Paired skill \"${pair}\" (from \"${name}\") is not in the registry.`);\n }\n }\n }\n\n if (selected.size === 0) {\n log.error(\"Nothing to install.\");\n return { targets, installed: [], skipped };\n }\n\n const paths = resolvePaths(cfg);\n const lock = loadLockfile(opts.cwd);\n lock.contentRef = opts.ref ?? cfg.contentRef;\n const installed: { name: string; version: string }[] = [];\n\n const prefix = opts.dryRun ? \"[dry-run] \" : \"\";\n for (const name of [...selected].sort()) {\n const skill = content.loadSkill(name);\n const result = installSkill(opts.cwd, skill, targets, paths, {\n dryRun: opts.dryRun,\n overwrite: opts.overwrite,\n onConflict: opts.onConflict,\n });\n if (!opts.dryRun) lock.skills[name] = result.locked;\n installed.push({ name, version: result.version });\n\n for (const r of result.results) {\n const tag = r.mode === \"block\" ? `${r.path} [${r.blockId}]` : r.path;\n log.info(`${prefix}${r.action.padEnd(9)} ${tag}`);\n }\n }\n\n if (!opts.dryRun) {\n saveLockfile(opts.cwd, lock);\n if (!hadConfig) {\n saveConfig(opts.cwd, { ...cfg, targets });\n log.info(\"Wrote skills-master.json.\");\n }\n if (!cfg.commit) {\n const outs = targets.map((t) => paths[t]);\n ensureGitignored(opts.cwd, outs);\n }\n }\n\n log.success(\n `${prefix}Installed ${installed.length} skill(s) into ${targets.length} target(s): ${targets.join(\", \")}.`,\n );\n return { targets, installed, skipped };\n}\n","import { resolvePaths } from \"../schema/projectConfig\";\nimport type { TargetId } from \"../types\";\nimport { resolveContent } from \"../content/source\";\nimport { diskHash, installSkill, sourceHashOf } from \"../core/install\";\nimport { loadConfigOrDefault, loadLockfile, saveLockfile } from \"../core/project\";\nimport type { ConflictChoice } from \"../core/writer\";\nimport { log } from \"../util/log\";\n\nexport interface UpdateOptions {\n cwd: string;\n names?: string[];\n content?: string;\n ref?: string;\n dryRun?: boolean;\n overwrite?: boolean;\n onConflict?: (path: string) => ConflictChoice;\n}\n\nexport interface UpdateResult {\n updated: string[];\n upToDate: string[];\n skipped: string[];\n}\n\nexport async function updateCommand(opts: UpdateOptions): Promise<UpdateResult> {\n const cfg = loadConfigOrDefault(opts.cwd);\n const lock = loadLockfile(opts.cwd);\n const ref = opts.ref ?? cfg.contentRef;\n const updated: string[] = [];\n const upToDate: string[] = [];\n const skipped: string[] = [];\n\n const names = opts.names?.length ? opts.names : Object.keys(lock.skills);\n if (names.length === 0) {\n log.info(\"No installed skills to update.\");\n return { updated, upToDate, skipped };\n }\n\n const content = await resolveContent({ content: opts.content, ref, cwd: opts.cwd });\n const paths = resolvePaths(cfg);\n const prefix = opts.dryRun ? \"[dry-run] \" : \"\";\n\n for (const name of names.sort()) {\n const locked = lock.skills[name];\n if (!locked) {\n log.warn(`\"${name}\" is not installed — run \\`add\\` first.`);\n skipped.push(name);\n continue;\n }\n\n let skill;\n try {\n skill = content.loadSkill(name);\n } catch {\n log.warn(`\"${name}\" no longer exists in the content library.`);\n skipped.push(name);\n continue;\n }\n\n const refChanged = lock.contentRef !== ref;\n const sourceChanged = locked.sourceHash !== sourceHashOf(skill);\n if (!opts.overwrite && !sourceChanged && !refChanged) {\n upToDate.push(name);\n continue;\n }\n\n // Re-emit to exactly the targets this skill was installed to.\n const targets = Object.keys(locked.emitted) as TargetId[];\n\n // Detect user edits to owned whole-files since install.\n const userEdited = targets.some((t) => {\n const e = locked.emitted[t];\n return e && diskHash(opts.cwd, e.files) !== e.hash;\n });\n if (userEdited && !opts.overwrite && !opts.onConflict) {\n log.warn(`${prefix}\"${name}\" has local edits — skipping (use --overwrite to replace).`);\n skipped.push(name);\n continue;\n }\n\n const result = installSkill(opts.cwd, skill, targets, paths, {\n dryRun: opts.dryRun,\n overwrite: opts.overwrite || !userEdited,\n onConflict: opts.onConflict,\n });\n if (!opts.dryRun) lock.skills[name] = result.locked;\n updated.push(name);\n for (const r of result.results) {\n if (r.action === \"unchanged\") continue;\n const tag = r.mode === \"block\" ? `${r.path} [${r.blockId}]` : r.path;\n log.info(`${prefix}${r.action.padEnd(9)} ${tag}`);\n }\n }\n\n if (!opts.dryRun) {\n lock.contentRef = ref;\n saveLockfile(opts.cwd, lock);\n }\n\n log.success(\n `${prefix}Updated ${updated.length}, up-to-date ${upToDate.length}, skipped ${skipped.length}.`,\n );\n return { updated, upToDate, skipped };\n}\n","import type { TargetId } from \"../types\";\nimport { loadLockfile, saveLockfile } from \"../core/project\";\nimport { pruneEmptyDirs, removeBlockFromFile, removeWholeFile } from \"../core/writer\";\nimport { log } from \"../util/log\";\n\nexport interface RemoveOptions {\n cwd: string;\n names: string[];\n /** restrict removal to specific targets; default = every target the skill was installed to. */\n targets?: TargetId[];\n dryRun?: boolean;\n}\n\nexport interface RemoveResult {\n removed: string[];\n missing: string[];\n}\n\nexport function removeCommand(opts: RemoveOptions): RemoveResult {\n const lock = loadLockfile(opts.cwd);\n const removed: string[] = [];\n const missing: string[] = [];\n const prefix = opts.dryRun ? \"[dry-run] \" : \"\";\n\n for (const name of opts.names) {\n const locked = lock.skills[name];\n if (!locked) {\n log.warn(`\"${name}\" is not installed.`);\n missing.push(name);\n continue;\n }\n\n const targets = (opts.targets?.length\n ? opts.targets\n : (Object.keys(locked.emitted) as TargetId[])\n ).filter((t) => locked.emitted[t]);\n\n const wholeRemoved: string[] = [];\n for (const t of targets) {\n const e = locked.emitted[t]!;\n for (const file of e.files) {\n if (removeWholeFile(opts.cwd, file, opts.dryRun)) {\n wholeRemoved.push(file);\n log.info(`${prefix}removed ${file}`);\n }\n }\n if (e.block && removeBlockFromFile(opts.cwd, e.block, name, opts.dryRun)) {\n log.info(`${prefix}unblocked ${e.block} [${name}]`);\n }\n if (!opts.dryRun) delete locked.emitted[t];\n }\n pruneEmptyDirs(opts.cwd, wholeRemoved, opts.dryRun);\n\n if (!opts.dryRun) {\n if (Object.keys(locked.emitted).length === 0) delete lock.skills[name];\n }\n removed.push(name);\n }\n\n if (!opts.dryRun) saveLockfile(opts.cwd, lock);\n log.success(`${prefix}Removed ${removed.length} skill(s).`);\n return { removed, missing };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { diskHash } from \"../core/install\";\nimport { loadConfig, loadLockfile } from \"../core/project\";\nimport { hasBlock } from \"../core/markers\";\nimport { log } from \"../util/log\";\n\nexport interface DoctorOptions {\n cwd: string;\n}\n\nexport interface DoctorReport {\n problems: string[];\n ok: boolean;\n}\n\nexport function doctorCommand(opts: DoctorOptions): DoctorReport {\n const problems: string[] = [];\n const note = (msg: string) => problems.push(msg);\n\n const cfg = loadConfig(opts.cwd);\n if (!cfg) {\n log.warn(\"No skills-master.json found — run `skills-master init`.\");\n } else {\n log.info(`Config targets: ${cfg.targets.length ? cfg.targets.join(\", \") : \"(auto-detect)\"}`);\n }\n\n const lock = loadLockfile(opts.cwd);\n const names = Object.keys(lock.skills);\n if (names.length === 0) {\n log.info(\"No skills installed.\");\n return { problems, ok: true };\n }\n\n for (const name of names) {\n const locked = lock.skills[name]!;\n for (const [target, e] of Object.entries(locked.emitted)) {\n for (const file of e.files) {\n if (!existsSync(join(opts.cwd, file))) note(`${name}: missing ${target} file ${file}`);\n }\n if (e.files.every((f) => existsSync(join(opts.cwd, f)))) {\n if (diskHash(opts.cwd, e.files) !== e.hash) {\n note(`${name}: local edits to ${target} output(s) (run \\`update --overwrite\\` to reset)`);\n }\n }\n if (e.block) {\n const abs = join(opts.cwd, e.block);\n if (!existsSync(abs) || !hasBlock(readFileSync(abs, \"utf8\"), name)) {\n note(`${name}: missing managed block in ${e.block}`);\n }\n }\n }\n }\n\n if (problems.length === 0) {\n log.success(`All ${names.length} installed skill(s) look healthy.`);\n } else {\n for (const p of problems) log.warn(p);\n log.plain(`\\n${problems.length} problem(s) found.`);\n }\n return { problems, ok: problems.length === 0 };\n}\n","import { resolveContent } from \"../content/source\";\nimport type { Registry, RegistryEntry } from \"../schema/registry\";\nimport { log } from \"../util/log\";\n\nexport interface CatalogQuery {\n content?: string;\n ref?: string;\n cwd?: string;\n}\n\nasync function registryOf(q: CatalogQuery): Promise<Registry> {\n const content = await resolveContent({ content: q.content, ref: q.ref, cwd: q.cwd });\n return content.registry();\n}\n\nexport interface ListOptions extends CatalogQuery {\n domain?: string;\n class?: string;\n category?: string;\n platform?: string;\n json?: boolean;\n}\n\nexport async function listCommand(opts: ListOptions): Promise<RegistryEntry[]> {\n const reg = await registryOf(opts);\n let skills = reg.skills;\n if (opts.domain) skills = skills.filter((s) => s.domain === opts.domain);\n if (opts.class) skills = skills.filter((s) => s.class === opts.class);\n if (opts.category) skills = skills.filter((s) => s.category === opts.category);\n if (opts.platform) {\n const platform = opts.platform;\n skills = skills.filter((s) => s.platforms.includes(platform));\n }\n\n if (opts.json) {\n log.plain(JSON.stringify(skills, null, 2));\n return skills;\n }\n\n if (skills.length === 0) {\n log.info(\"No skills match.\");\n return skills;\n }\n\n const groups = new Map<string, RegistryEntry[]>();\n for (const s of skills) {\n const key = `${s.domain}/${s.class}/${s.category}`;\n (groups.get(key) ?? groups.set(key, []).get(key)!).push(s);\n }\n for (const [group, entries] of [...groups].sort()) {\n log.plain(`\\n${group}`);\n for (const s of entries) {\n const flag = s.stability === \"stable\" ? \"\" : ` (${s.stability})`;\n log.plain(` ${s.name} v${s.version}${flag}`);\n log.plain(` ${truncate(s.description, 96)}`);\n }\n }\n log.plain(`\\n${skills.length} skill(s).`);\n return skills;\n}\n\nexport interface SearchOptions extends CatalogQuery {\n query: string;\n}\n\nexport async function searchCommand(opts: SearchOptions): Promise<RegistryEntry[]> {\n const reg = await registryOf(opts);\n const q = opts.query.toLowerCase();\n const hits = reg.skills.filter((s) =>\n [s.name, s.description, s.domain, s.category, s.class, ...s.tags]\n .join(\" \")\n .toLowerCase()\n .includes(q),\n );\n if (hits.length === 0) {\n log.info(`No matches for \"${opts.query}\".`);\n return hits;\n }\n for (const s of hits) {\n log.plain(`${s.name} (${s.class}/${s.category}) v${s.version}`);\n log.plain(` ${truncate(s.description, 96)}`);\n }\n log.plain(`\\n${hits.length} match(es).`);\n return hits;\n}\n\nexport interface ViewOptions extends CatalogQuery {\n name: string;\n raw?: boolean;\n}\n\nexport async function viewCommand(opts: ViewOptions): Promise<void> {\n const content = await resolveContent({ content: opts.content, ref: opts.ref, cwd: opts.cwd });\n const skill = content.loadSkill(opts.name);\n const xm = skill.frontmatter[\"x-skills-master\"];\n if (opts.raw) {\n log.plain(skill.body);\n return;\n }\n log.plain(`${skill.name} v${xm.version} [${xm.domain}/${xm.class}/${xm.category}] ${xm.stability}`);\n log.plain(`platforms: ${xm.platforms.join(\", \")}`);\n if (xm.requires) {\n log.plain(`requires: ${Object.entries(xm.requires).map(([k, v]) => `${k} ${v}`).join(\", \")}`);\n }\n if (xm.pairs_with.length) log.plain(`pairs with: ${xm.pairs_with.join(\", \")}`);\n log.plain(`\\n${skill.frontmatter.description}\\n`);\n log.plain(`sources:`);\n for (const url of xm.sources) log.plain(` ${url}`);\n const res = Object.entries(skill.resources).filter(([, v]) => v).map(([k]) => k);\n if (res.length) log.plain(`\\nresource files: ${res.join(\", \")}`);\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : s.slice(0, n - 1) + \"…\";\n}\n","import type { Frontmatter } from \"../schema/frontmatter\";\nimport { findSkillDirs, relPathOf } from \"./discover\";\nimport { loadRawSkill, validateFrontmatter } from \"./parse\";\n\nexport type DiagnosticLevel = \"error\" | \"warn\";\n\nexport interface Diagnostic {\n relPath: string;\n level: DiagnosticLevel;\n message: string;\n}\n\nexport interface LintResult {\n diagnostics: Diagnostic[];\n skillCount: number;\n errorCount: number;\n warnCount: number;\n}\n\nconst CANONICAL_HEADINGS = [\n \"## When to use\",\n \"## Core guidance\",\n \"## Pitfalls\",\n \"## References\",\n \"## See also\",\n];\nconst MAX_BODY_LINES = 500;\nconst WARN_BODY_LINES = 450;\n\nfunction today(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\ninterface Loaded {\n relPath: string;\n folderName: string;\n fm?: Frontmatter;\n body: string;\n}\n\nexport function lintSkills(skillsRoot: string): LintResult {\n const dirs = findSkillDirs(skillsRoot);\n const diagnostics: Diagnostic[] = [];\n const loaded: Loaded[] = [];\n const byName = new Map<string, Frontmatter>();\n\n for (const dir of dirs) {\n let raw;\n try {\n raw = loadRawSkill(dir, skillsRoot);\n } catch (err) {\n diagnostics.push({\n relPath: relPathOf(skillsRoot, dir),\n level: \"error\",\n message: `failed to parse SKILL.md: ${err instanceof Error ? err.message.split(\"\\n\")[0] : String(err)}`,\n });\n continue;\n }\n\n // YAML hazard: an unquoted scalar containing \" #\" is silently truncated as\n // a comment (e.g. \"@Test, #expect\" loses everything from \"#expect\" on).\n for (const line of raw.rawText.split(\"\\n\")) {\n const m = /^(\\s*)(name|description|category):\\s+(?![\"'])(.*\\s#.*)$/.exec(line);\n if (m) {\n diagnostics.push({\n relPath: raw.relPath,\n level: \"warn\",\n message: `frontmatter \"${m[2]}\" contains \" #\", which YAML reads as a comment — quote the value`,\n });\n }\n }\n\n const v = validateFrontmatter(raw.data);\n if (!v.ok) {\n for (const issue of v.issues) {\n diagnostics.push({ relPath: raw.relPath, level: \"error\", message: issue });\n }\n loaded.push({ relPath: raw.relPath, folderName: raw.folderName, body: raw.body });\n continue;\n }\n loaded.push({ relPath: raw.relPath, folderName: raw.folderName, fm: v.value, body: raw.body });\n byName.set(v.value.name, v.value);\n }\n\n // Skill names must be globally unique (the registry and `add` key on name).\n const nameDirs = new Map<string, string[]>();\n for (const s of loaded) {\n const n = s.fm?.name ?? s.folderName;\n (nameDirs.get(n) ?? nameDirs.set(n, []).get(n)!).push(s.relPath);\n }\n for (const [name, paths] of nameDirs) {\n if (paths.length > 1) {\n for (const p of paths) {\n diagnostics.push({ relPath: p, level: \"error\", message: `duplicate skill name \"${name}\" (also at ${paths.filter((x) => x !== p).join(\", \")})` });\n }\n }\n }\n\n const todayStr = today();\n\n for (const s of loaded) {\n const push = (level: DiagnosticLevel, message: string) =>\n diagnostics.push({ relPath: s.relPath, level, message });\n if (!s.fm) continue;\n const fm = s.fm;\n const xm = fm[\"x-skills-master\"];\n\n // name == folder name\n if (fm.name !== s.folderName) {\n push(\"error\", `name \"${fm.name}\" must equal the folder name \"${s.folderName}\"`);\n }\n\n // description shape (soft)\n if (!/use when/i.test(fm.description)) {\n push(\"warn\", `description should include a \"Use when ...\" trigger clause`);\n }\n\n // snapshot_date not in the future\n if (xm.snapshot_date > todayStr) {\n push(\"error\", `snapshot_date ${xm.snapshot_date} is in the future`);\n }\n\n // contested ⇒ Open question section\n if (xm.stability === \"contested\" && !/^## Open question\\b/m.test(s.body)) {\n push(\"error\", `stability is \"contested\" but no \"## Open question\" section is present`);\n }\n\n // body length\n const lineCount = s.body.split(\"\\n\").length;\n if (lineCount > MAX_BODY_LINES) {\n push(\"error\", `SKILL.md body is ${lineCount} lines (max ${MAX_BODY_LINES}); move depth into reference.md/examples.md`);\n } else if (lineCount > WARN_BODY_LINES) {\n push(\"warn\", `SKILL.md body is ${lineCount} lines (approaching the ${MAX_BODY_LINES}-line cap)`);\n }\n\n // domain should match the top path segment\n if (!s.relPath.startsWith(`${xm.domain}/`)) {\n push(\"warn\", `domain \"${xm.domain}\" does not match the top folder of \"${s.relPath}\"`);\n }\n\n // sources should be present and be https documentation URLs\n if (xm.sources.length === 0) {\n push(\"warn\", `no sources — add at least one canonical documentation URL`);\n }\n for (const url of xm.sources) {\n if (!/^https:\\/\\//.test(url)) {\n push(\"warn\", `sources entry should be an https URL: ${url}`);\n }\n }\n\n // canonical headings\n for (const heading of CANONICAL_HEADINGS) {\n if (!s.body.includes(heading)) {\n push(\"warn\", `missing recommended section \"${heading}\"`);\n }\n }\n\n // pairs_with referential integrity (bidirectional)\n for (const partner of xm.pairs_with) {\n const partnerFm = byName.get(partner);\n if (!partnerFm) {\n push(\"error\", `pairs_with references unknown skill \"${partner}\"`);\n continue;\n }\n if (!partnerFm[\"x-skills-master\"].pairs_with.includes(fm.name)) {\n push(\"error\", `pairs_with \"${partner}\" is not reciprocated (add \"${fm.name}\" to its pairs_with)`);\n }\n }\n }\n\n const errorCount = diagnostics.filter((d) => d.level === \"error\").length;\n const warnCount = diagnostics.filter((d) => d.level === \"warn\").length;\n return { diagnostics, skillCount: dirs.length, errorCount, warnCount };\n}\n","import { resolveContent } from \"../content/source\";\nimport { lintSkills } from \"../core/lint\";\nimport { log } from \"../util/log\";\n\nexport interface LintCmdOptions {\n content?: string;\n cwd?: string;\n}\n\n/** Lint the skill library. Returns true when there are no errors. */\nexport async function lintCommand(opts: LintCmdOptions): Promise<boolean> {\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const result = lintSkills(content.root);\n\n for (const d of result.diagnostics) {\n const line = `${d.level === \"error\" ? \"✗\" : \"!\"} ${d.relPath}: ${d.message}`;\n if (d.level === \"error\") log.error(line);\n else log.warn(line);\n }\n\n log.plain(\n `\\nLinted ${result.skillCount} skill(s): ${result.errorCount} error(s), ${result.warnCount} warning(s).`,\n );\n return result.errorCount === 0;\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { resolveContent } from \"../content/source\";\nimport { buildRegistry } from \"../core/registry-build\";\nimport { REGISTRY_FILENAME } from \"../schema/registry\";\nimport { log } from \"../util/log\";\n\nexport interface RegistryBuildOptions {\n content?: string;\n cwd?: string;\n /** when true, verify the committed registry.json is up to date (CI mode). */\n check?: boolean;\n version?: string;\n}\n\n/** Build (or verify) registry.json from the skill tree. Returns true on success. */\nexport async function registryBuildCommand(opts: RegistryBuildOptions): Promise<boolean> {\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const registry = buildRegistry(content.root, opts.version ?? \"0.1.0\");\n const json = JSON.stringify(registry, null, 2) + \"\\n\";\n const outPath = join(content.root, REGISTRY_FILENAME);\n\n if (opts.check) {\n const current = existsSync(outPath) ? readFileSync(outPath, \"utf8\") : \"\";\n if (current !== json) {\n log.error(`registry.json is out of date — run \\`registry build\\` and commit the result.`);\n return false;\n }\n log.success(`registry.json is up to date (${registry.skills.length} skills).`);\n return true;\n }\n\n writeFileSync(outPath, json, \"utf8\");\n log.success(`Wrote ${REGISTRY_FILENAME} (${registry.skills.length} skills).`);\n return true;\n}\n","import { z } from \"zod\";\nimport { SkillClassSchema, StabilitySchema } from \"./frontmatter\";\n\n/** One catalog entry. Generated from the skill tree by `registry build`. */\nexport const RegistryEntrySchema = z.object({\n name: z.string(),\n domain: z.string(),\n class: SkillClassSchema,\n category: z.string(),\n description: z.string(),\n platforms: z.array(z.string()),\n stability: StabilitySchema,\n version: z.string(),\n tags: z.array(z.string()).default([]),\n pairs_with: z.array(z.string()).default([]),\n /** path relative to the skills root. */\n path: z.string(),\n /** which on-demand resource files exist. */\n resources: z.object({\n reference: z.boolean(),\n examples: z.boolean(),\n checklist: z.boolean(),\n }),\n});\n\nexport const RegistrySchema = z.object({\n $schema: z.string().optional(),\n /** aggregate library version (bumped on release). */\n version: z.string().default(\"0.1.0\"),\n generatedAt: z.string().optional(),\n skills: z.array(RegistryEntrySchema).default([]),\n});\n\nexport type RegistryEntry = z.infer<typeof RegistryEntrySchema>;\nexport type Registry = z.infer<typeof RegistrySchema>;\n\nexport const REGISTRY_FILENAME = \"registry.json\";\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { resolveContent } from \"../content/source\";\nimport { claudeEmitter } from \"../emitters\";\nimport { applyFiles } from \"../core/writer\";\nimport type { EmitContext, EmittedFile, TargetId } from \"../types\";\nimport type { SkillClass } from \"../schema/frontmatter\";\nimport { log } from \"../util/log\";\n\nconst CLASS_LABEL: Record<SkillClass, string> = {\n code: \"code skills (frameworks & APIs)\",\n design: \"design-review skills\",\n \"lang-tooling\": \"language, build, test & ship skills\",\n overview: \"decision-guidance routers\",\n};\n\nconst CLASS_CATEGORY: Record<SkillClass, string> = {\n code: \"development\",\n design: \"design\",\n \"lang-tooling\": \"development\",\n overview: \"development\",\n};\n\nfunction pluginName(domain: string, cls: SkillClass): string {\n const clsSeg = cls === \"overview\" ? \"overviews\" : cls;\n return `skills-master-${domain}-${clsSeg}`;\n}\n\nfunction titleCase(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport interface MarketplaceBuildOptions {\n content?: string;\n cwd?: string;\n /** output root for .claude-plugin/ and plugins/ (defaults to the repo root above skills/). */\n out?: string;\n version?: string;\n}\n\nexport async function marketplaceBuildCommand(opts: MarketplaceBuildOptions): Promise<void> {\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const out = resolve(opts.out ?? dirname(content.root));\n const version = opts.version ?? \"0.1.0\";\n\n // Group emitted files by (domain, class).\n const groups = new Map<string, { domain: string; cls: SkillClass; files: EmittedFile[]; count: number }>();\n\n for (const dir of content.skillDirs()) {\n const skill = content.loadSkill(dir.split(/[\\\\/]/).pop()!);\n const xm = skill.frontmatter[\"x-skills-master\"];\n const key = `${xm.domain}:${xm.class}`;\n const name = pluginName(xm.domain, xm.class);\n const ctx: EmitContext = {\n projectRoot: out,\n paths: {\n claude: `plugins/${name}/skills`,\n cursor: \"\",\n copilot: \"\",\n agents: \"\",\n } as Record<TargetId, string>,\n };\n const files = claudeEmitter.emit(skill, ctx);\n const g = groups.get(key) ?? { domain: xm.domain, cls: xm.class, files: [], count: 0 };\n g.files.push(...files);\n g.count += 1;\n groups.set(key, g);\n }\n\n const plugins: {\n name: string;\n source: string;\n description: string;\n version: string;\n category: string;\n }[] = [];\n\n for (const { domain, cls, files, count } of groups.values()) {\n const name = pluginName(domain, cls);\n applyFiles(out, files, { overwrite: true });\n\n const description = `${titleCase(domain)} ${CLASS_LABEL[cls]}.`;\n const pluginDir = join(out, \"plugins\", name, \".claude-plugin\");\n mkdirSync(pluginDir, { recursive: true });\n const manifest = {\n name,\n version,\n description,\n author: { name: \"skills-master contributors\" },\n };\n writeFileSync(join(pluginDir, \"plugin.json\"), JSON.stringify(manifest, null, 2) + \"\\n\", \"utf8\");\n\n plugins.push({ name, source: `./plugins/${name}`, description, version, category: CLASS_CATEGORY[cls] });\n log.info(`Built ${name} (${count} skills).`);\n }\n\n plugins.sort((a, b) => a.name.localeCompare(b.name));\n const marketplace = {\n $schema: \"https://www.schemastore.org/claude-code-marketplace.json\",\n name: \"skills-master\",\n owner: { name: \"skills-master contributors\" },\n plugins,\n };\n const mpDir = join(out, \".claude-plugin\");\n mkdirSync(mpDir, { recursive: true });\n writeFileSync(join(mpDir, \"marketplace.json\"), JSON.stringify(marketplace, null, 2) + \"\\n\", \"utf8\");\n log.success(`Wrote .claude-plugin/marketplace.json (${plugins.length} plugins).`);\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { resolveContent } from \"../content/source\";\nimport { CLASS_DIR, SkillClassSchema, type SkillClass } from \"../schema/frontmatter\";\nimport { log } from \"../util/log\";\n\nexport interface NewSkillOptions {\n /** \"domain/class/category/name\", e.g. \"apple/code/app-frameworks/swiftui-foo\". */\n spec: string;\n content?: string;\n cwd?: string;\n force?: boolean;\n}\n\nfunction template(domain: string, cls: SkillClass, category: string, name: string): string {\n const today = new Date().toISOString().slice(0, 10);\n return `---\nname: ${name}\ndescription: TODO — one-line, third person. Use when <triggers go here>.\nglobs:\n - \"**/*\"\ntags: []\nx-skills-master:\n domain: ${domain}\n class: ${cls}\n category: ${category}\n platforms: [${domain}]\n requires: {}\n pairs_with: []\n sources: []\n snapshot_date: \"${today}\"\n stability: emerging\n version: 0.1.0\n---\n\n## When to use\n\nTODO — when should an agent reach for this skill?\n\n## Core guidance\n\nTODO — the do/don't, idioms, and best practices (original prose, no copied docs).\n\n## Platform notes\n\nTODO — platform-specific caveats.\n\n## Pitfalls\n\nTODO — common mistakes.\n\n## References\n\n- **Documentation:** [TODO](https://developer.apple.com/documentation/...)\n- **Human Interface Guidelines:** [TODO](https://developer.apple.com/design/human-interface-guidelines/...)\n- **WWDC:** [TODO](https://developer.apple.com/videos/...)\n\n## See also\n\nTODO — paired skills referenced by name.\n`;\n}\n\nexport async function newSkillCommand(opts: NewSkillOptions): Promise<string> {\n const parts = opts.spec.split(\"/\").filter(Boolean);\n if (parts.length < 4) {\n throw new Error(`Expected \"domain/class/category/name\", got \"${opts.spec}\".`);\n }\n const domain = parts[0]!;\n const cls = SkillClassSchema.parse(parts[1]);\n const category = parts[2]!;\n const name = parts[parts.length - 1]!;\n\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const dir = join(content.root, domain, CLASS_DIR[cls], ...parts.slice(2));\n const skillMd = join(dir, \"SKILL.md\");\n\n if (existsSync(skillMd) && !opts.force) {\n throw new Error(`Skill already exists at ${skillMd} (use --force to overwrite).`);\n }\n mkdirSync(dir, { recursive: true });\n writeFileSync(skillMd, template(domain, cls, category, name), \"utf8\");\n log.success(`Created ${skillMd}`);\n return skillMd;\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;;;ACejB,IAAM,cAA0B,CAAC,UAAU,UAAU,WAAW,QAAQ;AASxE,IAAM,iBAAiB;AAAA,EAC5B,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AACb;;;AC5BA,SAAS,SAAS;AAGX,IAAM,iBAAiB,EAAE,KAAK,CAAC,UAAU,UAAU,WAAW,QAAQ,CAAC;AAGvE,IAAM,gBAA0C;AAAA,EACrD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AACV;AAEO,IAAM,sBAAsB,EAChC,OAAO;AAAA,EACN,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE7B,YAAY,EAAE,OAAO,EAAE,QAAQ,MAAM;AAAA;AAAA;AAAA;AAAA,EAIrC,SAAS,EAAE,MAAM,cAAc,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EAE3C,OAAO,EACJ,OAAO;AAAA,IACN,QAAQ,EAAE,OAAO;AAAA,IACjB,QAAQ,EAAE,OAAO;AAAA,IACjB,SAAS,EAAE,OAAO;AAAA,IAClB,QAAQ,EAAE,OAAO;AAAA,EACnB,CAAC,EACA,QAAQ,EACR,QAAQ,CAAC,CAAC;AAAA,EACb,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,QAAQ,SAAS;AAAA;AAAA,EAE5C,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAClC,CAAC,EACA,OAAO;AAIH,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AAGtB,SAAS,aAAa,KAA8C;AACzE,SAAO,EAAE,GAAG,eAAe,GAAG,IAAI,MAAM;AAC1C;;;AC9CA,OAAO,UAAU;AAOV,SAAS,OAAO,KAAsC;AAC3D,SAAO,KAAK,UAAU,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ;AACvD;AAGO,SAAS,iBAAiB,KAAsC;AACrE,SAAO;AAAA,EAAQ,OAAO,GAAG,CAAC;AAAA;AAC5B;AAMO,SAAS,gBAAgB,KAA8B,MAAsB;AAClF,SAAO,GAAG,iBAAiB,GAAG,CAAC;AAAA;AAAA,EAAO,KAAK,KAAK,CAAC;AAAA;AACnD;;;ACtBA,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AAId,SAAS,UAAU,MAAc,KAAsB;AAC5D,SAAO,WAAW,KAAK,MAAM,GAAG,CAAC;AACnC;AAEA,IAAM,WAAmC;AAAA,EACvC,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AACX;AAGO,SAAS,cAAc,MAAsB;AAClD,SAAO,KACJ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EAChE,KAAK,GAAG;AACb;AAGO,SAAS,cAAc,IAAqC;AACjE,QAAM,IAAI,GAAG;AACb,MAAI,CAAC,KAAK,EAAE,WAAW,EAAG,QAAO;AACjC,SAAO,EAAE,KAAK,GAAG;AACnB;AAGO,SAAS,aAAa,WAIjB;AACV,SAAO,QAAQ,UAAU,aAAa,UAAU,YAAY,UAAU,SAAS;AACjF;;;AC1CO,IAAM,gBAAyB;AAAA,EACpC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ,CAAC,SAAS,UAAU,MAAM,SAAS;AAAA,EAC3C,KAAK,OAAO,KAAoB;AAC9B,UAAM,MAAM,GAAG,IAAI,MAAM,MAAM,IAAI,MAAM,IAAI;AAC7C,UAAM,KAAK;AAAA,MACT,MAAM,MAAM,YAAY;AAAA,MACxB,aAAa,MAAM,YAAY;AAAA,IACjC;AACA,UAAM,QAAuB;AAAA,MAC3B;AAAA,QACE,MAAM,GAAG,GAAG;AAAA,QACZ,UAAU,gBAAgB,IAAI,MAAM,IAAI;AAAA,QACxC,MAAM;AAAA,MACR;AAAA,IACF;AACA,eAAW,OAAO,OAAO,KAAK,cAAc,GAAoB;AAC9D,YAAM,OAAO,MAAM,UAAU,GAAG;AAChC,UAAI,MAAM;AACR,cAAM,KAAK;AAAA,UACT,MAAM,GAAG,GAAG,IAAI,eAAe,GAAG,CAAC;AAAA,UACnC,UAAU,KAAK,QAAQ,IAAI;AAAA,UAC3B,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;AC9BA,IAAM,aACJ;AAWF,IAAM,eACJ;AAEK,SAAS,aAAa,MAAc,OAAwB,CAAC,GAAW;AAC7E,MAAI,MAAM;AACV,MAAI,eAAe;AAEnB,QAAM,IAAI,QAAQ,YAAY,CAAC,IAAI,SAAiB;AAClD,mBAAe;AACf,WAAO;AAAA,EACT,CAAC;AAED,MAAI,KAAK,iBAAiB,aAAa;AACrC,UAAM,sBAAsB,GAAG;AAAA,EACjC;AAEA,QAAM,IAAI,QAAQ,WAAW,MAAM,EAAE,KAAK;AAE1C,MAAI,KAAK,gBAAgB,cAAc;AACrC,WAAO;AAAA;AAAA,IAAS,KAAK,iBAAiB,YAAY;AAAA,EACpD;AAEA,SAAO,MAAM;AACf;AAEA,SAAS,sBAAsB,MAAsB;AACnD,QAAM,KAAK;AACX,SAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,YAAoB;AAC/C,UAAM,YAAY,QAAQ,KAAK,EAAE,MAAM,SAAS,EAAE,CAAC,GAAG,QAAQ,QAAQ,GAAG,EAAE,KAAK,KAAK;AACrF,WAAO;AAAA;AAAA,YAAiC,SAAS;AAAA;AAAA,EACnD,CAAC;AACH;;;ACxCO,IAAM,gBAAyB;AAAA,EACpC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ,CAAC,SAAS,UAAU,MAAM,SAAS;AAAA,EAC3C,KAAK,OAAO,KAAoB;AAC9B,UAAM,QAAQ,cAAc,MAAM,WAAW;AAC7C,UAAM,KAA8B;AAAA,MAClC,aAAa,MAAM,YAAY;AAAA,IACjC;AACA,QAAI,MAAO,IAAG,QAAQ;AACtB,OAAG,cAAc;AAEjB,UAAM,OAAO,aAAa,MAAM,MAAM;AAAA,MACpC,cAAc;AAAA,MACd,cAAc,aAAa,MAAM,SAAS;AAAA,IAC5C,CAAC;AAED,WAAO;AAAA,MACL;AAAA,QACE,MAAM,GAAG,IAAI,MAAM,MAAM,IAAI,MAAM,IAAI;AAAA,QACvC,UAAU,gBAAgB,IAAI,IAAI;AAAA,QAClC,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;;;AC1BO,IAAM,iBAA0B;AAAA,EACrC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ,CAAC,SAAS,UAAU,MAAM,SAAS;AAAA,EAC3C,KAAK,OAAO,KAAoB;AAC9B,UAAM,OAAO,IAAI,MAAM;AACvB,UAAM,mBAAmB,GAAG,IAAI,iBAAiB,MAAM,IAAI;AAC3D,UAAM,UAAU,cAAc,MAAM,WAAW,KAAK;AAEpD,UAAM,KAAK;AAAA,MACT;AAAA,MACA,aAAa,MAAM,YAAY;AAAA,IACjC;AACA,UAAM,OAAO,aAAa,MAAM,MAAM;AAAA,MACpC,cAAc;AAAA,MACd,cAAc,aAAa,MAAM,SAAS;AAAA,IAC5C,CAAC;AAED,UAAM,UAAU,OAAO,cAAc,MAAM,IAAI,CAAC,oBAAoB,gBAAgB;AAEpF,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,UAAU,gBAAgB,IAAI,IAAI;AAAA,QAClC,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM,GAAG,IAAI;AAAA,QACb,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,MAAM;AAAA,QACf,cAAc,MAAM,YAAY,iBAAiB,EAAE;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACF;;;ACrCO,IAAM,gBAAyB;AAAA,EACpC,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ,CAAC,SAAS,UAAU,MAAM,WAAW;AAAA,EAC7C,KAAK,OAAO,KAAoB;AAC9B,UAAM,OAAO,aAAa,MAAM,MAAM;AAAA,MACpC,cAAc;AAAA,MACd,cAAc,aAAa,MAAM,SAAS;AAAA,IAC5C,CAAC;AACD,UAAM,UAAU,OAAO,cAAc,MAAM,IAAI,CAAC;AAAA;AAAA,EAAO,KAAK,KAAK,CAAC;AAClE,WAAO;AAAA,MACL;AAAA,QACE,MAAM,IAAI,MAAM;AAAA,QAChB,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,MAAM;AAAA,QACf,cAAc,MAAM,YAAY,iBAAiB,EAAE;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACF;;;ACnBO,IAAM,WAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,QAAQ,IAAI,IAAqB,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAE9D,SAAS,WAAW,IAAiC;AAC1D,SAAO,MAAM,IAAI,EAAE;AACrB;AAGO,SAAS,cAAc,aAAiC;AAC7D,SAAO,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAc;AAClF;;;AC3BA,SAAS,cAAAA,aAAY,cAAc,qBAAqB;AACxD,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,KAAAC,UAAS;AAGX,IAAM,sBAAsBA,GAAE,OAAO;AAAA;AAAA,EAE1C,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EAErC,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE3B,MAAMA,GAAE,OAAO;AACjB,CAAC;AAEM,IAAM,oBAAoBA,GAAE,OAAO;AAAA;AAAA,EAExC,SAASA,GAAE,OAAO;AAAA;AAAA,EAElB,YAAYA,GAAE,OAAO;AAAA;AAAA,EAErB,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAG,mBAAmB;AACnD,CAAC;AAEM,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EACrC,iBAAiBA,GAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;AAAA,EACvC,YAAYA,GAAE,OAAO,EAAE,QAAQ,MAAM;AAAA,EACrC,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAG,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAMM,SAAS,cAAc,aAAa,QAAkB;AAC3D,SAAO,EAAE,iBAAiB,GAAG,YAAY,QAAQ,CAAC,EAAE;AACtD;;;ADvBO,SAAS,WAAW,MAAsB;AAC/C,SAAOC,MAAK,MAAM,eAAe;AACnC;AACO,SAAS,aAAa,MAAsB;AACjD,SAAOA,MAAK,MAAM,aAAa;AACjC;AAEO,SAAS,WAAW,MAAoC;AAC7D,QAAM,IAAI,WAAW,IAAI;AACzB,MAAI,CAACC,YAAW,CAAC,EAAG,QAAO;AAC3B,SAAO,oBAAoB,MAAM,KAAK,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC;AACtE;AAGO,SAAS,oBAAoB,MAA6B;AAC/D,SAAO,WAAW,IAAI,KAAK,oBAAoB,MAAM,CAAC,CAAC;AACzD;AAEO,SAAS,WAAW,MAAc,KAA0B;AACjE,QAAM,aAAa,EAAE,SAAS,gDAAgD,GAAG,IAAI;AACrF,gBAAc,WAAW,IAAI,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,IAAI,MAAM,MAAM;AACpF;AAEO,SAAS,aAAa,MAAwB;AACnD,QAAM,IAAI,aAAa,IAAI;AAC3B,MAAI,CAACA,YAAW,CAAC,EAAG,QAAO,cAAc;AACzC,SAAO,eAAe,MAAM,KAAK,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC;AACjE;AAEO,SAAS,aAAa,MAAc,MAAsB;AAC/D,gBAAc,aAAa,IAAI,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM;AAChF;;;AEvCA,IAAI,QAAQ;AAKZ,IAAM,MAAM;AAAA,EACV,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AACP;AAEO,IAAM,MAAM;AAAA,EACjB,MAAM,KAAmB;AACvB,QAAI,CAAC,MAAO,SAAQ,IAAI,GAAG;AAAA,EAC7B;AAAA,EACA,KAAK,KAAmB;AACtB,QAAI,CAAC,MAAO,SAAQ,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE;AAAA,EAC9C;AAAA,EACA,QAAQ,KAAmB;AACzB,QAAI,CAAC,MAAO,SAAQ,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE;AAAA,EAC5C;AAAA,EACA,KAAK,KAAmB;AACtB,QAAI,CAAC,MAAO,SAAQ,KAAK,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE;AAAA,EAC/C;AAAA,EACA,MAAM,KAAmB;AACvB,YAAQ,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE;AAAA,EACnC;AACF;;;ACfO,SAAS,YAAY,MAAkC;AAC5D,QAAM,WAAW,WAAW,KAAK,GAAG;AACpC,MAAI,YAAY,CAAC,KAAK,OAAO;AAC3B,QAAI,KAAK,2FAAsF;AAC/F,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,KAAK;AACnB,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,UAAM,WAAW,cAAc,KAAK,GAAG;AACvC,QAAI,SAAS,SAAS,GAAG;AACvB,gBAAU;AACV,UAAI,KAAK,mBAAmB,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,IACnD,OAAO;AACL,gBAAU;AACV,UAAI,KAAK,uDAAkD,YAAY,KAAK,IAAI,CAAC,IAAI;AAAA,IACvF;AAAA,EACF;AAEA,QAAM,MAAM,oBAAoB,MAAM;AAAA,IACpC,YAAY,KAAK,cAAc;AAAA,IAC/B;AAAA,IACA,QAAQ,KAAK,UAAU;AAAA,EACzB,CAAC;AACD,aAAW,KAAK,KAAK,GAAG;AACxB,MAAI,QAAQ,sCAAsC,QAAQ,KAAK,IAAI,CAAC,aAAa,IAAI,MAAM,IAAI;AAC/F,SAAO;AACT;;;AC1CA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,YAAAC,WAAU,YAAY,QAAAC,OAAM,eAAe;;;ACFpD,SAAS,cAAAC,aAAY,aAAa,gBAAgB;AAClD,SAAS,QAAAC,OAAM,gBAAgB;AAE/B,IAAM,aAAa;AACnB,IAAM,SAAS,oBAAI,IAAI,CAAC,gBAAgB,QAAQ,QAAQ,QAAQ,CAAC;AAM1D,SAAS,cAAc,YAA8B;AAC1D,QAAM,QAAkB,CAAC;AACzB,MAAI,CAACD,YAAW,UAAU,EAAG,QAAO;AAEpC,QAAM,OAAO,CAAC,QAAsB;AAClC,QAAI;AACJ,QAAI;AACF,gBAAU,YAAY,GAAG;AAAA,IAC3B,QAAQ;AACN;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,UAAU,EAAG,OAAM,KAAK,GAAG;AAChD,eAAW,SAAS,SAAS;AAC3B,UAAI,OAAO,IAAI,KAAK,KAAK,MAAM,WAAW,GAAG,EAAG;AAChD,YAAM,OAAOC,MAAK,KAAK,KAAK;AAC5B,UAAI,QAAQ;AACZ,UAAI;AACF,gBAAQ,SAAS,IAAI,EAAE,YAAY;AAAA,MACrC,QAAQ;AACN,gBAAQ;AAAA,MACV;AACA,UAAI,MAAO,MAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,OAAK,UAAU;AACf,SAAO,MAAM,KAAK;AACpB;AAGO,SAAS,UAAU,YAAoB,KAAqB;AACjE,SAAO,SAAS,YAAY,GAAG,EAAE,MAAM,OAAO,EAAE,KAAK,GAAG;AAC1D;;;AC1CA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,UAAU,QAAAC,aAAY;AAC/B,OAAO,YAAY;;;ACFnB,SAAS,KAAAC,UAAS;AAClB,OAAO,YAAY;AAGZ,IAAM,UAAU;AAChB,IAAM,cAAc;AAEpB,IAAM,kBAAkBA,GAAE,KAAK,CAAC,UAAU,YAAY,WAAW,CAAC;AAUlE,IAAM,mBAAmBA,GAAE,KAAK;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,YAAwC;AAAA,EACnD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,UAAU;AACZ;AAQO,IAAM,sBAAsBA,GAChC,OAAO;AAAA,EACN,QAAQA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,OAAO;AAAA,EACP,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,WAAWA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA;AAAA,EAE3C,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACpD,YAAYA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAM,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEzD,SAASA,GAAE,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC7C,eAAeA,GAAE,OAAO,EAAE,MAAM,aAAa,kCAAkC;AAAA,EAC/E,WAAW;AAAA,EACX,SAASA,GACN,OAAO,EACP,OAAO,CAAC,MAAM,OAAO,MAAM,CAAC,KAAK,MAAM,gCAAgC;AAC5E,CAAC,EACA,OAAO;AAIV,IAAM,cAAcA,GACjB,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,OAAO,CAAC,CAAC,CAAC,EACvC,UAAU,CAAC,MAAO,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAE,EAC7C,SAAS;AAEL,IAAM,oBAAoBA,GAC9B,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,MAAM,SAAS,4CAA4C;AAAA,EAC5E,aAAaA,GACV,OAAO,EACP,IAAI,GAAG,yBAAyB,EAChC,IAAI,MAAM,wCAAwC;AAAA,EACrD,OAAO;AAAA,EACP,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,mBAAmB;AACrB,CAAC,EAEA,YAAY;;;ADlDR,SAAS,aAAa,KAAa,YAA8B;AACtE,QAAM,cAAcC,MAAK,KAAK,UAAU;AACxC,QAAM,UAAUC,cAAa,aAAa,MAAM;AAChD,QAAM,SAAS,OAAO,OAAO;AAE7B,QAAM,YAA4B,CAAC;AACnC,aAAW,OAAO,OAAO,KAAK,cAAc,GAAoB;AAC9D,UAAM,IAAID,MAAK,KAAK,eAAe,GAAG,CAAC;AACvC,QAAIE,YAAW,CAAC,EAAG,WAAU,GAAG,IAAID,cAAa,GAAG,MAAM;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,UAAU,YAAY,GAAG;AAAA,IAClC,YAAY,SAAS,GAAG;AAAA,IACxB,MAAM,OAAO;AAAA,IACb,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,EAAE,QAAQ;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9C,YACkB,SACA,QAChB;AACA,UAAM,kBAAkB,OAAO;AAAA,MAAW,OAAO,KAAK,QAAQ,CAAC,EAAE;AAHjD;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EALkB;AAAA,EACA;AAKpB;AAGO,SAAS,oBACd,MACoE;AACpE,QAAM,SAAS,kBAAkB,UAAU,IAAI;AAC/C,MAAI,OAAO,QAAS,QAAO,EAAE,IAAI,MAAM,OAAO,OAAO,KAAK;AAC1D,QAAM,SAAS,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM;AAC5C,UAAM,OAAO,EAAE,KAAK,KAAK,GAAG;AAC5B,WAAO,OAAO,GAAG,IAAI,KAAK,EAAE,OAAO,KAAK,EAAE;AAAA,EAC5C,CAAC;AACD,SAAO,EAAE,IAAI,OAAO,OAAO;AAC7B;AAGO,SAAS,UAAU,KAAa,YAAiC;AACtE,QAAM,MAAM,aAAa,KAAK,UAAU;AACxC,QAAM,YAAY,oBAAoB,IAAI,IAAI;AAC9C,MAAI,CAAC,UAAU,GAAI,OAAM,IAAI,qBAAqB,IAAI,SAAS,UAAU,MAAM;AAC/E,SAAO;AAAA,IACL,MAAM,UAAU,MAAM;AAAA,IACtB,KAAK,IAAI;AAAA,IACT,SAAS,IAAI;AAAA,IACb,aAAa,UAAU;AAAA,IACvB,MAAM,IAAI;AAAA,IACV,WAAW,IAAI;AAAA,EACjB;AACF;;;AE9EO,SAAS,cAAc,YAAoB,UAAU,SAAmB;AAC7E,QAAM,OAAO,cAAc,UAAU;AACrC,QAAM,SAA0B,KAAK,IAAI,CAAC,QAAQ;AAChD,UAAM,IAAI,UAAU,KAAK,UAAU;AACnC,UAAM,KAAK,EAAE,YAAY,iBAAiB;AAC1C,WAAO;AAAA,MACL,MAAM,EAAE;AAAA,MACR,QAAQ,GAAG;AAAA,MACX,OAAO,GAAG;AAAA,MACV,UAAU,GAAG;AAAA,MACb,aAAa,EAAE,YAAY;AAAA,MAC3B,WAAW,GAAG;AAAA,MACd,WAAW,GAAG;AAAA,MACd,SAAS,GAAG;AAAA,MACZ,MAAM,EAAE,YAAY,QAAQ,CAAC;AAAA,MAC7B,YAAY,GAAG;AAAA,MACf,MAAM,EAAE;AAAA,MACR,WAAW;AAAA,QACT,WAAW,QAAQ,EAAE,UAAU,SAAS;AAAA,QACxC,UAAU,QAAQ,EAAE,UAAU,QAAQ;AAAA,QACtC,WAAW,QAAQ,EAAE,UAAU,SAAS;AAAA,MAC1C;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAClD,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;;;AJ5BA,IAAM,eAAe;AAGd,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA4B,MAAc;AAAd;AAAA,EAAe;AAAA,EAAf;AAAA,EAE5B,YAAsB;AACpB,WAAO,cAAc,KAAK,IAAI;AAAA,EAChC;AAAA,EAEA,QAAQ,MAAkC;AACxC,UAAM,OAAO,KAAK,UAAU;AAC5B,WAAO,KAAK,KAAK,CAAC,MAAME,UAAS,CAAC,MAAM,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,SAAS,GAAG,KAAK,IAAI,MAAM,IAAI;AAAA,EACnG;AAAA,EAEA,UAAU,MAA2B;AACnC,UAAM,MAAM,KAAK,QAAQ,IAAI;AAC7B,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,UAAU,IAAI,6BAA6B,KAAK,IAAI,EAAE;AAChF,WAAO,UAAU,KAAK,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,WAAqB;AACnB,WAAO,cAAc,KAAK,IAAI;AAAA,EAChC;AACF;AAEA,SAAS,SAAS,KAAa,MAAsB;AACnD,MAAI;AACF,WAAO,UAAU,KAAK,IAAI,EAAE;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAkBA,eAAsB,eAAe,OAA8B,CAAC,GAA2B;AAC7F,MAAI,KAAK,SAAS;AAChB,UAAM,OAAO,WAAW,KAAK,OAAO,IAAI,KAAK,UAAU,QAAQ,QAAQ,IAAI,GAAG,KAAK,OAAO;AAC1F,WAAO,IAAI,cAAc,IAAI;AAAA,EAC/B;AACA,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,IAAK,QAAO,IAAI,cAAc,QAAQ,GAAG,CAAC;AAE9C,QAAM,QAAQ,mBAAmB,KAAK,OAAO,QAAQ,IAAI,CAAC;AAC1D,MAAI,MAAO,QAAO,IAAI,cAAc,KAAK;AAEzC,SAAO,IAAI,cAAc,MAAM,YAAY,KAAK,OAAO,MAAM,CAAC;AAChE;AAGA,SAAS,mBAAmB,OAA8B;AACxD,MAAI,MAAM,QAAQ,KAAK;AACvB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,YAAYC,MAAK,KAAK,QAAQ;AACpC,QAAIC,YAAWD,MAAK,KAAK,qBAAqB,CAAC,KAAKC,YAAW,SAAS,EAAG,QAAO;AAClF,UAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAGA,eAAe,YAAY,KAA8B;AACvD,QAAM,OAAO,QAAQ,IAAI,sBAAsB;AAC/C,QAAM,WAAWD,MAAK,QAAQ,GAAG,wBAAwB,IAAI,QAAQ,YAAY,GAAG,CAAC;AACrF,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,OAAO;AACjD,QAAM,EAAE,IAAI,IAAI,MAAM,iBAAiB,GAAG,IAAI,WAAW,GAAG,IAAI;AAAA,IAC9D,KAAK;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,EACd,CAAC;AACD,SAAO;AACT;;;AKlGA,SAAS,cAAAE,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,aAAY;;;ACQd,SAAS,aACd,OACA,SACA,KACkB;AAClB,QAAM,MAAwB,CAAC;AAC/B,aAAW,UAAU,SAAS;AAC5B,UAAM,UAAU,WAAW,MAAM;AACjC,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AACzD,QAAI,KAAK,EAAE,QAAQ,OAAO,QAAQ,KAAK,OAAO,GAAG,EAAE,CAAC;AAAA,EACtD;AACA,SAAO;AACT;;;ACrBA,SAAS,cAAAC,aAAY,WAAW,eAAAC,cAAa,gBAAAC,eAAc,WAAW,QAAQ,iBAAAC,sBAAqB;AACnG,SAAS,SAAS,QAAAC,aAAY;;;ACY9B,IAAM,SAAS;AAEf,SAAS,SAAS,GAAmB;AACnC,SAAO,EAAE,QAAQ,uBAAuB,MAAM;AAChD;AAEO,SAAS,YAAY,IAAY,SAA0B;AAChE,SAAO,UACH,cAAc,MAAM,IAAI,EAAE,KAAK,OAAO,SACtC,cAAc,MAAM,IAAI,EAAE;AAChC;AAEO,SAAS,UAAU,IAAoB;AAC5C,SAAO,YAAY,MAAM,IAAI,EAAE;AACjC;AAEA,SAAS,WAAW,IAAoB;AACtC,QAAM,MAAM,SAAS,EAAE;AACvB,SAAO,IAAI;AAAA,IACT,qBAAqB,MAAM,IAAI,GAAG,sCAAsC,MAAM,IAAI,GAAG;AAAA,EACvF;AACF;AAGO,SAAS,YAAY,IAAY,MAAc,SAA0B;AAC9E,SAAO,GAAG,YAAY,IAAI,OAAO,CAAC;AAAA,EAAK,KAAK,KAAK,CAAC;AAAA,EAAK,UAAU,EAAE,CAAC;AACtE;AAEO,SAAS,SAAS,MAAc,IAAqB;AAC1D,SAAO,WAAW,EAAE,EAAE,KAAK,IAAI;AACjC;AAwBO,SAAS,YACd,MACA,IACA,MACA,SACQ;AACR,QAAM,QAAQ,YAAY,IAAI,MAAM,OAAO;AAC3C,QAAM,KAAK,WAAW,EAAE;AACxB,MAAI,GAAG,KAAK,IAAI,GAAG;AACjB,WAAO,KAAK,QAAQ,IAAI,KAAK;AAAA,EAC/B;AACA,QAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE;AACpC,MAAI,KAAK,WAAW,EAAG,QAAO,QAAQ;AACtC,SAAO,GAAG,IAAI;AAAA;AAAA,EAAO,KAAK;AAAA;AAC5B;AAOO,SAAS,YAAY,MAAc,IAAoB;AAC5D,QAAM,KAAK,IAAI,OAAO,WAAW,EAAE,EAAE,SAAS,UAAU;AACxD,QAAM,OAAO,KAAK,QAAQ,IAAI,EAAE;AAChC,SAAO,KAAK,KAAK,EAAE,WAAW,IAAI,KAAK,KAAK,QAAQ,WAAW,MAAM,EAAE,QAAQ,IAAI;AACrF;;;ADtEA,SAAS,UAAU,SAAuB;AACxC,YAAU,QAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AACjD;AAEA,SAAS,WACP,aACA,MACA,MACqB;AACrB,QAAM,MAAMC,MAAK,aAAa,KAAK,IAAI;AACvC,QAAM,SAASC,YAAW,GAAG;AAC7B,QAAM,OAAO,KAAK;AAElB,MAAI,CAAC,QAAQ;AACX,QAAI,CAAC,KAAK,QAAQ;AAChB,gBAAU,GAAG;AACb,MAAAC,eAAc,KAAK,MAAM,MAAM;AAAA,IACjC;AACA,WAAO,EAAE,MAAM,KAAK,MAAM,MAAM,SAAS,QAAQ,WAAW,OAAO,KAAK;AAAA,EAC1E;AAEA,QAAM,UAAUC,cAAa,KAAK,MAAM;AACxC,MAAI,YAAY,MAAM;AACpB,WAAO,EAAE,MAAM,KAAK,MAAM,MAAM,SAAS,QAAQ,YAAY;AAAA,EAC/D;AAGA,MAAI,SAAyB;AAC7B,MAAI,CAAC,KAAK,WAAW;AACnB,aAAS,KAAK,aAAa,KAAK,WAAW,KAAK,IAAI,IAAI,KAAK,SAAS,cAAc;AAAA,EACtF;AACA,MAAI,WAAW,QAAQ;AACrB,WAAO,EAAE,MAAM,KAAK,MAAM,MAAM,SAAS,QAAQ,WAAW,QAAQ,SAAS,OAAO,KAAK;AAAA,EAC3F;AACA,MAAI,CAAC,KAAK,OAAQ,CAAAD,eAAc,KAAK,MAAM,MAAM;AACjD,SAAO,EAAE,MAAM,KAAK,MAAM,MAAM,SAAS,QAAQ,WAAW,QAAQ,SAAS,OAAO,KAAK;AAC3F;AAEA,SAAS,WACP,aACA,MACA,MACqB;AACrB,QAAM,MAAMF,MAAK,aAAa,KAAK,IAAI;AACvC,QAAM,SAASC,YAAW,GAAG;AAC7B,QAAM,UAAU,SAASE,cAAa,KAAK,MAAM,IAAI;AACrD,QAAM,UAAU,KAAK;AACrB,QAAM,OAAO,YAAY,SAAS,SAAS,KAAK,UAAU,KAAK,YAAY;AAE3E,MAAI;AACJ,MAAI,YAAY,KAAM,UAAS;AAAA,WACtB,CAAC,UAAU,CAAC,SAAS,SAAS,OAAO,EAAG,UAAS;AAAA,MACrD,UAAS;AAEd,MAAI,WAAW,eAAe,CAAC,KAAK,QAAQ;AAC1C,cAAU,GAAG;AACb,IAAAD,eAAc,KAAK,MAAM,MAAM;AAAA,EACjC;AACA,SAAO,EAAE,MAAM,KAAK,MAAM,MAAM,SAAS,SAAS,OAAO;AAC3D;AAGO,SAAS,WACd,aACA,OACA,OAAqB,CAAC,GACC;AACvB,SAAO,MAAM;AAAA,IAAI,CAAC,MAChB,EAAE,SAAS,UAAU,WAAW,aAAa,GAAG,IAAI,IAAI,WAAW,aAAa,GAAG,IAAI;AAAA,EACzF;AACF;AAGO,SAAS,eAAe,aAAqB,cAAwB,SAAS,OAAa;AAChG,MAAI,OAAQ;AACZ,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,OAAO,cAAc;AAC9B,QAAI,MAAM,QAAQF,MAAK,aAAa,GAAG,CAAC;AACxC,WAAO,IAAI,WAAW,WAAW,KAAK,QAAQ,eAAe,CAAC,KAAK,IAAI,GAAG,GAAG;AAC3E,WAAK,IAAI,GAAG;AACZ,UAAI;AACF,YAAIC,YAAW,GAAG,KAAKG,aAAY,GAAG,EAAE,WAAW,GAAG;AACpD,oBAAU,GAAG;AACb,gBAAM,QAAQ,GAAG;AAAA,QACnB,MAAO;AAAA,MACT,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,gBAAgB,aAAqB,SAAiB,SAAS,OAAgB;AAC7F,QAAM,MAAMJ,MAAK,aAAa,OAAO;AACrC,MAAI,CAACC,YAAW,GAAG,EAAG,QAAO;AAC7B,MAAI,CAAC,OAAQ,QAAO,GAAG;AACvB,SAAO;AACT;AAMO,SAAS,oBACd,aACA,SACA,SACA,SAAS,OACA;AACT,QAAM,MAAMD,MAAK,aAAa,OAAO;AACrC,MAAI,CAACC,YAAW,GAAG,EAAG,QAAO;AAC7B,QAAM,UAAUE,cAAa,KAAK,MAAM;AACxC,MAAI,CAAC,SAAS,SAAS,OAAO,EAAG,QAAO;AACxC,QAAM,OAAO,YAAY,SAAS,OAAO;AACzC,MAAI,CAAC,QAAQ;AACX,QAAI,KAAK,KAAK,EAAE,WAAW,EAAG,QAAO,GAAG;AAAA,QACnC,CAAAD,eAAc,KAAK,MAAM,MAAM;AAAA,EACtC;AACA,SAAO;AACT;;;AE9IA,SAAS,kBAAkB;AAGpB,SAAS,UAAU,OAAyB;AACjD,QAAM,IAAI,WAAW,QAAQ;AAC7B,aAAW,KAAK,OAAO;AACrB,MAAE,OAAO,GAAG,MAAM;AAClB,MAAE,OAAO,IAAG;AAAA,EACd;AACA,SAAO,YAAY,EAAE,OAAO,KAAK;AACnC;;;AJMO,SAAS,aAAa,OAA4B;AACvD,QAAM,KAAK,MAAM,YAAY,iBAAiB;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAG;AAAA,IACH,MAAM,YAAY;AAAA,IAClB,MAAM;AAAA,IACN,MAAM,UAAU,aAAa;AAAA,IAC7B,MAAM,UAAU,YAAY;AAAA,IAC5B,MAAM,UAAU,aAAa;AAAA,EAC/B;AACF;AAOO,SAAS,SAAS,aAAqB,UAA4B;AACxE,QAAM,SAAS,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAC9D,QAAM,QAAkB,CAAC;AACzB,aAAW,KAAK,QAAQ;AACtB,UAAM,MAAMG,MAAK,aAAa,CAAC;AAC/B,UAAM,WAAWC,YAAW,GAAG,IAAIC,cAAa,KAAK,MAAM,IAAI;AAC/D,UAAM,KAAK,GAAG,QAAQ;AAAA,EACxB;AACA,SAAO,OAAO,GAAG,KAAK;AACxB;AAGO,SAAS,aACd,aACA,OACA,SACA,OACA,OAAqB,CAAC,GACP;AACf,QAAM,WAAW,aAAa,OAAO,SAAS,EAAE,aAAa,MAAM,CAAC;AACpE,QAAM,WAAW,SAAS,QAAQ,CAAC,MAAM,EAAE,KAAK;AAChD,QAAM,UAAU,WAAW,aAAa,UAAU,IAAI;AAEtD,QAAM,UAAkC,CAAC;AACzC,aAAW,KAAK,UAAU;AACxB,UAAM,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AACzE,UAAM,QAAQ,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,GAAG;AAIvD,UAAM,OAAO,KAAK,SAAS,OAAO,WAAW,GAAG,KAAK,IAAI,SAAS,aAAa,KAAK;AACpF,YAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAI,KAAK;AAAA,EACxE;AAEA,QAAM,UAAU,MAAM,YAAY,iBAAiB,EAAE;AACrD,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ;AAAA,IACA;AAAA,IACA,QAAQ,EAAE,SAAS,YAAY,aAAa,KAAK,GAAG,QAAQ;AAAA,EAC9D;AACF;;;AK3EA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,iBAAAC,sBAAqB;AACxD,SAAS,QAAAC,aAAY;AAGd,SAAS,iBAAiB,MAAc,SAAyB;AACtE,QAAM,IAAIA,MAAK,MAAM,YAAY;AACjC,QAAM,UAAUH,YAAW,CAAC,IAAIC,cAAa,GAAG,MAAM,IAAI;AAC1D,QAAM,QAAQ,IAAI,IAAI,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC9D,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AACnD,MAAI,QAAQ,WAAW,EAAG;AAC1B,QAAM,SAAS,QAAQ,SAAS,iBAAiB,IAAI,KAAK;AAC1D,QAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,IAAI,SAAS,QAAQ,KAAK,IAAI,IAAI;AACzE,EAAAC,eAAc,GAAG,MAAM,MAAM;AAC/B;;;ACuBA,eAAsB,WAAW,MAAsC;AACrE,QAAM,MAAM,oBAAoB,KAAK,GAAG;AACxC,QAAM,YAAY,WAAW,KAAK,GAAG,KAAK;AAE1C,MAAI,UAAU,KAAK,SAAS,SAAS,KAAK,UAAU,IAAI;AACxD,MAAI,CAAC,QAAQ,OAAQ,WAAU,cAAc,KAAK,GAAG;AACrD,MAAI,CAAC,QAAQ,OAAQ,WAAU;AAE/B,QAAM,UAAU,MAAM,eAAe;AAAA,IACnC,SAAS,KAAK;AAAA,IACd,KAAK,KAAK,OAAO,IAAI;AAAA,IACrB,KAAK,KAAK;AAAA,EACZ,CAAC;AACD,QAAME,YAAW,QAAQ,SAAS;AAClC,QAAM,SAAS,IAAI,IAAIA,UAAS,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAG9D,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAAS,KAAK,OAAO;AAC9B,QAAI,OAAO,IAAI,KAAK,GAAG;AACrB,eAAS,IAAI,KAAK;AAClB;AAAA,IACF;AACA,UAAM,aAAaA,UAAS,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK;AACrE,UAAM,UAAUA,UAAS,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK;AAC/D,UAAM,QAAQ,WAAW,SAAS,aAAa;AAC/C,QAAI,MAAM,QAAQ;AAChB,YAAM,QAAQ,CAAC,MAAM,SAAS,IAAI,EAAE,IAAI,CAAC;AAAA,IAC3C,OAAO;AACL,UAAI,KAAK,yCAAyC,KAAK,IAAI;AAC3D,cAAQ,KAAK,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,KAAK,WAAW;AAClB,eAAW,QAAQ,CAAC,GAAG,QAAQ,GAAG;AAChC,iBAAW,QAAQ,OAAO,IAAI,IAAI,GAAG,cAAc,CAAC,GAAG;AACrD,YAAI,OAAO,IAAI,IAAI,EAAG,UAAS,IAAI,IAAI;AAAA,YAClC,KAAI,KAAK,iBAAiB,IAAI,YAAY,IAAI,4BAA4B;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,QAAI,MAAM,qBAAqB;AAC/B,WAAO,EAAE,SAAS,WAAW,CAAC,GAAG,QAAQ;AAAA,EAC3C;AAEA,QAAM,QAAQ,aAAa,GAAG;AAC9B,QAAM,OAAO,aAAa,KAAK,GAAG;AAClC,OAAK,aAAa,KAAK,OAAO,IAAI;AAClC,QAAM,YAAiD,CAAC;AAExD,QAAM,SAAS,KAAK,SAAS,eAAe;AAC5C,aAAW,QAAQ,CAAC,GAAG,QAAQ,EAAE,KAAK,GAAG;AACvC,UAAM,QAAQ,QAAQ,UAAU,IAAI;AACpC,UAAM,SAAS,aAAa,KAAK,KAAK,OAAO,SAAS,OAAO;AAAA,MAC3D,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,YAAY,KAAK;AAAA,IACnB,CAAC;AACD,QAAI,CAAC,KAAK,OAAQ,MAAK,OAAO,IAAI,IAAI,OAAO;AAC7C,cAAU,KAAK,EAAE,MAAM,SAAS,OAAO,QAAQ,CAAC;AAEhD,eAAW,KAAK,OAAO,SAAS;AAC9B,YAAM,MAAM,EAAE,SAAS,UAAU,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,MAAM,EAAE;AAChE,UAAI,KAAK,GAAG,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC,CAAC,IAAI,GAAG,EAAE;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,CAAC,KAAK,QAAQ;AAChB,iBAAa,KAAK,KAAK,IAAI;AAC3B,QAAI,CAAC,WAAW;AACd,iBAAW,KAAK,KAAK,EAAE,GAAG,KAAK,QAAQ,CAAC;AACxC,UAAI,KAAK,2BAA2B;AAAA,IACtC;AACA,QAAI,CAAC,IAAI,QAAQ;AACf,YAAM,OAAO,QAAQ,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC;AACxC,uBAAiB,KAAK,KAAK,IAAI;AAAA,IACjC;AAAA,EACF;AAEA,MAAI;AAAA,IACF,GAAG,MAAM,aAAa,UAAU,MAAM,kBAAkB,QAAQ,MAAM,eAAe,QAAQ,KAAK,IAAI,CAAC;AAAA,EACzG;AACA,SAAO,EAAE,SAAS,WAAW,QAAQ;AACvC;;;ACnGA,eAAsB,cAAc,MAA4C;AAC9E,QAAM,MAAM,oBAAoB,KAAK,GAAG;AACxC,QAAM,OAAO,aAAa,KAAK,GAAG;AAClC,QAAM,MAAM,KAAK,OAAO,IAAI;AAC5B,QAAM,UAAoB,CAAC;AAC3B,QAAM,WAAqB,CAAC;AAC5B,QAAM,UAAoB,CAAC;AAE3B,QAAM,QAAQ,KAAK,OAAO,SAAS,KAAK,QAAQ,OAAO,KAAK,KAAK,MAAM;AACvE,MAAI,MAAM,WAAW,GAAG;AACtB,QAAI,KAAK,gCAAgC;AACzC,WAAO,EAAE,SAAS,UAAU,QAAQ;AAAA,EACtC;AAEA,QAAM,UAAU,MAAM,eAAe,EAAE,SAAS,KAAK,SAAS,KAAK,KAAK,KAAK,IAAI,CAAC;AAClF,QAAM,QAAQ,aAAa,GAAG;AAC9B,QAAM,SAAS,KAAK,SAAS,eAAe;AAE5C,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,SAAS,KAAK,OAAO,IAAI;AAC/B,QAAI,CAAC,QAAQ;AACX,UAAI,KAAK,IAAI,IAAI,8CAAyC;AAC1D,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,cAAQ,QAAQ,UAAU,IAAI;AAAA,IAChC,QAAQ;AACN,UAAI,KAAK,IAAI,IAAI,4CAA4C;AAC7D,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,eAAe;AACvC,UAAM,gBAAgB,OAAO,eAAe,aAAa,KAAK;AAC9D,QAAI,CAAC,KAAK,aAAa,CAAC,iBAAiB,CAAC,YAAY;AACpD,eAAS,KAAK,IAAI;AAClB;AAAA,IACF;AAGA,UAAM,UAAU,OAAO,KAAK,OAAO,OAAO;AAG1C,UAAM,aAAa,QAAQ,KAAK,CAAC,MAAM;AACrC,YAAM,IAAI,OAAO,QAAQ,CAAC;AAC1B,aAAO,KAAK,SAAS,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE;AAAA,IAChD,CAAC;AACD,QAAI,cAAc,CAAC,KAAK,aAAa,CAAC,KAAK,YAAY;AACrD,UAAI,KAAK,GAAG,MAAM,IAAI,IAAI,iEAA4D;AACtF,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AAEA,UAAM,SAAS,aAAa,KAAK,KAAK,OAAO,SAAS,OAAO;AAAA,MAC3D,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK,aAAa,CAAC;AAAA,MAC9B,YAAY,KAAK;AAAA,IACnB,CAAC;AACD,QAAI,CAAC,KAAK,OAAQ,MAAK,OAAO,IAAI,IAAI,OAAO;AAC7C,YAAQ,KAAK,IAAI;AACjB,eAAW,KAAK,OAAO,SAAS;AAC9B,UAAI,EAAE,WAAW,YAAa;AAC9B,YAAM,MAAM,EAAE,SAAS,UAAU,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,MAAM,EAAE;AAChE,UAAI,KAAK,GAAG,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC,CAAC,IAAI,GAAG,EAAE;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,CAAC,KAAK,QAAQ;AAChB,SAAK,aAAa;AAClB,iBAAa,KAAK,KAAK,IAAI;AAAA,EAC7B;AAEA,MAAI;AAAA,IACF,GAAG,MAAM,WAAW,QAAQ,MAAM,gBAAgB,SAAS,MAAM,aAAa,QAAQ,MAAM;AAAA,EAC9F;AACA,SAAO,EAAE,SAAS,UAAU,QAAQ;AACtC;;;ACrFO,SAAS,cAAc,MAAmC;AAC/D,QAAM,OAAO,aAAa,KAAK,GAAG;AAClC,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAS,KAAK,SAAS,eAAe;AAE5C,aAAW,QAAQ,KAAK,OAAO;AAC7B,UAAM,SAAS,KAAK,OAAO,IAAI;AAC/B,QAAI,CAAC,QAAQ;AACX,UAAI,KAAK,IAAI,IAAI,qBAAqB;AACtC,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,SAAS,SAC3B,KAAK,UACJ,OAAO,KAAK,OAAO,OAAO,GAC7B,OAAO,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEjC,UAAM,eAAyB,CAAC;AAChC,eAAW,KAAK,SAAS;AACvB,YAAM,IAAI,OAAO,QAAQ,CAAC;AAC1B,iBAAW,QAAQ,EAAE,OAAO;AAC1B,YAAI,gBAAgB,KAAK,KAAK,MAAM,KAAK,MAAM,GAAG;AAChD,uBAAa,KAAK,IAAI;AACtB,cAAI,KAAK,GAAG,MAAM,aAAa,IAAI,EAAE;AAAA,QACvC;AAAA,MACF;AACA,UAAI,EAAE,SAAS,oBAAoB,KAAK,KAAK,EAAE,OAAO,MAAM,KAAK,MAAM,GAAG;AACxE,YAAI,KAAK,GAAG,MAAM,aAAa,EAAE,KAAK,KAAK,IAAI,GAAG;AAAA,MACpD;AACA,UAAI,CAAC,KAAK,OAAQ,QAAO,OAAO,QAAQ,CAAC;AAAA,IAC3C;AACA,mBAAe,KAAK,KAAK,cAAc,KAAK,MAAM;AAElD,QAAI,CAAC,KAAK,QAAQ;AAChB,UAAI,OAAO,KAAK,OAAO,OAAO,EAAE,WAAW,EAAG,QAAO,KAAK,OAAO,IAAI;AAAA,IACvE;AACA,YAAQ,KAAK,IAAI;AAAA,EACnB;AAEA,MAAI,CAAC,KAAK,OAAQ,cAAa,KAAK,KAAK,IAAI;AAC7C,MAAI,QAAQ,GAAG,MAAM,WAAW,QAAQ,MAAM,YAAY;AAC1D,SAAO,EAAE,SAAS,QAAQ;AAC5B;;;AC9DA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,aAAY;AAed,SAAS,cAAc,MAAmC;AAC/D,QAAM,WAAqB,CAAC;AAC5B,QAAM,OAAO,CAAC,QAAgB,SAAS,KAAK,GAAG;AAE/C,QAAM,MAAM,WAAW,KAAK,GAAG;AAC/B,MAAI,CAAC,KAAK;AACR,QAAI,KAAK,8DAAyD;AAAA,EACpE,OAAO;AACL,QAAI,KAAK,mBAAmB,IAAI,QAAQ,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,eAAe,EAAE;AAAA,EAC7F;AAEA,QAAM,OAAO,aAAa,KAAK,GAAG;AAClC,QAAM,QAAQ,OAAO,KAAK,KAAK,MAAM;AACrC,MAAI,MAAM,WAAW,GAAG;AACtB,QAAI,KAAK,sBAAsB;AAC/B,WAAO,EAAE,UAAU,IAAI,KAAK;AAAA,EAC9B;AAEA,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,KAAK,OAAO,IAAI;AAC/B,eAAW,CAAC,QAAQ,CAAC,KAAK,OAAO,QAAQ,OAAO,OAAO,GAAG;AACxD,iBAAW,QAAQ,EAAE,OAAO;AAC1B,YAAI,CAACC,YAAWC,MAAK,KAAK,KAAK,IAAI,CAAC,EAAG,MAAK,GAAG,IAAI,aAAa,MAAM,SAAS,IAAI,EAAE;AAAA,MACvF;AACA,UAAI,EAAE,MAAM,MAAM,CAAC,MAAMD,YAAWC,MAAK,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG;AACvD,YAAI,SAAS,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,MAAM;AAC1C,eAAK,GAAG,IAAI,oBAAoB,MAAM,kDAAkD;AAAA,QAC1F;AAAA,MACF;AACA,UAAI,EAAE,OAAO;AACX,cAAM,MAAMA,MAAK,KAAK,KAAK,EAAE,KAAK;AAClC,YAAI,CAACD,YAAW,GAAG,KAAK,CAAC,SAASE,cAAa,KAAK,MAAM,GAAG,IAAI,GAAG;AAClE,eAAK,GAAG,IAAI,8BAA8B,EAAE,KAAK,EAAE;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,QAAI,QAAQ,OAAO,MAAM,MAAM,mCAAmC;AAAA,EACpE,OAAO;AACL,eAAW,KAAK,SAAU,KAAI,KAAK,CAAC;AACpC,QAAI,MAAM;AAAA,EAAK,SAAS,MAAM,oBAAoB;AAAA,EACpD;AACA,SAAO,EAAE,UAAU,IAAI,SAAS,WAAW,EAAE;AAC/C;;;ACnDA,eAAe,WAAW,GAAoC;AAC5D,QAAM,UAAU,MAAM,eAAe,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,CAAC;AACnF,SAAO,QAAQ,SAAS;AAC1B;AAUA,eAAsB,YAAY,MAA6C;AAC7E,QAAM,MAAM,MAAM,WAAW,IAAI;AACjC,MAAI,SAAS,IAAI;AACjB,MAAI,KAAK,OAAQ,UAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM;AACvE,MAAI,KAAK,MAAO,UAAS,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK,KAAK;AACpE,MAAI,KAAK,SAAU,UAAS,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,KAAK,QAAQ;AAC7E,MAAI,KAAK,UAAU;AACjB,UAAM,WAAW,KAAK;AACtB,aAAS,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS,QAAQ,CAAC;AAAA,EAC9D;AAEA,MAAI,KAAK,MAAM;AACb,QAAI,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,QAAI,KAAK,kBAAkB;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,oBAAI,IAA6B;AAChD,aAAW,KAAK,QAAQ;AACtB,UAAM,MAAM,GAAG,EAAE,MAAM,IAAI,EAAE,KAAK,IAAI,EAAE,QAAQ;AAChD,KAAC,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,GAAI,KAAK,CAAC;AAAA,EAC3D;AACA,aAAW,CAAC,OAAO,OAAO,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,GAAG;AACjD,QAAI,MAAM;AAAA,EAAK,KAAK,EAAE;AACtB,eAAW,KAAK,SAAS;AACvB,YAAM,OAAO,EAAE,cAAc,WAAW,KAAK,KAAK,EAAE,SAAS;AAC7D,UAAI,MAAM,KAAK,EAAE,IAAI,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE;AAC7C,UAAI,MAAM,SAAS,SAAS,EAAE,aAAa,EAAE,CAAC,EAAE;AAAA,IAClD;AAAA,EACF;AACA,MAAI,MAAM;AAAA,EAAK,OAAO,MAAM,YAAY;AACxC,SAAO;AACT;AAMA,eAAsB,cAAc,MAA+C;AACjF,QAAM,MAAM,MAAM,WAAW,IAAI;AACjC,QAAM,IAAI,KAAK,MAAM,YAAY;AACjC,QAAM,OAAO,IAAI,OAAO;AAAA,IAAO,CAAC,MAC9B,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,GAAG,EAAE,IAAI,EAC7D,KAAK,GAAG,EACR,YAAY,EACZ,SAAS,CAAC;AAAA,EACf;AACA,MAAI,KAAK,WAAW,GAAG;AACrB,QAAI,KAAK,mBAAmB,KAAK,KAAK,IAAI;AAC1C,WAAO;AAAA,EACT;AACA,aAAW,KAAK,MAAM;AACpB,QAAI,MAAM,GAAG,EAAE,IAAI,MAAM,EAAE,KAAK,IAAI,EAAE,QAAQ,OAAO,EAAE,OAAO,EAAE;AAChE,QAAI,MAAM,OAAO,SAAS,EAAE,aAAa,EAAE,CAAC,EAAE;AAAA,EAChD;AACA,MAAI,MAAM;AAAA,EAAK,KAAK,MAAM,aAAa;AACvC,SAAO;AACT;AAOA,eAAsB,YAAY,MAAkC;AAClE,QAAM,UAAU,MAAM,eAAe,EAAE,SAAS,KAAK,SAAS,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAC5F,QAAM,QAAQ,QAAQ,UAAU,KAAK,IAAI;AACzC,QAAM,KAAK,MAAM,YAAY,iBAAiB;AAC9C,MAAI,KAAK,KAAK;AACZ,QAAI,MAAM,MAAM,IAAI;AACpB;AAAA,EACF;AACA,MAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,OAAO,MAAM,GAAG,MAAM,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,MAAM,GAAG,SAAS,EAAE;AACrG,MAAI,MAAM,cAAc,GAAG,UAAU,KAAK,IAAI,CAAC,EAAE;AACjD,MAAI,GAAG,UAAU;AACf,QAAI,MAAM,aAAa,OAAO,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC9F;AACA,MAAI,GAAG,WAAW,OAAQ,KAAI,MAAM,eAAe,GAAG,WAAW,KAAK,IAAI,CAAC,EAAE;AAC7E,MAAI,MAAM;AAAA,EAAK,MAAM,YAAY,WAAW;AAAA,CAAI;AAChD,MAAI,MAAM,UAAU;AACpB,aAAW,OAAO,GAAG,QAAS,KAAI,MAAM,KAAK,GAAG,EAAE;AAClD,QAAM,MAAM,OAAO,QAAQ,MAAM,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/E,MAAI,IAAI,OAAQ,KAAI,MAAM;AAAA,kBAAqB,IAAI,KAAK,IAAI,CAAC,EAAE;AACjE;AAEA,SAAS,SAAS,GAAW,GAAmB;AAC9C,SAAO,EAAE,UAAU,IAAI,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI;AACjD;;;AC/FA,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AAExB,SAAS,QAAgB;AACvB,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAC7C;AASO,SAAS,WAAW,YAAgC;AACzD,QAAM,OAAO,cAAc,UAAU;AACrC,QAAM,cAA4B,CAAC;AACnC,QAAM,SAAmB,CAAC;AAC1B,QAAM,SAAS,oBAAI,IAAyB;AAE5C,aAAW,OAAO,MAAM;AACtB,QAAI;AACJ,QAAI;AACF,YAAM,aAAa,KAAK,UAAU;AAAA,IACpC,SAAS,KAAK;AACZ,kBAAY,KAAK;AAAA,QACf,SAAS,UAAU,YAAY,GAAG;AAAA,QAClC,OAAO;AAAA,QACP,SAAS,6BAA6B,eAAe,QAAQ,IAAI,QAAQ,MAAM,IAAI,EAAE,CAAC,IAAI,OAAO,GAAG,CAAC;AAAA,MACvG,CAAC;AACD;AAAA,IACF;AAIA,eAAW,QAAQ,IAAI,QAAQ,MAAM,IAAI,GAAG;AAC1C,YAAM,IAAI,0DAA0D,KAAK,IAAI;AAC7E,UAAI,GAAG;AACL,oBAAY,KAAK;AAAA,UACf,SAAS,IAAI;AAAA,UACb,OAAO;AAAA,UACP,SAAS,gBAAgB,EAAE,CAAC,CAAC;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,IAAI,oBAAoB,IAAI,IAAI;AACtC,QAAI,CAAC,EAAE,IAAI;AACT,iBAAW,SAAS,EAAE,QAAQ;AAC5B,oBAAY,KAAK,EAAE,SAAS,IAAI,SAAS,OAAO,SAAS,SAAS,MAAM,CAAC;AAAA,MAC3E;AACA,aAAO,KAAK,EAAE,SAAS,IAAI,SAAS,YAAY,IAAI,YAAY,MAAM,IAAI,KAAK,CAAC;AAChF;AAAA,IACF;AACA,WAAO,KAAK,EAAE,SAAS,IAAI,SAAS,YAAY,IAAI,YAAY,IAAI,EAAE,OAAO,MAAM,IAAI,KAAK,CAAC;AAC7F,WAAO,IAAI,EAAE,MAAM,MAAM,EAAE,KAAK;AAAA,EAClC;AAGA,QAAM,WAAW,oBAAI,IAAsB;AAC3C,aAAW,KAAK,QAAQ;AACtB,UAAM,IAAI,EAAE,IAAI,QAAQ,EAAE;AAC1B,KAAC,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAI,KAAK,EAAE,OAAO;AAAA,EACjE;AACA,aAAW,CAAC,MAAM,KAAK,KAAK,UAAU;AACpC,QAAI,MAAM,SAAS,GAAG;AACpB,iBAAW,KAAK,OAAO;AACrB,oBAAY,KAAK,EAAE,SAAS,GAAG,OAAO,SAAS,SAAS,yBAAyB,IAAI,cAAc,MAAM,OAAO,CAAC,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;AAAA,MACjJ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,MAAM;AAEvB,aAAW,KAAK,QAAQ;AACtB,UAAM,OAAO,CAAC,OAAwB,YACpC,YAAY,KAAK,EAAE,SAAS,EAAE,SAAS,OAAO,QAAQ,CAAC;AACzD,QAAI,CAAC,EAAE,GAAI;AACX,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,GAAG,iBAAiB;AAG/B,QAAI,GAAG,SAAS,EAAE,YAAY;AAC5B,WAAK,SAAS,SAAS,GAAG,IAAI,iCAAiC,EAAE,UAAU,GAAG;AAAA,IAChF;AAGA,QAAI,CAAC,YAAY,KAAK,GAAG,WAAW,GAAG;AACrC,WAAK,QAAQ,4DAA4D;AAAA,IAC3E;AAGA,QAAI,GAAG,gBAAgB,UAAU;AAC/B,WAAK,SAAS,iBAAiB,GAAG,aAAa,mBAAmB;AAAA,IACpE;AAGA,QAAI,GAAG,cAAc,eAAe,CAAC,uBAAuB,KAAK,EAAE,IAAI,GAAG;AACxE,WAAK,SAAS,uEAAuE;AAAA,IACvF;AAGA,UAAM,YAAY,EAAE,KAAK,MAAM,IAAI,EAAE;AACrC,QAAI,YAAY,gBAAgB;AAC9B,WAAK,SAAS,oBAAoB,SAAS,eAAe,cAAc,6CAA6C;AAAA,IACvH,WAAW,YAAY,iBAAiB;AACtC,WAAK,QAAQ,oBAAoB,SAAS,2BAA2B,cAAc,YAAY;AAAA,IACjG;AAGA,QAAI,CAAC,EAAE,QAAQ,WAAW,GAAG,GAAG,MAAM,GAAG,GAAG;AAC1C,WAAK,QAAQ,WAAW,GAAG,MAAM,uCAAuC,EAAE,OAAO,GAAG;AAAA,IACtF;AAGA,QAAI,GAAG,QAAQ,WAAW,GAAG;AAC3B,WAAK,QAAQ,gEAA2D;AAAA,IAC1E;AACA,eAAW,OAAO,GAAG,SAAS;AAC5B,UAAI,CAAC,cAAc,KAAK,GAAG,GAAG;AAC5B,aAAK,QAAQ,yCAAyC,GAAG,EAAE;AAAA,MAC7D;AAAA,IACF;AAGA,eAAW,WAAW,oBAAoB;AACxC,UAAI,CAAC,EAAE,KAAK,SAAS,OAAO,GAAG;AAC7B,aAAK,QAAQ,gCAAgC,OAAO,GAAG;AAAA,MACzD;AAAA,IACF;AAGA,eAAW,WAAW,GAAG,YAAY;AACnC,YAAM,YAAY,OAAO,IAAI,OAAO;AACpC,UAAI,CAAC,WAAW;AACd,aAAK,SAAS,wCAAwC,OAAO,GAAG;AAChE;AAAA,MACF;AACA,UAAI,CAAC,UAAU,iBAAiB,EAAE,WAAW,SAAS,GAAG,IAAI,GAAG;AAC9D,aAAK,SAAS,eAAe,OAAO,+BAA+B,GAAG,IAAI,sBAAsB;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,YAAY,OAAO,CAAC,MAAM,EAAE,UAAU,OAAO,EAAE;AAClE,QAAM,YAAY,YAAY,OAAO,CAAC,MAAM,EAAE,UAAU,MAAM,EAAE;AAChE,SAAO,EAAE,aAAa,YAAY,KAAK,QAAQ,YAAY,UAAU;AACvE;;;ACnKA,eAAsB,YAAY,MAAwC;AACxE,QAAM,UAAU,MAAM,eAAe,EAAE,SAAS,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;AAC7E,QAAM,SAAS,WAAW,QAAQ,IAAI;AAEtC,aAAW,KAAK,OAAO,aAAa;AAClC,UAAM,OAAO,GAAG,EAAE,UAAU,UAAU,WAAM,GAAG,IAAI,EAAE,OAAO,KAAK,EAAE,OAAO;AAC1E,QAAI,EAAE,UAAU,QAAS,KAAI,MAAM,IAAI;AAAA,QAClC,KAAI,KAAK,IAAI;AAAA,EACpB;AAEA,MAAI;AAAA,IACF;AAAA,SAAY,OAAO,UAAU,cAAc,OAAO,UAAU,cAAc,OAAO,SAAS;AAAA,EAC5F;AACA,SAAO,OAAO,eAAe;AAC/B;;;ACxBA,SAAS,cAAAC,cAAY,gBAAAC,eAAc,iBAAAC,sBAAqB;AACxD,SAAS,QAAAC,cAAY;;;ACDrB,SAAS,KAAAC,UAAS;AAIX,IAAM,sBAAsBC,GAAE,OAAO;AAAA,EAC1C,MAAMA,GAAE,OAAO;AAAA,EACf,QAAQA,GAAE,OAAO;AAAA,EACjB,OAAO;AAAA,EACP,UAAUA,GAAE,OAAO;AAAA,EACnB,aAAaA,GAAE,OAAO;AAAA,EACtB,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAC7B,WAAW;AAAA,EACX,SAASA,GAAE,OAAO;AAAA,EAClB,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EAE1C,MAAMA,GAAE,OAAO;AAAA;AAAA,EAEf,WAAWA,GAAE,OAAO;AAAA,IAClB,WAAWA,GAAE,QAAQ;AAAA,IACrB,UAAUA,GAAE,QAAQ;AAAA,IACpB,WAAWA,GAAE,QAAQ;AAAA,EACvB,CAAC;AACH,CAAC;AAEM,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EACrC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE7B,SAASA,GAAE,OAAO,EAAE,QAAQ,OAAO;AAAA,EACnC,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQA,GAAE,MAAM,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAKM,IAAM,oBAAoB;;;ADpBjC,eAAsB,qBAAqB,MAA8C;AACvF,QAAM,UAAU,MAAM,eAAe,EAAE,SAAS,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;AAC7E,QAAMC,YAAW,cAAc,QAAQ,MAAM,KAAK,WAAW,OAAO;AACpE,QAAM,OAAO,KAAK,UAAUA,WAAU,MAAM,CAAC,IAAI;AACjD,QAAM,UAAUC,OAAK,QAAQ,MAAM,iBAAiB;AAEpD,MAAI,KAAK,OAAO;AACd,UAAM,UAAUC,aAAW,OAAO,IAAIC,cAAa,SAAS,MAAM,IAAI;AACtE,QAAI,YAAY,MAAM;AACpB,UAAI,MAAM,mFAA8E;AACxF,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,gCAAgCH,UAAS,OAAO,MAAM,WAAW;AAC7E,WAAO;AAAA,EACT;AAEA,EAAAI,eAAc,SAAS,MAAM,MAAM;AACnC,MAAI,QAAQ,SAAS,iBAAiB,KAAKJ,UAAS,OAAO,MAAM,WAAW;AAC5E,SAAO;AACT;;;AEnCA,SAAS,aAAAK,YAAW,iBAAAC,sBAAqB;AACzC,SAAS,WAAAC,UAAS,QAAAC,QAAM,WAAAC,gBAAe;AAQvC,IAAM,cAA0C;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,UAAU;AACZ;AAEA,IAAM,iBAA6C;AAAA,EACjD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,UAAU;AACZ;AAEA,SAAS,WAAW,QAAgB,KAAyB;AAC3D,QAAM,SAAS,QAAQ,aAAa,cAAc;AAClD,SAAO,iBAAiB,MAAM,IAAI,MAAM;AAC1C;AAEA,SAAS,UAAU,GAAmB;AACpC,SAAO,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC;AAC9C;AAUA,eAAsB,wBAAwB,MAA8C;AAC1F,QAAM,UAAU,MAAM,eAAe,EAAE,SAAS,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;AAC7E,QAAM,MAAMC,SAAQ,KAAK,OAAOC,SAAQ,QAAQ,IAAI,CAAC;AACrD,QAAM,UAAU,KAAK,WAAW;AAGhC,QAAM,SAAS,oBAAI,IAAsF;AAEzG,aAAW,OAAO,QAAQ,UAAU,GAAG;AACrC,UAAM,QAAQ,QAAQ,UAAU,IAAI,MAAM,OAAO,EAAE,IAAI,CAAE;AACzD,UAAM,KAAK,MAAM,YAAY,iBAAiB;AAC9C,UAAM,MAAM,GAAG,GAAG,MAAM,IAAI,GAAG,KAAK;AACpC,UAAM,OAAO,WAAW,GAAG,QAAQ,GAAG,KAAK;AAC3C,UAAM,MAAmB;AAAA,MACvB,aAAa;AAAA,MACb,OAAO;AAAA,QACL,QAAQ,WAAW,IAAI;AAAA,QACvB,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,KAAK,OAAO,GAAG;AAC3C,UAAM,IAAI,OAAO,IAAI,GAAG,KAAK,EAAE,QAAQ,GAAG,QAAQ,KAAK,GAAG,OAAO,OAAO,CAAC,GAAG,OAAO,EAAE;AACrF,MAAE,MAAM,KAAK,GAAG,KAAK;AACrB,MAAE,SAAS;AACX,WAAO,IAAI,KAAK,CAAC;AAAA,EACnB;AAEA,QAAM,UAMA,CAAC;AAEP,aAAW,EAAE,QAAQ,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,GAAG;AAC3D,UAAM,OAAO,WAAW,QAAQ,GAAG;AACnC,eAAW,KAAK,OAAO,EAAE,WAAW,KAAK,CAAC;AAE1C,UAAM,cAAc,GAAG,UAAU,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC;AAC5D,UAAM,YAAYC,OAAK,KAAK,WAAW,MAAM,gBAAgB;AAC7D,IAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,EAAE,MAAM,6BAA6B;AAAA,IAC/C;AACA,IAAAC,eAAcF,OAAK,WAAW,aAAa,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,MAAM,MAAM;AAE9F,YAAQ,KAAK,EAAE,MAAM,QAAQ,aAAa,IAAI,IAAI,aAAa,SAAS,UAAU,eAAe,GAAG,EAAE,CAAC;AACvG,QAAI,KAAK,SAAS,IAAI,KAAK,KAAK,WAAW;AAAA,EAC7C;AAEA,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACnD,QAAMG,eAAc;AAAA,IAClB,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO,EAAE,MAAM,6BAA6B;AAAA,IAC5C;AAAA,EACF;AACA,QAAM,QAAQH,OAAK,KAAK,gBAAgB;AACxC,EAAAC,WAAU,OAAO,EAAE,WAAW,KAAK,CAAC;AACpC,EAAAC,eAAcF,OAAK,OAAO,kBAAkB,GAAG,KAAK,UAAUG,cAAa,MAAM,CAAC,IAAI,MAAM,MAAM;AAClG,MAAI,QAAQ,0CAA0C,QAAQ,MAAM,YAAY;AAClF;;;AC3GA,SAAS,cAAAC,cAAY,aAAAC,YAAW,iBAAAC,sBAAqB;AACrD,SAAS,QAAAC,cAAY;AAarB,SAAS,SAAS,QAAgB,KAAiB,UAAkB,MAAsB;AACzF,QAAMC,UAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAClD,SAAO;AAAA,QACD,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMA,MAAM;AAAA,WACP,GAAG;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA;AAAA;AAAA;AAAA,oBAIFA,MAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BzB;AAEA,eAAsB,gBAAgB,MAAwC;AAC5E,QAAM,QAAQ,KAAK,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AACjD,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,IAAI,MAAM,+CAA+C,KAAK,IAAI,IAAI;AAAA,EAC9E;AACA,QAAM,SAAS,MAAM,CAAC;AACtB,QAAM,MAAM,iBAAiB,MAAM,MAAM,CAAC,CAAC;AAC3C,QAAM,WAAW,MAAM,CAAC;AACxB,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AAEnC,QAAM,UAAU,MAAM,eAAe,EAAE,SAAS,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;AAC7E,QAAM,MAAMC,OAAK,QAAQ,MAAM,QAAQ,UAAU,GAAG,GAAG,GAAG,MAAM,MAAM,CAAC,CAAC;AACxE,QAAM,UAAUA,OAAK,KAAK,UAAU;AAEpC,MAAIC,aAAW,OAAO,KAAK,CAAC,KAAK,OAAO;AACtC,UAAM,IAAI,MAAM,2BAA2B,OAAO,8BAA8B;AAAA,EAClF;AACA,EAAAC,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,EAAAC,eAAc,SAAS,SAAS,QAAQ,KAAK,UAAU,IAAI,GAAG,MAAM;AACpE,MAAI,QAAQ,WAAW,OAAO,EAAE;AAChC,SAAO;AACT;;;ApCtEA,IAAM,QAAQ,IAAI,IAAY,WAAW;AAEzC,SAAS,aAAa,OAAwC;AAC5D,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,UAAU,MAAO,QAAO;AAC5B,QAAM,MAAM,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAChE,aAAW,MAAM,KAAK;AACpB,QAAI,CAAC,MAAM,IAAI,EAAE,GAAG;AAClB,YAAM,IAAI,MAAM,mBAAmB,EAAE,aAAa,CAAC,GAAG,OAAO,KAAK,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,IACnF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,IAAI,IAAsC,cAAc,OAAsB;AAC3F,MAAI;AACF,UAAM,SAAS,MAAM,GAAG;AACxB,QAAI,eAAe,WAAW,MAAO,SAAQ,WAAW;AAAA,EAC1D,SAAS,KAAK;AACZ,QAAI,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC1D,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,IAAM,UAAU,IAAI,QAAQ;AAC5B,QACG,KAAK,eAAe,EACpB,YAAY,yEAAyE,EACrF,QAAQ,OAAO;AAElB,QACG,QAAQ,MAAM,EACd,YAAY,2CAA2C,EACvD,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,eAAe,iBAAiB,EACvC,OAAO,eAAe,sDAAsD,EAC5E,OAAO,WAAW,8BAA8B,EAChD;AAAA,EAAO,CAAC,SACP;AAAA,IAAI,MACF,YAAY;AAAA,MACV,KAAK,QAAQ,IAAI;AAAA,MACjB,SAAS,aAAa,KAAK,MAAM;AAAA,MACjC,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,OAAO,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AACF;AAEF,QACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC,OAAO,qBAAqB,qBAAqB,EACjD,OAAO,iBAAiB,EACxB,OAAO,uBAAuB,EAC9B,OAAO,uBAAuB,EAC9B,OAAO,QAAQ,EACf,OAAO,mBAAmB,wBAAwB,EAClD,OAAO,aAAa,EACpB;AAAA,EAAO,CAAC,SACP;AAAA,IAAI,MACF,YAAY;AAAA,MACV,KAAK,QAAQ,IAAI;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,KAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAEF,QACG,QAAQ,gBAAgB,EACxB,YAAY,0CAA0C,EACtD,OAAO,iBAAiB,EACxB,OAAO,aAAa,EACpB;AAAA,EAAO,CAAC,OAAO,SACd,IAAI,MAAM,cAAc,EAAE,KAAK,QAAQ,IAAI,GAAG,OAAO,SAAS,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC,CAAC;AAC9F;AAEF,QACG,QAAQ,aAAa,EACrB,YAAY,kCAAkC,EAC9C,OAAO,SAAS,6BAA6B,EAC7C,OAAO,iBAAiB,EACxB,OAAO,aAAa,EACpB;AAAA,EAAO,CAAC,MAAM,SACb;AAAA,IAAI,MACF,YAAY,EAAE,KAAK,QAAQ,IAAI,GAAG,MAAM,KAAK,KAAK,KAAK,SAAS,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;AAAA,EAC/F;AACF;AAEF,QACG,QAAQ,gBAAgB,EACxB,YAAY,8DAA8D,EAC1E,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,gBAAgB,4CAA4C,EACnE,OAAO,aAAa,yBAAyB,EAC7C,OAAO,eAAe,wCAAwC,EAC9D,OAAO,iBAAiB,EACxB,OAAO,aAAa,EACpB;AAAA,EAAO,CAAC,OAAO,SACd;AAAA,IAAI,MACF,WAAW;AAAA,MACT,KAAK,QAAQ,IAAI;AAAA,MACjB;AAAA,MACA,SAAS,aAAa,KAAK,MAAM;AAAA,MACjC,WAAW,KAAK;AAAA,MAChB,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,KAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAEF,QACG,QAAQ,mBAAmB,EAC3B,YAAY,yCAAyC,EACrD,OAAO,WAAW,EAClB,OAAO,eAAe,yCAAyC,EAC/D,OAAO,iBAAiB,EACxB,OAAO,aAAa,EACpB;AAAA,EAAO,CAAC,OAAO,SACd;AAAA,IAAI,MACF,cAAc;AAAA,MACZ,KAAK,QAAQ,IAAI;AAAA,MACjB;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,KAAK,KAAK;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAEF,QACG,QAAQ,mBAAmB,EAC3B,YAAY,yBAAyB,EACrC,OAAO,mBAAmB,qBAAqB,EAC/C,OAAO,WAAW,EAClB;AAAA,EAAO,CAAC,OAAO,SACd;AAAA,IAAI,MACF,cAAc,EAAE,KAAK,QAAQ,IAAI,GAAG,OAAO,SAAS,aAAa,KAAK,MAAM,GAAG,QAAQ,KAAK,OAAO,CAAC;AAAA,EACtG;AACF;AAEF,QACG,QAAQ,QAAQ,EAChB,YAAY,oDAAoD,EAChE,OAAO,MAAM,IAAI,MAAM,cAAc,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;AAEhE,QACG,QAAQ,MAAM,EACd,YAAY,iDAAiD,EAC7D,OAAO,iBAAiB,EACxB,OAAO,CAAC,SAAS,IAAI,MAAM,YAAY,EAAE,KAAK,QAAQ,IAAI,GAAG,SAAS,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC;AAE/F,QACG,QAAQ,YAAY,EACpB,YAAY,gEAAgE,EAC5E,OAAO,iBAAiB,EACxB,OAAO,SAAS,EAChB;AAAA,EAAO,CAAC,MAAM,SACb,IAAI,MAAM,gBAAgB,EAAE,KAAK,QAAQ,IAAI,GAAG,MAAM,SAAS,KAAK,SAAS,OAAO,KAAK,MAAM,CAAC,CAAC;AACnG;AAEF,IAAM,WAAW,QAAQ,QAAQ,UAAU,EAAE,YAAY,sBAAsB;AAC/E,SACG,QAAQ,OAAO,EACf,YAAY,4CAA4C,EACxD,OAAO,iBAAiB,EACxB,OAAO,WAAW,oDAAoD,EACtE,OAAO,eAAe,EACtB;AAAA,EAAO,CAAC,SACP;AAAA,IACE,MAAM,qBAAqB,EAAE,KAAK,QAAQ,IAAI,GAAG,SAAS,KAAK,SAAS,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ,CAAC;AAAA,IAClH;AAAA,EACF;AACF;AAEF,IAAM,cAAc,QAAQ,QAAQ,aAAa,EAAE,YAAY,gCAAgC;AAC/F,YACG,QAAQ,OAAO,EACf,YAAY,gEAAgE,EAC5E,OAAO,iBAAiB,EACxB,OAAO,eAAe,aAAa,EACnC,OAAO,eAAe,EACtB;AAAA,EAAO,CAAC,SACP;AAAA,IAAI,MACF,wBAAwB,EAAE,KAAK,QAAQ,IAAI,GAAG,SAAS,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,EAC7G;AACF;AAEF,QAAQ,WAAW,QAAQ,IAAI;","names":["existsSync","join","z","join","existsSync","existsSync","basename","join","existsSync","join","existsSync","readFileSync","join","z","join","readFileSync","existsSync","basename","join","existsSync","existsSync","readFileSync","join","existsSync","readdirSync","readFileSync","writeFileSync","join","join","existsSync","writeFileSync","readFileSync","readdirSync","join","existsSync","readFileSync","existsSync","readFileSync","writeFileSync","join","registry","existsSync","readFileSync","join","existsSync","join","readFileSync","existsSync","readFileSync","writeFileSync","join","z","z","registry","join","existsSync","readFileSync","writeFileSync","mkdirSync","writeFileSync","dirname","join","resolve","resolve","dirname","join","mkdirSync","writeFileSync","marketplace","existsSync","mkdirSync","writeFileSync","join","today","join","existsSync","mkdirSync","writeFileSync"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "skills-master",
3
+ "version": "0.1.0",
4
+ "description": "Install tool-agnostic Apple development skills into any AI coding tool (Claude Code, Cursor, Copilot, AGENTS.md).",
5
+ "keywords": [
6
+ "skills",
7
+ "apple",
8
+ "swift",
9
+ "swiftui",
10
+ "claude",
11
+ "cursor",
12
+ "copilot",
13
+ "agents.md",
14
+ "ai",
15
+ "agent"
16
+ ],
17
+ "license": "MIT",
18
+ "author": "Chintan Soni",
19
+ "homepage": "https://github.com/iChintanSoni/skills-master#readme",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/iChintanSoni/skills-master.git",
23
+ "directory": "packages/cli"
24
+ },
25
+ "bugs": {
26
+ "url": "https://github.com/iChintanSoni/skills-master/issues"
27
+ },
28
+ "type": "module",
29
+ "bin": {
30
+ "skills-master": "./dist/bin.js"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "README.md"
35
+ ],
36
+ "engines": {
37
+ "node": ">=20"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "scripts": {
43
+ "build": "tsup",
44
+ "dev": "tsx src/bin.ts",
45
+ "test": "vitest run",
46
+ "test:watch": "vitest",
47
+ "typecheck": "tsc --noEmit",
48
+ "prepublishOnly": "tsup"
49
+ },
50
+ "dependencies": {
51
+ "commander": "^12.1.0",
52
+ "giget": "^1.2.3",
53
+ "gray-matter": "^4.0.3",
54
+ "semver": "^7.6.3",
55
+ "yaml": "^2.5.1",
56
+ "zod": "^3.23.8"
57
+ },
58
+ "devDependencies": {
59
+ "@types/node": "^22.7.5",
60
+ "@types/semver": "^7.5.8",
61
+ "tsup": "^8.3.0",
62
+ "tsx": "^4.19.2",
63
+ "typescript": "^5.6.3",
64
+ "vitest": "^2.1.2"
65
+ }
66
+ }