@skaile/workspaces 0.12.2 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/asset-manager/index.js +6 -8
  3. package/dist/asset-manager/installer.js +3 -4
  4. package/dist/asset-manager/src/index.d.ts +1 -2
  5. package/dist/asset-manager/src/index.d.ts.map +1 -1
  6. package/dist/asset-manager/src/{scaffold/layers/agents.d.ts → install-agent.d.ts} +11 -33
  7. package/dist/asset-manager/src/install-agent.d.ts.map +1 -0
  8. package/dist/base-assets/connectors/deploy.js +2 -2
  9. package/dist/base-assets/connectors/devserver.js +2 -2
  10. package/dist/base-assets/connectors/flow/adapter.js +2 -2
  11. package/dist/base-assets/connectors/flow/run-flow.js +3 -3
  12. package/dist/base-assets/connectors/flow.js +2 -2
  13. package/dist/base-assets/connectors/git.js +2 -2
  14. package/dist/base-assets/connectors/gmail.js +2 -2
  15. package/dist/base-assets/connectors/local.js +2 -2
  16. package/dist/base-assets/connectors/mattermost.js +2 -2
  17. package/dist/base-assets/connectors/memory.js +2 -2
  18. package/dist/base-assets/connectors/minio.js +2 -2
  19. package/dist/base-assets/connectors/postgres.js +2 -2
  20. package/dist/base-assets/connectors/redis.js +2 -2
  21. package/dist/base-assets/connectors/s3.js +2 -2
  22. package/dist/base-assets/connectors/sharepoint.js +2 -2
  23. package/dist/base-assets/connectors/sqlite.js +2 -2
  24. package/dist/base-assets/connectors/static-server.js +2 -2
  25. package/dist/base-assets/connectors/tunnel.js +2 -2
  26. package/dist/base-assets/connectors/webdav.js +2 -2
  27. package/dist/base-assets/connectors/xstate-store.js +2 -2
  28. package/dist/base-assets/connectors/xstate.js +2 -2
  29. package/dist/base-assets/connectors/yjs.js +2 -2
  30. package/dist/{chunk-UTKGPNLV.js → chunk-4DDQKKWX.js} +5 -5
  31. package/dist/{chunk-UTKGPNLV.js.map → chunk-4DDQKKWX.js.map} +1 -1
  32. package/dist/{chunk-DDVKNST3.js → chunk-CYRCPFZ2.js} +2 -2
  33. package/dist/{chunk-DDVKNST3.js.map → chunk-CYRCPFZ2.js.map} +1 -1
  34. package/dist/{chunk-M2NLRGIX.js → chunk-DZG3JD4Y.js} +160 -7
  35. package/dist/chunk-DZG3JD4Y.js.map +1 -0
  36. package/dist/{chunk-Z5PO7ZVP.js → chunk-GN6IYVJN.js} +2 -2
  37. package/dist/{chunk-Z5PO7ZVP.js.map → chunk-GN6IYVJN.js.map} +1 -1
  38. package/dist/{chunk-EARKGKKB.js → chunk-QG4X77V3.js} +6 -6
  39. package/dist/{chunk-EARKGKKB.js.map → chunk-QG4X77V3.js.map} +1 -1
  40. package/dist/cli/index.js +97 -37
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/connectors/config.js +2 -2
  43. package/dist/connectors/index.js +2 -2
  44. package/dist/core/index.js +2 -2
  45. package/dist/runner/index.js +7 -7
  46. package/dist/sdk/asset-manager.js +6 -8
  47. package/dist/sdk/core.js +2 -2
  48. package/dist/sdk/index.js +8 -8
  49. package/dist/sdk/runner.js +7 -7
  50. package/dist/{setup-WZFCLQ2J.js → setup-BQEST4RD.js} +4 -4
  51. package/dist/{setup-WZFCLQ2J.js.map → setup-BQEST4RD.js.map} +1 -1
  52. package/dist/{store-client-BM3IBDPT.js → store-client-CB6CYFXB.js} +4 -4
  53. package/dist/{store-client-BM3IBDPT.js.map → store-client-CB6CYFXB.js.map} +1 -1
  54. package/dist/tui/index.js +7 -7
  55. package/dist/workspace-plugin/adapters/mcp.js +2 -2
  56. package/dist/workspace-plugin/index.js +1 -1
  57. package/package.json +1 -7
  58. package/dist/asset-manager/scaffold.js +0 -18
  59. package/dist/asset-manager/scaffold.js.map +0 -1
  60. package/dist/asset-manager/src/scaffold/index.d.ts +0 -19
  61. package/dist/asset-manager/src/scaffold/index.d.ts.map +0 -1
  62. package/dist/asset-manager/src/scaffold/layers/agents.d.ts.map +0 -1
  63. package/dist/asset-manager/src/scaffold/layers/base.d.ts +0 -17
  64. package/dist/asset-manager/src/scaffold/layers/base.d.ts.map +0 -1
  65. package/dist/asset-manager/src/scaffold/layers/connectors.d.ts +0 -18
  66. package/dist/asset-manager/src/scaffold/layers/connectors.d.ts.map +0 -1
  67. package/dist/asset-manager/src/scaffold/layers/container.d.ts +0 -16
  68. package/dist/asset-manager/src/scaffold/layers/container.d.ts.map +0 -1
  69. package/dist/asset-manager/src/scaffold/layers/driver-target.d.ts +0 -17
  70. package/dist/asset-manager/src/scaffold/layers/driver-target.d.ts.map +0 -1
  71. package/dist/asset-manager/src/scaffold/layers/hooks.d.ts +0 -22
  72. package/dist/asset-manager/src/scaffold/layers/hooks.d.ts.map +0 -1
  73. package/dist/asset-manager/src/scaffold/layers/skills.d.ts +0 -31
  74. package/dist/asset-manager/src/scaffold/layers/skills.d.ts.map +0 -1
  75. package/dist/asset-manager/src/scaffold/layers/template.d.ts +0 -16
  76. package/dist/asset-manager/src/scaffold/layers/template.d.ts.map +0 -1
  77. package/dist/asset-manager/src/scaffold/scaffolder.d.ts +0 -77
  78. package/dist/asset-manager/src/scaffold/scaffolder.d.ts.map +0 -1
  79. package/dist/asset-manager/src/scaffold/types.d.ts +0 -241
  80. package/dist/asset-manager/src/scaffold/types.d.ts.map +0 -1
  81. package/dist/chunk-DIKFRNCS.js +0 -195
  82. package/dist/chunk-DIKFRNCS.js.map +0 -1
  83. package/dist/chunk-M2NLRGIX.js.map +0 -1
  84. package/dist/chunk-YHXBQLXX.js +0 -546
  85. package/dist/chunk-YHXBQLXX.js.map +0 -1
