@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,177 @@
1
+ // cli/src/threadCli.ts — `yome thread <subcommand>` dispatcher.
2
+ //
3
+ // Subcommands:
4
+ // yome thread list
5
+ // yome thread share <session-id> --skill=<slug> [--out=<dir>] [--no-redact]
6
+ // [--submit] [--case-id=<id>] [--dry-run]
7
+ // yome thread submit <bundle-dir> --skill=<slug>
8
+ // [--case-id=<id>] [--dry-run] [--verbose]
9
+ import { homedir } from 'node:os';
10
+ import { join, resolve } from 'node:path';
11
+ import { buildShareBundle } from './threadShare.js';
12
+ import { submitBundle } from './threadSubmit.js';
13
+ import { listSessions } from './sessions.js';
14
+ export async function runThreadSubcommand(args, flags) {
15
+ const sub = args[0];
16
+ switch (sub) {
17
+ case 'share':
18
+ return doShare(args.slice(1), flags);
19
+ case 'submit':
20
+ return doSubmit(args.slice(1), flags);
21
+ case 'list':
22
+ case 'ls':
23
+ return doList();
24
+ case undefined:
25
+ case 'help':
26
+ case '--help':
27
+ printThreadHelp();
28
+ return 0;
29
+ default:
30
+ console.error(`Unknown subcommand: yome thread ${sub}`);
31
+ printThreadHelp();
32
+ return 2;
33
+ }
34
+ }
35
+ function doShare(args, flags) {
36
+ const sessionId = args[0];
37
+ if (!sessionId) {
38
+ console.error('Usage: yome thread share <session-id> --skill=<slug> [--out=<dir>] [--no-redact]');
39
+ return 2;
40
+ }
41
+ if (!flags.skill) {
42
+ console.error('--skill=<slug> is required (e.g. --skill=@yome/ppt)');
43
+ return 2;
44
+ }
45
+ const outDir = flags.out
46
+ ? resolve(flags.out)
47
+ : join(homedir(), '.yome', 'shares', `${sessionId}-${Date.now()}`);
48
+ const result = buildShareBundle({
49
+ sessionId,
50
+ skillSlug: flags.skill,
51
+ outDir,
52
+ rules: flags.noRedact ? [] : undefined,
53
+ });
54
+ if (!result.ok) {
55
+ console.error(`✗ share failed: ${result.reason}`);
56
+ return 1;
57
+ }
58
+ console.log(`✓ wrote bundle → ${result.outDir}`);
59
+ console.log(` messages: ${result.messageCount} tool calls: ${result.toolCallCount}`);
60
+ if (result.hits.length === 0) {
61
+ console.log(' redaction: no hits');
62
+ }
63
+ else {
64
+ console.log(' redaction:');
65
+ for (const h of result.hits) {
66
+ const samples = h.samples.length === 0 ? '' : ` e.g. ${h.samples.map(s => JSON.stringify(s)).join(', ')}`;
67
+ console.log(` ${h.rule.padEnd(20)} ×${h.count}${samples}`);
68
+ }
69
+ }
70
+ console.log('');
71
+ if (flags.submit) {
72
+ console.log('Submitting bundle as a PR …');
73
+ const submit = submitBundle({
74
+ bundleDir: result.outDir,
75
+ skillSlug: flags.skill,
76
+ caseId: flags.caseId,
77
+ dryRun: !!flags.dryRun,
78
+ verbose: !!flags.verbose,
79
+ });
80
+ if (!submit.ok) {
81
+ console.error(`✗ submit failed: ${submit.reason}`);
82
+ if (submit.cloneDir)
83
+ console.error(` clone left at: ${submit.cloneDir}`);
84
+ return 1;
85
+ }
86
+ if (submit.prUrl) {
87
+ console.log(`✓ PR opened: ${submit.prUrl}`);
88
+ }
89
+ else {
90
+ console.log(`✓ dry-run prepared in: ${submit.cloneDir}`);
91
+ console.log(` branch: ${submit.branch} (not pushed)`);
92
+ }
93
+ return 0;
94
+ }
95
+ console.log('Next: review files in the bundle, fill in fixtures.json,');
96
+ console.log(`then run: yome thread submit ${result.outDir} --skill=${flags.skill}`);
97
+ return 0;
98
+ }
99
+ function doSubmit(args, flags) {
100
+ const bundleDir = args[0];
101
+ if (!bundleDir) {
102
+ console.error('Usage: yome thread submit <bundle-dir> --skill=<slug> [--case-id=<id>] [--dry-run] [--verbose]');
103
+ return 2;
104
+ }
105
+ if (!flags.skill) {
106
+ console.error('--skill=<slug> is required (e.g. --skill=@yome/ppt)');
107
+ return 2;
108
+ }
109
+ const result = submitBundle({
110
+ bundleDir: resolve(bundleDir),
111
+ skillSlug: flags.skill,
112
+ caseId: flags.caseId,
113
+ dryRun: !!flags.dryRun,
114
+ verbose: !!flags.verbose,
115
+ });
116
+ if (!result.ok) {
117
+ console.error(`✗ submit failed: ${result.reason}`);
118
+ if (result.cloneDir)
119
+ console.error(` clone left at: ${result.cloneDir}`);
120
+ return 1;
121
+ }
122
+ if (result.prUrl) {
123
+ console.log(`✓ PR opened: ${result.prUrl}`);
124
+ }
125
+ else {
126
+ console.log(`✓ dry-run prepared in: ${result.cloneDir}`);
127
+ console.log(` branch: ${result.branch} (not pushed)`);
128
+ }
129
+ console.log(` upstream: ${result.upstream}`);
130
+ console.log(` case-id : ${result.caseId}`);
131
+ return 0;
132
+ }
133
+ function doList() {
134
+ const items = listSessions();
135
+ if (items.length === 0) {
136
+ console.log('No sessions found for this cwd.');
137
+ return 0;
138
+ }
139
+ const idW = Math.max(8, ...items.map(i => i.sessionId.length));
140
+ const titleW = Math.max(5, ...items.map(i => Math.min(60, i.title.length)));
141
+ const pad = (s, w) => s + ' '.repeat(Math.max(0, w - s.length));
142
+ const trunc = (s, n) => s.length > n ? s.slice(0, n - 1) + '…' : s;
143
+ console.log(` ${pad('SESSION', idW)} ${pad('TITLE', titleW)} MSGS MODIFIED`);
144
+ for (const i of items) {
145
+ console.log(` ${pad(i.sessionId, idW)} ${pad(trunc(i.title, titleW), titleW)} ${String(i.messageCount).padStart(4)} ${i.lastModified.toISOString().slice(0, 19)}`);
146
+ }
147
+ return 0;
148
+ }
149
+ function printThreadHelp() {
150
+ console.log(`
151
+ yome thread — manage and share agent threads
152
+
153
+ Subcommands:
154
+ share <session-id> --skill=<slug> Build a redacted case bundle from a session
155
+ [--out=<dir>] (default: ~/.yome/shares/<id>-<ts>/)
156
+ [--no-redact] Disable the default redactor (NOT recommended)
157
+ [--submit] Open a PR to the skill repo right after share
158
+ [--case-id=<id>] Override the cases/<domain>/<id>/ name
159
+ [--dry-run] (with --submit) prepare the commit but don't push
160
+ [--verbose] Print every git/gh shell command
161
+
162
+ submit <bundle-dir> --skill=<slug> Push an existing bundle as a PR
163
+ [--case-id=<id>] [--dry-run] [--verbose]
164
+
165
+ list List sessions in the current cwd
166
+
167
+ Examples:
168
+ yome thread list
169
+ yome thread share 7c1f2e... --skill=@yome/ppt
170
+ yome thread share 7c1f2e... --skill=@yome/ppt --submit
171
+ yome thread submit ~/.yome/shares/7c1f2e-1745... --skill=@yome/ppt --dry-run
172
+
173
+ Requires gh CLI authenticated (gh auth login). The token-less hub-bot relay
174
+ path is planned for Phase 3 and not yet implemented.
175
+ `);
176
+ }
177
+ //# sourceMappingURL=threadCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threadCli.js","sourceRoot":"","sources":["../src/threadCli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type RedactionRule, type RuleHit } from './redact.js';
2
+ export interface BuildBundleOptions {
3
+ sessionId: string;
4
+ /** Skill slug the bundle targets, e.g. "@yome/ppt". Goes into README. */
5
+ skillSlug: string;
6
+ /** Where to write the bundle directory. The dir is created (must not exist). */
7
+ outDir: string;
8
+ /** Override default rules. Pass [] to skip redaction entirely. */
9
+ rules?: RedactionRule[];
10
+ }
11
+ export type BuildBundleResult = {
12
+ ok: true;
13
+ outDir: string;
14
+ messageCount: number;
15
+ toolCallCount: number;
16
+ hits: RuleHit[];
17
+ } | {
18
+ ok: false;
19
+ reason: string;
20
+ };
21
+ export declare function buildShareBundle(opts: BuildBundleOptions): BuildBundleResult;
@@ -0,0 +1,121 @@
1
+ // cli/src/threadShare.ts — Build a shareable case bundle from a session.
2
+ //
3
+ // Steps (per spec 9.1):
4
+ // 1. Load all messages for <sessionId>
5
+ // 2. Run ThreadRedactor over messages and trace
6
+ // 3. Emit a directory bundle:
7
+ // thread.json — redacted message timeline
8
+ // trace.json — redacted tool_use/tool_result extracted from messages
9
+ // fixtures.json — sandbox-friendly initial state stub (skill-specific)
10
+ // README.md — human-readable summary + rule-hit table
11
+ //
12
+ // We intentionally do NOT make any network call here. The PR/fork submission
13
+ // step (spec 9.1 step 5) is a follow-up command that consumes this bundle.
14
+ import { mkdirSync, writeFileSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { loadSessionMessages } from './sessions.js';
17
+ import { DEFAULT_RULES, redactValue, totalHits, } from './redact.js';
18
+ /**
19
+ * Walk an AgentMessage list to extract tool calls in order. Each tool_use
20
+ * is matched with its tool_result by id (results may live in the next user
21
+ * message per Anthropic format).
22
+ */
23
+ function extractTrace(messages) {
24
+ const steps = [];
25
+ const indexById = new Map();
26
+ for (const msg of messages) {
27
+ const blocks = typeof msg.content === 'string'
28
+ ? [{ type: 'text', text: msg.content }]
29
+ : msg.content;
30
+ for (const block of blocks) {
31
+ if (block.type === 'tool_use') {
32
+ const tu = block;
33
+ const idx = steps.length;
34
+ indexById.set(tu.id, idx);
35
+ steps.push({ index: idx, toolUseId: tu.id, toolName: tu.name, input: tu.input });
36
+ }
37
+ else if (block.type === 'tool_result') {
38
+ const tr = block;
39
+ const idx = indexById.get(tr.tool_use_id);
40
+ if (idx !== undefined)
41
+ steps[idx].result = tr.content;
42
+ }
43
+ }
44
+ }
45
+ return steps;
46
+ }
47
+ function renderReadme(opts) {
48
+ const hitTable = opts.hits.length === 0
49
+ ? '_No redactions applied — thread had no detectable PII / secrets / paths._'
50
+ : [
51
+ '| Rule | Count | Samples |',
52
+ '| --- | ---: | --- |',
53
+ ...opts.hits.map(h => `| \`${h.rule}\` | ${h.count} | ${h.samples.map(s => `\`${s.replace(/\|/g, '\\|')}\``).join(', ')} |`),
54
+ ].join('\n');
55
+ return `# Case for ${opts.skillSlug}
56
+
57
+ Generated from session \`${opts.sessionId}\` by \`yome thread share\`.
58
+
59
+ - Messages: **${opts.messageCount}**
60
+ - Tool calls: **${opts.toolCallCount}**
61
+
62
+ ## Files
63
+
64
+ - \`thread.json\` — full message timeline (redacted)
65
+ - \`trace.json\` — flattened tool_use → tool_result steps (redacted)
66
+ - \`fixtures.json\` — placeholder for sandbox-replay initial state; **fill in** the skill-specific world before opening a PR
67
+
68
+ ## Redaction summary
69
+
70
+ ${hitTable}
71
+
72
+ ## How this bundle is used
73
+
74
+ The skill's GitHub repo \`cases/<slug>/\` accepts directories like this one
75
+ as new replayable cases. Sandbox runs the skill against \`fixtures.json\`
76
+ and compares the actual trace against \`trace.json\`.
77
+
78
+ > Always re-read the redacted files yourself before opening a PR — the
79
+ > redactor is a best-effort safety net, not a guarantee.
80
+ `;
81
+ }
82
+ export function buildShareBundle(opts) {
83
+ const messages = loadSessionMessages(opts.sessionId);
84
+ if (messages.length === 0) {
85
+ return { ok: false, reason: `session ${opts.sessionId} has no messages (or does not exist for this cwd)` };
86
+ }
87
+ const rules = opts.rules ?? DEFAULT_RULES;
88
+ const trace = extractTrace(messages);
89
+ const redactedMessagesResult = redactValue(messages, rules);
90
+ const redactedTraceResult = redactValue(trace, rules);
91
+ // Aggregate hits across both walks for the README.
92
+ const hits = totalHits([redactedMessagesResult.hits, redactedTraceResult.hits]);
93
+ try {
94
+ mkdirSync(opts.outDir, { recursive: false });
95
+ }
96
+ catch (e) {
97
+ return { ok: false, reason: `outDir ${opts.outDir}: ${e.message}` };
98
+ }
99
+ writeFileSync(join(opts.outDir, 'thread.json'), JSON.stringify({ sessionId: opts.sessionId, skill: opts.skillSlug, messages: redactedMessagesResult.redacted }, null, 2));
100
+ writeFileSync(join(opts.outDir, 'trace.json'), JSON.stringify({ sessionId: opts.sessionId, skill: opts.skillSlug, steps: redactedTraceResult.redacted }, null, 2));
101
+ writeFileSync(join(opts.outDir, 'fixtures.json'), JSON.stringify({
102
+ $note: 'Fill in the sandbox-replay initial world for this skill before opening a PR.',
103
+ skill: opts.skillSlug,
104
+ skillStates: {},
105
+ }, null, 2));
106
+ writeFileSync(join(opts.outDir, 'README.md'), renderReadme({
107
+ skillSlug: opts.skillSlug,
108
+ sessionId: opts.sessionId,
109
+ messageCount: messages.length,
110
+ toolCallCount: trace.length,
111
+ hits,
112
+ }));
113
+ return {
114
+ ok: true,
115
+ outDir: opts.outDir,
116
+ messageCount: messages.length,
117
+ toolCallCount: trace.length,
118
+ hits,
119
+ };
120
+ }
121
+ //# sourceMappingURL=threadShare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threadShare.js","sourceRoot":"","sources":["../src/threadShare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface SubmitOptions {
2
+ /** Path to a bundle directory produced by `yome thread share`. */
3
+ bundleDir: string;
4
+ /** Skill slug (e.g. "@yome/ppt") — used to discover repo from manifest. */
5
+ skillSlug: string;
6
+ /** Case id; will be the name of the cases/<slug>/<caseId>/ directory. */
7
+ caseId?: string;
8
+ /** Override commit/PR title. Default: "case: add <caseId> for <skillSlug>". */
9
+ title?: string;
10
+ /** Override PR body. Default: a generated summary referencing the bundle README. */
11
+ body?: string;
12
+ /**
13
+ * If true, do everything **except** `git push` and `gh pr create` —
14
+ * useful for local diagnostics.
15
+ */
16
+ dryRun?: boolean;
17
+ /** Verbose: print every shelled command + its stdout. */
18
+ verbose?: boolean;
19
+ }
20
+ export type SubmitResult = {
21
+ ok: true;
22
+ prUrl?: string;
23
+ branch: string;
24
+ caseId: string;
25
+ cloneDir: string;
26
+ upstream: string;
27
+ } | {
28
+ ok: false;
29
+ reason: string;
30
+ cloneDir?: string;
31
+ };
32
+ export declare function submitBundle(opts: SubmitOptions): SubmitResult;
@@ -0,0 +1,199 @@
1
+ // cli/src/threadSubmit.ts — push a redacted bundle as a PR to a skill's repo.
2
+ //
3
+ // Spec 9.1 step 5 (token-bound path). The "no GitHub token / hub-bot relay"
4
+ // path is deferred to Phase 3 once the hub backend exists.
5
+ //
6
+ // Pipeline (all done via the locally-installed `gh` CLI; we shell out and
7
+ // never import @octokit/rest, keeping the CLI install tiny):
8
+ //
9
+ // 1. Resolve target repo from skill manifest (slug → installed manifest →
10
+ // `repo` field, e.g. https://github.com/yome-official/yome-skill-ppt).
11
+ // 2. `gh auth status` — fail fast with a clear message if not signed in.
12
+ // 3. `gh repo fork <upstream> --clone --remote=false` into a tmp dir.
13
+ // 4. `git checkout -b case/<slug>-<caseId>`
14
+ // 5. Copy bundle/* → cases/<slugBase>/<caseId>/
15
+ // 6. `git add -A && git commit -m "<title>"` (signed-off optional)
16
+ // 7. `git push --set-upstream origin case/<slug>-<caseId>`
17
+ // 8. `gh pr create --repo <upstream> --title "..." --body "..."`
18
+ // 9. Return PR URL.
19
+ //
20
+ // We do NOT delete the tmp clone — leave it for the user to inspect / amend.
21
+ import { spawnSync } from 'node:child_process';
22
+ import { existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, statSync, copyFileSync } from 'node:fs';
23
+ import { homedir } from 'node:os';
24
+ import { basename, join, resolve } from 'node:path';
25
+ import { readManifest } from './yomeSkills/manifest.js';
26
+ import { installPathForSlug, parseSlug } from './yomeSkills/paths.js';
27
+ const REPO_URL_RE = /^https?:\/\/github\.com\/([^/]+\/[^/.\s]+?)(?:\.git)?\/?$/;
28
+ /**
29
+ * Look up a skill's upstream GitHub repo from `~/.yome/skills/<owner>/<name>/`.
30
+ * Falls back to the monorepo `skills/yome-skill-<domain>/` if not installed.
31
+ */
32
+ function lookupUpstream(skillSlug) {
33
+ // 1. Try installed location first
34
+ const installPath = installPathForSlug(skillSlug);
35
+ let manifest = installPath ? readManifest(installPath) : null;
36
+ // 2. Fall back to monorepo
37
+ if (!manifest) {
38
+ const parsed = parseSlug(skillSlug);
39
+ if (parsed) {
40
+ const monorepoPath = resolve(process.cwd(), 'skills', `yome-skill-${parsed.name}`);
41
+ if (existsSync(join(monorepoPath, 'yome-skill.json'))) {
42
+ manifest = readManifest(monorepoPath);
43
+ }
44
+ }
45
+ }
46
+ if (!manifest) {
47
+ return { ok: false, reason: `skill ${skillSlug} not found locally — install it first or run from monorepo root` };
48
+ }
49
+ if (!manifest.repo) {
50
+ return { ok: false, reason: `skill ${skillSlug} manifest has no "repo" field — cannot determine upstream` };
51
+ }
52
+ const m = REPO_URL_RE.exec(manifest.repo.trim());
53
+ if (!m) {
54
+ return { ok: false, reason: `skill ${skillSlug} manifest "repo" is not a github.com URL: ${manifest.repo}` };
55
+ }
56
+ return { fullName: m[1], manifest };
57
+ }
58
+ /** Run a shell command, capturing stdout/stderr. Throws nothing — caller checks status. */
59
+ function run(cmd, args, cwd, verbose) {
60
+ if (verbose) {
61
+ const inDir = cwd ? ` (in ${cwd})` : '';
62
+ // eslint-disable-next-line no-console
63
+ console.log(`$ ${cmd} ${args.join(' ')}${inDir}`);
64
+ }
65
+ const result = spawnSync(cmd, args, { cwd, encoding: 'utf-8', env: process.env });
66
+ if (verbose && result.stdout)
67
+ console.log(result.stdout.trimEnd());
68
+ if (verbose && result.stderr)
69
+ console.error(result.stderr.trimEnd());
70
+ return result;
71
+ }
72
+ function ghIsInstalled() {
73
+ const r = spawnSync('gh', ['--version'], { encoding: 'utf-8' });
74
+ return r.status === 0;
75
+ }
76
+ function ghIsAuthed(verbose) {
77
+ const r = run('gh', ['auth', 'status'], undefined, verbose);
78
+ if (r.status === 0)
79
+ return { ok: true };
80
+ return { ok: false, reason: r.stderr?.trim() || 'gh auth status failed (run: gh auth login)' };
81
+ }
82
+ function copyBundleInto(srcDir, dest) {
83
+ if (!existsSync(dest))
84
+ mkdirSync(dest, { recursive: true });
85
+ let count = 0;
86
+ for (const entry of readdirSync(srcDir)) {
87
+ if (entry === '.git' || entry === 'node_modules' || entry === '.DS_Store')
88
+ continue;
89
+ const s = join(srcDir, entry);
90
+ const d = join(dest, entry);
91
+ const st = statSync(s);
92
+ if (st.isDirectory()) {
93
+ count += copyBundleInto(s, d);
94
+ }
95
+ else if (st.isFile()) {
96
+ copyFileSync(s, d);
97
+ count++;
98
+ }
99
+ }
100
+ return count;
101
+ }
102
+ function defaultCaseId(bundleDir) {
103
+ // Bundles default to <sessionId>-<timestamp>; the basename is already unique.
104
+ return basename(bundleDir).slice(0, 60);
105
+ }
106
+ function defaultTitle(skillSlug, caseId) {
107
+ return `case: add ${caseId} for ${skillSlug}`;
108
+ }
109
+ function defaultBody(skillSlug, caseId, bundleDir) {
110
+ let bundleReadme = '';
111
+ try {
112
+ bundleReadme = readFileSync(join(bundleDir, 'README.md'), 'utf-8');
113
+ }
114
+ catch {
115
+ /* missing README is fine */
116
+ }
117
+ return `Adds a new replayable case for **${skillSlug}** under \`cases/${parseSlug(skillSlug)?.name ?? 'unknown'}/${caseId}/\`.
118
+
119
+ Submitted via \`yome thread share --submit\`. The bundle was redacted on-device using the default ThreadRedactor rules (email / phone / api-key / path / mind).
120
+
121
+ ---
122
+
123
+ ${bundleReadme}`;
124
+ }
125
+ export function submitBundle(opts) {
126
+ if (!existsSync(opts.bundleDir)) {
127
+ return { ok: false, reason: `bundle directory does not exist: ${opts.bundleDir}` };
128
+ }
129
+ if (!existsSync(join(opts.bundleDir, 'thread.json'))) {
130
+ return { ok: false, reason: `${opts.bundleDir} is not a valid bundle (missing thread.json)` };
131
+ }
132
+ if (!ghIsInstalled()) {
133
+ return { ok: false, reason: 'gh CLI is not installed (https://cli.github.com). Install it then run: gh auth login' };
134
+ }
135
+ const auth = ghIsAuthed(!!opts.verbose);
136
+ if (!auth.ok) {
137
+ return { ok: false, reason: `gh CLI not authenticated: ${auth.reason}\nRun: gh auth login\n\n(The token-less hub-bot relay path is planned for Phase 3 and not yet implemented.)` };
138
+ }
139
+ const upstreamLookup = lookupUpstream(opts.skillSlug);
140
+ if ('ok' in upstreamLookup && upstreamLookup.ok === false)
141
+ return upstreamLookup;
142
+ const { fullName: upstream, manifest } = upstreamLookup;
143
+ const caseId = opts.caseId ?? defaultCaseId(opts.bundleDir);
144
+ const branch = `case/${manifest.domain}-${caseId}`;
145
+ const title = opts.title ?? defaultTitle(opts.skillSlug, caseId);
146
+ const body = opts.body ?? defaultBody(opts.skillSlug, caseId, opts.bundleDir);
147
+ // Clone into ~/.yome/shares/.work/<random>/<repo>
148
+ const workRoot = join(homedir(), '.yome', 'shares', '.work');
149
+ if (!existsSync(workRoot))
150
+ mkdirSync(workRoot, { recursive: true });
151
+ const tmpDir = mkdtempSync(join(workRoot, 'submit-'));
152
+ const cloneDir = join(tmpDir, basename(upstream));
153
+ // 1. fork + clone. `gh repo fork ... --clone -- <git-clone-args>` lets us
154
+ // pass `--depth` and the target directory through to git clone.
155
+ const forkResult = run('gh', ['repo', 'fork', upstream, '--clone', '--', '--depth=20', cloneDir], undefined, !!opts.verbose);
156
+ if (forkResult.status !== 0) {
157
+ return { ok: false, reason: `gh repo fork failed: ${forkResult.stderr?.trim()}`, cloneDir };
158
+ }
159
+ // 2. checkout new branch
160
+ const checkout = run('git', ['checkout', '-b', branch], cloneDir, !!opts.verbose);
161
+ if (checkout.status !== 0) {
162
+ return { ok: false, reason: `git checkout -b failed: ${checkout.stderr?.trim()}`, cloneDir };
163
+ }
164
+ // 3. copy bundle into cases/<domain>/<caseId>/
165
+ const targetRel = join('cases', manifest.domain, caseId);
166
+ const targetAbs = join(cloneDir, targetRel);
167
+ if (existsSync(targetAbs)) {
168
+ return { ok: false, reason: `cases/${manifest.domain}/${caseId}/ already exists in fork — pass a different --case-id`, cloneDir };
169
+ }
170
+ const copied = copyBundleInto(opts.bundleDir, targetAbs);
171
+ if (copied === 0) {
172
+ return { ok: false, reason: 'bundle is empty (no files copied)', cloneDir };
173
+ }
174
+ // 4. commit
175
+ const add = run('git', ['add', '-A'], cloneDir, !!opts.verbose);
176
+ if (add.status !== 0) {
177
+ return { ok: false, reason: `git add failed: ${add.stderr?.trim()}`, cloneDir };
178
+ }
179
+ const commit = run('git', ['commit', '-m', title], cloneDir, !!opts.verbose);
180
+ if (commit.status !== 0) {
181
+ return { ok: false, reason: `git commit failed: ${commit.stderr?.trim()}`, cloneDir };
182
+ }
183
+ if (opts.dryRun) {
184
+ return { ok: true, branch, caseId, cloneDir, upstream };
185
+ }
186
+ // 5. push
187
+ const push = run('git', ['push', '--set-upstream', 'origin', branch], cloneDir, !!opts.verbose);
188
+ if (push.status !== 0) {
189
+ return { ok: false, reason: `git push failed: ${push.stderr?.trim()}`, cloneDir };
190
+ }
191
+ // 6. open PR
192
+ const pr = run('gh', ['pr', 'create', '--repo', upstream, '--title', title, '--body', body, '--head', branch], cloneDir, !!opts.verbose);
193
+ if (pr.status !== 0) {
194
+ return { ok: false, reason: `gh pr create failed: ${pr.stderr?.trim()}`, cloneDir };
195
+ }
196
+ const prUrl = pr.stdout?.trim().split('\n').pop() || undefined;
197
+ return { ok: true, prUrl, branch, caseId, cloneDir, upstream };
198
+ }
199
+ //# sourceMappingURL=threadSubmit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threadSubmit.js","sourceRoot":"","sources":["../src/threadSubmit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ToolDef } from '../types.js';
2
+ export interface AskUserQuestion {
3
+ /** Full question text shown to the user (should end with `?`). */
4
+ question: string;
5
+ /** Short chip label shown above the option list (≤ 12 chars). */
6
+ header: string;
7
+ /** 2–4 options. Do NOT include "Other" — the UI auto-adds a custom-answer entry. */
8
+ options: {
9
+ label: string;
10
+ description?: string;
11
+ }[];
12
+ }
13
+ export interface AskUserResult {
14
+ /** Map: question text → answer string (the chosen label or the user's free-text). */
15
+ answers: Record<string, string>;
16
+ /** True if the user pressed Esc / cancelled all questions. */
17
+ cancelled?: boolean;
18
+ }
19
+ export declare function setAskUserHandler(fn: (questions: AskUserQuestion[]) => Promise<AskUserResult>): void;
20
+ export declare const askUserTool: ToolDef;