@skaile/workspaces 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/dist/{asset-feeds-WKIKSZ6Z.js → asset-feeds-77KLWCBP.js} +9 -9
  3. package/dist/{asset-feeds-WKIKSZ6Z.js.map → asset-feeds-77KLWCBP.js.map} +1 -1
  4. package/dist/asset-manager/index.js +7 -7
  5. package/dist/asset-manager/installer.js +6 -6
  6. package/dist/base-assets/connectors/deploy.js +7 -7
  7. package/dist/base-assets/connectors/devserver.js +7 -7
  8. package/dist/base-assets/connectors/flow/adapter.js +7 -7
  9. package/dist/base-assets/connectors/flow/run-flow.js +8 -8
  10. package/dist/base-assets/connectors/flow.js +7 -7
  11. package/dist/base-assets/connectors/git.js +7 -7
  12. package/dist/base-assets/connectors/gmail.js +7 -7
  13. package/dist/base-assets/connectors/googledrive/driver.d.ts.map +1 -1
  14. package/dist/base-assets/connectors/googledrive.js +7 -7
  15. package/dist/base-assets/connectors/local.js +7 -7
  16. package/dist/base-assets/connectors/mattermost.js +7 -7
  17. package/dist/base-assets/connectors/memory.js +7 -7
  18. package/dist/base-assets/connectors/minio.js +7 -7
  19. package/dist/base-assets/connectors/postgres.js +7 -7
  20. package/dist/base-assets/connectors/s3.js +7 -7
  21. package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +1 -1
  22. package/dist/base-assets/connectors/sharepoint.js +7 -7
  23. package/dist/base-assets/connectors/sqlite.js +7 -7
  24. package/dist/base-assets/connectors/static-server.js +7 -7
  25. package/dist/base-assets/connectors/tunnel.js +7 -7
  26. package/dist/base-assets/connectors/webdav/driver.d.ts.map +1 -1
  27. package/dist/base-assets/connectors/webdav.js +7 -7
  28. package/dist/base-assets/connectors/xstate-store/adapter.d.ts +1 -1
  29. package/dist/base-assets/connectors/xstate-store/adapter.d.ts.map +1 -1
  30. package/dist/base-assets/connectors/xstate-store.js +7 -7
  31. package/dist/base-assets/connectors/xstate.js +7 -7
  32. package/dist/{chunk-542K7SR6.js → chunk-3QTZWPGH.js} +36 -7
  33. package/dist/chunk-3QTZWPGH.js.map +1 -0
  34. package/dist/{chunk-46COM7M5.js → chunk-4FADEVBN.js} +4 -4
  35. package/dist/{chunk-46COM7M5.js.map → chunk-4FADEVBN.js.map} +1 -1
  36. package/dist/{chunk-AFLH7B64.js → chunk-4FJE6BI6.js} +3 -3
  37. package/dist/{chunk-AFLH7B64.js.map → chunk-4FJE6BI6.js.map} +1 -1
  38. package/dist/{chunk-OVQZ5OKL.js → chunk-4QVFQEY2.js} +2 -2
  39. package/dist/{chunk-OVQZ5OKL.js.map → chunk-4QVFQEY2.js.map} +1 -1
  40. package/dist/{chunk-BTAC2VYT.js → chunk-B4ZXBH57.js} +7 -7
  41. package/dist/{chunk-BTAC2VYT.js.map → chunk-B4ZXBH57.js.map} +1 -1
  42. package/dist/{chunk-DZCFFTAX.js → chunk-BJWUSHC4.js} +336 -113
  43. package/dist/chunk-BJWUSHC4.js.map +1 -0
  44. package/dist/{chunk-2F3RUZXC.js → chunk-DCAWIRD6.js} +15 -6
  45. package/dist/chunk-DCAWIRD6.js.map +1 -0
  46. package/dist/{chunk-QTWA6BZK.js → chunk-FJFHJBGS.js} +5 -5
  47. package/dist/{chunk-QTWA6BZK.js.map → chunk-FJFHJBGS.js.map} +1 -1
  48. package/dist/{chunk-DH4N5AW4.js → chunk-GL45UNVS.js} +3 -3
  49. package/dist/{chunk-DH4N5AW4.js.map → chunk-GL45UNVS.js.map} +1 -1
  50. package/dist/{chunk-LJ52ZKIU.js → chunk-KT3CK26V.js} +3 -3
  51. package/dist/{chunk-LJ52ZKIU.js.map → chunk-KT3CK26V.js.map} +1 -1
  52. package/dist/{chunk-2RFOFHSM.js → chunk-QXC62DOF.js} +4 -4
  53. package/dist/{chunk-2RFOFHSM.js.map → chunk-QXC62DOF.js.map} +1 -1
  54. package/dist/{chunk-ODPII24X.js → chunk-SETTLPBD.js} +3 -3
  55. package/dist/{chunk-ODPII24X.js.map → chunk-SETTLPBD.js.map} +1 -1
  56. package/dist/{chunk-5ESCS2OS.js → chunk-UD4ZLXGS.js} +4 -4
  57. package/dist/{chunk-5ESCS2OS.js.map → chunk-UD4ZLXGS.js.map} +1 -1
  58. package/dist/{chunk-YX3UWPJ5.js → chunk-WIAHJOMG.js} +19 -49
  59. package/dist/chunk-WIAHJOMG.js.map +1 -0
  60. package/dist/{chunk-E4UJ7CVK.js → chunk-XMP6XTMF.js} +213 -57
  61. package/dist/chunk-XMP6XTMF.js.map +1 -0
  62. package/dist/{chunk-Z3M5K67G.js → chunk-XVL22AWE.js} +3 -3
  63. package/dist/{chunk-Z3M5K67G.js.map → chunk-XVL22AWE.js.map} +1 -1
  64. package/dist/cli/index.js +160 -46
  65. package/dist/cli/index.js.map +1 -1
  66. package/dist/cli/src/commands/project.d.ts.map +1 -1
  67. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  68. package/dist/connectors/config.js +6 -6
  69. package/dist/connectors/index.js +7 -7
  70. package/dist/connectors/src/connector-manager.d.ts +49 -0
  71. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  72. package/dist/connectors/src/connector-types.d.ts +16 -0
  73. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  74. package/dist/core/index.js +5 -5
  75. package/dist/core/manifest.js +2 -2
  76. package/dist/core/models.js +1 -1
  77. package/dist/core/runtime-assets.js +4 -4
  78. package/dist/core/src/index.d.ts +2 -2
  79. package/dist/core/src/index.d.ts.map +1 -1
  80. package/dist/core/src/models.d.ts +10 -3
  81. package/dist/core/src/models.d.ts.map +1 -1
  82. package/dist/core/src/workspace-config.d.ts +21 -0
  83. package/dist/core/src/workspace-config.d.ts.map +1 -1
  84. package/dist/core/workspace-config.js +3 -3
  85. package/dist/deploy/index.js +5 -5
  86. package/dist/discovery/index.js +3 -3
  87. package/dist/{ensure-sources-OJUBGX6Z.js → ensure-sources-7MOOKY3K.js} +9 -9
  88. package/dist/{ensure-sources-OJUBGX6Z.js.map → ensure-sources-7MOOKY3K.js.map} +1 -1
  89. package/dist/library/index.js +12 -4
  90. package/dist/library/src/install/install-from-manifest.d.ts.map +1 -1
  91. package/dist/open-library-GW7DWWNZ.js +21 -0
  92. package/dist/{open-library-67FSSQWE.js.map → open-library-GW7DWWNZ.js.map} +1 -1
  93. package/dist/{plugin-store-IZ5SCRAV.js → plugin-store-R32NH7JE.js} +7 -7
  94. package/dist/{plugin-store-IZ5SCRAV.js.map → plugin-store-R32NH7JE.js.map} +1 -1
  95. package/dist/runner/index.js +9 -9
  96. package/dist/runner/src/external-mcp.d.ts +112 -0
  97. package/dist/runner/src/external-mcp.d.ts.map +1 -0
  98. package/dist/runner/src/resources.d.ts +22 -1
  99. package/dist/runner/src/resources.d.ts.map +1 -1
  100. package/dist/runner/src/serve.d.ts.map +1 -1
  101. package/dist/runner/src/session-builder.d.ts +19 -0
  102. package/dist/runner/src/session-builder.d.ts.map +1 -1
  103. package/dist/sdk/asset-manager.js +7 -7
  104. package/dist/sdk/core.js +5 -5
  105. package/dist/sdk/index.js +9 -9
  106. package/dist/sdk/runner.js +9 -9
  107. package/dist/{setup-J7CYEQOF.js → setup-SRPBQOHY.js} +7 -7
  108. package/dist/{setup-J7CYEQOF.js.map → setup-SRPBQOHY.js.map} +1 -1
  109. package/dist/store-client-INZD2RYD.js +14 -0
  110. package/dist/{store-client-AEI6Y3KD.js.map → store-client-INZD2RYD.js.map} +1 -1
  111. package/dist/tui/index.js +9 -9
  112. package/dist/types/src/install-manifest.d.ts +1 -1
  113. package/dist/types/src/install-manifest.d.ts.map +1 -1
  114. package/dist/workspace-plugin/index.js +1 -1
  115. package/package.json +1 -1
  116. package/dist/chunk-2F3RUZXC.js.map +0 -1
  117. package/dist/chunk-542K7SR6.js.map +0 -1
  118. package/dist/chunk-DZCFFTAX.js.map +0 -1
  119. package/dist/chunk-E4UJ7CVK.js.map +0 -1
  120. package/dist/chunk-YX3UWPJ5.js.map +0 -1
  121. package/dist/open-library-67FSSQWE.js +0 -13
  122. package/dist/store-client-AEI6Y3KD.js +0 -14
