@poping/yome 0.0.2 → 0.0.4

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 (276) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +11 -0
  3. package/README.md +306 -27
  4. package/README.zh-CN.md +333 -0
  5. package/bin/yome-calwatch +0 -0
  6. package/dist/agent.d.ts +24 -2
  7. package/dist/agent.js +34 -2
  8. package/dist/agent.js.map +1 -1
  9. package/dist/context.d.ts +2 -0
  10. package/dist/context.js +121 -13
  11. package/dist/context.js.map +1 -1
  12. package/dist/daemon/calendarPermission.d.ts +10 -0
  13. package/dist/daemon/calendarPermission.js +68 -0
  14. package/dist/daemon/calendarPermission.js.map +1 -0
  15. package/dist/daemon/cronCli.d.ts +19 -0
  16. package/dist/daemon/cronCli.js +403 -0
  17. package/dist/daemon/cronCli.js.map +1 -0
  18. package/dist/daemon/envHint.d.ts +5 -0
  19. package/dist/daemon/envHint.js +139 -0
  20. package/dist/daemon/envHint.js.map +1 -0
  21. package/dist/daemon/humanCron.d.ts +1 -0
  22. package/dist/daemon/humanCron.js +72 -0
  23. package/dist/daemon/humanCron.js.map +1 -0
  24. package/dist/daemon/humanOnce.d.ts +1 -0
  25. package/dist/daemon/humanOnce.js +54 -0
  26. package/dist/daemon/humanOnce.js.map +1 -0
  27. package/dist/daemon/index.d.ts +5 -0
  28. package/dist/daemon/index.js +168 -0
  29. package/dist/daemon/index.js.map +1 -0
  30. package/dist/daemon/launchd.d.ts +7 -0
  31. package/dist/daemon/launchd.js +93 -0
  32. package/dist/daemon/launchd.js.map +1 -0
  33. package/dist/daemon/log.d.ts +17 -0
  34. package/dist/daemon/log.js +57 -0
  35. package/dist/daemon/log.js.map +1 -0
  36. package/dist/daemon/paths.d.ts +11 -0
  37. package/dist/daemon/paths.js +27 -0
  38. package/dist/daemon/paths.js.map +1 -0
  39. package/dist/daemon/runTaskEntry.d.ts +1 -0
  40. package/dist/daemon/runTaskEntry.js +67 -0
  41. package/dist/daemon/runTaskEntry.js.map +1 -0
  42. package/dist/daemon/runner.d.ts +21 -0
  43. package/dist/daemon/runner.js +175 -0
  44. package/dist/daemon/runner.js.map +1 -0
  45. package/dist/daemon/scheduler.d.ts +5 -0
  46. package/dist/daemon/scheduler.js +162 -0
  47. package/dist/daemon/scheduler.js.map +1 -0
  48. package/dist/daemon/taskStore.d.ts +62 -0
  49. package/dist/daemon/taskStore.js +88 -0
  50. package/dist/daemon/taskStore.js.map +1 -0
  51. package/dist/daemon/triggers/calendar.d.ts +8 -0
  52. package/dist/daemon/triggers/calendar.js +248 -0
  53. package/dist/daemon/triggers/calendar.js.map +1 -0
  54. package/dist/daemon/triggers/childRunner.d.ts +14 -0
  55. package/dist/daemon/triggers/childRunner.js +111 -0
  56. package/dist/daemon/triggers/childRunner.js.map +1 -0
  57. package/dist/daemon/triggers/cron.d.ts +14 -0
  58. package/dist/daemon/triggers/cron.js +91 -0
  59. package/dist/daemon/triggers/cron.js.map +1 -0
  60. package/dist/daemon/triggers/file.d.ts +7 -0
  61. package/dist/daemon/triggers/file.js +123 -0
  62. package/dist/daemon/triggers/file.js.map +1 -0
  63. package/dist/daemon/triggers/once.d.ts +10 -0
  64. package/dist/daemon/triggers/once.js +80 -0
  65. package/dist/daemon/triggers/once.js.map +1 -0
  66. package/dist/index.js +240 -15
  67. package/dist/index.js.map +1 -1
  68. package/dist/llm.js +45 -2
  69. package/dist/llm.js.map +1 -1
  70. package/dist/loops/chain.js +8 -0
  71. package/dist/loops/chain.js.map +1 -1
  72. package/dist/loops/evaluator.js +8 -0
  73. package/dist/loops/evaluator.js.map +1 -1
  74. package/dist/loops/orchestrator.js +8 -0
  75. package/dist/loops/orchestrator.js.map +1 -1
  76. package/dist/loops/parallel.js.map +1 -1
  77. package/dist/loops/route.js +8 -0
  78. package/dist/loops/route.js.map +1 -1
  79. package/dist/loops/simple.js +15 -0
  80. package/dist/loops/simple.js.map +1 -1
  81. package/dist/permissions/index.d.ts +1 -1
  82. package/dist/permissions/index.js +1 -1
  83. package/dist/permissions/index.js.map +1 -1
  84. package/dist/permissions/loader.d.ts +20 -1
  85. package/dist/permissions/loader.js +51 -0
  86. package/dist/permissions/loader.js.map +1 -1
  87. package/dist/redact.d.ts +56 -0
  88. package/dist/redact.js +191 -0
  89. package/dist/redact.js.map +1 -0
  90. package/dist/skills/runner/applescript.d.ts +49 -0
  91. package/dist/skills/runner/applescript.js +100 -0
  92. package/dist/skills/runner/applescript.js.map +1 -0
  93. package/dist/skills/runner/dispatcher.d.ts +128 -0
  94. package/dist/skills/runner/dispatcher.js +617 -0
  95. package/dist/skills/runner/dispatcher.js.map +1 -0
  96. package/dist/skills/runner/dispatcher.test.d.ts +1 -0
  97. package/dist/skills/runner/dispatcher.test.js +141 -0
  98. package/dist/skills/runner/dispatcher.test.js.map +1 -0
  99. package/dist/skills/runner/kernel.d.ts +8 -0
  100. package/dist/skills/runner/kernel.js +731 -0
  101. package/dist/skills/runner/kernel.js.map +1 -0
  102. package/dist/skills/runner/nodeBackend.d.ts +32 -0
  103. package/dist/skills/runner/nodeBackend.js +147 -0
  104. package/dist/skills/runner/nodeBackend.js.map +1 -0
  105. package/dist/skills/runner/tokenizer.d.ts +36 -0
  106. package/dist/skills/runner/tokenizer.js +177 -0
  107. package/dist/skills/runner/tokenizer.js.map +1 -0
  108. package/dist/state/todos.d.ts +12 -0
  109. package/dist/state/todos.js +32 -0
  110. package/dist/state/todos.js.map +1 -0
  111. package/dist/threadCli.d.ts +11 -0
  112. package/dist/threadCli.js +177 -0
  113. package/dist/threadCli.js.map +1 -0
  114. package/dist/threadShare.d.ts +21 -0
  115. package/dist/threadShare.js +121 -0
  116. package/dist/threadShare.js.map +1 -0
  117. package/dist/threadSubmit.d.ts +32 -0
  118. package/dist/threadSubmit.js +199 -0
  119. package/dist/threadSubmit.js.map +1 -0
  120. package/dist/tools/askUser.d.ts +20 -0
  121. package/dist/tools/askUser.js +126 -0
  122. package/dist/tools/askUser.js.map +1 -0
  123. package/dist/tools/bash.js +63 -14
  124. package/dist/tools/bash.js.map +1 -1
  125. package/dist/tools/index.d.ts +24 -2
  126. package/dist/tools/index.js +54 -5
  127. package/dist/tools/index.js.map +1 -1
  128. package/dist/tools/skillCall.d.ts +2 -0
  129. package/dist/tools/skillCall.js +77 -0
  130. package/dist/tools/skillCall.js.map +1 -0
  131. package/dist/tools/todoWrite.d.ts +2 -0
  132. package/dist/tools/todoWrite.js +141 -0
  133. package/dist/tools/todoWrite.js.map +1 -0
  134. package/dist/tools/yome.d.ts +2 -0
  135. package/dist/tools/yome.js +87 -0
  136. package/dist/tools/yome.js.map +1 -0
  137. package/dist/ui/AgentPicker.js +3 -3
  138. package/dist/ui/AgentPicker.js.map +1 -1
  139. package/dist/ui/App.js +263 -61
  140. package/dist/ui/App.js.map +1 -1
  141. package/dist/ui/AskUserPrompt.d.ts +7 -0
  142. package/dist/ui/AskUserPrompt.js +78 -0
  143. package/dist/ui/AskUserPrompt.js.map +1 -0
  144. package/dist/ui/Banner.d.ts +2 -1
  145. package/dist/ui/Banner.js +23 -4
  146. package/dist/ui/Banner.js.map +1 -1
  147. package/dist/ui/InputBar.js +25 -36
  148. package/dist/ui/InputBar.js.map +1 -1
  149. package/dist/ui/Markdown.d.ts +2 -2
  150. package/dist/ui/Markdown.js +22 -7
  151. package/dist/ui/Markdown.js.map +1 -1
  152. package/dist/ui/MarketplacePicker.d.ts +7 -0
  153. package/dist/ui/MarketplacePicker.js +122 -0
  154. package/dist/ui/MarketplacePicker.js.map +1 -0
  155. package/dist/ui/MessageList.d.ts +12 -1
  156. package/dist/ui/MessageList.js +72 -7
  157. package/dist/ui/MessageList.js.map +1 -1
  158. package/dist/ui/ModelPicker.js +4 -4
  159. package/dist/ui/ModelPicker.js.map +1 -1
  160. package/dist/ui/MultilineTextInput.d.ts +31 -0
  161. package/dist/ui/MultilineTextInput.js +393 -0
  162. package/dist/ui/MultilineTextInput.js.map +1 -0
  163. package/dist/ui/MultilineTextInput.test.d.ts +1 -0
  164. package/dist/ui/MultilineTextInput.test.js +30 -0
  165. package/dist/ui/MultilineTextInput.test.js.map +1 -0
  166. package/dist/ui/PermissionPrompt.d.ts +16 -4
  167. package/dist/ui/PermissionPrompt.js +60 -15
  168. package/dist/ui/PermissionPrompt.js.map +1 -1
  169. package/dist/ui/SessionPicker.js +2 -2
  170. package/dist/ui/SessionPicker.js.map +1 -1
  171. package/dist/ui/ShimmerText.d.ts +8 -0
  172. package/dist/ui/ShimmerText.js +40 -0
  173. package/dist/ui/ShimmerText.js.map +1 -0
  174. package/dist/ui/Spinner.js +3 -9
  175. package/dist/ui/Spinner.js.map +1 -1
  176. package/dist/ui/TodoPanel.d.ts +7 -0
  177. package/dist/ui/TodoPanel.js +36 -0
  178. package/dist/ui/TodoPanel.js.map +1 -0
  179. package/dist/ui/TogglePicker.js +4 -4
  180. package/dist/ui/TogglePicker.js.map +1 -1
  181. package/dist/ui/ToolResult.js +6 -0
  182. package/dist/ui/ToolResult.js.map +1 -1
  183. package/dist/ui/UnifiedSkillsPicker.d.ts +10 -0
  184. package/dist/ui/UnifiedSkillsPicker.js +63 -0
  185. package/dist/ui/UnifiedSkillsPicker.js.map +1 -0
  186. package/dist/ui/animation.d.ts +3 -0
  187. package/dist/ui/animation.js +48 -0
  188. package/dist/ui/animation.js.map +1 -0
  189. package/dist/ui/useThrottledStream.d.ts +7 -0
  190. package/dist/ui/useThrottledStream.js +63 -0
  191. package/dist/ui/useThrottledStream.js.map +1 -0
  192. package/dist/yomeSkills/auth.d.ts +20 -0
  193. package/dist/yomeSkills/auth.js +70 -0
  194. package/dist/yomeSkills/auth.js.map +1 -0
  195. package/dist/yomeSkills/blacklist.d.ts +33 -0
  196. package/dist/yomeSkills/blacklist.js +101 -0
  197. package/dist/yomeSkills/blacklist.js.map +1 -0
  198. package/dist/yomeSkills/capabilities.d.ts +54 -0
  199. package/dist/yomeSkills/capabilities.js +175 -0
  200. package/dist/yomeSkills/capabilities.js.map +1 -0
  201. package/dist/yomeSkills/capabilityGuard.d.ts +31 -0
  202. package/dist/yomeSkills/capabilityGuard.js +113 -0
  203. package/dist/yomeSkills/capabilityGuard.js.map +1 -0
  204. package/dist/yomeSkills/cli.d.ts +25 -0
  205. package/dist/yomeSkills/cli.js +624 -0
  206. package/dist/yomeSkills/cli.js.map +1 -0
  207. package/dist/yomeSkills/deprecate.d.ts +29 -0
  208. package/dist/yomeSkills/deprecate.js +99 -0
  209. package/dist/yomeSkills/deprecate.js.map +1 -0
  210. package/dist/yomeSkills/devLink.d.ts +17 -0
  211. package/dist/yomeSkills/devLink.js +91 -0
  212. package/dist/yomeSkills/devLink.js.map +1 -0
  213. package/dist/yomeSkills/doctor.d.ts +13 -0
  214. package/dist/yomeSkills/doctor.js +152 -0
  215. package/dist/yomeSkills/doctor.js.map +1 -0
  216. package/dist/yomeSkills/enable.d.ts +8 -0
  217. package/dist/yomeSkills/enable.js +67 -0
  218. package/dist/yomeSkills/enable.js.map +1 -0
  219. package/dist/yomeSkills/hubPing.d.ts +1 -0
  220. package/dist/yomeSkills/hubPing.js +41 -0
  221. package/dist/yomeSkills/hubPing.js.map +1 -0
  222. package/dist/yomeSkills/install.d.ts +18 -0
  223. package/dist/yomeSkills/install.js +143 -0
  224. package/dist/yomeSkills/install.js.map +1 -0
  225. package/dist/yomeSkills/installFromHubTarball.d.ts +26 -0
  226. package/dist/yomeSkills/installFromHubTarball.js +161 -0
  227. package/dist/yomeSkills/installFromHubTarball.js.map +1 -0
  228. package/dist/yomeSkills/installGithub.d.ts +33 -0
  229. package/dist/yomeSkills/installGithub.js +213 -0
  230. package/dist/yomeSkills/installGithub.js.map +1 -0
  231. package/dist/yomeSkills/installMeta.d.ts +8 -0
  232. package/dist/yomeSkills/installMeta.js +76 -0
  233. package/dist/yomeSkills/installMeta.js.map +1 -0
  234. package/dist/yomeSkills/integrity.d.ts +26 -0
  235. package/dist/yomeSkills/integrity.js +107 -0
  236. package/dist/yomeSkills/integrity.js.map +1 -0
  237. package/dist/yomeSkills/invoke.d.ts +29 -0
  238. package/dist/yomeSkills/invoke.js +135 -0
  239. package/dist/yomeSkills/invoke.js.map +1 -0
  240. package/dist/yomeSkills/list.d.ts +11 -0
  241. package/dist/yomeSkills/list.js +55 -0
  242. package/dist/yomeSkills/list.js.map +1 -0
  243. package/dist/yomeSkills/login.d.ts +41 -0
  244. package/dist/yomeSkills/login.js +221 -0
  245. package/dist/yomeSkills/login.js.map +1 -0
  246. package/dist/yomeSkills/manifest.d.ts +60 -0
  247. package/dist/yomeSkills/manifest.js +47 -0
  248. package/dist/yomeSkills/manifest.js.map +1 -0
  249. package/dist/yomeSkills/paths.d.ts +13 -0
  250. package/dist/yomeSkills/paths.js +33 -0
  251. package/dist/yomeSkills/paths.js.map +1 -0
  252. package/dist/yomeSkills/publish.d.ts +18 -0
  253. package/dist/yomeSkills/publish.js +114 -0
  254. package/dist/yomeSkills/publish.js.map +1 -0
  255. package/dist/yomeSkills/rollback.d.ts +10 -0
  256. package/dist/yomeSkills/rollback.js +83 -0
  257. package/dist/yomeSkills/rollback.js.map +1 -0
  258. package/dist/yomeSkills/search.d.ts +21 -0
  259. package/dist/yomeSkills/search.js +31 -0
  260. package/dist/yomeSkills/search.js.map +1 -0
  261. package/dist/yomeSkills/skillsIndex.d.ts +36 -0
  262. package/dist/yomeSkills/skillsIndex.js +111 -0
  263. package/dist/yomeSkills/skillsIndex.js.map +1 -0
  264. package/dist/yomeSkills/unified.d.ts +53 -0
  265. package/dist/yomeSkills/unified.js +187 -0
  266. package/dist/yomeSkills/unified.js.map +1 -0
  267. package/dist/yomeSkills/uninstall.d.ts +7 -0
  268. package/dist/yomeSkills/uninstall.js +22 -0
  269. package/dist/yomeSkills/uninstall.js.map +1 -0
  270. package/dist/yomeSkills/update.d.ts +18 -0
  271. package/dist/yomeSkills/update.js +75 -0
  272. package/dist/yomeSkills/update.js.map +1 -0
  273. package/dist/yomeSkills/validate.d.ts +11 -0
  274. package/dist/yomeSkills/validate.js +99 -0
  275. package/dist/yomeSkills/validate.js.map +1 -0
  276. package/package.json +23 -6
