@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.
- package/CHANGELOG.md +35 -0
- package/dist/asset-manager/index.js +2 -2
- package/dist/asset-manager/installer.js +1 -1
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/installer.d.ts.map +1 -1
- package/dist/base-assets/connectors/flow/run-flow.js +1 -1
- package/dist/{chunk-SO43XRWF.js → chunk-67TJEQJE.js} +2 -2
- package/dist/{chunk-SO43XRWF.js.map → chunk-67TJEQJE.js.map} +1 -1
- package/dist/{chunk-7R4WLTZW.js → chunk-DEZVZSBN.js} +11 -16
- package/dist/chunk-DEZVZSBN.js.map +1 -0
- package/dist/{chunk-4GEVGRWB.js → chunk-ERCOCLW5.js} +9 -11
- package/dist/chunk-ERCOCLW5.js.map +1 -0
- package/dist/{chunk-2NIOMFSQ.js → chunk-FNCYNUGS.js} +78 -81
- package/dist/chunk-FNCYNUGS.js.map +1 -0
- package/dist/{chunk-Z24KPZKU.js → chunk-HJV7MHG5.js} +2 -2
- package/dist/{chunk-Z24KPZKU.js.map → chunk-HJV7MHG5.js.map} +1 -1
- package/dist/{chunk-6EN5IJ2Y.js → chunk-IY4X7PZN.js} +3 -3
- package/dist/{chunk-6EN5IJ2Y.js.map → chunk-IY4X7PZN.js.map} +1 -1
- package/dist/cli/index.js +146 -98
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/manage.d.ts +31 -20
- package/dist/cli/src/commands/manage.d.ts.map +1 -1
- package/dist/library/index.js +1 -1
- package/dist/library/src/local/db.d.ts.map +1 -1
- package/dist/library/src/local/store-paths.d.ts.map +1 -1
- package/dist/{open-library-XD7QYLMW.js → open-library-T6RXQJTQ.js} +4 -4
- package/dist/{open-library-XD7QYLMW.js.map → open-library-T6RXQJTQ.js.map} +1 -1
- package/dist/runner/index.js +1 -1
- package/dist/sdk/asset-manager.js +2 -2
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/runner.js +1 -1
- package/dist/tui/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2NIOMFSQ.js.map +0 -1
- package/dist/chunk-4GEVGRWB.js.map +0 -1
- 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 {
|
|
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
|
-
|
|
344
|
+
writeFileSync(join(dest, `${name}.bundle.yaml`), BUNDLE_TEMPLATE.replace(/\{name\}/g, name), "utf8");
|
|
347
345
|
} else if (kind === "flow") {
|
|
348
|
-
|
|
346
|
+
writeFileSync(join(dest, `${name}.flow.yaml`), FLOW_TEMPLATE.replace(/\{name\}/g, name), "utf8");
|
|
349
347
|
} else if (kind === "prompt") {
|
|
350
|
-
|
|
348
|
+
writeFileSync(join(dest, `${name}.prompt.md`), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
|
|
351
349
|
} else if (kind === "agent") {
|
|
352
|
-
|
|
350
|
+
writeFileSync(join(dest, "AGENT.md"), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
|
|
353
351
|
} else if (kind === "contract") {
|
|
354
|
-
|
|
352
|
+
writeFileSync(join(dest, "CONTRACT.md"), SKILL_TEMPLATE.replace(/\{name\}/g, name), "utf8");
|
|
355
353
|
} else {
|
|
356
|
-
|
|
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-
|
|
363
|
-
//# sourceMappingURL=chunk-
|
|
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
|
|
3
|
+
import { __export } from './chunk-NSBPE2FW.js';
|
|
4
4
|
import * as crypto from 'crypto';
|
|
5
5
|
import { createHash } from 'crypto';
|
|
6
|
-
import * as
|
|
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 (!
|
|
141
|
+
if (!fs12.existsSync(filePath)) return null;
|
|
142
142
|
try {
|
|
143
|
-
const content =
|
|
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 (!
|
|
193
|
-
|
|
192
|
+
if (!fs12.existsSync(dir)) {
|
|
193
|
+
fs12.mkdirSync(dir, { recursive: true });
|
|
194
194
|
}
|
|
195
|
-
|
|
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 (!
|
|
296
|
+
if (!fs12.existsSync(root)) return [];
|
|
297
297
|
const out = [];
|
|
298
|
-
for (const entry of
|
|
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 (
|
|
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 (
|
|
328
|
-
for (const entry of
|
|
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 (
|
|
332
|
+
if (fs12.existsSync(src)) candidates.push({ src, slug: entry.name });
|
|
333
333
|
}
|
|
334
334
|
}
|
|
335
|
-
|
|
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 (
|
|
339
|
+
if (fs12.existsSync(dest)) continue;
|
|
340
340
|
try {
|
|
341
|
-
|
|
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 (!
|
|
350
|
+
if (!fs12.existsSync(path4.join(storeRoot, ".git"))) {
|
|
351
351
|
try {
|
|
352
|
-
|
|
353
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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 (!
|
|
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 (!
|
|
746
|
-
|
|
742
|
+
if (!fs12.existsSync(dir)) {
|
|
743
|
+
fs12.mkdirSync(dir, { recursive: true });
|
|
747
744
|
}
|
|
748
745
|
const dbParent = path4.dirname(dbPath);
|
|
749
|
-
if (!
|
|
750
|
-
|
|
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 &&
|
|
1367
|
-
|
|
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
|
-
|
|
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 (!
|
|
1447
|
-
|
|
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 = !
|
|
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 (!
|
|
1455
|
+
if (!fs12.existsSync(attrsPath)) fs12.writeFileSync(attrsPath, GITATTRIBUTES, "utf-8");
|
|
1459
1456
|
const readmePath = path4.join(this.rootDir, "README.md");
|
|
1460
|
-
if (!
|
|
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 (
|
|
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 (!
|
|
1598
|
-
const content =
|
|
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 (
|
|
1607
|
-
const content =
|
|
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 (!
|
|
1614
|
-
|
|
1610
|
+
if (!fs12.existsSync(dir)) {
|
|
1611
|
+
fs12.mkdirSync(dir, { recursive: true });
|
|
1615
1612
|
}
|
|
1616
|
-
|
|
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 (!
|
|
1622
|
-
const content =
|
|
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 (!
|
|
1629
|
-
|
|
1625
|
+
if (!fs12.existsSync(dir)) {
|
|
1626
|
+
fs12.mkdirSync(dir, { recursive: true });
|
|
1630
1627
|
}
|
|
1631
|
-
|
|
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 (!
|
|
1650
|
-
const content =
|
|
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 (
|
|
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
|
-
|
|
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 (
|
|
1671
|
-
const current =
|
|
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
|
-
|
|
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 (!
|
|
1686
|
+
if (!fs12.existsSync(filePath)) {
|
|
1690
1687
|
return { migrated: false, version: 1, warnings: ["No skaile.yaml found"] };
|
|
1691
1688
|
}
|
|
1692
|
-
const content =
|
|
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
|
-
|
|
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 (!
|
|
1904
|
+
if (!fs12.existsSync(configPath)) return void 0;
|
|
1908
1905
|
try {
|
|
1909
|
-
const content =
|
|
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 (!
|
|
1996
|
-
return
|
|
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 (!
|
|
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
|
-
|
|
2005
|
-
|
|
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 (
|
|
2026
|
-
|
|
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 (!
|
|
2032
|
+
if (!fs12.existsSync(this.dir)) fs12.mkdirSync(this.dir, { recursive: true });
|
|
2036
2033
|
const tarballDir = path4.join(this.dir, TARBALL_DIR);
|
|
2037
|
-
if (!
|
|
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 (!
|
|
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(
|
|
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
|
-
|
|
2069
|
-
|
|
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 (!
|
|
2799
|
+
if (!fs12.existsSync(full) || !fs12.statSync(full).isDirectory()) return [];
|
|
2803
2800
|
const results = [];
|
|
2804
|
-
for (const entry of
|
|
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-
|
|
3515
|
-
//# sourceMappingURL=chunk-
|
|
3511
|
+
//# sourceMappingURL=chunk-FNCYNUGS.js.map
|
|
3512
|
+
//# sourceMappingURL=chunk-FNCYNUGS.js.map
|