@skaile/workspaces 0.15.0 → 0.15.1

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 (36) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/asset-manager/index.js +2 -2
  3. package/dist/asset-manager/installer.js +1 -1
  4. package/dist/asset-manager/src/index.d.ts.map +1 -1
  5. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  6. package/dist/base-assets/connectors/flow/run-flow.js +1 -1
  7. package/dist/{chunk-SO43XRWF.js → chunk-67TJEQJE.js} +2 -2
  8. package/dist/{chunk-SO43XRWF.js.map → chunk-67TJEQJE.js.map} +1 -1
  9. package/dist/{chunk-7R4WLTZW.js → chunk-DEZVZSBN.js} +11 -16
  10. package/dist/chunk-DEZVZSBN.js.map +1 -0
  11. package/dist/{chunk-4GEVGRWB.js → chunk-ERCOCLW5.js} +9 -11
  12. package/dist/chunk-ERCOCLW5.js.map +1 -0
  13. package/dist/{chunk-2NIOMFSQ.js → chunk-FNCYNUGS.js} +78 -81
  14. package/dist/chunk-FNCYNUGS.js.map +1 -0
  15. package/dist/{chunk-Z24KPZKU.js → chunk-HJV7MHG5.js} +2 -2
  16. package/dist/{chunk-Z24KPZKU.js.map → chunk-HJV7MHG5.js.map} +1 -1
  17. package/dist/{chunk-6EN5IJ2Y.js → chunk-IY4X7PZN.js} +3 -3
  18. package/dist/{chunk-6EN5IJ2Y.js.map → chunk-IY4X7PZN.js.map} +1 -1
  19. package/dist/cli/index.js +146 -98
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/src/commands/manage.d.ts +31 -20
  22. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  23. package/dist/library/index.js +1 -1
  24. package/dist/library/src/local/db.d.ts.map +1 -1
  25. package/dist/library/src/local/store-paths.d.ts.map +1 -1
  26. package/dist/{open-library-XD7QYLMW.js → open-library-T6RXQJTQ.js} +4 -4
  27. package/dist/{open-library-XD7QYLMW.js.map → open-library-T6RXQJTQ.js.map} +1 -1
  28. package/dist/runner/index.js +1 -1
  29. package/dist/sdk/asset-manager.js +2 -2
  30. package/dist/sdk/index.js +1 -1
  31. package/dist/sdk/runner.js +1 -1
  32. package/dist/tui/index.js +1 -1
  33. package/package.json +1 -1
  34. package/dist/chunk-2NIOMFSQ.js.map +0 -1
  35. package/dist/chunk-4GEVGRWB.js.map +0 -1
  36. package/dist/chunk-7R4WLTZW.js.map +0 -1
@@ -4,8 +4,7 @@ import { DRIVER_TARGETS } from './chunk-O4JH3KUE.js';
4
4
  import { resolveSkWorkspaceConfig } from './chunk-GAZINYCS.js';
5
5
  import { renderAgentToFramework } from './chunk-6FNCZYJY.js';
6
6
  import { resolveFragments, loadPromptExtensions } from './chunk-CGYEHQOX.js';
7
- import { __require } from './chunk-NSBPE2FW.js';
8
- import { existsSync, readFileSync, mkdirSync, lstatSync, unlinkSync, rmSync, symlinkSync, cpSync } from 'fs';
7
+ import { existsSync, readFileSync, mkdirSync, lstatSync, unlinkSync, rmSync, writeFileSync, symlinkSync, cpSync } from 'fs';
9
8
  import { resolve, basename, join, relative, isAbsolute, dirname } from 'path';
10
9
  import { parse } from 'yaml';
11
10
 
@@ -336,28 +335,27 @@ globals:
336
335
  nodes: []
