@teamix-evo/registry 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,356 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ InstalledManifestSchema: () => InstalledManifestSchema,
34
+ InstalledPackageSchema: () => InstalledPackageSchema,
35
+ InstalledResourceSchema: () => InstalledResourceSchema,
36
+ PackageEntrySchema: () => PackageEntrySchema,
37
+ ProjectConfigSchema: () => ProjectConfigSchema,
38
+ ResourceSchema: () => ResourceSchema,
39
+ ResourceTypeSchema: () => ResourceTypeSchema,
40
+ UpdateStrategySchema: () => UpdateStrategySchema,
41
+ VariantManifestSchema: () => VariantManifestSchema,
42
+ getUpdateAction: () => getUpdateAction,
43
+ hasManagedRegion: () => hasManagedRegion,
44
+ loadVariantManifest: () => loadVariantManifest,
45
+ parseManagedRegions: () => parseManagedRegions,
46
+ replaceManagedRegion: () => replaceManagedRegion,
47
+ shouldUpdate: () => shouldUpdate,
48
+ validateConfig: () => validateConfig,
49
+ validateInstalled: () => validateInstalled,
50
+ validateManifest: () => validateManifest
51
+ });
52
+ module.exports = __toCommonJS(index_exports);
53
+
54
+ // src/schema/manifest.ts
55
+ var import_zod = require("zod");
56
+ var UpdateStrategySchema = import_zod.z.enum([
57
+ "frozen",
58
+ "regenerable",
59
+ "managed"
60
+ ]);
61
+ var ResourceTypeSchema = import_zod.z.enum([
62
+ "doc",
63
+ "tokens",
64
+ "ai-rules",
65
+ "config"
66
+ ]);
67
+ var ResourceSchema = import_zod.z.object({
68
+ /** Unique identifier for the resource within the manifest */
69
+ id: import_zod.z.string().min(1),
70
+ /** Resource type */
71
+ type: ResourceTypeSchema,
72
+ /** Source path (relative to variant root), typically a template */
73
+ source: import_zod.z.string().min(1),
74
+ /** Target path (relative to project root) where the resource is installed */
75
+ target: import_zod.z.string().min(1),
76
+ /** How the resource is updated */
77
+ updateStrategy: UpdateStrategySchema,
78
+ /** Whether the source is a Handlebars template */
79
+ template: import_zod.z.boolean().optional(),
80
+ /** IDs of managed regions (only relevant when updateStrategy is "managed") */
81
+ managedRegions: import_zod.z.array(import_zod.z.string()).optional(),
82
+ /** Whether to recursively process directory contents */
83
+ recursive: import_zod.z.boolean().optional()
84
+ });
85
+ var VariantManifestSchema = import_zod.z.object({
86
+ $schema: import_zod.z.string().optional(),
87
+ schemaVersion: import_zod.z.literal(1),
88
+ /** Package name (e.g. "design") */
89
+ package: import_zod.z.string().min(1),
90
+ /** Variant identifier (e.g. "opentrek") */
91
+ variant: import_zod.z.string().min(1),
92
+ /** Human-readable name */
93
+ displayName: import_zod.z.string().min(1),
94
+ /** Description of the variant */
95
+ description: import_zod.z.string(),
96
+ /** Semver version string */
97
+ version: import_zod.z.string().regex(/^\d+\.\d+\.\d+/, "Invalid semver version"),
98
+ /** Engine compatibility */
99
+ engines: import_zod.z.object({
100
+ "teamix-evo": import_zod.z.string().min(1)
101
+ }),
102
+ /** Supported IDE identifiers */
103
+ ide: import_zod.z.array(import_zod.z.string().min(1)),
104
+ /** List of resources provided by this variant */
105
+ resources: import_zod.z.array(ResourceSchema)
106
+ });
107
+
108
+ // src/schema/config.ts
109
+ var import_zod2 = require("zod");
110
+ var PackageEntrySchema = import_zod2.z.object({
111
+ /** Variant identifier (e.g. "opentrek") */
112
+ variant: import_zod2.z.string().min(1),
113
+ /** Semver version string */
114
+ version: import_zod2.z.string().min(1)
115
+ });
116
+ var ProjectConfigSchema = import_zod2.z.object({
117
+ $schema: import_zod2.z.string().optional(),
118
+ schemaVersion: import_zod2.z.literal(1),
119
+ /** IDE identifier */
120
+ ide: import_zod2.z.string().min(1),
121
+ /** Installed packages keyed by package name */
122
+ packages: import_zod2.z.record(import_zod2.z.string(), PackageEntrySchema)
123
+ });
124
+
125
+ // src/schema/installed.ts
126
+ var import_zod3 = require("zod");
127
+ var InstalledResourceSchema = import_zod3.z.object({
128
+ /** Resource identifier matching the variant manifest */
129
+ id: import_zod3.z.string().min(1),
130
+ /** Target path where the resource was installed */
131
+ target: import_zod3.z.string().min(1),
132
+ /** Content hash for change detection (e.g. "sha256:...") */
133
+ hash: import_zod3.z.string().min(1),
134
+ /** Update strategy that was applied */
135
+ strategy: import_zod3.z.enum(["frozen", "regenerable", "managed"])
136
+ });
137
+ var InstalledPackageSchema = import_zod3.z.object({
138
+ /** Full package name (e.g. "@teamix-evo/design") */
139
+ package: import_zod3.z.string().min(1),
140
+ /** Variant identifier */
141
+ variant: import_zod3.z.string().min(1),
142
+ /** Installed version */
143
+ version: import_zod3.z.string().min(1),
144
+ /** ISO 8601 timestamp of installation */
145
+ installedAt: import_zod3.z.string().min(1),
146
+ /** List of installed resources */
147
+ resources: import_zod3.z.array(InstalledResourceSchema)
148
+ });
149
+ var InstalledManifestSchema = import_zod3.z.object({
150
+ schemaVersion: import_zod3.z.literal(1),
151
+ /** List of installed packages */
152
+ installed: import_zod3.z.array(InstalledPackageSchema)
153
+ });
154
+
155
+ // src/loader.ts
156
+ var fs = __toESM(require("fs/promises"), 1);
157
+ var path = __toESM(require("path"), 1);
158
+
159
+ // src/validator.ts
160
+ function formatZodError(error) {
161
+ return error.issues.map((issue) => {
162
+ const path2 = issue.path.length > 0 ? issue.path.join(".") : "(root)";
163
+ return ` - ${path2}: ${issue.message}`;
164
+ }).join("\n");
165
+ }
166
+ function validateManifest(data) {
167
+ const result = VariantManifestSchema.safeParse(data);
168
+ if (result.success) {
169
+ return { success: true, data: result.data };
170
+ }
171
+ return {
172
+ success: false,
173
+ error: `Invalid variant manifest:
174
+ ${formatZodError(result.error)}`
175
+ };
176
+ }
177
+ function validateConfig(data) {
178
+ const result = ProjectConfigSchema.safeParse(data);
179
+ if (result.success) {
180
+ return { success: true, data: result.data };
181
+ }
182
+ return {
183
+ success: false,
184
+ error: `Invalid project config:
185
+ ${formatZodError(result.error)}`
186
+ };
187
+ }
188
+ function validateInstalled(data) {
189
+ const result = InstalledManifestSchema.safeParse(data);
190
+ if (result.success) {
191
+ return { success: true, data: result.data };
192
+ }
193
+ return {
194
+ success: false,
195
+ error: `Invalid installed manifest:
196
+ ${formatZodError(result.error)}`
197
+ };
198
+ }
199
+
200
+ // src/loader.ts
201
+ async function loadVariantManifest(packageDir) {
202
+ const manifestPath = path.join(packageDir, "manifest.json");
203
+ let raw;
204
+ try {
205
+ raw = await fs.readFile(manifestPath, "utf-8");
206
+ } catch (err) {
207
+ const code = err.code;
208
+ if (code === "ENOENT") {
209
+ throw new Error(`Manifest not found: ${manifestPath}`);
210
+ }
211
+ throw new Error(
212
+ `Failed to read manifest at ${manifestPath}: ${err.message}`
213
+ );
214
+ }
215
+ let data;
216
+ try {
217
+ data = JSON.parse(raw);
218
+ } catch {
219
+ throw new Error(`Invalid JSON in manifest at ${manifestPath}`);
220
+ }
221
+ const result = validateManifest(data);
222
+ if (!result.success) {
223
+ throw new Error(`${result.error}
224
+ File: ${manifestPath}`);
225
+ }
226
+ return result.data;
227
+ }
228
+
229
+ // src/managed-regions.ts
230
+ var REGION_PATTERN = /<!-- teamix-evo:managed:start id="([^"]+)" -->([\s\S]*?)<!-- teamix-evo:managed:end id="\1" -->/g;
231
+ var START_MARKER_PATTERN = /<!-- teamix-evo:managed:start id="([^"]+)" -->/g;
232
+ var END_MARKER_PATTERN = /<!-- teamix-evo:managed:end id="([^"]+)" -->/g;
233
+ function parseManagedRegions(content) {
234
+ const startIds = /* @__PURE__ */ new Set();
235
+ const endIds = /* @__PURE__ */ new Set();
236
+ let match;
237
+ const startRe = new RegExp(START_MARKER_PATTERN.source, "g");
238
+ while ((match = startRe.exec(content)) !== null) {
239
+ startIds.add(match[1]);
240
+ }
241
+ const endRe = new RegExp(END_MARKER_PATTERN.source, "g");
242
+ while ((match = endRe.exec(content)) !== null) {
243
+ endIds.add(match[1]);
244
+ }
245
+ for (const id of startIds) {
246
+ if (!endIds.has(id)) {
247
+ throw new Error(
248
+ `Unmatched managed region: found start marker for "${id}" but no matching end marker`
249
+ );
250
+ }
251
+ }
252
+ for (const id of endIds) {
253
+ if (!startIds.has(id)) {
254
+ throw new Error(
255
+ `Unmatched managed region: found end marker for "${id}" but no matching start marker`
256
+ );
257
+ }
258
+ }
259
+ const regions = [];
260
+ const regionRe = new RegExp(REGION_PATTERN.source, "g");
261
+ while ((match = regionRe.exec(content)) !== null) {
262
+ const id = match[1];
263
+ const regionContent = match[2];
264
+ regions.push({
265
+ id,
266
+ startMarker: `<!-- teamix-evo:managed:start id="${id}" -->`,
267
+ endMarker: `<!-- teamix-evo:managed:end id="${id}" -->`,
268
+ content: regionContent
269
+ });
270
+ }
271
+ return regions;
272
+ }
273
+ function replaceManagedRegion(content, id, newContent) {
274
+ const startMarker = `<!-- teamix-evo:managed:start id="${id}" -->`;
275
+ const endMarker = `<!-- teamix-evo:managed:end id="${id}" -->`;
276
+ const pattern = new RegExp(
277
+ `<!-- teamix-evo:managed:start id="${escapeRegExp(id)}" -->[\\s\\S]*?<!-- teamix-evo:managed:end id="${escapeRegExp(id)}" -->`,
278
+ "g"
279
+ );
280
+ if (!pattern.test(content)) {
281
+ throw new Error(`Managed region "${id}" not found in content`);
282
+ }
283
+ pattern.lastIndex = 0;
284
+ return content.replace(
285
+ pattern,
286
+ `${startMarker}
287
+ ${newContent}
288
+ ${endMarker}`
289
+ );
290
+ }
291
+ function hasManagedRegion(content, id) {
292
+ const pattern = new RegExp(
293
+ `<!-- teamix-evo:managed:start id="${escapeRegExp(id)}" -->[\\s\\S]*?<!-- teamix-evo:managed:end id="${escapeRegExp(id)}" -->`
294
+ );
295
+ return pattern.test(content);
296
+ }
297
+ function escapeRegExp(str) {
298
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
299
+ }
300
+
301
+ // src/strategy.ts
302
+ function shouldUpdate(strategy, resourceExists) {
303
+ switch (strategy) {
304
+ case "frozen":
305
+ return !resourceExists;
306
+ case "regenerable":
307
+ return true;
308
+ case "managed":
309
+ return true;
310
+ default:
311
+ return false;
312
+ }
313
+ }
314
+ function getUpdateAction(strategy, options) {
315
+ switch (strategy) {
316
+ case "frozen":
317
+ if (!options.exists) {
318
+ return "overwrite";
319
+ }
320
+ return "skip";
321
+ case "regenerable":
322
+ if (options.exists && options.hash && options.currentHash && options.hash === options.currentHash) {
323
+ return "skip";
324
+ }
325
+ return "overwrite";
326
+ case "managed":
327
+ if (!options.exists) {
328
+ return "overwrite";
329
+ }
330
+ return "managed-update";
331
+ default:
332
+ return "skip";
333
+ }
334
+ }
335
+ // Annotate the CommonJS export names for ESM import in node:
336
+ 0 && (module.exports = {
337
+ InstalledManifestSchema,
338
+ InstalledPackageSchema,
339
+ InstalledResourceSchema,
340
+ PackageEntrySchema,
341
+ ProjectConfigSchema,
342
+ ResourceSchema,
343
+ ResourceTypeSchema,
344
+ UpdateStrategySchema,
345
+ VariantManifestSchema,
346
+ getUpdateAction,
347
+ hasManagedRegion,
348
+ loadVariantManifest,
349
+ parseManagedRegions,
350
+ replaceManagedRegion,
351
+ shouldUpdate,
352
+ validateConfig,
353
+ validateInstalled,
354
+ validateManifest
355
+ });
356
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../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":["// ─── Schemas ──────────────────────────────────────────────────────────────────\nexport {\n UpdateStrategySchema,\n ResourceTypeSchema,\n ResourceSchema,\n VariantManifestSchema,\n PackageEntrySchema,\n ProjectConfigSchema,\n InstalledResourceSchema,\n InstalledPackageSchema,\n InstalledManifestSchema,\n} from \"./schema/index.js\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport type {\n UpdateStrategy,\n ResourceType,\n Resource,\n VariantManifest,\n PackageEntry,\n ProjectConfig,\n InstalledResource,\n InstalledPackage,\n InstalledManifest,\n ManagedRegion,\n Result,\n} from \"./types.js\";\n\n// ─── Loader ───────────────────────────────────────────────────────────────────\nexport { loadVariantManifest } from \"./loader.js\";\n\n// ─── Validator ────────────────────────────────────────────────────────────────\nexport {\n validateManifest,\n validateConfig,\n validateInstalled,\n} from \"./validator.js\";\n\n// ─── Managed Regions ──────────────────────────────────────────────────────────\nexport {\n parseManagedRegions,\n replaceManagedRegion,\n hasManagedRegion,\n} from \"./managed-regions.js\";\n\n// ─── Strategy ─────────────────────────────────────────────────────────────────\nexport { shouldUpdate, getUpdateAction } from \"./strategy.js\";\nexport type { UpdateAction, UpdateActionOptions } from \"./strategy.js\";\n","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":["import_zod","import_zod","path"]}