@skaile/workspaces 1.2.0 → 1.4.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 (224) hide show
  1. package/CHANGELOG.md +128 -0
  2. package/README.md +1 -1
  3. package/dist/app-sdk/index.d.ts +2 -0
  4. package/dist/app-sdk/index.js +295 -0
  5. package/dist/app-sdk/index.js.map +1 -0
  6. package/dist/app-sdk/src/app.d.ts +101 -0
  7. package/dist/app-sdk/src/app.d.ts.map +1 -0
  8. package/dist/app-sdk/src/define-app-capability.d.ts +139 -0
  9. package/dist/app-sdk/src/define-app-capability.d.ts.map +1 -0
  10. package/dist/app-sdk/src/index.d.ts +16 -0
  11. package/dist/app-sdk/src/index.d.ts.map +1 -0
  12. package/dist/app-sdk/src/logger.d.ts +26 -0
  13. package/dist/app-sdk/src/logger.d.ts.map +1 -0
  14. package/dist/app-sdk/src/transport.d.ts +84 -0
  15. package/dist/app-sdk/src/transport.d.ts.map +1 -0
  16. package/dist/app-sdk/src/ws-transport.d.ts +63 -0
  17. package/dist/app-sdk/src/ws-transport.d.ts.map +1 -0
  18. package/dist/{asset-feeds-OBPWVUDL.js → asset-feeds-NG5TKB3V.js} +10 -10
  19. package/dist/{asset-feeds-OBPWVUDL.js.map → asset-feeds-NG5TKB3V.js.map} +1 -1
  20. package/dist/asset-manager/index.js +9 -9
  21. package/dist/asset-manager/installer.js +8 -8
  22. package/dist/asset-manager/renderers.js +2 -2
  23. package/dist/asset-manager/src/index.d.ts +42 -6
  24. package/dist/asset-manager/src/index.d.ts.map +1 -1
  25. package/dist/bridge/drivers/claude-sdk.js +41 -6
  26. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  27. package/dist/bridge/drivers/codex.js +1 -1
  28. package/dist/bridge/drivers/continue.js +2 -2
  29. package/dist/bridge/drivers/echo.js +1 -1
  30. package/dist/bridge/drivers/gemini.js +3 -3
  31. package/dist/bridge/drivers/goose.js +2 -2
  32. package/dist/bridge/drivers/omp.js +1 -1
  33. package/dist/bridge/drivers/opencode.js +2 -2
  34. package/dist/bridge/drivers/qwen.js +3 -3
  35. package/dist/bridge/index.js +4 -3
  36. package/dist/bridge/src/cloud.d.ts +89 -0
  37. package/dist/bridge/src/cloud.d.ts.map +1 -0
  38. package/dist/bridge/src/drivers/claude-sdk.d.ts +12 -1
  39. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  40. package/dist/bridge/src/index.d.ts +1 -0
  41. package/dist/bridge/src/index.d.ts.map +1 -1
  42. package/dist/bridge/src/types.d.ts +31 -0
  43. package/dist/bridge/src/types.d.ts.map +1 -1
  44. package/dist/{chunk-MG6UIS7G.js → chunk-26YCXWCU.js} +52 -3
  45. package/dist/chunk-26YCXWCU.js.map +1 -0
  46. package/dist/{chunk-SKADPHAM.js → chunk-4N5XR5DQ.js} +2 -2
  47. package/dist/chunk-4N5XR5DQ.js.map +1 -0
  48. package/dist/{chunk-CLUJLV7Z.js → chunk-77OXU44H.js} +6 -6
  49. package/dist/{chunk-CLUJLV7Z.js.map → chunk-77OXU44H.js.map} +1 -1
  50. package/dist/{chunk-TTTLCSEQ.js → chunk-AAGD2J4H.js} +121 -41
  51. package/dist/chunk-AAGD2J4H.js.map +1 -0
  52. package/dist/{chunk-KVZ6XKVN.js → chunk-B6SSXVF2.js} +4 -4
  53. package/dist/chunk-B6SSXVF2.js.map +1 -0
  54. package/dist/{chunk-BCJL2UNH.js → chunk-BDUANIAR.js} +3 -3
  55. package/dist/{chunk-BCJL2UNH.js.map → chunk-BDUANIAR.js.map} +1 -1
  56. package/dist/{chunk-YI5OZ7QO.js → chunk-BE5KTS2L.js} +3 -3
  57. package/dist/{chunk-YI5OZ7QO.js.map → chunk-BE5KTS2L.js.map} +1 -1
  58. package/dist/{chunk-ZUE2PIJ5.js → chunk-BJHZHNKR.js} +3 -3
  59. package/dist/{chunk-ZUE2PIJ5.js.map → chunk-BJHZHNKR.js.map} +1 -1
  60. package/dist/{chunk-MQEZE6TU.js → chunk-DNFIKRO6.js} +3 -3
  61. package/dist/{chunk-MQEZE6TU.js.map → chunk-DNFIKRO6.js.map} +1 -1
  62. package/dist/{chunk-VCBLXF7D.js → chunk-GWDZW44L.js} +5 -5
  63. package/dist/{chunk-VCBLXF7D.js.map → chunk-GWDZW44L.js.map} +1 -1
  64. package/dist/{chunk-UY5Q2NZH.js → chunk-HKX5VSWQ.js} +3 -3
  65. package/dist/{chunk-UY5Q2NZH.js.map → chunk-HKX5VSWQ.js.map} +1 -1
  66. package/dist/{chunk-NUS5L5ZJ.js → chunk-HWTQ6HPO.js} +5 -5
  67. package/dist/{chunk-NUS5L5ZJ.js.map → chunk-HWTQ6HPO.js.map} +1 -1
  68. package/dist/{chunk-WRBF34YE.js → chunk-IEX5YV4R.js} +3 -3
  69. package/dist/{chunk-WRBF34YE.js.map → chunk-IEX5YV4R.js.map} +1 -1
  70. package/dist/{chunk-CU5Z7GH3.js → chunk-IRORTHGA.js} +20 -6
  71. package/dist/chunk-IRORTHGA.js.map +1 -0
  72. package/dist/chunk-ISQWMBKD.js +74 -0
  73. package/dist/chunk-ISQWMBKD.js.map +1 -0
  74. package/dist/{chunk-W65IK4MH.js → chunk-JZPEEMIM.js} +6 -6
  75. package/dist/{chunk-W65IK4MH.js.map → chunk-JZPEEMIM.js.map} +1 -1
  76. package/dist/{chunk-35TLBMHX.js → chunk-LCTRCWBK.js} +6 -6
  77. package/dist/{chunk-35TLBMHX.js.map → chunk-LCTRCWBK.js.map} +1 -1
  78. package/dist/{chunk-U5J77IIZ.js → chunk-NKTFEV7Q.js} +4 -4
  79. package/dist/{chunk-U5J77IIZ.js.map → chunk-NKTFEV7Q.js.map} +1 -1
  80. package/dist/{chunk-EPLYVB3L.js → chunk-OSCJRUKM.js} +2 -2
  81. package/dist/{chunk-EPLYVB3L.js.map → chunk-OSCJRUKM.js.map} +1 -1
  82. package/dist/{chunk-5AGARSQT.js → chunk-OUWNTFDG.js} +31 -3
  83. package/dist/chunk-OUWNTFDG.js.map +1 -0
  84. package/dist/{chunk-EVZKWY5J.js → chunk-PK7Q7MC7.js} +5 -4
  85. package/dist/chunk-PK7Q7MC7.js.map +1 -0
  86. package/dist/{chunk-XWLVIEWD.js → chunk-QM2TT2PJ.js} +20 -12
  87. package/dist/chunk-QM2TT2PJ.js.map +1 -0
  88. package/dist/{chunk-BM37QD6U.js → chunk-TJRWGMD2.js} +3 -3
  89. package/dist/{chunk-BM37QD6U.js.map → chunk-TJRWGMD2.js.map} +1 -1
  90. package/dist/{chunk-QVE3ILCY.js → chunk-TNSCHS4I.js} +2 -2
  91. package/dist/chunk-TNSCHS4I.js.map +1 -0
  92. package/dist/{chunk-Z5Z3MYDL.js → chunk-UPZGQZEJ.js} +3 -3
  93. package/dist/{chunk-Z5Z3MYDL.js.map → chunk-UPZGQZEJ.js.map} +1 -1
  94. package/dist/{chunk-52XHXSBN.js → chunk-UQ5FK2AB.js} +3 -3
  95. package/dist/{chunk-52XHXSBN.js.map → chunk-UQ5FK2AB.js.map} +1 -1
  96. package/dist/{chunk-KAWKKMU4.js → chunk-X57AMTAH.js} +74 -11
  97. package/dist/chunk-X57AMTAH.js.map +1 -0
  98. package/dist/{chunk-OIGYDVCM.js → chunk-XBG2YDQQ.js} +3 -3
  99. package/dist/{chunk-OIGYDVCM.js.map → chunk-XBG2YDQQ.js.map} +1 -1
  100. package/dist/cli/index.js +770 -188
  101. package/dist/cli/index.js.map +1 -1
  102. package/dist/cli/src/commands/preset-apply.d.ts +59 -0
  103. package/dist/cli/src/commands/preset-apply.d.ts.map +1 -0
  104. package/dist/cli/src/commands/preset-cmd.d.ts +2 -2
  105. package/dist/cli/src/commands/preset-cmd.d.ts.map +1 -1
  106. package/dist/cli/src/commands/preset-export.d.ts +93 -0
  107. package/dist/cli/src/commands/preset-export.d.ts.map +1 -0
  108. package/dist/cli/src/commands/source.d.ts.map +1 -1
  109. package/dist/cli/src/commands/why.d.ts +18 -0
  110. package/dist/cli/src/commands/why.d.ts.map +1 -1
  111. package/dist/connectors/config.js +5 -5
  112. package/dist/connectors/index.js +7 -7
  113. package/dist/core/index.js +4 -4
  114. package/dist/core/runtime-assets.js +2 -2
  115. package/dist/core/src/index.d.ts +2 -2
  116. package/dist/core/src/index.d.ts.map +1 -1
  117. package/dist/core/src/settings.d.ts +18 -0
  118. package/dist/core/src/settings.d.ts.map +1 -1
  119. package/dist/core/src/workspace-config.d.ts +45 -0
  120. package/dist/core/src/workspace-config.d.ts.map +1 -1
  121. package/dist/core/src/workspace-yaml-editor.d.ts +14 -1
  122. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  123. package/dist/core/workspace-config.js +1 -1
  124. package/dist/deploy/index.js +4 -4
  125. package/dist/discovery/index.js +2 -2
  126. package/dist/{ensure-sources-BQI2TOZZ.js → ensure-sources-CHC7X7AJ.js} +12 -12
  127. package/dist/{ensure-sources-BQI2TOZZ.js.map → ensure-sources-CHC7X7AJ.js.map} +1 -1
  128. package/dist/factory-assets/connectors/box.js +7 -7
  129. package/dist/factory-assets/connectors/deploy.js +7 -7
  130. package/dist/factory-assets/connectors/devserver.js +7 -7
  131. package/dist/factory-assets/connectors/flow/adapter.js +7 -7
  132. package/dist/factory-assets/connectors/flow/engine/engine.d.ts +4 -1
  133. package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -1
  134. package/dist/factory-assets/connectors/flow/engine/types.d.ts +41 -6
  135. package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -1
  136. package/dist/factory-assets/connectors/flow/engine.js +5 -5
  137. package/dist/factory-assets/connectors/flow/run-flow.js +8 -8
  138. package/dist/factory-assets/connectors/flow.js +7 -7
  139. package/dist/factory-assets/connectors/git.js +7 -7
  140. package/dist/factory-assets/connectors/gmail.js +7 -7
  141. package/dist/factory-assets/connectors/googledrive.js +7 -7
  142. package/dist/factory-assets/connectors/local.js +7 -7
  143. package/dist/factory-assets/connectors/mattermost.js +7 -7
  144. package/dist/factory-assets/connectors/memory.js +7 -7
  145. package/dist/factory-assets/connectors/minio.js +7 -7
  146. package/dist/factory-assets/connectors/postgres.js +7 -7
  147. package/dist/factory-assets/connectors/s3.js +7 -7
  148. package/dist/factory-assets/connectors/sharepoint.js +7 -7
  149. package/dist/factory-assets/connectors/sqlite.js +7 -7
  150. package/dist/factory-assets/connectors/static-server.js +7 -7
  151. package/dist/factory-assets/connectors/tunnel.js +7 -7
  152. package/dist/factory-assets/connectors/webdav.js +7 -7
  153. package/dist/factory-assets/connectors/xstate-store.js +7 -7
  154. package/dist/factory-assets/connectors/xstate.js +7 -7
  155. package/dist/factory-assets/skills/skaile-author-asset/SKILL.md +1 -1
  156. package/dist/factory-assets/skills/skaile-manage-workspace/SKILL.md +1 -1
  157. package/dist/{flows-4Z74KY2H.js → flows-CGOCUNO6.js} +4 -4
  158. package/dist/{flows-4Z74KY2H.js.map → flows-CGOCUNO6.js.map} +1 -1
  159. package/dist/{helpers-SC4PWN2F.js → helpers-GWG4CYYC.js} +12 -12
  160. package/dist/{helpers-SC4PWN2F.js.map → helpers-GWG4CYYC.js.map} +1 -1
  161. package/dist/library/index.js +8 -8
  162. package/dist/library/install.js +4 -4
  163. package/dist/{open-library-ZNYIND7N.js → open-library-37PXN6MK.js} +17 -17
  164. package/dist/{open-library-ZNYIND7N.js.map → open-library-37PXN6MK.js.map} +1 -1
  165. package/dist/{paths-S7QNXYMB.js → paths-UVOHWUPY.js} +7 -7
  166. package/dist/{paths-S7QNXYMB.js.map → paths-UVOHWUPY.js.map} +1 -1
  167. package/dist/{plugin-store-3DAVGKHN.js → plugin-store-EIMVEH3O.js} +6 -6
  168. package/dist/{plugin-store-3DAVGKHN.js.map → plugin-store-EIMVEH3O.js.map} +1 -1
  169. package/dist/runner/index.js +14 -13
  170. package/dist/runner/src/capability-registry.d.ts +15 -4
  171. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  172. package/dist/runner/src/cloud-bundle.d.ts +36 -0
  173. package/dist/runner/src/cloud-bundle.d.ts.map +1 -0
  174. package/dist/runner/src/serve.d.ts.map +1 -1
  175. package/dist/runner/src/session-builder.d.ts +32 -0
  176. package/dist/runner/src/session-builder.d.ts.map +1 -1
  177. package/dist/sdk/asset-manager.js +9 -9
  178. package/dist/sdk/bridge.js +4 -3
  179. package/dist/sdk/core.js +4 -4
  180. package/dist/sdk/flow.js +5 -5
  181. package/dist/sdk/index.js +14 -13
  182. package/dist/sdk/index.js.map +1 -1
  183. package/dist/sdk/runner.js +14 -13
  184. package/dist/sdk/session.js +2 -2
  185. package/dist/sdk/types.js +1 -1
  186. package/dist/session/index.js +2 -2
  187. package/dist/{setup-WBGDT2WY.js → setup-DINVR6ZQ.js} +10 -9
  188. package/dist/setup-DINVR6ZQ.js.map +1 -0
  189. package/dist/{source-SBFVULTG.js → source-RXAHIGMD.js} +18 -18
  190. package/dist/{source-SBFVULTG.js.map → source-RXAHIGMD.js.map} +1 -1
  191. package/dist/{store-client-YGDN4L2G.js → store-client-T3F663YG.js} +7 -7
  192. package/dist/{store-client-YGDN4L2G.js.map → store-client-T3F663YG.js.map} +1 -1
  193. package/dist/tui/index.js +14 -13
  194. package/dist/tui/index.js.map +1 -1
  195. package/dist/types/index.js +1 -1
  196. package/dist/types/manifests.js +1 -1
  197. package/dist/types/src/capabilities.d.ts +8 -2
  198. package/dist/types/src/capabilities.d.ts.map +1 -1
  199. package/dist/types/src/logging.d.ts +3 -2
  200. package/dist/types/src/logging.d.ts.map +1 -1
  201. package/dist/types/src/manifests/_shared.d.ts +4 -4
  202. package/dist/types/src/manifests/agent.d.ts +47 -8
  203. package/dist/types/src/manifests/agent.d.ts.map +1 -1
  204. package/dist/types/src/manifests/index.d.ts +3 -3
  205. package/dist/types/src/manifests/index.d.ts.map +1 -1
  206. package/dist/types/src/manifests/preset.d.ts +10 -0
  207. package/dist/types/src/manifests/preset.d.ts.map +1 -1
  208. package/dist/types/src/version.d.ts +11 -1
  209. package/dist/types/src/version.d.ts.map +1 -1
  210. package/dist/workspace-plugin/adapters/mcp.js +2 -2
  211. package/dist/workspace-plugin/adapters/omp.js +3 -3
  212. package/dist/workspace-plugin/index.js +1 -1
  213. package/package.json +7 -1
  214. package/dist/chunk-5AGARSQT.js.map +0 -1
  215. package/dist/chunk-CU5Z7GH3.js.map +0 -1
  216. package/dist/chunk-EVZKWY5J.js.map +0 -1
  217. package/dist/chunk-KAWKKMU4.js.map +0 -1
  218. package/dist/chunk-KVZ6XKVN.js.map +0 -1
  219. package/dist/chunk-MG6UIS7G.js.map +0 -1
  220. package/dist/chunk-QVE3ILCY.js.map +0 -1
  221. package/dist/chunk-SKADPHAM.js.map +0 -1
  222. package/dist/chunk-TTTLCSEQ.js.map +0 -1
  223. package/dist/chunk-XWLVIEWD.js.map +0 -1
  224. package/dist/setup-WBGDT2WY.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../cli/src/commands/source-manifest.ts","../cli/src/commands/source.ts"],"names":[],"mappings":"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","file":"chunk-XWLVIEWD.js","sourcesContent":["/**\n * `skaile source manifest …` — sidecar manifest lifecycle, refactored under\n * the `source` noun (was `source sidecar …`).\n *\n * The verbs are stubs for now — the real wiring lands when the publish path\n * through `POST /sources/<id>/manifest` is finalised on the store backend.\n * Each subcommand exits with code 2 plus a clear \"not yet wired\" hint so\n * smoke tests can verify the surface without depending on the server.\n *\n * @docLink cli/commands/source#manifest\n */\n\nimport type { Command } from \"commander\";\nimport { logErr } from \"../helpers.ts\";\n\nconst NOT_WIRED_MSG =\n \"`skaile source manifest *` is scaffolded but not yet wired. \" +\n \"Server-side endpoint (`POST /sources/<id>/manifest`) lands in a follow-up PR.\";\n\nfunction notWired(verb: string): never {\n logErr(`${NOT_WIRED_MSG} (verb: source manifest ${verb})`);\n process.exit(2);\n}\n\n/**\n * Append the `manifest` sub-tree to a `source` command.\n *\n * Called from `makeSourceCommand()` in `source.ts`.\n */\nexport function addSourceManifestCommands(src: Command): void {\n const manifest = src.command(\"manifest\").description(\"Sidecar manifest lifecycle for a source\");\n\n manifest\n .command(\"init <src>\")\n .description(\"Start a sidecar manifest for a source\")\n .action(() => notWired(\"init\"));\n\n manifest\n .command(\"edit <src>\")\n .description(\"Open the sidecar manifest in $EDITOR\")\n .action(() => notWired(\"edit\"));\n\n manifest\n .command(\"rebuild <src>\")\n .description(\"Re-derive the manifest after an upstream change\")\n .option(\"--merge\", \"Merge with existing entries instead of overwriting\", false)\n .action(() => notWired(\"rebuild\"));\n\n manifest\n .command(\"verify <src>\")\n .description(\"Verify hashes, deps, and schema\")\n .option(\"--strict\", \"Fail on advisory checks\", false)\n .action(() => notWired(\"verify\"));\n\n manifest\n .command(\"publish <src>\")\n .description(\"Register the manifest in the store (provenance=curator)\")\n .action(() => notWired(\"publish\"));\n\n manifest\n .command(\"propose <src>\")\n .description(\"Open a PR to upstream with the sidecar manifest\")\n .action(() => notWired(\"propose\"));\n\n manifest\n .command(\"yank <src>\")\n .description(\"Retract a published manifest from the remote store\")\n .option(\"--version <v>\", \"Version to yank\")\n .action(() => notWired(\"yank\"));\n}\n","/**\n * `skaile source …` — manage github sources for the current project.\n *\n * A *source* is a third-party github repo of AI assets. The project's\n * `skaile.yaml` `sources:` array is the source of truth for which sources\n * this project uses. The clone itself lives at\n * `~/.skaile/cache/sources/<host>/<owner>/<repo>/` (machine-global cache, shared\n * across projects, URL-keyed so cross-org repos never collide), and the manifest is\n * mirrored into `~/.skaile/index.db` (machine-global manifest cache).\n *\n * @docLink cli/commands/source\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, rmSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n findWorkspaceRoot,\n getGlobalCacheDir,\n type SourceEntry,\n sourceCacheKey,\n sourceShortName,\n WorkspaceYamlEditor,\n workspaceConfigFilename,\n} from \"@skaile/workspaces/core\";\nimport { LocalCatalogSource } from \"@skaile/workspaces/library\";\nimport * as p from \"@clack/prompts\";\nimport { Command } from \"commander\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport { openLibraryManager } from \"../open-library.ts\";\nimport { createFullRegistry } from \"../open-registry.ts\";\nimport { addSourceManifestCommands } from \"./source-manifest.ts\";\n\n/**\n * Clone dir for one source cache key (`<host>/<owner>/<repo>`). Exported for the\n * cache-path regression test. Callers pass `sourceCacheKey(url)`.\n */\nexport function sourceClonePath(key: string): string {\n return path.join(getGlobalCacheDir(), key);\n}\n\nconst SKAILE_MANIFEST_FILENAME = \"skaile.manifest.yaml\";\nconst LEGACY_SOURCE_CONFIG_FILENAME = \".skaile-source.yaml\";\n\n/**\n * Whether a manifest-cache refresh actually failed to index something. Keyed on\n * `errors`, NOT on `assetsUpdated < assetsFound`: the discovery walk counts\n * presets (and other intentionally-not-cataloged kinds) toward `assetsFound` but\n * never upserts them, so a source shipping a `.preset.yaml` would otherwise read\n * as a partial failure — false `! N asset(s) failed to index` + exit 1 — with\n * zero real errors.\n */\nexport function indexingHadFailures(result: { errors: string[] }): boolean {\n return result.errors.length > 0;\n}\n\n/**\n * A clone that ships only the legacy `.skaile-source.yaml` (no\n * `skaile.manifest.yaml`) has its declared `publisher_default` silently ignored\n * — discovery only reads `skaile.manifest.yaml`, so publisher resolution falls\n * back to the first path segment. Surface a hint so the author can fix it.\n */\nexport function legacySourceConfigHint(dest: string): string | undefined {\n const hasLegacy = existsSync(path.join(dest, LEGACY_SOURCE_CONFIG_FILENAME));\n const hasManifest = existsSync(path.join(dest, SKAILE_MANIFEST_FILENAME));\n if (hasLegacy && !hasManifest) {\n return (\n `This source ships a legacy ${LEGACY_SOURCE_CONFIG_FILENAME} but no ` +\n `${SKAILE_MANIFEST_FILENAME}; its declared publisher is ignored and assets ` +\n `are published under their first path segment. Add a ${SKAILE_MANIFEST_FILENAME} ` +\n `(\\`skaile source manifest init\\`) to set the publisher and asset inventory.`\n );\n }\n return undefined;\n}\n\n/**\n * Normalize a `source add` argument into a clonable git URL. Full URLs and\n * scp-style (`git@host:…`) specs pass through unchanged; an `owner/repo`\n * shorthand and a bare repo name expand to GitHub over SSH — a bare name\n * defaults to the `skaile-ai` org (`git@github.com:skaile-ai/<name>.git`).\n */\nexport function normalizeSourceUrl(input: string): string {\n const s = input.trim();\n if (/^(?:https?|git|ssh|file):\\/\\//.test(s) || /^git@/.test(s)) return s;\n const repo = s.replace(/\\.git$/, \"\");\n if (/^[\\w.-]+\\/[\\w.-]+$/.test(repo)) return `git@github.com:${repo}.git`;\n if (/^[\\w.-]+$/.test(repo)) return `git@github.com:skaile-ai/${repo}.git`;\n return s;\n}\n\n/**\n * Match a stored source against a user-supplied key. Mirrors the shortcut\n * expansion `source add` applies (`normalizeSourceUrl`) so any form that `add`\n * accepted — bare name, `owner/repo`, `.git`-suffixed, full URL — also resolves\n * at `sync`/`show`/`remove` time, not just the raw stored URL or derived slug.\n */\nexport function sourceMatchesKey(entry: SourceEntry, key: string): boolean {\n if (entry.url === key) return true;\n if (sourceCacheKey(entry.url) === key || sourceShortName(entry.url) === key) return true;\n return entry.url === normalizeSourceUrl(key);\n}\n\n/**\n * Find an already-registered source that maps to the same cache key as `url`\n * but is stored under a *different* URL string (e.g. the `.git`-suffixed or\n * scp form of the same remote). Two such entries would fight over one clone\n * dir, so `source add` rejects the ambiguity. Returns the colliding entry, or\n * `undefined` when the URL is unique or only matches an exact-string duplicate\n * (which `setSource` updates in place).\n */\nexport function findCacheKeyCollision(\n sources: SourceEntry[],\n url: string,\n): SourceEntry | undefined {\n const key = sourceCacheKey(url);\n return sources.find((s) => s.url !== url && sourceCacheKey(s.url) === key);\n}\n\nfunction requireProjectYamlPath(): string {\n const root = findWorkspaceRoot(process.cwd());\n if (!root) {\n logErr(\n \"No skaile.yaml found in the current directory or any parent. \" + \"Run `skaile init` first.\",\n );\n process.exit(1);\n }\n return path.join(root, workspaceConfigFilename());\n}\n\nfunction readProjectSources(yamlPath: string): SourceEntry[] {\n if (!existsSync(yamlPath)) return [];\n try {\n return WorkspaceYamlEditor.load(yamlPath).getSources();\n } catch (err) {\n logErr(`Could not read ${yamlPath}: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n}\n\n/**\n * Clone the source if its clone directory does not yet exist. When `force` is\n * set, the existing clone is removed and a fresh one is checked out. Returns\n * true when a clone happened. The cache slug is derived from the URL.\n */\nfunction ensureClone(entry: SourceEntry, opts: { force?: boolean } = {}): boolean {\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n if (existsSync(dest)) {\n if (!opts.force) return false;\n rmSync(dest, { recursive: true, force: true });\n }\n mkdirSync(path.dirname(dest), { recursive: true });\n const args = [\"clone\", entry.url, dest];\n // `pin` may be a branch/tag; pass it as the clone branch when present.\n if (entry.pin) args.splice(1, 0, \"--branch\", entry.pin);\n const clone = spawnSync(\"git\", args, { stdio: \"inherit\" });\n if (clone.status !== 0) {\n logErr(`git clone failed for ${entry.url}`);\n process.exit(1);\n }\n return true;\n}\n\n/**\n * Refresh the machine-global manifest cache for `entry` by running discovery\n * and upserting AssetDefinitions into `~/.skaile/index.db`. Creates the\n * libraries-table cache row if missing (ownership: reader = cache state).\n */\nasync function refreshManifestCache(\n entry: SourceEntry,\n includeDev = false,\n): Promise<{\n assetsFound: number;\n assetsUpdated: number;\n errors: string[];\n}> {\n const { manager, library, close } = await openLibraryManager();\n try {\n const name = sourceShortName(entry.url);\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n const existing = (await manager.listLibraries()).find((l) => l.name === name);\n const lib =\n existing ??\n (await manager.addLibrary({\n name,\n path: dest,\n backend: \"git\",\n backendConfig: { url: entry.url, branch: entry.pin ?? \"main\", authHint: \"ssh\" },\n ownership: \"reader\",\n }));\n const catalog = new LocalCatalogSource(library, lib.id, dest, createFullRegistry());\n const result = await catalog.sync({ includeDev });\n await library.syncSource(lib.id);\n return result;\n } finally {\n close();\n }\n}\n\n/**\n * Auto-sync hook for `skaile search` on an unsynced workspace. Clones/pulls and\n * re-indexes every source declared in the project's `skaile.yaml`, then returns\n * whether the manifest cache may have changed (caller re-queries on `true`).\n *\n * Unlike `source sync`, this degrades gracefully — a clone/pull/index failure is\n * logged and skipped (never `process.exit`) so a failed auto-sync falls back to\n * the \"run sync first\" hint rather than killing the search. Returns `false`\n * (silently, no announce) when no sources are declared. Callers must guard\n * air-gapped mode themselves — this always touches the network.\n */\nexport async function autoSyncForSearch(projectDir: string): Promise<boolean> {\n const root = findWorkspaceRoot(projectDir);\n if (!root) return false;\n if (readProjectSources(path.join(root, workspaceConfigFilename())).length === 0) return false;\n\n logInfo(\"sources not synced — syncing now…\");\n const { synced } = await syncProjectSources(projectDir);\n return synced > 0;\n}\n\n/**\n * Clone-or-pull every source declared in the project's `skaile.yaml`, then\n * refresh its manifest cache. Shared by `autoSyncForSearch` and `skaile update`\n * (the latter offers it behind a confirm) so a re-deploy can see upstream\n * commits — `update` re-deploys against the local source cache, which is\n * otherwise frozen at the commit captured when the source was first cloned.\n *\n * Graceful by design: a clone/pull/index failure for one source is logged and\n * skipped (never `process.exit`), so a single bad remote can't abort the run.\n * Existing clones are advanced with `git pull --ff-only` (no `--depth=1`, unlike\n * the installer's `pullRepo`, so it fast-forwards instead of tripping the\n * shallow-divergence path). Returns a count summary for the caller to report.\n */\nexport async function syncProjectSources(\n projectDir: string,\n opts: { dev?: boolean } = {},\n): Promise<{ total: number; synced: number; failed: number }> {\n const root = findWorkspaceRoot(projectDir) ?? projectDir;\n const sources = readProjectSources(path.join(root, workspaceConfigFilename()));\n let synced = 0;\n let failed = 0;\n for (const entry of sources) {\n const slug = sourceShortName(entry.url);\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n try {\n // Quiet git — the sync is a preparatory step; keep progress bars out of\n // the foreground output (spinner / install result).\n if (!existsSync(dest)) {\n mkdirSync(path.dirname(dest), { recursive: true });\n const args = [\"clone\", entry.url, dest];\n if (entry.pin) args.splice(1, 0, \"--branch\", entry.pin);\n const clone = spawnSync(\"git\", args, { stdio: \"ignore\" });\n if (clone.status !== 0) {\n logWarn(`${slug}: git clone failed, skipping.`);\n failed++;\n continue;\n }\n } else {\n const pull = spawnSync(\"git\", [\"pull\", \"--ff-only\"], { cwd: dest, stdio: \"ignore\" });\n if (pull.status !== 0) {\n logWarn(`${slug}: git pull failed, skipping manifest refresh.`);\n failed++;\n continue;\n }\n }\n const result = await refreshManifestCache(entry, opts.dev);\n for (const err of result.errors) logWarn(`${slug}: ${err}`);\n synced++;\n } catch (err) {\n logWarn(`${slug}: sync failed — ${err instanceof Error ? err.message : String(err)}`);\n failed++;\n }\n }\n return { total: sources.length, synced, failed };\n}\n\n/** Remove the libraries-table cache row and (optionally) the clone bytes. */\nasync function dropManifestCache(url: string, purgeClone: boolean): Promise<void> {\n const name = sourceShortName(url);\n const { manager, close } = await openLibraryManager();\n try {\n const existing = (await manager.listLibraries()).find((l) => l.name === name);\n if (existing) {\n await manager.removeLibrary(name, { purge: false });\n }\n } finally {\n close();\n }\n if (purgeClone) {\n const dest = sourceClonePath(sourceCacheKey(url));\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true });\n }\n}\n\nexport function makeSourceCommand(): Command {\n const cmd = new Command(\"source\").description(\n \"Manage github sources for the current project (recorded in skaile.yaml)\",\n );\n\n // ── source add ──────────────────────────────────────────────────────────\n cmd\n .command(\"add <source>\")\n .description(\n \"Clone a github repo and register it in this project's skaile.yaml. \" +\n \"<source> may be a full git URL, an owner/repo shorthand, or a bare \" +\n \"name (→ git@github.com:skaile-ai/<name>.git).\",\n )\n .option(\"--name <slug>\", \"[deprecated] no-op — the source entry stores only the URL\")\n .option(\"--pin <ref>\", \"Pin a branch, tag, or 40-char SHA\")\n .option(\"--branch <branch>\", \"[deprecated] alias for --pin\")\n .option(\"--force\", \"Remove an existing clone and re-clone\", false)\n .option(\"--dev\", \"Also index dev-only assets under the source's dev_paths\", false)\n .action(\n async (\n source: string,\n opts: {\n name?: string;\n pin?: string;\n branch?: string;\n force?: boolean;\n dev?: boolean;\n },\n ) => {\n const url = normalizeSourceUrl(source);\n const yamlPath = requireProjectYamlPath();\n\n // A different URL string that maps to the same cache key (e.g. the\n // `.git`-suffixed or scp form of an already-registered remote) would\n // fight over one clone dir. setSource only dedupes exact strings, so\n // reject the ambiguous collision here instead of silently shadowing.\n const collision = findCacheKeyCollision(readProjectSources(yamlPath), url);\n if (collision) {\n logErr(\n `\"${url}\" maps to the same cache key (${sourceCacheKey(url)}) as ` +\n `already-registered \"${collision.url}\". Remove that source first ` +\n `(skaile source remove) or re-use its exact URL to update it.`,\n );\n process.exitCode = 1;\n return;\n }\n\n if (opts.name) {\n logWarn(\n \"the --name flag is deprecated; the source entry now stores only the URL \" +\n \"(the cache slug is derived from it).\",\n );\n }\n const pin = opts.pin ?? opts.branch;\n const slug = sourceShortName(url);\n const entry: SourceEntry = { url };\n if (pin) entry.pin = pin;\n\n const editor = WorkspaceYamlEditor.load(yamlPath);\n editor.setSource(entry);\n editor.save();\n\n const dest = sourceClonePath(sourceCacheKey(url));\n const preexisting = existsSync(dest);\n const cloned = ensureClone(entry, { force: opts.force });\n if (!cloned) {\n logOk(`Reusing cached clone at ${dest}`);\n } else if (preexisting) {\n logOk(`Re-cloned ${url} → ${dest}`);\n } else {\n logOk(`Cloned ${url} → ${dest}`);\n }\n\n const result = await refreshManifestCache(entry, opts.dev);\n const failed = indexingHadFailures(result);\n const indexedMsg = `Indexed ${result.assetsUpdated} of ${result.assetsFound} asset(s) from \"${slug}\".`;\n if (failed) {\n logWarn(indexedMsg);\n } else {\n logOk(indexedMsg);\n }\n for (const err of result.errors) logWarn(err);\n\n const legacyHint = legacySourceConfigHint(dest);\n if (legacyHint) logWarn(legacyHint);\n\n const where = path.relative(process.cwd(), yamlPath);\n if (failed) {\n // The entry IS recorded in skaile.yaml, but indexing did not fully\n // succeed — don't present it as a clean success.\n logWarn(\n `Source \"${slug}\" registered in ${where}, but ${result.errors.length} ` +\n `asset(s) failed to index (see above). Fix the cause, then re-run ` +\n `\\`skaile source sync ${slug}\\`.`,\n );\n process.exitCode = 1;\n } else {\n logOk(`Source \"${slug}\" registered in ${where}.`);\n }\n },\n );\n\n // ── source list ─────────────────────────────────────────────────────────\n cmd\n .command(\"list\")\n .description(\"List sources registered in this project's skaile.yaml\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts: { json?: boolean }) => {\n const yamlPath = requireProjectYamlPath();\n const sources = readProjectSources(yamlPath);\n if (opts.json) return console.log(JSON.stringify(sources, null, 2));\n if (sources.length === 0) {\n logInfo(\"No sources in skaile.yaml. Run `skaile source add <git-url>` to register one.\");\n return;\n }\n console.log();\n console.log(S.heading(\" Sources\"));\n for (const s of sources) {\n const slug = sourceShortName(s.url);\n const cached = existsSync(sourceClonePath(sourceCacheKey(s.url)))\n ? \"\"\n : S.warn(\" (not cached)\");\n console.log(` ${S.cmd(slug.padEnd(24))} ${S.dim(s.url)}${cached}`);\n }\n console.log(`\\n ${S.dim(`${sources.length} source(s)`)}\\n`);\n });\n\n // ── source show ─────────────────────────────────────────────────────────\n cmd\n .command(\"show <name-or-url>\")\n .description(\"Show details for a source (matched by URL or derived slug)\")\n .action(async (key: string) => {\n const yamlPath = requireProjectYamlPath();\n const entry = readProjectSources(yamlPath).find((s) => sourceMatchesKey(s, key));\n if (!entry) {\n logErr(`No source matching \"${key}\" in ${yamlPath}.`);\n process.exit(1);\n }\n const slug = sourceShortName(entry.url);\n const clonePath = sourceClonePath(sourceCacheKey(entry.url));\n console.log(\n JSON.stringify(\n {\n ...entry,\n slug,\n clonePath,\n cached: existsSync(clonePath),\n },\n null,\n 2,\n ),\n );\n });\n\n // ── source remove ───────────────────────────────────────────────────────\n cmd\n .command(\"remove <name-or-url>\")\n .description(\"Remove a source from this project's skaile.yaml (matched by URL or slug)\")\n .option(\"--purge\", \"Also delete the cached clone from ~/.skaile/cache/sources/\", false)\n .action(async (key: string, opts: { purge: boolean }) => {\n const yamlPath = requireProjectYamlPath();\n const editor = WorkspaceYamlEditor.load(yamlPath);\n // Resolve to the stored URL (entries are keyed by url in the editor).\n const match = editor.getSources().find((s) => sourceMatchesKey(s, key));\n if (!match) {\n logErr(`No source matching \"${key}\" in ${yamlPath}.`);\n process.exit(1);\n }\n const slug = sourceShortName(match.url);\n editor.removeSource(match.url);\n editor.save();\n await dropManifestCache(match.url, opts.purge);\n logOk(\n opts.purge\n ? `Removed source \"${slug}\" and purged its clone.`\n : `Removed source \"${slug}\" from skaile.yaml (clone left in ~/.skaile/cache/sources/).`,\n );\n });\n\n // ── source sync ─────────────────────────────────────────────────────────\n cmd\n .command(\"sync [name]\")\n .description(\"Pull upstream changes and refresh the manifest cache\")\n .option(\"--dev\", \"Also index dev-only assets under each source's dev_paths\", false)\n .option(\"--all\", \"Sync every source without prompting\", false)\n .action(async (key: string | undefined, opts: { dev?: boolean; all?: boolean }) => {\n const yamlPath = requireProjectYamlPath();\n const sources = readProjectSources(yamlPath);\n if (sources.length === 0) {\n logInfo(\"No sources in skaile.yaml.\");\n return;\n }\n\n let targets: SourceEntry[];\n if (key) {\n targets = sources.filter((s) => sourceMatchesKey(s, key));\n if (targets.length === 0) {\n logInfo(`No source matching \"${key}\".`);\n return;\n }\n } else if (opts.all || sources.length === 1 || !process.stdin.isTTY) {\n // --all, a single source, or a non-interactive shell: sync everything.\n targets = sources;\n } else {\n const selected = await p.multiselect({\n message: \"Select sources to sync\",\n options: sources.map((s) => ({\n value: s.url,\n label: sourceShortName(s.url),\n hint: s.url,\n })),\n required: true,\n });\n if (p.isCancel(selected)) {\n p.cancel(\"Cancelled.\");\n return;\n }\n const picked = new Set(selected as string[]);\n targets = sources.filter((s) => picked.has(s.url));\n }\n for (const entry of targets) {\n const slug = sourceShortName(entry.url);\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n if (!existsSync(dest)) {\n ensureClone(entry);\n logOk(`${slug}: cloned to ${dest}.`);\n } else {\n const pull = spawnSync(\"git\", [\"pull\", \"--ff-only\"], { cwd: dest, stdio: \"inherit\" });\n if (pull.status !== 0) {\n logWarn(`${slug}: git pull failed, skipping manifest refresh.`);\n continue;\n }\n }\n const result = await refreshManifestCache(entry, opts.dev);\n const failed = indexingHadFailures(result);\n const indexedMsg = `${slug}: indexed ${result.assetsUpdated} of ${result.assetsFound} asset(s).`;\n if (failed) {\n logWarn(indexedMsg);\n process.exitCode = 1;\n } else {\n logOk(indexedMsg);\n }\n for (const err of result.errors) logWarn(`${slug}: ${err}`);\n const legacyHint = legacySourceConfigHint(dest);\n if (legacyHint) logWarn(`${slug}: ${legacyHint}`);\n }\n });\n\n // ── source patch / propose (stubs) ──────────────────────────────────────\n cmd\n .command(\"patch <ref>\")\n .description(\"Extract an asset for editing against the source\")\n .action((_ref: string) => {\n logErr(\n \"`skaile source patch` is scaffolded but not yet wired. \" +\n \"The patch flow lands in a follow-up PR.\",\n );\n process.exit(2);\n });\n\n cmd\n .command(\"propose <ref>\")\n .description(\"Open a PR with the patch against the source upstream\")\n .action((_ref: string) => {\n logErr(\n \"`skaile source propose` is scaffolded but not yet wired. \" +\n \"The propose flow lands in a follow-up PR.\",\n );\n process.exit(2);\n });\n\n // ── source manifest * ───────────────────────────────────────────────────\n addSourceManifestCommands(cmd);\n\n return cmd;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../cli/src/setup.ts"],"names":["p","isCancel","result"],"mappings":"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","file":"setup-WBGDT2WY.js","sourcesContent":["/**\n * skaile setup — Interactive provider setup wizard\n *\n * Discovers existing config, lets the user pick providers, enter/validate API keys,\n * choose where to store them, and set defaults.\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { getModels, validateApiKey } from \"@skaile/workspaces/bridge\";\nimport {\n ALL_PROVIDERS,\n detectEnvApiKeys,\n loadSettings,\n maskApiKey,\n projectSettingsPath,\n providerEnvKey,\n resolveSettings,\n type SkaileSettings,\n saveSettings,\n WorkspaceYamlEditor,\n} from \"@skaile/workspaces/core\";\n\n// ---------------------------------------------------------------------------\n// Provider metadata\n// ---------------------------------------------------------------------------\n\n/** LLM providers only (excludes voice providers) */\nconst LLM_PROVIDERS = ALL_PROVIDERS.filter((p) => p !== \"deepgram\" && p !== \"elevenlabs\");\n\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: \"Anthropic (Claude)\",\n openai: \"OpenAI (GPT)\",\n google: \"Google (Gemini)\",\n mistral: \"Mistral AI\",\n groq: \"Groq (fast inference)\",\n openrouter: \"OpenRouter (multi-provider gateway)\",\n deepseek: \"DeepSeek\",\n xai: \"xAI (Grok)\",\n together: \"Together AI\",\n fireworks: \"Fireworks AI\",\n};\n\nconst PROVIDER_KEY_URLS: Record<string, string> = {\n anthropic: \"https://console.anthropic.com/settings/keys\",\n openai: \"https://platform.openai.com/api-keys\",\n google: \"https://aistudio.google.com/apikey\",\n mistral: \"https://console.mistral.ai/api-keys\",\n groq: \"https://console.groq.com/keys\",\n openrouter: \"https://openrouter.ai/settings/keys\",\n deepseek: \"https://platform.deepseek.com/api_keys\",\n xai: \"https://console.x.ai/\",\n together: \"https://api.together.ai/settings/api-keys\",\n fireworks: \"https://fireworks.ai/api-keys\",\n};\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype StorageTarget = \"settings\" | \"env-project\" | \"env-global\" | \"skip\";\ntype DefaultsTarget = \"project\" | \"personal\";\n\ninterface SetupPlan {\n providers: string[];\n newKeys: Record<string, string>;\n storageTarget: StorageTarget;\n defaultsTarget: DefaultsTarget;\n defaultProvider: string;\n defaultModel: string;\n defaultDriver: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isCancel(value: unknown): value is symbol {\n return p.isCancel(value);\n}\n\nfunction exitOnCancel<T>(value: T): asserts value is Exclude<T, symbol> {\n if (isCancel(value)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n}\n\n/** Load .env files from common locations and parse key=value pairs */\nfunction loadDotenvKeys(): Record<string, string> {\n const locations = [path.join(process.cwd(), \".env\"), path.join(os.homedir(), \".env\")];\n const result: Record<string, string> = {};\n for (const loc of locations) {\n try {\n const content = fs.readFileSync(loc, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) continue;\n const key = trimmed.slice(0, eq).trim();\n let val = trimmed.slice(eq + 1).trim();\n // Strip surrounding quotes\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n result[key] = val;\n }\n } catch {\n // file doesn't exist, skip\n }\n }\n return result;\n}\n\n/** Append key=value entries to a .env file without overwriting existing keys */\nfunction appendEnvFile(filePath: string, entries: Record<string, string>): void {\n let existing = \"\";\n try {\n existing = fs.readFileSync(filePath, \"utf-8\");\n } catch {\n // file doesn't exist yet\n }\n\n const existingKeys = new Set<string>();\n for (const line of existing.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq !== -1) existingKeys.add(trimmed.slice(0, eq).trim());\n }\n\n const lines: string[] = [];\n for (const [key, value] of Object.entries(entries)) {\n if (existingKeys.has(key)) {\n p.log.warn(` ${key} already exists in ${filePath} — skipping`);\n continue;\n }\n lines.push(`${key}=${value}`);\n }\n\n if (lines.length === 0) return;\n\n const separator = existing.endsWith(\"\\n\") || existing === \"\" ? \"\" : \"\\n\";\n const content = `${separator + lines.join(\"\\n\")}\\n`;\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.appendFileSync(filePath, content, \"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// Wizard steps\n// ---------------------------------------------------------------------------\n\nasync function showCurrentState(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n): Promise<void> {\n const apiKeys = settings.apiKeys ?? {};\n const lines: string[] = [\"Provider keys:\"];\n for (const provider of LLM_PROVIDERS) {\n const envVal = envKeys[provider];\n const storedVal = apiKeys[provider];\n if (envVal) {\n lines.push(` ${provider.padEnd(12)} [env] ${maskApiKey(envVal)}`);\n } else if (storedVal) {\n lines.push(` ${provider.padEnd(12)} [stored] ${maskApiKey(storedVal)}`);\n } else {\n lines.push(` ${provider.padEnd(12)} (not configured)`);\n }\n }\n lines.push(\"\");\n lines.push(\"Current defaults:\");\n lines.push(` Provider: ${settings.provider ?? \"(not set)\"}`);\n lines.push(` Model: ${settings.model ?? \"(not set)\"}`);\n lines.push(` Driver: ${settings.driver ?? \"(not set)\"}`);\n\n p.note(lines.join(\"\\n\"), \"Current configuration\");\n}\n\nasync function selectProviders(\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<string[]> {\n const result = await p.multiselect({\n message: \"Which providers do you want to configure?\",\n options: LLM_PROVIDERS.map((id) => ({\n value: id,\n label: PROVIDER_LABELS[id] ?? id,\n hint: envKeys[id]\n ? `env: ${maskApiKey(envKeys[id])}`\n : storedKeys[id]\n ? `stored: ${maskApiKey(storedKeys[id])}`\n : undefined,\n })),\n initialValues: LLM_PROVIDERS.filter((id) => envKeys[id] || storedKeys[id]),\n required: true,\n });\n exitOnCancel(result);\n return result as string[];\n}\n\n/**\n * Run the optional validation step for a freshly entered key.\n * Returns true if the key should be kept (valid, or user opted to keep anyway),\n * false if it should be discarded.\n */\nasync function confirmKeyAfterValidation(provider: string, key: string): Promise<boolean> {\n const shouldValidate = await p.confirm({\n message: \"Validate this key?\",\n initialValue: true,\n });\n exitOnCancel(shouldValidate);\n\n if (!shouldValidate) return true;\n\n const s = p.spinner();\n s.start(`Validating ${provider} key...`);\n const result = await validateApiKey(provider, key);\n if (result.ok) {\n s.stop(`${provider} key is valid`);\n return true;\n }\n s.stop(`${provider} validation failed: ${result.error}`);\n const retry = await p.confirm({\n message: \"Use this key anyway?\",\n initialValue: false,\n });\n exitOnCancel(retry);\n return retry;\n}\n\n/**\n * Collect (or skip) the API key for a single provider.\n * Returns the entered key, or undefined when the provider is already configured,\n * the user declines to update, leaves it blank, or rejects a failed validation.\n */\nasync function collectProviderKey(\n provider: string,\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<string | undefined> {\n const envVar = providerEnvKey(provider);\n\n if (envKeys[provider]) {\n p.log.info(`${PROVIDER_LABELS[provider] ?? provider}: already set via ${envVar}`);\n return undefined;\n }\n\n if (storedKeys[provider]) {\n const update = await p.confirm({\n message: `${PROVIDER_LABELS[provider] ?? provider}: key already stored (${maskApiKey(storedKeys[provider])}). Update it?`,\n initialValue: false,\n });\n exitOnCancel(update);\n if (!update) return undefined;\n }\n\n const keyUrl = PROVIDER_KEY_URLS[provider];\n const key = await p.password({\n message: `${PROVIDER_LABELS[provider] ?? provider} API key${keyUrl ? ` (get one at ${keyUrl})` : \"\"}:`,\n });\n exitOnCancel(key);\n\n if (!key) return undefined;\n\n const keep = await confirmKeyAfterValidation(provider, key);\n if (!keep) return undefined;\n\n return key;\n}\n\nasync function collectApiKeys(\n providers: string[],\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<Record<string, string>> {\n const newKeys: Record<string, string> = {};\n\n for (const provider of providers) {\n const key = await collectProviderKey(provider, envKeys, storedKeys);\n if (key !== undefined) newKeys[provider] = key;\n }\n\n return newKeys;\n}\n\nasync function selectStorageTarget(): Promise<StorageTarget> {\n const result = await p.select({\n message: \"Where should API keys be stored?\",\n options: [\n { value: \"settings\" as const, label: \".skaile/settings.json (project-local, gitignored)\" },\n { value: \"env-project\" as const, label: `${process.cwd()}/.env (project-level)` },\n { value: \"env-global\" as const, label: `${os.homedir()}/.env (global)` },\n { value: \"skip\" as const, label: \"Skip — I'll set env vars myself\" },\n ],\n });\n exitOnCancel(result);\n return result as StorageTarget;\n}\n\nasync function selectDefaultProvider(providers: string[], current?: string): Promise<string> {\n const result = await p.select({\n message: \"Default LLM provider:\",\n options: providers.map((id) => ({\n value: id,\n label: PROVIDER_LABELS[id] ?? id,\n })),\n initialValue: current && providers.includes(current) ? current : providers[0],\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDefaultModel(\n provider: string,\n current?: string,\n apiKey?: string,\n): Promise<string> {\n // Try live model list from provider API, fall back to static catalog\n const s = apiKey ? p.spinner() : undefined;\n if (s) s.start(`Fetching models from ${provider}...`);\n\n const fetchResult = await getModels(provider, apiKey);\n\n if (s) {\n if (fetchResult.source === \"api\") {\n s.stop(`Loaded ${fetchResult.models.length} models from ${provider} API`);\n } else if (fetchResult.error) {\n s.stop(`Could not fetch live models (${fetchResult.error}) — using built-in catalog`);\n } else {\n s.stop(`Using built-in model catalog`);\n }\n }\n\n const models = fetchResult.models;\n if (models.length === 0) {\n p.log.warn(`No models found for ${provider} — enter a model ID manually`);\n const result = await p.text({\n message: \"Model ID:\",\n initialValue: current ?? \"\",\n });\n exitOnCancel(result);\n return result as string;\n }\n\n const result = await p.select({\n message: `Default model (${provider}):`,\n options: models.map((m) => ({\n value: m.id,\n label: `${m.name} (${m.id})`,\n })),\n initialValue: current && models.some((m) => m.id === current) ? current : models[0].id,\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDriver(current?: string): Promise<string> {\n const result = await p.select({\n message: \"Default agent driver:\",\n options: [\n { value: \"omp\", label: \"omp (oh-my-pi — multi-provider, recommended)\" },\n { value: \"claude-sdk\", label: \"claude-sdk (Anthropic Agent SDK, Claude only)\" },\n { value: \"codex\", label: \"codex (OpenAI Codex SDK, OpenAI only)\" },\n ],\n initialValue: current ?? \"omp\",\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDefaultsTarget(projectDir: string): Promise<DefaultsTarget> {\n const yamlPath = path.join(projectDir, \"skaile.yaml\");\n const hasYaml = fs.existsSync(yamlPath);\n\n if (!hasYaml) {\n // No skaile.yaml — can only save personally\n return \"personal\";\n }\n\n const result = await p.select({\n message: \"Where should driver, provider, and model defaults be saved?\",\n options: [\n {\n value: \"project\" as const,\n label: \"skaile.yaml (project-wide, shared with team)\",\n hint: \"recommended\",\n },\n {\n value: \"personal\" as const,\n label: \".skaile/settings.json (personal only, gitignored)\",\n },\n ],\n initialValue: \"project\" as const,\n });\n exitOnCancel(result);\n return result as DefaultsTarget;\n}\n\n/** Build the human-readable summary shown before applying the plan. */\nfunction buildSummaryLines(plan: SetupPlan, settingsFile: string): string[] {\n const lines: string[] = [];\n\n if (Object.keys(plan.newKeys).length > 0) {\n lines.push(\"New API keys:\");\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n lines.push(` ${provider.padEnd(12)} ${maskApiKey(key)}`);\n }\n const targetLabels: Record<StorageTarget, string> = {\n settings: `.skaile/settings.json (${settingsFile})`,\n \"env-project\": `${process.cwd()}/.env`,\n \"env-global\": `${os.homedir()}/.env`,\n skip: \"not saved (set env vars manually)\",\n };\n lines.push(` Storage: ${targetLabels[plan.storageTarget]}`);\n lines.push(\"\");\n }\n\n const defaultsLabel =\n plan.defaultsTarget === \"project\"\n ? \"skaile.yaml (project-wide)\"\n : \".skaile/settings.json (personal)\";\n lines.push(\"Defaults:\");\n lines.push(` Provider: ${plan.defaultProvider}`);\n lines.push(` Model: ${plan.defaultModel}`);\n lines.push(` Driver: ${plan.defaultDriver}`);\n lines.push(` Saved to: ${defaultsLabel}`);\n\n return lines;\n}\n\n/**\n * Write the new API keys to the chosen storage target.\n * For the `settings` target the keys are merged into `merged.apiKeys` (mutated\n * in place); for the env targets they are appended to the relevant `.env` file.\n */\nfunction persistApiKeys(plan: SetupPlan, merged: SkaileSettings): void {\n const hasNewKeys = Object.keys(plan.newKeys).length > 0;\n\n if (hasNewKeys && plan.storageTarget === \"settings\") {\n const apiKeys = { ...(merged.apiKeys ?? {}) };\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n apiKeys[provider] = key;\n }\n merged.apiKeys = apiKeys;\n } else if (hasNewKeys && plan.storageTarget === \"env-project\") {\n const envEntries: Record<string, string> = {};\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n envEntries[providerEnvKey(provider)] = key;\n }\n appendEnvFile(path.join(process.cwd(), \".env\"), envEntries);\n p.log.success(`Appended keys to ${process.cwd()}/.env`);\n } else if (hasNewKeys && plan.storageTarget === \"env-global\") {\n const envEntries: Record<string, string> = {};\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n envEntries[providerEnvKey(provider)] = key;\n }\n appendEnvFile(path.join(os.homedir(), \".env\"), envEntries);\n p.log.success(`Appended keys to ${os.homedir()}/.env`);\n }\n}\n\n/**\n * Apply the plan's defaults: write them to skaile.yaml when saving project-wide,\n * and set/strip the corresponding personal settings fields on `merged` (mutated\n * in place) so they don't shadow project-wide values.\n */\nfunction applyDefaults(plan: SetupPlan, projectDir: string, merged: SkaileSettings): void {\n // Save defaults to skaile.yaml or settings.json depending on user choice\n if (plan.defaultsTarget === \"project\") {\n const yamlPath = path.join(projectDir, \"skaile.yaml\");\n const editor = WorkspaceYamlEditor.load(yamlPath);\n editor.setAgentConfig(\"default\", {\n provider: plan.defaultProvider,\n model: plan.defaultModel,\n driver: plan.defaultDriver,\n });\n editor.save();\n p.log.success(`Saved defaults to ${yamlPath}`);\n }\n\n // Personal settings: only include defaults if saving personally, always include API keys.\n // When saving to project (skaile.yaml), strip driver/provider/model from settings.json\n // so they don't shadow the project-wide values.\n if (plan.defaultsTarget === \"personal\") {\n merged.provider = plan.defaultProvider;\n merged.model = plan.defaultModel;\n merged.driver = plan.defaultDriver;\n } else {\n delete merged.provider;\n delete merged.model;\n delete merged.driver;\n }\n}\n\nasync function reviewAndSave(plan: SetupPlan, projectDir: string): Promise<void> {\n const settingsFile = projectSettingsPath(projectDir);\n\n p.note(buildSummaryLines(plan, settingsFile).join(\"\\n\"), \"Summary\");\n\n const confirmed = await p.confirm({\n message: \"Apply these settings?\",\n initialValue: true,\n });\n exitOnCancel(confirmed);\n\n if (!confirmed) {\n p.cancel(\"Setup cancelled — no changes were made.\");\n process.exit(0);\n }\n\n // Load existing project settings (or empty)\n const existing = await loadSettings(settingsFile);\n\n const merged: SkaileSettings = { ...existing };\n applyDefaults(plan, projectDir, merged);\n persistApiKeys(plan, merged);\n\n // Write unified settings file\n await saveSettings(merged, settingsFile);\n p.log.success(`Saved settings to ${settingsFile}`);\n}\n\n// ---------------------------------------------------------------------------\n// Main entry\n// ---------------------------------------------------------------------------\n\n/** Check whether Claude Code OAuth credentials exist on disk */\nfunction hasClaudeCodeCredentials(): boolean {\n const credPath = path.join(os.homedir(), \".claude\", \".credentials.json\");\n try {\n const content = fs.readFileSync(credPath, \"utf-8\");\n const parsed = JSON.parse(content);\n // Check that it has at least one non-empty field\n return parsed && (parsed.accessToken || parsed.refreshToken || parsed.oauthToken);\n } catch {\n return false;\n }\n}\n\n/** The provider/key/model portion of a SetupPlan produced by a per-driver flow. */\ninterface DriverSetupResult {\n providers: string[];\n newKeys: Record<string, string>;\n storageTarget: StorageTarget;\n defaultProvider: string;\n defaultModel: string;\n}\n\n/**\n * Claude SDK path: Anthropic only. Honours an existing API key (env or stored)\n * or Claude Code OAuth credentials, otherwise offers to enter a key.\n */\nasync function runClaudeSdkSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n const defaultProvider = \"anthropic\";\n let newKeys: Record<string, string>;\n let storageTarget: StorageTarget = \"skip\";\n\n // Check for existing auth: API key or Claude Code OAuth credentials\n const hasEnvKey = !!envKeys.anthropic;\n const hasStoredKey = !!apiKeys.anthropic;\n const hasOAuth = hasClaudeCodeCredentials();\n\n if (hasEnvKey) {\n p.log.info(`Anthropic API key found in environment (${maskApiKey(envKeys.anthropic)})`);\n newKeys = {};\n } else if (hasStoredKey) {\n p.log.info(`Anthropic API key found in settings (${maskApiKey(apiKeys.anthropic)})`);\n newKeys = {};\n } else if (hasOAuth) {\n p.log.info(\"Claude Code subscription detected (OAuth credentials found)\");\n p.log.info(\"The Claude SDK will use your Claude Code login — no API key needed.\");\n newKeys = {};\n } else {\n // No auth found — prompt for Anthropic API key\n p.log.warn(\"No Anthropic API key or Claude Code subscription found.\");\n p.log.info(\"You can either:\");\n p.log.info(\" 1. Enter an Anthropic API key now\");\n p.log.info(\" 2. Run `claude login` to authenticate with Claude Code\");\n\n const wantsKey = await p.confirm({\n message: \"Enter an Anthropic API key?\",\n initialValue: true,\n });\n exitOnCancel(wantsKey);\n\n if (wantsKey) {\n newKeys = await collectApiKeys([\"anthropic\"], envKeys, apiKeys);\n } else {\n newKeys = {};\n }\n }\n\n // Storage target (only ask if there are new keys)\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n // Model selection — only Anthropic models (try live fetch with available key)\n const anthropicKey = newKeys.anthropic ?? envKeys.anthropic ?? apiKeys.anthropic;\n const defaultModel = await selectDefaultModel(\"anthropic\", settings.model, anthropicKey);\n\n return { providers: [\"anthropic\"], newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/** Codex path: OpenAI only. Honours an existing key, otherwise prompts for one. */\nasync function runCodexSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n const defaultProvider = \"openai\";\n let newKeys: Record<string, string>;\n let storageTarget: StorageTarget = \"skip\";\n\n const hasEnvKey = !!envKeys.openai;\n const hasStoredKey = !!apiKeys.openai;\n\n if (hasEnvKey) {\n p.log.info(`OpenAI API key found in environment (${maskApiKey(envKeys.openai)})`);\n newKeys = {};\n } else if (hasStoredKey) {\n p.log.info(`OpenAI API key found in settings (${maskApiKey(apiKeys.openai)})`);\n newKeys = {};\n } else {\n p.log.warn(\"No OpenAI API key found.\");\n newKeys = await collectApiKeys([\"openai\"], envKeys, apiKeys);\n }\n\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n const openaiKey = newKeys.openai ?? envKeys.openai ?? apiKeys.openai;\n const defaultModel = await selectDefaultModel(\"openai\", settings.model, openaiKey);\n\n return { providers: [\"openai\"], newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/** omp / pi path: multi-provider flow (existing behavior). */\nasync function runMultiProviderSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n let storageTarget: StorageTarget = \"skip\";\n\n // 4. Select providers\n const providers = await selectProviders(envKeys, apiKeys);\n\n // 5. Collect API keys\n const newKeys = await collectApiKeys(providers, envKeys, apiKeys);\n\n // 6. Storage target (only ask if there are new keys)\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n // 7. Default provider (from selected providers + any already configured)\n const allConfigured = [\n ...new Set([\n ...providers,\n ...Object.keys(envKeys),\n ...Object.keys(apiKeys).filter((k) => apiKeys[k]),\n ]),\n ].filter((p) => LLM_PROVIDERS.includes(p as any));\n const defaultProvider = await selectDefaultProvider(\n allConfigured.length > 0 ? allConfigured : providers,\n settings.provider,\n );\n\n // 8. Default model (try live fetch with available key)\n const providerKey =\n newKeys[defaultProvider] ?? envKeys[defaultProvider] ?? apiKeys[defaultProvider];\n const defaultModel = await selectDefaultModel(defaultProvider, settings.model, providerKey);\n\n return { providers, newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/**\n * Interactive provider setup wizard: discovers existing config, prompts for\n * provider/model/driver preferences and API keys, then writes the results to\n * `skaile.yaml` or `.skaile/settings.json` depending on the user's choice.\n *\n * @param _args - Unused positional args (reserved for future use).\n * @param opts - Options including an optional `projectDir` override.\n * @docLink cli/dev-guide#setup\n */\nexport async function cmdSetup(_args: string[], opts: { projectDir?: string }): Promise<void> {\n p.intro(\"skaile setup\");\n\n const projectDir = opts.projectDir ?? process.cwd();\n\n // 1. Detect existing state via layered resolution\n const dotenvKeys = loadDotenvKeys();\n const envKeys = detectEnvApiKeys(dotenvKeys);\n const settings = await resolveSettings(projectDir);\n\n // 2. Show current state\n await showCurrentState(settings, envKeys);\n\n // 3. Select driver FIRST — it determines which providers/models are relevant\n const defaultDriver = await selectDriver(settings.driver);\n\n const apiKeys = settings.apiKeys ?? {};\n\n // Per-driver provider/key/model flow\n let result: DriverSetupResult;\n if (defaultDriver === \"claude-sdk\") {\n result = await runClaudeSdkSetup(settings, envKeys, apiKeys);\n } else if (defaultDriver === \"codex\") {\n result = await runCodexSetup(settings, envKeys, apiKeys);\n } else {\n result = await runMultiProviderSetup(settings, envKeys, apiKeys);\n }\n\n // 9. Choose where to save defaults (project-wide vs personal)\n const defaultsTarget = await selectDefaultsTarget(projectDir);\n\n // 10. Review and save\n await reviewAndSave(\n {\n providers: result.providers,\n newKeys: result.newKeys,\n storageTarget: result.storageTarget,\n defaultsTarget,\n defaultProvider: result.defaultProvider,\n defaultModel: result.defaultModel,\n defaultDriver,\n },\n projectDir,\n );\n\n p.outro(\"Setup complete!\");\n}\n"]}