337
336
  `;
338
337
  function createScaffold(name, kind, destDir) {
339
- const { writeFileSync: write } = __require("fs");
340
338
  const dest = join(destDir, name);
341
339
  if (existsSync(dest)) {
342
340
  return { ok: false, path: `Directory '${name}' already exists in ${destDir}` };
343
341
  }
344
342
  mkdirSync(dest, { recursive: true });
345
343
  if (kind === "bundle") {
346
- write(join(dest, `${name}.bundle.yaml`), BUNDLE_TEMPLATE.replace(/\{name\}/g, name), "utf8");
344
+ writeFileSync(join(dest, `${name}.bundle.yaml`), BUNDLE_TEMPLATE.replace(/\{name\}/g, name), "utf8");
347
345
  } else if (kind === "flow") {
348
- write(join(dest, `${name}.flow.yaml`), FLOW_TEMPLATE.replace(/\{name\}/g, name), "utf8");
346
+ writeFileSync(join(dest, `${name}.flow.yaml`), FLOW_TEMPLATE.replace(/\{name\}/g, name), "utf8");
349
347
  } else if (kind === "prompt") {
350
- write(join(dest, `${name}.prompt.md`), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
348
+ writeFileSync(join(dest, `${name}.prompt.md`), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
351
349
  } else if (kind === "agent") {
352
- write(join(dest, "AGENT.md"), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
350
+ writeFileSync(join(dest, "AGENT.md"), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
353
351
  } else if (kind === "contract") {
354
- write(join(dest, "CONTRACT.md"), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
352
+ writeFileSync(join(dest, "CONTRACT.md"), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
355
353
  } else {
356
- write(join(dest, "SKILL.md"), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
354
+ writeFileSync(join(dest, "SKILL.md"), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
357
355
  }
358
356
  return { ok: true, path: dest };
359
357
  }
360
358
 
361
359
  export { createScaffold, deployAll, deployAsset, installAgent, removeAsset };
362
- //# sourceMappingURL=chunk-4GEVGRWB.js.map
363
- //# sourceMappingURL=chunk-4GEVGRWB.js.map
360
+ //# sourceMappingURL=chunk-ERCOCLW5.js.map
361
+ //# sourceMappingURL=chunk-ERCOCLW5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../asset-manager/src/install-agent.ts","../asset-manager/src/installer.ts"],"names":["parseYaml","basename","join","resolve","existsSync"],"mappings":"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","file":"chunk-ERCOCLW5.js","sourcesContent":["/**\n * Agent installation — renders a GitAgent package (agent.yaml + SOUL.md + RULES.md)\n * into the framework-native format (`.claude/agents/<name>.md`, `.omp/agents/<name>/`,\n * `.codex/agents/<name>.toml`) and resolves abilities, contracts, fragments, and\n * prompt extensions from the workspace config along the way.\n *\n * System prompt phases (per agent):\n * 1. extends merge — inherit from parent agent.yaml if manifest.extends is set\n * 2. ability refs — read SKILL.md frontmatter from installed skills dir\n * 3. contract refs — locate CONTRACT.md files in the installed skills dir\n * 4. fragments — resolve framework fragments (agent-mode, handoff, etc.)\n * 5. prompt-extensions — load per-project markdown extensions from skaile.yaml\n *\n * Used by `installer.ts` (the asset-install path) and `skaile install`. Sub-agents\n * declared in `agent.yaml#requires` are installed flat (no nesting) in the same\n * deploy directory.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { basename, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { DRIVER_TARGETS } from \"@skaile/workspaces/core\";\nimport type { DriverTarget, SkWorkspaceConfig } from \"@skaile/workspaces/core\";\nimport { parse as parseYaml } from \"yaml\";\nimport {\n type AbilityRef,\n type ConnectorRef,\n type ContractRef,\n type FragmentContext,\n loadPromptExtensions,\n resolveFragments,\n} from \"./fragments.js\";\nimport {\n type AgentManifest,\n type AgentRenderInput,\n renderAgentToFramework,\n} from \"./renderers.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction readManifest(agentDir: string): AgentManifest | null {\n const yamlPath = join(agentDir, \"agent.yaml\");\n if (!existsSync(yamlPath)) return null;\n try {\n return parseYaml(readFileSync(yamlPath, \"utf-8\")) as AgentManifest;\n } catch {\n return null;\n }\n}\n\nfunction readFile(agentDir: string, name: string): string | null {\n const p = join(agentDir, name);\n if (!existsSync(p)) return null;\n try {\n return readFileSync(p, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/** Extract YAML frontmatter from a markdown file (content between first two --- delimiters). */\nfunction parseFrontmatter(content: string): Record<string, unknown> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n try {\n return (parseYaml(match[1]!) as Record<string, unknown>) ?? {};\n } catch {\n return {};\n }\n}\n\n/**\n * Merge parent and child agent manifests.\n * Scalars: child wins. Arrays: parent + child, deduplicated.\n */\nfunction mergeManifests(parent: AgentManifest, child: AgentManifest): AgentManifest {\n const result: AgentManifest = { ...parent };\n for (const [k, val] of Object.entries(child) as [keyof AgentManifest, unknown][]) {\n if (val === undefined) continue;\n const parentVal = result[k as keyof AgentManifest];\n if (Array.isArray(val) && Array.isArray(parentVal)) {\n (result as Record<string, unknown>)[k] = [...new Set([...parentVal, ...val])];\n } else {\n (result as Record<string, unknown>)[k] = val;\n }\n }\n return result;\n}\n\n// ── Core installation ─────────────────────────────────────────────────────────\n\n/**\n * Install a single GitAgent source directory using the appropriate renderer.\n *\n * When `includeSubAgents` is `true`, recursively installs `requires[]` entries as\n * separate flat agents in the same deploy directory (no nesting). Tracks visited\n * directories to prevent infinite loops in `requires[]` cycles.\n *\n * @param srcDir - Absolute path to the GitAgent source directory (contains `agent.yaml`).\n * @param agentDeployDir - Absolute path to the framework's agent deploy directory.\n * @param workspaceRoot - Absolute path to the workspace root.\n * @param driverTarget - Agent framework ID used to select the renderer.\n * @param skillsRelDir - Relative path to the installed skills dir (e.g. `\".claude/skills\"`).\n * @param nameOverride - Override name for the installed agent. Defaults to `manifest.name`.\n * @param includeSubAgents - When `true`, recursively install `requires[]` sub-agents.\n * @param visited - Set of resolved source paths already processed (cycle guard).\n * @param wsConfig - Workspace config from `skaile.yaml` (fragments, connectors, extensions).\n * @param log - Optional logger callback for progress messages.\n * @returns Object with `created` file paths and `warnings` list.\n * @docLink packages/asset-manager/concepts#install-agent\n */\nexport function installAgent(\n srcDir: string,\n agentDeployDir: string,\n workspaceRoot: string,\n driverTarget: string,\n /** Relative path to the installed skills dir (e.g. \".claude/skills\") */\n skillsRelDir: string,\n nameOverride: string | undefined,\n includeSubAgents: boolean,\n visited: Set<string>,\n wsConfig: SkWorkspaceConfig | undefined,\n log?: (msg: string) => void,\n): { created: string[]; warnings: string[] } {\n const created: string[] = [];\n const warnings: string[] = [];\n\n const realSrc = resolve(srcDir);\n if (visited.has(realSrc)) return { created, warnings };\n visited.add(realSrc);\n\n let manifest = readManifest(srcDir);\n if (!manifest) {\n warnings.push(`${srcDir} has no agent.yaml — skipping (not a valid GitAgent package)`);\n return { created, warnings };\n }\n\n // Phase 1: extends merge — inherit scalars/arrays from parent agent\n if (manifest.extends) {\n const parentDir = resolve(srcDir, manifest.extends);\n const parentManifest = readManifest(parentDir);\n if (parentManifest) {\n manifest = mergeManifests(parentManifest, manifest);\n } else {\n warnings.push(\n `extends: parent agent not found at \"${manifest.extends}\" (from ${srcDir}) — skipping inheritance`,\n );\n }\n }\n\n const agentName = nameOverride ?? manifest.name ?? basename(srcDir);\n\n log?.(`Installing git-agent: ${agentName} (${driverTarget})`);\n\n // Phase 2: resolve ability refs — read description from installed SKILL.md files\n const abilityRefs: AbilityRef[] = [];\n for (const name of manifest.abilities ?? []) {\n const skillMdPath = join(workspaceRoot, skillsRelDir, name, \"SKILL.md\");\n if (!existsSync(skillMdPath)) continue;\n try {\n const fm = parseFrontmatter(readFileSync(skillMdPath, \"utf-8\"));\n const desc = typeof fm.description === \"string\" ? fm.description : undefined;\n if (desc) abilityRefs.push({ name, description: desc });\n } catch {\n // skip unreadable SKILL.md\n }\n }\n\n // Phase 3: resolve contract refs — locate CONTRACT.md files in the skills dir\n const contractRefs: ContractRef[] = [];\n for (const name of manifest.contracts ?? []) {\n const contractAbsPath = join(workspaceRoot, skillsRelDir, name, \"CONTRACT.md\");\n if (!existsSync(contractAbsPath)) continue;\n contractRefs.push({ name, relativePath: relative(workspaceRoot, contractAbsPath) });\n }\n\n // Phase 4: build fragment context and resolve framework fragments + prompt extensions\n const subAgentNames = (manifest.requires ?? []).filter((r) => r.name).map((r) => r.name);\n\n const connectors: ConnectorRef[] = (wsConfig?.connectors ?? []).map((c) => ({\n id: c.id,\n driver: c.driver,\n access: c.access ?? \"read-write\",\n }));\n\n const agentsRelDir = DRIVER_TARGETS[driverTarget as DriverTarget]?.local.agent ?? \"\";\n\n const fragmentCtx: FragmentContext = {\n framework: driverTarget,\n skillsDir: skillsRelDir,\n agentsDir: agentsRelDir,\n subAgents: subAgentNames,\n connectors,\n abilityRefs,\n contractRefs,\n };\n\n const frameworkFragments = resolveFragments(\n fragmentCtx,\n wsConfig?.agent?.fragments,\n workspaceRoot,\n );\n const promptExtensions = loadPromptExtensions(\n wsConfig?.agent?.[\"prompt-extensions\"],\n workspaceRoot,\n );\n\n const input: AgentRenderInput = {\n manifest,\n soul: readFile(srcDir, \"SOUL.md\"),\n rules: readFile(srcDir, \"RULES.md\"),\n duties: readFile(srcDir, \"DUTIES.md\"),\n agentName,\n agentDeployDir,\n workspaceRoot,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n };\n\n const result = renderAgentToFramework(input, driverTarget, log);\n created.push(...result.created);\n warnings.push(...result.warnings);\n\n // Recursively install sub-agents from requires[] as flat top-level agents\n if (includeSubAgents) {\n for (const req of manifest.requires ?? []) {\n if (!req.source || !req.name) continue;\n\n const subSrc = isAbsolute(req.source) ? req.source : resolve(srcDir, req.source);\n\n if (!existsSync(subSrc)) {\n warnings.push(`Sub-agent source not found: ${req.source} (from ${agentName})`);\n continue;\n }\n\n const sub = installAgent(\n subSrc,\n agentDeployDir,\n workspaceRoot,\n driverTarget,\n skillsRelDir,\n undefined, // use sub-agent's own name from its agent.yaml\n includeSubAgents,\n visited,\n wsConfig,\n log,\n );\n created.push(...sub.created);\n warnings.push(...sub.warnings);\n }\n }\n\n return { created, warnings };\n}\n","/**\n * Asset deployment — symlink (local repos) or copy (remote repos) to framework dirs.\n */\n\nimport {\n cpSync,\n existsSync,\n lstatSync,\n mkdirSync,\n rmSync,\n symlinkSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport type { AiComponent, CatalogEntry } from \"@skaile/workspaces/core\";\nimport {\n DRIVER_TARGETS,\n computeHash,\n deployedBase,\n deployedDir,\n isDeployed,\n resolveSkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport type { DriverTarget, RepositoryDeclaration } from \"@skaile/workspaces/core\";\nimport { applyPatch } from \"@skaile/workspaces/core\";\nimport type { Log } from \"./renderers.js\";\nimport { installAgent } from \"./install-agent.js\";\n\nexport type { Log } from \"./renderers.js\";\n\nconst noop: Log = () => {};\n\n// ── Filesystem helpers ────────────────────────────────────────────────────────\n\nconst DIRECTORY_MANIFESTS = new Set([\"SKILL.md\", \"AGENT.md\", \"agent.yaml\", \"CONTRACT.md\"]);\n\nfunction clearDest(dest: string): void {\n try {\n const s = lstatSync(dest);\n if (s.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n } catch {}\n}\n\nfunction copyFromManifest(manifestPath: string, dest: string): void {\n const name = basename(manifestPath);\n const parentDir = dirname(manifestPath);\n clearDest(dest);\n\n if (DIRECTORY_MANIFESTS.has(name) || basename(parentDir) === basename(dest)) {\n cpSync(parentDir, dest, { recursive: true });\n } else {\n mkdirSync(dest, { recursive: true });\n cpSync(manifestPath, join(dest, name));\n }\n}\n\nfunction symlinkFromManifest(manifestPath: string, dest: string): void {\n const name = basename(manifestPath);\n const parentDir = dirname(manifestPath);\n clearDest(dest);\n mkdirSync(dirname(dest), { recursive: true });\n\n if (DIRECTORY_MANIFESTS.has(name) || basename(parentDir) === basename(dest)) {\n symlinkSync(resolve(parentDir), dest);\n } else {\n mkdirSync(dest, { recursive: true });\n symlinkSync(resolve(manifestPath), join(dest, name));\n }\n}\n\n// ── Deploy options ───────────────────────────────────────────────────────────\n\n/**\n * Options controlling where and how assets are deployed.\n *\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport interface DeployOptions {\n /** Agent framework to target (determines framework-specific directory layout). Defaults to `\"claude-code\"`. */\n driverTarget?: DriverTarget;\n /** When `true`, deploy into the global Skaile cache rather than a project workspace. */\n global?: boolean;\n /** Absolute path to the workspace root. Defaults to `process.cwd()`. */\n cwd?: string;\n}\n\n// ── Deploy / remove ──────────────────────────────────────────────────────────\n\n/**\n * Deploy a single asset to the framework-specific directory.\n *\n * Uses symlinks for local-path repositories (fast, live-updating) and copies\n * for remote repositories (persists after repo wipes). Agents are rendered\n * via the enriched `installAgent` path which resolves abilities, contracts,\n * and framework fragments before writing the native agent file.\n *\n * @param entry - Catalog entry describing the asset to deploy.\n * @param repositories - Repository declarations from `skaile.yaml` (used to\n * determine whether the source is a local path or a remote clone).\n * @param opts - Deployment target options.\n * @param log - Optional logger callback for progress messages.\n * @returns `true` when the asset was deployed successfully.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function deployAsset(\n entry: CatalogEntry,\n repositories: Record<string, RepositoryDeclaration>,\n opts: DeployOptions = {},\n log: Log = noop,\n): boolean {\n const driverTarget = opts.driverTarget ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // Bundles are not deployed directly — their dependencies are.\n // MCP servers are configured in skaile.yaml, not deployed to driver target dirs.\n if (entry.kind === \"bundle\" || entry.kind === \"mcp-server\") return true;\n\n // Agents need framework-specific rendering via the enriched installAgent path\n if (entry.kind === \"agent\") {\n const workspaceRoot = cwd ?? process.cwd();\n const agentDeployDir = deployedBase(\n \"agent\" as AiComponent,\n driverTarget as DriverTarget,\n globalInstall,\n cwd,\n );\n const targetMap = DRIVER_TARGETS[driverTarget as DriverTarget];\n const skillsRelDir = targetMap?.local.skill ?? \"\";\n const wsConfig = resolveSkWorkspaceConfig(workspaceRoot);\n const name = basename(entry.source);\n const srcDir = DIRECTORY_MANIFESTS.has(name) ? dirname(entry.source) : entry.source;\n const result = installAgent(\n srcDir,\n agentDeployDir,\n workspaceRoot,\n driverTarget,\n skillsRelDir,\n entry.name,\n /* includeSubAgents */ true,\n new Set<string>(),\n wsConfig,\n log,\n );\n for (const w of result.warnings) log(` warn: ${w}`);\n if (result.created.length > 0) return true;\n // Fall through to raw deploy if renderer produces no files (unsupported framework, etc.)\n }\n\n const dest = deployedDir(entry.kind as AiComponent, entry.name, driverTarget, globalInstall, cwd);\n mkdirSync(dirname(dest), { recursive: true });\n\n // Determine if local or remote\n const repoDecl = entry.repository ? repositories[entry.repository] : undefined;\n const isLocal = repoDecl?.path != null;\n\n if (isLocal) {\n symlinkFromManifest(entry.source, dest);\n log(` symlink ${entry.kind}:${entry.name}`);\n return true;\n } else {\n copyFromManifest(entry.source, dest);\n log(` copy ${entry.kind}:${entry.name}`);\n return true;\n }\n}\n\n/**\n * Deploy all resolved assets, applying patches where configured.\n *\n * Already-deployed assets are skipped unless their deployed manifest content differs\n * from the source. This handles copies (remote repos) that have gone stale after a\n * source update. Symlinked (local) repos always resolve to the live source, so their\n * hashes always match and they are never needlessly re-linked.\n *\n * @param resolved - Catalog entries to deploy (output of `resolveAll`).\n * @param repositories - Repository declarations from `skaile.yaml`.\n * @param patches - Map of `kind:name` → patch file path for patch application.\n * @param opts - Deployment target options.\n * @param log - Optional logger callback for progress messages.\n * @returns Array of asset refs (`kind:name`) that were newly deployed in this call.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function deployAll(\n resolved: CatalogEntry[],\n repositories: Record<string, RepositoryDeclaration>,\n patches: Record<string, string>,\n opts: DeployOptions = {},\n log: Log = noop,\n): string[] {\n const deployed: string[] = [];\n const driverTarget = opts.driverTarget ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n for (const entry of resolved) {\n // Skip non-deployable asset kinds — bundles are resolved to their contents,\n // mcp-servers are wired at session startup, and mixin kinds (persona, ruleset,\n // knowledge) are resolved by the mixin-resolver at session creation time.\n if (\n entry.kind === \"bundle\" ||\n entry.kind === \"mcp-server\" ||\n entry.kind === \"persona\" ||\n entry.kind === \"ruleset\" ||\n entry.kind === \"knowledge\"\n )\n continue;\n\n const ref = `${entry.kind}:${entry.name}`;\n\n if (isDeployed(entry.kind as AiComponent, entry.name, driverTarget, globalInstall, cwd)) {\n // Compare the deployed manifest file against the source to detect stale copies.\n // For symlinks the deployed path resolves through to the source file, so hashes\n // always match — symlinked installs are never needlessly re-linked.\n const dest = deployedDir(\n entry.kind as AiComponent,\n entry.name,\n driverTarget,\n globalInstall,\n cwd,\n );\n const manifestName = basename(entry.source);\n const deployedManifest = join(dest, manifestName);\n try {\n const srcHash = computeHash(entry.source);\n const depHash = computeHash(deployedManifest);\n if (srcHash === depHash) {\n log(` already deployed: ${ref}`);\n continue;\n }\n log(` updating: ${ref} (content changed)`);\n // fall through to redeploy\n } catch {\n // Deployed manifest unreadable (e.g. agent rendered to a different path) — skip\n log(` already deployed: ${ref}`);\n continue;\n }\n }\n\n deployAsset(entry, repositories, opts, log);\n deployed.push(ref);\n\n // Apply patch if configured\n const patchFile = patches[ref];\n if (patchFile && existsSync(patchFile)) {\n const dest = deployedDir(\n entry.kind as AiComponent,\n entry.name,\n driverTarget,\n globalInstall,\n cwd,\n );\n if (applyPatch(dest, patchFile)) {\n log(` patched ${ref}`);\n } else {\n log(` patch failed for ${ref}`);\n }\n }\n }\n\n return deployed;\n}\n\n/**\n * Remove a deployed asset from the framework directory.\n *\n * Removes symlinks with `unlink`; removes copied directories with `rm -rf`.\n *\n * @param kind - Asset kind (`skill`, `agent`, `prompt`, `flow`, `contract`).\n * @param name - Asset name as registered in the catalog.\n * @param opts - Deployment target options (must match the options used at install time).\n * @returns `true` if the asset existed and was removed; `false` if it was not deployed.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function removeAsset(kind: string, name: string, opts: DeployOptions = {}): boolean {\n const driverTarget = opts.driverTarget ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n const dest = deployedDir(kind as AiComponent, name, driverTarget, globalInstall, cwd);\n try {\n const s = lstatSync(dest);\n if (s.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n}\n\n// ── Scaffold ─────────────────────────────────────────────────────────────────\n\nconst SKILL_TEMPLATE = `---\nname: \"{name}\"\ndescription: \"\"\nmetadata:\n version: \"0.1.0\"\n---\n\n# {name}\n\nSkill prompt goes here.\n`;\n\nconst BUNDLE_TEMPLATE = `name: {name}\ndescription: A curated set of assets\nversion: 0.1.0\ndependencies:\n - skill:example-skill\n`;\n\nconst FLOW_TEMPLATE = `id: \"{name}\"\nversion: \"0.1.0\"\nname: \"{name}\"\ndescription: Flow description\n\nglobals:\n approval_mode: checkpoint\n\nnodes: []\n`;\n\n/**\n * Create a minimal scaffold directory for a new asset.\n *\n * Writes the appropriate manifest file (`SKILL.md`, `AGENT.md`, `CONTRACT.md`,\n * `<name>.bundle.yaml`, `<name>.flow.yaml`, or `<name>.prompt.md`) inside a\n * new `<destDir>/<name>/` directory.\n *\n * @param name - Asset name (also used as the directory name).\n * @param kind - Asset kind: `skill` | `agent` | `bundle` | `flow` | `prompt` | `contract`.\n * @param destDir - Parent directory to create the asset in.\n * @returns `{ ok: true, path }` on success, `{ ok: false, path: errorMessage }` if the\n * directory already exists.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function createScaffold(\n name: string,\n kind: string,\n destDir: string,\n): { ok: boolean; path: string } {\n const dest = join(destDir, name);\n if (existsSync(dest)) {\n return { ok: false, path: `Directory '${name}' already exists in ${destDir}` };\n }\n mkdirSync(dest, { recursive: true });\n\n if (kind === \"bundle\") {\n writeFileSync(join(dest, `${name}.bundle.yaml`), BUNDLE_TEMPLATE.replace(/\\{name\\}/g, name), \"utf8\");\n } else if (kind === \"flow\") {\n writeFileSync(join(dest, `${name}.flow.yaml`), FLOW_TEMPLATE.replace(/\\{name\\}/g, name), \"utf8\");\n } else if (kind === \"prompt\") {\n writeFileSync(join(dest, `${name}.prompt.md`), SKILL_TEMPLATE.replace(/\\{name\\}/g, name), \"utf8\");\n } else if (kind === \"agent\") {\n writeFileSync(join(dest, \"AGENT.md\"), SKILL_TEMPLATE.replace(/\\{name\\}/g, name), \"utf8\");\n } else if (kind === \"contract\") {\n writeFileSync(join(dest, \"CONTRACT.md\"), SKILL_TEMPLATE.replace(/\\{name\\}/g, name), \"utf8\");\n } else {\n // Default: skill\n writeFileSync(join(dest, \"SKILL.md\"), SKILL_TEMPLATE.replace(/\\{name\\}/g, name), \"utf8\");\n }\n\n return { ok: true, path: dest };\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  import { discoverAssetsInTree, loadSourceConfig } from './chunk-GKIA2PU5.js';
2
2
  import { PresetManifestSchema } from './chunk-NELZIQ2E.js';
