@skaile/workspaces 6.13.0 → 6.14.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 (172) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/{asset-feeds-3USSYLBS.js → asset-feeds-DOG5FK7T.js} +6 -6
  3. package/dist/{asset-feeds-3USSYLBS.js.map → asset-feeds-DOG5FK7T.js.map} +1 -1
  4. package/dist/asset-manager/index.js +1 -1
  5. package/dist/bridge/harnesses/claude-sdk.js +21 -17
  6. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  7. package/dist/bridge/harnesses/codex.js +4 -4
  8. package/dist/bridge/harnesses/continue.js +5 -5
  9. package/dist/bridge/harnesses/echo.js +2 -2
  10. package/dist/bridge/harnesses/gemini.js +7 -7
  11. package/dist/bridge/harnesses/goose.js +5 -5
  12. package/dist/bridge/harnesses/omp.js +7 -6
  13. package/dist/bridge/harnesses/omp.js.map +1 -1
  14. package/dist/bridge/harnesses/opencode.js +7 -88
  15. package/dist/bridge/harnesses/opencode.js.map +1 -1
  16. package/dist/bridge/harnesses/qwen.js +7 -7
  17. package/dist/bridge/index.js +11 -9
  18. package/dist/bridge/src/harness-binaries.d.ts +52 -5
  19. package/dist/bridge/src/harness-binaries.d.ts.map +1 -1
  20. package/dist/bridge/src/harness-detect.d.ts +73 -0
  21. package/dist/bridge/src/harness-detect.d.ts.map +1 -0
  22. package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
  23. package/dist/bridge/src/harness-model-discovery.d.ts +66 -0
  24. package/dist/bridge/src/harness-model-discovery.d.ts.map +1 -0
  25. package/dist/bridge/src/harnesses/_subprocess-cli.d.ts.map +1 -1
  26. package/dist/bridge/src/harnesses/claude-error-text.d.ts +9 -0
  27. package/dist/bridge/src/harnesses/claude-error-text.d.ts.map +1 -0
  28. package/dist/bridge/src/harnesses/claude-sdk.d.ts +4 -2
  29. package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -1
  30. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  31. package/dist/bridge/src/index.d.ts +3 -1
  32. package/dist/bridge/src/index.d.ts.map +1 -1
  33. package/dist/bridge/src/models.d.ts +9 -0
  34. package/dist/bridge/src/models.d.ts.map +1 -1
  35. package/dist/{chunk-2LDLQWYI.js → chunk-243Z3BNB.js} +3 -3
  36. package/dist/{chunk-2LDLQWYI.js.map → chunk-243Z3BNB.js.map} +1 -1
  37. package/dist/{chunk-42CN5YMX.js → chunk-2URJ7W5X.js} +3 -3
  38. package/dist/{chunk-42CN5YMX.js.map → chunk-2URJ7W5X.js.map} +1 -1
  39. package/dist/{chunk-JTJYM3XT.js → chunk-3BRBTQ6M.js} +2 -2
  40. package/dist/{chunk-JTJYM3XT.js.map → chunk-3BRBTQ6M.js.map} +1 -1
  41. package/dist/{chunk-7MISTEMW.js → chunk-4SSTREBO.js} +3 -3
  42. package/dist/{chunk-7MISTEMW.js.map → chunk-4SSTREBO.js.map} +1 -1
  43. package/dist/{chunk-XECD7XZT.js → chunk-5FO4U3OL.js} +4 -4
  44. package/dist/{chunk-XECD7XZT.js.map → chunk-5FO4U3OL.js.map} +1 -1
  45. package/dist/chunk-6ISJMEDX.js +88 -0
  46. package/dist/chunk-6ISJMEDX.js.map +1 -0
  47. package/dist/{chunk-MPBLRRPK.js → chunk-7UBCUKJO.js} +2 -2
  48. package/dist/{chunk-MPBLRRPK.js.map → chunk-7UBCUKJO.js.map} +1 -1
  49. package/dist/{chunk-NGJAB5OS.js → chunk-A7TM4PZZ.js} +7 -21
  50. package/dist/chunk-A7TM4PZZ.js.map +1 -0
  51. package/dist/{chunk-4QIVQAOP.js → chunk-B6W5DCH5.js} +5 -5
  52. package/dist/{chunk-4QIVQAOP.js.map → chunk-B6W5DCH5.js.map} +1 -1
  53. package/dist/{chunk-ERJOSW4V.js → chunk-CFRHYD4C.js} +8 -8
  54. package/dist/{chunk-ERJOSW4V.js.map → chunk-CFRHYD4C.js.map} +1 -1
  55. package/dist/{chunk-6M4BE42A.js → chunk-DYH3VSPU.js} +7 -7
  56. package/dist/{chunk-6M4BE42A.js.map → chunk-DYH3VSPU.js.map} +1 -1
  57. package/dist/{chunk-U2JQ2EMW.js → chunk-F6LDWA2N.js} +3 -3
  58. package/dist/{chunk-U2JQ2EMW.js.map → chunk-F6LDWA2N.js.map} +1 -1
  59. package/dist/{chunk-UDH4KZ53.js → chunk-F7WMHDTV.js} +10 -4
  60. package/dist/chunk-F7WMHDTV.js.map +1 -0
  61. package/dist/{chunk-WIZZUJ6R.js → chunk-J3FJTH3V.js} +3 -3
  62. package/dist/{chunk-WIZZUJ6R.js.map → chunk-J3FJTH3V.js.map} +1 -1
  63. package/dist/{chunk-ZAU7IXIX.js → chunk-LMUNQYJQ.js} +418 -14
  64. package/dist/chunk-LMUNQYJQ.js.map +1 -0
  65. package/dist/{chunk-DY52RNLI.js → chunk-LZCX2TCZ.js} +12 -12
  66. package/dist/{chunk-DY52RNLI.js.map → chunk-LZCX2TCZ.js.map} +1 -1
  67. package/dist/{chunk-ZCKZHOOU.js → chunk-NAAFRZTA.js} +3 -3
  68. package/dist/{chunk-ZCKZHOOU.js.map → chunk-NAAFRZTA.js.map} +1 -1
  69. package/dist/{chunk-SGCSP3GI.js → chunk-OC3AIMZH.js} +5 -5
  70. package/dist/{chunk-SGCSP3GI.js.map → chunk-OC3AIMZH.js.map} +1 -1
  71. package/dist/{chunk-JPUKRWWS.js → chunk-OKPITFE3.js} +2 -2
  72. package/dist/{chunk-JPUKRWWS.js.map → chunk-OKPITFE3.js.map} +1 -1
  73. package/dist/{chunk-DOG3YBRL.js → chunk-QBLS7X3Z.js} +3 -3
  74. package/dist/{chunk-DOG3YBRL.js.map → chunk-QBLS7X3Z.js.map} +1 -1
  75. package/dist/{chunk-T73IL57H.js → chunk-QNHW26AT.js} +3 -3
  76. package/dist/{chunk-T73IL57H.js.map → chunk-QNHW26AT.js.map} +1 -1
  77. package/dist/{chunk-RNQ26SKJ.js → chunk-RLV3FF4I.js} +5 -5
  78. package/dist/{chunk-RNQ26SKJ.js.map → chunk-RLV3FF4I.js.map} +1 -1
  79. package/dist/{chunk-L4G7AAKM.js → chunk-RRAXV5LE.js} +8 -8
  80. package/dist/{chunk-L4G7AAKM.js.map → chunk-RRAXV5LE.js.map} +1 -1
  81. package/dist/{chunk-ESUF2ZYT.js → chunk-U7EZ2WSC.js} +2 -2
  82. package/dist/{chunk-ESUF2ZYT.js.map → chunk-U7EZ2WSC.js.map} +1 -1
  83. package/dist/{chunk-NJAE5DOC.js → chunk-VKGNMXGZ.js} +3 -3
  84. package/dist/{chunk-NJAE5DOC.js.map → chunk-VKGNMXGZ.js.map} +1 -1
  85. package/dist/{chunk-6JAFK4ZU.js → chunk-WCUT3EQR.js} +3 -3
  86. package/dist/{chunk-6JAFK4ZU.js.map → chunk-WCUT3EQR.js.map} +1 -1
  87. package/dist/{chunk-6OM5QDPA.js → chunk-X66KSHZF.js} +4 -4
  88. package/dist/{chunk-6OM5QDPA.js.map → chunk-X66KSHZF.js.map} +1 -1
  89. package/dist/{chunk-GK5H52WR.js → chunk-XHLRMUMO.js} +3 -3
  90. package/dist/{chunk-GK5H52WR.js.map → chunk-XHLRMUMO.js.map} +1 -1
  91. package/dist/{chunk-4CNJFSCM.js → chunk-YJAKSCCN.js} +3 -3
  92. package/dist/{chunk-4CNJFSCM.js.map → chunk-YJAKSCCN.js.map} +1 -1
  93. package/dist/chunk-YKD2MYLU.js +210 -0
  94. package/dist/chunk-YKD2MYLU.js.map +1 -0
  95. package/dist/{chunk-GUKIUBMF.js → chunk-YNQRVTXH.js} +4 -4
  96. package/dist/{chunk-GUKIUBMF.js.map → chunk-YNQRVTXH.js.map} +1 -1
  97. package/dist/{chunk-RFYL2HRA.js → chunk-ZQL6HGTW.js} +5 -5
  98. package/dist/{chunk-RFYL2HRA.js.map → chunk-ZQL6HGTW.js.map} +1 -1
  99. package/dist/{claude-code-IQHO7PGX.js → claude-code-LFAOJ3UQ.js} +4 -4
  100. package/dist/{claude-code-IQHO7PGX.js.map → claude-code-LFAOJ3UQ.js.map} +1 -1
  101. package/dist/cli/index.js +92 -54
  102. package/dist/cli/index.js.map +1 -1
  103. package/dist/cli/src/commands/harness-preflight.d.ts.map +1 -1
  104. package/dist/cli/src/commands/harness.d.ts +14 -0
  105. package/dist/cli/src/commands/harness.d.ts.map +1 -1
  106. package/dist/cli/src/commands/serve-preflight.d.ts +1 -6
  107. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  108. package/dist/connectors/index.js +12 -10
  109. package/dist/{connectors-S4W2HZ2J.js → connectors-KPF4UUDS.js} +15 -13
  110. package/dist/{connectors-S4W2HZ2J.js.map → connectors-KPF4UUDS.js.map} +1 -1
  111. package/dist/{ensure-sources-Z4PSTQE4.js → ensure-sources-FOMEGCQ5.js} +15 -13
  112. package/dist/ensure-sources-FOMEGCQ5.js.map +1 -0
  113. package/dist/factory-assets/connectors/box.js +12 -10
  114. package/dist/factory-assets/connectors/deploy.js +12 -10
  115. package/dist/factory-assets/connectors/devserver.js +12 -10
  116. package/dist/factory-assets/connectors/flow/adapter.js +12 -10
  117. package/dist/factory-assets/connectors/flow/run-flow.js +13 -11
  118. package/dist/factory-assets/connectors/flow.js +12 -10
  119. package/dist/factory-assets/connectors/git.js +12 -10
  120. package/dist/factory-assets/connectors/gmail.js +12 -10
  121. package/dist/factory-assets/connectors/googledrive.js +12 -10
  122. package/dist/factory-assets/connectors/local.js +12 -10
  123. package/dist/factory-assets/connectors/mattermost.js +12 -10
  124. package/dist/factory-assets/connectors/memory.js +12 -10
  125. package/dist/factory-assets/connectors/minio.js +12 -10
  126. package/dist/factory-assets/connectors/postgres.js +12 -10
  127. package/dist/factory-assets/connectors/s3.js +12 -10
  128. package/dist/factory-assets/connectors/sharepoint.js +12 -10
  129. package/dist/factory-assets/connectors/sqlite.js +12 -10
  130. package/dist/factory-assets/connectors/static-server.js +12 -10
  131. package/dist/factory-assets/connectors/tunnel.js +12 -10
  132. package/dist/factory-assets/connectors/webdav.js +12 -10
  133. package/dist/factory-assets/connectors/xstate-store.js +12 -10
  134. package/dist/factory-assets/connectors/xstate.js +12 -10
  135. package/dist/{helpers-I537VC5V.js → helpers-ZJ67FO3Z.js} +15 -13
  136. package/dist/{helpers-I537VC5V.js.map → helpers-ZJ67FO3Z.js.map} +1 -1
  137. package/dist/{library-publish-IS56MNSL.js → library-publish-RGVXGTY4.js} +27 -25
  138. package/dist/library-publish-RGVXGTY4.js.map +1 -0
  139. package/dist/model-endpoint/index.js +3 -3
  140. package/dist/{open-library-P7ESNVXK.js → open-library-I5JHL37T.js} +16 -14
  141. package/dist/{open-library-P7ESNVXK.js.map → open-library-I5JHL37T.js.map} +1 -1
  142. package/dist/{project-XX4ZJ3IS.js → project-K5JWPIJ6.js} +23 -21
  143. package/dist/{project-XX4ZJ3IS.js.map → project-K5JWPIJ6.js.map} +1 -1
  144. package/dist/runner/index.js +18 -16
  145. package/dist/sdk/asset-manager.js +1 -1
  146. package/dist/sdk/bridge.js +11 -9
  147. package/dist/sdk/index.js +18 -16
  148. package/dist/sdk/index.js.map +1 -1
  149. package/dist/sdk/runner.js +18 -16
  150. package/dist/{serve-preflight-SHTST6WR.js → serve-preflight-L6VVCDM5.js} +17 -15
  151. package/dist/{serve-preflight-SHTST6WR.js.map → serve-preflight-L6VVCDM5.js.map} +1 -1
  152. package/dist/{setup-OBBZYSBG.js → setup-RXTNGML5.js} +16 -14
  153. package/dist/setup-RXTNGML5.js.map +1 -0
  154. package/dist/{source-3STGEDUY.js → source-2LP5W3ST.js} +25 -23
  155. package/dist/{source-3STGEDUY.js.map → source-2LP5W3ST.js.map} +1 -1
  156. package/dist/{source-manifest-publish-EL5SCBGK.js → source-manifest-publish-EZNCTSQF.js} +27 -25
  157. package/dist/source-manifest-publish-EZNCTSQF.js.map +1 -0
  158. package/dist/tui/index.js +18 -16
  159. package/dist/tui/index.js.map +1 -1
  160. package/dist/workspace-plugin/adapters/mcp.js +14 -12
  161. package/dist/workspace-plugin/adapters/omp.js +7 -7
  162. package/dist/workspace-plugin/index.js +1 -1
  163. package/package.json +1 -1
  164. package/dist/chunk-NGJAB5OS.js.map +0 -1
  165. package/dist/chunk-UDH4KZ53.js.map +0 -1
  166. package/dist/chunk-WWSRIT3J.js +0 -59
  167. package/dist/chunk-WWSRIT3J.js.map +0 -1
  168. package/dist/chunk-ZAU7IXIX.js.map +0 -1
  169. package/dist/ensure-sources-Z4PSTQE4.js.map +0 -1
  170. package/dist/library-publish-IS56MNSL.js.map +0 -1
  171. package/dist/setup-OBBZYSBG.js.map +0 -1
  172. package/dist/source-manifest-publish-EL5SCBGK.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/commands/source-manifest.ts","../cli/src/commands/source.ts"],"names":["path","existsSync","readdirSync","spawnSync","dest"],"mappings":"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","file":"chunk-L4G7AAKM.js","sourcesContent":["/**\n * `skaile source manifest …` — curated `skaile.manifest.yaml` lifecycle for a\n * source you do NOT own. `init` generates a curated manifest from a discovery\n * run and stores it OUTSIDE the source, under the local store catalog\n * (`~/.skaile/store/manifests/<slug>.yaml`); `edit` opens it in `$EDITOR` and\n * re-validates on save. `source add`/`sync` then apply it as a read overlay\n * (see `source.ts` `refreshManifestCache`).\n *\n * `rebuild` refreshes a curated manifest after an upstream change (merge by\n * default — curation is sacred; `--overwrite` re-scans). `verify` is a\n * read-only integrity check (paths, declared hashes, schema, dep refs).\n * `publish`/`propose`/`yank` remain stubs — they need the store publish\n * endpoint (`POST /sources/<id>/manifest`), which lands in a follow-up.\n *\n * @docLink cli/commands/source#manifest\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n type AssetEntry,\n decodeSkaileManifest,\n encodeSkaileManifest,\n parseAssetRef,\n resolveSourcePublisher,\n type SkPublishManifest,\n type SourceEntry,\n sourceCacheKey,\n sourceShortName,\n workspaceConfigFilename,\n} from \"@skaile/workspaces/core\";\nimport { computeDeterministicHash, discoverAssetsInTree } from \"@skaile/workspaces/discovery\";\nimport {\n commitStoreManifest,\n getStoreManifestsDir,\n storeManifestFile,\n writeCuratedManifest,\n} from \"@skaile/workspaces/library\";\nimport type { Command } from \"commander\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport { getKindRegistry } from \"../open-registry.ts\";\nimport {\n ensureClone,\n normalizeSourceUrl,\n readProjectSources,\n sourceClonePath,\n sourceMatchesKey,\n} from \"./source.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 * Resolve a `source manifest` argument into a `{ url, slug, dest }` triple.\n *\n * Resolution order:\n * 1. A key matching an already-registered project source (stored URL, cache\n * key, or short slug).\n * 2. A **store slug** whose manifest already exists in\n * `~/.skaile/store/manifests/`: the exact file name (`<host>__<owner>__<repo>` or the\n * `<repo>-<hash>` key of a non-GitHub URL), or — for the verbs that find a manifest, not\n * for `init` — the bare repo name of a non-GitHub URL (`srcA` for `srcA-e2d8fe81.yaml`,\n * p1691). This MUST be tried before bare-name expansion: a bare name like `cli` would\n * otherwise expand (via `normalizeSourceUrl`) to the skaile-ai org and a DIFFERENT slug\n * than the one `init` wrote (e.g. `larksuite`). The slug is the exact identifier `init`'s\n * next-step hint prints back.\n * 3. Otherwise a git URL / `owner/repo` / bare name via `normalizeSourceUrl`.\n *\n * The clone dir is the same URL-keyed cache `source add` uses.\n *\n * `ambiguous` lists the manifest slugs a bare name matched when it matched several.\n */\nexport function resolveSourceArg(\n arg: string,\n projectDir: string,\n opts: { byName?: boolean } = {},\n): {\n url: string;\n slug: string;\n dest: string;\n manifestFile: string;\n guessed: boolean;\n ambiguous?: string[];\n} {\n // Like `source list` / `check` / `add`: the project is `projectDir` itself, no parent search (p1860).\n const registered: SourceEntry[] = readProjectSources(\n path.join(path.resolve(projectDir), workspaceConfigFilename()),\n );\n const match = registered.find((e) => sourceMatchesKey(e, arg));\n const found = !match ? resolveByStoreSlug(arg, opts.byName ?? true) : undefined;\n const bySlug = found && \"url\" in found ? found : undefined;\n const url = match ? match.url : (bySlug?.url ?? normalizeSourceUrl(arg));\n const slug = sourceShortName(url); // human-facing label\n const dest = sourceClonePath(sourceCacheKey(url));\n return {\n url,\n slug,\n dest,\n manifestFile: bySlug?.manifestFile ?? storeManifestPath(url),\n guessed: !match && !bySlug,\n ...(found && \"ambiguous\" in found ? { ambiguous: found.ambiguous } : {}),\n };\n}\n\n/** The slugs (file names without `.yaml`) of the curated manifests in the store. */\nfunction storeManifestSlugs(): string[] {\n try {\n return readdirSync(getStoreManifestsDir())\n .filter((f) => f.endsWith(\".yaml\"))\n .map((f) => f.slice(0, -\".yaml\".length));\n } catch {\n return [];\n }\n}\n\n/** The origin URL of the clone a `<repo>-<hash>` key names, or `undefined` when none is there. */\nfunction cloneOriginUrl(key: string): string | undefined {\n const dest = sourceClonePath(key);\n if (!existsSync(dest)) return undefined;\n const r = spawnSync(\"git\", [\"-C\", dest, \"remote\", \"get-url\", \"origin\"], { encoding: \"utf8\" });\n const out = r.status === 0 ? r.stdout.trim() : \"\";\n return out || undefined;\n}\n\n/**\n * When `arg` names a curated manifest that exists on disk, recover the source URL and point at\n * that manifest file directly. `arg` is a store slug (`<host>__<owner>__<repo>`, or the\n * `<repo>-<hash>` key `init` gives a non-GitHub URL) or, with `byName`, the bare repo name of\n * such a manifest (`srcA` for `srcA-e2d8fe81.yaml`). A GitHub manifest is never found by its bare\n * repo name: `cli` means the skaile-ai repo, not `larksuite/cli`.\n * Returns `{ ambiguous }` when a bare name matches several, and `undefined` when the arg is no\n * slug or has no manifest (fall back to URL normalization).\n */\nfunction resolveByStoreSlug(\n arg: string,\n byName: boolean,\n): { url: string; manifestFile: string } | { ambiguous: string[] } | undefined {\n // A slug is our own encoding — no path/URL sigils. Anything URL/owner-repo shaped is not one.\n if (!/^[\\w.-]+$/.test(arg)) return undefined;\n const slugs = storeManifestSlugs();\n let slug: string | undefined = slugs.includes(arg) ? arg : undefined;\n if (!slug && byName) {\n // Only the `<repo>-<hash>` file of a non-GitHub URL: a bare name never picks one org's\n // `github.com__<org>__<repo>` manifest over the skaile-ai repo it expands to.\n const named = slugs.filter(\n (s) => s.startsWith(`${arg}-`) && /^[0-9a-f]{8}$/.test(s.slice(arg.length + 1)),\n );\n if (named.length === 1) slug = named[0];\n else if (named.length > 1) return { ambiguous: [...named].sort() };\n }\n if (!slug) return undefined;\n const manifestFile = path.join(getStoreManifestsDir(), `${slug}.yaml`);\n if (slug.includes(\"__\")) {\n // `<host>__<owner>__<repo>` → `https://<host>/<owner>/<repo>` — good enough to key the clone\n // dir + re-derive the same slug; the manifest file is what edit actually opens.\n const [host, owner, repo] = slug.split(\"__\");\n return { url: host && owner && repo ? `https://${host}/${owner}/${repo}` : slug, manifestFile };\n }\n // `<repo>-<hash>`: the hash hides the URL; the clone `init` made remembers it.\n const origin = cloneOriginUrl(slug);\n return origin ? { url: origin, manifestFile } : undefined;\n}\n\n/**\n * The `No curated manifest …` line of a verb that needs one. A bare name that matched several\n * manifests (`ambiguous`) is told to pick a slug or the URL instead.\n */\nexport function missingManifestMessage(\n slug: string,\n manifestFile: string,\n ambiguous?: readonly string[],\n): string {\n if (ambiguous?.length) {\n return (\n `\"${slug}\" matches several curated manifests: ${ambiguous.join(\", \")} — ` +\n \"pass one of these slugs or the full source URL.\"\n );\n }\n return (\n `No curated manifest for \"${slug}\" at ${S.dim(manifestFile)} — ` +\n \"run `skaile source manifest init` first.\"\n );\n}\n\n/**\n * Absolute path to a source's curated store manifest. Keyed by the\n * collision-free {@link storeManifestSlug} (`<host>__<owner>__<repo>`) so\n * `orgA/cli` and `orgB/cli` don't share `cli.yaml`.\n */\nfunction storeManifestPath(url: string): string {\n return storeManifestFile(url);\n}\n\n/**\n * Directory-name segments that mark a test-fixture tree. `init`/`rebuild` drop\n * any asset whose repo-relative root contains one of these as an exact path\n * SEGMENT. Repos routinely ship fixture \"skills\" under such dirs (e.g.\n * `scripts/skill-format-check/tests`, `internal/qualitygate/skillscan/testdata/skills/lark-demo`)\n * that are not real, publishable assets.\n */\nconst TEST_FIXTURE_SEGMENTS = new Set([\n \"tests\",\n \"test\",\n \"__tests__\",\n \"testdata\",\n \"fixtures\",\n \"__fixtures__\",\n]);\n\n/**\n * True when an asset's repo-relative `root` sits under a test-fixture directory\n * (see {@link TEST_FIXTURE_SEGMENTS}). Conservative, not repo-specific — finer\n * curation (keeping a genuine fixture asset) stays the user's job via `edit`.\n * `init`/`rebuild`-path only; the general discovery walk (`source add`) is\n * untouched.\n */\nfunction isTestFixtureAsset(relativePath: string): boolean {\n const segments = relativePath.replace(/\\\\/g, \"/\").split(\"/\");\n return segments.some((s) => TEST_FIXTURE_SEGMENTS.has(s));\n}\n\n/**\n * `source manifest init <src>` — clone (if needed), run discovery, and write a\n * curated `skaile.manifest.yaml` to `~/.skaile/store/manifests/<slug>.yaml`.\n */\nasync function runInit(\n arg: string,\n opts: { projectDir: string; publisher?: string; dev?: boolean; force?: boolean },\n): Promise<void> {\n const projectDir = path.resolve(opts.projectDir);\n const {\n url,\n dest,\n manifestFile: target,\n guessed,\n } = resolveSourceArg(arg, projectDir, {\n byName: false,\n });\n // The same rule `source add` applies (p394): a bare name that is no registered source and no\n // store slug used to expand to a made-up `skaile-ai/<name>` repo and clone it over SSH.\n if (guessed && /^[\\w.-]+$/.test(arg.trim().replace(/\\.git$/, \"\"))) {\n logErr(\n `\"${arg}\" is not a git URL or an owner/repo shorthand. ` +\n \"Use `skaile source manifest init <owner>/<repo>` or the full URL.\",\n );\n process.exitCode = 1;\n return;\n }\n\n if (existsSync(target) && !opts.force) {\n logWarn(\n `A curated manifest already exists at ${S.dim(target)}. ` +\n \"Edit it with `skaile source manifest edit`, refresh it after an upstream \" +\n \"change with `skaile source manifest rebuild`, or pass --force to regenerate.\",\n );\n return;\n }\n\n const entry: SourceEntry = { url };\n ensureClone(entry);\n\n const { assets, errors } = discoverCuratableAssets(dest, opts.dev ?? false);\n\n const publisher = opts.publisher ?? resolveSourcePublisher(dest) ?? sourceShortName(url);\n\n const written = writeCuratedManifest({\n manifestFile: target,\n publisher,\n assets,\n force: opts.force,\n // Init: every asset inherits the top-level repo `publisher`. Do NOT stamp a\n // per-asset publisher — glob discovery here runs without the resolved\n // publisher, so each DiscoveredAsset.publisher is only the clone directory\n // name, which would clobber the intended org/`--publisher` default with\n // junk per-asset overrides.\n inheritPublisher: true,\n });\n\n if (!written.wrote) {\n logWarn(\n `Curated manifest already exists at ${S.dim(target)} — not overwritten. ` +\n \"Pass --force to regenerate.\",\n );\n return;\n }\n\n commitStoreManifest(\n target,\n `manifest init: ${sourceShortName(url)} (${written.assetCount} assets)`,\n );\n logOk(`Wrote curated manifest with ${written.assetCount} assets to ${S.dim(target)}.`);\n // `edit` takes the <src> the user passed (`resolveSourceArg` maps it back to this\n // manifest), but `source add` needs the URL: a bare name there is no source.\n logInfo(\n `Edit it with \\`skaile source manifest edit ${arg}\\`, then ` +\n `\\`skaile source add ${url}\\` to consume it.`,\n );\n if (errors.length > 0) {\n logWarn(`${errors.length} discovery error(s) — inspect the manifest before consuming.`);\n }\n}\n\n/**\n * Run discovery over a clone and drop the test-fixture assets (see\n * {@link isTestFixtureAsset}). Shared by `init` and `rebuild` so both paths\n * produce an identical inventory from the same tree.\n */\nfunction discoverCuratableAssets(\n dest: string,\n includeDev: boolean,\n): { assets: ReturnType<typeof discoverAssetsInTree>[\"assets\"]; errors: string[] } {\n const result = discoverAssetsInTree(dest, {\n registry: getKindRegistry(),\n includeDev,\n });\n const assets = result.assets.filter((a) => !isTestFixtureAsset(a.relativePath));\n return { assets, errors: result.errors.map((e) => `${e.path}: ${e.error}`) };\n}\n\n/**\n * Best-effort `git pull --ff-only` on an existing clone. Never throws: a pull\n * failure (offline, diverged, detached) is warned and the caller continues with\n * the clone as-is.\n */\nfunction pullCloneFfOnly(dest: string): void {\n const res = spawnSync(\"git\", [\"-C\", dest, \"pull\", \"--ff-only\"], { stdio: \"pipe\" });\n if (res.status !== 0) {\n logWarn(\n \"git pull --ff-only failed — continuing with the existing clone \" +\n \"(it may be behind upstream).\",\n );\n }\n}\n\n/**\n * Repo-relative `root` path for a manifest asset entry — the merge match key\n * between an existing curated entry and a freshly-discovered asset. `root:`\n * entries use their declared path; a `files:`-only entry (rare for a curated\n * sidecar) falls back to the entry's dirname of the first file, else the name.\n */\nfunction entryRootKey(entry: AssetEntry): string {\n if (entry.root) return entry.root.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const files = entry.files;\n if (files && files.length > 0) {\n const first = typeof files[0] === \"string\" ? files[0] : files[0].path;\n const dir = path.posix.dirname(first.replace(/\\\\/g, \"/\"));\n return dir === \".\" ? entry.name : dir;\n }\n return entry.name;\n}\n\n/** Repo-relative `root` path a discovered asset maps to (matches init's writer). */\nfunction discoveredRootKey(relativePath: string): string {\n const dir = path.posix.dirname(relativePath.replace(/\\\\/g, \"/\"));\n return dir === \".\" ? path.posix.basename(relativePath.replace(/\\\\/g, \"/\")) : dir;\n}\n\n/** Human ref for reporting: `kind:name`. */\nfunction entryRef(entry: AssetEntry): string {\n return `${entry.kind}:${entry.name}`;\n}\n\n/**\n * `source manifest rebuild <src>` — refresh a curated manifest after the\n * upstream repo changed. MERGE is the default (curation is sacred); `--overwrite`\n * re-scans from scratch with `init --force` semantics.\n *\n * Merge algorithm (match by repo-relative `root` path):\n * - Existing entries whose root is STILL discovered → KEPT verbatim (all\n * hand-edits preserved).\n * - Existing entries whose root is GONE upstream → DROPPED (reported).\n * - Freshly-discovered assets not already in the manifest → NOT auto-added,\n * only REPORTED (a curated foreign sidecar must not silently absorb new\n * upstream skills). An asset the curator deliberately dropped stays dropped\n * because it is neither in the existing manifest nor re-added here.\n */\nasync function runRebuild(\n arg: string,\n opts: { projectDir: string; publisher?: string; dev?: boolean; overwrite?: boolean },\n): Promise<void> {\n const projectDir = path.resolve(opts.projectDir);\n const { url, dest, slug, manifestFile: target, ambiguous } = resolveSourceArg(arg, projectDir);\n\n if (!existsSync(target)) {\n logErr(missingManifestMessage(slug, target, ambiguous));\n process.exit(1);\n }\n\n // Update the clone: clone if absent, else pull --ff-only (best-effort).\n const entry: SourceEntry = { url };\n const cloned = ensureClone(entry);\n if (!cloned) pullCloneFfOnly(dest);\n\n const { assets: freshAssets, errors } = discoverCuratableAssets(dest, opts.dev ?? false);\n\n if (opts.overwrite) {\n logWarn(\n \"--overwrite: replacing the curated manifest with a full fresh inventory. \" +\n \"All hand-curation (dropped assets, per-asset edits) is discarded.\",\n );\n const publisher = opts.publisher ?? resolveSourcePublisher(dest) ?? sourceShortName(url);\n const written = writeCuratedManifest({\n manifestFile: target,\n publisher,\n assets: freshAssets,\n force: true,\n inheritPublisher: true,\n });\n commitStoreManifest(\n target,\n `manifest rebuild --overwrite: ${slug} (${written.assetCount} assets)`,\n );\n logOk(\n `Rebuilt curated manifest with ${written.assetCount} assets to ${S.dim(target)} (overwrite).`,\n );\n if (errors.length > 0) {\n logWarn(`${errors.length} discovery error(s) — inspect the manifest before consuming.`);\n }\n return;\n }\n\n // MERGE (default). `--publisher` only applies to the full re-derive path.\n if (opts.publisher) {\n logWarn(\n \"--publisher is ignored in merge mode (the curated publisher is preserved). \" +\n \"Use --overwrite to re-derive the publisher from a full re-scan.\",\n );\n }\n\n // Read the existing curated manifest and keep it as the base.\n const { manifest: existing } = decodeSkaileManifest(readFileSync(target, \"utf-8\"));\n const existingEntries = existing.assets ?? [];\n\n // Index fresh discovery by repo-relative root path.\n const freshByRoot = new Map<string, (typeof freshAssets)[number]>();\n for (const a of freshAssets) freshByRoot.set(discoveredRootKey(a.relativePath), a);\n\n const kept: AssetEntry[] = [];\n const dropped: string[] = [];\n for (const e of existingEntries) {\n if (freshByRoot.has(entryRootKey(e))) kept.push(e);\n else dropped.push(entryRef(e));\n }\n\n // Fresh assets not already curated → report as available, do NOT add.\n const existingRoots = new Set(existingEntries.map(entryRootKey));\n const newlyAvailable: string[] = [];\n for (const a of freshAssets) {\n if (!existingRoots.has(discoveredRootKey(a.relativePath))) {\n newlyAvailable.push(`${a.kind}:${a.name}`);\n }\n }\n\n const changed = dropped.length > 0;\n if (dropped.length > 0) {\n logWarn(`removed (gone upstream): ${dropped.sort().join(\", \")}`);\n }\n if (newlyAvailable.length > 0) {\n logInfo(\n `${newlyAvailable.length} new upstream asset(s) available (not added): ` +\n `${newlyAvailable.sort().join(\", \")} — add with \\`skaile source manifest edit ${arg}\\` if wanted`,\n );\n }\n\n if (!changed) {\n logOk(\"already up to date\");\n if (errors.length > 0) {\n logWarn(`${errors.length} discovery error(s) — inspect the source before re-consuming.`);\n }\n return;\n }\n\n const merged: SkPublishManifest = { ...existing, assets: kept };\n writeFileSync(target, encodeSkaileManifest(merged), \"utf-8\");\n commitStoreManifest(\n target,\n `manifest rebuild: ${slug} (kept ${kept.length}, dropped ${dropped.length})`,\n );\n logOk(\n `Rebuilt curated manifest: kept ${kept.length}, dropped ${dropped.length} → ${S.dim(target)}.`,\n );\n if (errors.length > 0) {\n logWarn(`${errors.length} discovery error(s) — inspect the source before re-consuming.`);\n }\n}\n\n/**\n * `source manifest verify <src>` — READ-ONLY integrity check of a curated\n * manifest against its clone. Writes nothing. Exit 0 when no errors; with\n * `--strict`, any warning also forces a nonzero exit.\n *\n * Per-asset checks:\n * - `root`/`files` paths still exist upstream (missing → error).\n * - A declared `sha256` recomputes to the same deterministic hash (mismatch → error).\n * - Schema decode diagnostics map to errors/warnings.\n * - Dependency refs parse via `parseAssetRef` (malformed → warning).\n */\nasync function runVerify(\n arg: string,\n opts: { projectDir: string; strict?: boolean },\n): Promise<void> {\n const projectDir = path.resolve(opts.projectDir);\n const { url, dest, slug, manifestFile: target, ambiguous } = resolveSourceArg(arg, projectDir);\n\n if (!existsSync(target)) {\n logErr(missingManifestMessage(slug, target, ambiguous));\n process.exit(1);\n }\n\n // Ensure a clone exists to verify paths/hashes against (best-effort; no pull).\n ensureClone({ url });\n\n const text = readFileSync(target, \"utf-8\");\n const { manifest, diagnostics } = decodeSkaileManifest(text);\n\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Schema diagnostics from the decoder.\n for (const d of diagnostics) {\n const line = `${d.code}: ${d.message}`;\n if (d.severity === \"error\") errors.push(line);\n else warnings.push(line);\n }\n\n const assets = manifest.assets ?? [];\n for (const entry of assets) {\n const ref = entryRef(entry);\n\n // Path existence: `root` dir and/or each `files[]` path.\n const relPaths: string[] = [];\n if (entry.root) relPaths.push(entry.root);\n if (entry.files) {\n for (const f of entry.files) relPaths.push(typeof f === \"string\" ? f : f.path);\n }\n if (relPaths.length === 0) relPaths.push(entry.name);\n for (const rel of relPaths) {\n if (!existsSync(path.join(dest, rel))) {\n errors.push(`${ref}: path not found upstream: ${rel}`);\n }\n }\n\n // Declared sha256 → recompute + compare, but ONLY for granular `files:`\n // entries. Discovery (`discover-manifest.ts`) anchors a `files:`-only entry\n // at the REPO ROOT and hashes the files VERBATIM as repo-relative strings\n // (the path is folded into the digest), so verify must hash the same way:\n // `assetRoot = dest`, files kept repo-relative — NOT rebased onto the root.\n // A `root:` entry cannot be verified this way (discovery hashes only the\n // per-kind filtered set, not the whole-dir walk), and the writer never emits\n // sha256 for `root:` entries, so skip the hash check for them.\n if (entry.sha256) {\n if (entry.files && entry.files.length > 0) {\n const hashFiles = entry.files.map((f) =>\n (typeof f === \"string\" ? f : f.path).replace(/\\\\/g, \"/\"),\n );\n const actual = computeDeterministicHash(dest, hashFiles);\n if (actual !== entry.sha256) {\n errors.push(\n `${ref}: sha256 mismatch (declared ${entry.sha256.slice(0, 12)}…, got ${actual.slice(0, 12)}…)`,\n );\n }\n } else {\n warnings.push(\n `${ref}: declared sha256 on a root:-mode entry is not verifiable (discovery hashes only the per-kind filtered set) — skipped`,\n );\n }\n }\n\n // Dependency refs parse.\n for (const dep of entry.dependencies ?? []) {\n try {\n parseAssetRef(dep);\n } catch (err) {\n warnings.push(\n `${ref}: malformed dependency \"${dep}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n for (const w of warnings) logWarn(w);\n for (const e of errors) logErr(e);\n\n if (errors.length === 0) {\n logOk(`verified ${assets.length} asset(s).`);\n } else {\n logErr(`${errors.length} issue(s).`);\n }\n\n const failStrict = opts.strict && warnings.length > 0;\n if (errors.length > 0 || failStrict) process.exit(1);\n}\n\n/**\n * Split a `$VISUAL`/`$EDITOR` value into `{ command, args }` and append the file\n * as the final arg. The env value is a full command line, not a bare binary —\n * `EDITOR=\"code --wait\"` must spawn `code` with `[\"--wait\", <file>]`, and\n * `EDITOR=code` (which returns before save) is the user's problem, not ours.\n * A whitespace split covers the common editors (`code --wait`, `code -w`,\n * `subl -w`, `vi`); paths with embedded spaces are not supported (rare for an\n * editor binary and out of scope). Falls back to `vi` when unset/empty.\n *\n * @docLink cli/commands/source#manifest-edit\n */\nexport function resolveEditorCommand(\n editorEnv: string | undefined,\n target: string,\n): { command: string; args: string[] } {\n const parts = (editorEnv ?? \"\").trim().split(/\\s+/).filter(Boolean);\n const [command, ...rest] = parts.length > 0 ? parts : [\"vi\"];\n return { command: command as string, args: [...rest, target] };\n}\n\n/** Minimal spawn contract runEdit needs — lets tests inject a fake. */\ntype SpawnLike = (\n command: string,\n args: string[],\n opts: { stdio: \"inherit\" },\n) => { status: number | null };\n\n/**\n * `source manifest edit <src>` — open the curated store manifest in `$EDITOR`\n * and re-validate on save. Warnings are surfaced but never hard-fail.\n *\n * `spawn` is injectable so tests can assert the argv without launching a real\n * editor; production passes the default `spawnSync`.\n */\nexport function runEdit(\n arg: string,\n opts: { projectDir: string },\n spawn: SpawnLike = spawnSync as unknown as SpawnLike,\n): void {\n const projectDir = path.resolve(opts.projectDir);\n const { slug, manifestFile: target, ambiguous } = resolveSourceArg(arg, projectDir);\n\n if (!existsSync(target)) {\n logErr(missingManifestMessage(slug, target, ambiguous));\n process.exit(1);\n }\n\n const { command, args } = resolveEditorCommand(process.env.VISUAL || process.env.EDITOR, target);\n const res = spawn(command, args, { stdio: \"inherit\" });\n if (res.status !== 0 && res.status !== null) {\n logErr(`Editor exited with status ${res.status}.`);\n process.exit(1);\n }\n\n commitStoreManifest(target, `manifest edit: ${slug}`);\n\n // Re-validate the saved file; surface diagnostics as warnings, don't hard-fail.\n const { diagnostics } = decodeSkaileManifest(readFileSync(target, \"utf-8\"));\n const errors = diagnostics.filter((d) => d.severity === \"error\");\n const warnings = diagnostics.filter((d) => d.severity !== \"error\");\n if (errors.length > 0) {\n for (const d of errors) logErr(`${d.code}: ${d.message}`);\n logWarn(\"Manifest has errors — fix them before `skaile source add` will consume it.\");\n } else if (warnings.length > 0) {\n for (const d of warnings) logWarn(`${d.code}: ${d.message}`);\n logOk(\"Saved (with warnings).\");\n } else {\n logOk(\"Saved.\");\n }\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 // enablePositionalOptions so options on the leaf verb (`source manifest init\n // --publisher …`) route to that verb instead of being rejected by `manifest`.\n const manifest = src\n .command(\"manifest\")\n .description(\"Curated manifest lifecycle for a source\")\n .enablePositionalOptions();\n\n manifest\n .command(\"init <src>\")\n .description(\"Generate a curated manifest for a source (stored in the local store catalog)\")\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .option(\"--publisher <name>\", \"Override the publisher (default: source's GitHub org)\")\n .option(\"--dev\", \"Include assets under the source's dev_paths\", false)\n .option(\"--force\", \"Overwrite an existing curated manifest\", false)\n .action((arg, opts) => runInit(arg, opts));\n\n manifest\n .command(\"edit <src>\")\n .description(\"Open the curated manifest in $EDITOR and re-validate on save\")\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .action((arg, opts) => runEdit(arg, opts));\n\n manifest\n .command(\"rebuild <src>\")\n .description(\n \"Refresh a curated manifest after an upstream change (merge by default: \" +\n \"keeps curation, drops assets gone upstream, reports new ones without adding)\",\n )\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .option(\"--publisher <name>\", \"Override the publisher (--overwrite only)\")\n .option(\"--dev\", \"Include assets under the source's dev_paths\", false)\n .option(\"--overwrite\", \"Discard curation and re-scan the full inventory\", false)\n .action((arg, opts) => runRebuild(arg, opts));\n\n manifest\n .command(\"verify <src>\")\n .description(\"Verify hashes, deps, and schema (read-only)\")\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .option(\"--strict\", \"Fail on advisory checks (warnings force a nonzero exit)\", false)\n .action((arg, opts) => runVerify(arg, opts));\n\n manifest\n .command(\"publish <src>\")\n .description(\"Push the curated sidecar manifest and publish it to the store\")\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .option(\"--as <namespace>\", \"Publisher namespace (default: your store username)\")\n .option(\"--sidecar-repo <url>\", \"Public GitHub repo you own to hold the curated manifest\")\n .option(\"--ref <gitref>\", \"Foreign source ref to ingest (branch/sha; default: main)\")\n .option(\"--dry-run\", \"Print the publish plan without pushing or calling the store\", false)\n .action(async (arg, opts) => {\n const { runPublish } = await import(\"./source-manifest-publish.ts\");\n await runPublish(arg, opts);\n });\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 the source's published assets from the store\")\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .option(\"--asset <ref>\", \"Yank only the asset matching this ref/name\")\n .action(async (arg, opts) => {\n const { runYank } = await import(\"./source-manifest-publish.ts\");\n await runYank(arg, opts);\n });\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 * `<cache root>/sources/<host>/<owner>/<repo>/` (`~/.skaile/cache` unless `SKAILE_HOME` or\n * `SKAILE_CACHE_DIR` moves it; machine-global cache, shared across projects, URL-keyed so\n * cross-org repos never collide), and the manifest is mirrored into `<skaile home>/index.db`\n * (machine-global manifest cache).\n *\n * @docLink cli/commands/source\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n realpathSync,\n renameSync,\n rmdirSync,\n rmSync,\n statSync,\n} from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n attachToBranch,\n buildProvenanceIndex,\n discardUnclonedSourceDir,\n getGlobalCacheDir,\n getRepoCommit,\n missingPinMessage,\n globalCacheRoot,\n globalSkaileDir,\n isSameRemote,\n isSourceCloned,\n priorSourceCacheKeys,\n resolveSkWorkspaceConfig,\n resolveSourcePublisher,\n type SourceEntry,\n sourceCacheKey,\n sourceShortName,\n unpublishedCommitAdvice,\n WorkspaceYamlEditor,\n workspaceConfigFilename,\n} from \"@skaile/workspaces/core\";\nimport { AssetManager } from \"@skaile/workspaces/asset-manager\";\nimport { curatedManifestOverlay, LocalCatalogSource } from \"@skaile/workspaces/library\";\nimport * as p from \"@clack/prompts\";\nimport { Command } from \"commander\";\nimport { logErr, logInfo, logNoProject, logOk, logWarn, S } from \"../helpers.ts\";\nimport { openLibraryManager } from \"../open-library.ts\";\nimport { getKindRegistry, getKnownKinds } from \"../open-registry.ts\";\nimport { requireValidPublisherOrExit } from \"./library-index.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 * The one spelling of a full git URL or scp-style spec: trailing slashes dropped, scheme and\n * host in lower case (userinfo, path and a `.git` suffix stay as typed). `…/skillz.git/` and\n * `HTTPS://GitHub.com/o/skillz.git` are the source `…/skillz.git` already is (p891, p722).\n */\nfunction canonicalGitUrl(spec: string): string {\n const noSlash = spec.replace(/\\/+$/, \"\");\n const url = /^([a-z][a-z0-9+.-]*):\\/\\/([^/]*)(.*)$/i.exec(noSlash);\n if (url) {\n const scheme = (url[1] ?? \"\").toLowerCase();\n // A `file://` path with `.`, `..` or `//` segments is the one repository its folded path\n // names: `file:///a/r1/../remotes/x.git` is `file:///a/remotes/x.git` (p1856).\n if (scheme === \"file\" && url[2] === \"\" && /(?:^|\\/)\\.\\.?(?:\\/|$)|\\/\\//.test(url[3] ?? \"\")) {\n return `file://${path.posix.normalize(url[3] ?? \"\")}`;\n }\n const authority = url[2] ?? \"\";\n const at = authority.lastIndexOf(\"@\");\n const host = authority.slice(at + 1).toLowerCase();\n return `${scheme}://${authority.slice(0, at + 1)}${host}${url[3] ?? \"\"}`;\n }\n const scp = /^(git@)([^:]+):(.*)$/.exec(noSlash);\n return scp ? `${scp[1]}${(scp[2] ?? \"\").toLowerCase()}:${scp[3] ?? \"\"}` : noSlash;\n}\n\n/**\n * Normalize a `source add` argument into a clonable git URL. Full URLs and\n * scp-style (`git@host:…`) specs keep their form but get the canonical spelling of\n * {@link canonicalGitUrl}; a local path (`/abs`, `./rel`,\n * `../rel`, `~/x`) becomes an absolute, normalised path so the same repo added from two\n * directories is one source and a clone never depends on the cwd; 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 canonicalGitUrl(s);\n if (/^(?:\\/|\\.{1,2}(?:\\/|$)|~\\/)/.test(s)) {\n const abs = path.resolve(s.startsWith(\"~/\") ? path.join(os.homedir(), s.slice(2)) : s);\n // The same folder reached through a symlink (macOS `/var` → `/private/var`) is one source.\n try {\n return realpathSync(abs);\n } catch {\n return abs;\n }\n }\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 * Name a source in output: its repo short name, or its clone-cache key when\n * another source in the project shares that short name (two `skillz` repos of\n * different owners). The key is unique per URL and `source show`/`remove` accept it.\n */\nexport function sourceLabel(entry: SourceEntry, all: readonly SourceEntry[]): string {\n const short = sourceShortName(entry.url);\n const shared = all.some((s) => s.url !== entry.url && sourceShortName(s.url) === short);\n return shared ? sourceCacheKey(entry.url) : short;\n}\n\n/** Outcome of {@link resolveSource}. */\nexport type SourceResolution =\n | { kind: \"one\"; entry: SourceEntry }\n | { kind: \"ambiguous\"; entries: SourceEntry[] }\n | { kind: \"none\" };\n\n/**\n * `true` for a source on this machine: an absolute path or a `file://` URL. The two spellings of\n * one repository share a clone-cache key and are one source (p618).\n */\nfunction isLocalSourceUrl(url: string): boolean {\n return url.startsWith(\"/\") || url.startsWith(\"file://\");\n}\n\n/**\n * Pick the one source `key` names. Exact forms win over names: the stored URL,\n * then the cache key, then the repo short name or a `source add` shortcut, then the other\n * spelling of a local repository (`file:///x/r.git` for a source added as `/x/r.git`). A\n * name that several sources share (`skillz` from two owners) is `ambiguous`\n * instead of silently picking the first.\n */\nexport function resolveSource(sources: readonly SourceEntry[], key: string): SourceResolution {\n const tiers: ((s: SourceEntry) => boolean)[] = [\n (s) => s.url === key,\n (s) => sourceCacheKey(s.url) === key,\n (s) => sourceShortName(s.url) === key || s.url === normalizeSourceUrl(key),\n (s) =>\n isLocalSourceUrl(key) &&\n isLocalSourceUrl(s.url) &&\n realLocalCacheKey(s.url) === realLocalCacheKey(normalizeSourceUrl(key)),\n ];\n for (const tier of tiers) {\n const hits = sources.filter(tier);\n if (hits.length === 1) return { kind: \"one\", entry: hits[0] };\n if (hits.length > 1) return { kind: \"ambiguous\", entries: hits };\n }\n return { kind: \"none\" };\n}\n\nfunction exitAmbiguousSource(key: string, entries: readonly SourceEntry[]): never {\n logErr(`\"${key}\" matches ${entries.length} sources; pass the URL of the one you mean:`);\n for (const e of entries) console.error(` ${e.url}`);\n process.exit(1);\n}\n\n/**\n * git's stderr as one line: every line but the `hint:` advice and the\n * `From <url>` / ` * branch …` fetch progress, joined by spaces. Keeps the\n * cause (`fatal: '<path>' does not appear to be a git repository`).\n */\nfunction pullFailureReason(stderr: string): string {\n return stderr\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l !== \"\" && !/^(hint:|From |[*+=!-] )/.test(l))\n .join(\" \");\n}\n\n/** The advisory a reference lint raises for a file the asset filter leaves out. */\nconst FILTER_ADVISORY = \"not captured by the file filter\";\n\n/**\n * Print the advisories of one indexing run. The reference notes about files outside the asset\n * filter are one line with a count unless `verbose`; every other advisory stays on its own line\n * (p1031: a source such as ai-assets printed 77 of them on every sync).\n */\nfunction logAdvisories(advisories: readonly string[], verbose: boolean, slug?: string): void {\n const prefix = slug ? `${slug}: ` : \"\";\n const filtered = advisories.filter((a) => a.includes(FILTER_ADVISORY));\n for (const advisory of advisories) {\n if (verbose || !advisory.includes(FILTER_ADVISORY)) logInfo(`${prefix}${advisory}`);\n }\n if (!verbose && filtered.length > 0) {\n logInfo(\n `${prefix}${filtered.length} referenced file${filtered.length === 1 ? \"\" : \"s\"} outside the asset filter (pass --verbose to list them)`,\n );\n }\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 = realLocalCacheKey(url);\n return sources.find((s) => s.url !== url && realLocalCacheKey(s.url) === key);\n}\n\n/**\n * The clone-cache key of `url`; a repository on this machine is keyed by its real path, so a\n * symlinked spelling (`/var/x` for `/private/var/x`) is the same source (p618).\n */\nfunction realLocalCacheKey(url: string): string {\n const local = url.startsWith(\"file://\") ? url.slice(\"file://\".length) : url;\n if (local.startsWith(\"/\") && existsSync(local)) {\n try {\n return sourceCacheKey(realpathSync(local));\n } catch {\n // fall through to the spelling\n }\n }\n return sourceCacheKey(url);\n}\n\n/**\n * `projectDir` when it holds its own `skaile.yaml`, else `undefined`. Like `list`, `check` and\n * `add`, the `source` commands never search parent directories (p1860).\n */\nfunction projectRootOf(projectDir: string): string | undefined {\n const dir = path.resolve(projectDir);\n return existsSync(path.join(dir, workspaceConfigFilename())) ? dir : undefined;\n}\n\n/** The `skaile.yaml` path of `projectDir`; stops with the `No skaile.yaml found` lines when it has none. */\nfunction requireProjectYamlPath(projectDir: string): string {\n const root = projectRootOf(projectDir);\n if (!root) {\n logNoProject(projectDir);\n process.exit(1);\n }\n return path.join(root, workspaceConfigFilename());\n}\n\n/**\n * Load `skaile.yaml` for a `source` command. A file that does not parse stops the command with\n * the one `<file> — parse error: <reason>` line `check` and `install` print: it is not \"no\n * sources\", and nothing is written to it (p1421).\n */\nexport function loadProjectEditor(yamlPath: string): WorkspaceYamlEditor {\n try {\n return WorkspaceYamlEditor.load(yamlPath);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logErr(/ — parse error: /.test(message) ? message : `Could not read ${yamlPath}: ${message}`);\n process.exit(1);\n }\n}\n\nexport function readProjectSources(yamlPath: string): SourceEntry[] {\n if (!existsSync(yamlPath)) return [];\n try {\n return loadProjectEditor(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 * Labels of the sources `projectDir`'s `skaile.yaml` declares whose clone is not in the cache\n * (`cache clean --global`, a failed clone). Empty outside a project. Never reads the network.\n */\nexport function uncachedSources(projectDir: string): string[] {\n const root = projectRootOf(projectDir);\n if (!root) return [];\n const sources = readProjectSources(path.join(root, workspaceConfigFilename()));\n return sources\n .filter((s) => !isSourceCloned(sourceClonePath(sourceCacheKey(s.url))))\n .map((s) => sourceLabel(s, sources));\n}\n\n/**\n * Drop the library rows of source clones whose folder is gone. A clone is cache, so its row goes\n * with it (`cache clean --global`); the next `source sync` that clones it registers it again.\n * Rows of libraries registered by hand never count: only a reader row inside the clone cache.\n */\nexport async function dropVanishedSourceRows(): Promise<number> {\n const cloneRoots = [getGlobalCacheDir(), path.join(globalSkaileDir(), \"sources\")].map((d) =>\n path.resolve(d),\n );\n const { manager, close } = await openLibraryManager();\n try {\n let dropped = 0;\n for (const l of await manager.listLibraries()) {\n const at = path.resolve(l.path);\n if (l.ownership !== \"reader\" || !cloneRoots.some((r) => at.startsWith(r + path.sep)))\n continue;\n if (existsSync(at)) continue;\n await manager.removeLibrary(l.name, { purge: false });\n dropped++;\n }\n return dropped;\n } finally {\n close();\n }\n}\n\n/** Remove the empty `<owner>` / `<host>` directories a failed clone left under `sources/`. */\nfunction pruneEmptyCloneParents(dest: string): void {\n let dir = path.dirname(dest);\n while (path.basename(dir) !== \"sources\" && dir !== path.dirname(dir)) {\n try {\n if (readdirSync(dir).length > 0) return;\n rmdirSync(dir);\n } catch {\n return;\n }\n dir = path.dirname(dir);\n }\n}\n\n/**\n * A fresh clone whose remote HEAD names a branch the remote lacks has no commit checked out and\n * an empty tree. When the remote has exactly one branch, check it out; with several,\n * or none that can be told apart, return the problem line. `undefined` when a commit is checked\n * out, and for a remote with no branch at all (an empty repository, filled later).\n */\nfunction repairUnbornClone(dest: string): string | undefined {\n const git = (...args: string[]) =>\n spawnSync(\"git\", [\"-C\", dest, ...args], { stdio: \"pipe\", encoding: \"utf8\" });\n if (git(\"rev-parse\", \"--verify\", \"-q\", \"HEAD\").status === 0) return undefined;\n const branches = git(\"for-each-ref\", \"--format=%(refname:short)\", \"refs/remotes/origin\")\n .stdout.split(\"\\n\")\n .map((b) => b.trim())\n .filter((b) => b !== \"\" && b !== \"origin/HEAD\" && b !== \"origin\");\n if (branches.length === 0) return undefined;\n const only = branches[0];\n if (branches.length === 1 && only) {\n const name = only.replace(/^origin\\//, \"\");\n if (git(\"checkout\", \"-q\", \"-B\", name, only).status === 0) return undefined;\n }\n return `the remote HEAD names a branch that does not exist; pass --pin <branch> (${branches\n .map((b) => b.replace(/^origin\\//, \"\"))\n .join(\", \")})`;\n}\n\n/**\n * Clone the source if its clone directory does not yet exist. When `force` is\n * set, the existing clone is replaced by a fresh checkout. Returns true when a\n * clone happened. The cache slug is derived from the URL.\n *\n * A `--force` re-clone moves the old clone aside first and only deletes it once\n * the fresh clone succeeds — so a failed re-clone restores the previous clone\n * rather than leaving the source registered with no cache behind it.\n */\nexport function ensureClone(entry: SourceEntry, opts: { force?: boolean } = {}): boolean {\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n let backup: string | undefined;\n if (!isSourceCloned(dest)) discardUnclonedSourceDir(dest);\n if (entry.pin && (opts.force || !isSourceCloned(dest))) {\n // Say so before git does: its own line (`Remote branch x not found in upstream origin`) names no branch to use.\n const missing = missingPinMessage(entry.url, entry.pin);\n if (missing) {\n logErr(missing);\n process.exit(1);\n }\n }\n if (isSourceCloned(dest)) {\n if (!opts.force) return false;\n backup = `${dest}.bak`;\n rmSync(backup, { recursive: true, force: true });\n renameSync(dest, backup);\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 const unborn = clone.status === 0 ? repairUnbornClone(dest) : undefined;\n if (clone.status !== 0 || unborn) {\n if (backup) {\n rmSync(dest, { recursive: true, force: true });\n renameSync(backup, dest);\n } else {\n // Nothing was there before: leave no empty `<host>/<owner>/` directories behind.\n rmSync(dest, { recursive: true, force: true });\n pruneEmptyCloneParents(dest);\n }\n logErr(unborn ? `${entry.url}: ${unborn}` : `git clone failed for ${entry.url}`);\n process.exit(1);\n }\n if (backup) rmSync(backup, { recursive: true, force: true });\n return true;\n}\n\n/**\n * Advance an existing clone with `git pull --ff-only`. `add` and\n * `install --locked` leave the shared clone on a detached HEAD at the locked\n * commit, where `git pull` refuses to run, so a detached clone is put back on\n * its branch first (the pin when it is a branch, else the remote's default).\n * An entry pinned to a tag or SHA has nothing to pull and counts as synced.\n * On failure `error` is one line: git's whole stderr minus `hint:` advice and fetch progress.\n */\nexport function pullSourceClone(\n dest: string,\n entry: SourceEntry,\n): { ok: true } | { ok: false; error: string } {\n // The declaration is authoritative: a clone whose `origin` was pointed elsewhere\n // fetches from the declared url again, as `install` does.\n spawnSync(\"git\", [\"-C\", dest, \"remote\", \"set-url\", \"origin\", entry.url], { stdio: \"pipe\" });\n if (!attachToBranch(dest, entry.pin) && entry.pin) return { ok: true };\n const pull = spawnSync(\"git\", [\"pull\", \"--ff-only\"], {\n cwd: dest,\n stdio: \"pipe\",\n encoding: \"utf8\",\n });\n if (pull.status === 0) return { ok: true };\n const reason = pullFailureReason(pull.stderr) || `git exited with status ${pull.status}`;\n return { ok: false, error: `git pull failed: ${reason}${unpublishedCommitAdvice(dest)}` };\n}\n\n/**\n * Library name for a new source row: the repo short name, or `<owner>-<repo>`\n * (then `<host>-<owner>-<repo>`) when another library already holds that name.\n * Rows are found by clone path, never by this name: `orgA/repo` and\n * `orgB/repo` share the short name `repo`.\n */\nfunction sourceLibraryName(url: string, libs: readonly { name: string }[]): string {\n const taken = new Set(libs.map((l) => l.name));\n // A repo may be named `my.repo`; `addLibrary` only accepts `[A-Za-z0-9_-]`\n // starting with a letter or digit, so every candidate is slugged first.\n const flat = (s: string) => s.replace(/[^A-Za-z0-9_-]+/g, \"-\").replace(/^[-_]+/, \"\") || \"source\";\n const short = flat(sourceShortName(url));\n if (!taken.has(short)) return short;\n const parts = sourceCacheKey(url).split(\"/\");\n const candidates =\n parts.length === 3\n ? [flat(`${parts[1]}-${parts[2]}`), flat(`${parts[0]}-${parts[1]}-${parts[2]}`)]\n : [];\n for (const c of candidates) if (!taken.has(c)) return c;\n let n = 2;\n while (taken.has(`${short}-${n}`)) n++;\n return `${short}-${n}`;\n}\n\n/**\n * Why a freshly cloned source cannot give its assets a publisher, or `undefined`: none is\n * declared anywhere, or the one its `skaile.manifest.yaml` names breaks the grammar of\n * `--publisher`. The walk is the one `add`, `install` and `check` run, so what it refuses here\n * they would skip later.\n */\nasync function publisherProblem(entry: SourceEntry, dest: string): Promise<string | undefined> {\n let problem: string | undefined;\n await buildProvenanceIndex(\n [\n {\n localPath: dest,\n sourceUrl: entry.url,\n commit: getRepoCommit(dest) ?? \"0\".repeat(40),\n tag: entry.pin,\n ...(entry.publisher ? { publisher: entry.publisher.replace(/^@/, \"\") } : {}),\n overlayManifestPath: curatedManifestOverlay(entry.url),\n },\n ],\n {\n knownKinds: getKnownKinds(),\n onSourceError: (_clone, err) => {\n const why = err instanceof Error ? err.message : String(err);\n if (/publisher must be declared|publisher \".*\" is invalid/.test(why)) problem = why;\n },\n },\n );\n return problem;\n}\n\n/**\n * Refresh the machine-global manifest cache for `entry` by running discovery\n * and upserting AssetDefinitions into `<skaile home>/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 advisories: string[];\n}> {\n const { manager, library, close } = await openLibraryManager();\n try {\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n const libs = await manager.listLibraries();\n const existing = libs.find((l) => path.resolve(l.path) === path.resolve(dest));\n // A clone made under an older cache key (the bare last segment before the url hash; `.git`\n // kept for a `….git/` url) leaves its library row at the old path. The row is this source's:\n // point it at the new clone instead of adding a second row for the same source (`add` would\n // warn \"exists in 2 libraries\"). Found by the old clone path or by the url it records.\n const key = sourceCacheKey(entry.url);\n const priorDirs = priorSourceCacheKeys(entry.url).map((k) => path.resolve(sourceClonePath(k)));\n const legacyRow = existing\n ? undefined\n : libs.find(\n (l) =>\n l.ownership === \"reader\" &&\n (priorDirs.includes(path.resolve(l.path)) ||\n (\"url\" in l.backendConfig && sourceCacheKey(l.backendConfig.url) === key)),\n );\n if (legacyRow) {\n const legacyDir = path.resolve(legacyRow.path);\n await manager.updateLibrary(legacyRow.id, { path: dest });\n logInfo(\n `Moved the \"${legacyRow.name}\" library to the new clone ${dest}. ` +\n `The old clone ${legacyDir} is no longer used and can be deleted.`,\n );\n }\n const added =\n existing ??\n legacyRow ??\n (await manager.addLibrary({\n name: sourceLibraryName(entry.url, libs),\n path: dest,\n backend: \"git\",\n backendConfig: {\n url: entry.url,\n branch: entry.pin ?? \"main\",\n authHint: \"ssh\",\n ...(entry.publisher ? { publisher: entry.publisher } : {}),\n },\n ownership: \"reader\",\n }));\n // The library row and its indexed assets are shared by every project that declares the\n // source, so they keep the publisher the first indexer recorded. A project that declares\n // another `--publisher` sees its own one: `AssetManager.scopeLibraryIndex` re-labels the\n // assets for it and leaves what other projects see alone (p1822).\n const cfg = added.backendConfig;\n const recorded = \"url\" in cfg ? cfg.publisher : undefined;\n const publisher = existing || legacyRow ? recorded : entry.publisher;\n const lib = added;\n // A `skaile source manifest init` curated manifest overrides the upstream repo's\n // raw glob discovery; `asset install` rescans with the same overlay.\n const catalog = new LocalCatalogSource(library, lib.id, dest, getKindRegistry(), {\n sidecarManifestFile: curatedManifestOverlay(entry.url),\n publisher,\n });\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 * Re-register the reader library of every source this project declares whose clone is cached\n * but whose library row is gone. The row is machine-wide: `source remove` in another project\n * drops it while this project's `sources:` still names the source, and `search` then finds\n * nothing until `update` runs (p757). Never touches the network; returns the sources restored.\n */\nexport async function restoreSourceReaders(projectDir: string): Promise<string[]> {\n const root = projectRootOf(projectDir);\n if (!root) return [];\n const sources = readProjectSources(path.join(root, workspaceConfigFilename()));\n const cached = sources.filter((s) => isSourceCloned(sourceClonePath(sourceCacheKey(s.url))));\n if (cached.length === 0) return [];\n const { manager, close } = await openLibraryManager();\n let missing: SourceEntry[];\n try {\n const libs = await manager.listLibraries();\n missing = cached.filter(\n (s) =>\n !libs.some(\n (l) => path.resolve(l.path) === path.resolve(sourceClonePath(sourceCacheKey(s.url))),\n ),\n );\n } finally {\n close();\n }\n const restored: string[] = [];\n for (const entry of missing) {\n try {\n await refreshManifestCache(entry);\n restored.push(sourceLabel(entry, sources));\n } catch (err) {\n logWarn(\n `Could not re-register source \"${sourceLabel(entry, sources)}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n return restored;\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 = projectRootOf(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 = path.resolve(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 (!isSourceCloned(dest)) {\n discardUnclonedSourceDir(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 const unborn = clone.status === 0 ? repairUnbornClone(dest) : undefined;\n if (clone.status !== 0 || unborn) {\n rmSync(dest, { recursive: true, force: true });\n discardUnclonedSourceDir(dest);\n const missing =\n clone.status !== 0 && entry.pin ? missingPinMessage(entry.url, entry.pin) : undefined;\n logWarn(\n unborn ? `${slug}: ${unborn}` : `${slug}: ${missing ?? \"git clone failed\"}, skipping.`,\n );\n failed++;\n continue;\n }\n } else {\n const pull = pullSourceClone(dest, entry);\n if (!pull.ok) {\n logErr(`${slug}: ${pull.error}`);\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 logAdvisories(result.advisories, false, slug);\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/**\n * Short names of the project's source clones that hold commits their upstream lacks.\n * `update --no-sync` still re-deploys from such a clone, so it reports them the way\n * `source sync` does. A clone without an upstream (detached at a pin) never counts.\n */\nexport function divergedSourceClones(projectDir: string): string[] {\n const root = path.resolve(projectDir);\n const diverged: string[] = [];\n for (const entry of readProjectSources(path.join(root, workspaceConfigFilename()))) {\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n if (!existsSync(dest)) continue;\n const ahead = spawnSync(\"git\", [\"-C\", dest, \"rev-list\", \"--count\", \"@{upstream}..HEAD\"], {\n stdio: \"pipe\",\n encoding: \"utf8\",\n });\n if (ahead.status === 0 && Number(ahead.stdout.trim()) > 0) {\n diverged.push(sourceShortName(entry.url));\n }\n }\n return diverged;\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 dest = sourceClonePath(sourceCacheKey(url));\n const { manager, close } = await openLibraryManager();\n try {\n // By clone path, not short name: another org's repo of the same name keeps its row.\n const dirs = [dest, ...priorSourceCacheKeys(url).map((k) => sourceClonePath(k))].map((d) =>\n path.resolve(d),\n );\n const existing = (await manager.listLibraries()).find((l) =>\n dirs.includes(path.resolve(l.path)),\n );\n if (existing) {\n await manager.removeLibrary(existing.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\n/**\n * The refusal for a `source add` argument that names a directory on this machine which cannot be\n * cloned: a registered library (it is already searchable and needs no source) or a folder that\n * is not a git repository. `undefined` for a URL, a shorthand or a directory that is a git repo.\n */\nexport async function localPathNotASource(source: string): Promise<string | undefined> {\n const raw = source.trim().replace(/^file:\\/\\//, \"\");\n // The path rule of `normalizeSourceUrl`: a bare name is a shorthand, never a folder in the cwd.\n if (!/^(?:\\/|\\.{1,2}(?:\\/|$)|~\\/)/.test(raw)) return undefined;\n const dir = path.resolve(raw.startsWith(\"~/\") ? path.join(os.homedir(), raw.slice(2)) : raw);\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return undefined;\n const real = realpathSync(dir);\n const { manager, close } = await openLibraryManager();\n try {\n const lib = (await manager.listLibraries()).find((l) => {\n try {\n return realpathSync(l.path) === real;\n } catch {\n return path.resolve(l.path) === dir;\n }\n });\n if (lib) {\n return `${dir} is the library \"${lib.name}\"; it needs no source — \\`skaile library list\\` shows it and its assets are already searchable.`;\n }\n } finally {\n close();\n }\n const git = spawnSync(\"git\", [\"-C\", dir, \"rev-parse\", \"--git-dir\"], { encoding: \"utf8\" });\n if (git.status !== 0) {\n return `${dir} is not a git repository. A source is a git repo: run \\`git init\\` and commit there, or register the folder as a library with \\`skaile library init <name> --path ${dir}\\`.`;\n }\n return undefined;\n}\n\n/**\n * The refusal for a `source add` URL that is the remote of a library registered by hand\n * (`library init --git`, `library init --reader`): its assets are already searchable, and a\n * source of the same repository would register a second, read-only library of the same\n * content (p499). `undefined` for any other URL. The reader row of a source clone never counts:\n * it lives in the clone cache and is the source itself.\n */\nexport async function remoteOfRegisteredLibrary(url: string): Promise<string | undefined> {\n const cloneRoots = [getGlobalCacheDir(), path.join(globalSkaileDir(), \"sources\")].map((d) =>\n path.resolve(d),\n );\n const { manager, close } = await openLibraryManager();\n try {\n const lib = (await manager.listLibraries()).find((l) => {\n const remote = \"url\" in l.backendConfig ? l.backendConfig.url : undefined;\n if (typeof remote !== \"string\" || !isSameRemote(remote, url)) return false;\n const at = path.resolve(l.path);\n return !cloneRoots.some((root) => at.startsWith(root + path.sep));\n });\n return lib\n ? `${url} is the remote of the library \"${lib.name}\"; it needs no source — \\`skaile library list\\` shows it and its assets are already searchable.`\n : undefined;\n } finally {\n close();\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> is a full git URL or an owner/repo shorthand (→ git@github.com:<owner>/<repo>.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(\n \"--force\",\n \"Remove an existing clone and re-clone; also change the publisher of a registered URL\",\n false,\n )\n .option(\n \"--publisher <name>\",\n \"Publisher of the source's assets when its skaile.manifest.yaml declares none (required for a non-GitHub URL)\",\n )\n .option(\"--dev\", \"Also index dev-only assets under the source's dev_paths\", false)\n .option(\"--verbose\", \"List every referenced file outside the asset filter\", false)\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(\n async (\n source: string,\n opts: {\n name?: string;\n pin?: string;\n branch?: string;\n force?: boolean;\n publisher?: string;\n dev?: boolean;\n verbose?: boolean;\n projectDir: string;\n },\n ) => {\n // A bare name used to expand to the `skaile-ai` org over SSH: a typo (or the slug\n // `source manifest init` printed) cloned a made-up repo. Say what to give instead.\n if (/^[\\w.-]+$/.test(source.trim().replace(/\\.git$/, \"\"))) {\n logErr(\n `\"${source}\" is not a git URL or an owner/repo shorthand. ` +\n \"Use `skaile source add <owner>/<repo>` or the full URL \" +\n \"(for a curated manifest: `skaile source add <the repo URL>`).\",\n );\n process.exitCode = 1;\n return;\n }\n const notASource = await localPathNotASource(source);\n if (notASource) {\n logErr(notASource);\n process.exitCode = 1;\n return;\n }\n let url = normalizeSourceUrl(source);\n const ownLibrary = await remoteOfRegisteredLibrary(url);\n if (ownLibrary) {\n logErr(ownLibrary);\n process.exitCode = 1;\n return;\n }\n const yamlPath = requireProjectYamlPath(opts.projectDir);\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 // The one exception is a repository on this machine: `/x/r.git` and `file:///x/r.git`\n // are one source, and the registered spelling stays (p618).\n const collision = findCacheKeyCollision(readProjectSources(yamlPath), url);\n if (collision && isLocalSourceUrl(collision.url) && isLocalSourceUrl(url)) {\n url = collision.url;\n } else 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 if (opts.publisher) entry.publisher = requireValidPublisherOrExit(opts.publisher);\n\n // The publisher of a registered URL names every ref its assets carry: a different one\n // would re-key the source and break the refs declared under the old one (p722).\n const registered = readProjectSources(yamlPath).find((s) => s.url === url);\n // A source registered without `--publisher` has one too: the manifest's, else the GitHub\n // org of its URL. Compare what each choice resolves to in the clone, not the flag (p722).\n // The clone's `origin` may have been repointed (a mirror, `git remote set-url`), so the\n // org is read from the registered URL when the clone gives none: the guard compares\n // against the registered entry, never against whatever the clone says today.\n const clonedAt = sourceClonePath(sourceCacheKey(url));\n const urlOrg = registered\n ? /github\\.com[/:]([^/]+)\\/[^/]+/.exec(registered.url)?.[1]?.toLowerCase()\n : undefined;\n const publisherNow =\n registered && existsSync(clonedAt)\n ? resolveSourcePublisher(clonedAt, registered.publisher ?? urlOrg)\n : (registered?.publisher ?? urlOrg);\n const publisherThen =\n registered && entry.publisher !== undefined && existsSync(clonedAt)\n ? resolveSourcePublisher(clonedAt, entry.publisher)\n : entry.publisher;\n if (\n registered &&\n publisherNow !== undefined &&\n entry.publisher !== undefined &&\n publisherNow !== publisherThen &&\n !opts.force\n ) {\n let declared: string[] = [];\n try {\n declared = (resolveSkWorkspaceConfig(path.dirname(yamlPath)).dependencies ?? []).filter(\n (d) => d.includes(`@${publisherNow}/`),\n );\n } catch {\n // an unreadable skaile.yaml stops later; the refusal below still holds\n }\n logErr(\n `${url} is registered with publisher \"${publisherNow}\"${\n registered.publisher === undefined ? \" (from its manifest or GitHub org)\" : \"\"\n }; --publisher ` +\n `\"${entry.publisher}\" would change it${\n declared.length > 0 ? ` and break the declared ${declared.join(\", \")}` : \"\"\n }. Pass --force to change it, or skaile source remove it first.`,\n );\n process.exitCode = 1;\n return;\n }\n\n const dest = sourceClonePath(sourceCacheKey(url));\n const preexisting = isSourceCloned(dest);\n // Clone/validate the repo BEFORE touching skaile.yaml — a failed clone\n // (repo not found, bad URL, network error) hard-exits in ensureClone, so\n // the entry is only ever recorded once the source is known-good.\n const cloned = ensureClone(entry, { force: opts.force });\n // A source with no publisher to give is skipped by every later command, so refuse it\n // here, before anything is recorded or indexed (a clone made by this call goes too).\n const noPublisher = await publisherProblem(entry, dest);\n if (noPublisher) {\n if (cloned && !preexisting) {\n rmSync(dest, { recursive: true, force: true });\n pruneEmptyCloneParents(dest);\n }\n logErr(noPublisher);\n process.exitCode = 1;\n return;\n }\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 editor = loadProjectEditor(yamlPath);\n editor.setSource(entry);\n editor.save();\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 logAdvisories(result.advisories, opts.verbose === true);\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 .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(async (opts: { json?: boolean; projectDir: string }) => {\n const yamlPath = requireProjectYamlPath(opts.projectDir);\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 = sourceLabel(s, sources);\n const cached = isSourceCloned(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 .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(async (key: string, opts: { projectDir: string }) => {\n const yamlPath = requireProjectYamlPath(opts.projectDir);\n const all = readProjectSources(yamlPath);\n const resolved = resolveSource(all, key);\n if (resolved.kind === \"none\") {\n logErr(`No source matching \"${key}\" in ${yamlPath}.`);\n process.exit(1);\n }\n if (resolved.kind === \"ambiguous\") exitAmbiguousSource(key, resolved.entries);\n const entry = resolved.entry;\n const slug = sourceLabel(entry, all);\n const clonePath = sourceClonePath(sourceCacheKey(entry.url));\n console.log(\n JSON.stringify(\n {\n ...entry,\n slug,\n clonePath,\n cached: isSourceCloned(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(\n \"--purge\",\n `Also delete the cached clone from ${path.join(globalCacheRoot(), \"sources\")}${path.sep}`,\n false,\n )\n .option(\"--force\", \"Remove the source although a locked asset still comes from it\", false)\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(async (key: string, opts: { purge: boolean; force?: boolean; projectDir: string }) => {\n const yamlPath = requireProjectYamlPath(opts.projectDir);\n const editor = loadProjectEditor(yamlPath);\n // Resolve to the stored URL (entries are keyed by url in the editor).\n const all = editor.getSources();\n const resolved = resolveSource(all, key);\n if (resolved.kind === \"none\") {\n logErr(`No source matching \"${key}\" in ${yamlPath}.`);\n process.exit(1);\n }\n if (resolved.kind === \"ambiguous\") exitAmbiguousSource(key, resolved.entries);\n const match = resolved.entry;\n const slug = sourceLabel(match, all);\n // A locked asset that comes from this source could not be restored or updated once the\n // source is gone: check, doctor and outdated would report it, install --locked would fail.\n const locked = new AssetManager({\n registry: getKindRegistry(),\n projectDir: path.dirname(yamlPath),\n }).lockedFromSource(match.url);\n if (locked.length > 0 && !opts.force) {\n logErr(\n `Source \"${slug}\" still supplies ${locked.length} locked asset(s): ${locked.join(\", \")}. ` +\n `Run \\`skaile remove\\` on them first, or pass --force to remove the source anyway.`,\n );\n process.exit(1);\n }\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 ${path.join(globalCacheRoot(), \"sources\")} — pass --purge to remove it, or run \\`skaile cache clean --global\\`).`,\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(\"--verbose\", \"List every referenced file outside the asset filter\", false)\n .option(\"--all\", \"Sync every source without prompting\", false)\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(\n async (\n key: string | undefined,\n opts: { dev?: boolean; all?: boolean; verbose?: boolean; projectDir: string },\n ) => {\n const yamlPath = requireProjectYamlPath(opts.projectDir);\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 const resolved = resolveSource(sources, key);\n if (resolved.kind === \"ambiguous\") exitAmbiguousSource(key, resolved.entries);\n if (resolved.kind === \"none\") {\n logInfo(`No source matching \"${key}\".`);\n return;\n }\n targets = [resolved.entry];\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 = sourceLabel(entry, sources);\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n if (!isSourceCloned(dest)) {\n const broken = existsSync(dest) && readdirSync(dest).length > 0;\n ensureClone(entry);\n if (broken) logInfo(`${slug}: the clone folder held no git checkout; replaced it.`);\n logOk(`${slug}: cloned to ${dest}.`);\n } else {\n const pull = pullSourceClone(dest, entry);\n if (!pull.ok) {\n logErr(`${slug}: ${pull.error}`);\n process.exitCode = 1;\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 logAdvisories(result.advisories, opts.verbose === true, slug);\n const legacyHint = legacySourceConfigHint(dest);\n if (legacyHint) logWarn(`${slug}: ${legacyHint}`);\n }\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
+ {"version":3,"sources":["../cli/src/commands/source-manifest.ts","../cli/src/commands/source.ts"],"names":["path","existsSync","readdirSync","spawnSync","dest"],"mappings":"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","file":"chunk-RRAXV5LE.js","sourcesContent":["/**\n * `skaile source manifest …` — curated `skaile.manifest.yaml` lifecycle for a\n * source you do NOT own. `init` generates a curated manifest from a discovery\n * run and stores it OUTSIDE the source, under the local store catalog\n * (`~/.skaile/store/manifests/<slug>.yaml`); `edit` opens it in `$EDITOR` and\n * re-validates on save. `source add`/`sync` then apply it as a read overlay\n * (see `source.ts` `refreshManifestCache`).\n *\n * `rebuild` refreshes a curated manifest after an upstream change (merge by\n * default — curation is sacred; `--overwrite` re-scans). `verify` is a\n * read-only integrity check (paths, declared hashes, schema, dep refs).\n * `publish`/`propose`/`yank` remain stubs — they need the store publish\n * endpoint (`POST /sources/<id>/manifest`), which lands in a follow-up.\n *\n * @docLink cli/commands/source#manifest\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n type AssetEntry,\n decodeSkaileManifest,\n encodeSkaileManifest,\n parseAssetRef,\n resolveSourcePublisher,\n type SkPublishManifest,\n type SourceEntry,\n sourceCacheKey,\n sourceShortName,\n workspaceConfigFilename,\n} from \"@skaile/workspaces/core\";\nimport { computeDeterministicHash, discoverAssetsInTree } from \"@skaile/workspaces/discovery\";\nimport {\n commitStoreManifest,\n getStoreManifestsDir,\n storeManifestFile,\n writeCuratedManifest,\n} from \"@skaile/workspaces/library\";\nimport type { Command } from \"commander\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport { getKindRegistry } from \"../open-registry.ts\";\nimport {\n ensureClone,\n normalizeSourceUrl,\n readProjectSources,\n sourceClonePath,\n sourceMatchesKey,\n} from \"./source.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 * Resolve a `source manifest` argument into a `{ url, slug, dest }` triple.\n *\n * Resolution order:\n * 1. A key matching an already-registered project source (stored URL, cache\n * key, or short slug).\n * 2. A **store slug** whose manifest already exists in\n * `~/.skaile/store/manifests/`: the exact file name (`<host>__<owner>__<repo>` or the\n * `<repo>-<hash>` key of a non-GitHub URL), or — for the verbs that find a manifest, not\n * for `init` — the bare repo name of a non-GitHub URL (`srcA` for `srcA-e2d8fe81.yaml`,\n * p1691). This MUST be tried before bare-name expansion: a bare name like `cli` would\n * otherwise expand (via `normalizeSourceUrl`) to the skaile-ai org and a DIFFERENT slug\n * than the one `init` wrote (e.g. `larksuite`). The slug is the exact identifier `init`'s\n * next-step hint prints back.\n * 3. Otherwise a git URL / `owner/repo` / bare name via `normalizeSourceUrl`.\n *\n * The clone dir is the same URL-keyed cache `source add` uses.\n *\n * `ambiguous` lists the manifest slugs a bare name matched when it matched several.\n */\nexport function resolveSourceArg(\n arg: string,\n projectDir: string,\n opts: { byName?: boolean } = {},\n): {\n url: string;\n slug: string;\n dest: string;\n manifestFile: string;\n guessed: boolean;\n ambiguous?: string[];\n} {\n // Like `source list` / `check` / `add`: the project is `projectDir` itself, no parent search (p1860).\n const registered: SourceEntry[] = readProjectSources(\n path.join(path.resolve(projectDir), workspaceConfigFilename()),\n );\n const match = registered.find((e) => sourceMatchesKey(e, arg));\n const found = !match ? resolveByStoreSlug(arg, opts.byName ?? true) : undefined;\n const bySlug = found && \"url\" in found ? found : undefined;\n const url = match ? match.url : (bySlug?.url ?? normalizeSourceUrl(arg));\n const slug = sourceShortName(url); // human-facing label\n const dest = sourceClonePath(sourceCacheKey(url));\n return {\n url,\n slug,\n dest,\n manifestFile: bySlug?.manifestFile ?? storeManifestPath(url),\n guessed: !match && !bySlug,\n ...(found && \"ambiguous\" in found ? { ambiguous: found.ambiguous } : {}),\n };\n}\n\n/** The slugs (file names without `.yaml`) of the curated manifests in the store. */\nfunction storeManifestSlugs(): string[] {\n try {\n return readdirSync(getStoreManifestsDir())\n .filter((f) => f.endsWith(\".yaml\"))\n .map((f) => f.slice(0, -\".yaml\".length));\n } catch {\n return [];\n }\n}\n\n/** The origin URL of the clone a `<repo>-<hash>` key names, or `undefined` when none is there. */\nfunction cloneOriginUrl(key: string): string | undefined {\n const dest = sourceClonePath(key);\n if (!existsSync(dest)) return undefined;\n const r = spawnSync(\"git\", [\"-C\", dest, \"remote\", \"get-url\", \"origin\"], { encoding: \"utf8\" });\n const out = r.status === 0 ? r.stdout.trim() : \"\";\n return out || undefined;\n}\n\n/**\n * When `arg` names a curated manifest that exists on disk, recover the source URL and point at\n * that manifest file directly. `arg` is a store slug (`<host>__<owner>__<repo>`, or the\n * `<repo>-<hash>` key `init` gives a non-GitHub URL) or, with `byName`, the bare repo name of\n * such a manifest (`srcA` for `srcA-e2d8fe81.yaml`). A GitHub manifest is never found by its bare\n * repo name: `cli` means the skaile-ai repo, not `larksuite/cli`.\n * Returns `{ ambiguous }` when a bare name matches several, and `undefined` when the arg is no\n * slug or has no manifest (fall back to URL normalization).\n */\nfunction resolveByStoreSlug(\n arg: string,\n byName: boolean,\n): { url: string; manifestFile: string } | { ambiguous: string[] } | undefined {\n // A slug is our own encoding — no path/URL sigils. Anything URL/owner-repo shaped is not one.\n if (!/^[\\w.-]+$/.test(arg)) return undefined;\n const slugs = storeManifestSlugs();\n let slug: string | undefined = slugs.includes(arg) ? arg : undefined;\n if (!slug && byName) {\n // Only the `<repo>-<hash>` file of a non-GitHub URL: a bare name never picks one org's\n // `github.com__<org>__<repo>` manifest over the skaile-ai repo it expands to.\n const named = slugs.filter(\n (s) => s.startsWith(`${arg}-`) && /^[0-9a-f]{8}$/.test(s.slice(arg.length + 1)),\n );\n if (named.length === 1) slug = named[0];\n else if (named.length > 1) return { ambiguous: [...named].sort() };\n }\n if (!slug) return undefined;\n const manifestFile = path.join(getStoreManifestsDir(), `${slug}.yaml`);\n if (slug.includes(\"__\")) {\n // `<host>__<owner>__<repo>` → `https://<host>/<owner>/<repo>` — good enough to key the clone\n // dir + re-derive the same slug; the manifest file is what edit actually opens.\n const [host, owner, repo] = slug.split(\"__\");\n return { url: host && owner && repo ? `https://${host}/${owner}/${repo}` : slug, manifestFile };\n }\n // `<repo>-<hash>`: the hash hides the URL; the clone `init` made remembers it.\n const origin = cloneOriginUrl(slug);\n return origin ? { url: origin, manifestFile } : undefined;\n}\n\n/**\n * The `No curated manifest …` line of a verb that needs one. A bare name that matched several\n * manifests (`ambiguous`) is told to pick a slug or the URL instead.\n */\nexport function missingManifestMessage(\n slug: string,\n manifestFile: string,\n ambiguous?: readonly string[],\n): string {\n if (ambiguous?.length) {\n return (\n `\"${slug}\" matches several curated manifests: ${ambiguous.join(\", \")} — ` +\n \"pass one of these slugs or the full source URL.\"\n );\n }\n return (\n `No curated manifest for \"${slug}\" at ${S.dim(manifestFile)} — ` +\n \"run `skaile source manifest init` first.\"\n );\n}\n\n/**\n * Absolute path to a source's curated store manifest. Keyed by the\n * collision-free {@link storeManifestSlug} (`<host>__<owner>__<repo>`) so\n * `orgA/cli` and `orgB/cli` don't share `cli.yaml`.\n */\nfunction storeManifestPath(url: string): string {\n return storeManifestFile(url);\n}\n\n/**\n * Directory-name segments that mark a test-fixture tree. `init`/`rebuild` drop\n * any asset whose repo-relative root contains one of these as an exact path\n * SEGMENT. Repos routinely ship fixture \"skills\" under such dirs (e.g.\n * `scripts/skill-format-check/tests`, `internal/qualitygate/skillscan/testdata/skills/lark-demo`)\n * that are not real, publishable assets.\n */\nconst TEST_FIXTURE_SEGMENTS = new Set([\n \"tests\",\n \"test\",\n \"__tests__\",\n \"testdata\",\n \"fixtures\",\n \"__fixtures__\",\n]);\n\n/**\n * True when an asset's repo-relative `root` sits under a test-fixture directory\n * (see {@link TEST_FIXTURE_SEGMENTS}). Conservative, not repo-specific — finer\n * curation (keeping a genuine fixture asset) stays the user's job via `edit`.\n * `init`/`rebuild`-path only; the general discovery walk (`source add`) is\n * untouched.\n */\nfunction isTestFixtureAsset(relativePath: string): boolean {\n const segments = relativePath.replace(/\\\\/g, \"/\").split(\"/\");\n return segments.some((s) => TEST_FIXTURE_SEGMENTS.has(s));\n}\n\n/**\n * `source manifest init <src>` — clone (if needed), run discovery, and write a\n * curated `skaile.manifest.yaml` to `~/.skaile/store/manifests/<slug>.yaml`.\n */\nasync function runInit(\n arg: string,\n opts: { projectDir: string; publisher?: string; dev?: boolean; force?: boolean },\n): Promise<void> {\n const projectDir = path.resolve(opts.projectDir);\n const {\n url,\n dest,\n manifestFile: target,\n guessed,\n } = resolveSourceArg(arg, projectDir, {\n byName: false,\n });\n // The same rule `source add` applies (p394): a bare name that is no registered source and no\n // store slug used to expand to a made-up `skaile-ai/<name>` repo and clone it over SSH.\n if (guessed && /^[\\w.-]+$/.test(arg.trim().replace(/\\.git$/, \"\"))) {\n logErr(\n `\"${arg}\" is not a git URL or an owner/repo shorthand. ` +\n \"Use `skaile source manifest init <owner>/<repo>` or the full URL.\",\n );\n process.exitCode = 1;\n return;\n }\n\n if (existsSync(target) && !opts.force) {\n logWarn(\n `A curated manifest already exists at ${S.dim(target)}. ` +\n \"Edit it with `skaile source manifest edit`, refresh it after an upstream \" +\n \"change with `skaile source manifest rebuild`, or pass --force to regenerate.\",\n );\n return;\n }\n\n const entry: SourceEntry = { url };\n ensureClone(entry);\n\n const { assets, errors } = discoverCuratableAssets(dest, opts.dev ?? false);\n\n const publisher = opts.publisher ?? resolveSourcePublisher(dest) ?? sourceShortName(url);\n\n const written = writeCuratedManifest({\n manifestFile: target,\n publisher,\n assets,\n force: opts.force,\n // Init: every asset inherits the top-level repo `publisher`. Do NOT stamp a\n // per-asset publisher — glob discovery here runs without the resolved\n // publisher, so each DiscoveredAsset.publisher is only the clone directory\n // name, which would clobber the intended org/`--publisher` default with\n // junk per-asset overrides.\n inheritPublisher: true,\n });\n\n if (!written.wrote) {\n logWarn(\n `Curated manifest already exists at ${S.dim(target)} — not overwritten. ` +\n \"Pass --force to regenerate.\",\n );\n return;\n }\n\n commitStoreManifest(\n target,\n `manifest init: ${sourceShortName(url)} (${written.assetCount} assets)`,\n );\n logOk(`Wrote curated manifest with ${written.assetCount} assets to ${S.dim(target)}.`);\n // `edit` takes the <src> the user passed (`resolveSourceArg` maps it back to this\n // manifest), but `source add` needs the URL: a bare name there is no source.\n logInfo(\n `Edit it with \\`skaile source manifest edit ${arg}\\`, then ` +\n `\\`skaile source add ${url}\\` to consume it.`,\n );\n if (errors.length > 0) {\n logWarn(`${errors.length} discovery error(s) — inspect the manifest before consuming.`);\n }\n}\n\n/**\n * Run discovery over a clone and drop the test-fixture assets (see\n * {@link isTestFixtureAsset}). Shared by `init` and `rebuild` so both paths\n * produce an identical inventory from the same tree.\n */\nfunction discoverCuratableAssets(\n dest: string,\n includeDev: boolean,\n): { assets: ReturnType<typeof discoverAssetsInTree>[\"assets\"]; errors: string[] } {\n const result = discoverAssetsInTree(dest, {\n registry: getKindRegistry(),\n includeDev,\n });\n const assets = result.assets.filter((a) => !isTestFixtureAsset(a.relativePath));\n return { assets, errors: result.errors.map((e) => `${e.path}: ${e.error}`) };\n}\n\n/**\n * Best-effort `git pull --ff-only` on an existing clone. Never throws: a pull\n * failure (offline, diverged, detached) is warned and the caller continues with\n * the clone as-is.\n */\nfunction pullCloneFfOnly(dest: string): void {\n const res = spawnSync(\"git\", [\"-C\", dest, \"pull\", \"--ff-only\"], { stdio: \"pipe\" });\n if (res.status !== 0) {\n logWarn(\n \"git pull --ff-only failed — continuing with the existing clone \" +\n \"(it may be behind upstream).\",\n );\n }\n}\n\n/**\n * Repo-relative `root` path for a manifest asset entry — the merge match key\n * between an existing curated entry and a freshly-discovered asset. `root:`\n * entries use their declared path; a `files:`-only entry (rare for a curated\n * sidecar) falls back to the entry's dirname of the first file, else the name.\n */\nfunction entryRootKey(entry: AssetEntry): string {\n if (entry.root) return entry.root.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const files = entry.files;\n if (files && files.length > 0) {\n const first = typeof files[0] === \"string\" ? files[0] : files[0].path;\n const dir = path.posix.dirname(first.replace(/\\\\/g, \"/\"));\n return dir === \".\" ? entry.name : dir;\n }\n return entry.name;\n}\n\n/** Repo-relative `root` path a discovered asset maps to (matches init's writer). */\nfunction discoveredRootKey(relativePath: string): string {\n const dir = path.posix.dirname(relativePath.replace(/\\\\/g, \"/\"));\n return dir === \".\" ? path.posix.basename(relativePath.replace(/\\\\/g, \"/\")) : dir;\n}\n\n/** Human ref for reporting: `kind:name`. */\nfunction entryRef(entry: AssetEntry): string {\n return `${entry.kind}:${entry.name}`;\n}\n\n/**\n * `source manifest rebuild <src>` — refresh a curated manifest after the\n * upstream repo changed. MERGE is the default (curation is sacred); `--overwrite`\n * re-scans from scratch with `init --force` semantics.\n *\n * Merge algorithm (match by repo-relative `root` path):\n * - Existing entries whose root is STILL discovered → KEPT verbatim (all\n * hand-edits preserved).\n * - Existing entries whose root is GONE upstream → DROPPED (reported).\n * - Freshly-discovered assets not already in the manifest → NOT auto-added,\n * only REPORTED (a curated foreign sidecar must not silently absorb new\n * upstream skills). An asset the curator deliberately dropped stays dropped\n * because it is neither in the existing manifest nor re-added here.\n */\nasync function runRebuild(\n arg: string,\n opts: { projectDir: string; publisher?: string; dev?: boolean; overwrite?: boolean },\n): Promise<void> {\n const projectDir = path.resolve(opts.projectDir);\n const { url, dest, slug, manifestFile: target, ambiguous } = resolveSourceArg(arg, projectDir);\n\n if (!existsSync(target)) {\n logErr(missingManifestMessage(slug, target, ambiguous));\n process.exit(1);\n }\n\n // Update the clone: clone if absent, else pull --ff-only (best-effort).\n const entry: SourceEntry = { url };\n const cloned = ensureClone(entry);\n if (!cloned) pullCloneFfOnly(dest);\n\n const { assets: freshAssets, errors } = discoverCuratableAssets(dest, opts.dev ?? false);\n\n if (opts.overwrite) {\n logWarn(\n \"--overwrite: replacing the curated manifest with a full fresh inventory. \" +\n \"All hand-curation (dropped assets, per-asset edits) is discarded.\",\n );\n const publisher = opts.publisher ?? resolveSourcePublisher(dest) ?? sourceShortName(url);\n const written = writeCuratedManifest({\n manifestFile: target,\n publisher,\n assets: freshAssets,\n force: true,\n inheritPublisher: true,\n });\n commitStoreManifest(\n target,\n `manifest rebuild --overwrite: ${slug} (${written.assetCount} assets)`,\n );\n logOk(\n `Rebuilt curated manifest with ${written.assetCount} assets to ${S.dim(target)} (overwrite).`,\n );\n if (errors.length > 0) {\n logWarn(`${errors.length} discovery error(s) — inspect the manifest before consuming.`);\n }\n return;\n }\n\n // MERGE (default). `--publisher` only applies to the full re-derive path.\n if (opts.publisher) {\n logWarn(\n \"--publisher is ignored in merge mode (the curated publisher is preserved). \" +\n \"Use --overwrite to re-derive the publisher from a full re-scan.\",\n );\n }\n\n // Read the existing curated manifest and keep it as the base.\n const { manifest: existing } = decodeSkaileManifest(readFileSync(target, \"utf-8\"));\n const existingEntries = existing.assets ?? [];\n\n // Index fresh discovery by repo-relative root path.\n const freshByRoot = new Map<string, (typeof freshAssets)[number]>();\n for (const a of freshAssets) freshByRoot.set(discoveredRootKey(a.relativePath), a);\n\n const kept: AssetEntry[] = [];\n const dropped: string[] = [];\n for (const e of existingEntries) {\n if (freshByRoot.has(entryRootKey(e))) kept.push(e);\n else dropped.push(entryRef(e));\n }\n\n // Fresh assets not already curated → report as available, do NOT add.\n const existingRoots = new Set(existingEntries.map(entryRootKey));\n const newlyAvailable: string[] = [];\n for (const a of freshAssets) {\n if (!existingRoots.has(discoveredRootKey(a.relativePath))) {\n newlyAvailable.push(`${a.kind}:${a.name}`);\n }\n }\n\n const changed = dropped.length > 0;\n if (dropped.length > 0) {\n logWarn(`removed (gone upstream): ${dropped.sort().join(\", \")}`);\n }\n if (newlyAvailable.length > 0) {\n logInfo(\n `${newlyAvailable.length} new upstream asset(s) available (not added): ` +\n `${newlyAvailable.sort().join(\", \")} — add with \\`skaile source manifest edit ${arg}\\` if wanted`,\n );\n }\n\n if (!changed) {\n logOk(\"already up to date\");\n if (errors.length > 0) {\n logWarn(`${errors.length} discovery error(s) — inspect the source before re-consuming.`);\n }\n return;\n }\n\n const merged: SkPublishManifest = { ...existing, assets: kept };\n writeFileSync(target, encodeSkaileManifest(merged), \"utf-8\");\n commitStoreManifest(\n target,\n `manifest rebuild: ${slug} (kept ${kept.length}, dropped ${dropped.length})`,\n );\n logOk(\n `Rebuilt curated manifest: kept ${kept.length}, dropped ${dropped.length} → ${S.dim(target)}.`,\n );\n if (errors.length > 0) {\n logWarn(`${errors.length} discovery error(s) — inspect the source before re-consuming.`);\n }\n}\n\n/**\n * `source manifest verify <src>` — READ-ONLY integrity check of a curated\n * manifest against its clone. Writes nothing. Exit 0 when no errors; with\n * `--strict`, any warning also forces a nonzero exit.\n *\n * Per-asset checks:\n * - `root`/`files` paths still exist upstream (missing → error).\n * - A declared `sha256` recomputes to the same deterministic hash (mismatch → error).\n * - Schema decode diagnostics map to errors/warnings.\n * - Dependency refs parse via `parseAssetRef` (malformed → warning).\n */\nasync function runVerify(\n arg: string,\n opts: { projectDir: string; strict?: boolean },\n): Promise<void> {\n const projectDir = path.resolve(opts.projectDir);\n const { url, dest, slug, manifestFile: target, ambiguous } = resolveSourceArg(arg, projectDir);\n\n if (!existsSync(target)) {\n logErr(missingManifestMessage(slug, target, ambiguous));\n process.exit(1);\n }\n\n // Ensure a clone exists to verify paths/hashes against (best-effort; no pull).\n ensureClone({ url });\n\n const text = readFileSync(target, \"utf-8\");\n const { manifest, diagnostics } = decodeSkaileManifest(text);\n\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Schema diagnostics from the decoder.\n for (const d of diagnostics) {\n const line = `${d.code}: ${d.message}`;\n if (d.severity === \"error\") errors.push(line);\n else warnings.push(line);\n }\n\n const assets = manifest.assets ?? [];\n for (const entry of assets) {\n const ref = entryRef(entry);\n\n // Path existence: `root` dir and/or each `files[]` path.\n const relPaths: string[] = [];\n if (entry.root) relPaths.push(entry.root);\n if (entry.files) {\n for (const f of entry.files) relPaths.push(typeof f === \"string\" ? f : f.path);\n }\n if (relPaths.length === 0) relPaths.push(entry.name);\n for (const rel of relPaths) {\n if (!existsSync(path.join(dest, rel))) {\n errors.push(`${ref}: path not found upstream: ${rel}`);\n }\n }\n\n // Declared sha256 → recompute + compare, but ONLY for granular `files:`\n // entries. Discovery (`discover-manifest.ts`) anchors a `files:`-only entry\n // at the REPO ROOT and hashes the files VERBATIM as repo-relative strings\n // (the path is folded into the digest), so verify must hash the same way:\n // `assetRoot = dest`, files kept repo-relative — NOT rebased onto the root.\n // A `root:` entry cannot be verified this way (discovery hashes only the\n // per-kind filtered set, not the whole-dir walk), and the writer never emits\n // sha256 for `root:` entries, so skip the hash check for them.\n if (entry.sha256) {\n if (entry.files && entry.files.length > 0) {\n const hashFiles = entry.files.map((f) =>\n (typeof f === \"string\" ? f : f.path).replace(/\\\\/g, \"/\"),\n );\n const actual = computeDeterministicHash(dest, hashFiles);\n if (actual !== entry.sha256) {\n errors.push(\n `${ref}: sha256 mismatch (declared ${entry.sha256.slice(0, 12)}…, got ${actual.slice(0, 12)}…)`,\n );\n }\n } else {\n warnings.push(\n `${ref}: declared sha256 on a root:-mode entry is not verifiable (discovery hashes only the per-kind filtered set) — skipped`,\n );\n }\n }\n\n // Dependency refs parse.\n for (const dep of entry.dependencies ?? []) {\n try {\n parseAssetRef(dep);\n } catch (err) {\n warnings.push(\n `${ref}: malformed dependency \"${dep}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n for (const w of warnings) logWarn(w);\n for (const e of errors) logErr(e);\n\n if (errors.length === 0) {\n logOk(`verified ${assets.length} asset(s).`);\n } else {\n logErr(`${errors.length} issue(s).`);\n }\n\n const failStrict = opts.strict && warnings.length > 0;\n if (errors.length > 0 || failStrict) process.exit(1);\n}\n\n/**\n * Split a `$VISUAL`/`$EDITOR` value into `{ command, args }` and append the file\n * as the final arg. The env value is a full command line, not a bare binary —\n * `EDITOR=\"code --wait\"` must spawn `code` with `[\"--wait\", <file>]`, and\n * `EDITOR=code` (which returns before save) is the user's problem, not ours.\n * A whitespace split covers the common editors (`code --wait`, `code -w`,\n * `subl -w`, `vi`); paths with embedded spaces are not supported (rare for an\n * editor binary and out of scope). Falls back to `vi` when unset/empty.\n *\n * @docLink cli/commands/source#manifest-edit\n */\nexport function resolveEditorCommand(\n editorEnv: string | undefined,\n target: string,\n): { command: string; args: string[] } {\n const parts = (editorEnv ?? \"\").trim().split(/\\s+/).filter(Boolean);\n const [command, ...rest] = parts.length > 0 ? parts : [\"vi\"];\n return { command: command as string, args: [...rest, target] };\n}\n\n/** Minimal spawn contract runEdit needs — lets tests inject a fake. */\ntype SpawnLike = (\n command: string,\n args: string[],\n opts: { stdio: \"inherit\" },\n) => { status: number | null };\n\n/**\n * `source manifest edit <src>` — open the curated store manifest in `$EDITOR`\n * and re-validate on save. Warnings are surfaced but never hard-fail.\n *\n * `spawn` is injectable so tests can assert the argv without launching a real\n * editor; production passes the default `spawnSync`.\n */\nexport function runEdit(\n arg: string,\n opts: { projectDir: string },\n spawn: SpawnLike = spawnSync as unknown as SpawnLike,\n): void {\n const projectDir = path.resolve(opts.projectDir);\n const { slug, manifestFile: target, ambiguous } = resolveSourceArg(arg, projectDir);\n\n if (!existsSync(target)) {\n logErr(missingManifestMessage(slug, target, ambiguous));\n process.exit(1);\n }\n\n const { command, args } = resolveEditorCommand(process.env.VISUAL || process.env.EDITOR, target);\n const res = spawn(command, args, { stdio: \"inherit\" });\n if (res.status !== 0 && res.status !== null) {\n logErr(`Editor exited with status ${res.status}.`);\n process.exit(1);\n }\n\n commitStoreManifest(target, `manifest edit: ${slug}`);\n\n // Re-validate the saved file; surface diagnostics as warnings, don't hard-fail.\n const { diagnostics } = decodeSkaileManifest(readFileSync(target, \"utf-8\"));\n const errors = diagnostics.filter((d) => d.severity === \"error\");\n const warnings = diagnostics.filter((d) => d.severity !== \"error\");\n if (errors.length > 0) {\n for (const d of errors) logErr(`${d.code}: ${d.message}`);\n logWarn(\"Manifest has errors — fix them before `skaile source add` will consume it.\");\n } else if (warnings.length > 0) {\n for (const d of warnings) logWarn(`${d.code}: ${d.message}`);\n logOk(\"Saved (with warnings).\");\n } else {\n logOk(\"Saved.\");\n }\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 // enablePositionalOptions so options on the leaf verb (`source manifest init\n // --publisher …`) route to that verb instead of being rejected by `manifest`.\n const manifest = src\n .command(\"manifest\")\n .description(\"Curated manifest lifecycle for a source\")\n .enablePositionalOptions();\n\n manifest\n .command(\"init <src>\")\n .description(\"Generate a curated manifest for a source (stored in the local store catalog)\")\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .option(\"--publisher <name>\", \"Override the publisher (default: source's GitHub org)\")\n .option(\"--dev\", \"Include assets under the source's dev_paths\", false)\n .option(\"--force\", \"Overwrite an existing curated manifest\", false)\n .action((arg, opts) => runInit(arg, opts));\n\n manifest\n .command(\"edit <src>\")\n .description(\"Open the curated manifest in $EDITOR and re-validate on save\")\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .action((arg, opts) => runEdit(arg, opts));\n\n manifest\n .command(\"rebuild <src>\")\n .description(\n \"Refresh a curated manifest after an upstream change (merge by default: \" +\n \"keeps curation, drops assets gone upstream, reports new ones without adding)\",\n )\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .option(\"--publisher <name>\", \"Override the publisher (--overwrite only)\")\n .option(\"--dev\", \"Include assets under the source's dev_paths\", false)\n .option(\"--overwrite\", \"Discard curation and re-scan the full inventory\", false)\n .action((arg, opts) => runRebuild(arg, opts));\n\n manifest\n .command(\"verify <src>\")\n .description(\"Verify hashes, deps, and schema (read-only)\")\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .option(\"--strict\", \"Fail on advisory checks (warnings force a nonzero exit)\", false)\n .action((arg, opts) => runVerify(arg, opts));\n\n manifest\n .command(\"publish <src>\")\n .description(\"Push the curated sidecar manifest and publish it to the store\")\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .option(\"--as <namespace>\", \"Publisher namespace (default: your store username)\")\n .option(\"--sidecar-repo <url>\", \"Public GitHub repo you own to hold the curated manifest\")\n .option(\"--ref <gitref>\", \"Foreign source ref to ingest (branch/sha; default: main)\")\n .option(\"--dry-run\", \"Print the publish plan without pushing or calling the store\", false)\n .action(async (arg, opts) => {\n const { runPublish } = await import(\"./source-manifest-publish.ts\");\n await runPublish(arg, opts);\n });\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 the source's published assets from the store\")\n .option(\"-C, --project-dir <dir>\", \"Project directory\", process.cwd())\n .option(\"--asset <ref>\", \"Yank only the asset matching this ref/name\")\n .action(async (arg, opts) => {\n const { runYank } = await import(\"./source-manifest-publish.ts\");\n await runYank(arg, opts);\n });\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 * `<cache root>/sources/<host>/<owner>/<repo>/` (`~/.skaile/cache` unless `SKAILE_HOME` or\n * `SKAILE_CACHE_DIR` moves it; machine-global cache, shared across projects, URL-keyed so\n * cross-org repos never collide), and the manifest is mirrored into `<skaile home>/index.db`\n * (machine-global manifest cache).\n *\n * @docLink cli/commands/source\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n realpathSync,\n renameSync,\n rmdirSync,\n rmSync,\n statSync,\n} from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport {\n attachToBranch,\n buildProvenanceIndex,\n discardUnclonedSourceDir,\n getGlobalCacheDir,\n getRepoCommit,\n missingPinMessage,\n globalCacheRoot,\n globalSkaileDir,\n isSameRemote,\n isSourceCloned,\n priorSourceCacheKeys,\n resolveSkWorkspaceConfig,\n resolveSourcePublisher,\n type SourceEntry,\n sourceCacheKey,\n sourceShortName,\n unpublishedCommitAdvice,\n WorkspaceYamlEditor,\n workspaceConfigFilename,\n} from \"@skaile/workspaces/core\";\nimport { AssetManager } from \"@skaile/workspaces/asset-manager\";\nimport { curatedManifestOverlay, LocalCatalogSource } from \"@skaile/workspaces/library\";\nimport * as p from \"@clack/prompts\";\nimport { Command } from \"commander\";\nimport { logErr, logInfo, logNoProject, logOk, logWarn, S } from \"../helpers.ts\";\nimport { openLibraryManager } from \"../open-library.ts\";\nimport { getKindRegistry, getKnownKinds } from \"../open-registry.ts\";\nimport { requireValidPublisherOrExit } from \"./library-index.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 * The one spelling of a full git URL or scp-style spec: trailing slashes dropped, scheme and\n * host in lower case (userinfo, path and a `.git` suffix stay as typed). `…/skillz.git/` and\n * `HTTPS://GitHub.com/o/skillz.git` are the source `…/skillz.git` already is (p891, p722).\n */\nfunction canonicalGitUrl(spec: string): string {\n const noSlash = spec.replace(/\\/+$/, \"\");\n const url = /^([a-z][a-z0-9+.-]*):\\/\\/([^/]*)(.*)$/i.exec(noSlash);\n if (url) {\n const scheme = (url[1] ?? \"\").toLowerCase();\n // A `file://` path with `.`, `..` or `//` segments is the one repository its folded path\n // names: `file:///a/r1/../remotes/x.git` is `file:///a/remotes/x.git` (p1856).\n if (scheme === \"file\" && url[2] === \"\" && /(?:^|\\/)\\.\\.?(?:\\/|$)|\\/\\//.test(url[3] ?? \"\")) {\n return `file://${path.posix.normalize(url[3] ?? \"\")}`;\n }\n const authority = url[2] ?? \"\";\n const at = authority.lastIndexOf(\"@\");\n const host = authority.slice(at + 1).toLowerCase();\n return `${scheme}://${authority.slice(0, at + 1)}${host}${url[3] ?? \"\"}`;\n }\n const scp = /^(git@)([^:]+):(.*)$/.exec(noSlash);\n return scp ? `${scp[1]}${(scp[2] ?? \"\").toLowerCase()}:${scp[3] ?? \"\"}` : noSlash;\n}\n\n/**\n * Normalize a `source add` argument into a clonable git URL. Full URLs and\n * scp-style (`git@host:…`) specs keep their form but get the canonical spelling of\n * {@link canonicalGitUrl}; a local path (`/abs`, `./rel`,\n * `../rel`, `~/x`) becomes an absolute, normalised path so the same repo added from two\n * directories is one source and a clone never depends on the cwd; 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 canonicalGitUrl(s);\n if (/^(?:\\/|\\.{1,2}(?:\\/|$)|~\\/)/.test(s)) {\n const abs = path.resolve(s.startsWith(\"~/\") ? path.join(os.homedir(), s.slice(2)) : s);\n // The same folder reached through a symlink (macOS `/var` → `/private/var`) is one source.\n try {\n return realpathSync(abs);\n } catch {\n return abs;\n }\n }\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 * Name a source in output: its repo short name, or its clone-cache key when\n * another source in the project shares that short name (two `skillz` repos of\n * different owners). The key is unique per URL and `source show`/`remove` accept it.\n */\nexport function sourceLabel(entry: SourceEntry, all: readonly SourceEntry[]): string {\n const short = sourceShortName(entry.url);\n const shared = all.some((s) => s.url !== entry.url && sourceShortName(s.url) === short);\n return shared ? sourceCacheKey(entry.url) : short;\n}\n\n/** Outcome of {@link resolveSource}. */\nexport type SourceResolution =\n | { kind: \"one\"; entry: SourceEntry }\n | { kind: \"ambiguous\"; entries: SourceEntry[] }\n | { kind: \"none\" };\n\n/**\n * `true` for a source on this machine: an absolute path or a `file://` URL. The two spellings of\n * one repository share a clone-cache key and are one source (p618).\n */\nfunction isLocalSourceUrl(url: string): boolean {\n return url.startsWith(\"/\") || url.startsWith(\"file://\");\n}\n\n/**\n * Pick the one source `key` names. Exact forms win over names: the stored URL,\n * then the cache key, then the repo short name or a `source add` shortcut, then the other\n * spelling of a local repository (`file:///x/r.git` for a source added as `/x/r.git`). A\n * name that several sources share (`skillz` from two owners) is `ambiguous`\n * instead of silently picking the first.\n */\nexport function resolveSource(sources: readonly SourceEntry[], key: string): SourceResolution {\n const tiers: ((s: SourceEntry) => boolean)[] = [\n (s) => s.url === key,\n (s) => sourceCacheKey(s.url) === key,\n (s) => sourceShortName(s.url) === key || s.url === normalizeSourceUrl(key),\n (s) =>\n isLocalSourceUrl(key) &&\n isLocalSourceUrl(s.url) &&\n realLocalCacheKey(s.url) === realLocalCacheKey(normalizeSourceUrl(key)),\n ];\n for (const tier of tiers) {\n const hits = sources.filter(tier);\n if (hits.length === 1) return { kind: \"one\", entry: hits[0] };\n if (hits.length > 1) return { kind: \"ambiguous\", entries: hits };\n }\n return { kind: \"none\" };\n}\n\nfunction exitAmbiguousSource(key: string, entries: readonly SourceEntry[]): never {\n logErr(`\"${key}\" matches ${entries.length} sources; pass the URL of the one you mean:`);\n for (const e of entries) console.error(` ${e.url}`);\n process.exit(1);\n}\n\n/**\n * git's stderr as one line: every line but the `hint:` advice and the\n * `From <url>` / ` * branch …` fetch progress, joined by spaces. Keeps the\n * cause (`fatal: '<path>' does not appear to be a git repository`).\n */\nfunction pullFailureReason(stderr: string): string {\n return stderr\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter((l) => l !== \"\" && !/^(hint:|From |[*+=!-] )/.test(l))\n .join(\" \");\n}\n\n/** The advisory a reference lint raises for a file the asset filter leaves out. */\nconst FILTER_ADVISORY = \"not captured by the file filter\";\n\n/**\n * Print the advisories of one indexing run. The reference notes about files outside the asset\n * filter are one line with a count unless `verbose`; every other advisory stays on its own line\n * (p1031: a source such as ai-assets printed 77 of them on every sync).\n */\nfunction logAdvisories(advisories: readonly string[], verbose: boolean, slug?: string): void {\n const prefix = slug ? `${slug}: ` : \"\";\n const filtered = advisories.filter((a) => a.includes(FILTER_ADVISORY));\n for (const advisory of advisories) {\n if (verbose || !advisory.includes(FILTER_ADVISORY)) logInfo(`${prefix}${advisory}`);\n }\n if (!verbose && filtered.length > 0) {\n logInfo(\n `${prefix}${filtered.length} referenced file${filtered.length === 1 ? \"\" : \"s\"} outside the asset filter (pass --verbose to list them)`,\n );\n }\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 = realLocalCacheKey(url);\n return sources.find((s) => s.url !== url && realLocalCacheKey(s.url) === key);\n}\n\n/**\n * The clone-cache key of `url`; a repository on this machine is keyed by its real path, so a\n * symlinked spelling (`/var/x` for `/private/var/x`) is the same source (p618).\n */\nfunction realLocalCacheKey(url: string): string {\n const local = url.startsWith(\"file://\") ? url.slice(\"file://\".length) : url;\n if (local.startsWith(\"/\") && existsSync(local)) {\n try {\n return sourceCacheKey(realpathSync(local));\n } catch {\n // fall through to the spelling\n }\n }\n return sourceCacheKey(url);\n}\n\n/**\n * `projectDir` when it holds its own `skaile.yaml`, else `undefined`. Like `list`, `check` and\n * `add`, the `source` commands never search parent directories (p1860).\n */\nfunction projectRootOf(projectDir: string): string | undefined {\n const dir = path.resolve(projectDir);\n return existsSync(path.join(dir, workspaceConfigFilename())) ? dir : undefined;\n}\n\n/** The `skaile.yaml` path of `projectDir`; stops with the `No skaile.yaml found` lines when it has none. */\nfunction requireProjectYamlPath(projectDir: string): string {\n const root = projectRootOf(projectDir);\n if (!root) {\n logNoProject(projectDir);\n process.exit(1);\n }\n return path.join(root, workspaceConfigFilename());\n}\n\n/**\n * Load `skaile.yaml` for a `source` command. A file that does not parse stops the command with\n * the one `<file> — parse error: <reason>` line `check` and `install` print: it is not \"no\n * sources\", and nothing is written to it (p1421).\n */\nexport function loadProjectEditor(yamlPath: string): WorkspaceYamlEditor {\n try {\n return WorkspaceYamlEditor.load(yamlPath);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logErr(/ — parse error: /.test(message) ? message : `Could not read ${yamlPath}: ${message}`);\n process.exit(1);\n }\n}\n\nexport function readProjectSources(yamlPath: string): SourceEntry[] {\n if (!existsSync(yamlPath)) return [];\n try {\n return loadProjectEditor(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 * Labels of the sources `projectDir`'s `skaile.yaml` declares whose clone is not in the cache\n * (`cache clean --global`, a failed clone). Empty outside a project. Never reads the network.\n */\nexport function uncachedSources(projectDir: string): string[] {\n const root = projectRootOf(projectDir);\n if (!root) return [];\n const sources = readProjectSources(path.join(root, workspaceConfigFilename()));\n return sources\n .filter((s) => !isSourceCloned(sourceClonePath(sourceCacheKey(s.url))))\n .map((s) => sourceLabel(s, sources));\n}\n\n/**\n * Drop the library rows of source clones whose folder is gone. A clone is cache, so its row goes\n * with it (`cache clean --global`); the next `source sync` that clones it registers it again.\n * Rows of libraries registered by hand never count: only a reader row inside the clone cache.\n */\nexport async function dropVanishedSourceRows(): Promise<number> {\n const cloneRoots = [getGlobalCacheDir(), path.join(globalSkaileDir(), \"sources\")].map((d) =>\n path.resolve(d),\n );\n const { manager, close } = await openLibraryManager();\n try {\n let dropped = 0;\n for (const l of await manager.listLibraries()) {\n const at = path.resolve(l.path);\n if (l.ownership !== \"reader\" || !cloneRoots.some((r) => at.startsWith(r + path.sep)))\n continue;\n if (existsSync(at)) continue;\n await manager.removeLibrary(l.name, { purge: false });\n dropped++;\n }\n return dropped;\n } finally {\n close();\n }\n}\n\n/** Remove the empty `<owner>` / `<host>` directories a failed clone left under `sources/`. */\nfunction pruneEmptyCloneParents(dest: string): void {\n let dir = path.dirname(dest);\n while (path.basename(dir) !== \"sources\" && dir !== path.dirname(dir)) {\n try {\n if (readdirSync(dir).length > 0) return;\n rmdirSync(dir);\n } catch {\n return;\n }\n dir = path.dirname(dir);\n }\n}\n\n/**\n * A fresh clone whose remote HEAD names a branch the remote lacks has no commit checked out and\n * an empty tree. When the remote has exactly one branch, check it out; with several,\n * or none that can be told apart, return the problem line. `undefined` when a commit is checked\n * out, and for a remote with no branch at all (an empty repository, filled later).\n */\nfunction repairUnbornClone(dest: string): string | undefined {\n const git = (...args: string[]) =>\n spawnSync(\"git\", [\"-C\", dest, ...args], { stdio: \"pipe\", encoding: \"utf8\" });\n if (git(\"rev-parse\", \"--verify\", \"-q\", \"HEAD\").status === 0) return undefined;\n const branches = git(\"for-each-ref\", \"--format=%(refname:short)\", \"refs/remotes/origin\")\n .stdout.split(\"\\n\")\n .map((b) => b.trim())\n .filter((b) => b !== \"\" && b !== \"origin/HEAD\" && b !== \"origin\");\n if (branches.length === 0) return undefined;\n const only = branches[0];\n if (branches.length === 1 && only) {\n const name = only.replace(/^origin\\//, \"\");\n if (git(\"checkout\", \"-q\", \"-B\", name, only).status === 0) return undefined;\n }\n return `the remote HEAD names a branch that does not exist; pass --pin <branch> (${branches\n .map((b) => b.replace(/^origin\\//, \"\"))\n .join(\", \")})`;\n}\n\n/**\n * Clone the source if its clone directory does not yet exist. When `force` is\n * set, the existing clone is replaced by a fresh checkout. Returns true when a\n * clone happened. The cache slug is derived from the URL.\n *\n * A `--force` re-clone moves the old clone aside first and only deletes it once\n * the fresh clone succeeds — so a failed re-clone restores the previous clone\n * rather than leaving the source registered with no cache behind it.\n */\nexport function ensureClone(entry: SourceEntry, opts: { force?: boolean } = {}): boolean {\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n let backup: string | undefined;\n if (!isSourceCloned(dest)) discardUnclonedSourceDir(dest);\n if (entry.pin && (opts.force || !isSourceCloned(dest))) {\n // Say so before git does: its own line (`Remote branch x not found in upstream origin`) names no branch to use.\n const missing = missingPinMessage(entry.url, entry.pin);\n if (missing) {\n logErr(missing);\n process.exit(1);\n }\n }\n if (isSourceCloned(dest)) {\n if (!opts.force) return false;\n backup = `${dest}.bak`;\n rmSync(backup, { recursive: true, force: true });\n renameSync(dest, backup);\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 const unborn = clone.status === 0 ? repairUnbornClone(dest) : undefined;\n if (clone.status !== 0 || unborn) {\n if (backup) {\n rmSync(dest, { recursive: true, force: true });\n renameSync(backup, dest);\n } else {\n // Nothing was there before: leave no empty `<host>/<owner>/` directories behind.\n rmSync(dest, { recursive: true, force: true });\n pruneEmptyCloneParents(dest);\n }\n logErr(unborn ? `${entry.url}: ${unborn}` : `git clone failed for ${entry.url}`);\n process.exit(1);\n }\n if (backup) rmSync(backup, { recursive: true, force: true });\n return true;\n}\n\n/**\n * Advance an existing clone with `git pull --ff-only`. `add` and\n * `install --locked` leave the shared clone on a detached HEAD at the locked\n * commit, where `git pull` refuses to run, so a detached clone is put back on\n * its branch first (the pin when it is a branch, else the remote's default).\n * An entry pinned to a tag or SHA has nothing to pull and counts as synced.\n * On failure `error` is one line: git's whole stderr minus `hint:` advice and fetch progress.\n */\nexport function pullSourceClone(\n dest: string,\n entry: SourceEntry,\n): { ok: true } | { ok: false; error: string } {\n // The declaration is authoritative: a clone whose `origin` was pointed elsewhere\n // fetches from the declared url again, as `install` does.\n spawnSync(\"git\", [\"-C\", dest, \"remote\", \"set-url\", \"origin\", entry.url], { stdio: \"pipe\" });\n if (!attachToBranch(dest, entry.pin) && entry.pin) return { ok: true };\n const pull = spawnSync(\"git\", [\"pull\", \"--ff-only\"], {\n cwd: dest,\n stdio: \"pipe\",\n encoding: \"utf8\",\n });\n if (pull.status === 0) return { ok: true };\n const reason = pullFailureReason(pull.stderr) || `git exited with status ${pull.status}`;\n return { ok: false, error: `git pull failed: ${reason}${unpublishedCommitAdvice(dest)}` };\n}\n\n/**\n * Library name for a new source row: the repo short name, or `<owner>-<repo>`\n * (then `<host>-<owner>-<repo>`) when another library already holds that name.\n * Rows are found by clone path, never by this name: `orgA/repo` and\n * `orgB/repo` share the short name `repo`.\n */\nfunction sourceLibraryName(url: string, libs: readonly { name: string }[]): string {\n const taken = new Set(libs.map((l) => l.name));\n // A repo may be named `my.repo`; `addLibrary` only accepts `[A-Za-z0-9_-]`\n // starting with a letter or digit, so every candidate is slugged first.\n const flat = (s: string) => s.replace(/[^A-Za-z0-9_-]+/g, \"-\").replace(/^[-_]+/, \"\") || \"source\";\n const short = flat(sourceShortName(url));\n if (!taken.has(short)) return short;\n const parts = sourceCacheKey(url).split(\"/\");\n const candidates =\n parts.length === 3\n ? [flat(`${parts[1]}-${parts[2]}`), flat(`${parts[0]}-${parts[1]}-${parts[2]}`)]\n : [];\n for (const c of candidates) if (!taken.has(c)) return c;\n let n = 2;\n while (taken.has(`${short}-${n}`)) n++;\n return `${short}-${n}`;\n}\n\n/**\n * Why a freshly cloned source cannot give its assets a publisher, or `undefined`: none is\n * declared anywhere, or the one its `skaile.manifest.yaml` names breaks the grammar of\n * `--publisher`. The walk is the one `add`, `install` and `check` run, so what it refuses here\n * they would skip later.\n */\nasync function publisherProblem(entry: SourceEntry, dest: string): Promise<string | undefined> {\n let problem: string | undefined;\n await buildProvenanceIndex(\n [\n {\n localPath: dest,\n sourceUrl: entry.url,\n commit: getRepoCommit(dest) ?? \"0\".repeat(40),\n tag: entry.pin,\n ...(entry.publisher ? { publisher: entry.publisher.replace(/^@/, \"\") } : {}),\n overlayManifestPath: curatedManifestOverlay(entry.url),\n },\n ],\n {\n knownKinds: getKnownKinds(),\n onSourceError: (_clone, err) => {\n const why = err instanceof Error ? err.message : String(err);\n if (/publisher must be declared|publisher \".*\" is invalid/.test(why)) problem = why;\n },\n },\n );\n return problem;\n}\n\n/**\n * Refresh the machine-global manifest cache for `entry` by running discovery\n * and upserting AssetDefinitions into `<skaile home>/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 advisories: string[];\n}> {\n const { manager, library, close } = await openLibraryManager();\n try {\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n const libs = await manager.listLibraries();\n const existing = libs.find((l) => path.resolve(l.path) === path.resolve(dest));\n // A clone made under an older cache key (the bare last segment before the url hash; `.git`\n // kept for a `….git/` url) leaves its library row at the old path. The row is this source's:\n // point it at the new clone instead of adding a second row for the same source (`add` would\n // warn \"exists in 2 libraries\"). Found by the old clone path or by the url it records.\n const key = sourceCacheKey(entry.url);\n const priorDirs = priorSourceCacheKeys(entry.url).map((k) => path.resolve(sourceClonePath(k)));\n const legacyRow = existing\n ? undefined\n : libs.find(\n (l) =>\n l.ownership === \"reader\" &&\n (priorDirs.includes(path.resolve(l.path)) ||\n (\"url\" in l.backendConfig && sourceCacheKey(l.backendConfig.url) === key)),\n );\n if (legacyRow) {\n const legacyDir = path.resolve(legacyRow.path);\n await manager.updateLibrary(legacyRow.id, { path: dest });\n logInfo(\n `Moved the \"${legacyRow.name}\" library to the new clone ${dest}. ` +\n `The old clone ${legacyDir} is no longer used and can be deleted.`,\n );\n }\n const added =\n existing ??\n legacyRow ??\n (await manager.addLibrary({\n name: sourceLibraryName(entry.url, libs),\n path: dest,\n backend: \"git\",\n backendConfig: {\n url: entry.url,\n branch: entry.pin ?? \"main\",\n authHint: \"ssh\",\n ...(entry.publisher ? { publisher: entry.publisher } : {}),\n },\n ownership: \"reader\",\n }));\n // The library row and its indexed assets are shared by every project that declares the\n // source, so they keep the publisher the first indexer recorded. A project that declares\n // another `--publisher` sees its own one: `AssetManager.scopeLibraryIndex` re-labels the\n // assets for it and leaves what other projects see alone (p1822).\n const cfg = added.backendConfig;\n const recorded = \"url\" in cfg ? cfg.publisher : undefined;\n const publisher = existing || legacyRow ? recorded : entry.publisher;\n const lib = added;\n // A `skaile source manifest init` curated manifest overrides the upstream repo's\n // raw glob discovery; `asset install` rescans with the same overlay.\n const catalog = new LocalCatalogSource(library, lib.id, dest, getKindRegistry(), {\n sidecarManifestFile: curatedManifestOverlay(entry.url),\n publisher,\n });\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 * Re-register the reader library of every source this project declares whose clone is cached\n * but whose library row is gone. The row is machine-wide: `source remove` in another project\n * drops it while this project's `sources:` still names the source, and `search` then finds\n * nothing until `update` runs (p757). Never touches the network; returns the sources restored.\n */\nexport async function restoreSourceReaders(projectDir: string): Promise<string[]> {\n const root = projectRootOf(projectDir);\n if (!root) return [];\n const sources = readProjectSources(path.join(root, workspaceConfigFilename()));\n const cached = sources.filter((s) => isSourceCloned(sourceClonePath(sourceCacheKey(s.url))));\n if (cached.length === 0) return [];\n const { manager, close } = await openLibraryManager();\n let missing: SourceEntry[];\n try {\n const libs = await manager.listLibraries();\n missing = cached.filter(\n (s) =>\n !libs.some(\n (l) => path.resolve(l.path) === path.resolve(sourceClonePath(sourceCacheKey(s.url))),\n ),\n );\n } finally {\n close();\n }\n const restored: string[] = [];\n for (const entry of missing) {\n try {\n await refreshManifestCache(entry);\n restored.push(sourceLabel(entry, sources));\n } catch (err) {\n logWarn(\n `Could not re-register source \"${sourceLabel(entry, sources)}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n return restored;\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 = projectRootOf(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 = path.resolve(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 (!isSourceCloned(dest)) {\n discardUnclonedSourceDir(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 const unborn = clone.status === 0 ? repairUnbornClone(dest) : undefined;\n if (clone.status !== 0 || unborn) {\n rmSync(dest, { recursive: true, force: true });\n discardUnclonedSourceDir(dest);\n const missing =\n clone.status !== 0 && entry.pin ? missingPinMessage(entry.url, entry.pin) : undefined;\n logWarn(\n unborn ? `${slug}: ${unborn}` : `${slug}: ${missing ?? \"git clone failed\"}, skipping.`,\n );\n failed++;\n continue;\n }\n } else {\n const pull = pullSourceClone(dest, entry);\n if (!pull.ok) {\n logErr(`${slug}: ${pull.error}`);\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 logAdvisories(result.advisories, false, slug);\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/**\n * Short names of the project's source clones that hold commits their upstream lacks.\n * `update --no-sync` still re-deploys from such a clone, so it reports them the way\n * `source sync` does. A clone without an upstream (detached at a pin) never counts.\n */\nexport function divergedSourceClones(projectDir: string): string[] {\n const root = path.resolve(projectDir);\n const diverged: string[] = [];\n for (const entry of readProjectSources(path.join(root, workspaceConfigFilename()))) {\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n if (!existsSync(dest)) continue;\n const ahead = spawnSync(\"git\", [\"-C\", dest, \"rev-list\", \"--count\", \"@{upstream}..HEAD\"], {\n stdio: \"pipe\",\n encoding: \"utf8\",\n });\n if (ahead.status === 0 && Number(ahead.stdout.trim()) > 0) {\n diverged.push(sourceShortName(entry.url));\n }\n }\n return diverged;\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 dest = sourceClonePath(sourceCacheKey(url));\n const { manager, close } = await openLibraryManager();\n try {\n // By clone path, not short name: another org's repo of the same name keeps its row.\n const dirs = [dest, ...priorSourceCacheKeys(url).map((k) => sourceClonePath(k))].map((d) =>\n path.resolve(d),\n );\n const existing = (await manager.listLibraries()).find((l) =>\n dirs.includes(path.resolve(l.path)),\n );\n if (existing) {\n await manager.removeLibrary(existing.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\n/**\n * The refusal for a `source add` argument that names a directory on this machine which cannot be\n * cloned: a registered library (it is already searchable and needs no source) or a folder that\n * is not a git repository. `undefined` for a URL, a shorthand or a directory that is a git repo.\n */\nexport async function localPathNotASource(source: string): Promise<string | undefined> {\n const raw = source.trim().replace(/^file:\\/\\//, \"\");\n // The path rule of `normalizeSourceUrl`: a bare name is a shorthand, never a folder in the cwd.\n if (!/^(?:\\/|\\.{1,2}(?:\\/|$)|~\\/)/.test(raw)) return undefined;\n const dir = path.resolve(raw.startsWith(\"~/\") ? path.join(os.homedir(), raw.slice(2)) : raw);\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return undefined;\n const real = realpathSync(dir);\n const { manager, close } = await openLibraryManager();\n try {\n const lib = (await manager.listLibraries()).find((l) => {\n try {\n return realpathSync(l.path) === real;\n } catch {\n return path.resolve(l.path) === dir;\n }\n });\n if (lib) {\n return `${dir} is the library \"${lib.name}\"; it needs no source — \\`skaile library list\\` shows it and its assets are already searchable.`;\n }\n } finally {\n close();\n }\n const git = spawnSync(\"git\", [\"-C\", dir, \"rev-parse\", \"--git-dir\"], { encoding: \"utf8\" });\n if (git.status !== 0) {\n return `${dir} is not a git repository. A source is a git repo: run \\`git init\\` and commit there, or register the folder as a library with \\`skaile library init <name> --path ${dir}\\`.`;\n }\n return undefined;\n}\n\n/**\n * The refusal for a `source add` URL that is the remote of a library registered by hand\n * (`library init --git`, `library init --reader`): its assets are already searchable, and a\n * source of the same repository would register a second, read-only library of the same\n * content (p499). `undefined` for any other URL. The reader row of a source clone never counts:\n * it lives in the clone cache and is the source itself.\n */\nexport async function remoteOfRegisteredLibrary(url: string): Promise<string | undefined> {\n const cloneRoots = [getGlobalCacheDir(), path.join(globalSkaileDir(), \"sources\")].map((d) =>\n path.resolve(d),\n );\n const { manager, close } = await openLibraryManager();\n try {\n const lib = (await manager.listLibraries()).find((l) => {\n const remote = \"url\" in l.backendConfig ? l.backendConfig.url : undefined;\n if (typeof remote !== \"string\" || !isSameRemote(remote, url)) return false;\n const at = path.resolve(l.path);\n return !cloneRoots.some((root) => at.startsWith(root + path.sep));\n });\n return lib\n ? `${url} is the remote of the library \"${lib.name}\"; it needs no source — \\`skaile library list\\` shows it and its assets are already searchable.`\n : undefined;\n } finally {\n close();\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> is a full git URL or an owner/repo shorthand (→ git@github.com:<owner>/<repo>.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(\n \"--force\",\n \"Remove an existing clone and re-clone; also change the publisher of a registered URL\",\n false,\n )\n .option(\n \"--publisher <name>\",\n \"Publisher of the source's assets when its skaile.manifest.yaml declares none (required for a non-GitHub URL)\",\n )\n .option(\"--dev\", \"Also index dev-only assets under the source's dev_paths\", false)\n .option(\"--verbose\", \"List every referenced file outside the asset filter\", false)\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(\n async (\n source: string,\n opts: {\n name?: string;\n pin?: string;\n branch?: string;\n force?: boolean;\n publisher?: string;\n dev?: boolean;\n verbose?: boolean;\n projectDir: string;\n },\n ) => {\n // A bare name used to expand to the `skaile-ai` org over SSH: a typo (or the slug\n // `source manifest init` printed) cloned a made-up repo. Say what to give instead.\n if (/^[\\w.-]+$/.test(source.trim().replace(/\\.git$/, \"\"))) {\n logErr(\n `\"${source}\" is not a git URL or an owner/repo shorthand. ` +\n \"Use `skaile source add <owner>/<repo>` or the full URL \" +\n \"(for a curated manifest: `skaile source add <the repo URL>`).\",\n );\n process.exitCode = 1;\n return;\n }\n const notASource = await localPathNotASource(source);\n if (notASource) {\n logErr(notASource);\n process.exitCode = 1;\n return;\n }\n let url = normalizeSourceUrl(source);\n const ownLibrary = await remoteOfRegisteredLibrary(url);\n if (ownLibrary) {\n logErr(ownLibrary);\n process.exitCode = 1;\n return;\n }\n const yamlPath = requireProjectYamlPath(opts.projectDir);\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 // The one exception is a repository on this machine: `/x/r.git` and `file:///x/r.git`\n // are one source, and the registered spelling stays (p618).\n const collision = findCacheKeyCollision(readProjectSources(yamlPath), url);\n if (collision && isLocalSourceUrl(collision.url) && isLocalSourceUrl(url)) {\n url = collision.url;\n } else 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 if (opts.publisher) entry.publisher = requireValidPublisherOrExit(opts.publisher);\n\n // The publisher of a registered URL names every ref its assets carry: a different one\n // would re-key the source and break the refs declared under the old one (p722).\n const registered = readProjectSources(yamlPath).find((s) => s.url === url);\n // A source registered without `--publisher` has one too: the manifest's, else the GitHub\n // org of its URL. Compare what each choice resolves to in the clone, not the flag (p722).\n // The clone's `origin` may have been repointed (a mirror, `git remote set-url`), so the\n // org is read from the registered URL when the clone gives none: the guard compares\n // against the registered entry, never against whatever the clone says today.\n const clonedAt = sourceClonePath(sourceCacheKey(url));\n const urlOrg = registered\n ? /github\\.com[/:]([^/]+)\\/[^/]+/.exec(registered.url)?.[1]?.toLowerCase()\n : undefined;\n const publisherNow =\n registered && existsSync(clonedAt)\n ? resolveSourcePublisher(clonedAt, registered.publisher ?? urlOrg)\n : (registered?.publisher ?? urlOrg);\n const publisherThen =\n registered && entry.publisher !== undefined && existsSync(clonedAt)\n ? resolveSourcePublisher(clonedAt, entry.publisher)\n : entry.publisher;\n if (\n registered &&\n publisherNow !== undefined &&\n entry.publisher !== undefined &&\n publisherNow !== publisherThen &&\n !opts.force\n ) {\n let declared: string[] = [];\n try {\n declared = (resolveSkWorkspaceConfig(path.dirname(yamlPath)).dependencies ?? []).filter(\n (d) => d.includes(`@${publisherNow}/`),\n );\n } catch {\n // an unreadable skaile.yaml stops later; the refusal below still holds\n }\n logErr(\n `${url} is registered with publisher \"${publisherNow}\"${\n registered.publisher === undefined ? \" (from its manifest or GitHub org)\" : \"\"\n }; --publisher ` +\n `\"${entry.publisher}\" would change it${\n declared.length > 0 ? ` and break the declared ${declared.join(\", \")}` : \"\"\n }. Pass --force to change it, or skaile source remove it first.`,\n );\n process.exitCode = 1;\n return;\n }\n\n const dest = sourceClonePath(sourceCacheKey(url));\n const preexisting = isSourceCloned(dest);\n // Clone/validate the repo BEFORE touching skaile.yaml — a failed clone\n // (repo not found, bad URL, network error) hard-exits in ensureClone, so\n // the entry is only ever recorded once the source is known-good.\n const cloned = ensureClone(entry, { force: opts.force });\n // A source with no publisher to give is skipped by every later command, so refuse it\n // here, before anything is recorded or indexed (a clone made by this call goes too).\n const noPublisher = await publisherProblem(entry, dest);\n if (noPublisher) {\n if (cloned && !preexisting) {\n rmSync(dest, { recursive: true, force: true });\n pruneEmptyCloneParents(dest);\n }\n logErr(noPublisher);\n process.exitCode = 1;\n return;\n }\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 editor = loadProjectEditor(yamlPath);\n editor.setSource(entry);\n editor.save();\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 logAdvisories(result.advisories, opts.verbose === true);\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 .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(async (opts: { json?: boolean; projectDir: string }) => {\n const yamlPath = requireProjectYamlPath(opts.projectDir);\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 = sourceLabel(s, sources);\n const cached = isSourceCloned(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 .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(async (key: string, opts: { projectDir: string }) => {\n const yamlPath = requireProjectYamlPath(opts.projectDir);\n const all = readProjectSources(yamlPath);\n const resolved = resolveSource(all, key);\n if (resolved.kind === \"none\") {\n logErr(`No source matching \"${key}\" in ${yamlPath}.`);\n process.exit(1);\n }\n if (resolved.kind === \"ambiguous\") exitAmbiguousSource(key, resolved.entries);\n const entry = resolved.entry;\n const slug = sourceLabel(entry, all);\n const clonePath = sourceClonePath(sourceCacheKey(entry.url));\n console.log(\n JSON.stringify(\n {\n ...entry,\n slug,\n clonePath,\n cached: isSourceCloned(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(\n \"--purge\",\n `Also delete the cached clone from ${path.join(globalCacheRoot(), \"sources\")}${path.sep}`,\n false,\n )\n .option(\"--force\", \"Remove the source although a locked asset still comes from it\", false)\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(async (key: string, opts: { purge: boolean; force?: boolean; projectDir: string }) => {\n const yamlPath = requireProjectYamlPath(opts.projectDir);\n const editor = loadProjectEditor(yamlPath);\n // Resolve to the stored URL (entries are keyed by url in the editor).\n const all = editor.getSources();\n const resolved = resolveSource(all, key);\n if (resolved.kind === \"none\") {\n logErr(`No source matching \"${key}\" in ${yamlPath}.`);\n process.exit(1);\n }\n if (resolved.kind === \"ambiguous\") exitAmbiguousSource(key, resolved.entries);\n const match = resolved.entry;\n const slug = sourceLabel(match, all);\n // A locked asset that comes from this source could not be restored or updated once the\n // source is gone: check, doctor and outdated would report it, install --locked would fail.\n const locked = new AssetManager({\n registry: getKindRegistry(),\n projectDir: path.dirname(yamlPath),\n }).lockedFromSource(match.url);\n if (locked.length > 0 && !opts.force) {\n logErr(\n `Source \"${slug}\" still supplies ${locked.length} locked asset(s): ${locked.join(\", \")}. ` +\n `Run \\`skaile remove\\` on them first, or pass --force to remove the source anyway.`,\n );\n process.exit(1);\n }\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 ${path.join(globalCacheRoot(), \"sources\")} — pass --purge to remove it, or run \\`skaile cache clean --global\\`).`,\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(\"--verbose\", \"List every referenced file outside the asset filter\", false)\n .option(\"--all\", \"Sync every source without prompting\", false)\n .option(\"--project-dir <path>\", \"Project directory\", process.cwd())\n .action(\n async (\n key: string | undefined,\n opts: { dev?: boolean; all?: boolean; verbose?: boolean; projectDir: string },\n ) => {\n const yamlPath = requireProjectYamlPath(opts.projectDir);\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 const resolved = resolveSource(sources, key);\n if (resolved.kind === \"ambiguous\") exitAmbiguousSource(key, resolved.entries);\n if (resolved.kind === \"none\") {\n logInfo(`No source matching \"${key}\".`);\n return;\n }\n targets = [resolved.entry];\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 = sourceLabel(entry, sources);\n const dest = sourceClonePath(sourceCacheKey(entry.url));\n if (!isSourceCloned(dest)) {\n const broken = existsSync(dest) && readdirSync(dest).length > 0;\n ensureClone(entry);\n if (broken) logInfo(`${slug}: the clone folder held no git checkout; replaced it.`);\n logOk(`${slug}: cloned to ${dest}.`);\n } else {\n const pull = pullSourceClone(dest, entry);\n if (!pull.ok) {\n logErr(`${slug}: ${pull.error}`);\n process.exitCode = 1;\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 logAdvisories(result.advisories, opts.verbose === true, slug);\n const legacyHint = legacySourceConfigHint(dest);\n if (legacyHint) logWarn(`${slug}: ${legacyHint}`);\n }\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"]}