package/dist/cli/index.js CHANGED
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
- import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-46COM7M5.js';
2
+ import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-4FADEVBN.js';
3
3
  import { logErr, S, logOk, colorRef, logInfo, logWarn, kindColorPad, kindColor, formatRelativeTime, fitWidth } from '../chunk-WSZAFRQL.js';
4
- import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-AFLH7B64.js';
4
+ import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-4FJE6BI6.js';
5
5
  import { AI_RESOURCES } from '../chunk-2M3XTMOL.js';
6
6
  import { LocalSecretsProvider } from '../chunk-JDX54X4Y.js';
7
- import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-2F3RUZXC.js';
7
+ import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-DCAWIRD6.js';
8
8
  import '../chunk-R7FOF242.js';
9
- import '../chunk-LJ52ZKIU.js';
9
+ import '../chunk-KT3CK26V.js';
10
10
  import '../chunk-OKRUTSG7.js';
11
- import { runFlow, resumeFlow } from '../chunk-QTWA6BZK.js';
11
+ import { runFlow, resumeFlow } from '../chunk-FJFHJBGS.js';
12
12
  import '../chunk-GCJXPUHG.js';
13
13
  import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-IPUYL6TD.js';
14
- import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-DZCFFTAX.js';
15
- import { buildClaudePluginFiles } from '../chunk-OVQZ5OKL.js';
14
+ import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-BJWUSHC4.js';
15
+ import { buildClaudePluginFiles } from '../chunk-4QVFQEY2.js';
16
16
  import '../chunk-X5YPJV4N.js';