@@ -1,546 +0,0 @@
1
- import { applyAgentsLayer } from './chunk-DIKFRNCS.js';
2
- import { WorkspaceYamlEditor } from './chunk-4RUVG5GX.js';
3
- import { DRIVER_TARGETS } from './chunk-O4JH3KUE.js';
4
- import { loadSkWorkspaceConfig } from './chunk-GAZINYCS.js';
5
- import { __require } from './chunk-NSBPE2FW.js';
6
- import { existsSync, mkdirSync, writeFileSync, readFileSync, copyFileSync, statSync, readdirSync } from 'fs';
7
- import { join, basename, dirname, relative, resolve } from 'path';
8
- import { stringify, parse } from 'yaml';
9
- import { execSync } from 'child_process';
10
-
11
- function applyBaseLayer(dest, aiResources, templateSettings, framework, opts) {
12
- const created = [];
13
- if (!existsSync(dest)) {
14
- mkdirSync(dest, { recursive: true });
15
- created.push(".");
16
- }
17
- const skaileDir = join(dest, ".skaile");
18
- if (!existsSync(skaileDir)) {
19
- mkdirSync(skaileDir, { recursive: true });
20
- created.push(".skaile/");
21
- }
22
- const sessionsDir = join(skaileDir, "sessions");
23
- if (!existsSync(sessionsDir)) {
24
- mkdirSync(sessionsDir, { recursive: true });
25
- created.push(".skaile/sessions/");
26
- }
27
- const settingsPath = join(skaileDir, "settings.json");
28
- if (!existsSync(settingsPath)) {
29
- const settings = {
30
- ...templateSettings ?? {},
31
- ...opts.settings ?? {}
32
- };
33
- writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}
34
- `);
35
- created.push(".skaile/settings.json");
36
- }
37
- const sources = opts.resources ?? aiResources?.resources ?? [];
38
- const requires = opts.requires ?? aiResources?.requires ?? [];
39
- const wsConfigPath = join(dest, "skaile.yaml");
40
- if (!existsSync(wsConfigPath)) {
41
- const projectName = opts.name ?? basename(dest);
42
- const aiResourceEntries = sources.map((r, i) => {
43
- const entry = { name: r.name, path: r.path };
44
- if (r.branch) entry.branch = r.branch;
45
- if (i === 0 && requires.length > 0) entry.dependencies = requires;
46
- return entry;
47
- });
48
- const wsConfig = {
49
- name: projectName,
50
- description: `${projectName} AI skill dependencies`,
51
- "agent-config": {
52
- default: {
53
- agent: framework,
54
- provider: "anthropic",
55
- model: "claude-sonnet-4-6",
56
- driver: "claude-sdk",
57
- max_turns: 200
58
- }
59
- },
60
- ai_resources: aiResourceEntries
61
- };
62
- writeFileSync(wsConfigPath, stringify(wsConfig));
63
- created.push("skaile.yaml");
64
- }
65
- return created;
66
- }
67
- function applyContainerLayer(dest, config, projectName) {
68
- const created = [];
69
- if (!config?.enabled) return created;
70
- const name = projectName ?? basename(dest);
71
- const baseImage = config.baseImage ?? "node:22-alpine";
72
- const wsPort = config.wsPort ?? 3100;
73
- const dockerfilePath = join(dest, "Dockerfile");
74
- if (!existsSync(dockerfilePath)) {
75
- const dockerfile = generateDockerfile(baseImage, config, wsPort);
76
- writeFileSync(dockerfilePath, dockerfile);
77
- created.push("Dockerfile");
78
- }
79
- const composePath = join(dest, "docker-compose.yml");
80
- if (!existsSync(composePath)) {
81
- const compose = generateCompose(name, config, wsPort);
82
- writeFileSync(composePath, compose);
83
- created.push("docker-compose.yml");
84
- }
85
- const dockerignorePath = join(dest, ".dockerignore");
86
- if (!existsSync(dockerignorePath)) {
87
- writeFileSync(
88
- dockerignorePath,
89
- ["node_modules", ".git", ".skaile/sessions", "*.log", ".env.local", ""].join("\n")
90
- );
91
- created.push(".dockerignore");
92
- }
93
- return created;
94
- }
95
- function generateDockerfile(baseImage, config, wsPort) {
96
- const lines = [`FROM ${baseImage}`, "", "# System packages"];
97
- const packages = ["git", "curl", ...config.packages ?? []];
98
- if (baseImage.includes("alpine")) {
99
- lines.push(`RUN apk add --no-cache ${packages.join(" ")}`);
100
- } else {
101
- lines.push(
102
- `RUN apt-get update && apt-get install -y ${packages.join(" ")} && rm -rf /var/lib/apt/lists/*`
103
- );
104
- }
105
- lines.push("");
106
- if (config.agents && config.agents.length > 0) {
107
- lines.push("# Agent CLIs");
108
- for (const agent of config.agents) {
109
- lines.push(`RUN npm install -g ${agent}`);
110
- }
111
- lines.push("");
112
- }
113
- lines.push("WORKDIR /workspace");
114
- lines.push("");
115
- lines.push("# Copy workspace configuration");
116
- lines.push("COPY skaile.yaml ./");
117
- lines.push("COPY .skaile/ ./.skaile/");
118
- lines.push("");
119
- const ports = [String(wsPort), ...config.ports ?? []];
120
- for (const port of ports) {
121
- lines.push(`EXPOSE ${port}`);
122
- }
123
- lines.push("");
124
- if (config.env && config.env.length > 0) {
125
- lines.push("# Environment");
126
- for (const envVar of config.env) {
127
- lines.push(`ENV ${envVar}`);
128
- }
129
- lines.push("");
130
- }
131
- lines.push("# Default entrypoint \u2014 override in compose or at runtime");
132
- lines.push('ENTRYPOINT ["sh", "-c"]');
133
- lines.push('CMD ["echo Agent workspace ready && exec sh"]');
134
- lines.push("");
135
- return lines.join("\n");
136
- }
137
- function generateCompose(name, config, wsPort) {
138
- const serviceName = name.replace(/[^a-z0-9-]/gi, "-").toLowerCase();
139
- const ports = [`${wsPort}:${wsPort}`, ...(config.ports ?? []).map((p) => `${p}:${p}`)];
140
- const lines = [
141
- "services:",
142
- ` ${serviceName}:`,
143
- " build: .",
144
- ` container_name: ${serviceName}`
145
- ];
146
- if (ports.length > 0) {
147
- lines.push(" ports:");
148
- for (const port of ports) {
149
- lines.push(` - "${port}"`);
150
- }
151
- }
152
- if (config.mounts && config.mounts.length > 0) {
153
- lines.push(" volumes:");
154
- for (const mount of config.mounts) {
155
- if (mount.type === "bind") {
156
- lines.push(` - ${mount.source}:${mount.target}`);
157
- } else {
158
- lines.push(` - ${mount.source}:${mount.target}`);
159
- }
160
- }
161
- }
162
- if (config.env && config.env.length > 0) {
163
- lines.push(" environment:");
164
- for (const envVar of config.env) {
165
- if (envVar.includes("=")) {
166
- lines.push(` - ${envVar}`);
167
- } else {
168
- lines.push(` - ${envVar}`);
169
- }
170
- }
171
- }
172
- lines.push(" restart: unless-stopped");
173
- lines.push("");
174
- return lines.join("\n");
175
- }
176
- function applyDriverTargetLayer(dest, config, driverTargetOverride) {
177
- const created = [];
178
- const driverTarget = driverTargetOverride ?? config?.["default-target"] ?? "claude-code";
179
- const targetMap = DRIVER_TARGETS[driverTarget];
180
- if (!targetMap) return created;
181
- const dirsToCreate = /* @__PURE__ */ new Set();
182
- for (const dir of Object.values(targetMap.local)) {
183
- dirsToCreate.add(dir);
184
- }
185
- if (config?.extras) {
186
- for (const extra of config.extras) {
187
- dirsToCreate.add(extra);
188
- }
189
- }
190
- for (const dir of dirsToCreate) {
191
- const fullPath = join(dest, dir);
192
- if (!existsSync(fullPath)) {
193
- mkdirSync(fullPath, { recursive: true });
194
- created.push(`${dir}/`);
195
- }
196
- }
197
- return created;
198
- }
199
- function applyHooksLayer(dest, config, log) {
200
- const result = { created: [], warnings: [] };
201
- if (!config) return result;
202
- if (config.gitInit) {
203
- const gitDir = join(dest, ".git");
204
- if (!existsSync(gitDir)) {
205
- try {
206
- execSync("git init", { cwd: dest, stdio: "pipe" });
207
- result.created.push(".git/");
208
- log?.("Initialized git repository");
209
- } catch (err) {
210
- const msg = err instanceof Error ? err.message : String(err);
211
- result.warnings.push(`git init failed: ${msg}`);
212
- }
213
- }
214
- }
215
- if (config.gitignore && config.gitignore.length > 0) {
216
- const gitignorePath = join(dest, ".gitignore");
217
- let existing = "";
218
- if (existsSync(gitignorePath)) {
219
- existing = readFileSync(gitignorePath, "utf-8");
220
- }
221
- const existingLines = new Set(existing.split("\n").map((l) => l.trim()));
222
- const newEntries = config.gitignore.filter((e) => !existingLines.has(e));
223
- if (newEntries.length > 0) {
224
- const append = `${(existing && !existing.endsWith("\n") ? "\n" : "") + newEntries.join("\n")}
225
- `;
226
- writeFileSync(gitignorePath, existing + append);
227
- if (!existingLines.size) {
228
- result.created.push(".gitignore");
229
- }
230
- }
231
- }
232
- if (config.setupScripts) {
233
- for (const script of config.setupScripts) {
234
- try {
235
- log?.(`Running setup script: ${script.name}`);
236
- const cwd = script.cwd ? join(dest, script.cwd) : dest;
237
- if (!existsSync(cwd)) {
238
- mkdirSync(cwd, { recursive: true });
239
- }
240
- execSync(script.run, {
241
- cwd,
242
- stdio: "pipe",
243
- timeout: 6e4,
244
- env: { ...process.env, WORKSPACE_DIR: dest }
245
- });
246
- log?.(`Setup script "${script.name}" completed`);
247
- } catch (err) {
248
- const msg = err instanceof Error ? err.message : String(err);
249
- result.warnings.push(`Setup script "${script.name}" failed: ${msg}`);
250
- }
251
- }
252
- }
253
- return result;
254
- }
255
- function applyConnectorsLayer(dest, connectors, log) {
256
- const created = [];
257
- const entries = Array.isArray(connectors) ? connectors : [];
258
- if (!entries.length) return created;
259
- const yamlPath = join(dest, "skaile.yaml");
260
- if (existsSync(yamlPath)) {
261
- const editor = WorkspaceYamlEditor.load(yamlPath);
262
- for (const r of entries) {
263
- editor.setConnector({
264
- id: r.id,
265
- driver: r.driver,
266
- access: r.access ?? "read-only",
267
- auth: r.auth,
268
- options: r.options
269
- });
270
- }
271
- editor.save();
272
- log?.(`Wrote ${entries.length} connector(s) to skaile.yaml`);
273
- } else {
274
- log?.("Skipping connector write: skaile.yaml not found (base layer should create it first)");
275
- }
276
- for (const connector of entries) {
277
- if (connector.autoMount === false) continue;
278
- const mountPath = connector.mountPath ?? `.connectors/${connector.id}`;
279
- const absMount = join(dest, mountPath);
280
- if (!existsSync(absMount)) {
281
- mkdirSync(absMount, { recursive: true });
282
- created.push(`${mountPath}/`);
283
- log?.(`Created mount dir: ${mountPath}`);
284
- }
285
- }
286
- return created;
287
- }
288
- async function loadAssetManager() {
289
- try {
290
- const mod = await import('./asset-manager/index.js');
291
- return mod.AssetManager ?? null;
292
- } catch {
293
- return null;
294
- }
295
- }
296
- async function applySkillsLayer(dest, config, log) {
297
- const result = { installed: [], warnings: [] };
298
- if (!config?.autoInstall) return result;
299
- const wsConfigPath = join(dest, "skaile.yaml");
300
- if (!existsSync(wsConfigPath)) {
301
- result.warnings.push("Skipping skill install: skaile.yaml not found");
302
- return result;
303
- }
304
- const AssetManager = await loadAssetManager();
305
- if (!AssetManager) {
306
- result.warnings.push(
307
- "Skipping skill install: AssetManager could not be loaded. Run `skaile install` manually."
308
- );
309
- return result;
310
- }
311
- try {
312
- log?.("Installing AI resources...");
313
- const am = new AssetManager({ projectDir: dest });
314
- const installResult = await am.install();
315
- if (Array.isArray(installResult)) {
316
- result.installed = installResult;
317
- } else if (installResult?.deployed) {
318
- result.installed = installResult.deployed;
319
- }
320
- log?.(`Installed ${result.installed.length} skill(s)`);
321
- } catch (err) {
322
- const msg = err instanceof Error ? err.message : String(err);
323
- result.warnings.push(`Skill install failed: ${msg}`);
324
- }
325
- return result;
326
- }
327
- function copyDirSkipExisting(src, dest, created, baseDest) {
328
- if (!existsSync(dest)) mkdirSync(dest, { recursive: true });
329
- for (const entry of readdirSync(src, { withFileTypes: true })) {
330
- const srcPath = join(src, entry.name);
331
- const destPath = join(dest, entry.name);
332
- if (entry.isDirectory()) {
333
- copyDirSkipExisting(srcPath, destPath, created, baseDest);
334
- } else if (!existsSync(destPath)) {
335
- mkdirSync(dirname(destPath), { recursive: true });
336
- copyFileSync(srcPath, destPath);
337
- created.push(relative(baseDest, destPath));
338
- }
339
- }
340
- }
341
- function applyTemplateLayer(dest, config, templateDir) {
342
- const created = [];
343
- if (!config) return created;
344
- if (config.agentDir) {
345
- const agentDir = config.agentDir;
346
- if (existsSync(agentDir)) {
347
- for (const file of ["SOUL.md", "RULES.md", "DUTIES.md"]) {
348
- const src = join(agentDir, file);
349
- const destFile = join(dest, ".skaile", "agent", file);
350
- if (existsSync(src) && !existsSync(destFile)) {
351
- mkdirSync(dirname(destFile), { recursive: true });
352
- copyFileSync(src, destFile);
353
- created.push(relative(dest, destFile));
354
- }
355
- }
356
- const knowledgeSrc = join(agentDir, "knowledge");
357
- if (existsSync(knowledgeSrc)) {
358
- const knowledgeDest = join(dest, ".skaile", "agent", "knowledge");
359
- copyDirSkipExisting(knowledgeSrc, knowledgeDest, created, dest);
360
- }
361
- const skillsSrc = join(agentDir, "skills");
362
- if (existsSync(skillsSrc)) {
363
- const skillsDest = join(dest, ".skaile", "agent", "skills");
364
- copyDirSkipExisting(skillsSrc, skillsDest, created, dest);
365
- }
366
- }
367
- }
368
- if (config.soul) {
369
- const soulPath = join(dest, ".skaile", "agent", "SOUL.md");
370
- if (!existsSync(soulPath)) {
371
- mkdirSync(dirname(soulPath), { recursive: true });
372
- writeFileSync(soulPath, config.soul);
373
- created.push(".skaile/agent/SOUL.md");
374
- }
375
- }
376
- if (config.rules) {
377
- const rulesPath = join(dest, ".skaile", "agent", "RULES.md");
378
- if (!existsSync(rulesPath)) {
379
- mkdirSync(dirname(rulesPath), { recursive: true });
380
- writeFileSync(rulesPath, config.rules);
381
- created.push(".skaile/agent/RULES.md");
382
- }
383
- }
384
- if (config.files && templateDir) {
385
- for (const file of config.files) {
386
- const srcPath = join(templateDir, file.src);
387
- const destPath = join(dest, file.dest);
388
- if (!existsSync(srcPath)) continue;
389
- if (existsSync(destPath)) continue;
390
- if (statSync(srcPath).isDirectory()) {
391
- copyDirSkipExisting(srcPath, destPath, created, dest);
392
- } else {
393
- mkdirSync(dirname(destPath), { recursive: true });
394
- copyFileSync(srcPath, destPath);
395
- created.push(file.dest);
396
- }
397
- }
398
- }
399
- return created;
400
- }
401
- var _builtinTemplatesDir = null;
402
- function getBuiltinTemplatesDir() {
403
- if (_builtinTemplatesDir) return _builtinTemplatesDir;
404
- return join(dirname(new URL(import.meta.url).pathname), "..", "..", "templates");
405
- }
406
- function setTemplatesDir(dir) {
407
- _builtinTemplatesDir = resolve(dir);
408
- }
409
- function resolveTemplatePath(template) {
410
- if (template.endsWith(".yaml") || template.endsWith(".yml")) {
411
- const abs = resolve(template);
412
- return existsSync(abs) ? abs : null;
413
- }
414
- const dirPath = resolve(template);
415
- const inDir = join(dirPath, "workspace.yaml");
416
- if (existsSync(inDir)) return inDir;
417
- const builtin = join(getBuiltinTemplatesDir(), template, "workspace.yaml");
418
- if (existsSync(builtin)) return builtin;
419
- return null;
420
- }
421
- function loadTemplate(templatePath) {
422
- const raw = readFileSync(templatePath, "utf-8");
423
- const manifest = parse(raw);
424
- const dir = dirname(templatePath);
425
- if (manifest.extends) {
426
- const parentPath = resolveTemplatePath(manifest.extends) ?? resolveTemplatePath(join(dir, manifest.extends));
427
- if (parentPath) {
428
- const parent = loadTemplate(parentPath);
429
- const { extends: _ext, name, description, version, ...childSections } = manifest;
430
- Object.assign(manifest, {
431
- ...parent.manifest,
432
- name,
433
- description,
434
- version,
435
- extends: _ext,
436
- ...childSections
437
- });
438
- }
439
- }
440
- return { manifest, dir };
441
- }
442
- function listTemplates() {
443
- const templates = [];
444
- const templatesDir = getBuiltinTemplatesDir();
445
- if (!existsSync(templatesDir)) return templates;
446
- const { readdirSync: readdirSync2 } = __require("fs");
447
- for (const entry of readdirSync2(templatesDir, { withFileTypes: true })) {
448
- if (!entry.isDirectory()) continue;
449
- const wsPath = join(templatesDir, entry.name, "workspace.yaml");
450
- if (!existsSync(wsPath)) continue;
451
- try {
452
- const raw = readFileSync(wsPath, "utf-8");
453
- const manifest = parse(raw);
454
- templates.push({
455
- name: manifest.name ?? entry.name,
456
- description: manifest.description ?? "",
457
- path: wsPath
458
- });
459
- } catch {
460
- }
461
- }
462
- return templates;
463
- }
464
- async function scaffoldWorkspace(opts) {
465
- const log = opts.log ?? (() => {
466
- });
467
- const dest = resolve(opts.dest);
468
- const result = {
469
- path: dest,
470
- created: [],
471
- installed: [],
472
- warnings: []
473
- };
474
- const templatePath = resolveTemplatePath(opts.template);
475
- if (!templatePath) {
476
- result.warnings.push(`Template not found: ${opts.template}`);
477
- return result;
478
- }
479
- const { manifest, dir: templateDir } = loadTemplate(templatePath);
480
- log(`Scaffolding workspace from template: ${manifest.name}`);
481
- log("Applying base layer...");
482
- const driverTarget = opts.driverTarget ?? manifest.framework?.["default-target"] ?? "claude-code";
483
- const baseCreated = applyBaseLayer(
484
- dest,
485
- manifest["ai-assets"],
486
- manifest.settings,
487
- driverTarget,
488
- opts
489
- );
490
- result.created.push(...baseCreated);
491
- const connectorEntries = manifest.connectors;
492
- if (connectorEntries?.length) {
493
- log("Applying connectors layer...");
494
- const resCreated = applyConnectorsLayer(dest, connectorEntries, log);
495
- result.created.push(...resCreated);
496
- }
497
- log("Applying driver target layer...");
498
- const fwCreated = applyDriverTargetLayer(dest, manifest.framework, opts.driverTarget);
499
- result.created.push(...fwCreated);
500
- log("Applying template layer...");
501
- const templateConfig = manifest.template;
502
- if (templateConfig?.agentDir && !templateConfig.agentDir.startsWith("/")) {
503
- templateConfig.agentDir = join(templateDir, templateConfig.agentDir);
504
- }
505
- const tmplCreated = applyTemplateLayer(dest, templateConfig, templateDir);
506
- result.created.push(...tmplCreated);
507
- log("Applying agents layer...");
508
- const agentsConfig = opts.agentInstall ? { install: opts.agentInstall } : manifest.agents;
509
- const wsConfig = loadSkWorkspaceConfig(dest)?.config;
510
- const agentsResult = await applyAgentsLayer(
511
- dest,
512
- agentsConfig,
513
- driverTarget,
514
- templateDir,
515
- wsConfig,
516
- log
517
- );
518
- result.created.push(...agentsResult.created);
519
- result.warnings.push(...agentsResult.warnings);
520
- if (!opts.skipInstall) {
521
- log("Applying skills layer...");
522
- const skillsResult = await applySkillsLayer(dest, manifest.skills, log);
523
- result.installed.push(...skillsResult.installed);
524
- result.warnings.push(...skillsResult.warnings);
525
- }
526
- log("Applying hooks layer...");
527
- const hooksResult = applyHooksLayer(dest, manifest.hooks, log);
528
- result.created.push(...hooksResult.created);
529
- result.warnings.push(...hooksResult.warnings);
530
- const enableDocker = opts.docker ?? manifest.container?.enabled ?? false;
531
- if (enableDocker) {
532
- log("Applying container layer...");
533
- const containerCreated = applyContainerLayer(
534
- dest,
535
- { ...manifest.container, enabled: true },
536
- opts.name
537
- );
538
- result.created.push(...containerCreated);
539
- }
540
- log(`Workspace scaffolded: ${result.created.length} files/dirs created`);
541
- return result;
542
- }
543
-
544
- export { applyBaseLayer, applyConnectorsLayer, applyContainerLayer, applyDriverTargetLayer, applyHooksLayer, applySkillsLayer, applyTemplateLayer, listTemplates, loadTemplate, resolveTemplatePath, scaffoldWorkspace, setTemplatesDir };
545
- //# sourceMappingURL=chunk-YHXBQLXX.js.map
546
- //# sourceMappingURL=chunk-YHXBQLXX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../asset-manager/src/scaffold/layers/base.ts","../asset-manager/src/scaffold/layers/container.ts","../asset-manager/src/scaffold/layers/driver-target.ts","../asset-manager/src/scaffold/layers/hooks.ts","../asset-manager/src/scaffold/layers/connectors.ts","../asset-manager/src/scaffold/layers/skills.ts","../asset-manager/src/scaffold/layers/template.ts","../asset-manager/src/scaffold/scaffolder.ts"],"names":["basename","join","existsSync","writeFileSync","mkdirSync","dirname","readFileSync","readdirSync"],"mappings":";;;;;;;;;;AAoBO,SAAS,cAAA,CACd,IAAA,EACA,WAAA,EACA,gBAAA,EACA,WACA,IAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAG3B,EAAA,IAAI,CAAC,UAAA,CAAW,IAAI,CAAA,EAAG;AACrB,IAAA,SAAA,CAAU,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACnC,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAClB;AAGA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC,UAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,IAAA,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACxC,IAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,EACzB;AAGA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,IAAA,SAAA,CAAU,WAAA,EAAa,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1C,IAAA,OAAA,CAAQ,KAAK,mBAAmB,CAAA;AAAA,EAClC;AAGA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,EAAW,eAAe,CAAA;AACpD,EAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,GAAI,oBAAoB,EAAC;AAAA,MACzB,GAAI,IAAA,CAAK,QAAA,IAAY;AAAC,KACxB;AACA,IAAA,aAAA,CAAc,cAAc,CAAA,EAAG,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AACpE,IAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA;AAAA,EACtC;AAGA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,IAAa,WAAA,EAAa,aAAa,EAAC;AAC7D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,WAAA,EAAa,YAAY,EAAC;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,EAAM,aAAa,CAAA;AAC7C,EAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,IAAQ,QAAA,CAAS,IAAI,CAAA;AAG9C,IAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC9C,MAAA,MAAM,QAAiC,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,EAAM,EAAE,IAAA,EAAK;AACpE,MAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,CAAE,MAAA;AAC/B,MAAA,IAAI,MAAM,CAAA,IAAK,QAAA,CAAS,MAAA,GAAS,CAAA,QAAS,YAAA,GAAe,QAAA;AACzD,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,QAAA,GAAoC;AAAA,MACxC,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EAAa,GAAG,WAAW,CAAA,sBAAA,CAAA;AAAA,MAC3B,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS;AAAA,UACP,KAAA,EAAO,SAAA;AAAA,UACP,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO,mBAAA;AAAA,UACP,MAAA,EAAQ,YAAA;AAAA,UACR,SAAA,EAAW;AAAA;AACb,OACF;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AACA,IAAA,aAAA,CAAc,YAAA,EAAc,SAAA,CAAU,QAAQ,CAAC,CAAA;AAC/C,IAAA,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,OAAA;AACT;AC7EO,SAAS,mBAAA,CACd,IAAA,EACA,MAAA,EACA,WAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,OAAA;AAE7B,EAAA,MAAM,IAAA,GAAO,WAAA,IAAeA,QAAAA,CAAS,IAAI,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,gBAAA;AACtC,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,IAAA;AAGhC,EAAA,MAAM,cAAA,GAAiBC,IAAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAC9C,EAAA,IAAI,CAACC,UAAAA,CAAW,cAAc,CAAA,EAAG;AAC/B,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA;AAC/D,IAAAC,aAAAA,CAAc,gBAAgB,UAAU,CAAA;AACxC,IAAA,OAAA,CAAQ,KAAK,YAAY,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,WAAA,GAAcF,IAAAA,CAAK,IAAA,EAAM,oBAAoB,CAAA;AACnD,EAAA,IAAI,CAACC,UAAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,IAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AACpD,IAAAC,aAAAA,CAAc,aAAa,OAAO,CAAA;AAClC,IAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,gBAAA,GAAmBF,IAAAA,CAAK,IAAA,EAAM,eAAe,CAAA;AACnD,EAAA,IAAI,CAACC,UAAAA,CAAW,gBAAgB,CAAA,EAAG;AACjC,IAAAC,aAAAA;AAAA,MACE,gBAAA;AAAA,MACA,CAAC,gBAAgB,MAAA,EAAQ,kBAAA,EAAoB,SAAS,YAAA,EAAc,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI;AAAA,KACnF;AACA,IAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,kBAAA,CACP,SAAA,EACA,MAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,QAAkB,CAAC,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,EAAI,IAAI,mBAAmB,CAAA;AAGrE,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,EAAO,MAAA,EAAQ,GAAI,MAAA,CAAO,QAAA,IAAY,EAAG,CAAA;AAC3D,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChC,IAAA,KAAA,CAAM,KAAK,CAAA,uBAAA,EAA0B,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3D,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,yCAAA,EAA4C,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA,+BAAA;AAAA,KAChE;AAAA,EACF;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7C,IAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1C;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,KAAA,CAAM,KAAK,gCAAgC,CAAA;AAC3C,EAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAChC,EAAA,KAAA,CAAM,KAAK,0BAA0B,CAAA;AACrC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,CAAO,MAAM,GAAG,GAAI,MAAA,CAAO,KAAA,IAAS,EAAG,CAAA;AACtD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AAAA,EAC7B;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,GAAA,EAAK;AAC/B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAA;AAAA,IAC5B;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,KAAA,CAAM,KAAK,+DAA0D,CAAA;AACrE,EAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,EAAA,KAAA,CAAM,KAAK,+CAA+C,CAAA;AAC1D,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,eAAA,CAAgB,IAAA,EAAc,MAAA,EAA8B,MAAA,EAAwB;AAC3F,EAAA,MAAM,cAAc,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,EAAE,WAAA,EAAY;AAClE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,MAAM,IAAI,MAAM,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE,CAAC,CAAA;AAErF,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,WAAA;AAAA,IACA,KAAK,WAAW,CAAA,CAAA,CAAA;AAAA,IAChB,cAAA;AAAA,IACA,uBAAuB,WAAW,CAAA;AAAA,GACpC;AAGA,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7C,IAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,MACtD,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAC7B,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,GAAA,EAAK;AAC/B,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACxB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,6BAA6B,CAAA;AACxC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;ACnJO,SAAS,sBAAA,CACd,IAAA,EACA,MAAA,EACA,oBAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,YAAA,GAAgB,oBAAA,IACpB,MAAA,GAAS,gBAAgB,CAAA,IACzB,aAAA;AAEF,EAAA,MAAM,SAAA,GAAY,eAAe,YAAY,CAAA;AAC7C,EAAA,IAAI,CAAC,WAAW,OAAO,OAAA;AAGvB,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAChD,IAAA,YAAA,CAAa,IAAI,GAAG,CAAA;AAAA,EACtB;AAGA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,YAAA,CAAa,IAAI,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,MAAM,QAAA,GAAWF,IAAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AAC/B,IAAA,IAAI,CAACC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAAE,SAAAA,CAAU,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AC7BO,SAAS,eAAA,CACd,IAAA,EACA,MAAA,EACA,GAAA,EACa;AACb,EAAA,MAAM,SAAsB,EAAE,OAAA,EAAS,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AACxD,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AAGpB,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAM,MAAA,GAASH,IAAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAChC,IAAA,IAAI,CAACC,UAAAA,CAAW,MAAM,CAAA,EAAG;AACvB,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,YAAY,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AACjD,QAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC3B,QAAA,GAAA,GAAM,4BAA4B,CAAA;AAAA,MACpC,SAAS,GAAA,EAAc;AACrB,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CAAA,iBAAA,EAAoB,GAAG,CAAA,CAAE,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA,EAAG;AACnD,IAAA,MAAM,aAAA,GAAgBD,IAAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAC7C,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAIC,UAAAA,CAAW,aAAa,CAAA,EAAG;AAC7B,MAAA,QAAA,GAAW,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACvE,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,CAAC,MAAM,CAAC,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC,CAAA;AAEvE,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,MAAA,GAAS,CAAA,EAAA,CAAI,QAAA,IAAY,CAAC,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,GAAO,EAAA,IAAM,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAC5F,MAAAC,aAAAA,CAAc,aAAA,EAAe,QAAA,GAAW,MAAM,CAAA;AAC9C,MAAA,IAAI,CAAC,cAAc,IAAA,EAAM;AACvB,QAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,YAAY,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,YAAA,EAAc;AACvB,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,YAAA,EAAc;AACxC,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAC5C,QAAA,MAAM,MAAM,MAAA,CAAO,GAAA,GAAMF,KAAK,IAAA,EAAM,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AAClD,QAAA,IAAI,CAACC,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,UAAAE,SAAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,QACpC;AACA,QAAA,QAAA,CAAS,OAAO,GAAA,EAAK;AAAA,UACnB,GAAA;AAAA,UACA,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,GAAA;AAAA,UACT,KAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,eAAe,IAAA;AAAK,SAC5C,CAAA;AACD,QAAA,GAAA,GAAM,CAAA,cAAA,EAAiB,MAAA,CAAO,IAAI,CAAA,WAAA,CAAa,CAAA;AAAA,MACjD,SAAS,GAAA,EAAc;AACrB,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,MAAA,CAAO,SAAS,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAO,IAAI,CAAA,UAAA,EAAa,GAAG,CAAA,CAAE,CAAA;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;ACxEO,SAAS,oBAAA,CACd,IAAA,EACA,UAAA,EACA,GAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,UAA4B,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,aAAa,EAAC;AAC5E,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,OAAA;AAG5B,EAAA,MAAM,QAAA,GAAWH,IAAAA,CAAK,IAAA,EAAM,aAAa,CAAA;AACzC,EAAA,IAAIC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACxB,IAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA;AAChD,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAA,CAAO,YAAA,CAAa;AAAA,QAClB,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,MAAA,EAAQ,EAAE,MAAA,IAAU,WAAA;AAAA,QACpB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,SAAS,CAAA,CAAE;AAAA,OACZ,CAAA;AAAA,IACH;AACA,IAAA,MAAA,CAAO,IAAA,EAAK;AACZ,IAAA,GAAA,GAAM,CAAA,MAAA,EAAS,OAAA,CAAQ,MAAM,CAAA,4BAAA,CAA8B,CAAA;AAAA,EAC7D,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,qFAAqF,CAAA;AAAA,EAC7F;AAGA,EAAA,KAAA,MAAW,aAAa,OAAA,EAAS;AAC/B,IAAA,IAAI,SAAA,CAAU,cAAc,KAAA,EAAO;AACnC,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,SAAA,IAAa,CAAA,YAAA,EAAe,UAAU,EAAE,CAAA,CAAA;AACpE,IAAA,MAAM,QAAA,GAAWD,IAAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AACrC,IAAA,IAAI,CAACC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAAE,SAAAA,CAAU,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,CAAA,CAAG,CAAA;AAC5B,MAAA,GAAA,GAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAE,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;ACnCA,eAAe,gBAAA,GAAwC;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,OAAO,0BAAgB,CAAA;AACzC,IAAA,OAAO,IAAI,YAAA,IAAgB,IAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAaA,eAAsB,gBAAA,CACpB,IAAA,EACA,MAAA,EACA,GAAA,EAC8B;AAC9B,EAAA,MAAM,SAA8B,EAAE,SAAA,EAAW,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAClE,EAAA,IAAI,CAAC,MAAA,EAAQ,WAAA,EAAa,OAAO,MAAA;AAEjC,EAAA,MAAM,YAAA,GAAeH,IAAAA,CAAK,IAAA,EAAM,aAAa,CAAA;AAC7C,EAAA,IAAI,CAACC,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,+CAA+C,CAAA;AACpE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,MAAM,gBAAA,EAAiB;AAC5C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAA,CAAO,QAAA,CAAS,IAAA;AAAA,MACd;AAAA,KACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,4BAA4B,CAAA;AAElC,IAAA,MAAM,KAAK,IAAI,YAAA,CAAa,EAAE,UAAA,EAAY,MAAM,CAAA;AAChD,IAAA,MAAM,aAAA,GAAgB,MAAM,EAAA,CAAG,OAAA,EAAQ;AAEvC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AAChC,MAAA,MAAA,CAAO,SAAA,GAAY,aAAA;AAAA,IACrB,CAAA,MAAA,IAAW,eAAe,QAAA,EAAU;AAClC,MAAA,MAAA,CAAO,YAAY,aAAA,CAAc,QAAA;AAAA,IACnC;AAEA,IAAA,GAAA,GAAM,CAAA,UAAA,EAAa,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,SAAA,CAAW,CAAA;AAAA,EACvD,SAAS,GAAA,EAAc;AACrB,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,MAAA;AACT;AC9EA,SAAS,mBAAA,CAAoB,GAAA,EAAa,IAAA,EAAc,OAAA,EAAmB,QAAA,EAAwB;AACjG,EAAA,IAAI,CAACA,UAAAA,CAAW,IAAI,CAAA,EAAGE,UAAU,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1D,EAAA,KAAA,MAAW,SAAS,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAAG;AAC7D,IAAA,MAAM,OAAA,GAAUH,IAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACpC,IAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,mBAAA,CAAoB,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC1D,CAAA,MAAA,IAAW,CAACC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AAChC,MAAAE,UAAU,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,MAAA,YAAA,CAAa,SAAS,QAAQ,CAAA;AAC9B,MAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;AAWO,SAAS,kBAAA,CACd,IAAA,EACA,MAAA,EACA,WAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,CAAC,QAAQ,OAAO,OAAA;AAGpB,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,IAAA,IAAIF,UAAAA,CAAW,QAAQ,CAAA,EAAG;AAExB,MAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,SAAA,EAAW,UAAA,EAAY,WAAW,CAAA,EAAG;AACvD,QAAA,MAAM,GAAA,GAAMD,IAAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AAC/B,QAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAS,IAAI,CAAA;AACpD,QAAA,IAAIC,WAAW,GAAG,CAAA,IAAK,CAACA,UAAAA,CAAW,QAAQ,CAAA,EAAG;AAC5C,UAAAE,UAAU,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,UAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAC1B,UAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,QACvC;AAAA,MACF;AAGA,MAAA,MAAM,YAAA,GAAeH,IAAAA,CAAK,QAAA,EAAU,WAAW,CAAA;AAC/C,MAAA,IAAIC,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC5B,QAAA,MAAM,aAAA,GAAgBD,IAAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAS,WAAW,CAAA;AAChE,QAAA,mBAAA,CAAoB,YAAA,EAAc,aAAA,EAAe,OAAA,EAAS,IAAI,CAAA;AAAA,MAChE;AAGA,MAAA,MAAM,SAAA,GAAYA,IAAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AACzC,MAAA,IAAIC,UAAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,MAAM,UAAA,GAAaD,IAAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAS,QAAQ,CAAA;AAC1D,QAAA,mBAAA,CAAoB,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,IAAI,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAS,SAAS,CAAA;AACzD,IAAA,IAAI,CAACC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAAE,UAAU,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,MAAAD,aAAAA,CAAc,QAAA,EAAU,MAAA,CAAO,IAAI,CAAA;AACnC,MAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA;AAAA,IACtC;AAAA,EACF;AACA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,MAAM,SAAA,GAAYF,IAAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAS,UAAU,CAAA;AAC3D,IAAA,IAAI,CAACC,UAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAAE,UAAU,OAAA,CAAQ,SAAS,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACjD,MAAAD,aAAAA,CAAc,SAAA,EAAW,MAAA,CAAO,KAAK,CAAA;AACrC,MAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AAAA,IACvC;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,WAAA,EAAa;AAC/B,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,MAAA,MAAM,OAAA,GAAUF,IAAAA,CAAK,WAAA,EAAa,IAAA,CAAK,GAAG,CAAA;AAC1C,MAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AACrC,MAAA,IAAI,CAACC,UAAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,MAAA,IAAIA,UAAAA,CAAW,QAAQ,CAAA,EAAG;AAE1B,MAAA,IAAI,QAAA,CAAS,OAAO,CAAA,CAAE,WAAA,EAAY,EAAG;AACnC,QAAA,mBAAA,CAAoB,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAAA,MACtD,CAAA,MAAO;AACL,QAAAE,UAAU,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,QAAA,YAAA,CAAa,SAAS,QAAQ,CAAA;AAC9B,QAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;ACxFA,IAAI,oBAAA,GAAsC,IAAA;AAO1C,SAAS,sBAAA,GAAiC;AACxC,EAAA,IAAI,sBAAsB,OAAO,oBAAA;AACjC,EAAA,OAAOH,IAAAA,CAAKI,OAAAA,CAAQ,IAAI,GAAA,CAAI,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAAE,QAAQ,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,WAAW,CAAA;AACjF;AAUO,SAAS,gBAAgB,GAAA,EAAmB;AACjD,EAAA,oBAAA,GAAuB,QAAQ,GAAG,CAAA;AACpC;AAgBO,SAAS,oBAAoB,QAAA,EAAiC;AAEnE,EAAA,IAAI,SAAS,QAAA,CAAS,OAAO,KAAK,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3D,IAAA,MAAM,GAAA,GAAM,QAAQ,QAAQ,CAAA;AAC5B,IAAA,OAAOH,UAAAA,CAAW,GAAG,CAAA,GAAI,GAAA,GAAM,IAAA;AAAA,EACjC;AAGA,EAAA,MAAM,OAAA,GAAU,QAAQ,QAAQ,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQD,IAAAA,CAAK,OAAA,EAAS,gBAAgB,CAAA;AAC5C,EAAA,IAAIC,UAAAA,CAAW,KAAK,CAAA,EAAG,OAAO,KAAA;AAG9B,EAAA,MAAM,OAAA,GAAUD,IAAAA,CAAK,sBAAA,EAAuB,EAAG,UAAU,gBAAgB,CAAA;AACzE,EAAA,IAAIC,UAAAA,CAAW,OAAO,CAAA,EAAG,OAAO,OAAA;AAEhC,EAAA,OAAO,IAAA;AACT;AASO,SAAS,aAAa,YAAA,EAAmE;AAC9F,EAAA,MAAM,GAAA,GAAMI,YAAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,MAAM,GAAG,CAAA;AAC1B,EAAA,MAAM,GAAA,GAAMD,QAAQ,YAAY,CAAA;AAEhC,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,UAAA,GACJ,mBAAA,CAAoB,QAAA,CAAS,OAAO,CAAA,IAAK,oBAAoBJ,IAAAA,CAAK,GAAA,EAAK,QAAA,CAAS,OAAO,CAAC,CAAA;AAC1F,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,aAAa,UAAU,CAAA;AAEtC,MAAA,MAAM,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,aAAa,OAAA,EAAS,GAAG,eAAc,GAAI,QAAA;AACxE,MAAA,MAAA,CAAO,OAAO,QAAA,EAAU;AAAA,QACtB,GAAG,MAAA,CAAO,QAAA;AAAA,QACV,IAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA,EAAS,IAAA;AAAA,QACT,GAAG;AAAA,OACJ,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAU,GAAA,EAAI;AACzB;AAQO,SAAS,aAAA,GAA4E;AAC1F,EAAA,MAAM,YAAwE,EAAC;AAC/E,EAAA,MAAM,eAAe,sBAAA,EAAuB;AAC5C,EAAA,IAAI,CAACC,UAAAA,CAAW,YAAY,CAAA,EAAG,OAAO,SAAA;AAEtC,EAAA,MAAM,EAAE,WAAA,EAAAK,YAAAA,EAAY,GAAI,UAAQ,IAAS,CAAA;AACzC,EAAA,KAAA,MAAW,SAASA,YAAAA,CAAY,YAAA,EAAc,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAAG;AACtE,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AAC1B,IAAA,MAAM,MAAA,GAASN,IAAAA,CAAK,YAAA,EAAc,KAAA,CAAM,MAAM,gBAAgB,CAAA;AAC9D,IAAA,IAAI,CAACC,UAAAA,CAAW,MAAM,CAAA,EAAG;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMI,YAAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,MAAM,GAAG,CAAA;AAC1B,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,KAAA,CAAM,IAAA;AAAA,QAC7B,WAAA,EAAa,SAAS,WAAA,IAAe,EAAA;AAAA,QACrC,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AA8BA,eAAsB,kBAAkB,IAAA,EAAgD;AACtF,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,KAAQ,MAAM;AAAA,EAAC,CAAA,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,IAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,WAAW,EAAC;AAAA,IACZ,UAAU;AAAC,GACb;AAGA,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA;AACtD,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CAAA,oBAAA,EAAuB,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAC3D,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,WAAA,EAAY,GAAI,aAAa,YAAY,CAAA;AAChE,EAAA,GAAA,CAAI,CAAA,qCAAA,EAAwC,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAK3D,EAAA,GAAA,CAAI,wBAAwB,CAAA;AAC5B,EAAA,MAAM,eAAgB,IAAA,CAAK,YAAA,IACzB,QAAA,CAAS,SAAA,GAAY,gBAAgB,CAAA,IACrC,aAAA;AACF,EAAA,MAAM,WAAA,GAAc,cAAA;AAAA,IAClB,IAAA;AAAA,IACA,SAAS,WAAW,CAAA;AAAA,IACpB,QAAA,CAAS,QAAA;AAAA,IACT,YAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAW,CAAA;AAGlC,EAAA,MAAM,mBAAmB,QAAA,CAAS,UAAA;AAClC,EAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC5B,IAAA,GAAA,CAAI,8BAA8B,CAAA;AAClC,IAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,IAAA,EAAM,gBAAA,EAAkB,GAAG,CAAA;AACnE,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,EACnC;AAGA,EAAA,GAAA,CAAI,iCAAiC,CAAA;AACrC,EAAA,MAAM,YAAY,sBAAA,CAAuB,IAAA,EAAM,QAAA,CAAS,SAAA,EAAW,KAAK,YAAY,CAAA;AACpF,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,SAAS,CAAA;AAGhC,EAAA,GAAA,CAAI,4BAA4B,CAAA;AAEhC,EAAA,MAAM,iBAAiB,QAAA,CAAS,QAAA;AAChC,EAAA,IAAI,gBAAgB,QAAA,IAAY,CAAC,eAAe,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AACxE,IAAA,cAAA,CAAe,QAAA,GAAWL,IAAAA,CAAK,WAAA,EAAa,cAAA,CAAe,QAAQ,CAAA;AAAA,EACrE;AACA,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,IAAA,EAAM,cAAA,EAAgB,WAAW,CAAA;AACxE,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAW,CAAA;AAGlC,EAAA,GAAA,CAAI,0BAA0B,CAAA;AAC9B,EAAA,MAAM,YAAA,GAAe,KAAK,YAAA,GAAe,EAAE,SAAS,IAAA,CAAK,YAAA,KAAiB,QAAA,CAAS,MAAA;AACnF,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,IAAI,CAAA,EAAG,MAAA;AAC9C,EAAA,MAAM,eAAe,MAAM,gBAAA;AAAA,IACzB,IAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,YAAA,CAAa,OAAO,CAAA;AAC3C,EAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,GAAG,YAAA,CAAa,QAAQ,CAAA;AAG7C,EAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,IAAA,GAAA,CAAI,0BAA0B,CAAA;AAC9B,IAAA,MAAM,eAAe,MAAM,gBAAA,CAAiB,IAAA,EAAM,QAAA,CAAS,QAAQ,GAAG,CAAA;AACtE,IAAA,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,GAAG,YAAA,CAAa,SAAS,CAAA;AAC/C,IAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,GAAG,YAAA,CAAa,QAAQ,CAAA;AAAA,EAC/C;AAGA,EAAA,GAAA,CAAI,yBAAyB,CAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,IAAA,EAAM,QAAA,CAAS,OAAO,GAAG,CAAA;AAC7D,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAA,CAAY,OAAO,CAAA;AAC1C,EAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,GAAG,WAAA,CAAY,QAAQ,CAAA;AAG5C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,IAAU,QAAA,CAAS,WAAW,OAAA,IAAW,KAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,GAAA,CAAI,6BAA6B,CAAA;AACjC,IAAA,MAAM,gBAAA,GAAmB,mBAAA;AAAA,MACvB,IAAA;AAAA,MACA,EAAE,GAAG,QAAA,CAAS,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,MACvC,IAAA,CAAK;AAAA,KACP;AACA,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,gBAAgB,CAAA;AAAA,EACzC;AAEA,EAAA,GAAA,CAAI,CAAA,sBAAA,EAAyB,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,mBAAA,CAAqB,CAAA;AACvE,EAAA,OAAO,MAAA;AACT","file":"chunk-YHXBQLXX.js","sourcesContent":["/**\n * Base layer — creates .skaile/ directory, settings.json, and skaile.yaml.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport type { AiResourcesLayerConfig, ScaffoldOptions } from \"../types.js\";\n\n/**\n * Apply the base scaffold layer — creates `.skaile/`, `settings.json`, and `skaile.yaml`.\n *\n * @param dest - Absolute path to the workspace root to create.\n * @param aiResources - AI resource config from the template manifest (sources, requires).\n * @param templateSettings - Template-default settings merged under user overrides.\n * @param framework - Default agent framework written to `skaile.yaml` `agent-config`.\n * @param opts - Full scaffold options (provides name, settings, resources, requires overrides).\n * @returns Array of created file/directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyBaseLayer(\n dest: string,\n aiResources: AiResourcesLayerConfig | undefined,\n templateSettings: Record<string, unknown> | undefined,\n framework: string,\n opts: ScaffoldOptions,\n): string[] {\n const created: string[] = [];\n\n // Create workspace root\n if (!existsSync(dest)) {\n mkdirSync(dest, { recursive: true });\n created.push(\".\");\n }\n\n // Create .skaile/ directory\n const skaileDir = join(dest, \".skaile\");\n if (!existsSync(skaileDir)) {\n mkdirSync(skaileDir, { recursive: true });\n created.push(\".skaile/\");\n }\n\n // Create .skaile/sessions/ directory\n const sessionsDir = join(skaileDir, \"sessions\");\n if (!existsSync(sessionsDir)) {\n mkdirSync(sessionsDir, { recursive: true });\n created.push(\".skaile/sessions/\");\n }\n\n // Write settings.json (merge template defaults + user overrides)\n const settingsPath = join(skaileDir, \"settings.json\");\n if (!existsSync(settingsPath)) {\n const settings = {\n ...(templateSettings ?? {}),\n ...(opts.settings ?? {}),\n };\n writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`);\n created.push(\".skaile/settings.json\");\n }\n\n // Write skaile.yaml (unified workspace config)\n const sources = opts.resources ?? aiResources?.resources ?? [];\n const requires = opts.requires ?? aiResources?.requires ?? [];\n\n const wsConfigPath = join(dest, \"skaile.yaml\");\n if (!existsSync(wsConfigPath)) {\n const projectName = opts.name ?? basename(dest);\n\n // Build ai_resources as array with dependencies on first source\n const aiResourceEntries = sources.map((r, i) => {\n const entry: Record<string, unknown> = { name: r.name, path: r.path };\n if (r.branch) entry.branch = r.branch;\n if (i === 0 && requires.length > 0) entry.dependencies = requires;\n return entry;\n });\n\n const wsConfig: Record<string, unknown> = {\n name: projectName,\n description: `${projectName} AI skill dependencies`,\n \"agent-config\": {\n default: {\n agent: framework,\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n driver: \"claude-sdk\",\n max_turns: 200,\n },\n },\n ai_resources: aiResourceEntries,\n };\n writeFileSync(wsConfigPath, stringify(wsConfig));\n created.push(\"skaile.yaml\");\n }\n\n return created;\n}\n","/**\n * Container layer — generates Dockerfile and docker-compose.yml for\n * containerized agent workspaces.\n */\n\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport type { ContainerLayerConfig } from \"../types.js\";\n\n/**\n * Apply the container scaffold layer — generates `Dockerfile`, `docker-compose.yml`, and `.dockerignore`.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Container layer configuration from the template manifest or `ScaffoldOptions.docker`.\n * @param projectName - Project name used as the docker-compose service name.\n * @returns Array of created file paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyContainerLayer(\n dest: string,\n config: ContainerLayerConfig | undefined,\n projectName?: string,\n): string[] {\n const created: string[] = [];\n if (!config?.enabled) return created;\n\n const name = projectName ?? basename(dest);\n const baseImage = config.baseImage ?? \"node:22-alpine\";\n const wsPort = config.wsPort ?? 3100;\n\n // Generate Dockerfile\n const dockerfilePath = join(dest, \"Dockerfile\");\n if (!existsSync(dockerfilePath)) {\n const dockerfile = generateDockerfile(baseImage, config, wsPort);\n writeFileSync(dockerfilePath, dockerfile);\n created.push(\"Dockerfile\");\n }\n\n // Generate docker-compose.yml\n const composePath = join(dest, \"docker-compose.yml\");\n if (!existsSync(composePath)) {\n const compose = generateCompose(name, config, wsPort);\n writeFileSync(composePath, compose);\n created.push(\"docker-compose.yml\");\n }\n\n // Generate .dockerignore\n const dockerignorePath = join(dest, \".dockerignore\");\n if (!existsSync(dockerignorePath)) {\n writeFileSync(\n dockerignorePath,\n [\"node_modules\", \".git\", \".skaile/sessions\", \"*.log\", \".env.local\", \"\"].join(\"\\n\"),\n );\n created.push(\".dockerignore\");\n }\n\n return created;\n}\n\nfunction generateDockerfile(\n baseImage: string,\n config: ContainerLayerConfig,\n wsPort: number,\n): string {\n const lines: string[] = [`FROM ${baseImage}`, \"\", \"# System packages\"];\n\n // System packages\n const packages = [\"git\", \"curl\", ...(config.packages ?? [])];\n if (baseImage.includes(\"alpine\")) {\n lines.push(`RUN apk add --no-cache ${packages.join(\" \")}`);\n } else {\n lines.push(\n `RUN apt-get update && apt-get install -y ${packages.join(\" \")} && rm -rf /var/lib/apt/lists/*`,\n );\n }\n lines.push(\"\");\n\n // Agent CLIs\n if (config.agents && config.agents.length > 0) {\n lines.push(\"# Agent CLIs\");\n for (const agent of config.agents) {\n lines.push(`RUN npm install -g ${agent}`);\n }\n lines.push(\"\");\n }\n\n // Working directory\n lines.push(\"WORKDIR /workspace\");\n lines.push(\"\");\n\n // Copy workspace files\n lines.push(\"# Copy workspace configuration\");\n lines.push(\"COPY skaile.yaml ./\");\n lines.push(\"COPY .skaile/ ./.skaile/\");\n lines.push(\"\");\n\n // Ports\n const ports = [String(wsPort), ...(config.ports ?? [])];\n for (const port of ports) {\n lines.push(`EXPOSE ${port}`);\n }\n lines.push(\"\");\n\n // Environment\n if (config.env && config.env.length > 0) {\n lines.push(\"# Environment\");\n for (const envVar of config.env) {\n lines.push(`ENV ${envVar}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"# Default entrypoint — override in compose or at runtime\");\n lines.push('ENTRYPOINT [\"sh\", \"-c\"]');\n lines.push('CMD [\"echo Agent workspace ready && exec sh\"]');\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction generateCompose(name: string, config: ContainerLayerConfig, wsPort: number): string {\n const serviceName = name.replace(/[^a-z0-9-]/gi, \"-\").toLowerCase();\n const ports = [`${wsPort}:${wsPort}`, ...(config.ports ?? []).map((p) => `${p}:${p}`)];\n\n const lines: string[] = [\n \"services:\",\n ` ${serviceName}:`,\n \" build: .\",\n ` container_name: ${serviceName}`,\n ];\n\n // Ports\n if (ports.length > 0) {\n lines.push(\" ports:\");\n for (const port of ports) {\n lines.push(` - \"${port}\"`);\n }\n }\n\n // Volumes / mounts\n if (config.mounts && config.mounts.length > 0) {\n lines.push(\" volumes:\");\n for (const mount of config.mounts) {\n if (mount.type === \"bind\") {\n lines.push(` - ${mount.source}:${mount.target}`);\n } else {\n lines.push(` - ${mount.source}:${mount.target}`);\n }\n }\n }\n\n // Environment\n if (config.env && config.env.length > 0) {\n lines.push(\" environment:\");\n for (const envVar of config.env) {\n if (envVar.includes(\"=\")) {\n lines.push(` - ${envVar}`);\n } else {\n lines.push(` - ${envVar}`);\n }\n }\n }\n\n lines.push(\" restart: unless-stopped\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Driver target layer — creates agent-specific directories (.claude/, .omp/, etc.)\n * based on the DRIVER_TARGETS configuration.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DRIVER_TARGETS } from \"@skaile/workspaces/core\";\nimport type { DriverTarget } from \"@skaile/workspaces/core\";\nimport type { DriverTargetLayerConfig } from \"../types.js\";\n\n/**\n * Apply the driver-target scaffold layer — creates framework-specific directories (`.claude/`, `.omp/`, etc.).\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Driver target layer configuration from the template manifest.\n * @param driverTargetOverride - Overrides `config[\"default-target\"]` when provided.\n * @returns Array of created directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyDriverTargetLayer(\n dest: string,\n config: DriverTargetLayerConfig | undefined,\n driverTargetOverride?: DriverTarget,\n): string[] {\n const created: string[] = [];\n const driverTarget = (driverTargetOverride ??\n config?.[\"default-target\"] ??\n \"claude-code\") as DriverTarget;\n\n const targetMap = DRIVER_TARGETS[driverTarget];\n if (!targetMap) return created;\n\n // Create all local deploy target directories\n const dirsToCreate = new Set<string>();\n for (const dir of Object.values(targetMap.local)) {\n dirsToCreate.add(dir);\n }\n\n // Add extras from template\n if (config?.extras) {\n for (const extra of config.extras) {\n dirsToCreate.add(extra);\n }\n }\n\n for (const dir of dirsToCreate) {\n const fullPath = join(dest, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n created.push(`${dir}/`);\n }\n }\n\n return created;\n}\n","/**\n * Hooks layer — git init, .gitignore generation, and post-scaffold setup scripts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { HooksLayerConfig } from \"../types.js\";\n\n/** Result of the hooks scaffold layer. */\nexport interface HooksResult {\n /** Paths to files and directories created by this layer, relative to the workspace root. */\n created: string[];\n /** Non-fatal warnings collected during hook execution (e.g. failed setup scripts). */\n warnings: string[];\n}\n\n/**\n * Apply the hooks scaffold layer — runs `git init`, appends `.gitignore` entries, and executes setup scripts.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Hooks layer configuration from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns {@link HooksResult} with created file paths and warnings.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyHooksLayer(\n dest: string,\n config: HooksLayerConfig | undefined,\n log?: (msg: string) => void,\n): HooksResult {\n const result: HooksResult = { created: [], warnings: [] };\n if (!config) return result;\n\n // Git init\n if (config.gitInit) {\n const gitDir = join(dest, \".git\");\n if (!existsSync(gitDir)) {\n try {\n execSync(\"git init\", { cwd: dest, stdio: \"pipe\" });\n result.created.push(\".git/\");\n log?.(\"Initialized git repository\");\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`git init failed: ${msg}`);\n }\n }\n }\n\n // .gitignore\n if (config.gitignore && config.gitignore.length > 0) {\n const gitignorePath = join(dest, \".gitignore\");\n let existing = \"\";\n if (existsSync(gitignorePath)) {\n existing = readFileSync(gitignorePath, \"utf-8\");\n }\n\n const existingLines = new Set(existing.split(\"\\n\").map((l) => l.trim()));\n const newEntries = config.gitignore.filter((e) => !existingLines.has(e));\n\n if (newEntries.length > 0) {\n const append = `${(existing && !existing.endsWith(\"\\n\") ? \"\\n\" : \"\") + newEntries.join(\"\\n\")}\\n`;\n writeFileSync(gitignorePath, existing + append);\n if (!existingLines.size) {\n result.created.push(\".gitignore\");\n }\n }\n }\n\n // Setup scripts\n if (config.setupScripts) {\n for (const script of config.setupScripts) {\n try {\n log?.(`Running setup script: ${script.name}`);\n const cwd = script.cwd ? join(dest, script.cwd) : dest;\n if (!existsSync(cwd)) {\n mkdirSync(cwd, { recursive: true });\n }\n execSync(script.run, {\n cwd,\n stdio: \"pipe\",\n timeout: 60_000,\n env: { ...process.env, WORKSPACE_DIR: dest },\n });\n log?.(`Setup script \"${script.name}\" completed`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Setup script \"${script.name}\" failed: ${msg}`);\n }\n }\n }\n\n return result;\n}\n","/**\n * Connectors layer — writes connector declarations to skaile.yaml\n * and creates mount directories for mountable connectors.\n *\n * Actual sync/connect happens at runtime (in the runner), not at scaffold time.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { WorkspaceYamlEditor } from \"@skaile/workspaces/core\";\nimport type { ConnectorEntry } from \"../types.js\";\n\n/**\n * Apply the connectors scaffold layer — writes connector declarations to `skaile.yaml` and creates mount directories.\n *\n * @param dest - Absolute path to the workspace root.\n * @param connectors - Connector entries from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns Array of created mount directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyConnectorsLayer(\n dest: string,\n connectors: ConnectorEntry[] | undefined | null,\n log?: (msg: string) => void,\n): string[] {\n const created: string[] = [];\n const entries: ConnectorEntry[] = Array.isArray(connectors) ? connectors : [];\n if (!entries.length) return created;\n\n // Write connectors to skaile.yaml\n const yamlPath = join(dest, \"skaile.yaml\");\n if (existsSync(yamlPath)) {\n const editor = WorkspaceYamlEditor.load(yamlPath);\n for (const r of entries) {\n editor.setConnector({\n id: r.id,\n driver: r.driver,\n access: r.access ?? \"read-only\",\n auth: r.auth,\n options: r.options,\n });\n }\n editor.save();\n log?.(`Wrote ${entries.length} connector(s) to skaile.yaml`);\n } else {\n log?.(\"Skipping connector write: skaile.yaml not found (base layer should create it first)\");\n }\n\n // Create mount directories for connectors that have autoMount or mountPath\n for (const connector of entries) {\n if (connector.autoMount === false) continue;\n const mountPath = connector.mountPath ?? `.connectors/${connector.id}`;\n const absMount = join(dest, mountPath);\n if (!existsSync(absMount)) {\n mkdirSync(absMount, { recursive: true });\n created.push(`${mountPath}/`);\n log?.(`Created mount dir: ${mountPath}`);\n }\n }\n\n return created;\n}\n","/**\n * Skills layer — installs AI resources into the workspace using the asset manager.\n *\n * Now that this layer lives inside @skaile/asset-manager, the AssetManager class\n * is loaded via a lazy import from the parent package index (no more dynamic\n * external dependency hack).\n *\n * When a scopeDir is specified, the asset manager operates against that directory\n * instead of the default project directory.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SkillsLayerConfig } from \"../types.js\";\n\n/** Result of the skills scaffold layer. */\nexport interface SkillsInstallResult {\n /** Asset refs (`kind:name`) installed by `skaile install` during scaffolding. */\n installed: string[];\n /** Non-fatal warnings (e.g. `skaile.yaml` not found, install failure). */\n warnings: string[];\n}\n\n/**\n * Lazy-load AssetManager from the parent package index.\n * Returns null if not available (should not happen in normal operation).\n */\nasync function loadAssetManager(): Promise<any | null> {\n try {\n const mod = await import(\"../../index.js\");\n return mod.AssetManager ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Apply the skills scaffold layer — runs `skaile install` to deploy all declared asset dependencies.\n *\n * Only runs when `config.autoInstall` is `true`. Skips silently when `skaile.yaml` is absent.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Skills layer configuration from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns {@link SkillsInstallResult} with installed refs and warnings.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport async function applySkillsLayer(\n dest: string,\n config: SkillsLayerConfig | undefined,\n log?: (msg: string) => void,\n): Promise<SkillsInstallResult> {\n const result: SkillsInstallResult = { installed: [], warnings: [] };\n if (!config?.autoInstall) return result;\n\n const wsConfigPath = join(dest, \"skaile.yaml\");\n if (!existsSync(wsConfigPath)) {\n result.warnings.push(\"Skipping skill install: skaile.yaml not found\");\n return result;\n }\n\n const AssetManager = await loadAssetManager();\n if (!AssetManager) {\n result.warnings.push(\n \"Skipping skill install: AssetManager could not be loaded. Run `skaile install` manually.\",\n );\n return result;\n }\n\n try {\n log?.(\"Installing AI resources...\");\n\n const am = new AssetManager({ projectDir: dest });\n const installResult = await am.install();\n\n if (Array.isArray(installResult)) {\n result.installed = installResult;\n } else if (installResult?.deployed) {\n result.installed = installResult.deployed;\n }\n\n log?.(`Installed ${result.installed.length} skill(s)`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Skill install failed: ${msg}`);\n }\n\n return result;\n}\n","/**\n * Template layer — applies agent definition files (SOUL.md, RULES.md, knowledge/)\n * and any additional template files.\n */\n\nimport { copyFileSync, existsSync, mkdirSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { TemplateLayerConfig } from \"../types.js\";\n\n/** Recursively copy a directory, skipping files that already exist at dest. */\nfunction copyDirSkipExisting(src: string, dest: string, created: string[], baseDest: string): void {\n if (!existsSync(dest)) mkdirSync(dest, { recursive: true });\n for (const entry of readdirSync(src, { withFileTypes: true })) {\n const srcPath = join(src, entry.name);\n const destPath = join(dest, entry.name);\n if (entry.isDirectory()) {\n copyDirSkipExisting(srcPath, destPath, created, baseDest);\n } else if (!existsSync(destPath)) {\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(srcPath, destPath);\n created.push(relative(baseDest, destPath));\n }\n }\n}\n\n/**\n * Apply the template overlay layer — copies agent definition files (`SOUL.md`, `RULES.md`, `knowledge/`) and additional static template files into the workspace.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Template layer configuration from the template manifest.\n * @param templateDir - Absolute path to the template directory (used to resolve relative `files[].src` paths).\n * @returns Array of created file paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyTemplateLayer(\n dest: string,\n config: TemplateLayerConfig | undefined,\n templateDir?: string,\n): string[] {\n const created: string[] = [];\n if (!config) return created;\n\n // Apply agent definition from agentDir\n if (config.agentDir) {\n const agentDir = config.agentDir;\n if (existsSync(agentDir)) {\n // Copy SOUL.md, RULES.md, DUTIES.md\n for (const file of [\"SOUL.md\", \"RULES.md\", \"DUTIES.md\"]) {\n const src = join(agentDir, file);\n const destFile = join(dest, \".skaile\", \"agent\", file);\n if (existsSync(src) && !existsSync(destFile)) {\n mkdirSync(dirname(destFile), { recursive: true });\n copyFileSync(src, destFile);\n created.push(relative(dest, destFile));\n }\n }\n\n // Copy knowledge/ directory\n const knowledgeSrc = join(agentDir, \"knowledge\");\n if (existsSync(knowledgeSrc)) {\n const knowledgeDest = join(dest, \".skaile\", \"agent\", \"knowledge\");\n copyDirSkipExisting(knowledgeSrc, knowledgeDest, created, dest);\n }\n\n // Copy skills/ directory from agent def\n const skillsSrc = join(agentDir, \"skills\");\n if (existsSync(skillsSrc)) {\n const skillsDest = join(dest, \".skaile\", \"agent\", \"skills\");\n copyDirSkipExisting(skillsSrc, skillsDest, created, dest);\n }\n }\n }\n\n // Write inline soul/rules content\n if (config.soul) {\n const soulPath = join(dest, \".skaile\", \"agent\", \"SOUL.md\");\n if (!existsSync(soulPath)) {\n mkdirSync(dirname(soulPath), { recursive: true });\n writeFileSync(soulPath, config.soul);\n created.push(\".skaile/agent/SOUL.md\");\n }\n }\n if (config.rules) {\n const rulesPath = join(dest, \".skaile\", \"agent\", \"RULES.md\");\n if (!existsSync(rulesPath)) {\n mkdirSync(dirname(rulesPath), { recursive: true });\n writeFileSync(rulesPath, config.rules);\n created.push(\".skaile/agent/RULES.md\");\n }\n }\n\n // Copy additional template files\n if (config.files && templateDir) {\n for (const file of config.files) {\n const srcPath = join(templateDir, file.src);\n const destPath = join(dest, file.dest);\n if (!existsSync(srcPath)) continue;\n if (existsSync(destPath)) continue;\n\n if (statSync(srcPath).isDirectory()) {\n copyDirSkipExisting(srcPath, destPath, created, dest);\n } else {\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(srcPath, destPath);\n created.push(file.dest);\n }\n }\n }\n\n return created;\n}\n","/**\n * Main scaffolder — loads a workspace template (workspace.yaml) and applies\n * all configured layers in order: base → framework → template → skills → hooks → container.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { applyAgentsLayer } from \"./layers/agents.js\";\nimport { applyBaseLayer } from \"./layers/base.js\";\nimport { applyContainerLayer } from \"./layers/container.js\";\nimport { applyDriverTargetLayer } from \"./layers/driver-target.js\";\nimport { applyHooksLayer } from \"./layers/hooks.js\";\nimport { applyConnectorsLayer } from \"./layers/connectors.js\";\nimport { applySkillsLayer } from \"./layers/skills.js\";\nimport { applyTemplateLayer } from \"./layers/template.js\";\nimport { loadSkWorkspaceConfig } from \"@skaile/workspaces/core\";\nimport type { DriverTarget } from \"@skaile/workspaces/core\";\nimport type { ScaffoldOptions, ScaffoldResult, TemplateManifest } from \"./types.js\";\n\n// ── Built-in template directory ────────────────────────────────────────────\n\nlet _builtinTemplatesDir: string | null = null;\n\n/**\n * Get the built-in templates directory. Uses import.meta.url by default,\n * but can be overridden via setTemplatesDir() for bundled environments\n * (e.g. Nitro) where import.meta.url resolves to the bundle output.\n */\nfunction getBuiltinTemplatesDir(): string {\n if (_builtinTemplatesDir) return _builtinTemplatesDir;\n return join(dirname(new URL(import.meta.url).pathname), \"..\", \"..\", \"templates\");\n}\n\n/**\n * Override the built-in templates directory. Call this from apps that bundle\n * skaile-agent-workspace (e.g. Nitro/Nuxt) where `import.meta.url` doesn't\n * resolve to the source package.\n *\n * @param dir - Absolute path to the custom templates directory.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function setTemplatesDir(dir: string): void {\n _builtinTemplatesDir = resolve(dir);\n}\n\n// ── Template loading ───────────────────────────────────────────────────────\n\n/**\n * Resolve a template name or path to an absolute path to `workspace.yaml`.\n *\n * Lookup order:\n * 1. Absolute or relative path to a `workspace.yaml` file.\n * 2. Directory containing `workspace.yaml`.\n * 3. Built-in template name matching `templates/<name>/workspace.yaml`.\n *\n * @param template - Template name (e.g. `\"minimal\"`) or path to a `workspace.yaml` / directory.\n * @returns Absolute path to `workspace.yaml`, or `null` when the template cannot be found.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function resolveTemplatePath(template: string): string | null {\n // Direct path to a file\n if (template.endsWith(\".yaml\") || template.endsWith(\".yml\")) {\n const abs = resolve(template);\n return existsSync(abs) ? abs : null;\n }\n\n // Directory containing workspace.yaml\n const dirPath = resolve(template);\n const inDir = join(dirPath, \"workspace.yaml\");\n if (existsSync(inDir)) return inDir;\n\n // Built-in template name\n const builtin = join(getBuiltinTemplatesDir(), template, \"workspace.yaml\");\n if (existsSync(builtin)) return builtin;\n\n return null;\n}\n\n/**\n * Load and merge a template manifest, following `extends` chains.\n *\n * @param templatePath - Absolute path to a `workspace.yaml` template file.\n * @returns Merged `TemplateManifest` with parent sections folded in, and the template directory.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function loadTemplate(templatePath: string): { manifest: TemplateManifest; dir: string } {\n const raw = readFileSync(templatePath, \"utf-8\");\n const manifest = parse(raw) as TemplateManifest;\n const dir = dirname(templatePath);\n\n if (manifest.extends) {\n const parentPath =\n resolveTemplatePath(manifest.extends) ?? resolveTemplatePath(join(dir, manifest.extends));\n if (parentPath) {\n const parent = loadTemplate(parentPath);\n // Shallow merge: child sections override parent sections per-key\n const { extends: _ext, name, description, version, ...childSections } = manifest;\n Object.assign(manifest, {\n ...parent.manifest,\n name,\n description,\n version,\n extends: _ext,\n ...childSections,\n });\n }\n }\n\n return { manifest, dir };\n}\n\n/**\n * List all available built-in templates.\n *\n * @returns Array of objects with `name`, `description`, and `path` for each available template.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function listTemplates(): Array<{ name: string; description: string; path: string }> {\n const templates: Array<{ name: string; description: string; path: string }> = [];\n const templatesDir = getBuiltinTemplatesDir();\n if (!existsSync(templatesDir)) return templates;\n\n const { readdirSync } = require(\"node:fs\");\n for (const entry of readdirSync(templatesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const wsPath = join(templatesDir, entry.name, \"workspace.yaml\");\n if (!existsSync(wsPath)) continue;\n try {\n const raw = readFileSync(wsPath, \"utf-8\");\n const manifest = parse(raw) as TemplateManifest;\n templates.push({\n name: manifest.name ?? entry.name,\n description: manifest.description ?? \"\",\n path: wsPath,\n });\n } catch {\n // Skip unparseable templates\n }\n }\n\n return templates;\n}\n\n// ── Main scaffold function ────────────────────────────────────────────────\n\n/**\n * Scaffold a new Skaile workspace from a template, applying layers in order.\n *\n * Layer application order:\n * 1. **Base** — creates `.skaile/`, `settings.json`, and `skaile.yaml`\n * 2. **Connectors** — writes connector declarations to `skaile.yaml`\n * 3. **Driver target** — creates framework-specific directories (`.claude/`, `.omp/`, etc.)\n * 4. **Template** — copies agent definition files and static template overlays\n * 5. **Agents** — renders and installs GitAgent packages\n * 6. **Skills** — runs `skaile install` (unless `opts.skipInstall` is `true`)\n * 7. **Hooks** — runs `git init`, writes `.gitignore`, executes setup scripts\n * 8. **Container** — generates `Dockerfile` and `docker-compose.yml` (when enabled)\n *\n * @param opts - Scaffold options including destination, template, and layer overrides.\n * @returns {@link ScaffoldResult} with created paths, installed skills, and warnings.\n * @example\n * ```ts\n * const result = await scaffoldWorkspace({\n * dest: \"./my-workspace\",\n * template: \"minimal\",\n * driverTarget: \"claude-code\",\n * });\n * console.log(`Created ${result.created.length} files`);\n * ```\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport async function scaffoldWorkspace(opts: ScaffoldOptions): Promise<ScaffoldResult> {\n const log = opts.log ?? (() => {});\n const dest = resolve(opts.dest);\n const result: ScaffoldResult = {\n path: dest,\n created: [],\n installed: [],\n warnings: [],\n };\n\n // 1. Load template\n const templatePath = resolveTemplatePath(opts.template);\n if (!templatePath) {\n result.warnings.push(`Template not found: ${opts.template}`);\n return result;\n }\n\n const { manifest, dir: templateDir } = loadTemplate(templatePath);\n log(`Scaffolding workspace from template: ${manifest.name}`);\n\n // 2. Apply layers in order\n\n // Base layer: .skaile/, settings.json, skaile.yaml\n log(\"Applying base layer...\");\n const driverTarget = (opts.driverTarget ??\n manifest.framework?.[\"default-target\"] ??\n \"claude-code\") as DriverTarget;\n const baseCreated = applyBaseLayer(\n dest,\n manifest[\"ai-assets\"],\n manifest.settings,\n driverTarget,\n opts,\n );\n result.created.push(...baseCreated);\n\n // Connectors layer: connector declarations → skaile.yaml + mount directories\n const connectorEntries = manifest.connectors;\n if (connectorEntries?.length) {\n log(\"Applying connectors layer...\");\n const resCreated = applyConnectorsLayer(dest, connectorEntries, log);\n result.created.push(...resCreated);\n }\n\n // Driver target layer: agent-specific directories\n log(\"Applying driver target layer...\");\n const fwCreated = applyDriverTargetLayer(dest, manifest.framework, opts.driverTarget);\n result.created.push(...fwCreated);\n\n // Template layer: agent definition, template files\n log(\"Applying template layer...\");\n // Resolve agentDir relative to template directory\n const templateConfig = manifest.template;\n if (templateConfig?.agentDir && !templateConfig.agentDir.startsWith(\"/\")) {\n templateConfig.agentDir = join(templateDir, templateConfig.agentDir);\n }\n const tmplCreated = applyTemplateLayer(dest, templateConfig, templateDir);\n result.created.push(...tmplCreated);\n\n // Agents layer: install GitAgent packages into framework deploy target\n log(\"Applying agents layer...\");\n const agentsConfig = opts.agentInstall ? { install: opts.agentInstall } : manifest.agents;\n const wsConfig = loadSkWorkspaceConfig(dest)?.config;\n const agentsResult = await applyAgentsLayer(\n dest,\n agentsConfig,\n driverTarget,\n templateDir,\n wsConfig,\n log,\n );\n result.created.push(...agentsResult.created);\n result.warnings.push(...agentsResult.warnings);\n\n // Skills layer: asset manager-based resource installation\n if (!opts.skipInstall) {\n log(\"Applying skills layer...\");\n const skillsResult = await applySkillsLayer(dest, manifest.skills, log);\n result.installed.push(...skillsResult.installed);\n result.warnings.push(...skillsResult.warnings);\n }\n\n // Hooks layer: git init, .gitignore, setup scripts\n log(\"Applying hooks layer...\");\n const hooksResult = applyHooksLayer(dest, manifest.hooks, log);\n result.created.push(...hooksResult.created);\n result.warnings.push(...hooksResult.warnings);\n\n // Container layer: Dockerfile, docker-compose.yml\n const enableDocker = opts.docker ?? manifest.container?.enabled ?? false;\n if (enableDocker) {\n log(\"Applying container layer...\");\n const containerCreated = applyContainerLayer(\n dest,\n { ...manifest.container, enabled: true },\n opts.name,\n );\n result.created.push(...containerCreated);\n }\n\n log(`Workspace scaffolded: ${result.created.length} files/dirs created`);\n return result;\n}\n"]}