@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,76 @@
1
+ // `.install-meta.json` — small per-skill sidecar capturing how the skill
2
+ // was installed. Used by `yome skill update` (to know what to re-pull)
3
+ // and `yome skill list` (to render the source column).
4
+ //
5
+ // Schema (intentionally tiny so it's easy to bump):
6
+ // {
7
+ // "source": "github:owner/repo[@ref][#subpath]"
8
+ // | "local:/abs/path"
9
+ // | "dev-link:/abs/path"
10
+ // | "hub:@owner/name"
11
+ // | "url:<https url>",
12
+ // "installed_at": "<ISO-8601>",
13
+ // "manifest_version": "<from yome-skill.json at install time>"
14
+ // }
15
+ //
16
+ // Missing file = legacy install (pre-meta); `update` treats it as
17
+ // "source unknown — please reinstall manually".
18
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync, } from 'fs';
19
+ import { join, dirname } from 'path';
20
+ import { installPathForSlug } from './paths.js';
21
+ const META_FILENAME = '.install-meta.json';
22
+ function metaPath(slugOrDir) {
23
+ // Accept either a slug like @yome/ppt OR an absolute install dir.
24
+ if (slugOrDir.startsWith('/') || slugOrDir.startsWith('.')) {
25
+ return join(slugOrDir, META_FILENAME);
26
+ }
27
+ const dir = installPathForSlug(slugOrDir);
28
+ if (!dir)
29
+ throw new Error(`invalid slug: ${slugOrDir}`);
30
+ return join(dir, META_FILENAME);
31
+ }
32
+ export function readInstallMeta(slugOrDir) {
33
+ let f;
34
+ try {
35
+ f = metaPath(slugOrDir);
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ if (!existsSync(f))
41
+ return null;
42
+ try {
43
+ const obj = JSON.parse(readFileSync(f, 'utf-8'));
44
+ if (typeof obj?.source !== 'string')
45
+ return null;
46
+ return {
47
+ source: String(obj.source),
48
+ installed_at: String(obj.installed_at ?? ''),
49
+ manifest_version: String(obj.manifest_version ?? ''),
50
+ };
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ export function writeInstallMeta(slugOrDir, meta) {
57
+ const f = metaPath(slugOrDir);
58
+ mkdirSync(dirname(f), { recursive: true });
59
+ writeFileSync(f, JSON.stringify(meta, null, 2) + '\n');
60
+ }
61
+ export function clearInstallMeta(slugOrDir) {
62
+ let f;
63
+ try {
64
+ f = metaPath(slugOrDir);
65
+ }
66
+ catch {
67
+ return;
68
+ }
69
+ if (existsSync(f)) {
70
+ try {
71
+ unlinkSync(f);
72
+ }
73
+ catch { /* ignore */ }
74
+ }
75
+ }
76
+ //# sourceMappingURL=installMeta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installMeta.js","sourceRoot":"","sources":["../../src/yomeSkills/installMeta.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,uEAAuE;AACvE,uDAAuD;AACvD,EAAE;AACF,oDAAoD;AACpD,MAAM;AACN,oDAAoD;AACpD,kCAAkC;AAClC,qCAAqC;AACrC,kCAAkC;AAClC,mCAAmC;AACnC,oCAAoC;AACpC,mEAAmE;AACnE,MAAM;AACN,EAAE;AACF,kEAAkE;AAClE,gDAAgD;AAEhD,OAAO,EACL,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,GAC/D,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQhD,MAAM,aAAa,GAAG,oBAAoB,CAAC;AAE3C,SAAS,QAAQ,CAAC,SAAiB;IACjC,kEAAkE;IAClE,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,GAAG,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,CAAS,CAAC;IACd,IAAI,CAAC;QAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,IAAI,OAAO,GAAG,EAAE,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACjD,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;YAC1B,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;YAC5C,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;SACrD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,IAAiB;IACnE,MAAM,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9B,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,IAAI,CAAS,CAAC;IACd,IAAI,CAAC;QAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO;IAAC,CAAC;IAClD,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC;YAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Files & directories that should never contribute to a skill hash.
3
+ * - VCS plumbing (.git/) is environmental, not skill content.
4
+ * - .install-meta.json / .yome-disabled / allowed-capabilities.json are
5
+ * per-install state files we write *after* the bytes land — including
6
+ * them would create chicken-and-egg.
7
+ * - Build artefacts (node_modules, dist, .DS_Store) are noise.
8
+ */
9
+ export declare const DEFAULT_IGNORES: ReadonlySet<string>;
10
+ export interface ComputeOptions {
11
+ /** Override the default ignore set entirely. */
12
+ ignores?: ReadonlySet<string>;
13
+ }
14
+ /**
15
+ * Compute the canonical sha256 of a skill directory.
16
+ * Returns the hex digest (64 chars).
17
+ */
18
+ export declare function computeSkillSha256(skillDir: string, opts?: ComputeOptions): string;
19
+ export interface VerifyResult {
20
+ ok: boolean;
21
+ /** Always present so callers can log. */
22
+ computed: string;
23
+ expected: string;
24
+ }
25
+ /** Recompute and compare against an expected hex digest. */
26
+ export declare function verifySkillSha256(skillDir: string, expected: string, opts?: ComputeOptions): VerifyResult;
@@ -0,0 +1,107 @@
1
+ // integrity.ts — content-addressed hash of an installed/source skill.
2
+ //
3
+ // Threat model: a user runs `yome skill install github:Whopus/foo`. Between
4
+ // `git clone` and the bytes landing in ~/.yome/skills the network /
5
+ // CDN / GitHub mirror could substitute different content. We give the
6
+ // hub a sha256 fingerprint at publish time; install verifies it matches.
7
+ //
8
+ // Algorithm (deliberately simple, deterministic, and language-agnostic):
9
+ //
10
+ // 1. Walk the skill directory recursively, collect every file path
11
+ // relative to the skill root, except those in DEFAULT_IGNORES.
12
+ // 2. Sort paths byte-wise (NFC, no normalisation — "what's on disk").
13
+ // 3. Build a stream of records:
14
+ // <relative path> NUL <byte length, ASCII> NUL <file bytes> NUL
15
+ // 4. Return the SHA-256 hex digest of the concatenated stream.
16
+ //
17
+ // Properties:
18
+ // - Same directory tree → same digest, regardless of OS readdir order.
19
+ // - Adding/removing/renaming any file changes the digest.
20
+ // - Filesystem perms / mtime do NOT affect the digest (intentionally —
21
+ // `git clone` resets times, and installing copies don't preserve them).
22
+ import { createHash } from 'node:crypto';
23
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
24
+ import { join, relative, sep } from 'node:path';
25
+ /**
26
+ * Files & directories that should never contribute to a skill hash.
27
+ * - VCS plumbing (.git/) is environmental, not skill content.
28
+ * - .install-meta.json / .yome-disabled / allowed-capabilities.json are
29
+ * per-install state files we write *after* the bytes land — including
30
+ * them would create chicken-and-egg.
31
+ * - Build artefacts (node_modules, dist, .DS_Store) are noise.
32
+ */
33
+ export const DEFAULT_IGNORES = new Set([
34
+ '.git',
35
+ 'node_modules',
36
+ 'dist',
37
+ '.next',
38
+ '.turbo',
39
+ 'coverage',
40
+ '.DS_Store',
41
+ '.install-meta.json',
42
+ '.yome-disabled',
43
+ 'allowed-capabilities.json',
44
+ ]);
45
+ /**
46
+ * Walk dir → return relative paths (slash-separated for portability)
47
+ * sorted byte-wise.
48
+ */
49
+ function listFiles(root, ignores) {
50
+ const out = [];
51
+ function walk(abs) {
52
+ let entries;
53
+ try {
54
+ entries = readdirSync(abs);
55
+ }
56
+ catch {
57
+ return;
58
+ }
59
+ for (const e of entries) {
60
+ if (ignores.has(e))
61
+ continue;
62
+ const p = join(abs, e);
63
+ let st;
64
+ try {
65
+ st = statSync(p);
66
+ }
67
+ catch {
68
+ continue;
69
+ }
70
+ if (st.isDirectory())
71
+ walk(p);
72
+ else if (st.isFile()) {
73
+ // Normalise to forward-slash so digests are stable cross-platform.
74
+ out.push(relative(root, p).split(sep).join('/'));
75
+ }
76
+ }
77
+ }
78
+ walk(root);
79
+ out.sort();
80
+ return out;
81
+ }
82
+ /**
83
+ * Compute the canonical sha256 of a skill directory.
84
+ * Returns the hex digest (64 chars).
85
+ */
86
+ export function computeSkillSha256(skillDir, opts = {}) {
87
+ const ignores = opts.ignores ?? DEFAULT_IGNORES;
88
+ const files = listFiles(skillDir, ignores);
89
+ const h = createHash('sha256');
90
+ const NUL = Buffer.from([0]);
91
+ for (const rel of files) {
92
+ const bytes = readFileSync(join(skillDir, rel));
93
+ h.update(rel, 'utf-8');
94
+ h.update(NUL);
95
+ h.update(String(bytes.byteLength), 'utf-8');
96
+ h.update(NUL);
97
+ h.update(bytes);
98
+ h.update(NUL);
99
+ }
100
+ return h.digest('hex');
101
+ }
102
+ /** Recompute and compare against an expected hex digest. */
103
+ export function verifySkillSha256(skillDir, expected, opts = {}) {
104
+ const computed = computeSkillSha256(skillDir, opts);
105
+ return { ok: computed.toLowerCase() === expected.toLowerCase(), computed, expected };
106
+ }
107
+ //# sourceMappingURL=integrity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrity.js","sourceRoot":"","sources":["../../src/yomeSkills/integrity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type SkillIndexEntry } from './skillsIndex.js';
2
+ export interface InvokeRequest {
3
+ /** Either '@owner/name' (preferred) or just a domain like 'ppt'. */
4
+ slugOrDomain: string;
5
+ /** Action name, e.g. 'new', 'slide.add'. */
6
+ action: string;
7
+ positionals?: string[];
8
+ flags?: Record<string, string | boolean | number | undefined>;
9
+ }
10
+ export interface InvokeResult {
11
+ ok: boolean;
12
+ stdout: string;
13
+ stderr: string;
14
+ exitCode: number;
15
+ /** Diagnostic — which skill we resolved to. */
16
+ resolvedSlug?: string;
17
+ }
18
+ /**
19
+ * Find the installed skill record for either `@owner/name` or `<domain>`.
20
+ * Domain lookup picks the first installed skill that owns that domain;
21
+ * if you have multiple, prefer the explicit slug.
22
+ */
23
+ export declare function resolveSkill(slugOrDomain: string): SkillIndexEntry | null;
24
+ /**
25
+ * Run an action. Honors capability grants — anything the manifest
26
+ * declares as required (and that hasn't been allowed by the user) blocks
27
+ * the call before we touch osascript.
28
+ */
29
+ export declare function invokeSkill(req: InvokeRequest): Promise<InvokeResult>;
@@ -0,0 +1,135 @@
1
+ // cli/src/yomeSkills/invoke.ts
2
+ //
3
+ // Top-level entry point for "execute an action on an installed hub
4
+ // skill". Handles slug/domain resolution, capability enforcement, and
5
+ // platform/backend selection. Both the `SkillCall` agent tool and the
6
+ // `yome <domain> <action>` CLI route through this.
7
+ import { homedir } from 'os';
8
+ import { getInstalledFast } from './skillsIndex.js';
9
+ import { readManifest } from './manifest.js';
10
+ import { isCapabilityAllowed } from './capabilities.js';
11
+ import { dispatchMacos, loadMacosBackend, } from '../skills/runner/dispatcher.js';
12
+ import { dispatchNode, hasNodeBackend } from '../skills/runner/nodeBackend.js';
13
+ /** Expand ~ in a path arg the same way a shell would. */
14
+ function expandTilde(v) {
15
+ if (typeof v !== 'string')
16
+ return v;
17
+ if (v === '~')
18
+ return homedir();
19
+ if (v.startsWith('~/'))
20
+ return homedir() + v.slice(1);
21
+ return v;
22
+ }
23
+ /**
24
+ * Find the installed skill record for either `@owner/name` or `<domain>`.
25
+ * Domain lookup picks the first installed skill that owns that domain;
26
+ * if you have multiple, prefer the explicit slug.
27
+ */
28
+ export function resolveSkill(slugOrDomain) {
29
+ const installed = getInstalledFast();
30
+ if (slugOrDomain.startsWith('@')) {
31
+ return installed.find((s) => s.slug === slugOrDomain) ?? null;
32
+ }
33
+ return installed.find((s) => s.domain === slugOrDomain) ?? null;
34
+ }
35
+ /**
36
+ * Run an action. Honors capability grants — anything the manifest
37
+ * declares as required (and that hasn't been allowed by the user) blocks
38
+ * the call before we touch osascript.
39
+ */
40
+ export async function invokeSkill(req) {
41
+ const entry = resolveSkill(req.slugOrDomain);
42
+ if (!entry) {
43
+ return {
44
+ ok: false, stdout: '', stderr: `skill not installed: ${req.slugOrDomain}`,
45
+ exitCode: 127,
46
+ };
47
+ }
48
+ if (entry.status !== 'enabled') {
49
+ return {
50
+ ok: false, stdout: '', stderr: `skill ${entry.slug} is disabled — enable it via /skills`,
51
+ exitCode: 1, resolvedSlug: entry.slug,
52
+ };
53
+ }
54
+ const manifest = readManifest(entry.installedAt);
55
+ if (!manifest) {
56
+ return {
57
+ ok: false, stdout: '', stderr: `failed to read manifest at ${entry.installedAt}`,
58
+ exitCode: 1, resolvedSlug: entry.slug,
59
+ };
60
+ }
61
+ // Enforce declared OS-level capabilities (security model).
62
+ // Note: manifest.capabilities holds *semantic* labels (calendar:read);
63
+ // system_capabilities holds the OS-level set we actually gate on.
64
+ const declared = (manifest.system_capabilities ?? []);
65
+ const missing = [];
66
+ for (const cap of declared) {
67
+ if (!isCapabilityAllowed(entry.slug, cap))
68
+ missing.push(cap);
69
+ }
70
+ if (missing.length > 0) {
71
+ return {
72
+ ok: false, stdout: '',
73
+ stderr: `capability not granted: ${missing.join(', ')}\n` +
74
+ `Run: yome skill perms ${entry.slug} --grant ${missing[0]}`,
75
+ exitCode: 13, resolvedSlug: entry.slug,
76
+ };
77
+ }
78
+ // Pick the right backend for this host.
79
+ //
80
+ // The CLI is a Node process — NOT the macOS Yome.app host. So
81
+ // `delivery.macos.backend === "bundled"` (= Swift code that lives
82
+ // inside Yome.app) is unreachable from here.
83
+ //
84
+ // Backend resolution order (first viable wins):
85
+ // 1. OTA Node backend (backends/node/) — works on every platform
86
+ // and is the only path inside the daemon, headless, etc.
87
+ // 2. OTA macOS AppleScript backend (backends/macos/manifest.json) —
88
+ // darwin-only; renders templates into osascript invocations.
89
+ //
90
+ // On non-darwin hosts the AppleScript option vanishes; we return a
91
+ // clear diagnostic if the skill has nothing else to fall back to.
92
+ const positionals = (req.positionals ?? []).map((p) => typeof p === 'string' ? expandTilde(p) : p);
93
+ const flags = {};
94
+ for (const [k, v] of Object.entries(req.flags ?? {})) {
95
+ flags[k] = expandTilde(v);
96
+ }
97
+ const call = { positionals, flags };
98
+ // 1. Node backend — preferred when present (CLI is Node).
99
+ if (hasNodeBackend(entry.installedAt)) {
100
+ const r = await dispatchNode(entry.installedAt, req.action, call);
101
+ return { ...r, resolvedSlug: entry.slug };
102
+ }
103
+ // 2. macOS AppleScript backend.
104
+ const platform = process.platform;
105
+ if (platform !== 'darwin') {
106
+ return {
107
+ ok: false, stdout: '',
108
+ stderr: `no node backend for ${entry.slug}, and host is ${platform} (macOS AppleScript ` +
109
+ `fallback unavailable). Ask the skill author to ship a backends/node/ OTA backend.`,
110
+ exitCode: 1, resolvedSlug: entry.slug,
111
+ };
112
+ }
113
+ if (!loadMacosBackend(entry.installedAt)) {
114
+ const delivery = (manifest.delivery ?? {});
115
+ const macosKind = delivery.macos?.backend;
116
+ const hints = [];
117
+ if (macosKind === 'bundled') {
118
+ hints.push('macOS implementation is "bundled" — runs inside Yome.app (Swift), ' +
119
+ 'not from the CLI. Use the macOS app, or have the skill author publish ' +
120
+ 'a backends/macos/ OTA AppleScript backend or a backends/node/ Node backend.');
121
+ }
122
+ else {
123
+ hints.push('skill is missing backends/macos/manifest.json AND backends/node/ — no usable backend for the CLI.');
124
+ }
125
+ return {
126
+ ok: false, stdout: '',
127
+ stderr: `no backend the CLI can invoke for ${entry.slug}.\n` +
128
+ hints.map((h) => ' - ' + h).join('\n'),
129
+ exitCode: 2, resolvedSlug: entry.slug,
130
+ };
131
+ }
132
+ const r = dispatchMacos(entry.installedAt, req.action, call);
133
+ return { ...r, resolvedSlug: entry.slug };
134
+ }
135
+ //# sourceMappingURL=invoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/yomeSkills/invoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type SkillManifest } from './manifest.js';
2
+ export interface InstalledEntry {
3
+ slug: string;
4
+ domain: string;
5
+ version: string;
6
+ name?: string;
7
+ description?: string;
8
+ installedAt: string;
9
+ manifest: SkillManifest;
10
+ }
11
+ export declare function listInstalled(): InstalledEntry[];
@@ -0,0 +1,55 @@
1
+ // `yome skill list` — enumerate installed yome-skill.json skills under
2
+ // ~/.yome/skills/<owner>/<name>/. Skills using the legacy SKILL.md
3
+ // markdown format are silently ignored (different system, see existing
4
+ // cli/src/skills/loader.ts).
5
+ import { existsSync, readdirSync, statSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { readManifest } from './manifest.js';
8
+ import { getYomeSkillsRoot } from './paths.js';
9
+ function listChildDirs(dir) {
10
+ if (!existsSync(dir))
11
+ return [];
12
+ try {
13
+ return readdirSync(dir).filter((n) => {
14
+ // Skip rollback snapshots — install.ts moves the previous version
15
+ // sideways to <slug>.previous before overwriting. They have a valid
16
+ // yome-skill.json so they'd otherwise look like a duplicate install.
17
+ if (n.endsWith('.previous'))
18
+ return false;
19
+ try {
20
+ return statSync(join(dir, n)).isDirectory();
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ });
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ }
31
+ export function listInstalled() {
32
+ const root = getYomeSkillsRoot();
33
+ const out = [];
34
+ for (const owner of listChildDirs(root)) {
35
+ const ownerDir = join(root, owner);
36
+ for (const name of listChildDirs(ownerDir)) {
37
+ const skillDir = join(ownerDir, name);
38
+ const manifest = readManifest(skillDir);
39
+ if (!manifest)
40
+ continue;
41
+ out.push({
42
+ slug: manifest.slug,
43
+ domain: manifest.domain,
44
+ version: manifest.version,
45
+ name: manifest.name,
46
+ description: manifest.description,
47
+ installedAt: skillDir,
48
+ manifest,
49
+ });
50
+ }
51
+ }
52
+ out.sort((a, b) => a.slug.localeCompare(b.slug));
53
+ return out;
54
+ }
55
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/yomeSkills/list.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,mEAAmE;AACnE,uEAAuE;AACvE,6BAA6B;AAE7B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAsB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAY/C,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACnC,kEAAkE;YAClE,oEAAoE;YACpE,qEAAqE;YACrE,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC1C,IAAI,CAAC;gBAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,KAAK,CAAC;YAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,MAAM,GAAG,GAAqB,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,WAAW,EAAE,QAAQ;gBACrB,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { type YomeAuthState } from './auth.js';
2
+ export declare function getClientId(): string;
3
+ export declare function getHubBase(): string;
4
+ interface DeviceCodeResp {
5
+ device_code: string;
6
+ user_code: string;
7
+ verification_uri: string;
8
+ expires_in: number;
9
+ interval: number;
10
+ }
11
+ export type Fetcher = (url: string, init?: RequestInit) => Promise<{
12
+ ok: boolean;
13
+ status: number;
14
+ json(): Promise<unknown>;
15
+ text(): Promise<string>;
16
+ }>;
17
+ export interface LoginOptions {
18
+ clientId?: string;
19
+ scopes?: string;
20
+ /** Override polling for tests (default = response.interval seconds). */
21
+ pollIntervalMs?: number;
22
+ /** Hard ceiling so test runs don't hang forever (default 600_000). */
23
+ timeoutMs?: number;
24
+ /** Test seam. */
25
+ fetcher?: Fetcher;
26
+ /** Hub base URL override (default: env YOME_HUB_BASE or https://yome.work). */
27
+ hubBase?: string;
28
+ /** Test seam — called with the verification URI; default = console.log. */
29
+ onPrompt?: (info: DeviceCodeResp) => void;
30
+ /** Test seam — sleep override. Default uses setTimeout. */
31
+ sleep?: (ms: number) => Promise<void>;
32
+ }
33
+ export interface LoginResult {
34
+ ok: boolean;
35
+ state?: YomeAuthState;
36
+ reason?: string;
37
+ /** Distinguishable error code so the CLI can give a friendly message. */
38
+ code?: 'no_client_id' | 'github_failed' | 'user_denied' | 'expired' | 'timeout' | 'exchange_failed' | 'yome_user_not_found' | 'network';
39
+ }
40
+ export declare function performLogin(opts?: LoginOptions): Promise<LoginResult>;
41
+ export {};