17
17
  import '../chunk-O7SG5PC2.js';
18
18
  import '../chunk-7QBNJTTQ.js';
@@ -27,23 +27,23 @@ import '../chunk-KOVLSBXK.js';
27
27
  import '../chunk-RRVQAE5D.js';
28
28
  import '../chunk-6VTG73UY.js';
29
29
  import '../chunk-LV2HPH3C.js';
30
- import '../chunk-E4UJ7CVK.js';
31
- import '../chunk-ODPII24X.js';
30
+ import '../chunk-XMP6XTMF.js';
31
+ import '../chunk-SETTLPBD.js';
32
32
  import '../chunk-QMONOHXT.js';
33
33
  import '../chunk-QAVZOJCV.js';
34
34
  import '../chunk-6E6PKKAD.js';
35
35
  import { loadAllFlows } from '../chunk-ICS76R4T.js';
36
36
  import '../chunk-GZWJGNNN.js';
37
37
  import '../chunk-FVTV7M76.js';
38
- import { AssetManager } from '../chunk-BTAC2VYT.js';
39
- import '../chunk-2RFOFHSM.js';
40
- import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-Z3M5K67G.js';
38
+ import { AssetManager } from '../chunk-B4ZXBH57.js';
39
+ import '../chunk-QXC62DOF.js';
40
+ import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-XVL22AWE.js';
41
41
  import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
