@teamix-evo/registry 0.7.0 → 0.9.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.
- package/dist/index.cjs +310 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2253 -102
- package/dist/index.d.ts +2253 -102
- package/dist/index.js +289 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema/manifest.ts","../src/schema/tokens-pack.ts","../src/schema/variant-ui-pack.ts","../src/schema/config.ts","../src/schema/installed.ts","../src/schema/skills-lock.ts","../src/loader.ts","../src/validator.ts","../src/tokens-pack-loader.ts","../src/variant-ui-pack-loader.ts","../src/managed-regions.ts","../src/strategy.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Update strategy for a resource.\n * - frozen: CLI will not modify after first install\n * - regenerable: Entire file is rewritten on update\n * - managed: Only managed regions are rewritten, rest is preserved\n */\nexport const UpdateStrategySchema = z.enum([\n 'frozen',\n 'regenerable',\n 'managed',\n]);\n\n/**\n * Resource type discriminator.\n */\nexport const ResourceTypeSchema = z.enum([\n 'doc',\n 'tokens',\n 'ai-rules',\n 'config',\n 'skill',\n]);\n\n/**\n * Supported AI IDE identifiers for skill resources.\n * Qoder and Claude Code share the same SKILL.md format; differ only by install path.\n */\nexport const SkillIdeSchema = z.enum(['qoder', 'claude']);\n\n/**\n * Skill installation scope.\n * - project: install under project root (.qoder/skills/, .claude/skills/)\n * - global: install under user home (~/.qoder/skills/, ~/.claude/skills/)\n */\nexport const SkillScopeSchema = z.enum(['project', 'global']);\n\n/**\n * A single resource entry within a variant manifest.\n */\nexport const ResourceSchema = z.object({\n /** Unique identifier for the resource within the manifest */\n id: z.string().min(1),\n /** Resource type */\n type: ResourceTypeSchema,\n /** Source path (relative to variant root), typically a template */\n source: z.string().min(1),\n /**\n * Target path (relative to project root) where the resource is installed.\n * For type=\"skill\" this is ignored: the path is computed from skill name + ide + scope.\n */\n target: z.string().min(1),\n /** How the resource is updated */\n updateStrategy: UpdateStrategySchema,\n /** Whether the source is a Handlebars template */\n template: z.boolean().optional(),\n /** IDs of managed regions (only relevant when updateStrategy is \"managed\") */\n managedRegions: z.array(z.string()).optional(),\n /** Whether to recursively process directory contents */\n recursive: z.boolean().optional(),\n /** Supported IDEs (only meaningful when type=\"skill\"; defaults to all when omitted) */\n ides: z.array(SkillIdeSchema).optional(),\n /** Default install scope (only meaningful when type=\"skill\"; user can override at install time) */\n scope: SkillScopeSchema.optional(),\n});\n\n/**\n * Variant manifest schema — describes a variant package and its resources.\n */\nexport const VariantManifestSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Package name (e.g. \"design\") */\n package: z.string().min(1),\n /** Variant identifier (e.g. \"opentrek\") */\n variant: z.string().min(1),\n /** Human-readable name */\n displayName: z.string().min(1),\n /** Description of the variant */\n description: z.string(),\n /** Semver version string */\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/, 'Invalid semver version'),\n /** Engine compatibility */\n engines: z.object({\n 'teamix-evo': z.string().min(1),\n }),\n /** Supported IDE identifiers */\n ide: z.array(z.string().min(1)),\n /** List of resources provided by this variant */\n resources: z.array(ResourceSchema),\n});\n\n/**\n * A single skill entry within a skills package manifest.\n */\nexport const SkillEntrySchema = z.object({\n /** Skill identifier (matches name/folder) */\n id: z.string().min(1),\n /** Skill name — must match the directory name and frontmatter `name` */\n name: z\n .string()\n .min(1)\n .regex(\n /^[a-z0-9][a-z0-9-]*$/,\n 'Skill name must be lowercase letters, digits, hyphens (no leading hyphen)',\n ),\n /** One-line description for skill discovery */\n description: z.string().min(1),\n /** Semver version */\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/, 'Invalid semver version'),\n /** Source path relative to package root — file or directory */\n source: z.string().min(1),\n /** Supported IDEs (defaults to both when omitted) */\n ides: z.array(SkillIdeSchema).default(['qoder', 'claude']),\n /** Update strategy (defaults to managed) */\n updateStrategy: UpdateStrategySchema.default('managed'),\n /** Managed region IDs to maintain on update */\n managedRegions: z.array(z.string()).optional(),\n /** Whether the source is a Handlebars template */\n template: z.boolean().optional(),\n /**\n * Variant identifier when this skill is bound to a specific design variant\n * (e.g. `\"opentrek\"`, `\"uni-manager\"`). Optional — neutral skills (manage,\n * coding-conventions, baseline design-rules) leave it unset.\n *\n * When present, the CLI installs this skill ONLY if the consumer's\n * `.teamix-evo/tokens-lock.json` records the same variant. MUST equal\n * the variant directory name in `@teamix-evo/tokens/variants/<name>/`.\n *\n * Mirrors `UiEntrySchema.variant` semantics in @teamix-evo/biz-ui &\n * @teamix-evo/templates per ADR 0014.\n */\n variant: z.string().optional(),\n /**\n * Default install scope for this skill. Per ADR 0033.\n *\n * - `\"global\"` — entry skill (lifecycle / orchestrator). `skills add` in\n * project scope SKIPS these unless explicitly named on the\n * command line (then installs with a warning). Recommended\n * to install once via `skills add <id> --scope global`.\n * - `\"project\"` — variant content skill (default when omitted). Installed\n * with the project that uses it.\n *\n * `undefined` is treated as `\"project\"` — old manifests without this field\n * still validate.\n */\n scope: SkillScopeSchema.optional(),\n});\n\n/**\n * Skills package manifest schema — top-level manifest of `@teamix-evo/skills`.\n * Skills are stored flat in the manifest. Variant binding is expressed via\n * the optional `variant` field on each entry (see SkillEntrySchema).\n */\nexport const SkillsPackageManifestSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Always \"skills\" for this package */\n package: z.literal('skills'),\n /** Semver version of the skills package */\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/, 'Invalid semver version'),\n /** Engine compatibility */\n engines: z.object({\n 'teamix-evo': z.string().min(1),\n }),\n /** Flat list of skills shipped by this package */\n skills: z.array(SkillEntrySchema),\n});\n\n// ─── UI package (source-injected components, shadcn-style) ────────────────────\n\n/**\n * UI entry types.\n * - component: a React component (e.g. button.tsx)\n * - hook: a React hook (e.g. use-controllable.ts)\n * - util: a utility function (e.g. cn.ts)\n * - block: a higher-level composition shipped by ui or biz-ui (FilterBar,\n * EmptyState, OrgPicker, ApprovalCard). Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md),\n * ui ships generic blocks, biz-ui ships variant-bound business blocks.\n * - template: a page-level composition shipped by `@teamix-evo/templates`\n * (DashboardLayout, ListDetailPage, ...). Per ADR 0014, templates are\n * variant-aware (mirror biz-ui).\n */\nexport const UiEntryTypeSchema = z.enum([\n 'component',\n 'hook',\n 'util',\n 'block',\n 'template',\n]);\n\n/**\n * Alias keys used to resolve where an entry file lands in the user's project.\n * Each key maps to a path configured in `config.json` `packages.ui.aliases`.\n *\n * - `components`: src/components/ui/ (ui & biz-ui blocks default here)\n * - `business`: src/components/business/ (biz-ui only — see ADR 0014)\n * - `templates`: src/templates/ or src/pages/ (templates package — ADR 0014)\n */\nexport const UiAliasSchema = z.enum([\n 'components',\n 'hooks',\n 'utils',\n 'lib',\n 'business',\n 'templates',\n]);\n\n/**\n * Maturity / lifecycle status of a UI entry.\n *\n * Drives consumer trust signal (e.g. shown in `ui list` output, registry-mcp\n * `list_components` tool, autodocs page) so AI / humans know whether to depend\n * on it for production code.\n *\n * - **stable** (default): API committed; breaking changes only via major bump\n * - **experimental** : API may change; do not use in production\n * - **deprecated** : Slated for removal; consumers should migrate to `replacedBy`\n *\n * See ADR 0001-three-layer-alignment and PLAN §12.3 P0-3.\n */\nexport const UiEntryStatusSchema = z.enum([\n 'stable',\n 'experimental',\n 'deprecated',\n]);\nexport type UiEntryStatus = z.infer<typeof UiEntryStatusSchema>;\n\n/**\n * A single file shipped by a UI entry.\n * Multiple files form one logical entry (rare, but supported).\n */\nexport const UiEntryFileSchema = z.object({\n /** Source path relative to the ui package root (e.g. \"src/components/button/button.tsx\") */\n source: z.string().min(1),\n /** Which alias this file resolves under in the consumer project */\n targetAlias: UiAliasSchema,\n /** Filename written under the alias directory (e.g. \"button.tsx\") */\n targetName: z.string().min(1),\n});\n\n/**\n * A single UI entry (component / hook / util / block).\n */\nexport const UiEntrySchema = z.object({\n /** Unique entry identifier within the ui package (e.g. \"button\") */\n id: z\n .string()\n .min(1)\n .regex(\n /^[a-z0-9][a-z0-9-]*$/,\n 'UI entry id must be lowercase letters, digits, hyphens (no leading hyphen)',\n ),\n /** Display name (e.g. \"Button\") */\n name: z.string().min(1),\n /** Entry type */\n type: UiEntryTypeSchema,\n /** One-line description for entry discovery and AI guidance */\n description: z.string().min(1),\n /** Files this entry ships (typically 1) */\n files: z.array(UiEntryFileSchema).min(1),\n /**\n * Optional path to an AI-readable meta document (frontmatter + Markdown).\n * Read directly from `@teamix-evo/ui` by MCP at runtime — no consumer-side\n * copy is written (per ADR 0020 §3).\n */\n meta: z.string().optional(),\n /** Other UI entries this one depends on (e.g. \"button\" depends on \"cn\") */\n registryDependencies: z.array(z.string()).optional(),\n /** npm dependencies required by this entry (name → semver range) */\n dependencies: z.record(z.string(), z.string()).optional(),\n /**\n * How CLI handles this entry on `ui upgrade`.\n * Defaults to `frozen` — user-owned source code, untouched after first install.\n * Upgrade is handled by AI + skill flow (no CLI rewrite). See PLAN §10.9.\n */\n updateStrategy: UpdateStrategySchema.default('frozen'),\n /**\n * Whether the source file should be passed through Handlebars before write.\n * Most entries don't need templating (use import-rewrite transformer instead).\n */\n template: z.boolean().optional(),\n /**\n * Maturity / lifecycle status of this entry. Defaults to `stable`.\n * See {@link UiEntryStatusSchema} for semantics.\n */\n status: UiEntryStatusSchema.default('stable'),\n /**\n * Free-text rationale shown to consumers when `status` is `deprecated`.\n * Should explain why the entry is going away and what replaces it.\n */\n deprecatedReason: z.string().optional(),\n /**\n * If this entry is `deprecated`, the id of the entry that supersedes it.\n * Consumers (and AI) should migrate to `replacedBy` rather than this entry.\n */\n replacedBy: z.string().optional(),\n /**\n * Variant identifier when this entry is shipped from a variant-aware\n * package (`@teamix-evo/biz-ui` or `@teamix-evo/templates` per ADR 0014).\n * Optional — entries from `@teamix-evo/ui` (variant-agnostic) leave it unset.\n * MUST equal the variant directory name when present.\n */\n variant: z.string().optional(),\n});\n\n/**\n * UI package manifest schema — top-level manifest of `@teamix-evo/ui`.\n * Like skills, UI is flat (no variants); brand differences are absorbed by\n * design tokens at the `var(--primary)` layer.\n */\nexport const UiPackageManifestSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Always \"ui\" for this package */\n package: z.literal('ui'),\n /** Semver version of the ui package */\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/, 'Invalid semver version'),\n /** Engine compatibility */\n engines: z.object({\n 'teamix-evo': z.string().min(1),\n }),\n /** Active list of entries shipped (and exposed) by this package. */\n entries: z.array(UiEntrySchema),\n /**\n * Archived entries that are kept in source for Storybook documentation only\n * and are NOT exposed through the active distribution chain. Per ADR 0028:\n * - `teamix-evo ui add <id>` rejects ids found here unless `--include-deprecated` is passed\n * - MCP `list_components` / `find_components` exclude these by default\n * - Storybook keeps the story under `废弃 · Deprecated/` with a banner\n * Optional for backwards compatibility — older manifests without this field\n * still validate.\n */\n deprecatedEntries: z.array(UiEntrySchema).optional(),\n});\n","/**\n * `@teamix-evo/tokens` package manifest schema.\n *\n * Per [ADR 0020](../../../../docs/adr/0020-design-to-tokens-skill-fusion.md)\n * the package is now a pure, variant-list catalog — no `default/` baseline,\n * no per-variant `pack.json`, no walk-and-merge inheritance:\n *\n * packages/tokens/\n * ├── manifest.json <- this schema (top-level catalog)\n * └── variants/\n * ├── opentrek/\n * │ ├── theme.css <- Tailwind v4 @theme source of truth\n * │ └── base.tokens.json\n * └── uni-manager/\n * ├── theme.css\n * └── base.tokens.json\n *\n * Each variant is a complete, self-contained token set (ADR 0020 §3). The\n * catalog is the single source of truth for variant identity + advertised\n * files; the validator (`packages/tokens/scripts/validate-variants.ts`)\n * enforces parity between catalog entries and on-disk variant directories.\n */\nimport { z } from 'zod';\n\nconst VARIANT_NAME_RE = /^[a-z][a-z0-9-]*$/;\nconst SEMVER_RE = /^\\d+\\.\\d+\\.\\d+/;\n\n/**\n * Soft cross-package links advertised by a variant.\n *\n * Format: `<package-spec>#<variant-name>`, e.g. `@teamix-evo/biz-ui#opentrek`.\n * The link is **soft** — the linked package may not exist yet.\n *\n * Templates link added per [ADR 0014 amendment](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nexport const TokensPackLinkedSchema = z.object({\n 'biz-ui': z.string().optional(),\n templates: z.string().optional(),\n});\n\n/**\n * One variant entry in the top-level catalog.\n */\nexport const TokensVariantEntrySchema = z.object({\n /** Variant id — lowercase kebab-case. */\n name: z\n .string()\n .min(1)\n .regex(\n VARIANT_NAME_RE,\n 'Variant name must be lowercase letters/digits/hyphens (no leading hyphen).',\n ),\n /** Human-readable display name (e.g. \"OpenTrek\" for variant id \"opentrek\"). */\n displayName: z.string().min(1),\n /** Variant version — semver. May trail the package version when only a subset of variants change. */\n version: z.string().regex(SEMVER_RE, 'Invalid semver version'),\n /** Optional one-liner description; surfaced in `tokens list-variants` output. */\n description: z.string().optional(),\n /**\n * Files this variant advertises, paths relative to the tokens package root\n * (e.g. `variants/opentrek/theme.css`). The validator walks these to\n * confirm presence; the CLI consumes them at install time.\n */\n files: z.array(z.string().min(1)).min(1),\n /** Soft cross-package links (biz-ui / templates with the same variant name). */\n linked: TokensPackLinkedSchema.optional(),\n});\n\nexport type TokensVariantEntry = z.infer<typeof TokensVariantEntrySchema>;\nexport type TokensPackLinked = z.infer<typeof TokensPackLinkedSchema>;\n\n/**\n * Top-level catalog of all variants in `@teamix-evo/tokens`.\n *\n * Lives at `packages/tokens/manifest.json`. Lists every variant the package\n * ships. The catalog is hand-edited (or regenerable via\n * `pnpm --filter @teamix-evo/tokens validate`); variant directories on disk\n * are the source of truth for file content.\n */\nexport const TokensPackageManifestSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Always `\"tokens\"` — disambiguates from other teamix-evo package manifests. */\n package: z.literal('tokens'),\n /** Semver of the entire tokens package. */\n version: z.string().regex(SEMVER_RE, 'Invalid semver version'),\n /** Engine compatibility. */\n engines: z.object({ 'teamix-evo': z.string().min(1) }),\n /** Optional package-level description. */\n description: z.string().optional(),\n /** All shipped variants (excluding scaffold dirs that begin with `_`). */\n variants: z.array(TokensVariantEntrySchema),\n /**\n * Reserved for future shared assets that span variants (e.g. browser\n * quirks resets co-shipped at the package root). Empty array today.\n */\n shared: z.array(z.string()).optional(),\n});\n\nexport type TokensPackageManifest = z.infer<typeof TokensPackageManifestSchema>;\n\n/**\n * Consumer-side lock file written to\n * `.teamix-evo/tokens-lock.json` after `tokens init`.\n *\n * Records which tokens variant + version was installed. There is no longer a\n * `default` field — every variant is self-contained per ADR 0020.\n */\nexport const TokensPackLockSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n variant: z.object({\n name: z.string().min(1),\n displayName: z.string().min(1),\n version: z.string().regex(SEMVER_RE),\n from: z.string().min(1), // e.g. \"@teamix-evo/tokens\"\n }),\n /** Tokens package version — useful when variant version trails the package. */\n packageVersion: z.string().regex(SEMVER_RE),\n linked: TokensPackLinkedSchema.optional(),\n installedAt: z.string().datetime(),\n});\n\nexport type TokensPackLock = z.infer<typeof TokensPackLockSchema>;\n","/**\n * Schemas for variant-aware UI packages — `@teamix-evo/biz-ui` and\n * `@teamix-evo/templates`.\n *\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md), these\n * two packages mirror `@teamix-evo/tokens`'s variant model: each ships a\n * top-level catalog (variants list) plus a per-variant manifest (entry list).\n *\n * packages/biz-ui/\n * ├── manifest.json <- VariantUiPackageCatalogSchema\n * └── variants/<name>/\n * └── manifest.json <- VariantUiPackageManifestSchema\n *\n * The per-variant manifest is **structurally similar to `UiPackageManifest`**\n * (flat entries list) but adds a `variant` field — the variant name that all\n * entries in this manifest belong to. Each entry's `variant` field MUST match\n * (cross-checked at validation).\n */\nimport { z } from 'zod';\nimport { UiEntrySchema } from './manifest.js';\n\nconst SEMVER_RE = /^\\d+\\.\\d+\\.\\d+/;\nconst VARIANT_NAME_RE = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Discriminator for which variant-aware package this manifest belongs to.\n */\nexport const VariantUiPackageNameSchema = z.enum(['biz-ui', 'templates']);\n\n/**\n * Per-variant manifest — lives at `packages/<pkg>/variants/<name>/manifest.json`.\n *\n * Lists the entries this variant ships. Entries reuse `UiEntrySchema` (they\n * are technically the same shape as ui entries — only difference is they\n * declare a `variant` field tying them to a brand).\n */\nexport const VariantUiPackageManifestSchema = z\n .object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Discriminator. */\n package: VariantUiPackageNameSchema,\n /**\n * Variant identifier — lowercase kebab-case, MUST match the parent\n * directory name (e.g. `opentrek` for `variants/opentrek/manifest.json`).\n * `_template` is also accepted for the variant scaffold.\n */\n variant: z\n .string()\n .min(1)\n .regex(\n VARIANT_NAME_RE,\n 'Variant id must be lowercase letters/digits/hyphens (no leading hyphen). Special: \"_template\" allowed.',\n )\n .or(z.literal('_template')),\n /** Semver of this variant. */\n version: z.string().regex(SEMVER_RE, 'Invalid semver version'),\n /** Engine compatibility. */\n engines: z.object({ 'teamix-evo': z.string().min(1) }),\n /** Flat list of entries shipped by this variant. */\n entries: z.array(UiEntrySchema),\n })\n .superRefine((data, ctx) => {\n // Cross-field check: every entry's `variant` (if set) must match this\n // manifest's variant. Entries without a `variant` field are auto-tagged\n // with the manifest's variant at load time.\n for (const [i, entry] of data.entries.entries()) {\n if (entry.variant !== undefined && entry.variant !== data.variant) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['entries', i, 'variant'],\n message: `Entry \"${entry.id}\" declares variant \"${entry.variant}\" but lives in manifest of variant \"${data.variant}\".`,\n });\n }\n }\n });\n\nexport type VariantUiPackageManifest = z.infer<\n typeof VariantUiPackageManifestSchema\n>;\nexport type VariantUiPackageName = z.infer<typeof VariantUiPackageNameSchema>;\n\n/**\n * Top-level catalog summarizing the package's variants. Lives at\n * `packages/<pkg>/manifest.json`. Used by `<pkg> list-variants` and\n * cross-package variant-name sync checks.\n */\nexport const VariantUiPackageCatalogSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n package: VariantUiPackageNameSchema,\n /** Semver of the entire package. */\n version: z.string().regex(SEMVER_RE, 'Invalid semver version'),\n engines: z.object({ 'teamix-evo': z.string().min(1) }),\n /** Variants this package ships (excluding `_template`). */\n variants: z.array(\n z.object({\n name: z.string().min(1).regex(VARIANT_NAME_RE),\n displayName: z.string().min(1),\n version: z.string().regex(SEMVER_RE),\n description: z.string().optional(),\n }),\n ),\n});\n\nexport type VariantUiPackageCatalog = z.infer<\n typeof VariantUiPackageCatalogSchema\n>;\n","import { z } from 'zod';\nimport { SkillIdeSchema, SkillScopeSchema } from './manifest.js';\n\n/**\n * Tailwind CSS major version that the project consumes.\n *\n * Only `'v4'` is accepted. v3 was retired in v0.7 — the dual-track output\n * (`tokens.generated.css`) added maintenance cost without active demand.\n * The schema keeps the field optional so existing config.json files\n * (which may carry `tailwind: 'v4'`) continue to validate; any non-v4 value\n * — including legacy `'v3'` — is rejected so users get a clear error.\n */\nexport const TailwindVersionSchema = z.literal('v4');\n\n/**\n * Aliases for ui entry write-back paths in the consumer project.\n * Keys mirror shadcn `components.json` aliases for familiarity, extended for\n * biz-ui (business) and templates per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nexport const UiAliasesSchema = z.object({\n components: z.string().min(1),\n hooks: z.string().min(1),\n utils: z.string().min(1),\n lib: z.string().min(1),\n /** Biz-ui components (variant-bound). Defaults to `src/components/business/`. */\n business: z.string().min(1).default('src/components/business'),\n /** Page templates (variant-bound). Defaults to `src/templates/`. */\n templates: z.string().min(1).default('src/templates'),\n});\n\n/**\n * Package entry within a project config.\n *\n * Some fields only apply to specific packages:\n * - `tailwind` — tokens only\n * - `ides` / `scope` — skills only\n * - `aliases` / `iconLibrary` / `tsx` / `rsc` — ui only\n *\n * All package-specific fields are optional at the schema level so a single\n * `PackageEntrySchema` can describe every package family.\n */\nexport const PackageEntrySchema = z.object({\n /** Variant identifier (e.g. \"opentrek\"; use \"_flat\" for skills/ui) */\n variant: z.string().min(1),\n /** Semver version string */\n version: z.string().min(1),\n /** Tailwind CSS version this project uses (only meaningful for design package). */\n tailwind: TailwindVersionSchema.optional(),\n /** IDEs this package was installed for (only meaningful for skills package). */\n ides: z.array(SkillIdeSchema).optional(),\n /** Install scope (only meaningful for skills package). */\n scope: SkillScopeSchema.optional(),\n /** Path aliases for ui entry installation (only meaningful for ui package). */\n aliases: UiAliasesSchema.optional(),\n /**\n * Default icon library declared by the project (only meaningful for ui).\n * Declarative only — does NOT trigger code rewrites; ui entries hardcode imports.\n */\n iconLibrary: z.string().min(1).optional(),\n /** Whether the project uses TSX (true) or JSX (false). ui-specific. */\n tsx: z.boolean().optional(),\n /** Whether to emit React Server Components markers (`\"use client\"`). ui-specific. */\n rsc: z.boolean().optional(),\n});\n\n/**\n * Project configuration schema — teamix-evo config.json at project root.\n */\nexport const ProjectConfigSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** IDE identifier */\n ide: z.string().min(1),\n /** Installed packages keyed by package name */\n packages: z.record(z.string(), PackageEntrySchema),\n});\n","import { z } from 'zod';\nimport { SkillIdeSchema, SkillScopeSchema } from './manifest.js';\n\n/**\n * An installed resource entry — tracks individual resource installation state.\n *\n * For type=\"skill\" resources, the same logical skill may produce multiple installed\n * entries (one per ide × scope combination); the optional `ide`/`scope` fields\n * disambiguate them.\n */\nexport const InstalledResourceSchema = z.object({\n /** Resource identifier matching the variant manifest */\n id: z.string().min(1),\n /** Target path where the resource was installed (absolute or project-relative) */\n target: z.string().min(1),\n /** Content hash for change detection (e.g. \"sha256:...\") */\n hash: z.string().min(1),\n /** Update strategy that was applied */\n strategy: z.enum(['frozen', 'regenerable', 'managed']),\n /** IDE this resource was installed for (skill resources only) */\n ide: SkillIdeSchema.optional(),\n /** Install scope (skill resources only) */\n scope: SkillScopeSchema.optional(),\n});\n\n/**\n * An installed package entry — tracks a single package installation.\n */\nexport const InstalledPackageSchema = z.object({\n /** Full package name (e.g. \"@teamix-evo/tokens\") */\n package: z.string().min(1),\n /** Variant identifier (use \"_flat\" for non-variant packages such as skills) */\n variant: z.string().min(1),\n /** Installed version */\n version: z.string().min(1),\n /** ISO 8601 timestamp of installation */\n installedAt: z.string().min(1),\n /** List of installed resources */\n resources: z.array(InstalledResourceSchema),\n});\n\n/**\n * Installed manifest schema — tracks all installed packages in a project.\n * Stored at `.teamix-evo/manifest.json`.\n */\nexport const InstalledManifestSchema = z.object({\n schemaVersion: z.literal(1),\n /** List of installed packages */\n installed: z.array(InstalledPackageSchema),\n});\n","import { z } from 'zod';\nimport { SkillIdeSchema, SkillScopeSchema } from './manifest.js';\n\n/**\n * Skills source-mirror lock file schema.\n *\n * Per [ADR 0013](../../../../docs/adr/0013-skills-source-mirror.md), the source\n * lives at `.teamix-evo/skills/<id>/`, and IDE paths (`.qoder/skills/<id>/`,\n * `.claude/skills/<id>/`) are regenerable mirrors. This lock file at\n * `.teamix-evo/skills/manifest.lock.json` is the authoritative ledger of:\n *\n * 1. which skills are installed,\n * 2. which version each was installed from,\n * 3. which IDE mirror paths were produced (so `remove` / `sync` know where to act).\n *\n * v0.6 supports `qoder` + `claude` mirrors. `.cursor/rules/<id>.mdc` is v0.7\n * (per ADR 0013 §Implementation note); the schema does NOT pre-allocate\n * cursor-specific fields — they will be added with the v0.7 ADR.\n */\nexport const SkillsLockEntrySchema = z.object({\n /** Semver version installed from upstream */\n version: z.string().min(1),\n /** Upstream package name (typically `@teamix-evo/skills`) */\n from: z.string().min(1),\n /** ISO 8601 install / last-sync timestamp */\n installedAt: z.string().min(1),\n /** Install scope at time of mirror */\n scope: SkillScopeSchema,\n /**\n * IDEs this skill was mirrored to. Each ide ↔ a mirror path under\n * `<projectRoot>/.<ide>/skills/<id>/` (project) or `~/.<ide>/skills/<id>/`\n * (global). The path itself is reconstructed from `scope` + adapter; we\n * record the ide identifier rather than the full path to keep the lock\n * portable across machines.\n */\n mirroredTo: z.array(SkillIdeSchema),\n});\n\nexport const SkillsLockSchema = z.object({\n schemaVersion: z.literal(1),\n /** Map of skill id → lock entry */\n skills: z.record(z.string().min(1), SkillsLockEntrySchema),\n});\n\nexport type SkillsLockEntry = z.infer<typeof SkillsLockEntrySchema>;\nexport type SkillsLock = z.infer<typeof SkillsLockSchema>;\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport {\n validateManifest,\n validateSkillsPackage,\n validateUiPackage,\n} from './validator.js';\nimport type {\n VariantManifest,\n SkillsPackageManifest,\n UiPackageManifest,\n} from './types.js';\n\n/**\n * Load and validate a variant manifest from a package directory.\n *\n * Reads `manifest.json` from the given directory, parses it as JSON,\n * and validates it against the VariantManifest schema.\n *\n * @param packageDir - Absolute or relative path to the variant package directory\n * @returns The validated VariantManifest\n * @throws Error if the file cannot be read or the manifest is invalid\n */\nexport async function loadVariantManifest(\n packageDir: string,\n): Promise<VariantManifest> {\n const manifestPath = path.join(packageDir, 'manifest.json');\n\n let raw: string;\n try {\n raw = await fs.readFile(manifestPath, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`Manifest not found: ${manifestPath}`);\n }\n throw new Error(\n `Failed to read manifest at ${manifestPath}: ${(err as Error).message}`,\n );\n }\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in manifest at ${manifestPath}`);\n }\n\n const result = validateManifest(data);\n if (!result.success) {\n throw new Error(`${result.error}\\n File: ${manifestPath}`);\n }\n\n return result.data;\n}\n\n/**\n * Load and validate the top-level manifest of a skills package.\n *\n * Reads `manifest.json` from the given directory and validates it against\n * the SkillsPackageManifest schema (flat list of skills, no variants).\n *\n * @param packageDir - Absolute or relative path to the skills package directory\n * @returns The validated SkillsPackageManifest\n * @throws Error if the file cannot be read or the manifest is invalid\n */\nexport async function loadSkillsPackageManifest(\n packageDir: string,\n): Promise<SkillsPackageManifest> {\n const manifestPath = path.join(packageDir, 'manifest.json');\n\n let raw: string;\n try {\n raw = await fs.readFile(manifestPath, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`Skills manifest not found: ${manifestPath}`);\n }\n throw new Error(\n `Failed to read skills manifest at ${manifestPath}: ${\n (err as Error).message\n }`,\n );\n }\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in skills manifest at ${manifestPath}`);\n }\n\n const result = validateSkillsPackage(data);\n if (!result.success) {\n throw new Error(`${result.error}\\n File: ${manifestPath}`);\n }\n\n return result.data;\n}\n\n/**\n * Load and validate the top-level manifest of a UI package.\n *\n * Reads `manifest.json` from the given directory and validates it against\n * the UiPackageManifest schema (flat list of entries, no variants).\n * Also performs registryDependencies graph validation (existence + no cycles).\n *\n * @param packageDir - Absolute or relative path to the ui package directory\n * @returns The validated UiPackageManifest\n * @throws Error if the file cannot be read, the manifest is invalid, or the dep graph is broken\n */\nexport async function loadUiPackageManifest(\n packageDir: string,\n): Promise<UiPackageManifest> {\n const manifestPath = path.join(packageDir, 'manifest.json');\n\n let raw: string;\n try {\n raw = await fs.readFile(manifestPath, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`UI manifest not found: ${manifestPath}`);\n }\n throw new Error(\n `Failed to read ui manifest at ${manifestPath}: ${(err as Error).message}`,\n );\n }\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in ui manifest at ${manifestPath}`);\n }\n\n const result = validateUiPackage(data);\n if (!result.success) {\n throw new Error(`${result.error}\\n File: ${manifestPath}`);\n }\n\n return result.data;\n}\n","import { ZodError } from 'zod';\nimport {\n VariantManifestSchema,\n SkillsPackageManifestSchema,\n UiPackageManifestSchema,\n} from './schema/manifest.js';\nimport { ProjectConfigSchema } from './schema/config.js';\nimport { InstalledManifestSchema } from './schema/installed.js';\nimport { SkillsLockSchema } from './schema/skills-lock.js';\nimport type { SkillsLock } from './schema/skills-lock.js';\nimport type {\n VariantManifest,\n SkillsPackageManifest,\n UiPackageManifest,\n UiEntry,\n ProjectConfig,\n InstalledManifest,\n Result,\n} from './types.js';\n\n/**\n * Format a ZodError into a human-readable error message.\n */\nfunction formatZodError(error: ZodError): string {\n return error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : '(root)';\n return ` - ${path}: ${issue.message}`;\n })\n .join('\\n');\n}\n\n/**\n * Validate unknown data against the VariantManifest schema.\n * Returns a discriminated Result with either the parsed data or a friendly error message.\n */\nexport function validateManifest(data: unknown): Result<VariantManifest> {\n const result = VariantManifestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return {\n success: false,\n error: `Invalid variant manifest:\\n${formatZodError(result.error)}`,\n };\n}\n\n/**\n * Validate unknown data against the ProjectConfig schema.\n */\nexport function validateConfig(data: unknown): Result<ProjectConfig> {\n const result = ProjectConfigSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return {\n success: false,\n error: `Invalid project config:\\n${formatZodError(result.error)}`,\n };\n}\n\n/**\n * Validate unknown data against the InstalledManifest schema.\n */\nexport function validateInstalled(data: unknown): Result<InstalledManifest> {\n const result = InstalledManifestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return {\n success: false,\n error: `Invalid installed manifest:\\n${formatZodError(result.error)}`,\n };\n}\n\n/**\n * Validate unknown data against the SkillsLock schema (skills source-mirror lock).\n * Stored at `.teamix-evo/skills/manifest.lock.json` per ADR 0013.\n */\nexport function validateSkillsLock(data: unknown): Result<SkillsLock> {\n const result = SkillsLockSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return {\n success: false,\n error: `Invalid skills lock:\\n${formatZodError(result.error)}`,\n };\n}\n\n/**\n * Validate unknown data against the SkillsPackageManifest schema.\n */\nexport function validateSkillsPackage(\n data: unknown,\n): Result<SkillsPackageManifest> {\n const result = SkillsPackageManifestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return {\n success: false,\n error: `Invalid skills package manifest:\\n${formatZodError(result.error)}`,\n };\n}\n\n/**\n * Validate unknown data against the UiPackageManifest schema, then verify the\n * registryDependencies graph: every reference resolves and there are no cycles.\n */\nexport function validateUiPackage(data: unknown): Result<UiPackageManifest> {\n const parsed = UiPackageManifestSchema.safeParse(data);\n if (!parsed.success) {\n return {\n success: false,\n error: `Invalid ui package manifest:\\n${formatZodError(parsed.error)}`,\n };\n }\n\n const graphIssues = validateUiDependencyGraph(parsed.data.entries);\n if (graphIssues.length > 0) {\n return {\n success: false,\n error: `Invalid ui package manifest dependency graph:\\n${graphIssues\n .map((i) => ` - ${i}`)\n .join('\\n')}`,\n };\n }\n\n return { success: true, data: parsed.data };\n}\n\n/**\n * Validate the registryDependencies graph among ui entries.\n * Returns a list of issue strings (empty when the graph is sound).\n *\n * Issues detected:\n * - Duplicate entry id\n * - Reference to an unknown entry id\n * - Cyclic dependency\n */\nexport function validateUiDependencyGraph(entries: UiEntry[]): string[] {\n const issues: string[] = [];\n const idToEntry = new Map<string, UiEntry>();\n\n for (const entry of entries) {\n if (idToEntry.has(entry.id)) {\n issues.push(`duplicate entry id: \"${entry.id}\"`);\n } else {\n idToEntry.set(entry.id, entry);\n }\n }\n\n for (const entry of entries) {\n const deps = entry.registryDependencies ?? [];\n for (const dep of deps) {\n if (!idToEntry.has(dep)) {\n issues.push(\n `entry \"${entry.id}\" depends on unknown entry \"${dep}\"`,\n );\n }\n }\n }\n\n // Cycle detection via DFS with three colors (white/gray/black).\n const WHITE = 0;\n const GRAY = 1;\n const BLACK = 2;\n const color = new Map<string, number>();\n for (const id of idToEntry.keys()) color.set(id, WHITE);\n\n const cycles: string[][] = [];\n\n function dfs(id: string, path: string[]): void {\n color.set(id, GRAY);\n path.push(id);\n const entry = idToEntry.get(id);\n const deps = entry?.registryDependencies ?? [];\n for (const dep of deps) {\n if (!idToEntry.has(dep)) continue; // already reported above\n const c = color.get(dep);\n if (c === GRAY) {\n const startIdx = path.indexOf(dep);\n cycles.push([...path.slice(startIdx), dep]);\n } else if (c === WHITE) {\n dfs(dep, path);\n }\n }\n path.pop();\n color.set(id, BLACK);\n }\n\n for (const id of idToEntry.keys()) {\n if (color.get(id) === WHITE) dfs(id, []);\n }\n\n for (const cycle of cycles) {\n issues.push(`cyclic registryDependencies: ${cycle.join(' → ')}`);\n }\n\n return issues;\n}\n\n/**\n * Topologically sort a subset of ui entries so that dependencies come before\n * dependents. Used by `ui add` to determine install order.\n *\n * @param entries full list of entries (the package manifest's `entries`)\n * @param requested ids the user explicitly asked to install\n * @returns ordered list of entry ids (includes transitive deps, dedup'd)\n * @throws Error if a requested id or transitive dep is missing or graph has cycles\n */\nexport function resolveUiEntryOrder(\n entries: UiEntry[],\n requested: string[],\n): string[] {\n const idToEntry = new Map(entries.map((e) => [e.id, e]));\n\n for (const id of requested) {\n if (!idToEntry.has(id)) {\n throw new Error(`Unknown ui entry: \"${id}\"`);\n }\n }\n\n // Pre-flight cycle check on the full graph.\n const graphIssues = validateUiDependencyGraph(entries);\n if (graphIssues.length > 0) {\n throw new Error(\n `UI dependency graph has issues:\\n${graphIssues\n .map((i) => ` - ${i}`)\n .join('\\n')}`,\n );\n }\n\n const visited = new Set<string>();\n const order: string[] = [];\n\n function visit(id: string): void {\n if (visited.has(id)) return;\n visited.add(id);\n const entry = idToEntry.get(id);\n const deps = entry?.registryDependencies ?? [];\n for (const dep of deps) visit(dep);\n order.push(id);\n }\n\n for (const id of requested) visit(id);\n\n return order;\n}\n","/**\n * Tokens package catalog loader.\n *\n * Per [ADR 0020](../../../docs/adr/0020-design-to-tokens-skill-fusion.md) the\n * tokens package is a flat variant list — there is no default baseline, no\n * per-variant `pack.json`, and no walk-and-merge inheritance. The single\n * source of truth is `manifest.json`; the loader just parses and validates it.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport {\n TokensPackageManifestSchema,\n type TokensPackageManifest,\n type TokensVariantEntry,\n} from './schema/tokens-pack.js';\n\n/**\n * Read & validate the top-level `packages/tokens/manifest.json` catalog.\n * Errors are wrapped with the file path for easy diagnosis (P8).\n */\nexport async function loadTokensPackageManifest(\n packageDir: string,\n): Promise<TokensPackageManifest> {\n const manifestPath = path.join(packageDir, 'manifest.json');\n let raw: string;\n try {\n raw = await fs.readFile(manifestPath, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`Tokens package manifest not found: ${manifestPath}`);\n }\n throw new Error(\n `Failed to read tokens package manifest at ${manifestPath}: ${\n (err as Error).message\n }`,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\n `Invalid JSON in tokens package manifest at ${manifestPath}`,\n );\n }\n\n const result = TokensPackageManifestSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Invalid tokens package manifest:\\n${result.error.message}\\n File: ${manifestPath}`,\n );\n }\n return result.data;\n}\n\n/**\n * Lookup helper: find one variant entry in a catalog by name.\n * Returns `undefined` when the variant is not advertised.\n */\nexport function getVariantEntry(\n catalog: TokensPackageManifest,\n variantName: string,\n): TokensVariantEntry | undefined {\n return catalog.variants.find((v) => v.name === variantName);\n}\n","/**\n * Loaders for `@teamix-evo/biz-ui` and `@teamix-evo/templates` per\n * [ADR 0014](../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n *\n * Two ops:\n *\n * - `loadVariantUiPackageCatalog(packageDir)` — reads top-level\n * `packages/<pkg>/manifest.json` (variant list).\n * - `loadVariantUiPackageManifest(variantDir)` — reads per-variant\n * `packages/<pkg>/variants/<name>/manifest.json` (entry list).\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport {\n VariantUiPackageCatalogSchema,\n VariantUiPackageManifestSchema,\n type VariantUiPackageCatalog,\n type VariantUiPackageManifest,\n} from './schema/variant-ui-pack.js';\n\nasync function readJson(filePath: string, kind: string): Promise<unknown> {\n let raw: string;\n try {\n raw = await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`${kind} not found: ${filePath}`);\n }\n throw new Error(\n `Failed to read ${kind} at ${filePath}: ${(err as Error).message}`,\n );\n }\n try {\n return JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in ${kind} at ${filePath}`);\n }\n}\n\nexport async function loadVariantUiPackageCatalog(\n packageDir: string,\n): Promise<VariantUiPackageCatalog> {\n const manifestPath = path.join(packageDir, 'manifest.json');\n const data = await readJson(manifestPath, 'variant-ui catalog');\n const result = VariantUiPackageCatalogSchema.safeParse(data);\n if (!result.success) {\n throw new Error(\n `Invalid catalog:\\n${result.error.message}\\n File: ${manifestPath}`,\n );\n }\n return result.data;\n}\n\nexport async function loadVariantUiPackageManifest(\n variantDir: string,\n): Promise<VariantUiPackageManifest> {\n const manifestPath = path.join(variantDir, 'manifest.json');\n const data = await readJson(manifestPath, 'variant-ui manifest');\n const result = VariantUiPackageManifestSchema.safeParse(data);\n if (!result.success) {\n throw new Error(\n `Invalid variant manifest:\\n${result.error.message}\\n File: ${manifestPath}`,\n );\n }\n // Cross-check: variant name in manifest must equal the directory name.\n const dirName = path.basename(variantDir);\n if (result.data.variant !== dirName) {\n throw new Error(\n `Variant manifest mismatch: variants/${dirName}/manifest.json declares variant=\"${result.data.variant}\". Names must match.`,\n );\n }\n return result.data;\n}\n","import type { ManagedRegion } from './types.js';\n\n/**\n * Regex pattern for matching managed region markers.\n * Captures the region id and the content between start/end markers.\n */\nconst REGION_PATTERN =\n /<!-- teamix-evo:managed:start id=\"([^\"]+)\" -->([\\s\\S]*?)<!-- teamix-evo:managed:end id=\"\\1\" -->/g;\n\n/**\n * Regex for a start marker without a matching end marker — used for error detection.\n */\nconst START_MARKER_PATTERN = /<!-- teamix-evo:managed:start id=\"([^\"]+)\" -->/g;\n\nconst END_MARKER_PATTERN = /<!-- teamix-evo:managed:end id=\"([^\"]+)\" -->/g;\n\n/**\n * Parse all managed regions from document content.\n *\n * @param content - The full document content\n * @returns Array of parsed ManagedRegion objects\n * @throws Error if there are unmatched start/end markers\n */\nexport function parseManagedRegions(content: string): ManagedRegion[] {\n // First, check for unmatched markers\n const startIds = new Set<string>();\n const endIds = new Set<string>();\n const startCounts = new Map<string, number>();\n\n let match: RegExpExecArray | null;\n\n const startRe = new RegExp(START_MARKER_PATTERN.source, 'g');\n while ((match = startRe.exec(content)) !== null) {\n const id = match[1]!;\n startIds.add(id);\n startCounts.set(id, (startCounts.get(id) ?? 0) + 1);\n }\n\n const endRe = new RegExp(END_MARKER_PATTERN.source, 'g');\n while ((match = endRe.exec(content)) !== null) {\n endIds.add(match[1]!);\n }\n\n // Check for duplicate start markers\n for (const [id, count] of startCounts) {\n if (count > 1) {\n throw new Error(\n `Duplicate managed region: found ${count} start markers for \"${id}\". Each id must be unique within a file.`,\n );\n }\n }\n\n // Check for start markers without matching end markers\n for (const id of startIds) {\n if (!endIds.has(id)) {\n throw new Error(\n `Unmatched managed region: found start marker for \"${id}\" but no matching end marker`,\n );\n }\n }\n\n // Check for end markers without matching start markers\n for (const id of endIds) {\n if (!startIds.has(id)) {\n throw new Error(\n `Unmatched managed region: found end marker for \"${id}\" but no matching start marker`,\n );\n }\n }\n\n // Now parse matched regions\n const regions: ManagedRegion[] = [];\n const regionRe = new RegExp(REGION_PATTERN.source, 'g');\n\n while ((match = regionRe.exec(content)) !== null) {\n const id = match[1]!;\n const regionContent = match[2]!;\n regions.push({\n id,\n startMarker: `<!-- teamix-evo:managed:start id=\"${id}\" -->`,\n endMarker: `<!-- teamix-evo:managed:end id=\"${id}\" -->`,\n content: regionContent,\n });\n }\n\n return regions;\n}\n\n/**\n * Replace the content of a specific managed region by id.\n * Content outside managed regions is preserved.\n *\n * @param content - The full document content\n * @param id - The region id to replace\n * @param newContent - The new content for the region\n * @returns The updated document content\n * @throws Error if the region id is not found\n */\nexport function replaceManagedRegion(\n content: string,\n id: string,\n newContent: string,\n): string {\n const startMarker = `<!-- teamix-evo:managed:start id=\"${id}\" -->`;\n const endMarker = `<!-- teamix-evo:managed:end id=\"${id}\" -->`;\n\n const pattern = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(\n id,\n )}\" -->[\\\\s\\\\S]*?<!-- teamix-evo:managed:end id=\"${escapeRegExp(id)}\" -->`,\n 'g',\n );\n\n // First check if the region actually exists\n if (!pattern.test(content)) {\n throw new Error(`Managed region \"${id}\" not found in content`);\n }\n\n // Reset lastIndex after test() with global flag\n pattern.lastIndex = 0;\n\n return content.replace(\n pattern,\n `${startMarker}\\n${newContent}\\n${endMarker}`,\n );\n}\n\n/**\n * Check whether a managed region with the given id exists in the content.\n *\n * @param content - The full document content\n * @param id - The region id to check\n * @returns true if the region exists\n */\nexport function hasManagedRegion(content: string, id: string): boolean {\n const pattern = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(\n id,\n )}\" -->[\\\\s\\\\S]*?<!-- teamix-evo:managed:end id=\"${escapeRegExp(id)}\" -->`,\n );\n return pattern.test(content);\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import type { UpdateStrategy } from \"./types.js\";\n\n/**\n * Determine whether a resource should be updated based on its strategy\n * and whether it already exists.\n *\n * @param strategy - The update strategy for the resource\n * @param resourceExists - Whether the resource file already exists\n * @returns true if the resource should be updated/created\n */\nexport function shouldUpdate(\n strategy: UpdateStrategy,\n resourceExists: boolean,\n): boolean {\n switch (strategy) {\n case \"frozen\":\n // Only install if it doesn't exist yet\n return !resourceExists;\n case \"regenerable\":\n // Always overwrite\n return true;\n case \"managed\":\n // Always update (managed regions only)\n return true;\n default:\n return false;\n }\n}\n\n/** Possible actions returned by getUpdateAction */\nexport type UpdateAction = \"skip\" | \"overwrite\" | \"managed-update\";\n\nexport interface UpdateActionOptions {\n /** Whether the resource file already exists */\n exists: boolean;\n /** Hash of the new content to be written */\n hash?: string;\n /** Hash of the currently installed content */\n currentHash?: string;\n}\n\n/**\n * Determine the specific update action to take for a resource.\n *\n * @param strategy - The update strategy for the resource\n * @param options - Context about the resource's current state\n * @returns The action to perform\n */\nexport function getUpdateAction(\n strategy: UpdateStrategy,\n options: UpdateActionOptions,\n): UpdateAction {\n switch (strategy) {\n case \"frozen\":\n if (!options.exists) {\n // First-time install\n return \"overwrite\";\n }\n // File exists, never modify\n return \"skip\";\n\n case \"regenerable\":\n if (\n options.exists &&\n options.hash &&\n options.currentHash &&\n options.hash === options.currentHash\n ) {\n // Content unchanged, skip\n return \"skip\";\n }\n return \"overwrite\";\n\n case \"managed\":\n if (!options.exists) {\n // First-time install — write the whole file\n return \"overwrite\";\n }\n return \"managed-update\";\n\n default:\n return \"skip\";\n }\n}\n"],"mappings":"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","names":["z","z","SEMVER_RE","VARIANT_NAME_RE","z","z","z","z","z","z","z","path","fs","path","fs","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/schema/manifest.ts","../src/schema/tokens-pack.ts","../src/schema/variant-ui-pack.ts","../src/schema/config.ts","../src/schema/installed.ts","../src/schema/skills-lock.ts","../src/schema/upgrade-staging.ts","../src/loader.ts","../src/validator.ts","../src/tokens-pack-loader.ts","../src/variant-ui-pack-loader.ts","../src/managed-regions.ts","../src/strategy.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Update strategy for a resource.\n * - frozen: CLI will not modify after first install\n * - regenerable: Entire file is rewritten on update\n * - managed: Only managed regions are rewritten, rest is preserved\n */\nexport const UpdateStrategySchema = z.enum([\n 'frozen',\n 'regenerable',\n 'managed',\n]);\n\n/**\n * Resource type discriminator.\n */\nexport const ResourceTypeSchema = z.enum([\n 'doc',\n 'tokens',\n 'ai-rules',\n 'config',\n 'skill',\n]);\n\n/**\n * Supported AI IDE identifiers for skill resources.\n * Qoder and Claude Code share the same SKILL.md format; differ only by install path.\n */\nexport const SkillIdeSchema = z.enum(['qoder', 'claude']);\n\n/**\n * Skill installation scope.\n * - project: install under project root (.qoder/skills/, .claude/skills/)\n * - global: install under user home (~/.qoder/skills/, ~/.claude/skills/)\n */\nexport const SkillScopeSchema = z.enum(['project', 'global']);\n\n/**\n * A single resource entry within a variant manifest.\n */\nexport const ResourceSchema = z.object({\n /** Unique identifier for the resource within the manifest */\n id: z.string().min(1),\n /** Resource type */\n type: ResourceTypeSchema,\n /** Source path (relative to variant root), typically a template */\n source: z.string().min(1),\n /**\n * Target path (relative to project root) where the resource is installed.\n * For type=\"skill\" this is ignored: the path is computed from skill name + ide + scope.\n */\n target: z.string().min(1),\n /** How the resource is updated */\n updateStrategy: UpdateStrategySchema,\n /** Whether the source is a Handlebars template */\n template: z.boolean().optional(),\n /** IDs of managed regions (only relevant when updateStrategy is \"managed\") */\n managedRegions: z.array(z.string()).optional(),\n /** Whether to recursively process directory contents */\n recursive: z.boolean().optional(),\n /** Supported IDEs (only meaningful when type=\"skill\"; defaults to all when omitted) */\n ides: z.array(SkillIdeSchema).optional(),\n /** Default install scope (only meaningful when type=\"skill\"; user can override at install time) */\n scope: SkillScopeSchema.optional(),\n});\n\n/**\n * Variant manifest schema — describes a variant package and its resources.\n */\nexport const VariantManifestSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Package name (e.g. \"design\") */\n package: z.string().min(1),\n /** Variant identifier (e.g. \"opentrek\") */\n variant: z.string().min(1),\n /** Human-readable name */\n displayName: z.string().min(1),\n /** Description of the variant */\n description: z.string(),\n /** Semver version string */\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/, 'Invalid semver version'),\n /** Engine compatibility */\n engines: z.object({\n 'teamix-evo': z.string().min(1),\n }),\n /** Supported IDE identifiers */\n ide: z.array(z.string().min(1)),\n /** List of resources provided by this variant */\n resources: z.array(ResourceSchema),\n});\n\n/**\n * A single skill entry within a skills package manifest.\n */\nexport const SkillEntrySchema = z.object({\n /** Skill identifier (matches name/folder) */\n id: z.string().min(1),\n /** Skill name — must match the directory name and frontmatter `name` */\n name: z\n .string()\n .min(1)\n .regex(\n /^[a-z0-9][a-z0-9-]*$/,\n 'Skill name must be lowercase letters, digits, hyphens (no leading hyphen)',\n ),\n /** One-line description for skill discovery */\n description: z.string().min(1),\n /** Semver version */\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/, 'Invalid semver version'),\n /** Source path relative to package root — file or directory */\n source: z.string().min(1),\n /** Supported IDEs (defaults to both when omitted) */\n ides: z.array(SkillIdeSchema).default(['qoder', 'claude']),\n /** Update strategy (defaults to managed) */\n updateStrategy: UpdateStrategySchema.default('managed'),\n /** Managed region IDs to maintain on update */\n managedRegions: z.array(z.string()).optional(),\n /** Whether the source is a Handlebars template */\n template: z.boolean().optional(),\n /**\n * Variant identifier when this skill is bound to a specific design variant\n * (e.g. `\"opentrek\"`, `\"uni-manager\"`). Optional — neutral skills (manage,\n * coding-conventions, baseline design-rules) leave it unset.\n *\n * When present, the CLI installs this skill ONLY if the consumer's\n * `.teamix-evo/tokens-lock.json` records the same variant. MUST equal\n * the variant directory name in `@teamix-evo/tokens/variants/<name>/`.\n *\n * Mirrors `UiEntrySchema.variant` semantics in @teamix-evo/biz-ui &\n * @teamix-evo/templates per ADR 0014.\n */\n variant: z.string().optional(),\n /**\n * Default install scope for this skill. Per ADR 0033.\n *\n * - `\"global\"` — entry skill (lifecycle / orchestrator). `skills add` in\n * project scope SKIPS these unless explicitly named on the\n * command line (then installs with a warning). Recommended\n * to install once via `skills add <id> --scope global`.\n * - `\"project\"` — variant content skill (default when omitted). Installed\n * with the project that uses it.\n *\n * `undefined` is treated as `\"project\"` — old manifests without this field\n * still validate.\n */\n scope: SkillScopeSchema.optional(),\n});\n\n/**\n * Skills package manifest schema — top-level manifest of `@teamix-evo/skills`.\n * Skills are stored flat in the manifest. Variant binding is expressed via\n * the optional `variant` field on each entry (see SkillEntrySchema).\n */\nexport const SkillsPackageManifestSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Always \"skills\" for this package */\n package: z.literal('skills'),\n /** Semver version of the skills package */\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/, 'Invalid semver version'),\n /** Engine compatibility */\n engines: z.object({\n 'teamix-evo': z.string().min(1),\n }),\n /** Flat list of skills shipped by this package */\n skills: z.array(SkillEntrySchema),\n});\n\n// ─── UI package (source-injected components, shadcn-style) ────────────────────\n\n/**\n * UI entry types.\n * - component: a React component (e.g. button.tsx)\n * - hook: a React hook (e.g. use-controllable.ts)\n * - util: a utility function (e.g. cn.ts)\n * - block: a higher-level composition shipped by ui or biz-ui (FilterBar,\n * EmptyState, OrgPicker, ApprovalCard). Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md),\n * ui ships generic blocks, biz-ui ships variant-bound business blocks.\n * - template: a page-level composition shipped by `@teamix-evo/templates`\n * (DashboardLayout, ListDetailPage, ...). Per ADR 0014, templates are\n * variant-aware (mirror biz-ui).\n */\nexport const UiEntryTypeSchema = z.enum([\n 'component',\n 'hook',\n 'util',\n 'block',\n 'template',\n]);\n\n/**\n * Alias keys used to resolve where an entry file lands in the user's project.\n * Each key maps to a path configured in `config.json` `packages.ui.aliases`.\n *\n * - `components`: src/components/ui/ (ui & biz-ui blocks default here)\n * - `business`: src/components/business/ (biz-ui only — see ADR 0014)\n * - `templates`: src/templates/ or src/pages/ (templates package — ADR 0014)\n */\nexport const UiAliasSchema = z.enum([\n 'components',\n 'hooks',\n 'utils',\n 'lib',\n 'business',\n 'templates',\n]);\n\n/**\n * Maturity / lifecycle status of a UI entry.\n *\n * Drives consumer trust signal (e.g. shown in `ui list` output, registry-mcp\n * `list_components` tool, autodocs page) so AI / humans know whether to depend\n * on it for production code.\n *\n * - **stable** (default): API committed; breaking changes only via major bump\n * - **experimental** : API may change; do not use in production\n * - **deprecated** : Slated for removal; consumers should migrate to `replacedBy`\n *\n * See ADR 0001-three-layer-alignment and PLAN §12.3 P0-3.\n */\nexport const UiEntryStatusSchema = z.enum([\n 'stable',\n 'experimental',\n 'deprecated',\n]);\nexport type UiEntryStatus = z.infer<typeof UiEntryStatusSchema>;\n\n/**\n * A single file shipped by a UI entry.\n * Multiple files form one logical entry (rare, but supported).\n */\nexport const UiEntryFileSchema = z.object({\n /** Source path relative to the ui package root (e.g. \"src/components/button/button.tsx\") */\n source: z.string().min(1),\n /** Which alias this file resolves under in the consumer project */\n targetAlias: UiAliasSchema,\n /** Filename written under the alias directory (e.g. \"button.tsx\") */\n targetName: z.string().min(1),\n});\n\n/**\n * A single UI entry (component / hook / util / block).\n */\nexport const UiEntrySchema = z.object({\n /** Unique entry identifier within the ui package (e.g. \"button\") */\n id: z\n .string()\n .min(1)\n .regex(\n /^[a-z0-9][a-z0-9-]*$/,\n 'UI entry id must be lowercase letters, digits, hyphens (no leading hyphen)',\n ),\n /** Display name (e.g. \"Button\") */\n name: z.string().min(1),\n /** Entry type */\n type: UiEntryTypeSchema,\n /** One-line description for entry discovery and AI guidance */\n description: z.string().min(1),\n /** Files this entry ships (typically 1) */\n files: z.array(UiEntryFileSchema).min(1),\n /**\n * Optional path to an AI-readable meta document (frontmatter + Markdown).\n * Read directly from `@teamix-evo/ui` by MCP at runtime — no consumer-side\n * copy is written (per ADR 0020 §3).\n */\n meta: z.string().optional(),\n /** Other UI entries this one depends on (e.g. \"button\" depends on \"cn\") */\n registryDependencies: z.array(z.string()).optional(),\n /** npm dependencies required by this entry (name → semver range) */\n dependencies: z.record(z.string(), z.string()).optional(),\n /**\n * How CLI handles this entry on `ui upgrade`.\n * Defaults to `frozen` — user-owned source code, untouched after first install.\n * Upgrade is handled by AI + skill flow (no CLI rewrite). See PLAN §10.9.\n */\n updateStrategy: UpdateStrategySchema.default('frozen'),\n /**\n * Whether the source file should be passed through Handlebars before write.\n * Most entries don't need templating (use import-rewrite transformer instead).\n */\n template: z.boolean().optional(),\n /**\n * Maturity / lifecycle status of this entry. Defaults to `stable`.\n * See {@link UiEntryStatusSchema} for semantics.\n */\n status: UiEntryStatusSchema.default('stable'),\n /**\n * Free-text rationale shown to consumers when `status` is `deprecated`.\n * Should explain why the entry is going away and what replaces it.\n */\n deprecatedReason: z.string().optional(),\n /**\n * If this entry is `deprecated`, the id of the entry that supersedes it.\n * Consumers (and AI) should migrate to `replacedBy` rather than this entry.\n */\n replacedBy: z.string().optional(),\n /**\n * Variant identifier when this entry is shipped from a variant-aware\n * package (`@teamix-evo/biz-ui` or `@teamix-evo/templates` per ADR 0014).\n * Optional — entries from `@teamix-evo/ui` (variant-agnostic) leave it unset.\n * MUST equal the variant directory name when present.\n */\n variant: z.string().optional(),\n});\n\n/**\n * UI package manifest schema — top-level manifest of `@teamix-evo/ui`.\n * Like skills, UI is flat (no variants); brand differences are absorbed by\n * design tokens at the `var(--primary)` layer.\n */\nexport const UiPackageManifestSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Always \"ui\" for this package */\n package: z.literal('ui'),\n /** Semver version of the ui package */\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/, 'Invalid semver version'),\n /** Engine compatibility */\n engines: z.object({\n 'teamix-evo': z.string().min(1),\n }),\n /** Active list of entries shipped (and exposed) by this package. */\n entries: z.array(UiEntrySchema),\n /**\n * Archived entries that are kept in source for Storybook documentation only\n * and are NOT exposed through the active distribution chain. Per ADR 0028:\n * - `teamix-evo ui add <id>` rejects ids found here unless `--include-deprecated` is passed\n * - MCP `list_components` / `find_components` exclude these by default\n * - Storybook keeps the story under `废弃 · Deprecated/` with a banner\n * Optional for backwards compatibility — older manifests without this field\n * still validate.\n */\n deprecatedEntries: z.array(UiEntrySchema).optional(),\n});\n","/**\n * `@teamix-evo/tokens` package manifest schema.\n *\n * Per [ADR 0020](../../../../docs/adr/0020-design-to-tokens-skill-fusion.md)\n * the package is now a pure, variant-list catalog — no `default/` baseline,\n * no per-variant `pack.json`, no walk-and-merge inheritance:\n *\n * packages/tokens/\n * ├── manifest.json <- this schema (top-level catalog)\n * └── variants/\n * ├── opentrek/\n * │ ├── theme.css <- Tailwind v4 @theme source of truth\n * │ └── base.tokens.json\n * └── uni-manager/\n * ├── theme.css\n * └── base.tokens.json\n *\n * Each variant is a complete, self-contained token set (ADR 0020 §3). The\n * catalog is the single source of truth for variant identity + advertised\n * files; the validator (`packages/tokens/scripts/validate-variants.ts`)\n * enforces parity between catalog entries and on-disk variant directories.\n */\nimport { z } from 'zod';\n\nconst VARIANT_NAME_RE = /^[a-z][a-z0-9-]*$/;\nconst SEMVER_RE = /^\\d+\\.\\d+\\.\\d+/;\n\n/**\n * Soft cross-package links advertised by a variant.\n *\n * Format: `<package-spec>#<variant-name>`, e.g. `@teamix-evo/biz-ui#opentrek`.\n * The link is **soft** — the linked package may not exist yet.\n *\n * Templates link added per [ADR 0014 amendment](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nexport const TokensPackLinkedSchema = z.object({\n 'biz-ui': z.string().optional(),\n templates: z.string().optional(),\n});\n\n/**\n * One entry in a variant's `renames` log — declares that a token was\n * renamed at the given upstream variant version. Consumed by\n * `teamix-evo update` (writes `.teamix-evo/.upgrade-hints/tokens-<ts>.json`)\n * and the future `teamix-evo-upgrade` skill (suggests codemods, never\n * auto-rewrites — frozen boundary, [ADR 0019](../../../../docs/adr/0019-project-upgrade-flow.md) §D4).\n *\n * Semantics: as of `sinceVersion`, every CSS custom property reference of\n * `from` should be migrated to `to`. Older snapshots may still mention\n * `from` legitimately.\n */\nexport const TokenRenameEntrySchema = z.object({\n /** Variant version at which the rename took effect (semver). */\n sinceVersion: z.string().regex(SEMVER_RE, 'Invalid semver version'),\n /** Old token name (with or without leading `--`; both forms accepted). */\n from: z.string().min(1),\n /** New token name. */\n to: z.string().min(1),\n /** Optional one-liner rationale surfaced in the upgrade-hints file. */\n description: z.string().optional(),\n});\n\nexport type TokenRenameEntry = z.infer<typeof TokenRenameEntrySchema>;\n\n/**\n * One variant entry in the top-level catalog.\n */\nexport const TokensVariantEntrySchema = z.object({\n /** Variant id — lowercase kebab-case. */\n name: z\n .string()\n .min(1)\n .regex(\n VARIANT_NAME_RE,\n 'Variant name must be lowercase letters/digits/hyphens (no leading hyphen).',\n ),\n /** Human-readable display name (e.g. \"OpenTrek\" for variant id \"opentrek\"). */\n displayName: z.string().min(1),\n /** Variant version — semver. May trail the package version when only a subset of variants change. */\n version: z.string().regex(SEMVER_RE, 'Invalid semver version'),\n /** Optional one-liner description; surfaced in `tokens list-variants` output. */\n description: z.string().optional(),\n /**\n * Files this variant advertises, paths relative to the tokens package root\n * (e.g. `variants/opentrek/theme.css`). The validator walks these to\n * confirm presence; the CLI consumes them at install time.\n */\n files: z.array(z.string().min(1)).min(1),\n /** Soft cross-package links (biz-ui / templates with the same variant name). */\n linked: TokensPackLinkedSchema.optional(),\n /**\n * Token rename log accumulated across this variant's version history.\n * Empty / absent when the variant has never renamed a token.\n */\n renames: z.array(TokenRenameEntrySchema).optional(),\n});\n\nexport type TokensVariantEntry = z.infer<typeof TokensVariantEntrySchema>;\nexport type TokensPackLinked = z.infer<typeof TokensPackLinkedSchema>;\n\n/**\n * Top-level catalog of all variants in `@teamix-evo/tokens`.\n *\n * Lives at `packages/tokens/manifest.json`. Lists every variant the package\n * ships. The catalog is hand-edited (or regenerable via\n * `pnpm --filter @teamix-evo/tokens validate`); variant directories on disk\n * are the source of truth for file content.\n */\nexport const TokensPackageManifestSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Always `\"tokens\"` — disambiguates from other teamix-evo package manifests. */\n package: z.literal('tokens'),\n /** Semver of the entire tokens package. */\n version: z.string().regex(SEMVER_RE, 'Invalid semver version'),\n /** Engine compatibility. */\n engines: z.object({ 'teamix-evo': z.string().min(1) }),\n /** Optional package-level description. */\n description: z.string().optional(),\n /** All shipped variants (excluding scaffold dirs that begin with `_`). */\n variants: z.array(TokensVariantEntrySchema),\n /**\n * Reserved for future shared assets that span variants (e.g. browser\n * quirks resets co-shipped at the package root). Empty array today.\n */\n shared: z.array(z.string()).optional(),\n});\n\nexport type TokensPackageManifest = z.infer<typeof TokensPackageManifestSchema>;\n\n/**\n * Consumer-side lock file written to\n * `.teamix-evo/tokens-lock.json` after `tokens init`.\n *\n * Records which tokens variant + version was installed. There is no longer a\n * `default` field — every variant is self-contained per ADR 0020.\n */\nexport const TokensPackLockSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n variant: z.object({\n name: z.string().min(1),\n displayName: z.string().min(1),\n version: z.string().regex(SEMVER_RE),\n from: z.string().min(1), // e.g. \"@teamix-evo/tokens\"\n }),\n /** Tokens package version — useful when variant version trails the package. */\n packageVersion: z.string().regex(SEMVER_RE),\n linked: TokensPackLinkedSchema.optional(),\n installedAt: z.string().datetime(),\n});\n\nexport type TokensPackLock = z.infer<typeof TokensPackLockSchema>;\n","/**\n * Schemas for variant-aware UI packages — `@teamix-evo/biz-ui` and\n * `@teamix-evo/templates`.\n *\n * Per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md), these\n * two packages mirror `@teamix-evo/tokens`'s variant model: each ships a\n * top-level catalog (variants list) plus a per-variant manifest (entry list).\n *\n * packages/biz-ui/\n * ├── manifest.json <- VariantUiPackageCatalogSchema\n * └── variants/<name>/\n * └── manifest.json <- VariantUiPackageManifestSchema\n *\n * The per-variant manifest is **structurally similar to `UiPackageManifest`**\n * (flat entries list) but adds a `variant` field — the variant name that all\n * entries in this manifest belong to. Each entry's `variant` field MUST match\n * (cross-checked at validation).\n */\nimport { z } from 'zod';\nimport { UiEntrySchema } from './manifest.js';\n\nconst SEMVER_RE = /^\\d+\\.\\d+\\.\\d+/;\nconst VARIANT_NAME_RE = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Discriminator for which variant-aware package this manifest belongs to.\n */\nexport const VariantUiPackageNameSchema = z.enum(['biz-ui', 'templates']);\n\n/**\n * Per-variant manifest — lives at `packages/<pkg>/variants/<name>/manifest.json`.\n *\n * Lists the entries this variant ships. Entries reuse `UiEntrySchema` (they\n * are technically the same shape as ui entries — only difference is they\n * declare a `variant` field tying them to a brand).\n */\nexport const VariantUiPackageManifestSchema = z\n .object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Discriminator. */\n package: VariantUiPackageNameSchema,\n /**\n * Variant identifier — lowercase kebab-case, MUST match the parent\n * directory name (e.g. `opentrek` for `variants/opentrek/manifest.json`).\n * `_template` is also accepted for the variant scaffold.\n */\n variant: z\n .string()\n .min(1)\n .regex(\n VARIANT_NAME_RE,\n 'Variant id must be lowercase letters/digits/hyphens (no leading hyphen). Special: \"_template\" allowed.',\n )\n .or(z.literal('_template')),\n /** Semver of this variant. */\n version: z.string().regex(SEMVER_RE, 'Invalid semver version'),\n /** Engine compatibility. */\n engines: z.object({ 'teamix-evo': z.string().min(1) }),\n /** Flat list of entries shipped by this variant. */\n entries: z.array(UiEntrySchema),\n })\n .superRefine((data, ctx) => {\n // Cross-field check: every entry's `variant` (if set) must match this\n // manifest's variant. Entries without a `variant` field are auto-tagged\n // with the manifest's variant at load time.\n for (const [i, entry] of data.entries.entries()) {\n if (entry.variant !== undefined && entry.variant !== data.variant) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['entries', i, 'variant'],\n message: `Entry \"${entry.id}\" declares variant \"${entry.variant}\" but lives in manifest of variant \"${data.variant}\".`,\n });\n }\n }\n });\n\nexport type VariantUiPackageManifest = z.infer<\n typeof VariantUiPackageManifestSchema\n>;\nexport type VariantUiPackageName = z.infer<typeof VariantUiPackageNameSchema>;\n\n/**\n * Top-level catalog summarizing the package's variants. Lives at\n * `packages/<pkg>/manifest.json`. Used by `<pkg> list-variants` and\n * cross-package variant-name sync checks.\n */\nexport const VariantUiPackageCatalogSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n package: VariantUiPackageNameSchema,\n /** Semver of the entire package. */\n version: z.string().regex(SEMVER_RE, 'Invalid semver version'),\n engines: z.object({ 'teamix-evo': z.string().min(1) }),\n /** Variants this package ships (excluding `_template`). */\n variants: z.array(\n z.object({\n name: z.string().min(1).regex(VARIANT_NAME_RE),\n displayName: z.string().min(1),\n version: z.string().regex(SEMVER_RE),\n description: z.string().optional(),\n }),\n ),\n});\n\nexport type VariantUiPackageCatalog = z.infer<\n typeof VariantUiPackageCatalogSchema\n>;\n","import { z } from 'zod';\nimport { SkillIdeSchema, SkillScopeSchema } from './manifest.js';\n\n/**\n * Tailwind CSS major version that the project consumes.\n *\n * Only `'v4'` is accepted. v3 was retired in v0.7 — the dual-track output\n * (`tokens.generated.css`) added maintenance cost without active demand.\n * The schema keeps the field optional so existing config.json files\n * (which may carry `tailwind: 'v4'`) continue to validate; any non-v4 value\n * — including legacy `'v3'` — is rejected so users get a clear error.\n */\nexport const TailwindVersionSchema = z.literal('v4');\n\n/**\n * Aliases for ui entry write-back paths in the consumer project.\n * Keys mirror shadcn `components.json` aliases for familiarity, extended for\n * biz-ui (business) and templates per [ADR 0014](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n */\nexport const UiAliasesSchema = z.object({\n components: z.string().min(1),\n hooks: z.string().min(1),\n utils: z.string().min(1),\n lib: z.string().min(1),\n /** Biz-ui components (variant-bound). Defaults to `src/components/business/`. */\n business: z.string().min(1).default('src/components/business'),\n /** Page templates (variant-bound). Defaults to `src/templates/`. */\n templates: z.string().min(1).default('src/templates'),\n});\n\n/**\n * Package entry within a project config.\n *\n * Some fields only apply to specific packages:\n * - `tailwind` — tokens only\n * - `ides` / `scope` — skills only\n * - `aliases` / `iconLibrary` / `tsx` / `rsc` — ui only\n *\n * All package-specific fields are optional at the schema level so a single\n * `PackageEntrySchema` can describe every package family.\n */\nexport const PackageEntrySchema = z.object({\n /** Variant identifier (e.g. \"opentrek\"; use \"_flat\" for skills/ui) */\n variant: z.string().min(1),\n /** Semver version string */\n version: z.string().min(1),\n /** Tailwind CSS version this project uses (only meaningful for design package). */\n tailwind: TailwindVersionSchema.optional(),\n /** IDEs this package was installed for (only meaningful for skills package). */\n ides: z.array(SkillIdeSchema).optional(),\n /** Install scope (only meaningful for skills package). */\n scope: SkillScopeSchema.optional(),\n /** Path aliases for ui entry installation (only meaningful for ui package). */\n aliases: UiAliasesSchema.optional(),\n /**\n * Default icon library declared by the project (only meaningful for ui).\n * Declarative only — does NOT trigger code rewrites; ui entries hardcode imports.\n */\n iconLibrary: z.string().min(1).optional(),\n /** Whether the project uses TSX (true) or JSX (false). ui-specific. */\n tsx: z.boolean().optional(),\n /** Whether to emit React Server Components markers (`\"use client\"`). ui-specific. */\n rsc: z.boolean().optional(),\n});\n\n/**\n * Token rename record — captures a single variant-switch's token mapping so\n * downstream codemod skills can rewrite consumer code (ADR 0019 §recovery).\n */\nexport const TokenRenameRecordSchema = z.object({\n /** ISO-8601 UTC timestamp at which the variant switch was performed. */\n ts: z.string().min(1),\n /** Variant the project was on before the switch. */\n fromVariant: z.string().min(1),\n /** Variant the project switched to. */\n toVariant: z.string().min(1),\n /**\n * Token rename mapping — old token name → new token name.\n * Empty object is legal (e.g. switch with zero rename).\n */\n renames: z.record(z.string(), z.string()),\n});\n\n/**\n * Last successful update record per package — set by `teamix-evo update`\n * after a non-critical / critical step succeeds. Used by `restore` to point\n * users at the right snapshot, and by `doctor` to flag staleness.\n */\nexport const LastUpdateRecordSchema = z.object({\n /** ISO-8601 UTC timestamp of the last successful update. */\n ts: z.string().min(1),\n /** Version the package was on before this update. */\n fromVersion: z.string().min(1),\n /** Version the package was on after this update. */\n toVersion: z.string().min(1),\n});\n\n/**\n * Project configuration schema v1 — the original shape shipped through v0.x.\n * Retained so existing `config.json` files keep validating; the top-level\n * `ProjectConfigSchema` transforms v1 into v2 transparently for callers.\n */\nexport const ProjectConfigV1Schema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** IDE identifier */\n ide: z.string().min(1),\n /** Installed packages keyed by package name */\n packages: z.record(z.string(), PackageEntrySchema),\n});\n\n/**\n * Project configuration schema v2 — adds failure-recovery / variant-switch\n * tracking fields per [ADR 0019](../../../../docs/adr/0019-project-upgrade-flow.md):\n *\n * - `priorVariant` — variant in effect before the most recent switch.\n * - `lastUpdate` — per-package successful update record.\n * - `tokenRenameHistory` — accumulated rename log across switches.\n *\n * All new fields are optional so a freshly-migrated v1 config (no recovery\n * history yet) is a legal v2 document.\n */\nexport const ProjectConfigV2Schema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(2),\n /** IDE identifier */\n ide: z.string().min(1),\n /** Installed packages keyed by package name */\n packages: z.record(z.string(), PackageEntrySchema),\n /** Variant in effect before the most recent `variant switch`, if any. */\n priorVariant: z.string().min(1).optional(),\n /** Last successful update record keyed by package name. */\n lastUpdate: z.record(z.string(), LastUpdateRecordSchema).optional(),\n /** Token rename log accumulated across variant switches (oldest → newest). */\n tokenRenameHistory: z.array(TokenRenameRecordSchema).optional(),\n});\n\n/**\n * Project configuration schema — teamix-evo config.json at project root.\n *\n * Accepts both v1 and v2 input documents and transforms v1 → v2 transparently,\n * so consumers always observe a v2-shaped object. Writers (`writeProjectConfig`)\n * therefore always emit `schemaVersion: 2`; legacy v1 files on disk are\n * silently upgraded the next time they're read and re-written.\n */\nexport const ProjectConfigSchema = z\n .discriminatedUnion('schemaVersion', [\n ProjectConfigV1Schema,\n ProjectConfigV2Schema,\n ])\n .transform((cfg): z.infer<typeof ProjectConfigV2Schema> => {\n if (cfg.schemaVersion === 2) return cfg;\n // v1 → v2 migration: bump schemaVersion; new fields stay undefined until\n // a future update / variant switch populates them.\n const { schemaVersion: _v1, ...rest } = cfg;\n return {\n ...rest,\n schemaVersion: 2 as const,\n };\n });\n","import { z } from 'zod';\nimport { SkillIdeSchema, SkillScopeSchema } from './manifest.js';\n\n/**\n * An installed resource entry — tracks individual resource installation state.\n *\n * For type=\"skill\" resources, the same logical skill may produce multiple installed\n * entries (one per ide × scope combination); the optional `ide`/`scope` fields\n * disambiguate them.\n */\nexport const InstalledResourceSchema = z.object({\n /** Resource identifier matching the variant manifest */\n id: z.string().min(1),\n /** Target path where the resource was installed (absolute or project-relative) */\n target: z.string().min(1),\n /** Content hash for change detection (e.g. \"sha256:...\") */\n hash: z.string().min(1),\n /** Update strategy that was applied */\n strategy: z.enum(['frozen', 'regenerable', 'managed']),\n /** IDE this resource was installed for (skill resources only) */\n ide: SkillIdeSchema.optional(),\n /** Install scope (skill resources only) */\n scope: SkillScopeSchema.optional(),\n /**\n * Origin of the file content. Optional for backwards compatibility — older\n * manifests without this field still validate.\n *\n * - `teamix-evo` : installed from `@teamix-evo/ui` (or biz-ui)\n * - `shadcn-native` : matches an upstream registry entry verbatim\n * - `custom` : user-modified or hand-authored, no upstream match\n * - `custom-legacy` : user version preserved during a Coexist promotion\n * (see ADR / promote-to-biz)\n * - `detected` : adopted via `ui add --adopt`, registry id matched but\n * content has not been verified against upstream hash\n */\n sourceLineage: z\n .enum([\n 'teamix-evo',\n 'shadcn-native',\n 'custom',\n 'custom-legacy',\n 'detected',\n ])\n .optional(),\n});\n\n/**\n * An installed package entry — tracks a single package installation.\n */\nexport const InstalledPackageSchema = z.object({\n /** Full package name (e.g. \"@teamix-evo/tokens\") */\n package: z.string().min(1),\n /** Variant identifier (use \"_flat\" for non-variant packages such as skills) */\n variant: z.string().min(1),\n /** Installed version */\n version: z.string().min(1),\n /** ISO 8601 timestamp of installation */\n installedAt: z.string().min(1),\n /** List of installed resources */\n resources: z.array(InstalledResourceSchema),\n});\n\n/**\n * Installed manifest schema — tracks all installed packages in a project.\n * Stored at `.teamix-evo/manifest.json`.\n */\nexport const InstalledManifestSchema = z.object({\n schemaVersion: z.literal(1),\n /** List of installed packages */\n installed: z.array(InstalledPackageSchema),\n});\n","import { z } from 'zod';\nimport { SkillIdeSchema, SkillScopeSchema } from './manifest.js';\n\n/**\n * Skills source-mirror lock file schema.\n *\n * Per [ADR 0013](../../../../docs/adr/0013-skills-source-mirror.md), the source\n * lives at `.teamix-evo/skills/<id>/`, and IDE paths (`.qoder/skills/<id>/`,\n * `.claude/skills/<id>/`) are regenerable mirrors. This lock file at\n * `.teamix-evo/skills/manifest.lock.json` is the authoritative ledger of:\n *\n * 1. which skills are installed,\n * 2. which version each was installed from,\n * 3. which IDE mirror paths were produced (so `remove` / `sync` know where to act).\n *\n * v0.6 supports `qoder` + `claude` mirrors. `.cursor/rules/<id>.mdc` is v0.7\n * (per ADR 0013 §Implementation note); the schema does NOT pre-allocate\n * cursor-specific fields — they will be added with the v0.7 ADR.\n */\nexport const SkillsLockEntrySchema = z.object({\n /** Semver version installed from upstream */\n version: z.string().min(1),\n /** Upstream package name (typically `@teamix-evo/skills`) */\n from: z.string().min(1),\n /** ISO 8601 install / last-sync timestamp */\n installedAt: z.string().min(1),\n /** Install scope at time of mirror */\n scope: SkillScopeSchema,\n /**\n * IDEs this skill was mirrored to. Each ide ↔ a mirror path under\n * `<projectRoot>/.<ide>/skills/<id>/` (project) or `~/.<ide>/skills/<id>/`\n * (global). The path itself is reconstructed from `scope` + adapter; we\n * record the ide identifier rather than the full path to keep the lock\n * portable across machines.\n */\n mirroredTo: z.array(SkillIdeSchema),\n});\n\nexport const SkillsLockSchema = z.object({\n schemaVersion: z.literal(1),\n /** Map of skill id → lock entry */\n skills: z.record(z.string().min(1), SkillsLockEntrySchema),\n});\n\nexport type SkillsLockEntry = z.infer<typeof SkillsLockEntrySchema>;\nexport type SkillsLock = z.infer<typeof SkillsLockSchema>;\n","import { z } from 'zod';\n\n/**\n * Component-source upgrade staging manifest — emitted by CLI as the input for\n * the `teamix-evo-upgrade` skill (component source section). Persisted at\n * `.teamix-evo/.upgrade-staging/<category>-<fs-iso-ts>/meta.json`.\n *\n * See [ADR 0040](../../../../docs/adr/0040-component-source-layer-upgrade-flow.md).\n */\n\n/** Risk classification CLI assigns per component (AI may downgrade after review). */\nexport const UpgradeRiskLevelSchema = z.enum([\n /** Hash matches — nothing to do. */\n 'unchanged',\n /** Single-file change, no exported API surface delta. */\n 'upgradable-low',\n /** Multi-file change or new exports / new cva variants (additive). */\n 'upgradable-medium',\n /** Removed cva variants / renamed exports / props type narrowing. */\n 'risky',\n /** Entry no longer exists upstream / file removed. */\n 'breaking',\n /** Present in `src/components/{ui,biz-ui}/` but absent from installed manifest. */\n 'foreign',\n]);\n\n/** Lineage classification of the consumer project's component layer. */\nexport const ComponentLineageSchema = z.enum([\n 'teamix-evo',\n 'shadcn-native',\n 'mixed',\n 'custom-only',\n]);\n\n/** Discriminator for which package category a staging manifest covers. */\nexport const UpgradeStagingCategorySchema = z.enum(['ui', 'biz-ui']);\n\n/** What command produced the staging dir. */\nexport const UpgradeStagingTriggerSchema = z.enum([\n 'update',\n 'ui-upgrade',\n 'biz-ui-upgrade',\n]);\n\n/** Per-component \"current state on disk\" portion of a staging entry. */\nexport const UpgradeStagingCurrentSchema = z.object({\n /** Project-relative path of the component file (e.g. `src/components/ui/button.tsx`). */\n target: z.string().min(1),\n /** Hash recorded in `.teamix-evo/manifest.json` at install time, or null when foreign. */\n hash: z.string().nullable(),\n /** Lineage of *this specific component* (independent of project-wide lineage). */\n sourceLineage: z.enum(['teamix-evo', 'shadcn-native', 'custom', 'absent']),\n});\n\n/** Per-component \"incoming source from registry\" portion of a staging entry. */\nexport const UpgradeStagingIncomingSchema = z.object({\n /** Package-level version the incoming source comes from. */\n sourceVersion: z.string().min(1),\n /** Hash of incoming source after applying the consumer's import-rewrite aliases. */\n hash: z.string().min(1),\n /** Path of the incoming source file relative to the staging dir (e.g. `button/incoming.tsx`). */\n relPath: z.string().min(1),\n});\n\n/** Risk + diff metadata produced by CLI heuristics. */\nexport const UpgradeStagingDiffSchema = z.object({\n riskLevel: UpgradeRiskLevelSchema,\n /** Human-readable, machine-parsable hints (e.g. `\"new prop: loading\"`, `\"removed cva variant: ghost\"`). */\n hints: z.array(z.string()),\n /** Number of files that differ for this entry (almost always 1 today; reserved for multi-file entries). */\n filesChangedCount: z.number().int().nonnegative(),\n /**\n * Path of the unified diff relative to the staging dir, when CLI emitted one.\n * Reserved for a future emitter — in schema v1 the CLI does **not** pre-render\n * `diff.unified.patch`; the consumer of the staging (the `teamix-evo-upgrade`\n * skill) computes the diff on the fly from `current.tsx` vs `incoming.tsx`.\n */\n diffRelPath: z.string().optional(),\n});\n\n/**\n * File-type triage label — mirrors the buckets used by `ui add --adopt`\n * (Init landing plan §1.1) so downstream consumers (skill / promote-to-biz)\n * can reuse a single classification.\n */\nexport const PromoteFileTypeSchema = z.enum([\n 'component',\n 'hook',\n 'util',\n 'type',\n 'provider',\n]);\n\n/**\n * Promotion mode catalogue — the 8 modes documented in the Init landing plan\n * §1.2. Multiple may apply to a single entry; the CLI surfaces a recommended\n * subset and the AI / user picks the final composition.\n */\nexport const PromoteModeSchema = z.enum([\n 'Coexist',\n 'Preset',\n 'Wrapper',\n 'Compose',\n 'Variant',\n 'Fork',\n 'TokenOnly',\n 'ManualReview',\n]);\n\n/**\n * Lightweight feature vector summarizing the diff between user code and\n * upstream source. Each axis is best-effort regex-level; the consumer\n * (`teamix-evo-upgrade` / `promote-to-biz` skill) refines via AST as needed.\n */\nexport const PromoteFeatureVectorSchema = z.object({\n apiDelta: z.object({\n added: z.array(z.string()),\n removed: z.array(z.string()),\n signatureChanged: z.boolean(),\n }),\n styleDelta: z.object({\n classNameDiff: z.boolean(),\n tokenUsageDiff: z.boolean(),\n }),\n logicDelta: z.object({\n hasState: z.boolean(),\n hasEffect: z.boolean(),\n hasExtraImports: z.boolean(),\n }),\n cvaDelta: z.object({\n addedVariants: z.array(z.string()),\n modifiedVariants: z.array(z.string()),\n }),\n structureDelta: z.object({\n isComposition: z.boolean(),\n atomicChildren: z.array(z.string()),\n }),\n});\n\n/**\n * Optional promotion-planning payload attached to a staging entry. Surfaces\n * the data the `promote-to-biz` skill needs without forcing every consumer\n * to compute it themselves. Older manifests (schema v1, pre-feature-vector)\n * leave the field undefined.\n */\nexport const UpgradeStagingPromotionSchema = z.object({\n fileType: PromoteFileTypeSchema,\n featureVector: PromoteFeatureVectorSchema,\n recommendedModes: z.array(PromoteModeSchema),\n confidence: z.number().min(0).max(1),\n reasons: z.array(z.string()),\n});\n\n/** A single component-level entry inside the staging manifest. */\nexport const UpgradeStagingEntrySchema = z.object({\n /** Component identifier matching the upstream registry (e.g. `\"button\"`). */\n id: z.string().min(1),\n /** Which package category this entry belongs to. */\n category: UpgradeStagingCategorySchema,\n current: UpgradeStagingCurrentSchema,\n /** Absent when the entry is `breaking` (no incoming) or `foreign` (no upstream). */\n incoming: UpgradeStagingIncomingSchema.optional(),\n diff: UpgradeStagingDiffSchema,\n /**\n * Optional promotion-planning payload (Init landing plan Phase 2.C.2). Only\n * emitted when the CLI was able to compare current/incoming sources —\n * `breaking` / `foreign` entries leave it undefined.\n */\n promotion: UpgradeStagingPromotionSchema.optional(),\n});\n\n/**\n * Top-level staging manifest, written as `meta.json` in the staging dir.\n * Versioned independently from the project config (`schemaVersion: 1` here is\n * scoped to this manifest only).\n */\nexport const UpgradeStagingManifestSchema = z.object({\n schemaVersion: z.literal(1),\n /** ISO-8601 timestamp the staging dir was created (matches dir suffix). */\n ts: z.string().min(1),\n /** Which package category this staging covers. */\n package: UpgradeStagingCategorySchema,\n /** Which command produced this staging. */\n trigger: UpgradeStagingTriggerSchema,\n /** Variant applicable to the staging (always `_flat` for ui; concrete variant for biz-ui). */\n variant: z.string().min(1),\n /** Installed package version (from `.teamix-evo/manifest.json`); empty string when foreign-only. */\n fromVersion: z.string(),\n /** Upstream package version. */\n toVersion: z.string().min(1),\n /** Project-wide lineage classification. */\n lineage: ComponentLineageSchema,\n /** Aggregate counts grouped by riskLevel for quick AI summarization. */\n summary: z.object({\n total: z.number().int().nonnegative(),\n byRisk: z.record(UpgradeRiskLevelSchema, z.number().int().nonnegative()),\n }),\n entries: z.array(UpgradeStagingEntrySchema),\n});\n\nexport type UpgradeRiskLevel = z.infer<typeof UpgradeRiskLevelSchema>;\nexport type ComponentLineage = z.infer<typeof ComponentLineageSchema>;\nexport type UpgradeStagingCategory = z.infer<\n typeof UpgradeStagingCategorySchema\n>;\nexport type UpgradeStagingTrigger = z.infer<typeof UpgradeStagingTriggerSchema>;\nexport type UpgradeStagingCurrent = z.infer<typeof UpgradeStagingCurrentSchema>;\nexport type UpgradeStagingIncoming = z.infer<\n typeof UpgradeStagingIncomingSchema\n>;\nexport type UpgradeStagingDiff = z.infer<typeof UpgradeStagingDiffSchema>;\nexport type UpgradeStagingEntry = z.infer<typeof UpgradeStagingEntrySchema>;\nexport type UpgradeStagingManifest = z.infer<\n typeof UpgradeStagingManifestSchema\n>;\nexport type PromoteFileType = z.infer<typeof PromoteFileTypeSchema>;\nexport type PromoteMode = z.infer<typeof PromoteModeSchema>;\nexport type PromoteFeatureVector = z.infer<typeof PromoteFeatureVectorSchema>;\nexport type UpgradeStagingPromotion = z.infer<\n typeof UpgradeStagingPromotionSchema\n>;\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport {\n validateManifest,\n validateSkillsPackage,\n validateUiPackage,\n} from './validator.js';\nimport type {\n VariantManifest,\n SkillsPackageManifest,\n UiPackageManifest,\n} from './types.js';\n\n/**\n * Load and validate a variant manifest from a package directory.\n *\n * Reads `manifest.json` from the given directory, parses it as JSON,\n * and validates it against the VariantManifest schema.\n *\n * @param packageDir - Absolute or relative path to the variant package directory\n * @returns The validated VariantManifest\n * @throws Error if the file cannot be read or the manifest is invalid\n */\nexport async function loadVariantManifest(\n packageDir: string,\n): Promise<VariantManifest> {\n const manifestPath = path.join(packageDir, 'manifest.json');\n\n let raw: string;\n try {\n raw = await fs.readFile(manifestPath, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`Manifest not found: ${manifestPath}`);\n }\n throw new Error(\n `Failed to read manifest at ${manifestPath}: ${(err as Error).message}`,\n );\n }\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in manifest at ${manifestPath}`);\n }\n\n const result = validateManifest(data);\n if (!result.success) {\n throw new Error(`${result.error}\\n File: ${manifestPath}`);\n }\n\n return result.data;\n}\n\n/**\n * Load and validate the top-level manifest of a skills package.\n *\n * Reads `manifest.json` from the given directory and validates it against\n * the SkillsPackageManifest schema (flat list of skills, no variants).\n *\n * @param packageDir - Absolute or relative path to the skills package directory\n * @returns The validated SkillsPackageManifest\n * @throws Error if the file cannot be read or the manifest is invalid\n */\nexport async function loadSkillsPackageManifest(\n packageDir: string,\n): Promise<SkillsPackageManifest> {\n const manifestPath = path.join(packageDir, 'manifest.json');\n\n let raw: string;\n try {\n raw = await fs.readFile(manifestPath, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`Skills manifest not found: ${manifestPath}`);\n }\n throw new Error(\n `Failed to read skills manifest at ${manifestPath}: ${\n (err as Error).message\n }`,\n );\n }\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in skills manifest at ${manifestPath}`);\n }\n\n const result = validateSkillsPackage(data);\n if (!result.success) {\n throw new Error(`${result.error}\\n File: ${manifestPath}`);\n }\n\n return result.data;\n}\n\n/**\n * Load and validate the top-level manifest of a UI package.\n *\n * Reads `manifest.json` from the given directory and validates it against\n * the UiPackageManifest schema (flat list of entries, no variants).\n * Also performs registryDependencies graph validation (existence + no cycles).\n *\n * @param packageDir - Absolute or relative path to the ui package directory\n * @returns The validated UiPackageManifest\n * @throws Error if the file cannot be read, the manifest is invalid, or the dep graph is broken\n */\nexport async function loadUiPackageManifest(\n packageDir: string,\n): Promise<UiPackageManifest> {\n const manifestPath = path.join(packageDir, 'manifest.json');\n\n let raw: string;\n try {\n raw = await fs.readFile(manifestPath, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`UI manifest not found: ${manifestPath}`);\n }\n throw new Error(\n `Failed to read ui manifest at ${manifestPath}: ${(err as Error).message}`,\n );\n }\n\n let data: unknown;\n try {\n data = JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in ui manifest at ${manifestPath}`);\n }\n\n const result = validateUiPackage(data);\n if (!result.success) {\n throw new Error(`${result.error}\\n File: ${manifestPath}`);\n }\n\n return result.data;\n}\n","import { ZodError } from 'zod';\nimport {\n VariantManifestSchema,\n SkillsPackageManifestSchema,\n UiPackageManifestSchema,\n} from './schema/manifest.js';\nimport { ProjectConfigSchema } from './schema/config.js';\nimport { InstalledManifestSchema } from './schema/installed.js';\nimport { SkillsLockSchema } from './schema/skills-lock.js';\nimport type { SkillsLock } from './schema/skills-lock.js';\nimport type {\n VariantManifest,\n SkillsPackageManifest,\n UiPackageManifest,\n UiEntry,\n ProjectConfig,\n InstalledManifest,\n Result,\n} from './types.js';\n\n/**\n * Format a ZodError into a human-readable error message.\n */\nfunction formatZodError(error: ZodError): string {\n return error.issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : '(root)';\n return ` - ${path}: ${issue.message}`;\n })\n .join('\\n');\n}\n\n/**\n * Validate unknown data against the VariantManifest schema.\n * Returns a discriminated Result with either the parsed data or a friendly error message.\n */\nexport function validateManifest(data: unknown): Result<VariantManifest> {\n const result = VariantManifestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return {\n success: false,\n error: `Invalid variant manifest:\\n${formatZodError(result.error)}`,\n };\n}\n\n/**\n * Validate unknown data against the ProjectConfig schema.\n */\nexport function validateConfig(data: unknown): Result<ProjectConfig> {\n const result = ProjectConfigSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return {\n success: false,\n error: `Invalid project config:\\n${formatZodError(result.error)}`,\n };\n}\n\n/**\n * Validate unknown data against the InstalledManifest schema.\n */\nexport function validateInstalled(data: unknown): Result<InstalledManifest> {\n const result = InstalledManifestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return {\n success: false,\n error: `Invalid installed manifest:\\n${formatZodError(result.error)}`,\n };\n}\n\n/**\n * Validate unknown data against the SkillsLock schema (skills source-mirror lock).\n * Stored at `.teamix-evo/skills/manifest.lock.json` per ADR 0013.\n */\nexport function validateSkillsLock(data: unknown): Result<SkillsLock> {\n const result = SkillsLockSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return {\n success: false,\n error: `Invalid skills lock:\\n${formatZodError(result.error)}`,\n };\n}\n\n/**\n * Validate unknown data against the SkillsPackageManifest schema.\n */\nexport function validateSkillsPackage(\n data: unknown,\n): Result<SkillsPackageManifest> {\n const result = SkillsPackageManifestSchema.safeParse(data);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return {\n success: false,\n error: `Invalid skills package manifest:\\n${formatZodError(result.error)}`,\n };\n}\n\n/**\n * Validate unknown data against the UiPackageManifest schema, then verify the\n * registryDependencies graph: every reference resolves and there are no cycles.\n */\nexport function validateUiPackage(data: unknown): Result<UiPackageManifest> {\n const parsed = UiPackageManifestSchema.safeParse(data);\n if (!parsed.success) {\n return {\n success: false,\n error: `Invalid ui package manifest:\\n${formatZodError(parsed.error)}`,\n };\n }\n\n const graphIssues = validateUiDependencyGraph(parsed.data.entries);\n if (graphIssues.length > 0) {\n return {\n success: false,\n error: `Invalid ui package manifest dependency graph:\\n${graphIssues\n .map((i) => ` - ${i}`)\n .join('\\n')}`,\n };\n }\n\n return { success: true, data: parsed.data };\n}\n\n/**\n * Validate the registryDependencies graph among ui entries.\n * Returns a list of issue strings (empty when the graph is sound).\n *\n * Issues detected:\n * - Duplicate entry id\n * - Reference to an unknown entry id\n * - Cyclic dependency\n */\nexport function validateUiDependencyGraph(entries: UiEntry[]): string[] {\n const issues: string[] = [];\n const idToEntry = new Map<string, UiEntry>();\n\n for (const entry of entries) {\n if (idToEntry.has(entry.id)) {\n issues.push(`duplicate entry id: \"${entry.id}\"`);\n } else {\n idToEntry.set(entry.id, entry);\n }\n }\n\n for (const entry of entries) {\n const deps = entry.registryDependencies ?? [];\n for (const dep of deps) {\n if (!idToEntry.has(dep)) {\n issues.push(\n `entry \"${entry.id}\" depends on unknown entry \"${dep}\"`,\n );\n }\n }\n }\n\n // Cycle detection via DFS with three colors (white/gray/black).\n const WHITE = 0;\n const GRAY = 1;\n const BLACK = 2;\n const color = new Map<string, number>();\n for (const id of idToEntry.keys()) color.set(id, WHITE);\n\n const cycles: string[][] = [];\n\n function dfs(id: string, path: string[]): void {\n color.set(id, GRAY);\n path.push(id);\n const entry = idToEntry.get(id);\n const deps = entry?.registryDependencies ?? [];\n for (const dep of deps) {\n if (!idToEntry.has(dep)) continue; // already reported above\n const c = color.get(dep);\n if (c === GRAY) {\n const startIdx = path.indexOf(dep);\n cycles.push([...path.slice(startIdx), dep]);\n } else if (c === WHITE) {\n dfs(dep, path);\n }\n }\n path.pop();\n color.set(id, BLACK);\n }\n\n for (const id of idToEntry.keys()) {\n if (color.get(id) === WHITE) dfs(id, []);\n }\n\n for (const cycle of cycles) {\n issues.push(`cyclic registryDependencies: ${cycle.join(' → ')}`);\n }\n\n return issues;\n}\n\n/**\n * Topologically sort a subset of ui entries so that dependencies come before\n * dependents. Used by `ui add` to determine install order.\n *\n * @param entries full list of entries (the package manifest's `entries`)\n * @param requested ids the user explicitly asked to install\n * @returns ordered list of entry ids (includes transitive deps, dedup'd)\n * @throws Error if a requested id or transitive dep is missing or graph has cycles\n */\nexport function resolveUiEntryOrder(\n entries: UiEntry[],\n requested: string[],\n): string[] {\n const idToEntry = new Map(entries.map((e) => [e.id, e]));\n\n for (const id of requested) {\n if (!idToEntry.has(id)) {\n throw new Error(`Unknown ui entry: \"${id}\"`);\n }\n }\n\n // Pre-flight cycle check on the full graph.\n const graphIssues = validateUiDependencyGraph(entries);\n if (graphIssues.length > 0) {\n throw new Error(\n `UI dependency graph has issues:\\n${graphIssues\n .map((i) => ` - ${i}`)\n .join('\\n')}`,\n );\n }\n\n const visited = new Set<string>();\n const order: string[] = [];\n\n function visit(id: string): void {\n if (visited.has(id)) return;\n visited.add(id);\n const entry = idToEntry.get(id);\n const deps = entry?.registryDependencies ?? [];\n for (const dep of deps) visit(dep);\n order.push(id);\n }\n\n for (const id of requested) visit(id);\n\n return order;\n}\n","/**\n * Tokens package catalog loader.\n *\n * Per [ADR 0020](../../../docs/adr/0020-design-to-tokens-skill-fusion.md) the\n * tokens package is a flat variant list — there is no default baseline, no\n * per-variant `pack.json`, and no walk-and-merge inheritance. The single\n * source of truth is `manifest.json`; the loader just parses and validates it.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport {\n TokensPackageManifestSchema,\n type TokensPackageManifest,\n type TokensVariantEntry,\n} from './schema/tokens-pack.js';\n\n/**\n * Read & validate the top-level `packages/tokens/manifest.json` catalog.\n * Errors are wrapped with the file path for easy diagnosis (P8).\n */\nexport async function loadTokensPackageManifest(\n packageDir: string,\n): Promise<TokensPackageManifest> {\n const manifestPath = path.join(packageDir, 'manifest.json');\n let raw: string;\n try {\n raw = await fs.readFile(manifestPath, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`Tokens package manifest not found: ${manifestPath}`);\n }\n throw new Error(\n `Failed to read tokens package manifest at ${manifestPath}: ${\n (err as Error).message\n }`,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\n `Invalid JSON in tokens package manifest at ${manifestPath}`,\n );\n }\n\n const result = TokensPackageManifestSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Invalid tokens package manifest:\\n${result.error.message}\\n File: ${manifestPath}`,\n );\n }\n return result.data;\n}\n\n/**\n * Lookup helper: find one variant entry in a catalog by name.\n * Returns `undefined` when the variant is not advertised.\n */\nexport function getVariantEntry(\n catalog: TokensPackageManifest,\n variantName: string,\n): TokensVariantEntry | undefined {\n return catalog.variants.find((v) => v.name === variantName);\n}\n","/**\n * Loaders for `@teamix-evo/biz-ui` and `@teamix-evo/templates` per\n * [ADR 0014](../../../docs/adr/0014-ui-biz-ui-templates-tier.md).\n *\n * Two ops:\n *\n * - `loadVariantUiPackageCatalog(packageDir)` — reads top-level\n * `packages/<pkg>/manifest.json` (variant list).\n * - `loadVariantUiPackageManifest(variantDir)` — reads per-variant\n * `packages/<pkg>/variants/<name>/manifest.json` (entry list).\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport {\n VariantUiPackageCatalogSchema,\n VariantUiPackageManifestSchema,\n type VariantUiPackageCatalog,\n type VariantUiPackageManifest,\n} from './schema/variant-ui-pack.js';\n\nasync function readJson(filePath: string, kind: string): Promise<unknown> {\n let raw: string;\n try {\n raw = await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`${kind} not found: ${filePath}`);\n }\n throw new Error(\n `Failed to read ${kind} at ${filePath}: ${(err as Error).message}`,\n );\n }\n try {\n return JSON.parse(raw);\n } catch {\n throw new Error(`Invalid JSON in ${kind} at ${filePath}`);\n }\n}\n\nexport async function loadVariantUiPackageCatalog(\n packageDir: string,\n): Promise<VariantUiPackageCatalog> {\n const manifestPath = path.join(packageDir, 'manifest.json');\n const data = await readJson(manifestPath, 'variant-ui catalog');\n const result = VariantUiPackageCatalogSchema.safeParse(data);\n if (!result.success) {\n throw new Error(\n `Invalid catalog:\\n${result.error.message}\\n File: ${manifestPath}`,\n );\n }\n return result.data;\n}\n\nexport async function loadVariantUiPackageManifest(\n variantDir: string,\n): Promise<VariantUiPackageManifest> {\n const manifestPath = path.join(variantDir, 'manifest.json');\n const data = await readJson(manifestPath, 'variant-ui manifest');\n const result = VariantUiPackageManifestSchema.safeParse(data);\n if (!result.success) {\n throw new Error(\n `Invalid variant manifest:\\n${result.error.message}\\n File: ${manifestPath}`,\n );\n }\n // Cross-check: variant name in manifest must equal the directory name.\n const dirName = path.basename(variantDir);\n if (result.data.variant !== dirName) {\n throw new Error(\n `Variant manifest mismatch: variants/${dirName}/manifest.json declares variant=\"${result.data.variant}\". Names must match.`,\n );\n }\n return result.data;\n}\n","import type { DocumentSegment, ManagedRegion } from './types.js';\n\n/**\n * Regex pattern for matching managed region markers.\n * Captures the region id and the content between start/end markers.\n */\nconst REGION_PATTERN =\n /<!-- teamix-evo:managed:start id=\"([^\"]+)\" -->([\\s\\S]*?)<!-- teamix-evo:managed:end id=\"\\1\" -->/g;\n\n/**\n * Regex for a start marker without a matching end marker — used for error detection.\n */\nconst START_MARKER_PATTERN = /<!-- teamix-evo:managed:start id=\"([^\"]+)\" -->/g;\n\nconst END_MARKER_PATTERN = /<!-- teamix-evo:managed:end id=\"([^\"]+)\" -->/g;\n\n/**\n * Parse all managed regions from document content.\n *\n * @param content - The full document content\n * @returns Array of parsed ManagedRegion objects\n * @throws Error if there are unmatched start/end markers\n */\nexport function parseManagedRegions(content: string): ManagedRegion[] {\n // First, check for unmatched markers\n const startIds = new Set<string>();\n const endIds = new Set<string>();\n const startCounts = new Map<string, number>();\n\n let match: RegExpExecArray | null;\n\n const startRe = new RegExp(START_MARKER_PATTERN.source, 'g');\n while ((match = startRe.exec(content)) !== null) {\n const id = match[1]!;\n startIds.add(id);\n startCounts.set(id, (startCounts.get(id) ?? 0) + 1);\n }\n\n const endRe = new RegExp(END_MARKER_PATTERN.source, 'g');\n while ((match = endRe.exec(content)) !== null) {\n endIds.add(match[1]!);\n }\n\n // Check for duplicate start markers\n for (const [id, count] of startCounts) {\n if (count > 1) {\n throw new Error(\n `Duplicate managed region: found ${count} start markers for \"${id}\". Each id must be unique within a file.`,\n );\n }\n }\n\n // Check for start markers without matching end markers\n for (const id of startIds) {\n if (!endIds.has(id)) {\n throw new Error(\n `Unmatched managed region: found start marker for \"${id}\" but no matching end marker`,\n );\n }\n }\n\n // Check for end markers without matching start markers\n for (const id of endIds) {\n if (!startIds.has(id)) {\n throw new Error(\n `Unmatched managed region: found end marker for \"${id}\" but no matching start marker`,\n );\n }\n }\n\n // Now parse matched regions\n const regions: ManagedRegion[] = [];\n const regionRe = new RegExp(REGION_PATTERN.source, 'g');\n\n while ((match = regionRe.exec(content)) !== null) {\n const id = match[1]!;\n const regionContent = match[2]!;\n regions.push({\n id,\n startMarker: `<!-- teamix-evo:managed:start id=\"${id}\" -->`,\n endMarker: `<!-- teamix-evo:managed:end id=\"${id}\" -->`,\n content: regionContent,\n });\n }\n\n return regions;\n}\n\n/**\n * Replace the content of a specific managed region by id.\n * Content outside managed regions is preserved.\n *\n * @param content - The full document content\n * @param id - The region id to replace\n * @param newContent - The new content for the region\n * @returns The updated document content\n * @throws Error if the region id is not found\n */\nexport function replaceManagedRegion(\n content: string,\n id: string,\n newContent: string,\n): string {\n const startMarker = `<!-- teamix-evo:managed:start id=\"${id}\" -->`;\n const endMarker = `<!-- teamix-evo:managed:end id=\"${id}\" -->`;\n\n const pattern = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(\n id,\n )}\" -->[\\\\s\\\\S]*?<!-- teamix-evo:managed:end id=\"${escapeRegExp(id)}\" -->`,\n 'g',\n );\n\n // First check if the region actually exists\n if (!pattern.test(content)) {\n throw new Error(`Managed region \"${id}\" not found in content`);\n }\n\n // Reset lastIndex after test() with global flag\n pattern.lastIndex = 0;\n\n return content.replace(\n pattern,\n `${startMarker}\\n${newContent}\\n${endMarker}`,\n );\n}\n\n/**\n * Check whether a managed region with the given id exists in the content.\n *\n * @param content - The full document content\n * @param id - The region id to check\n * @returns true if the region exists\n */\nexport function hasManagedRegion(content: string, id: string): boolean {\n const pattern = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(\n id,\n )}\" -->[\\\\s\\\\S]*?<!-- teamix-evo:managed:end id=\"${escapeRegExp(id)}\" -->`,\n );\n return pattern.test(content);\n}\n\n/**\n * Split a document into an ordered sequence of {@link DocumentSegment}s,\n * classifying each chunk as either `unmanaged` (user-owned) or `managed`\n * (framework-owned, identified by `<!-- teamix-evo:managed:start id=\"...\" -->`\n * markers).\n *\n * The output preserves the document byte-for-byte: concatenating each\n * segment's serialized form—marker + content + marker for `managed`,\n * `content` for `unmanaged`—reconstructs the original input exactly.\n *\n * `unmanaged` segments may be empty strings when two managed regions touch\n * each other or sit at the document edges — callers SHOULD preserve them so\n * a later round-trip (split → mutate managed only → join) does not silently\n * drop boundary structure.\n *\n * Marker integrity is enforced via {@link parseManagedRegions} — unmatched\n * or duplicate markers throw. The update pipeline (ADR 0019 §2) relies on\n * this contract so a corrupted file fails fast rather than producing\n * unexpected merges.\n *\n * @example\n * const segs = splitManagedRegions(\n * `prelude\\n<!-- teamix-evo:managed:start id=\"core\" -->\\nA\\n<!-- teamix-evo:managed:end id=\"core\" -->\\ntail`,\n * );\n * // [\n * // { kind: 'unmanaged', content: 'prelude\\n' },\n * // { kind: 'managed', region: { id: 'core', …, content: '\\nA\\n' } },\n * // { kind: 'unmanaged', content: '\\ntail' },\n * // ]\n *\n * @param content - The full document content.\n * @returns Ordered segments covering the entire input.\n * @throws Error when start/end markers are unmatched or a start id appears more than once.\n */\nexport function splitManagedRegions(content: string): DocumentSegment[] {\n // parseManagedRegions enforces marker integrity (duplicate / unmatched\n // markers throw). We re-run the regex here only to recover positions,\n // because the parser intentionally hides offsets from its result type.\n parseManagedRegions(content);\n\n const regionRe = new RegExp(REGION_PATTERN.source, 'g');\n const segments: DocumentSegment[] = [];\n let cursor = 0;\n\n let match: RegExpExecArray | null;\n while ((match = regionRe.exec(content)) !== null) {\n const id = match[1]!;\n const regionContent = match[2]!;\n const start = match.index;\n const end = start + match[0].length;\n\n // Always emit the unmanaged chunk — even when empty — so callers can\n // round-trip without losing boundary structure (e.g. two managed\n // regions sitting back-to-back).\n segments.push({ kind: 'unmanaged', content: content.slice(cursor, start) });\n segments.push({\n kind: 'managed',\n region: {\n id,\n startMarker: `<!-- teamix-evo:managed:start id=\"${id}\" -->`,\n endMarker: `<!-- teamix-evo:managed:end id=\"${id}\" -->`,\n content: regionContent,\n },\n });\n cursor = end;\n }\n\n // Trailing unmanaged tail (always emit, even when empty, for symmetry).\n segments.push({ kind: 'unmanaged', content: content.slice(cursor) });\n return segments;\n}\n\n/**\n * Escape special regex characters in a string.\n */\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n// ─── YAML frontmatter helpers ─────────────────────────────────────────────────\n//\n// Per ADR 0015, a SKILL.md frontmatter block (`name` / `description` /\n// trigger contract) is the *protocol* by which IDEs register and trigger the\n// skill. Unlike the body — which a user MAY freely annotate outside managed\n// regions — the frontmatter MUST always reflect the upstream package.\n// `skills update` therefore strips the local frontmatter and replaces it with\n// the upstream one before applying managed-region merges. These helpers are\n// the building blocks for that flow.\n\nconst FRONTMATTER_PATTERN = /^---\\r?\\n[\\s\\S]*?\\r?\\n---(?:\\r?\\n|$)/;\n\n/**\n * Extract the leading YAML frontmatter block (including the surrounding\n * `---` fences and the trailing newline, if any) from a document.\n *\n * Returns `null` when the document does not start with a frontmatter block.\n */\nexport function extractFrontmatter(content: string): string | null {\n const m = content.match(FRONTMATTER_PATTERN);\n return m ? m[0] : null;\n}\n\n/**\n * Replace the leading YAML frontmatter block of `content` with\n * `newFrontmatter`. If `content` has no frontmatter, `newFrontmatter` is\n * prepended (separated by a single newline if it does not already end\n * with one).\n *\n * `newFrontmatter` must include the surrounding `---` fences — pass the\n * value returned by {@link extractFrontmatter}.\n */\nexport function replaceFrontmatter(\n content: string,\n newFrontmatter: string,\n): string {\n const m = content.match(FRONTMATTER_PATTERN);\n if (!m) {\n return newFrontmatter.endsWith('\\n')\n ? newFrontmatter + content\n : `${newFrontmatter}\\n${content}`;\n }\n return newFrontmatter + content.slice(m[0].length);\n}\n","import type { UpdateStrategy } from \"./types.js\";\n\n/**\n * Determine whether a resource should be updated based on its strategy\n * and whether it already exists.\n *\n * @param strategy - The update strategy for the resource\n * @param resourceExists - Whether the resource file already exists\n * @returns true if the resource should be updated/created\n */\nexport function shouldUpdate(\n strategy: UpdateStrategy,\n resourceExists: boolean,\n): boolean {\n switch (strategy) {\n case \"frozen\":\n // Only install if it doesn't exist yet\n return !resourceExists;\n case \"regenerable\":\n // Always overwrite\n return true;\n case \"managed\":\n // Always update (managed regions only)\n return true;\n default:\n return false;\n }\n}\n\n/** Possible actions returned by getUpdateAction */\nexport type UpdateAction = \"skip\" | \"overwrite\" | \"managed-update\";\n\nexport interface UpdateActionOptions {\n /** Whether the resource file already exists */\n exists: boolean;\n /** Hash of the new content to be written */\n hash?: string;\n /** Hash of the currently installed content */\n currentHash?: string;\n}\n\n/**\n * Determine the specific update action to take for a resource.\n *\n * @param strategy - The update strategy for the resource\n * @param options - Context about the resource's current state\n * @returns The action to perform\n */\nexport function getUpdateAction(\n strategy: UpdateStrategy,\n options: UpdateActionOptions,\n): UpdateAction {\n switch (strategy) {\n case \"frozen\":\n if (!options.exists) {\n // First-time install\n return \"overwrite\";\n }\n // File exists, never modify\n return \"skip\";\n\n case \"regenerable\":\n if (\n options.exists &&\n options.hash &&\n options.currentHash &&\n options.hash === options.currentHash\n ) {\n // Content unchanged, skip\n return \"skip\";\n }\n return \"overwrite\";\n\n case \"managed\":\n if (!options.exists) {\n // First-time install — write the whole file\n return \"overwrite\";\n }\n return \"managed-update\";\n\n default:\n return \"skip\";\n }\n}\n"],"mappings":"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","names":["z","z","SEMVER_RE","VARIANT_NAME_RE","z","z","z","z","z","z","z","z","path","fs","path","fs","path"]}
|