3
- import { __export, __require } from './chunk-NSBPE2FW.js';
3
+ import { __export } from './chunk-NSBPE2FW.js';
4
4
  import * as crypto from 'crypto';
5
5
  import { createHash } from 'crypto';
6
- import * as fs11 from 'fs';
6
+ import * as fs12 from 'fs';
7
7
  import * as path4 from 'path';
8
8
  import { resolve, join, sep, dirname, isAbsolute } from 'path';
9
9
  import { eq, like, and } from 'drizzle-orm';
@@ -13,8 +13,8 @@ import { stringify, parse, parseDocument } from 'yaml';
13
13
  import { createClient } from '@libsql/client';
14
14
  import { drizzle } from 'drizzle-orm/libsql';
15
15
  import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
16
- import { rm, mkdir, writeFile } from 'fs/promises';
17
16
  import { spawnSync } from 'child_process';
17
+ import { rm, mkdir, writeFile } from 'fs/promises';
18
18
 
19
19
  // library/src/library.ts
20
20
  var KNOWN_ASSET_KINDS = [
@@ -138,9 +138,9 @@ function projectConfigPath(projectDir) {
138
138
  return path4.join(projectDir, ".skaile", CONFIG_FILENAME);
139
139
  }
140
140
  function loadConfigFile(filePath) {
141
- if (!fs11.existsSync(filePath)) return null;
141
+ if (!fs12.existsSync(filePath)) return null;
142
142
  try {
143
- const content = fs11.readFileSync(filePath, "utf-8");
143
+ const content = fs12.readFileSync(filePath, "utf-8");
144
144
  const raw = parse(content);
145
145
  if (!raw || typeof raw !== "object") return null;
146
146
  return SkaileConfigSchema.partial().parse(raw);
@@ -189,10 +189,10 @@ function resolveConfig(opts) {
189
189
  }
190
190
  function saveConfig(filePath, config) {
191
191
  const dir = path4.dirname(filePath);
192
- if (!fs11.existsSync(dir)) {
193
- fs11.mkdirSync(dir, { recursive: true });
192
+ if (!fs12.existsSync(dir)) {
193
+ fs12.mkdirSync(dir, { recursive: true });
194
194
  }
195
- fs11.writeFileSync(filePath, stringify(config, { indent: 2 }), "utf-8");
195
+ fs12.writeFileSync(filePath, stringify(config, { indent: 2 }), "utf-8");
196
196
  }
197
197
 
198
198
  // library/src/local/schema.ts
@@ -293,9 +293,9 @@ function deriveSlug(sourceConfig, sourcePath, existingSlugs) {
293
293
  }
294
294
  function listSidecarSlugsOnDisk() {
295
295
  const root = getSidecarRoot();
296
- if (!fs11.existsSync(root)) return [];
296
+ if (!fs12.existsSync(root)) return [];
297
297
  const out = [];
298
- for (const entry of fs11.readdirSync(root, { withFileTypes: true })) {
298
+ for (const entry of fs12.readdirSync(root, { withFileTypes: true })) {
299
299
  if (!entry.isDirectory()) continue;
300
300
  if (entry.name.startsWith(".")) continue;
301
301
  out.push(entry.name);
@@ -320,25 +320,25 @@ function migratedMarkerPath() {
320
320
  function migrateSidecarsToStoreIfNeeded() {
321
321
  const storeRoot = getStoreRoot();
322
322
  const marker = migratedMarkerPath();
323
- if (fs11.existsSync(marker)) return { migrated: 0, storeRoot };
323
+ if (fs12.existsSync(marker)) return { migrated: 0, storeRoot };
324
324
  const sidecarRoot = getSidecarRoot();
325
325
  const manifestsDir = getStoreManifestsDir();
326
326
  const candidates = [];
327
- if (fs11.existsSync(sidecarRoot)) {
328
- for (const entry of fs11.readdirSync(sidecarRoot, { withFileTypes: true })) {
327
+ if (fs12.existsSync(sidecarRoot)) {
328
+ for (const entry of fs12.readdirSync(sidecarRoot, { withFileTypes: true })) {
329
329
  if (!entry.isDirectory()) continue;
330
330
  if (entry.name.startsWith(".")) continue;
331
331
  const src = path4.join(sidecarRoot, entry.name, ".skaile-source.yaml");
332
- if (fs11.existsSync(src)) candidates.push({ src, slug: entry.name });
332
+ if (fs12.existsSync(src)) candidates.push({ src, slug: entry.name });
333
333
  }
334
334
  }
335
- fs11.mkdirSync(manifestsDir, { recursive: true });
335
+ fs12.mkdirSync(manifestsDir, { recursive: true });
336
336
  let migrated = 0;
337
337
  for (const { src, slug } of candidates) {
338
338
  const dest = path4.join(manifestsDir, `${slug}.yaml`);
339
- if (fs11.existsSync(dest)) continue;
339
+ if (fs12.existsSync(dest)) continue;
340
340
  try {
341
- fs11.renameSync(src, dest);
341
+ fs12.renameSync(src, dest);
342
342
  migrated++;
343
343
  } catch (err) {
344
344
  process.stderr.write(
@@ -347,11 +347,10 @@ function migrateSidecarsToStoreIfNeeded() {
347
347
  );
348
348
  }
349
349
  }
350
- if (!fs11.existsSync(path4.join(storeRoot, ".git"))) {
350
+ if (!fs12.existsSync(path4.join(storeRoot, ".git"))) {
351
351
  try {
352
- const { spawnSync: spawnSync3 } = __require("child_process");
353
- spawnSync3("git", ["init", "--quiet"], { cwd: storeRoot, stdio: "ignore" });
354
- fs11.writeFileSync(
352
+ spawnSync("git", ["init", "--quiet"], { cwd: storeRoot, stdio: "ignore" });
353
+ fs12.writeFileSync(
355
354
  path4.join(storeRoot, ".gitignore"),
356
355
  "# Remote-store cache \u2014 local to this machine.\nremote-cache/\n",
357
356
  "utf8"
@@ -359,7 +358,7 @@ function migrateSidecarsToStoreIfNeeded() {
359
358
  } catch {
360
359
  }
361
360
  }
362
- fs11.writeFileSync(marker, (/* @__PURE__ */ new Date()).toISOString(), "utf8");
361
+ fs12.writeFileSync(marker, (/* @__PURE__ */ new Date()).toISOString(), "utf8");
363
362
  return { migrated, storeRoot };
364
363
  }
365
364
 
@@ -506,11 +505,9 @@ async function runLibrariesMigration(client) {
506
505
  await client.batch(stmts);
507
506
  }
508
507
  function assertNoLegacyLibDb(newDbPath) {
509
- const fs13 = __require("fs");
510
- const os5 = __require("os");
511
- if (fs13.existsSync(newDbPath)) return;
508
+ if (fs12.existsSync(newDbPath)) return;
512
509
  const parent = path4.dirname(newDbPath);
513
- const skaileHome = path4.join(os5.homedir(), ".skaile");
510
+ const skaileHome = path4.join(os.homedir(), ".skaile");
514
511
  const defaultIndexPath2 = path4.join(skaileHome, "index.db");
515
512
  const candidates = [];
516
513
  if (path4.basename(newDbPath) === "index.db") {
@@ -524,7 +521,7 @@ function assertNoLegacyLibDb(newDbPath) {
524
521
  candidates.push(path4.join(path4.dirname(parent), "library", "lib.db"));
525
522
  }
526
523
  for (const legacy of candidates) {
527
- if (!fs13.existsSync(legacy)) continue;
524
+ if (!fs12.existsSync(legacy)) continue;
528
525
  throw new Error(
529
526
  `Found legacy index database at ${legacy}. The lib.db \u2192 index.db relocation ran for one release and has been removed. Move the file manually to ${newDbPath} (and any -wal / -shm siblings), then retry.`
530
527
  );
@@ -742,12 +739,12 @@ var LocalIndex = class {
742
739
  dbPath = resolveIndexPath();
743
740
  this._kindRegistry = optionsOrDir?.kindRegistry;
744
741
  }
745
- if (!fs11.existsSync(dir)) {
746
- fs11.mkdirSync(dir, { recursive: true });
742
+ if (!fs12.existsSync(dir)) {
743
+ fs12.mkdirSync(dir, { recursive: true });
747
744
  }
748
745
  const dbParent = path4.dirname(dbPath);
749
- if (!fs11.existsSync(dbParent)) {
750
- fs11.mkdirSync(dbParent, { recursive: true });
746
+ if (!fs12.existsSync(dbParent)) {
747
+ fs12.mkdirSync(dbParent, { recursive: true });
751
748
  }
752
749
  this.libraryDir = dir;
753
750
  this.dbPath = dbPath;
@@ -1363,8 +1360,8 @@ var LibraryManager = class {
1363
1360
  const lib = await this.requireLibrary(nameOrId);
1364
1361
  const db = await this.lib.dbHandle();
1365
1362
  await db.delete(libraries).where(eq(libraries.id, lib.id)).run();
1366
- if (opts.purge && fs11.existsSync(lib.path)) {
1367
- fs11.rmSync(lib.path, { recursive: true, force: true });
1363
+ if (opts.purge && fs12.existsSync(lib.path)) {
1364
+ fs12.rmSync(lib.path, { recursive: true, force: true });
1368
1365
  }
1369
1366
  }
1370
1367
  /**
@@ -1381,7 +1378,7 @@ var LibraryManager = class {
1381
1378
  );
1382
1379
  if (writableDefault) return { library: writableDefault, created: false };
1383
1380
  const personalPath = path4.join(librariesDir, "personal");
1384
- fs11.mkdirSync(personalPath, { recursive: true });
1381
+ fs12.mkdirSync(personalPath, { recursive: true });
1385
1382
  const lib = await this.addLibrary({
1386
1383
  name: "personal",
1387
1384
  path: personalPath,
@@ -1443,11 +1440,11 @@ var SidecarGit = class {
1443
1440
  * @docLink packages/library/concepts#sidecar-git
1444
1441
  */
1445
1442
  async ensureInitialized() {
1446
- if (!fs11.existsSync(this.rootDir)) {
1447
- fs11.mkdirSync(this.rootDir, { recursive: true });
1443
+ if (!fs12.existsSync(this.rootDir)) {
1444
+ fs12.mkdirSync(this.rootDir, { recursive: true });
1448
1445
  }
1449
1446
  const gitDir = path4.join(this.rootDir, ".git");
1450
- const freshRepo = !fs11.existsSync(gitDir);
1447
+ const freshRepo = !fs12.existsSync(gitDir);
1451
1448
  if (freshRepo) {
1452
1449
  const init = this.spawn(["init", "-b", "main"]);
1453
1450
  if (init.exitCode !== 0) {
@@ -1455,9 +1452,9 @@ var SidecarGit = class {
1455
1452
  }
1456
1453
  }
1457
1454
  const attrsPath = path4.join(this.rootDir, ".gitattributes");
1458
- if (!fs11.existsSync(attrsPath)) fs11.writeFileSync(attrsPath, GITATTRIBUTES, "utf-8");
1455
+ if (!fs12.existsSync(attrsPath)) fs12.writeFileSync(attrsPath, GITATTRIBUTES, "utf-8");
1459
1456
  const readmePath = path4.join(this.rootDir, "README.md");
1460
- if (!fs11.existsSync(readmePath)) fs11.writeFileSync(readmePath, ROOT_README, "utf-8");
1457
+ if (!fs12.existsSync(readmePath)) fs12.writeFileSync(readmePath, ROOT_README, "utf-8");
1461
1458
  if (!this.hasGlobalGitConfig("user.name")) {
1462
1459
  this.spawn(["config", "user.name", FALLBACK_USER_NAME]);
1463
1460
  }
@@ -1483,7 +1480,7 @@ var SidecarGit = class {
1483
1480
  async commit(slug, message, opts) {
1484
1481
  if (opts?.skip) return;
1485
1482
  const slugDir = path4.join(this.rootDir, slug);
1486
- if (fs11.existsSync(slugDir)) {
1483
+ if (fs12.existsSync(slugDir)) {
1487
1484
  this.spawn(["add", "--", slug]);
1488
1485
  } else {
1489
1486
  this.spawn(["add", "-A"]);
@@ -1594,8 +1591,8 @@ function parseWorkspaceV2(raw) {
1594
1591
  }
1595
1592
  function loadWorkspaceV2(dir, filename = "skaile.yaml") {
1596
1593
  const filePath = path4.join(dir, filename);
1597
- if (!fs11.existsSync(filePath)) return null;
1598
- const content = fs11.readFileSync(filePath, "utf-8");
1594
+ if (!fs12.existsSync(filePath)) return null;
1595
+ const content = fs12.readFileSync(filePath, "utf-8");
1599
1596
  const raw = parse(content);
1600
1597
  if (!raw || typeof raw !== "object") return null;
1601
1598
  return parseWorkspaceV2(raw);
@@ -1603,32 +1600,32 @@ function loadWorkspaceV2(dir, filename = "skaile.yaml") {
1603
1600
  function saveWorkspaceV2(dir, v2, filename = "skaile.yaml") {
1604
1601
  const filePath = path4.join(dir, filename);
1605
1602
  let existing = {};
1606
- if (fs11.existsSync(filePath)) {
1607
- const content = fs11.readFileSync(filePath, "utf-8");
1603
+ if (fs12.existsSync(filePath)) {
1604
+ const content = fs12.readFileSync(filePath, "utf-8");
1608
1605
  existing = parse(content) ?? {};
1609
1606
  }
1610
1607
  existing.version = 2;
1611
1608
  if (v2.library !== void 0) existing.library = v2.library;
1612
1609
  if (v2.presets_applied !== void 0) existing.presets_applied = v2.presets_applied;
1613
- if (!fs11.existsSync(dir)) {
1614
- fs11.mkdirSync(dir, { recursive: true });
1610
+ if (!fs12.existsSync(dir)) {
1611
+ fs12.mkdirSync(dir, { recursive: true });
1615
1612
  }
1616
- fs11.writeFileSync(filePath, stringify(existing, { indent: 2 }), "utf-8");
1613
+ fs12.writeFileSync(filePath, stringify(existing, { indent: 2 }), "utf-8");
1617
1614
  }
1618
1615
  var LOCK_FILENAME = "skaile.lock.yaml";
1619
1616
  function loadLockFile(dir) {
1620
1617
  const filePath = path4.join(dir, LOCK_FILENAME);
1621
- if (!fs11.existsSync(filePath)) return null;
1622
- const content = fs11.readFileSync(filePath, "utf-8");
1618
+ if (!fs12.existsSync(filePath)) return null;
1619
+ const content = fs12.readFileSync(filePath, "utf-8");
1623
1620
  const raw = parse(content);
1624
1621
  return LockFileSchema.parse(raw);
1625
1622
  }
1626
1623
  function saveLockFile(dir, lock) {
1627
1624
  const filePath = path4.join(dir, LOCK_FILENAME);
1628
- if (!fs11.existsSync(dir)) {
1629
- fs11.mkdirSync(dir, { recursive: true });
1625
+ if (!fs12.existsSync(dir)) {
1626
+ fs12.mkdirSync(dir, { recursive: true });
1630
1627
  }
1631
- fs11.writeFileSync(
1628
+ fs12.writeFileSync(
1632
1629
  filePath,
1633
1630
  `# Auto-generated by skaile. Do not edit manually.
1634
1631
  ${stringify(lock, { indent: 2 })}`,
@@ -1646,8 +1643,8 @@ function createEmptyLockFile() {
1646
1643
  }
1647
1644
  function detectWorkspaceVersion(dir, filename = "skaile.yaml") {
1648
1645
  const filePath = path4.join(dir, filename);
1649
- if (!fs11.existsSync(filePath)) return null;
1650
- const content = fs11.readFileSync(filePath, "utf-8");
1646
+ if (!fs12.existsSync(filePath)) return null;
1647
+ const content = fs12.readFileSync(filePath, "utf-8");
1651
1648
  const raw = parse(content);
1652
1649
  if (!raw || typeof raw !== "object") return null;
1653
1650
  return raw.version === 2 ? 2 : 1;
@@ -1655,7 +1652,7 @@ function detectWorkspaceVersion(dir, filename = "skaile.yaml") {
1655
1652
  var MANIFEST_FILENAME = ".skaile-source.yaml";
1656
1653
  async function writeManifestIfMissing(input) {
1657
1654
  const manifestPath = path4.join(input.libraryPath, MANIFEST_FILENAME);
1658
- if (fs11.existsSync(manifestPath)) return { wrote: false, manifestPath };
1655
+ if (fs12.existsSync(manifestPath)) return { wrote: false, manifestPath };
1659
1656
  const now = (/* @__PURE__ */ new Date()).toISOString();
1660
1657
  const yaml = `# Generated by skaile library add on ${now}
1661
1658
  # Edit by hand to inline discovered assets; or run \`skaile library refresh-manifest\`.
@@ -1664,13 +1661,13 @@ structure: ${input.structure}
1664
1661
  publisher: ""
1665
1662
  assets: []
1666
1663
  `;
1667
- fs11.writeFileSync(manifestPath, yaml, "utf-8");
1664
+ fs12.writeFileSync(manifestPath, yaml, "utf-8");
1668
1665
  if (input.ownership !== "owner") {
1669
1666
  const excludePath = path4.join(input.libraryPath, ".git", "info", "exclude");
1670
- if (fs11.existsSync(path4.dirname(excludePath))) {
1671
- const current = fs11.existsSync(excludePath) ? fs11.readFileSync(excludePath, "utf-8") : "";
1667
+ if (fs12.existsSync(path4.dirname(excludePath))) {
1668
+ const current = fs12.existsSync(excludePath) ? fs12.readFileSync(excludePath, "utf-8") : "";
1672
1669
  if (!current.includes(MANIFEST_FILENAME)) {
1673
- fs11.writeFileSync(
1670
+ fs12.writeFileSync(
1674
1671
  excludePath,
1675
1672
  (current.endsWith("\n") || current === "" ? current : `${current}
1676
1673
  `) + `# skaile-managed local-overlay manifest
@@ -1686,10 +1683,10 @@ ${MANIFEST_FILENAME}
1686
1683
  function migrateWorkspaceConfig(dir, opts) {
1687
1684
  const filename = opts?.filename ?? "skaile.yaml";
1688
1685
  const filePath = path4.join(dir, filename);
1689
- if (!fs11.existsSync(filePath)) {
1686
+ if (!fs12.existsSync(filePath)) {
1690
1687
  return { migrated: false, version: 1, warnings: ["No skaile.yaml found"] };
1691
1688
  }
1692
- const content = fs11.readFileSync(filePath, "utf-8");
1689
+ const content = fs12.readFileSync(filePath, "utf-8");
1693
1690
  const raw = parse(content);
1694
1691
  if (!raw || typeof raw !== "object") {
1695
1692
  return { migrated: false, version: 1, warnings: ["Invalid YAML content"] };
@@ -1721,7 +1718,7 @@ function migrateWorkspaceConfig(dir, opts) {
1721
1718
  } else {
1722
1719
  doc.set("version", 2);
1723
1720
  }
1724
- fs11.writeFileSync(filePath, doc.toString(), "utf-8");
1721
+ fs12.writeFileSync(filePath, doc.toString(), "utf-8");
1725
1722
  }
1726
1723
  return {
1727
1724
  migrated: !opts?.dryRun,
@@ -1904,9 +1901,9 @@ function defToCatalogAsset(def) {
1904
1901
  }
1905
1902
  function loadSourceConfigIfPresent(rootPath) {
1906
1903
  const configPath = path4.join(rootPath, ".skaile-source.yaml");
1907
- if (!fs11.existsSync(configPath)) return void 0;
1904
+ if (!fs12.existsSync(configPath)) return void 0;
1908
1905
  try {
1909
- const content = fs11.readFileSync(configPath, "utf-8");
1906
+ const content = fs12.readFileSync(configPath, "utf-8");
1910
1907
  const result = loadSourceConfig(content);
1911
1908
  if (!result.ok) return void 0;
1912
1909
  return result.config;
@@ -1992,17 +1989,17 @@ var CatalogCache = class {
1992
1989
  /** Read a cached tarball from disk if present, otherwise `null`. */
1993
1990
  readTarball(sha256) {
1994
1991
  const p = this.tarballPath(sha256);
1995
- if (!fs11.existsSync(p)) return null;
1996
- return fs11.readFileSync(p);
1992
+ if (!fs12.existsSync(p)) return null;
1993
+ return fs12.readFileSync(p);
1997
1994
  }
1998
1995
  /** Persist a tarball blob to disk (atomic write). */
1999
1996
  writeTarball(sha256, bytes) {
2000
1997
  const dir = path4.join(this.dir, TARBALL_DIR);
2001
- if (!fs11.existsSync(dir)) fs11.mkdirSync(dir, { recursive: true });
1998
+ if (!fs12.existsSync(dir)) fs12.mkdirSync(dir, { recursive: true });
2002
1999
  const finalPath = this.tarballPath(sha256);
2003
2000
  const tmpPath = `${finalPath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
2004
- fs11.writeFileSync(tmpPath, bytes);
2005
- fs11.renameSync(tmpPath, finalPath);
2001
+ fs12.writeFileSync(tmpPath, bytes);
2002
+ fs12.renameSync(tmpPath, finalPath);
2006
2003
  }
2007
2004
  // ── public: invalidation ────────────────────────────────────────────────
2008
2005
  /**
@@ -2022,8 +2019,8 @@ var CatalogCache = class {
2022
2019
  invalidateEverything() {
2023
2020
  this.invalidateAll();
2024
2021
  const tarballDir = path4.join(this.dir, TARBALL_DIR);
2025
- if (fs11.existsSync(tarballDir)) {
2026
- fs11.rmSync(tarballDir, { recursive: true, force: true });
2022
+ if (fs12.existsSync(tarballDir)) {
2023
+ fs12.rmSync(tarballDir, { recursive: true, force: true });
2027
2024
  }
2028
2025
  }
2029
2026
  /** Return whether `ttlMs` is zero (air-gapped mode). */
@@ -2032,9 +2029,9 @@ var CatalogCache = class {
2032
2029
  }
2033
2030
  // ── private ─────────────────────────────────────────────────────────────
2034
2031
  ensureDir() {
2035
- if (!fs11.existsSync(this.dir)) fs11.mkdirSync(this.dir, { recursive: true });
2032
+ if (!fs12.existsSync(this.dir)) fs12.mkdirSync(this.dir, { recursive: true });
2036
2033
  const tarballDir = path4.join(this.dir, TARBALL_DIR);
2037
- if (!fs11.existsSync(tarballDir)) fs11.mkdirSync(tarballDir, { recursive: true });
2034
+ if (!fs12.existsSync(tarballDir)) fs12.mkdirSync(tarballDir, { recursive: true });
2038
2035
  }
2039
2036
  indexPath() {
2040
2037
  return path4.join(this.dir, INDEX_FILE);
@@ -2042,12 +2039,12 @@ var CatalogCache = class {
2042
2039
  loadIndex() {
2043
2040
  if (this.index) return this.index;
2044
2041
  const p = this.indexPath();
2045
- if (!fs11.existsSync(p)) {
2042
+ if (!fs12.existsSync(p)) {
2046
2043
  this.index = { version: 1, resolve: {}, list: {} };
2047
2044
  return this.index;
2048
2045
  }
2049
2046
  try {
2050
- const raw = JSON.parse(fs11.readFileSync(p, "utf-8"));
2047
+ const raw = JSON.parse(fs12.readFileSync(p, "utf-8"));
2051
2048
  if (raw && typeof raw === "object" && raw.version === 1) {
2052
2049
  this.index = {
2053
2050
  version: 1,
@@ -2065,8 +2062,8 @@ var CatalogCache = class {
2065
2062
  this.index = idx;
2066
2063
  const p = this.indexPath();
2067
2064
  const tmp = `${p}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
2068
- fs11.writeFileSync(tmp, JSON.stringify(idx, null, 2), "utf-8");
2069
- fs11.renameSync(tmp, p);
2065
+ fs12.writeFileSync(tmp, JSON.stringify(idx, null, 2), "utf-8");
2066
+ fs12.renameSync(tmp, p);
2070
2067
  }
2071
2068
  };
2072
2069
  function filterKey(filter) {
@@ -2799,9 +2796,9 @@ function validateKnowledge(data) {
2799
2796
  }
2800
2797
  function collectDirRecursive(baseDir, relativeDir) {
2801
2798
  const full = path4.join(baseDir, relativeDir);
2802
- if (!fs11.existsSync(full) || !fs11.statSync(full).isDirectory()) return [];
2799
+ if (!fs12.existsSync(full) || !fs12.statSync(full).isDirectory()) return [];
2803
2800
  const results = [];
2804
- for (const entry of fs11.readdirSync(full, { withFileTypes: true })) {
2801
+ for (const entry of fs12.readdirSync(full, { withFileTypes: true })) {
2805
2802
  const rel = path4.posix.join(relativeDir, entry.name);
2806
2803
  if (entry.isDirectory()) {
2807
2804
  results.push(...collectDirRecursive(baseDir, rel));
@@ -3511,5 +3508,5 @@ function deepEqual(a, b) {
3511
3508
  }
3512
3509
 
3513
3510
  export { CatalogCache, CatalogConfigSchema, CatalogHttpError, DuplicateLibraryNameError, DuplicateSubscriptionError, GitSyncDriver, InstanceHasConsumersError, InstanceNotFoundError, InterpolationError, KNOWN_ASSET_KINDS, KnowledgeManifestSchema, LIBRARY_BACKENDS, LIBRARY_OWNERSHIPS, LIBRARY_STRUCTURES, LOCAL_CATALOG_URL, LibraryConfigSchema, LibraryError, LibraryInstanceRefSchema, LibraryManager, LibrarySectionSchema, LibrarySyncError, LocalCatalogSource, LocalIndex, LocalSyncDriver, LockFileSchema, LockSubscriptionSchema, OfflineError, OperationNotPermittedError, PIN_POLICIES, PinPolicySchema, PresetAppliedSchema, PresetExpandedSchema, RemoteCatalogSource, RequiresEdgeSchema, RestCatalogSource, SidecarGit, SkaileConfigSchema, SourceNotFoundError, SubscriptionNotFoundError, TarballHashMismatchError, UserLibraryNotFoundError, WorkspaceConfigV2Schema, applyNonStructuralUpgrade, applyPreset, applyPresetFromData, classifyRef, createEmptyLockFile, deriveSlug, detectChanges, detectNestedPresetRefs, detectWorkspaceVersion, evaluateUpgrade, extractLibraryInstanceId, extractReferencedKeys, filterKey, getConfigDefaults, getDefaultValue, getSidecarRoot, getStoreManifestsDir, getStoreRoot, hasInterpolationTokens, installFromManifest, interpolate, isLocalCatalogUrl, isSecretPlaceholder, knowledgeKindProvider, listSidecarSlugsOnDisk, loadLockFile, loadWorkspaceV2, migrateSidecarsToStoreIfNeeded, migrateWorkspaceConfig, parsePreset, parsePresetYaml, parseWorkspaceV2, projectConfigPath, queryInstancePickerChoices, resolveAllItems, resolveConfig, resolveIndexPath, resolveItem, resolveLibraryDir, resolvePin, resolveSidecarPaths, saveConfig, saveLockFile, saveWorkspaceV2, sha256Hex, skaileHomeDir, storeSecrets, trpcGetUrl, userConfigPath, validateAllPlaceholders, validateKnowledge, validateNestingDepth, validatePlaceholder, writeManifestIfMissing };
3514
- //# sourceMappingURL=chunk-2NIOMFSQ.js.map
3515
- //# sourceMappingURL=chunk-2NIOMFSQ.js.map
3511
+ //# sourceMappingURL=chunk-FNCYNUGS.js.map
3512
+ //# sourceMappingURL=chunk-FNCYNUGS.js.map