42
42
  import '../chunk-KLNL7QHN.js';
43
- import '../chunk-5ESCS2OS.js';
44
- import { resolveSkWorkspaceConfig, resolveAgentDir, decodeSkaileYaml, findWorkspaceRoot, workspaceConfigFilename } from '../chunk-542K7SR6.js';
45
- import { parseFrontmatter } from '../chunk-DH4N5AW4.js';
46
- import { ASSET_KINDS, assetRefToStr } from '../chunk-YX3UWPJ5.js';
43
+ import '../chunk-UD4ZLXGS.js';
44
+ import { resolveSkWorkspaceConfig, resolveAgentDir, decodeSkaileYaml, findWorkspaceRoot, workspaceConfigFilename } from '../chunk-3QTZWPGH.js';
45
+ import { parseFrontmatter } from '../chunk-GL45UNVS.js';
46
+ import { ASSET_KINDS, parseAssetRef, isValidAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-WIAHJOMG.js';
47
47
  import '../chunk-JKNWJ64A.js';
48
48
  import { SUPPORTED_DRIVER_TARGETS } from '../chunk-O4JH3KUE.js';
49
49
  import { openSqlite } from '../chunk-24UIWON4.js';
@@ -310,7 +310,7 @@ function makeSearchCommand() {
310
310
  }
311
311
  if (showStore) {
312
312
  try {
313
- const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-AEI6Y3KD.js');
313
+ const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-INZD2RYD.js');
314
314
  const config = getStoreConfig2();
315
315
  const params = {};
316
316
  if (query) params.q = query;
@@ -472,7 +472,7 @@ function makeCatalogCommand() {
472
472
  const cfg = resolveConfig({ projectDir });
473
473
  const baseUrl = opts.url ?? cfg.catalog.url;
474
474
  if (isLocalCatalogUrl(baseUrl)) {
475
- const { resolveCatalogSource } = await import('../open-library-67FSSQWE.js');
475
+ const { resolveCatalogSource } = await import('../open-library-GW7DWWNZ.js');
476
476
  let resolved;
477
477
  try {
478
478
  resolved = await resolveCatalogSource({ projectDir: opts.projectDir });
@@ -1433,7 +1433,7 @@ async function ensureTargetsRegistered(projectDir) {
1433
1433
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
1434
1434
  const config = resolveSkWorkspaceConfig2(projectDir);
1435
1435
  if (config.plugins && config.plugins.length > 0) {
1436
- const { ensurePluginsLoaded } = await import('../plugin-store-IZ5SCRAV.js');
1436
+ const { ensurePluginsLoaded } = await import('../plugin-store-R32NH7JE.js');
1437
1437
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
1438
1438
  for (const f of result.failed) logWarn(f.error);
1439
1439
  }
@@ -2292,7 +2292,7 @@ function actOnHeader(row, action3) {
2292
2292
  return false;
2293
2293
  }
2294
2294
  async function loadAssets() {
2295
- const { gatherAssetFeeds } = await import('../asset-feeds-WKIKSZ6Z.js');
2295
+ const { gatherAssetFeeds } = await import('../asset-feeds-77KLWCBP.js');
2296
2296
  const { entries, notes } = await gatherAssetFeeds(am, am.projectDir);
2297
2297
  if (notes.length > 0) {
2298
2298
  state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
@@ -2347,7 +2347,7 @@ async function loadAssets() {
2347
2347
  async function loadSourcesAndLibraries() {
2348
2348
  try {
2349
2349
  const [{ openLibraryManager: openLibraryManager2 }, { skaileHomeDir: skaileHomeDir2 }] = await Promise.all([
2350
- import('../open-library-67FSSQWE.js'),
2350
+ import('../open-library-GW7DWWNZ.js'),
2351
2351
  import('../library/index.js')
2352
2352
  ]);
2353
2353
  const { manager, library, close } = await openLibraryManager2();
@@ -3679,7 +3679,7 @@ function action2(fn) {
3679
3679
  };
3680
3680
  }
3681
3681
  async function reconcileAndReport(projectDir, plugins) {
3682
- const { reconcilePlugins } = await import('../plugin-store-IZ5SCRAV.js');
3682
+ const { reconcilePlugins } = await import('../plugin-store-R32NH7JE.js');
3683
3683
  if (plugins.length === 0) {
3684
3684
  logInfo("No plugins declared \u2014 nothing to reconcile.");
3685
3685
  return;
@@ -3695,7 +3695,7 @@ async function reconcileAndReport(projectDir, plugins) {
3695
3695
  async function runInstall2(spec, opts) {
3696
3696
  const projectDir = path14__default.resolve(opts.projectDir);
3697
3697
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
3698
- const { specName } = await import('../plugin-store-IZ5SCRAV.js');
3698
+ const { specName } = await import('../plugin-store-R32NH7JE.js');
3699
3699
  const yamlPath = path14__default.join(projectDir, "skaile.yaml");
3700
3700
  const editor = WorkspaceYamlEditor2.load(yamlPath);
3701
3701
  const replaced = editor.addPlugin(spec, specName);
@@ -3707,7 +3707,7 @@ async function runInstall2(spec, opts) {
3707
3707
  async function runRemove(name, opts) {
3708
3708
  const projectDir = path14__default.resolve(opts.projectDir);
3709
3709
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
3710
- const { specName } = await import('../plugin-store-IZ5SCRAV.js');
3710
+ const { specName } = await import('../plugin-store-R32NH7JE.js');
3711
3711
  const yamlPath = path14__default.join(projectDir, "skaile.yaml");
3712
3712
  const editor = WorkspaceYamlEditor2.load(yamlPath);
3713
3713
  const removed = editor.removePlugin(name, specName);
@@ -3735,7 +3735,7 @@ async function runList(opts) {
3735
3735
  const registry = createPluginRegistry();
3736
3736
  if (declared.length > 0) {
3737
3737
  try {
3738
- const { loadPlugins } = await import('../plugin-store-IZ5SCRAV.js');
3738
+ const { loadPlugins } = await import('../plugin-store-R32NH7JE.js');
3739
3739
  const result = await loadPlugins(projectDir, declared, registry);
3740
3740
  for (const f of result.failed) logWarn(f.error);
3741
3741
  } catch (err) {
@@ -3899,20 +3899,30 @@ items:
3899
3899
  # credential_ref: "\${SECRET:EXAMPLE_KEY}" # for secret placeholders
3900
3900
  `;
3901
3901
  }
3902
- var ASSET_REF_RE = /^@?([^/@\s]+)\/([^/@\s]+)@([^/@\s]+)$/;
3902
+ var REF_HINT = "kind:@<publisher>/<name>#<version> (e.g. skill:@skaile/use-exa#1.0.0)";
3903
+ function isValidAssetRef(ref) {
3904
+ try {
3905
+ parseAssetRef(ref);
3906
+ return true;
3907
+ } catch {
3908
+ return false;
3909
+ }
3910
+ }
3903
3911
  function supportsInstallManifest(source) {
3904
3912
  return typeof source?.getInstallManifest === "function";
3905
3913
  }
3906
3914
  async function runPointerOnlyInstall(ref, deps) {
3907
- const m = ref.match(ASSET_REF_RE);
3908
- if (!m) {
3915
+ let requested;
3916
+ try {
3917
+ requested = parseAssetRef(ref);
3918
+ } catch (e) {
3909
3919
  throw new Error(
3910
- `malformed asset ref '${ref}' \u2014 expected <publisher>/<name>@<version> (e.g. skaile/use-exa@1.0.0)`
3920
+ `malformed asset ref '${ref}' \u2014 expected ${REF_HINT}: ${e instanceof Error ? e.message : String(e)}`
3911
3921
  );
3912
3922
  }
3913
3923
  const manifest = await deps.catalog.getInstallManifest(ref);
3914
- const normalizeRef = (r) => r.replace(/^@/, "");
3915
- if (normalizeRef(manifest.ref) !== normalizeRef(ref)) {
3924
+ const got = parseAssetRef(manifest.ref);
3925
+ if (got.kind !== requested.kind || got.publisher !== requested.publisher || got.name !== requested.name || got.pin !== requested.pin) {
3916
3926
  throw new Error(
3917
3927
  `catalog identity mismatch: requested '${ref}' but the catalog returned a manifest for '${manifest.ref}'`
3918
3928
  );
@@ -3926,19 +3936,17 @@ async function runPointerOnlyInstall(ref, deps) {
3926
3936
  }
3927
3937
  function makeInstallCommand() {
3928
3938
  return new Command("install").description(
3929
- "Install dependencies from skaile.yaml, or a single asset by ref (<publisher>/<name>@<version>)"
3930
- ).argument("[ref]", "Asset ref to install from the Catalog (<publisher>/<name>@<version>)").option("--locked", "Install from lock file (CI mode \u2014 fails on drift)").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").action(async (ref, opts) => {
3939
+ `Install dependencies from skaile.yaml, or a single asset by ref (${REF_HINT})`
3940
+ ).argument("[ref]", `Asset ref to install from the Catalog (${REF_HINT})`).option("--locked", "Install from lock file (CI mode \u2014 fails on drift)").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").action(async (ref, opts) => {
3931
3941
  if (ref !== void 0) {
3932
- if (!ASSET_REF_RE.test(ref)) {
3933
- logErr(
3934
- `malformed asset ref '${ref}' \u2014 expected <publisher>/<name>@<version> (e.g. skaile/use-exa@1.0.0)`
3935
- );
3942
+ if (!isValidAssetRef(ref)) {
3943
+ logErr(`malformed asset ref '${ref}' \u2014 expected ${REF_HINT}`);
3936
3944
  process.exit(1);
3937
3945
  }
3938
3946
  const spinner6 = p5.spinner();
3939
3947
  spinner6.start(`Installing ${ref}`);
3940
3948
  try {
3941
- const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-67FSSQWE.js');
3949
+ const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-GW7DWWNZ.js');
3942
3950
  const catalog = await openCatalogSource2({ projectDir: path14__default.resolve(opts.projectDir) });
3943
3951
  if (!supportsInstallManifest(catalog)) {
3944
3952
  throw new Error(
@@ -3970,7 +3978,7 @@ function makeInstallCommand() {
3970
3978
  }
3971
3979
  const projectDir = path14__default.resolve(opts.projectDir);
3972
3980
  try {
3973
- const { ensureSourcesCloned } = await import('../ensure-sources-OJUBGX6Z.js');
3981
+ const { ensureSourcesCloned } = await import('../ensure-sources-7MOOKY3K.js');
3974
3982
  const hydrate = ensureSourcesCloned(projectDir, { quiet: true });
3975
3983
  if (hydrate.cloned.length > 0) {
3976
3984
  logOk(`Cloned source(s): ${hydrate.cloned.join(", ")}`);
@@ -4428,7 +4436,7 @@ async function ensurePluginsLoadedForServe(projectDir) {
4428
4436
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
4429
4437
  const config = resolveSkWorkspaceConfig2(projectDir);
4430
4438
  if (!config.plugins || config.plugins.length === 0) return;
4431
- const { ensurePluginsLoaded } = await import('../plugin-store-IZ5SCRAV.js');
4439
+ const { ensurePluginsLoaded } = await import('../plugin-store-R32NH7JE.js');
4432
4440
  const { pluginRegistry } = await import('../plugin-registry/index.js');
4433
4441
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
4434
4442
  if (result.loaded.length > 0) {
@@ -5755,6 +5763,25 @@ function parseMdFrontmatter(content) {
5755
5763
  if (!fmMatch) return null;
5756
5764
  return parse(fmMatch[1]);
5757
5765
  }
5766
+ function checkManifestIdentity(kind, parsed) {
5767
+ if (parsed === null || typeof parsed !== "object") return null;
5768
+ const obj = parsed;
5769
+ const identity = kind === "flow" ? obj.id : obj.name;
5770
+ if (typeof identity !== "string" || identity.length === 0) return null;
5771
+ const publisher = typeof obj.publisher === "string" ? obj.publisher : void 0;
5772
+ if (publisher !== void 0) {
5773
+ try {
5774
+ parseAssetRef(`${kind}:@${publisher}/${identity}`);
5775
+ return null;
5776
+ } catch (e) {
5777
+ return e instanceof Error ? e.message : String(e);
5778
+ }
5779
+ }
5780
+ if (!isValidAssetName(identity)) {
5781
+ return `invalid asset ${kind === "flow" ? "id" : "name"} "${identity}" \u2014 ${ASSET_NAME_HINT}`;
5782
+ }
5783
+ return null;
5784
+ }
5758
5785
  function validateManifests(rootPath) {
5759
5786
  const absRoot = path14__default.resolve(rootPath);
5760
5787
  if (!fs10__default.existsSync(absRoot)) {
@@ -5783,8 +5810,13 @@ function validateManifests(rootPath) {
5783
5810
  continue;
5784
5811
  }
5785
5812
  }
5786
- const provider = registry.getProvider(c.kind);
5787
5813
  const relPath = path14__default.relative(absRoot, c.filePath);
5814
+ const identityError = checkManifestIdentity(c.kind, parsed);
5815
+ if (identityError) {
5816
+ logErr(`${relPath} [${c.kind}] \u2014 ${identityError}`);
5817
+ errors++;
5818
+ }
5819
+ const provider = registry.getProvider(c.kind);
5788
5820
  if (!provider) {
5789
5821
  logWarn(`${relPath} [${c.kind}] \u2014 kind "${c.kind}" is not registered, skipping validation`);
5790
5822
  warnings++;
@@ -5800,6 +5832,85 @@ function validateManifests(rootPath) {
5800
5832
  }
5801
5833
  return { total: candidates.length, errors, warnings };
5802
5834
  }
5835
+ function findWorkspaceManifests(rootPath) {
5836
+ const out = [];
5837
+ function walk(dir) {
5838
+ let entries;
5839
+ try {
5840
+ entries = fs10__default.readdirSync(dir, { withFileTypes: true });
5841
+ } catch {
5842
+ return;
5843
+ }
5844
+ for (const entry of entries) {
5845
+ const full = path14__default.join(dir, entry.name);
5846
+ if (entry.isDirectory()) {
5847
+ if (!SKIP_DIRS.has(entry.name)) walk(full);
5848
+ } else if (entry.isFile() && /(^|\.)skaile\.yaml$/.test(entry.name)) {
5849
+ out.push(full);
5850
+ }
5851
+ }
5852
+ }
5853
+ walk(rootPath);
5854
+ return out;
5855
+ }
5856
+ function validateWorkspaceManifests(rootPath) {
5857
+ const absRoot = path14__default.resolve(rootPath);
5858
+ const files = findWorkspaceManifests(absRoot);
5859
+ let errors = 0;
5860
+ for (const file of files) {
5861
+ const relPath = path14__default.relative(absRoot, file);
5862
+ let parsed;
5863
+ try {
5864
+ parsed = parse(fs10__default.readFileSync(file, "utf-8")) ?? {};
5865
+ } catch (e) {
5866
+ logErr(`${relPath} \u2014 parse error: ${e instanceof Error ? e.message : String(e)}`);
5867
+ errors++;
5868
+ continue;
5869
+ }
5870
+ const refFields = [];
5871
+ if (Array.isArray(parsed.dependencies)) {
5872
+ for (const d of parsed.dependencies) {
5873
+ if (typeof d === "string") refFields.push(["dependencies", d]);
5874
+ }
5875
+ }
5876
+ if (Array.isArray(parsed.overrides)) {
5877
+ for (const o of parsed.overrides) {
5878
+ const ref = o?.ref;
5879
+ if (typeof ref === "string") refFields.push(["overrides.ref", ref]);
5880
+ }
5881
+ }
5882
+ for (const [field, ref] of refFields) {
5883
+ try {
5884
+ parseAssetRef(ref);
5885
+ } catch (e) {
5886
+ logErr(`${relPath} [${field}] \u2014 ${e instanceof Error ? e.message : String(e)}`);
5887
+ errors++;
5888
+ }
5889
+ }
5890
+ if (Array.isArray(parsed.assets)) {
5891
+ const topPublisher = typeof parsed.publisher === "string" ? parsed.publisher : void 0;
5892
+ for (const a of parsed.assets) {
5893
+ const asset = a;
5894
+ const name = asset?.name;
5895
+ const kind = typeof asset?.kind === "string" ? asset.kind : "skill";
5896
+ if (typeof name !== "string" || name.length === 0) continue;
5897
+ const publisher = typeof asset?.publisher === "string" ? asset.publisher : topPublisher;
5898
+ if (publisher !== void 0) {
5899
+ try {
5900
+ parseAssetRef(`${kind}:@${publisher}/${name}`);
5901
+ } catch (e) {
5902
+ logErr(`${relPath} [assets] \u2014 ${e instanceof Error ? e.message : String(e)}`);
5903
+ errors++;
5904
+ }
5905
+ } else if (!isValidAssetName(name)) {
5906
+ logErr(`${relPath} [assets] \u2014 invalid asset name "${name}" \u2014 ${ASSET_NAME_HINT}`);
5907
+ errors++;
5908
+ }
5909
+ }
5910
+ }
5911
+ }
5912
+ return { total: files.length, errors };
5913
+ }
5803
5914
  var EXCLUDED_DOMAINS = /* @__PURE__ */ new Set(["skaileup-shared", "external", "docs"]);
5804
5915
  function collectAssetVersions() {
5805
5916
  const assets = [];
@@ -5907,12 +6018,14 @@ function makeValidateCommand() {
5907
6018
  const absPath = path14__default.resolve(targetPath);
5908
6019
  logInfo(`Validating manifests in ${absPath}`);
5909
6020
  const { total, errors } = validateManifests(absPath);
6021
+ const ws = validateWorkspaceManifests(absPath);
6022
+ const totalErrors = errors + ws.errors;
5910
6023
  console.log();
5911
- logInfo(`Scanned ${total} manifest files`);
5912
- if (errors === 0) {
6024
+ logInfo(`Scanned ${total} asset manifest(s) and ${ws.total} skaile.yaml file(s)`);
6025
+ if (totalErrors === 0) {
5913
6026
  logOk("All manifests valid");
5914
6027
  } else {
5915
- logErr(`${errors} validation error(s)`);
6028
+ logErr(`${totalErrors} validation error(s)`);
5916
6029
  process.exit(1);
5917
6030
  }
5918
6031
  });
@@ -6198,6 +6311,7 @@ Execution:
6198
6311
  clear Unset current session
6199
6312
 
6200
6313
  Validation:
6314
+ validate [path] Check manifest schemas + canonical asset names/refs
6201
6315
  validate versions Check asset version fields and flow pins
6202
6316
  validate changelog Check changelogs for modified domains
6203
6317
 
@@ -6337,7 +6451,7 @@ program.command("init [project-dir]").description("Initialize a project director
6337
6451
  );
6338
6452
  }
6339
6453
  try {
6340
- const { ensureSourcesCloned } = await import('../ensure-sources-OJUBGX6Z.js');
6454
+ const { ensureSourcesCloned } = await import('../ensure-sources-7MOOKY3K.js');
6341
6455
  const hydrate = ensureSourcesCloned(resolved, { quiet: true });
6342
6456
  for (const n of hydrate.cloned) created.push(`~/.skaile/sources/${n}/`);
6343
6457
  if (hydrate.failed.length > 0) {
@@ -6363,7 +6477,7 @@ program.command("init [project-dir]").description("Initialize a project director
6363
6477
  console.log();
6364
6478
  });
6365
6479
  program.command("setup").description("Interactive provider setup wizard").action(async () => {
6366
- const { cmdSetup } = await import('../setup-J7CYEQOF.js');
6480
+ const { cmdSetup } = await import('../setup-SRPBQOHY.js');
6367
6481
  await cmdSetup([], { projectDir: process.cwd() });
6368
6482
  });
6369
6483
  program.addCommand(makeInstallCommand());