@@ -0,0 +1,143 @@
1
+ // `yome skill install <source>` — install a skill into ~/.yome/skills/.
2
+ //
3
+ // During Phase 1 (per spec 8.5) we support local-path installs only:
4
+ // yome skill install ./skills/yome-skill-ppt
5
+ // yome skill install /abs/path/to/yome-skill-foo
6
+ // Phase 2 will add registry / git installs:
7
+ // yome skill install @yome/ppt (registry resolution)
8
+ // yome skill install github:owner/repo (git clone)
9
+ //
10
+ // Install strategy:
11
+ // - Read source/yome-skill.json, validate slug+domain+version
12
+ // - Compute install path ~/.yome/skills/<owner>/<name>/
13
+ // - If already installed and not --force, error out
14
+ // - Recursively copy source → install path (skip node_modules / .git / dist)
15
+ // - Done; no post-install hooks in this phase
16
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, renameSync, rmSync, statSync } from 'fs';
17
+ import { join, resolve } from 'path';
18
+ import { readManifest, validateManifest } from './manifest.js';
19
+ import { installPathForSlug, parseSlug } from './paths.js';
20
+ import { writeInstallMeta } from './installMeta.js';
21
+ import { decideCapabilities, writeAllowedCapabilities } from './capabilities.js';
22
+ import { refreshIndex } from './skillsIndex.js';
23
+ import { pingBlacklist } from './blacklist.js';
24
+ const IGNORE = new Set(['node_modules', '.git', 'dist', '.DS_Store', '.next', '.turbo', 'coverage']);
25
+ function copyDir(src, dest, log) {
26
+ let count = 0;
27
+ if (!existsSync(dest))
28
+ mkdirSync(dest, { recursive: true });
29
+ for (const entry of readdirSync(src)) {
30
+ if (IGNORE.has(entry))
31
+ continue;
32
+ const s = join(src, entry);
33
+ const d = join(dest, entry);
34
+ const st = statSync(s);
35
+ if (st.isDirectory()) {
36
+ count += copyDir(s, d, log);
37
+ }
38
+ else if (st.isFile()) {
39
+ copyFileSync(s, d);
40
+ log?.(` + ${entry}`);
41
+ count++;
42
+ }
43
+ }
44
+ return count;
45
+ }
46
+ export async function installFromLocal(source, opts = {}) {
47
+ const abs = resolve(source);
48
+ if (!existsSync(abs))
49
+ return { ok: false, reason: `source path does not exist: ${abs}` };
50
+ if (!statSync(abs).isDirectory())
51
+ return { ok: false, reason: `source is not a directory: ${abs}` };
52
+ const manifest = readManifest(abs);
53
+ if (!manifest)
54
+ return { ok: false, reason: `${abs}/yome-skill.json missing or unreadable` };
55
+ const v = validateManifest(manifest);
56
+ if (!v.ok)
57
+ return { ok: false, reason: `manifest invalid: ${v.errors.join('; ')}` };
58
+ const slugParts = parseSlug(manifest.slug);
59
+ if (!slugParts)
60
+ return { ok: false, reason: `slug "${manifest.slug}" is malformed` };
61
+ const dest = installPathForSlug(manifest.slug);
62
+ if (!dest)
63
+ return { ok: false, reason: `cannot derive install path for ${manifest.slug}` };
64
+ // Blacklist gate — done before we touch the filesystem.
65
+ if (!opts.skipBlacklist) {
66
+ try {
67
+ const hit = await pingBlacklist(manifest.slug);
68
+ if (hit) {
69
+ return {
70
+ ok: false,
71
+ reason: `${manifest.slug} is on the yome.work blacklist (${hit.reason})${hit.detail ? `: ${hit.detail}` : ''}`,
72
+ };
73
+ }
74
+ }
75
+ catch { /* offline → ignore, conservative no-block */ }
76
+ }
77
+ // Capability prompt — done before we touch the filesystem so a
78
+ // declined install leaves no trace.
79
+ const decision = await decideCapabilities(manifest.slug, manifest.system_capabilities, { assumeYes: opts.yes });
80
+ if (!decision.ok) {
81
+ return { ok: false, reason: decision.reason ?? 'capability grant declined' };
82
+ }
83
+ if (existsSync(dest)) {
84
+ if (!opts.force) {
85
+ return { ok: false, reason: `${manifest.slug} already installed at ${dest} (use --force to overwrite)` };
86
+ }
87
+ // Move the existing install aside as the rollback snapshot. We keep
88
+ // exactly ONE previous version (per spec 11.4-D "保留最近 2 个版本").
89
+ // The snapshot lives next to the install dir so it shares the slug's
90
+ // capability grant / parent directory layout.
91
+ try {
92
+ const snap = `${dest}.previous`;
93
+ if (existsSync(snap))
94
+ rmSync(snap, { recursive: true, force: true });
95
+ // os.rename is atomic; if it fails (cross-filesystem etc) we fall
96
+ // back to copy-then-delete via a recursive helper inlined below.
97
+ try {
98
+ renameSync(dest, snap);
99
+ }
100
+ catch {
101
+ copyDir(dest, snap);
102
+ rmSync(dest, { recursive: true, force: true });
103
+ }
104
+ }
105
+ catch {
106
+ // If snapshotting fails for any reason we still proceed — losing
107
+ // rollback ability is better than losing the install itself.
108
+ try {
109
+ rmSync(dest, { recursive: true, force: true });
110
+ }
111
+ catch { /* ignore */ }
112
+ }
113
+ }
114
+ const log = opts.verbose ? (s) => process.stdout.write(s + '\n') : undefined;
115
+ const copied = copyDir(abs, dest, log);
116
+ // Persist how we got here so `yome skill update` can replay later.
117
+ try {
118
+ writeInstallMeta(manifest.slug, {
119
+ source: `local:${abs}`,
120
+ installed_at: new Date().toISOString(),
121
+ manifest_version: manifest.version,
122
+ });
123
+ }
124
+ catch { /* best effort */ }
125
+ // Write the capability grant alongside the install meta.
126
+ try {
127
+ if (decision.granted)
128
+ writeAllowedCapabilities(manifest.slug, decision.granted);
129
+ }
130
+ catch { /* best effort */ }
131
+ // Refresh the fast lookup index.
132
+ try {
133
+ refreshIndex();
134
+ }
135
+ catch { /* best effort */ }
136
+ return {
137
+ ok: true,
138
+ slug: manifest.slug,
139
+ installedAt: dest,
140
+ copiedFiles: copied,
141
+ };
142
+ }
143
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/yomeSkills/install.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,qEAAqE;AACrE,+CAA+C;AAC/C,mDAAmD;AACnD,4CAA4C;AAC5C,iEAAiE;AACjE,uDAAuD;AACvD,EAAE;AACF,oBAAoB;AACpB,gEAAgE;AAChE,0DAA0D;AAC1D,sDAAsD;AACtD,+EAA+E;AAC/E,gDAAgD;AAEhD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAqB/C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAErG,SAAS,OAAO,CAAC,GAAW,EAAE,IAAY,EAAE,GAAyB;IACnE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;YACvB,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnB,GAAG,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;YACtB,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAuB,EAAE;IAC9E,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,+BAA+B,GAAG,EAAE,EAAE,CAAC;IACzF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,GAAG,EAAE,EAAE,CAAC;IAEpG,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,wCAAwC,EAAE,CAAC;IAE5F,MAAM,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAEpF,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,QAAQ,CAAC,IAAI,gBAAgB,EAAE,CAAC;IACrF,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kCAAkC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IAE3F,wDAAwD;IACxD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,mCAAmC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;iBAC/G,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,6CAA6C,CAAC,CAAC;IAC3D,CAAC;IAED,+DAA+D;IAC/D,oCAAoC;IACpC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAChH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,2BAA2B,EAAE,CAAC;IAC/E,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,yBAAyB,IAAI,6BAA6B,EAAE,CAAC;QAC3G,CAAC;QACD,oEAAoE;QACpE,+DAA+D;QAC/D,qEAAqE;QACrE,8CAA8C;QAC9C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,IAAI,WAAW,CAAC;YAChC,IAAI,UAAU,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrE,kEAAkE;YAClE,iEAAiE;YACjE,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACpB,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;YACjE,6DAA6D;YAC7D,IAAI,CAAC;gBAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAEvC,mEAAmE;IACnE,IAAI,CAAC;QACH,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC9B,MAAM,EAAE,SAAS,GAAG,EAAE;YACtB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACtC,gBAAgB,EAAE,QAAQ,CAAC,OAAO;SACnC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAE7B,yDAAyD;IACzD,IAAI,CAAC;QACH,IAAI,QAAQ,CAAC,OAAO;YAAE,wBAAwB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAE7B,iCAAiC;IACjC,IAAI,CAAC;QAAC,YAAY,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAEnD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,MAAM;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type InstallResult } from './install.js';
2
+ export interface InstallFromHubExtra {
3
+ /** Override version. When omitted we install the slug's latest non-deprecated. */
4
+ version?: string;
5
+ /** Pass through to installFromLocal — auto-grant capabilities, useful in CI. */
6
+ yes?: boolean;
7
+ /** Pass through. */
8
+ force?: boolean;
9
+ verbose?: boolean;
10
+ /** Install a deprecated version on purpose. Default false. */
11
+ allowDeprecated?: boolean;
12
+ /** Disable post-install sha256 verification (dev/debug). Default false. */
13
+ skipVerify?: boolean;
14
+ }
15
+ export interface InstallFromHubResult extends InstallResult {
16
+ /** Distinguish "really came from hub" from "fell through to github". */
17
+ source?: 'hub' | 'fallback';
18
+ /** The exact version installed (resolved on the hub). */
19
+ resolvedVersion?: string;
20
+ }
21
+ /**
22
+ * Install a slug by pulling the hub-cached tarball. Returns ok=false +
23
+ * a structured reason whenever the hub doesn't have a usable tarball
24
+ * — the caller can then fall back to a GitHub clone.
25
+ */
26
+ export declare function installFromHubTarball(slug: string, opts?: InstallFromHubExtra): Promise<InstallFromHubResult>;
@@ -0,0 +1,161 @@
1
+ // cli/src/yomeSkills/installFromHubTarball.ts
2
+ //
3
+ // Hub-cached tarball install path. Used by `yome skill install <slug>`
4
+ // and as the fast path inside `installFromGithub` when the hub already
5
+ // has bytes for the version the user is asking for.
6
+ //
7
+ // Why this exists:
8
+ // - Sub-second installs vs 5-30s for `git clone --depth=1` from China.
9
+ // - GitHub repo can be deleted / transferred / temporarily unreachable
10
+ // and the cached tarball still works.
11
+ // - The bytes we install are byte-identical to what publisher's
12
+ // tarball_sha256 was computed against — no race window between
13
+ // publish-time and install-time on the upstream repo.
14
+ //
15
+ // Pipeline:
16
+ // 1. GET /api/hub/skills/<slug>?version=<v> (resolve version + sha)
17
+ // 2. GET /api/hub/skills/<slug>/versions/<v>/tarball (302 → public URL)
18
+ // 3. Stream the tar.gz into a tmp dir
19
+ // 4. Extract via the system `tar -xzf` (same binary cli installs require)
20
+ // 5. Verify sha256 of the extracted tree == hub sha256 == sha256 in the
21
+ // X-Yome-Skill-Sha256 header from step 2
22
+ // 6. Hand the extracted dir to `installFromLocal()` for the rest of
23
+ // the install (capability prompt, rollback snapshot, meta write)
24
+ //
25
+ // On any failure the caller falls back to `installFromGithub`. The
26
+ // retry path is opaque — the user just sees one install attempt.
27
+ import { spawnSync } from 'node:child_process';
28
+ import { writeFileSync, mkdtempSync, rmSync, existsSync } from 'node:fs';
29
+ import { tmpdir } from 'node:os';
30
+ import { join } from 'node:path';
31
+ import { installFromLocal } from './install.js';
32
+ import { writeInstallMeta } from './installMeta.js';
33
+ import { computeSkillSha256 } from './integrity.js';
34
+ import { readManifest } from './manifest.js';
35
+ const DEFAULT_HUB_BASE = 'https://yome.work';
36
+ function getHubBase() {
37
+ return (process.env.YOME_HUB_BASE ?? DEFAULT_HUB_BASE).replace(/\/+$/, '');
38
+ }
39
+ /** GET /api/hub/skills/<slug>[?version=v] — returns null on any failure. */
40
+ async function fetchHubMeta(slug, version) {
41
+ try {
42
+ const url = `${getHubBase()}/api/hub/skills/${encodeURIComponent(slug)}` +
43
+ (version ? `?version=${encodeURIComponent(version)}` : '');
44
+ const r = await fetch(url, { headers: { Accept: 'application/json' } });
45
+ if (!r.ok)
46
+ return null;
47
+ const j = (await r.json());
48
+ if (!j || j.ok !== true || !j.skill || !j.version)
49
+ return null;
50
+ return {
51
+ skill: {
52
+ slug: String(j.skill.slug ?? slug),
53
+ github_full_name: j.skill.github_full_name ?? null,
54
+ effective_latest_version: j.skill.effective_latest_version ?? null,
55
+ },
56
+ ver: {
57
+ version: String(j.version.version),
58
+ tarball_sha256: j.version.tarball_sha256 ?? null,
59
+ deprecated: !!j.version.deprecated,
60
+ deprecation_reason: j.version.deprecation_reason ?? null,
61
+ replaced_by_version: j.version.replaced_by_version ?? null,
62
+ },
63
+ };
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ /**
70
+ * Install a slug by pulling the hub-cached tarball. Returns ok=false +
71
+ * a structured reason whenever the hub doesn't have a usable tarball
72
+ * — the caller can then fall back to a GitHub clone.
73
+ */
74
+ export async function installFromHubTarball(slug, opts = {}) {
75
+ const meta = await fetchHubMeta(slug, opts.version);
76
+ if (!meta) {
77
+ return { ok: false, source: 'hub', reason: `hub has no record for ${slug}${opts.version ? `@${opts.version}` : ''}` };
78
+ }
79
+ // Deprecation gate (mirror installFromGithub).
80
+ if (meta.ver.deprecated && !opts.allowDeprecated) {
81
+ const replaced = meta.ver.replaced_by_version
82
+ ? ` Use --version ${meta.ver.replaced_by_version} instead, or pass --allow-deprecated to override.`
83
+ : ' Pass --allow-deprecated to install it anyway.';
84
+ const why = meta.ver.deprecation_reason ? ` Reason: ${meta.ver.deprecation_reason}.` : '';
85
+ return { ok: false, source: 'hub', reason: `${slug}@${meta.ver.version} is deprecated.${why}${replaced}` };
86
+ }
87
+ // Resolve tarball URL via the hub redirect.
88
+ const tarUrl = `${getHubBase()}/api/hub/skills/${encodeURIComponent(slug)}/versions/${encodeURIComponent(meta.ver.version)}/tarball`;
89
+ let resp;
90
+ try {
91
+ resp = await fetch(tarUrl, { redirect: 'follow' });
92
+ }
93
+ catch (e) {
94
+ return { ok: false, source: 'hub', reason: `tarball fetch failed: ${e.message}` };
95
+ }
96
+ if (!resp.ok) {
97
+ if (resp.status === 410) {
98
+ return { ok: false, source: 'hub', reason: `${slug}@${meta.ver.version} has no cached tarball (legacy publish; will fall back to git clone)` };
99
+ }
100
+ return { ok: false, source: 'hub', reason: `tarball fetch HTTP ${resp.status}` };
101
+ }
102
+ const tarBytes = Buffer.from(await resp.arrayBuffer());
103
+ if (tarBytes.length === 0) {
104
+ return { ok: false, source: 'hub', reason: `tarball was empty` };
105
+ }
106
+ // Extract to tmp dir.
107
+ const cleanupRoot = mkdtempSync(join(tmpdir(), 'yome-hub-install-'));
108
+ const extractDir = join(cleanupRoot, 'skill');
109
+ try {
110
+ const tarFile = join(cleanupRoot, 'skill.tar.gz');
111
+ writeFileSync(tarFile, tarBytes);
112
+ const mk = spawnSync('mkdir', ['-p', extractDir], { encoding: 'utf-8' });
113
+ if (mk.status !== 0) {
114
+ return { ok: false, source: 'hub', reason: `mkdir failed: ${mk.stderr || ''}` };
115
+ }
116
+ const ut = spawnSync('tar', ['-xzf', tarFile, '-C', extractDir], { encoding: 'utf-8' });
117
+ if (ut.status !== 0) {
118
+ return { ok: false, source: 'hub', reason: `tar -xzf failed: ${(ut.stderr || '').trim()}` };
119
+ }
120
+ // Verify sha256 of extracted tree against hub-recorded sha.
121
+ if (!opts.skipVerify && meta.ver.tarball_sha256) {
122
+ const computed = computeSkillSha256(extractDir);
123
+ if (computed.toLowerCase() !== meta.ver.tarball_sha256.toLowerCase()) {
124
+ return {
125
+ ok: false,
126
+ source: 'hub',
127
+ reason: `sha256 mismatch on hub tarball — refusing install. expected ${meta.ver.tarball_sha256.slice(0, 12)}…, got ${computed.slice(0, 12)}…`,
128
+ };
129
+ }
130
+ }
131
+ if (!existsSync(join(extractDir, 'yome-skill.json'))) {
132
+ return { ok: false, source: 'hub', reason: `extracted tarball has no yome-skill.json — hub artefact corrupted` };
133
+ }
134
+ // Hand off to local install. installFromLocal handles capability
135
+ // prompt + rollback snapshot + index refresh.
136
+ const result = await installFromLocal(extractDir, {
137
+ force: opts.force,
138
+ verbose: opts.verbose,
139
+ yes: opts.yes,
140
+ // skipBlacklist: false (default; hub blacklist still applies)
141
+ });
142
+ if (result.ok && result.slug) {
143
+ // Overwrite the meta with the hub source so `yome skill update`
144
+ // re-pulls from hub instead of the tmp dir.
145
+ try {
146
+ const installed = readManifest(result.installedAt);
147
+ writeInstallMeta(result.slug, {
148
+ source: `hub:${slug}@${meta.ver.version}`,
149
+ installed_at: new Date().toISOString(),
150
+ manifest_version: installed?.version ?? meta.ver.version,
151
+ });
152
+ }
153
+ catch { /* best effort */ }
154
+ }
155
+ return { ...result, source: 'hub', resolvedVersion: meta.ver.version };
156
+ }
157
+ finally {
158
+ rmSync(cleanupRoot, { recursive: true, force: true });
159
+ }
160
+ }
161
+ //# sourceMappingURL=installFromHubTarball.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installFromHubTarball.js","sourceRoot":"","sources":["../../src/yomeSkills/installFromHubTarball.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,uEAAuE;AACvE,uEAAuE;AACvE,oDAAoD;AACpD,EAAE;AACF,mBAAmB;AACnB,yEAAyE;AACzE,yEAAyE;AACzE,0CAA0C;AAC1C,kEAAkE;AAClE,mEAAmE;AACnE,0DAA0D;AAC1D,EAAE;AACF,YAAY;AACZ,uEAAuE;AACvE,2EAA2E;AAC3E,wCAAwC;AACxC,4EAA4E;AAC5E,0EAA0E;AAC1E,8CAA8C;AAC9C,sEAAsE;AACtE,sEAAsE;AACtE,EAAE;AACF,mEAAmE;AACnE,iEAAiE;AAEjE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAA2C,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAE7C,SAAS,UAAU;IACjB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC7E,CAAC;AAoCD,4EAA4E;AAC5E,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAAgB;IACxD,IAAI,CAAC;QACH,MAAM,GAAG,GACP,GAAG,UAAU,EAAE,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,EAAE;YAC5D,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAIxB,CAAC;QACF,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC/D,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC;gBAClC,gBAAgB,EAAG,CAAC,CAAC,KAAK,CAAC,gBAA2B,IAAI,IAAI;gBAC9D,wBAAwB,EAAG,CAAC,CAAC,KAAK,CAAC,wBAAmC,IAAI,IAAI;aAC/E;YACD,GAAG,EAAE;gBACH,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;gBAClC,cAAc,EAAG,CAAC,CAAC,OAAO,CAAC,cAAyB,IAAI,IAAI;gBAC5D,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU;gBAClC,kBAAkB,EAAG,CAAC,CAAC,OAAO,CAAC,kBAA6B,IAAI,IAAI;gBACpE,mBAAmB,EAAG,CAAC,CAAC,OAAO,CAAC,mBAA8B,IAAI,IAAI;aACvE;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY,EAAE,OAA4B,EAAE;IACtF,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;IACxH,CAAC;IAED,+CAA+C;IAC/C,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB;YAC3C,CAAC,CAAC,kBAAkB,IAAI,CAAC,GAAG,CAAC,mBAAmB,mDAAmD;YACnG,CAAC,CAAC,gDAAgD,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,kBAAkB,GAAG,GAAG,QAAQ,EAAE,EAAE,CAAC;IAC7G,CAAC;IAED,4CAA4C;IAC5C,MAAM,MAAM,GAAG,GAAG,UAAU,EAAE,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,aAAa,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;IACrI,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,yBAA0B,CAAW,CAAC,OAAO,EAAE,EAAE,CAAC;IAC/F,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,sEAAsE,EAAE,CAAC;QACjJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IACnF,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACnE,CAAC;IAED,sBAAsB;IACtB,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAClD,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,EAAE,CAAC;QAClF,CAAC;QACD,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACxF,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QAC9F,CAAC;QAED,4DAA4D;QAC5D,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrE,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,KAAK;oBACb,MAAM,EAAE,+DAA+D,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;iBAC9I,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,mEAAmE,EAAE,CAAC;QACnH,CAAC;QAED,iEAAiE;QACjE,8CAA8C;QAC9C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE;YAChD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,8DAA8D;SAC/D,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7B,gEAAgE;YAChE,4CAA4C;YAC5C,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,WAAY,CAAC,CAAC;gBACpD,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE;oBAC5B,MAAM,EAAE,OAAO,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;oBACzC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACtC,gBAAgB,EAAE,SAAS,EAAE,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO;iBACzD,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACzE,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type InstallOptions, type InstallResult } from './install.js';
2
+ export interface ParsedGithubSource {
3
+ owner: string;
4
+ repo: string;
5
+ ref?: string;
6
+ subPath?: string;
7
+ /** The https clone URL we will hand to `git clone`. */
8
+ cloneUrl: string;
9
+ }
10
+ export declare function parseGithubSource(source: string): ParsedGithubSource | null;
11
+ export declare function isGithubSource(source: string): boolean;
12
+ interface GithubInstallExtra {
13
+ /** When set, after install we recompute sha256 of the install dir and
14
+ * compare against this value. Mismatch → uninstall + error.
15
+ * When omitted (e.g. older publish without sha256), verification is skipped. */
16
+ expectedSha256?: string | null;
17
+ /** Disable post-install sha256 verification entirely (dev/debug). */
18
+ skipVerify?: boolean;
19
+ /**
20
+ * Install a deprecated version on purpose. Without this flag, the cli
21
+ * refuses with a pointer to `replaced_by_version`. Default false so
22
+ * users get a loud signal when they're about to install something the
23
+ * author marked as superseded.
24
+ */
25
+ allowDeprecated?: boolean;
26
+ }
27
+ /**
28
+ * Clone the repo into a tmp dir, then delegate to `installFromLocal`. Always
29
+ * cleans up the tmp clone, even on failure. If `expectedSha256` is provided,
30
+ * we verify the installed bytes match before declaring success.
31
+ */
32
+ export declare function installFromGithub(source: string, opts?: InstallOptions & GithubInstallExtra): Promise<InstallResult>;
33
+ export {};
@@ -0,0 +1,213 @@
1
+ // cli/src/yomeSkills/installGithub.ts — install a skill from a GitHub repo.
2
+ //
3
+ // Phase 2 source forms (per spec 8.5 / 11.2):
4
+ // yome skill install github:owner/repo
5
+ // yome skill install github:owner/repo@v1.2.0 (tag/branch/sha)
6
+ // yome skill install github:owner/repo#path/to/skill (subdir within repo)
7
+ // yome skill install https://github.com/owner/repo
8
+ // yome skill install https://github.com/owner/repo/tree/<ref>/path/to/skill
9
+ //
10
+ // Strategy:
11
+ // 1. Parse source → { owner, repo, ref?, subPath? }
12
+ // 2. git clone --depth=1 [-b ref] <https-url> <tmp-dir>
13
+ // 3. cd into <tmp-dir>/<subPath?> and treat it as a local skill
14
+ // 4. Delegate to installFromLocal() — same manifest validation,
15
+ // same install location, same overwrite/force semantics.
16
+ //
17
+ // We deliberately use plain `git clone` (no `gh`) because public skill repos
18
+ // don't require auth and we want install to work for anonymous users too.
19
+ import { spawnSync } from 'node:child_process';
20
+ import { existsSync, mkdtempSync, rmSync } from 'node:fs';
21
+ import { tmpdir } from 'node:os';
22
+ import { join, resolve } from 'node:path';
23
+ import { installFromLocal } from './install.js';
24
+ import { writeInstallMeta } from './installMeta.js';
25
+ import { readManifest } from './manifest.js';
26
+ const DEFAULT_HUB_BASE = 'https://yome.work';
27
+ function getHubBase() {
28
+ return (process.env.YOME_HUB_BASE ?? DEFAULT_HUB_BASE).replace(/\/+$/, '');
29
+ }
30
+ async function fetchHubVersionMeta(slug, version) {
31
+ const empty = {
32
+ tarball_sha256: null,
33
+ deprecated: false,
34
+ deprecation_reason: null,
35
+ replaced_by_version: null,
36
+ };
37
+ try {
38
+ const url = `${getHubBase()}/api/hub/skills/${encodeURIComponent(slug)}?version=${encodeURIComponent(version)}`;
39
+ const r = await fetch(url, { headers: { Accept: 'application/json' } });
40
+ if (!r.ok)
41
+ return empty;
42
+ const j = (await r.json());
43
+ if (!j || j.ok !== true || !j.version)
44
+ return empty;
45
+ const sha = j.version.tarball_sha256 ?? null;
46
+ return {
47
+ tarball_sha256: sha && sha.length >= 32 ? sha : null,
48
+ deprecated: !!j.version.deprecated,
49
+ deprecation_reason: j.version.deprecation_reason ?? null,
50
+ replaced_by_version: j.version.replaced_by_version ?? null,
51
+ };
52
+ }
53
+ catch {
54
+ return empty;
55
+ }
56
+ }
57
+ const GITHUB_SHORT_RE = /^github:([^/]+)\/([^@#]+)(?:@([^#]+))?(?:#(.+))?$/i;
58
+ const GITHUB_HTTPS_RE = /^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?(?:\/(?:tree|blob)\/([^/]+)(?:\/(.+))?)?\/?$/i;
59
+ export function parseGithubSource(source) {
60
+ const trimmed = source.trim();
61
+ let owner = null;
62
+ let repo = null;
63
+ let ref;
64
+ let subPath;
65
+ const short = GITHUB_SHORT_RE.exec(trimmed);
66
+ if (short) {
67
+ [, owner, repo, ref, subPath] = short;
68
+ }
69
+ else {
70
+ const long = GITHUB_HTTPS_RE.exec(trimmed);
71
+ if (long) {
72
+ [, owner, repo, ref, subPath] = long;
73
+ }
74
+ }
75
+ if (!owner || !repo)
76
+ return null;
77
+ return {
78
+ owner,
79
+ repo,
80
+ ref: ref || undefined,
81
+ subPath: subPath ? subPath.replace(/^\/+|\/+$/g, '') : undefined,
82
+ cloneUrl: `https://github.com/${owner}/${repo}.git`,
83
+ };
84
+ }
85
+ export function isGithubSource(source) {
86
+ return /^github:/i.test(source) || /^https?:\/\/github\.com\//i.test(source);
87
+ }
88
+ function shallowClone(parsed, verbose) {
89
+ const root = mkdtempSync(join(tmpdir(), 'yome-skill-clone-'));
90
+ const cloneDir = join(root, parsed.repo);
91
+ const args = ['clone', '--depth=1'];
92
+ if (parsed.ref)
93
+ args.push('-b', parsed.ref);
94
+ args.push(parsed.cloneUrl, cloneDir);
95
+ if (verbose)
96
+ console.log(`$ git ${args.join(' ')}`);
97
+ const r = spawnSync('git', args, { encoding: 'utf-8' });
98
+ if (verbose && r.stdout)
99
+ console.log(r.stdout.trimEnd());
100
+ if (verbose && r.stderr)
101
+ console.error(r.stderr.trimEnd());
102
+ if (r.status !== 0) {
103
+ rmSync(root, { recursive: true, force: true });
104
+ const detail = r.stderr?.trim() || `git exited with status ${r.status ?? 'unknown'}`;
105
+ return { ok: false, reason: `git clone failed: ${detail}` };
106
+ }
107
+ return { ok: true, cloneDir };
108
+ }
109
+ /**
110
+ * Clone the repo into a tmp dir, then delegate to `installFromLocal`. Always
111
+ * cleans up the tmp clone, even on failure. If `expectedSha256` is provided,
112
+ * we verify the installed bytes match before declaring success.
113
+ */
114
+ export async function installFromGithub(source, opts = {}) {
115
+ const parsed = parseGithubSource(source);
116
+ if (!parsed) {
117
+ return { ok: false, reason: `not a GitHub source: ${source}` };
118
+ }
119
+ // git availability check — `git --version` should always succeed if installed.
120
+ const probe = spawnSync('git', ['--version'], { encoding: 'utf-8' });
121
+ if (probe.status !== 0) {
122
+ return { ok: false, reason: 'git is not installed or not in PATH' };
123
+ }
124
+ const cloned = shallowClone(parsed, !!opts.verbose);
125
+ if (!cloned.ok)
126
+ return cloned;
127
+ let cleanupRoot = resolve(cloned.cloneDir, '..');
128
+ try {
129
+ const skillDir = parsed.subPath ? join(cloned.cloneDir, parsed.subPath) : cloned.cloneDir;
130
+ if (!existsSync(skillDir)) {
131
+ return { ok: false, reason: `subpath "${parsed.subPath}" does not exist in ${parsed.owner}/${parsed.repo}` };
132
+ }
133
+ if (!existsSync(join(skillDir, 'yome-skill.json'))) {
134
+ return { ok: false, reason: `${parsed.owner}/${parsed.repo}${parsed.subPath ? `/${parsed.subPath}` : ''} has no yome-skill.json` };
135
+ }
136
+ // Hub lookup: fetch sha256 fingerprint AND deprecation status in
137
+ // one shot, since we're already paying the round-trip cost. Best-
138
+ // effort — hub unreachable / no record → empty meta and the install
139
+ // proceeds without verification (back-compat with offline / legacy
140
+ // versions).
141
+ const cloneManifest = readManifest(skillDir);
142
+ if (cloneManifest) {
143
+ const meta = await fetchHubVersionMeta(cloneManifest.slug, cloneManifest.version);
144
+ if (meta.deprecated && !opts.allowDeprecated) {
145
+ const replaced = meta.replaced_by_version
146
+ ? ` Use --version ${meta.replaced_by_version} instead, or pass --allow-deprecated to override.`
147
+ : ' Pass --allow-deprecated to install it anyway.';
148
+ const why = meta.deprecation_reason ? ` Reason: ${meta.deprecation_reason}.` : '';
149
+ return {
150
+ ok: false,
151
+ reason: `${cloneManifest.slug}@${cloneManifest.version} is deprecated.${why}${replaced}`,
152
+ };
153
+ }
154
+ if (meta.deprecated && opts.allowDeprecated) {
155
+ const why = meta.deprecation_reason ? ` (${meta.deprecation_reason})` : '';
156
+ console.warn(`! installing deprecated ${cloneManifest.slug}@${cloneManifest.version}${why}`);
157
+ }
158
+ if (!opts.skipVerify && !opts.expectedSha256) {
159
+ opts.expectedSha256 = meta.tarball_sha256;
160
+ }
161
+ }
162
+ const result = await installFromLocal(skillDir, opts);
163
+ if (result.ok && result.slug) {
164
+ // installFromLocal stamped the meta with `local:<tmp clone path>`; rewrite
165
+ // it to the github: shorthand so `yome skill update` knows what to refetch.
166
+ try {
167
+ writeInstallMeta(result.slug, {
168
+ source: githubSourceToShorthand(parsed),
169
+ installed_at: new Date().toISOString(),
170
+ manifest_version: result.slug ? '' : '',
171
+ });
172
+ // Keep the version field accurate by reading the manifest at dest.
173
+ const m = readManifest(result.installedAt);
174
+ if (m) {
175
+ writeInstallMeta(result.slug, {
176
+ source: githubSourceToShorthand(parsed),
177
+ installed_at: new Date().toISOString(),
178
+ manifest_version: m.version,
179
+ });
180
+ }
181
+ }
182
+ catch { /* best effort */ }
183
+ // Post-install sha256 verification. If the hub had no fingerprint
184
+ // for this version (older publish), expectedSha256 is null/undefined
185
+ // and we skip — the install proceeds. If it doesn't match, we
186
+ // tear down the install dir to leave the system in a clean state.
187
+ if (!opts.skipVerify && opts.expectedSha256 && result.installedAt) {
188
+ const { verifySkillSha256 } = await import('./integrity.js');
189
+ const v = verifySkillSha256(result.installedAt, opts.expectedSha256);
190
+ if (!v.ok) {
191
+ rmSync(result.installedAt, { recursive: true, force: true });
192
+ return {
193
+ ok: false,
194
+ reason: `sha256 mismatch — refusing install. expected ${v.expected.slice(0, 12)}…, got ${v.computed.slice(0, 12)}…`,
195
+ };
196
+ }
197
+ }
198
+ }
199
+ return result;
200
+ }
201
+ finally {
202
+ rmSync(cleanupRoot, { recursive: true, force: true });
203
+ }
204
+ }
205
+ function githubSourceToShorthand(p) {
206
+ let s = `github:${p.owner}/${p.repo}`;
207
+ if (p.ref)
208
+ s += `@${p.ref}`;
209
+ if (p.subPath)
210
+ s += `#${p.subPath}`;
211
+ return s;
212
+ }
213
+ //# sourceMappingURL=installGithub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installGithub.js","sourceRoot":"","sources":["../../src/yomeSkills/installGithub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface InstallMeta {
2
+ source: string;
3
+ installed_at: string;
4
+ manifest_version: string;
5
+ }
6
+ export declare function readInstallMeta(slugOrDir: string): InstallMeta | null;
7
+ export declare function writeInstallMeta(slugOrDir: string, meta: InstallMeta): void;
8
+ export declare function clearInstallMeta(slugOrDir: string): void;