@teamix-evo/registry 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +123 -0
- package/dist/index.cjs +822 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1774 -24
- package/dist/index.d.ts +1774 -24
- package/dist/index.js +788 -35
- package/dist/index.js.map +1 -1
- package/package.json +14 -10
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema/manifest.ts","../src/schema/config.ts","../src/schema/installed.ts","../src/loader.ts","../src/validator.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]);\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 /** Target path (relative to project root) where the resource is installed */\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});\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","import { z } from \"zod\";\n\n/**\n * Package entry within a project config.\n */\nexport const PackageEntrySchema = z.object({\n /** Variant identifier (e.g. \"opentrek\") */\n variant: z.string().min(1),\n /** Semver version string */\n version: z.string().min(1),\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\";\n\n/**\n * An installed resource entry — tracks individual resource installation state.\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 */\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});\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/design\") */\n package: z.string().min(1),\n /** Variant identifier */\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 * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { validateManifest } from \"./validator.js\";\nimport type { VariantManifest } 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","import { ZodError } from \"zod\";\nimport { VariantManifestSchema } from \"./schema/manifest.js\";\nimport { ProjectConfigSchema } from \"./schema/config.js\";\nimport { InstalledManifestSchema } from \"./schema/installed.js\";\nimport type {\n VariantManifest,\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","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 =\n /<!-- teamix-evo:managed:start id=\"([^\"]+)\" -->/g;\n\nconst END_MARKER_PATTERN =\n /<!-- 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\n let match: RegExpExecArray | null;\n\n const startRe = new RegExp(START_MARKER_PATTERN.source, \"g\");\n while ((match = startRe.exec(content)) !== null) {\n startIds.add(match[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 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(id)}\" -->[\\\\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(id)}\" -->[\\\\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","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/schema/manifest.ts","../src/schema/design-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/design-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/design/pack.lock.json` records the same variant. MUST equal\n * the variant directory name in `@teamix-evo/design/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\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 * When set, CLI install drops it at `.teamix-evo/design/components/<id>.meta.md`\n * for design's ai-rules to consume.\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 /** Flat list of entries shipped by this package */\n entries: z.array(UiEntrySchema),\n});\n","/**\n * Design Pack manifest schema.\n *\n * Per [ADR 0010](../../../../docs/adr/0010-design-default-and-variants.md) the\n * design system is structured as one **default** baseline + N **variants**:\n *\n * packages/design/\n * ├── default/ <- B-end neutral baseline (always present)\n * │ ├── pack.json <- this schema (no `extends`)\n * │ └── ... (philosophy/, foundations/, patterns/, scenarios/)\n * ├── variants/\n * │ ├── _template/ <- minimal scaffold for new variants\n * │ │ └── pack.json <- this schema, extends: \"default\"\n * │ ├── opentrek/\n * │ │ ├── pack.json <- this schema, extends: \"default\"\n * │ │ └── ... (only files differing from default)\n * │ └── uni-manager/\n * │ └── pack.json\n * └── manifest.json <- top-level catalog (lists default + variants)\n *\n * The `pack.json` carries **only the protocol identity** of one pack; file\n * lists are NOT declared here — the loader walks the filesystem under the\n * pack root and lets file-level override merge happen at install time.\n *\n * Rationale: variant authors who add a new file (e.g. a new Markdown pattern)\n * shouldn't have to register it in `pack.json`. The filesystem is the single\n * source of truth (P2). See ADR 0010 §7 for the schema-simplification\n * rationale.\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 design pack.\n *\n * When a consumer installs design `<variant>`, the CLI MAY check that the\n * matching biz-ui / templates variant exists in the workspace / npm and\n * prompt the user to install it too. The link is **soft** — packs may exist\n * without their biz-ui or templates counterparts, especially in early\n * development.\n *\n * Format: `<package-spec>#<variant-name>`, e.g. `@teamix-evo/biz-ui#opentrek`.\n *\n * Linked field for `templates` added per [ADR 0014 2026-05-18 amendment](../../../../docs/adr/0014-ui-biz-ui-templates-tier.md)\n * (templates became variant-aware mirroring biz-ui).\n */\nexport const DesignPackLinkedSchema = z.object({\n 'biz-ui': z.string().optional(),\n templates: z.string().optional(),\n});\n\n/**\n * Design pack manifest schema.\n *\n * Describes ONE pack (either the default baseline or one variant). Files are\n * not declared — the loader walks the pack root.\n */\nexport const DesignPackManifestSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /**\n * Pack identifier.\n * - `\"default\"` for the built-in baseline (only valid name when `extends` is absent)\n * - lowercase kebab-case for variants (`opentrek`, `uni-manager`, `acme-erp`, `_template`)\n */\n name: z\n .string()\n .min(1)\n .regex(\n VARIANT_NAME_RE,\n 'Pack name must be lowercase letters/digits/hyphens (no leading hyphen). Special: \"_template\" allowed for the variant scaffold.',\n )\n .or(z.literal('_template'))\n .or(z.literal('default')),\n /** Human-readable display name (e.g. \"OpenTrek\" for variant id \"opentrek\"). */\n displayName: z.string().min(1),\n /** Semver. */\n version: z.string().regex(SEMVER_RE, 'Invalid semver version'),\n /**\n * Parent pack name. Required for variants, must be omitted for `default`.\n * Currently only `\"default\"` is a valid parent.\n */\n extends: z.string().optional(),\n /** Optional one-liner; useful for `design list-variants` output. */\n description: z.string().optional(),\n /** Soft cross-package links (biz-ui / templates with same variant name). */\n linked: DesignPackLinkedSchema.optional(),\n});\n\nexport type DesignPackManifest = z.infer<typeof DesignPackManifestSchema>;\nexport type DesignPackLinked = z.infer<typeof DesignPackLinkedSchema>;\n\n/**\n * Top-level catalog of all packs in `@teamix-evo/design`.\n *\n * Lives at `packages/design/manifest.json`. Lists the default baseline + all\n * variants the package ships. The catalog is regenerable via\n * `pnpm --filter @teamix-evo/design validate` — variant directories are the\n * source of truth.\n */\nexport const DesignPackageManifestSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n /** Always `\"design\"` for this package. */\n package: z.literal('design'),\n /** Semver of the entire design 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 /** The default baseline pack — always present. */\n default: DesignPackManifestSchema,\n /** All shipped variants (excluding `_template/`). */\n variants: z.array(DesignPackManifestSchema),\n});\n\nexport type DesignPackageManifest = z.infer<typeof DesignPackageManifestSchema>;\n\n/**\n * Consumer-side lock file written to\n * `.teamix-evo/design/pack.lock.json` after `design init`.\n *\n * Records which default + variant version was installed so future\n * `design upgrade` / `doctor` / AI tooling can reason about install state\n * without re-walking the source.\n */\nexport const DesignPackLockSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.literal(1),\n default: z.object({\n version: z.string().regex(SEMVER_RE),\n from: z.string().min(1), // e.g. \"@teamix-evo/design\"\n }),\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),\n }),\n linked: DesignPackLinkedSchema.optional(),\n installedAt: z.string().datetime(),\n});\n\nexport type DesignPackLock = z.infer<typeof DesignPackLockSchema>;\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/design`'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` — design 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/design\") */\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 * Design pack loader & walk-and-merge.\n *\n * Implements [ADR 0010](../../../docs/adr/0010-design-default-and-variants.md)\n * §4 file-level override. The loader knows nothing about install targets — it\n * just produces a merged file list that the CLI then writes to the consumer.\n *\n * Two top-level operations are exposed:\n *\n * - `loadDesignPack(packDir)` — read & validate one pack's `pack.json`.\n * - `walkPackTree(packDir)` — list files under a pack root (excluding\n * `pack.json` itself; that's pack metadata, not pack content).\n * - `mergeDefaultAndVariant(defaultDir, variantDir)` — produce the merged\n * file map per ADR 0010 §4: variant files override default files at the\n * same path; variant-only paths are appended; default-only paths fall\n * through.\n */\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport {\n DesignPackManifestSchema,\n DesignPackageManifestSchema,\n type DesignPackManifest,\n type DesignPackageManifest,\n} from './schema/design-pack.js';\n\n/** Files that exist in a pack tree but are NOT considered pack content. */\nconst PACK_METADATA_FILES = new Set(['pack.json']);\n\n/**\n * Read & validate a single pack's `pack.json`.\n * Errors are wrapped with the file path for easy diagnosis (P8).\n */\nexport async function loadDesignPack(\n packDir: string,\n): Promise<DesignPackManifest> {\n const manifestPath = path.join(packDir, 'pack.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(`Design pack manifest not found: ${manifestPath}`);\n }\n throw new Error(\n `Failed to read design pack 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(`Invalid JSON in design pack manifest at ${manifestPath}`);\n }\n\n const result = DesignPackManifestSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Invalid design pack manifest:\\n${result.error.message}\\n File: ${manifestPath}`,\n );\n }\n\n // Cross-field check: default has no extends; variants must extend \"default\".\n if (result.data.name === 'default' && result.data.extends !== undefined) {\n throw new Error(\n `Pack \"default\" must not have \"extends\" field: ${manifestPath}`,\n );\n }\n if (result.data.name !== 'default' && result.data.extends !== 'default') {\n throw new Error(\n `Variant pack \"${result.data.name}\" must declare extends: \"default\" (got ${JSON.stringify(\n result.data.extends,\n )}): ${manifestPath}`,\n );\n }\n\n return result.data;\n}\n\n/**\n * Read & validate the top-level `packages/design/manifest.json` catalog.\n */\nexport async function loadDesignPackageManifest(\n packageDir: string,\n): Promise<DesignPackageManifest> {\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(`Design package manifest not found: ${manifestPath}`);\n }\n throw new Error(\n `Failed to read design 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(`Invalid JSON in design package manifest at ${manifestPath}`);\n }\n\n const result = DesignPackageManifestSchema.safeParse(parsed);\n if (!result.success) {\n throw new Error(\n `Invalid design package manifest:\\n${result.error.message}\\n File: ${manifestPath}`,\n );\n }\n return result.data;\n}\n\n/**\n * Walk all files under a pack root and return their paths **relative to\n * `packDir`**, excluding pack metadata files (`pack.json`).\n *\n * Returns a sorted list (deterministic for tests + diff-friendly).\n */\nexport async function walkPackTree(packDir: string): Promise<string[]> {\n const out: string[] = [];\n\n async function recurse(absDir: string, relDir: string): Promise<void> {\n const entries = await fs.readdir(absDir, { withFileTypes: true });\n for (const entry of entries) {\n const abs = path.join(absDir, entry.name);\n const rel = relDir ? path.posix.join(relDir, entry.name) : entry.name;\n if (entry.isDirectory()) {\n await recurse(abs, rel);\n } else if (entry.isFile()) {\n // Skip pack metadata at the pack root only.\n if (relDir === '' && PACK_METADATA_FILES.has(entry.name)) continue;\n out.push(rel);\n }\n }\n }\n\n try {\n await recurse(packDir, '');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`Pack directory not found: ${packDir}`);\n }\n throw err;\n }\n\n return out.sort();\n}\n\n/**\n * Result of merging default + variant: each entry is a file the CLI should\n * install, paired with which on-disk file to read.\n */\nexport interface MergedFileEntry {\n /** Path relative to the pack root (e.g. `philosophy/principles.md`). */\n relPath: string;\n /** Absolute filesystem path the CLI should read. */\n sourcePath: string;\n /** Which pack provided this file (for diagnostics + UI listing). */\n origin: 'default' | 'variant';\n}\n\nexport interface MergeResult {\n files: MergedFileEntry[];\n /** Files where variant overrode default. Useful for diagnostics. */\n overrides: string[];\n /** Files only in variant (no default counterpart). */\n variantAdds: string[];\n /** Files only in default (variant didn't override). */\n defaultPassThrough: string[];\n}\n\n/**\n * File-level merge per ADR 0010 §4.\n *\n * For each file path P:\n * - If `<variantDir>/P` exists: use the variant's file (override).\n * - Else: use the default's file (pass-through).\n * Plus: every file in variant tree NOT present in default tree is appended\n * (variant-add).\n *\n * No content parsing happens here — files are read as-is by the caller.\n */\nexport async function mergeDefaultAndVariant(\n defaultDir: string,\n variantDir: string,\n): Promise<MergeResult> {\n const defaultFiles = new Set(await walkPackTree(defaultDir));\n const variantFiles = new Set(await walkPackTree(variantDir));\n\n const overrides: string[] = [];\n const variantAdds: string[] = [];\n const defaultPassThrough: string[] = [];\n const files: MergedFileEntry[] = [];\n\n // Walk the union, deterministic order\n const allPaths = Array.from(new Set([...defaultFiles, ...variantFiles])).sort();\n for (const rel of allPaths) {\n const inDefault = defaultFiles.has(rel);\n const inVariant = variantFiles.has(rel);\n if (inVariant && inDefault) {\n overrides.push(rel);\n files.push({\n relPath: rel,\n sourcePath: path.join(variantDir, rel),\n origin: 'variant',\n });\n } else if (inVariant) {\n variantAdds.push(rel);\n files.push({\n relPath: rel,\n sourcePath: path.join(variantDir, rel),\n origin: 'variant',\n });\n } else {\n defaultPassThrough.push(rel);\n files.push({\n relPath: rel,\n sourcePath: path.join(defaultDir, rel),\n origin: 'default',\n });\n }\n }\n\n return { files, overrides, variantAdds, defaultPassThrough };\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teamix-evo/registry",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Registry protocol, schemas, and utilities for Teamix Evo",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -16,14 +16,6 @@
|
|
|
16
16
|
"files": [
|
|
17
17
|
"dist"
|
|
18
18
|
],
|
|
19
|
-
"scripts": {
|
|
20
|
-
"build": "tsup",
|
|
21
|
-
"dev": "tsup --watch",
|
|
22
|
-
"test": "vitest run",
|
|
23
|
-
"test:watch": "vitest",
|
|
24
|
-
"typecheck": "tsc --noEmit",
|
|
25
|
-
"lint": "tsc --noEmit"
|
|
26
|
-
},
|
|
27
19
|
"devDependencies": {
|
|
28
20
|
"@types/node": "^20.0.0",
|
|
29
21
|
"tsup": "^8.0.0",
|
|
@@ -31,5 +23,17 @@
|
|
|
31
23
|
},
|
|
32
24
|
"dependencies": {
|
|
33
25
|
"zod": "^3.23.0"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public",
|
|
29
|
+
"registry": "https://registry.npmjs.org/"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsup",
|
|
33
|
+
"dev": "tsup --watch",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"lint": "tsc --noEmit"
|
|
34
38
|
}
|
|
35
|
-
}
|
|
39
|
+
}
|