@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
package/dist/context.js CHANGED
@@ -2,6 +2,8 @@ import { execSync } from 'child_process';
2
2
  import { readdirSync } from 'fs';
3
3
  import { join, basename } from 'path';
4
4
  import { loadAllSkills } from './skills/index.js';
5
+ import { getInstalledFast } from './yomeSkills/skillsIndex.js';
6
+ import { readManifest } from './yomeSkills/manifest.js';
5
7
  function safeExec(cmd, cwd) {
6
8
  try {
7
9
  return execSync(cmd, { cwd, timeout: 5000, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
@@ -30,15 +32,36 @@ function getFileTree(dir, depth = 2, prefix = '') {
30
32
  catch { /* ignore */ }
31
33
  return lines.filter(Boolean).join('\n');
32
34
  }
35
+ let _cwdMetaCache = null;
36
+ const CWD_META_TTL_MS = 60_000;
37
+ function getCwdMeta(cwd) {
38
+ const now = Date.now();
39
+ if (_cwdMetaCache && _cwdMetaCache.cwd === cwd && _cwdMetaCache.expiresAt > now) {
40
+ return _cwdMetaCache;
41
+ }
42
+ _cwdMetaCache = {
43
+ cwd,
44
+ expiresAt: now + CWD_META_TTL_MS,
45
+ gitBranch: safeExec('git rev-parse --abbrev-ref HEAD', cwd),
46
+ gitStatus: safeExec('git status --porcelain', cwd),
47
+ tree: getFileTree(cwd),
48
+ };
49
+ return _cwdMetaCache;
50
+ }
51
+ /** Force a re-fetch of git/tree info on next buildSystemPrompt call. */
52
+ export function invalidateCwdMeta() {
53
+ _cwdMetaCache = null;
54
+ }
33
55
  export function buildSystemPrompt() {
34
56
  const cwd = process.cwd();
35
57
  const projectName = basename(cwd);
36
58
  const now = new Date();
37
59
  const dateStr = now.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' });
38
- const gitBranch = safeExec('git rev-parse --abbrev-ref HEAD', cwd);
39
- const gitStatus = safeExec('git status --porcelain', cwd);
60
+ const meta = getCwdMeta(cwd);
61
+ const gitBranch = meta.gitBranch;
62
+ const gitStatus = meta.gitStatus;
40
63
  const isGit = gitBranch !== null;
41
- const tree = getFileTree(cwd);
64
+ const tree = meta.tree;
42
65
  let prompt = `You are Yome, an AI coding assistant running in the user's terminal.
43
66
  You help with software engineering tasks: reading code, writing code, debugging, refactoring, and running commands.
44
67
 
@@ -70,32 +93,117 @@ You help with software engineering tasks: reading code, writing code, debugging,
70
93
  - Never expose secrets or API keys.
71
94
 
72
95
  ## Available Tools
73
- You have these tools: Read, Edit, Write, Bash, Glob, Grep, LS.
96
+ You have these tools: Read, Edit, Write, Bash, Yome, AskUser, TodoWrite, Glob, Grep, LS.
74
97
  - Use Read to view file contents.
75
98
  - Use Edit to modify existing files (find & replace with old_string/new_string).
76
99
  - Use Write to create new files.
77
- - Use Bash to run shell commands.
100
+ - Use Bash for /bin/sh commands ONLY (ls, cat, git, mkdir, build/test runners, pipes…). It does NOT route to hub skills.
101
+ - Use Yome to invoke installed hub-skill commands (xl, ppt, cal, fs, rem, …) — pass the command line exactly as a human would type it (e.g. \`xl books\`, \`ppt new ~/Desktop/x.pptx\`).
102
+ - Use AskUser when requirements are ambiguous or you need the user to choose between trade-offs BEFORE doing irreversible work. Send 1–4 multiple-choice questions; do NOT include "Other" (the UI provides a custom-answer entry). Blocks until the user responds.
103
+ - Use TodoWrite proactively whenever you start a task with 3+ meaningful steps. Always send the FULL list. Keep exactly ONE item in_progress at a time. Flip status the moment you start / finish a step — don't batch updates. Each item needs \`content\` (imperative) + \`activeForm\` (present continuous) + \`status\`.
78
104
  - Use Glob to find files by pattern.
79
105
  - Use Grep to search file contents.
80
106
  - Use LS to list directory contents.
81
107
  `;
108
+ // Prompt-style skills (Claude Code-format SKILL.md). The agent injects
109
+ // their markdown bodies into the prompt at /skill-name invocation time;
110
+ // here we just advertise them so the model knows they exist.
82
111
  const skills = loadAllSkills();
83
112
  if (skills.length > 0) {
84
113
  prompt += buildSkillsSection(skills);
85
114
  }
115
+ // Hub skills (yome-skill.json packages) — these carry typed command
116
+ // contracts and capability grants. Every installed + enabled hub skill
117
+ // is exposed to the model so it can reach for the right command
118
+ // (e.g. ppt.slide.add) instead of trying to roll one from shell.
119
+ const hubSkills = getInstalledFast().filter((s) => s.status === 'enabled');
120
+ if (hubSkills.length > 0) {
121
+ prompt += buildHubSkillsSection(hubSkills);
122
+ }
86
123
  return prompt;
87
124
  }
125
+ /**
126
+ * Prompt skills (Claude Code SKILL.md format) get the same 3-row L1
127
+ * shape as hub skills, just with different field sources:
128
+ * when ← frontmatter `when_to_use` (or `description` as fallback)
129
+ * effects ← always "loads markdown body into context (prompt-only)"
130
+ * unless the SKILL.md explicitly grants `allowed-tools`
131
+ * start ← `/skill-name [argument-hint]`
132
+ *
133
+ * Same visual shape means the model doesn't have to context-switch
134
+ * between two different docs styles when scanning available skills.
135
+ */
88
136
  function buildSkillsSection(skills) {
89
- let section = `\n## Available Skills\nThe user can invoke skills with \`/skill-name [args]\`. You can also invoke them when appropriate.\n\n`;
137
+ let section = `\n## Available Skills (prompt)\nUser invokes with \`/skill-name [args]\`; you can invoke them too when appropriate.\n\n`;
90
138
  for (const skill of skills) {
91
- section += `### /${skill.name}\n`;
92
- section += `${skill.description}\n`;
93
- if (skill.whenToUse)
94
- section += `When to use: ${skill.whenToUse}\n`;
95
- if (skill.argumentHint)
96
- section += `Usage: /${skill.name} ${skill.argumentHint}\n`;
97
- section += `Source: ${skill.source}\n\n`;
139
+ const head = `/${skill.name}`;
140
+ const pad = ' '.repeat(head.length);
141
+ const when = skill.whenToUse ?? skill.description;
142
+ const entry = skill.argumentHint ? `/${skill.name} ${skill.argumentHint}` : `/${skill.name}`;
143
+ const effects = (skill.allowedTools && skill.allowedTools.length > 0)
144
+ ? `runs tools: ${skill.allowedTools.join(', ')}`
145
+ : `prompt-only (no tools)`;
146
+ section += `${head} | when: ${when}\n`;
147
+ section += `${pad} | effects: ${effects}\n`;
148
+ section += `${pad} | start: ${entry}\n`;
98
149
  }
99
150
  return section;
100
151
  }
152
+ /**
153
+ * Hub skills are surfaced to the LLM in three layers:
154
+ * L1 — this section: ONE skill = THREE short rows answering the only
155
+ * questions the model actually has when picking a tool —
156
+ * when (trigger condition)
157
+ * effects (truthful side effects)
158
+ * start (first command to discover the rest)
159
+ * Authored as `l1: { when, entry, effects }` in yome-skill.json.
160
+ * L2 — `<domain> --help` (kernel reads SIGNATURE.md, fallback auto-gen).
161
+ * L3 — `<domain> --doc [name]` for cookbook templates / themes.
162
+ *
163
+ * The model is told once, in the footer, that --help / --doc / batch exist
164
+ * for every installed skill — so individual L1 blocks stay focused on
165
+ * the trigger / effects / entry triad.
166
+ */
167
+ function buildHubSkillsSection(entries) {
168
+ let section = `\n## Installed Hub Skills\nUse the **Yome** tool: \`<domain> <action> [args]\` (no \`yome\` prefix, no SkillCall, NOT the Bash tool).\nThe Bash tool is for /bin/sh ops only and will NOT route to skills.\n\n`;
169
+ for (const e of entries) {
170
+ const manifest = readManifest(e.installedAt);
171
+ section += renderL1Block(e.domain, manifest, e.description) + '\n';
172
+ }
173
+ section += `\nFor any installed skill:
174
+ \`<domain> --help\` one-screen signature (actions + args)
175
+ \`<domain> --doc\` list cookbook templates / themes
176
+ \`<domain> --doc <name>\` read one template
177
+ \`<domain> batch <<EOF…EOF\` run several sub-commands in one call (--keep-going, --merge)
178
+ `;
179
+ return section;
180
+ }
181
+ /**
182
+ * Render the 3-row pipe-aligned L1 block for one skill. Falls back to
183
+ * legacy `prompt_line`, then to `<domain> — <description>` so older
184
+ * yome-skill.json files keep producing *something* useful.
185
+ */
186
+ function renderL1Block(domain, manifest, fallbackDesc) {
187
+ const l1 = manifest?.l1;
188
+ if (l1 && (l1.when || l1.entry || l1.effects)) {
189
+ // Right-pad the domain column so the pipes line up vertically — easier
190
+ // for the model to scan when several skills are listed.
191
+ const head = domain;
192
+ const pad = ' '.repeat(head.length);
193
+ const lines = [];
194
+ if (l1.when)
195
+ lines.push(`${head} | when: ${l1.when}`);
196
+ if (l1.effects)
197
+ lines.push(`${pad} | effects: ${l1.effects}`);
198
+ if (l1.entry)
199
+ lines.push(`${pad} | start: ${l1.entry}`);
200
+ return lines.join('\n');
201
+ }
202
+ // Legacy single-line fallback — keeps backward compat with skills that
203
+ // used `prompt_line` before the structured l1 schema landed.
204
+ if (manifest?.prompt_line) {
205
+ return `- ${manifest.prompt_line}`;
206
+ }
207
+ return `- ${domain} — ${fallbackDesc ?? '(no description provided)'}`;
208
+ }
101
209
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAY,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,EAAE;IACtD,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,CACxF,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,QAAQ,QAAQ,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAErH,MAAM,SAAS,GAAG,QAAQ,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,QAAQ,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAE9B,IAAI,MAAM,GAAG;;;;UAIL,OAAO;uBACM,GAAG;aACb,WAAW;QAChB,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI;UAC9B,OAAO,CAAC,OAAO;CACxB,CAAC;IAEA,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,iBAAiB,SAAS,IAAI,CAAC;QACzC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,IAAI,kBAAkB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,mCAAmC,IAAI,YAAY,CAAC;IAChE,CAAC;IAED,MAAM,IAAI;;;;;;;;;;;;;;;;;;;CAmBX,CAAC;IAEA,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAe;IACzC,IAAI,OAAO,GAAG,+HAA+H,CAAC;IAC9I,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,IAAI,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC;QAClC,OAAO,IAAI,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC;QACpC,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,IAAI,gBAAgB,KAAK,CAAC,SAAS,IAAI,CAAC;QACpE,IAAI,KAAK,CAAC,YAAY;YAAE,OAAO,IAAI,WAAW,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC;QACnF,OAAO,IAAI,WAAW,KAAK,CAAC,MAAM,MAAM,CAAC;IAC3C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface CalendarAccessResult {
2
+ ok: boolean;
3
+ status: 'granted' | 'denied' | 'restricted' | 'not-determined' | 'unknown' | 'no-helper';
4
+ message: string;
5
+ /** Hint surfaced from the Swift helper (e.g. "open System Settings → ..."). */
6
+ fix?: string;
7
+ }
8
+ /** Best-effort path to bin/yome-calwatch. */
9
+ export declare function resolveCalwatchPath(): string;
10
+ export declare function checkCalendarAccess(): CalendarAccessResult;
@@ -0,0 +1,68 @@
1
+ // Pre-flight EventKit permission probe for `yome cron add --on calendar:*`.
2
+ //
3
+ // We invoke the same Swift helper the daemon uses (`yome-calwatch
4
+ // --check-access`) — it's the only reliable way to learn the current
5
+ // state because TCC is per-binary, not per-user.
6
+ //
7
+ // Exit codes (mirrors the helper):
8
+ // 0 granted
9
+ // 2 denied / restricted (with a JSON line describing the fix)
10
+ // 3 unknown
11
+ // non-existent binary → returns { ok: false, message: '...' }
12
+ import { spawnSync } from 'child_process';
13
+ import { existsSync } from 'fs';
14
+ import { dirname, resolve } from 'path';
15
+ import { fileURLToPath } from 'url';
16
+ /** Best-effort path to bin/yome-calwatch. */
17
+ export function resolveCalwatchPath() {
18
+ const here = dirname(fileURLToPath(import.meta.url));
19
+ // dist/daemon/calendarPermission.js → ../../bin/yome-calwatch
20
+ // src/daemon/calendarPermission.ts → ../../bin/yome-calwatch
21
+ return resolve(here, '..', '..', 'bin', 'yome-calwatch');
22
+ }
23
+ export function checkCalendarAccess() {
24
+ const bin = resolveCalwatchPath();
25
+ if (!existsSync(bin)) {
26
+ return {
27
+ ok: false,
28
+ status: 'no-helper',
29
+ message: 'native helper yome-calwatch is missing. ' +
30
+ 'On macOS: cd cli && npm run build:native. ' +
31
+ 'On Linux/Windows: calendar triggers are macOS-only.',
32
+ };
33
+ }
34
+ const r = spawnSync(bin, ['--check-access'], { encoding: 'utf-8', timeout: 30_000 });
35
+ // Helper writes one JSON line to stdout regardless of exit code.
36
+ const last = (r.stdout ?? '').split('\n').reverse().find((l) => l.trim().startsWith('{'));
37
+ let parsed = {};
38
+ if (last) {
39
+ try {
40
+ parsed = JSON.parse(last);
41
+ }
42
+ catch { /* noop */ }
43
+ }
44
+ const status = String(parsed.status ?? '');
45
+ const fix = typeof parsed.fix === 'string' ? parsed.fix : undefined;
46
+ if (r.status === 0 && status === 'granted') {
47
+ return { ok: true, status: 'granted', message: 'calendar access granted' };
48
+ }
49
+ if (status === 'denied' || status === 'restricted') {
50
+ return {
51
+ ok: false,
52
+ status: status,
53
+ message: `calendar access ${status}`,
54
+ fix,
55
+ };
56
+ }
57
+ if (status === 'not-determined') {
58
+ return { ok: false, status: 'not-determined', message: 'calendar access not yet determined', fix };
59
+ }
60
+ return {
61
+ ok: false,
62
+ status: 'unknown',
63
+ message: `unable to determine calendar access (helper exit=${r.status}). ` +
64
+ `stdout=${(r.stdout ?? '').slice(0, 200)} stderr=${(r.stderr ?? '').slice(0, 200)}`,
65
+ fix,
66
+ };
67
+ }
68
+ //# sourceMappingURL=calendarPermission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendarPermission.js","sourceRoot":"","sources":["../../src/daemon/calendarPermission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface CronCliFlags {
2
+ at?: string;
3
+ human?: string;
4
+ once?: string;
5
+ on?: string;
6
+ path?: string;
7
+ within?: string;
8
+ titleRegex?: string;
9
+ calendar?: string;
10
+ tz?: string;
11
+ cwd?: string;
12
+ allow?: string | string[];
13
+ deny?: string | string[];
14
+ maxMs?: string;
15
+ env?: string | string[];
16
+ follow?: boolean;
17
+ json?: boolean;
18
+ }
19
+ export declare function runCronSubcommand(args: string[], flags: CronCliFlags): Promise<number>;