volute 0.33.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/README.md +7 -6
  2. package/dist/accept-ZBDVVCEU.js +42 -0
  3. package/dist/activity-events-ZW4SDL2C.js +15 -0
  4. package/dist/{ai-service-SBY2WG7O.js → ai-service-LURBEDDB.js} +6 -6
  5. package/dist/{api-client-YPKOZP2O.js → api-client-3A77HMH7.js} +2 -2
  6. package/dist/api.d.ts +1 -5195
  7. package/dist/{archive-INXYFVCW.js → archive-ESU2FUN4.js} +4 -4
  8. package/dist/{auth-GKCDSO4T.js → auth-WX4TESEI.js} +6 -6
  9. package/dist/bridge-PXIO6PS2.js +206 -0
  10. package/dist/chat-QXAJF3FU.js +51 -0
  11. package/dist/{chunk-NNB4WIG7.js → chunk-2TGZJFAT.js} +3 -3
  12. package/dist/{chunk-6LXAAQ43.js → chunk-33ODGMFZ.js} +1 -1
  13. package/dist/{chunk-RPZZSXV3.js → chunk-5N7Y5WAM.js} +21 -2
  14. package/dist/chunk-5T5YMX6S.js +23 -0
  15. package/dist/{chunk-7J3HEVR7.js → chunk-5XJYUFZH.js} +28 -16
  16. package/dist/chunk-7KJOFUNN.js +22 -0
  17. package/dist/{chunk-2NGTS5UU.js → chunk-A2ZLHBHG.js} +2 -2
  18. package/dist/{chunk-KIEPMIM5.js → chunk-AN2W47GW.js} +2 -2
  19. package/dist/{chunk-G53F3JA4.js → chunk-AOB6GVRM.js} +1 -1
  20. package/dist/{chunk-LRCG2JLP.js → chunk-BDYXIWA5.js} +9 -5
  21. package/dist/{chunk-YUIHSKR6.js → chunk-BKF4WQCY.js} +2 -2
  22. package/dist/{chunk-N432I7QH.js → chunk-BMZQYACC.js} +2 -2
  23. package/dist/{chunk-NAOW2CLO.js → chunk-BTY4WNFE.js} +1 -1
  24. package/dist/{chunk-ALEF47VT.js → chunk-BV65KRHM.js} +2 -2
  25. package/dist/{chunk-KVK2DLWI.js → chunk-CORXD635.js} +4 -4
  26. package/dist/{chunk-PVY5W6QN.js → chunk-F7ZNLYKZ.js} +2 -2
  27. package/dist/{chunk-QTUVYI7W.js → chunk-FT5KETXZ.js} +3 -3
  28. package/dist/{chunk-C7I35G4R.js → chunk-IJHIXLVN.js} +44 -8
  29. package/dist/{chunk-JUKK7FPS.js → chunk-J6CJQDWI.js} +37 -28
  30. package/dist/{chunk-4RQBJWQX.js → chunk-LOPXTW6H.js} +1 -1
  31. package/dist/{chunk-RSX4OPZY.js → chunk-MDJGMOSD.js} +8 -137
  32. package/dist/{chunk-LOEJ4HPQ.js → chunk-N446KRP7.js} +3 -3
  33. package/dist/{chunk-I5KY25PQ.js → chunk-N5LMGYXX.js} +2 -2
  34. package/dist/{chunk-G6BSYHPK.js → chunk-NJK5SDGR.js} +1 -1
  35. package/dist/{chunk-D424ZQGI.js → chunk-O7IGP7ZW.js} +11 -3
  36. package/dist/{chunk-M7UL5S3Q.js → chunk-OTC67N2Z.js} +2 -2
  37. package/dist/{chunk-GY5HBI7A.js → chunk-PWQ2ITYG.js} +4 -4
  38. package/dist/{chunk-KTLFDYPT.js → chunk-QCH6K235.js} +1 -1
  39. package/dist/chunk-QHG4OMZL.js +145 -0
  40. package/dist/{chunk-SKLSMHXO.js → chunk-QWTR6AWZ.js} +3 -3
  41. package/dist/chunk-TXSA4Q3V.js +116 -0
  42. package/dist/{chunk-VH33ZWMW.js → chunk-VHJRZM2S.js} +2 -2
  43. package/dist/{chunk-SSI47XP2.js → chunk-VHWGEJ4V.js} +1 -1
  44. package/dist/chunk-VY3RB2V7.js +164 -0
  45. package/dist/chunk-WJPROOU5.js +8314 -0
  46. package/dist/{chunk-RVGLDGMI.js → chunk-WZRZFFCL.js} +25 -27
  47. package/dist/{chunk-JYVGHWEJ.js → chunk-XRQSAMX2.js} +4 -4
  48. package/dist/{chunk-OYAKCAVY.js → chunk-ZSR72JB3.js} +1 -1
  49. package/dist/{chunk-UKVWJRKN.js → chunk-ZX7EAV5J.js} +17 -7
  50. package/dist/cli.js +90 -29
  51. package/dist/clock-HSEKS5AR.js +289 -0
  52. package/dist/{cloud-sync-4NWLMFVH.js → cloud-sync-6JL4C24T.js} +22 -23
  53. package/dist/config-UTS7QULS.js +76 -0
  54. package/dist/connectors/discord-bridge.js +4 -4
  55. package/dist/connectors/slack-bridge.js +4 -4
  56. package/dist/connectors/telegram-bridge.js +4 -4
  57. package/dist/{conversations-AWI5SZW2.js → conversations-2PW57WO2.js} +6 -6
  58. package/dist/create-5BPOOJAN.js +75 -0
  59. package/dist/create-UVCK2CS6.js +50 -0
  60. package/dist/daemon-client-RVIKXGFQ.js +12 -0
  61. package/dist/daemon-restart-HSZ3BCX5.js +65 -0
  62. package/dist/daemon.js +1349 -1211
  63. package/dist/db-BDMH4SZ2.js +20 -0
  64. package/dist/db-BVBJ57TU.js +9 -0
  65. package/dist/delete-L5PAVDGQ.js +42 -0
  66. package/dist/delivery-manager-H5ZVBMCQ.js +31 -0
  67. package/dist/{delivery-router-FL45JL7N.js → delivery-router-HEJSJAHQ.js} +5 -5
  68. package/dist/down-74VXM45A.js +17 -0
  69. package/dist/env-E4XHO2BI.js +223 -0
  70. package/dist/exec-PY7THYH4.js +17 -0
  71. package/dist/export-OAS6QVBN.js +113 -0
  72. package/dist/extension-D74CNM7G.js +89 -0
  73. package/dist/extensions-XDDFY72A.js +49 -0
  74. package/dist/files-CWTK6V3H.js +53 -0
  75. package/dist/import-5A3T7QV4.js +143 -0
  76. package/dist/{isolation-LLAYQYDY.js → isolation-TK5RX2WM.js} +4 -4
  77. package/dist/join-DF5XSJAC.js +67 -0
  78. package/dist/lib-DYEZMGW7.js +6588 -0
  79. package/dist/list-PDMQM7ZV.js +53 -0
  80. package/dist/login-7TE6CIZF.js +60 -0
  81. package/dist/login-GOTAYLXP.js +51 -0
  82. package/dist/logout-6KIA74EV.js +29 -0
  83. package/dist/logout-T4XS6LRU.js +50 -0
  84. package/dist/message-delivery-GRC4W6P7.js +41 -0
  85. package/dist/mind-5IEYKV7I.js +97 -0
  86. package/dist/mind-activity-tracker-QBLIV7ZJ.js +18 -0
  87. package/dist/mind-history-IE2QH7U5.js +275 -0
  88. package/dist/mind-list-GEWHWAL4.js +38 -0
  89. package/dist/mind-manager-HFLB5653.js +31 -0
  90. package/dist/mind-profile-DCBDVF5B.js +53 -0
  91. package/dist/mind-service-X2CAA6W6.js +37 -0
  92. package/dist/mind-sleep-ITCF6OQA.js +47 -0
  93. package/dist/mind-status-X4SX3YUG.js +65 -0
  94. package/dist/mind-wake-KXMKMGWX.js +42 -0
  95. package/dist/{package-U3VFO273.js → package-D2FSVFAX.js} +11 -8
  96. package/dist/read-67VRP2DO.js +91 -0
  97. package/dist/{read-stdin-HQJ7774D.js → read-stdin-3X5VYKNS.js} +2 -2
  98. package/dist/register-SB7NXCOE.js +51 -0
  99. package/dist/{registry-PJ4S5PHQ.js → registry-GBSNW3HG.js} +3 -3
  100. package/dist/reject-MUR2KWJ4.js +40 -0
  101. package/dist/restart-5EGG4JXU.js +42 -0
  102. package/dist/{sandbox-GJOK4QLQ.js → sandbox-R37VIU36.js} +6 -6
  103. package/dist/scheduler-Y7O4CJXL.js +31 -0
  104. package/dist/{schema-PA3M5ZKH.js → schema-XVZ2CLKW.js} +4 -2
  105. package/dist/{seed-QDYVLG74.js → seed-EQORWX77.js} +3 -3
  106. package/dist/seed-check-KJNTL72M.js +35 -0
  107. package/dist/seed-cmd-ZM2XGVU2.js +30 -0
  108. package/dist/seed-create-DRWGGHEI.js +113 -0
  109. package/dist/seed-sprout-JYXGXOP3.js +148 -0
  110. package/dist/send-JBJJQ7CA.js +409 -0
  111. package/dist/service-WNPCNHOX.js +121 -0
  112. package/dist/{setup-XMCBE3LF.js → setup-BJ4YAY26.js} +155 -129
  113. package/dist/{setup-TISPCO22.js → setup-RHJRFURI.js} +4 -4
  114. package/dist/skill-TAAKEYBV.js +389 -0
  115. package/dist/skills/plan-coordinator/SKILL.md +60 -0
  116. package/dist/skills/volute-mind/SKILL.md +9 -227
  117. package/dist/skills/volute-mind/references/extensions.md +34 -0
  118. package/dist/skills/volute-mind/references/integrations.md +48 -0
  119. package/dist/skills/volute-mind/references/routing.md +86 -0
  120. package/dist/skills/volute-mind/references/sleep.md +33 -0
  121. package/dist/skills/volute-mind/references/variants.md +31 -0
  122. package/dist/{skills-7FV7EJTE.js → skills-EKMCQ46K.js} +12 -8
  123. package/dist/sleep-manager-7KFK3USC.js +35 -0
  124. package/dist/spirit-ZFRDXMG7.js +23 -0
  125. package/dist/split-AWVOYOPZ.js +64 -0
  126. package/dist/{sprout-WKLZXUIQ.js → sprout-HE4TITMK.js} +3 -3
  127. package/dist/start-3UXOPXQG.js +39 -0
  128. package/dist/status-ZK34WYIM.js +125 -0
  129. package/dist/stop-3XYIBGFM.js +41 -0
  130. package/dist/system-chat-IDPHYHY4.js +35 -0
  131. package/dist/systems-O43WGQY6.js +52 -0
  132. package/dist/{tailscale-XHQBZROW.js → tailscale-ZIZ2HWJ5.js} +5 -5
  133. package/dist/template-hash-A7FNHTB7.js +9 -0
  134. package/dist/up-77ICEDEW.js +19 -0
  135. package/dist/update-ANE5ZM7F.js +225 -0
  136. package/dist/{update-check-ZD6OOIYQ.js → update-check-UV55CBEP.js} +4 -4
  137. package/dist/upgrade-ZMDGC7M2.js +74 -0
  138. package/dist/variant-QWL2WSRI.js +62 -0
  139. package/dist/{version-notify-NBI2MTJO.js → version-notify-FXSEMXWW.js} +29 -28
  140. package/dist/{volute-config-HD7WWUQC.js → volute-config-D2XVS2YI.js} +2 -2
  141. package/dist/web-assets/assets/index-BhxWKvbB.css +1 -0
  142. package/dist/web-assets/assets/index-CHVKJ9II.js +75 -0
  143. package/dist/web-assets/ext-theme.css +48 -9
  144. package/dist/web-assets/index.html +2 -2
  145. package/dist/web-assets/sw.js +117 -0
  146. package/drizzle/0005_meta_summaries.sql +15 -0
  147. package/drizzle/meta/0005_snapshot.json +7 -0
  148. package/drizzle/meta/_journal.json +7 -0
  149. package/package.json +10 -7
  150. package/packages/extensions/pages/dist/ui/assets/index-DKZLNMED.js +2 -0
  151. package/packages/extensions/pages/dist/ui/index.html +1 -1
  152. package/packages/extensions/pages/skills/pages/SKILL.md +84 -9
  153. package/packages/extensions/plan/dist/ui/assets/index-CJj2gZnZ.css +1 -0
  154. package/packages/extensions/plan/dist/ui/assets/index-FMEJmvQz.js +61 -0
  155. package/packages/extensions/plan/dist/ui/index.html +14 -0
  156. package/packages/extensions/plan/skills/plan/SKILL.md +43 -0
  157. package/packages/extensions/plan/skills/plan/scripts/plan-hook.sh +37 -0
  158. package/templates/_base/home/VOLUTE.md +12 -19
  159. package/templates/_base/src/lib/auto-commit.ts +8 -8
  160. package/templates/_base/src/lib/context-breakdown.ts +450 -0
  161. package/templates/_base/src/lib/format-prefix.ts +17 -0
  162. package/templates/_base/src/lib/hook-loader.ts +8 -2
  163. package/templates/_base/src/lib/router.ts +75 -33
  164. package/templates/_base/src/lib/routing.ts +4 -1
  165. package/templates/_base/src/lib/startup.ts +16 -8
  166. package/templates/_base/src/lib/types.ts +2 -1
  167. package/templates/_base/src/lib/volute-server.ts +75 -8
  168. package/templates/claude/.init/CLAUDE.md +4 -10
  169. package/templates/claude/package.json.tmpl +1 -0
  170. package/templates/claude/src/agent.ts +108 -33
  171. package/templates/claude/src/lib/hooks/reply-instructions.ts +27 -7
  172. package/templates/claude/src/lib/stream-consumer.ts +2 -2
  173. package/templates/claude/src/server.ts +1 -0
  174. package/templates/codex/package.json.tmpl +1 -0
  175. package/templates/codex/src/agent.ts +80 -8
  176. package/templates/codex/src/server.ts +1 -4
  177. package/templates/pi/package.json.tmpl +1 -0
  178. package/templates/pi/src/agent.ts +115 -36
  179. package/templates/pi/src/lib/event-handler.ts +22 -7
  180. package/templates/pi/src/lib/reply-instructions-extension.ts +23 -4
  181. package/templates/pi/src/lib/subagents.ts +20 -17
  182. package/templates/pi/src/server.ts +2 -5
  183. package/dist/accept-D5VBM7JW.js +0 -42
  184. package/dist/activity-events-XJO3P4RR.js +0 -15
  185. package/dist/bridge-TXWWPPOJ.js +0 -207
  186. package/dist/chat-U5ZOME3O.js +0 -68
  187. package/dist/chunk-3Z2DPESO.js +0 -3634
  188. package/dist/chunk-A2A4KLFE.js +0 -1528
  189. package/dist/chunk-K3NQKI34.js +0 -10
  190. package/dist/chunk-NPKSDYA2.js +0 -156
  191. package/dist/chunk-PB65JZK2.js +0 -85
  192. package/dist/clock-BVH3V6E3.js +0 -266
  193. package/dist/config-H2H4UIF7.js +0 -72
  194. package/dist/create-2FK7Z46Y.js +0 -44
  195. package/dist/create-YWD2TIP4.js +0 -71
  196. package/dist/daemon-client-6QXHZ7US.js +0 -12
  197. package/dist/daemon-restart-GOBUKLX7.js +0 -52
  198. package/dist/db-F34YLV7D.js +0 -9
  199. package/dist/db-RA45JBFG.js +0 -16
  200. package/dist/delete-QTGWEDBI.js +0 -35
  201. package/dist/delivery-manager-PFAKEJTC.js +0 -32
  202. package/dist/down-FWWTEKXM.js +0 -15
  203. package/dist/env-JCOF2222.js +0 -191
  204. package/dist/export-SUYRLI5Q.js +0 -112
  205. package/dist/extension-OBTGKQQD.js +0 -175
  206. package/dist/extensions-KYNTVTMO.js +0 -30
  207. package/dist/files-65PMW5IK.js +0 -47
  208. package/dist/history-DKCDI3JO.js +0 -128
  209. package/dist/import-DDUFE7AY.js +0 -23
  210. package/dist/join-I5QEE3LG.js +0 -66
  211. package/dist/list-JQ463EDA.js +0 -41
  212. package/dist/login-D7ETSU4R.js +0 -47
  213. package/dist/login-RIJF2F4G.js +0 -47
  214. package/dist/logout-5MLHZALK.js +0 -40
  215. package/dist/logout-UZJRGY4Z.js +0 -21
  216. package/dist/message-delivery-DFF5SJRM.js +0 -42
  217. package/dist/mind-IOJFLEM5.js +0 -108
  218. package/dist/mind-activity-tracker-F6O4Q2SL.js +0 -18
  219. package/dist/mind-list-WUPMQDYQ.js +0 -30
  220. package/dist/mind-manager-NBJF5D26.js +0 -32
  221. package/dist/mind-profile-P67FEHOY.js +0 -47
  222. package/dist/mind-service-2MQ6UK5N.js +0 -38
  223. package/dist/mind-sleep-WW2IX7JT.js +0 -42
  224. package/dist/mind-status-L3EFFRPR.js +0 -56
  225. package/dist/mind-wake-VSSGW465.js +0 -37
  226. package/dist/read-EBY56C33.js +0 -75
  227. package/dist/register-HD74C4TT.js +0 -47
  228. package/dist/reject-UJKFBHRO.js +0 -40
  229. package/dist/restart-3UCMRUVC.js +0 -33
  230. package/dist/scheduler-ZZ7XGQG6.js +0 -32
  231. package/dist/seed-check-S2IX25RL.js +0 -32
  232. package/dist/seed-cmd-DKOUFEAU.js +0 -36
  233. package/dist/seed-create-4XBBOLRH.js +0 -112
  234. package/dist/seed-sprout-GQEIIQRT.js +0 -132
  235. package/dist/send-QIV2INHB.js +0 -373
  236. package/dist/skill-PSQGRRJX.js +0 -358
  237. package/dist/skills/shared-files/SKILL.md +0 -44
  238. package/dist/skills/shared-files/scripts/merge.ts +0 -72
  239. package/dist/skills/shared-files/scripts/pull.ts +0 -52
  240. package/dist/sleep-manager-JTXSN7NV.js +0 -36
  241. package/dist/spirit-VRONKFMF.js +0 -23
  242. package/dist/split-STOROBYJ.js +0 -63
  243. package/dist/start-K2NCUUCG.js +0 -33
  244. package/dist/status-3JBTFSMI.js +0 -115
  245. package/dist/stop-H26JZDXF.js +0 -32
  246. package/dist/system-chat-JAPOJ3KE.js +0 -36
  247. package/dist/systems-XRI52VCH.js +0 -61
  248. package/dist/template-hash-A6VVKOXJ.js +0 -9
  249. package/dist/up-M5AS6SBV.js +0 -18
  250. package/dist/update-UD543CXX.js +0 -215
  251. package/dist/upgrade-O4Q7WJM3.js +0 -67
  252. package/dist/variant-7TGZHOU3.js +0 -41
  253. package/dist/web-assets/assets/index-CWJrVveV.css +0 -1
  254. package/dist/web-assets/assets/index-DJt14FRI.js +0 -75
  255. package/packages/extensions/pages/dist/ui/assets/index-tLTROSk5.js +0 -2
@@ -1,358 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- resolveMindName
4
- } from "./chunk-NAOW2CLO.js";
5
- import {
6
- getClient,
7
- urlOf
8
- } from "./chunk-4RQBJWQX.js";
9
- import {
10
- daemonFetch
11
- } from "./chunk-UKVWJRKN.js";
12
- import {
13
- parseArgs
14
- } from "./chunk-D424ZQGI.js";
15
- import "./chunk-LRCG2JLP.js";
16
- import "./chunk-RPZZSXV3.js";
17
- import "./chunk-K3NQKI34.js";
18
-
19
- // src/commands/skill.ts
20
- async function run(args) {
21
- const subcommand = args[0];
22
- switch (subcommand) {
23
- case "list":
24
- await listSkills(args.slice(1));
25
- break;
26
- case "info":
27
- await infoSkill(args.slice(1));
28
- break;
29
- case "install":
30
- await installSkill(args.slice(1));
31
- break;
32
- case "update":
33
- await updateSkill(args.slice(1));
34
- break;
35
- case "publish":
36
- await publishSkill(args.slice(1));
37
- break;
38
- case "remove":
39
- await removeSkill(args.slice(1));
40
- break;
41
- case "uninstall":
42
- await uninstallSkill(args.slice(1));
43
- break;
44
- case "defaults":
45
- await manageDefaults(args.slice(1));
46
- break;
47
- case "--help":
48
- case "-h":
49
- case void 0:
50
- printUsage();
51
- break;
52
- default:
53
- console.error(`Unknown subcommand: ${subcommand}`);
54
- printUsage();
55
- process.exit(1);
56
- }
57
- }
58
- function printUsage() {
59
- console.log(`Usage:
60
- volute skill list List shared skills available to install
61
- volute skill list --mind <name> List installed skills for a mind
62
- volute skill info <name> Show details of a shared skill
63
- volute skill install <name> --mind Install a shared skill into a mind
64
- volute skill update <name> --mind Update an installed skill (3-way merge)
65
- volute skill update --all --mind Update all installed skills
66
- volute skill publish <name> --mind Publish a mind's skill to the shared repository
67
- volute skill remove <name> Remove a shared skill
68
- volute skill uninstall <name> --mind Uninstall a skill from a mind
69
- volute skill defaults List default skills for new minds
70
- volute skill defaults add <name> Add a skill to the default set
71
- volute skill defaults remove <name> Remove a skill from the default set`);
72
- }
73
- async function listSkills(args) {
74
- const { flags } = parseArgs(args, { mind: { type: "string" } });
75
- if (flags.mind || process.env.VOLUTE_MIND) {
76
- const mindName = resolveMindName(flags);
77
- const client = getClient();
78
- const url = urlOf(client.api.minds[":name"].skills.$url({ param: { name: mindName } }));
79
- const res = await daemonFetch(url);
80
- if (!res.ok) {
81
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
82
- console.error(`Error: ${body.error}`);
83
- process.exit(1);
84
- }
85
- const skills = await res.json();
86
- if (skills.length === 0) {
87
- console.log("No skills installed.");
88
- return;
89
- }
90
- console.log(`Skills for ${mindName}:
91
- `);
92
- for (const s of skills) {
93
- const update = s.updateAvailable ? " (update available)" : "";
94
- const source = s.upstream ? ` [shared:${s.upstream.source} v${s.upstream.version}]` : "";
95
- console.log(` ${s.id} \u2014 ${s.name}${source}${update}`);
96
- }
97
- } else {
98
- const client = getClient();
99
- const url = urlOf(client.api.skills.$url());
100
- const res = await daemonFetch(url);
101
- if (!res.ok) {
102
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
103
- console.error(`Error: ${body.error}`);
104
- process.exit(1);
105
- }
106
- const skills = await res.json();
107
- if (skills.length === 0) {
108
- console.log("No shared skills available.");
109
- return;
110
- }
111
- console.log("Shared skills:\n");
112
- for (const s of skills) {
113
- console.log(` ${s.id} \u2014 ${s.name} (v${s.version}, by ${s.author})`);
114
- if (s.description) console.log(` ${s.description}`);
115
- }
116
- }
117
- }
118
- async function infoSkill(args) {
119
- const { positional } = parseArgs(args, {});
120
- const id = positional[0];
121
- if (!id) {
122
- console.error("Usage: volute skill info <name>");
123
- process.exit(1);
124
- }
125
- const client = getClient();
126
- const url = urlOf(client.api.skills[":id"].$url({ param: { id } }));
127
- const res = await daemonFetch(url);
128
- if (!res.ok) {
129
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
130
- console.error(`Error: ${body.error}`);
131
- process.exit(1);
132
- }
133
- const skill = await res.json();
134
- console.log(`${skill.name} (${skill.id})`);
135
- console.log(` Version: ${skill.version}`);
136
- console.log(` Author: ${skill.author}`);
137
- if (skill.description) console.log(` Description: ${skill.description}`);
138
- console.log(` Files: ${skill.files.join(", ")}`);
139
- }
140
- async function installSkill(args) {
141
- const { positional, flags } = parseArgs(args, { mind: { type: "string" } });
142
- const mindName = resolveMindName(flags);
143
- const skillId = positional[0];
144
- if (!skillId) {
145
- console.error("Usage: volute skill install <name> [--mind <name>]");
146
- process.exit(1);
147
- }
148
- const client = getClient();
149
- const url = urlOf(client.api.minds[":name"].skills.install.$url({ param: { name: mindName } }));
150
- const res = await daemonFetch(url, {
151
- method: "POST",
152
- headers: { "Content-Type": "application/json" },
153
- body: JSON.stringify({ skillId })
154
- });
155
- if (!res.ok) {
156
- const body2 = await res.json().catch(() => ({ error: "Unknown error" }));
157
- console.error(`Error: ${body2.error}`);
158
- process.exit(1);
159
- }
160
- const body = await res.json().catch(() => ({}));
161
- console.log(`Installed skill "${skillId}" into ${mindName}.`);
162
- if (body.npmInstalled?.length) {
163
- console.log(`Installed npm dependencies: ${body.npmInstalled.join(", ")}`);
164
- }
165
- if (body.installNotes) {
166
- console.log("");
167
- console.log(body.installNotes);
168
- }
169
- }
170
- async function updateSkill(args) {
171
- const { positional, flags } = parseArgs(args, {
172
- mind: { type: "string" },
173
- all: { type: "boolean" }
174
- });
175
- const mindName = resolveMindName(flags);
176
- if (flags.all) {
177
- const client = getClient();
178
- const listUrl = urlOf(client.api.minds[":name"].skills.$url({ param: { name: mindName } }));
179
- const listRes = await daemonFetch(listUrl);
180
- if (!listRes.ok) {
181
- const body = await listRes.json().catch(() => ({ error: "Unknown error" }));
182
- console.error(`Error: ${body.error}`);
183
- process.exit(1);
184
- }
185
- const skills = await listRes.json();
186
- const updatable = skills.filter((s) => s.updateAvailable && s.upstream);
187
- if (updatable.length === 0) {
188
- console.log("All skills are up to date.");
189
- return;
190
- }
191
- let failures = 0;
192
- for (const s of updatable) {
193
- const ok2 = await doUpdate(mindName, s.id);
194
- if (!ok2) failures++;
195
- }
196
- if (failures > 0) process.exit(1);
197
- return;
198
- }
199
- const skillId = positional[0];
200
- if (!skillId) {
201
- console.error("Usage: volute skill update <name> [--mind <name>] [--all]");
202
- process.exit(1);
203
- }
204
- const ok = await doUpdate(mindName, skillId);
205
- if (!ok) process.exit(1);
206
- }
207
- async function doUpdate(mindName, skillId) {
208
- const client = getClient();
209
- const url = urlOf(client.api.minds[":name"].skills.update.$url({ param: { name: mindName } }));
210
- const res = await daemonFetch(url, {
211
- method: "POST",
212
- headers: { "Content-Type": "application/json" },
213
- body: JSON.stringify({ skillId })
214
- });
215
- if (!res.ok) {
216
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
217
- console.error(`Error updating ${skillId}: ${body.error}`);
218
- return false;
219
- }
220
- const result = await res.json();
221
- switch (result.status) {
222
- case "up-to-date":
223
- console.log(`${skillId}: already up to date.`);
224
- break;
225
- case "updated":
226
- console.log(`${skillId}: updated successfully.`);
227
- break;
228
- case "conflict":
229
- console.log(`${skillId}: updated with conflicts in:`);
230
- for (const f of result.conflictFiles ?? []) {
231
- console.log(` ${f}`);
232
- }
233
- console.log("Resolve conflicts and commit manually.");
234
- break;
235
- }
236
- return true;
237
- }
238
- async function publishSkill(args) {
239
- const { positional, flags } = parseArgs(args, { mind: { type: "string" } });
240
- const mindName = resolveMindName(flags);
241
- const skillId = positional[0];
242
- if (!skillId) {
243
- console.error("Usage: volute skill publish <name> [--mind <name>]");
244
- process.exit(1);
245
- }
246
- const client = getClient();
247
- const url = urlOf(client.api.minds[":name"].skills.publish.$url({ param: { name: mindName } }));
248
- const res = await daemonFetch(url, {
249
- method: "POST",
250
- headers: { "Content-Type": "application/json" },
251
- body: JSON.stringify({ skillId })
252
- });
253
- if (!res.ok) {
254
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
255
- console.error(`Error: ${body.error}`);
256
- process.exit(1);
257
- }
258
- const skill = await res.json();
259
- console.log(`Published skill "${skillId}" (v${skill.version}).`);
260
- }
261
- async function removeSkill(args) {
262
- const { positional } = parseArgs(args, {});
263
- const id = positional[0];
264
- if (!id) {
265
- console.error("Usage: volute skill remove <name>");
266
- process.exit(1);
267
- }
268
- const client = getClient();
269
- const url = urlOf(client.api.skills[":id"].$url({ param: { id } }));
270
- const res = await daemonFetch(url, { method: "DELETE" });
271
- if (!res.ok) {
272
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
273
- console.error(`Error: ${body.error}`);
274
- process.exit(1);
275
- }
276
- console.log(`Removed shared skill "${id}".`);
277
- }
278
- async function manageDefaults(args) {
279
- const action = args[0];
280
- if (!action || action === "list") {
281
- const res = await daemonFetch("/api/skills/defaults/list");
282
- if (!res.ok) {
283
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
284
- console.error(`Error: ${body.error}`);
285
- process.exit(1);
286
- }
287
- const { skills } = await res.json();
288
- console.log("Default skills for new minds:\n");
289
- for (const s of skills) {
290
- console.log(` ${s}`);
291
- }
292
- return;
293
- }
294
- if (action === "add") {
295
- const skillId = args[1];
296
- if (!skillId) {
297
- console.error("Usage: volute skill defaults add <name>");
298
- process.exit(1);
299
- }
300
- const res = await daemonFetch("/api/skills/defaults/list", {
301
- method: "POST",
302
- headers: { "Content-Type": "application/json" },
303
- body: JSON.stringify({ skill: skillId })
304
- });
305
- if (!res.ok) {
306
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
307
- console.error(`Error: ${body.error}`);
308
- process.exit(1);
309
- }
310
- console.log(`Added "${skillId}" to default skills.`);
311
- return;
312
- }
313
- if (action === "remove") {
314
- const skillId = args[1];
315
- if (!skillId) {
316
- console.error("Usage: volute skill defaults remove <name>");
317
- process.exit(1);
318
- }
319
- const res = await daemonFetch(`/api/skills/defaults/list/${encodeURIComponent(skillId)}`, {
320
- method: "DELETE"
321
- });
322
- if (!res.ok) {
323
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
324
- console.error(`Error: ${body.error}`);
325
- process.exit(1);
326
- }
327
- console.log(`Removed "${skillId}" from default skills.`);
328
- return;
329
- }
330
- console.error(`Unknown defaults action: ${action}`);
331
- console.log("Usage: volute skill defaults [add|remove] [<name>]");
332
- process.exit(1);
333
- }
334
- async function uninstallSkill(args) {
335
- const { positional, flags } = parseArgs(args, { mind: { type: "string" } });
336
- const mindName = resolveMindName(flags);
337
- const skillId = positional[0];
338
- if (!skillId) {
339
- console.error("Usage: volute skill uninstall <name> [--mind <name>]");
340
- process.exit(1);
341
- }
342
- const client = getClient();
343
- const url = urlOf(
344
- client.api.minds[":name"].skills[":skill"].$url({
345
- param: { name: mindName, skill: skillId }
346
- })
347
- );
348
- const res = await daemonFetch(url, { method: "DELETE" });
349
- if (!res.ok) {
350
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
351
- console.error(`Error: ${body.error}`);
352
- process.exit(1);
353
- }
354
- console.log(`Uninstalled skill "${skillId}" from ${mindName}.`);
355
- }
356
- export {
357
- run
358
- };
@@ -1,44 +0,0 @@
1
- ---
2
- name: Shared Files
3
- description: This skill should be used when working with shared files, the shared folder, collaborating with other minds, sharing files between minds, merging shared changes, pulling shared updates, or checking shared status.
4
- ---
5
-
6
- # Shared Files
7
-
8
- The `shared/` folder in your home directory is a collaborative space backed by a git repo. Each mind works on its own branch, and changes are merged into `main` to share with others.
9
-
10
- ## Before working
11
-
12
- Pull the latest changes from main before starting work:
13
-
14
- ```bash
15
- tsx .claude/skills/shared-files/scripts/pull.ts
16
- ```
17
-
18
- ## Reading and writing files
19
-
20
- Just use files in `shared/` normally — they auto-commit like everything else in your home directory.
21
-
22
- ## Merging your changes to main
23
-
24
- When you're ready to share your work with other minds:
25
-
26
- ```bash
27
- tsx .claude/skills/shared-files/scripts/merge.ts "description of changes"
28
- ```
29
-
30
- This squash-merges your branch into main and resets your branch to the new main. If there are conflicts, pull first, reconcile, and try again.
31
-
32
- ## Viewing history
33
-
34
- ```bash
35
- git -C shared log --oneline main
36
- ```
37
-
38
- ## Checking status
39
-
40
- See what you've changed compared to main:
41
-
42
- ```bash
43
- git -C shared diff main...HEAD --stat
44
- ```
@@ -1,72 +0,0 @@
1
- #!/usr/bin/env tsx
2
- /**
3
- * Merge the mind's shared branch into main via the daemon API.
4
- * Usage: tsx merge.ts "commit message"
5
- */
6
- import { execFileSync } from "node:child_process";
7
- import { resolve } from "node:path";
8
-
9
- const message = process.argv[2];
10
- if (!message) {
11
- console.error('Usage: tsx merge.ts "commit message"');
12
- process.exit(1);
13
- }
14
-
15
- const mind = process.env.VOLUTE_MIND;
16
- const port = process.env.VOLUTE_DAEMON_PORT;
17
- const token = process.env.VOLUTE_DAEMON_TOKEN;
18
-
19
- if (!mind || !port || !token) {
20
- console.error("Missing VOLUTE_MIND, VOLUTE_DAEMON_PORT, or VOLUTE_DAEMON_TOKEN");
21
- process.exit(1);
22
- }
23
-
24
- // Commit any pending changes in the worktree first
25
- const worktree = resolve("shared");
26
- try {
27
- const status = execFileSync("git", ["status", "--porcelain"], {
28
- cwd: worktree,
29
- encoding: "utf-8",
30
- }).trim();
31
- if (status) {
32
- execFileSync("git", ["add", "-A"], { cwd: worktree, stdio: "ignore" });
33
- execFileSync("git", ["commit", "--author", `${mind} <${mind}@volute>`, "-m", `wip: ${mind}`], {
34
- cwd: worktree,
35
- stdio: "ignore",
36
- });
37
- }
38
- } catch (err) {
39
- const msg = err instanceof Error ? err.message : String(err);
40
- console.error(`Failed to commit pending changes in shared worktree: ${msg}`);
41
- process.exit(1);
42
- }
43
-
44
- // Call daemon merge endpoint
45
- const url = `http://localhost:${port}/api/minds/${encodeURIComponent(mind)}/shared/merge`;
46
- let res: Response;
47
- try {
48
- res = await fetch(url, {
49
- method: "POST",
50
- headers: {
51
- "Content-Type": "application/json",
52
- Authorization: `Bearer ${token}`,
53
- },
54
- body: JSON.stringify({ message }),
55
- });
56
- } catch {
57
- console.error(`Failed to reach daemon at localhost:${port} — is the daemon running?`);
58
- process.exit(1);
59
- }
60
-
61
- if (!res.ok) {
62
- const body = (await res.json().catch(() => ({}))) as { error?: string };
63
- console.error(body.error ?? `Server responded with ${res.status}`);
64
- process.exit(1);
65
- }
66
-
67
- const result = (await res.json()) as { ok: boolean; conflicts?: boolean; message?: string };
68
- if (result.conflicts) {
69
- console.error("Merge conflicts detected. Pull the latest changes, reconcile, and try again.");
70
- process.exit(1);
71
- }
72
- console.log(result.message ?? "Merged successfully.");
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env tsx
2
- /**
3
- * Pull latest shared changes by rebasing onto main.
4
- * Usage: tsx pull.ts
5
- */
6
- import { execFileSync } from "node:child_process";
7
- import { resolve } from "node:path";
8
-
9
- const mind = process.env.VOLUTE_MIND;
10
- if (!mind) {
11
- console.error("Missing VOLUTE_MIND env var");
12
- process.exit(1);
13
- }
14
-
15
- const worktree = resolve("shared");
16
-
17
- // Commit any pending changes first
18
- try {
19
- const status = execFileSync("git", ["status", "--porcelain"], {
20
- cwd: worktree,
21
- encoding: "utf-8",
22
- }).trim();
23
- if (status) {
24
- execFileSync("git", ["add", "-A"], { cwd: worktree, stdio: "ignore" });
25
- execFileSync("git", ["commit", "--author", `${mind} <${mind}@volute>`, "-m", `wip: ${mind}`], {
26
- cwd: worktree,
27
- stdio: "ignore",
28
- });
29
- }
30
- } catch (err) {
31
- const msg = err instanceof Error ? err.message : String(err);
32
- console.error(`Failed to commit pending changes in shared worktree: ${msg}`);
33
- process.exit(1);
34
- }
35
-
36
- // Rebase onto main
37
- try {
38
- execFileSync("git", ["rebase", "main"], { cwd: worktree, stdio: "ignore" });
39
- console.log("Pulled latest shared changes.");
40
- } catch {
41
- // Abort failed rebase
42
- try {
43
- execFileSync("git", ["rebase", "--abort"], { cwd: worktree, stdio: "ignore" });
44
- } catch {
45
- console.error("Rebase failed and abort failed — shared worktree may need manual repair.");
46
- process.exit(1);
47
- }
48
- console.error(
49
- "Rebase failed — your branch conflicts with main. Resolve the conflicting files and commit, then pull again.",
50
- );
51
- process.exit(1);
52
- }
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- SleepManager,
4
- getSleepManager,
5
- getSleepManagerIfReady,
6
- initSleepManager,
7
- matchesGlob
8
- } from "./chunk-3Z2DPESO.js";
9
- import "./chunk-SKLSMHXO.js";
10
- import "./chunk-LOEJ4HPQ.js";
11
- import "./chunk-RVGLDGMI.js";
12
- import "./chunk-GY5HBI7A.js";
13
- import "./chunk-7J3HEVR7.js";
14
- import "./chunk-G53F3JA4.js";
15
- import "./chunk-OYAKCAVY.js";
16
- import "./chunk-2NGTS5UU.js";
17
- import "./chunk-A2A4KLFE.js";
18
- import "./chunk-PB65JZK2.js";
19
- import "./chunk-JYVGHWEJ.js";
20
- import "./chunk-KVK2DLWI.js";
21
- import "./chunk-C7I35G4R.js";
22
- import "./chunk-QTUVYI7W.js";
23
- import "./chunk-YUIHSKR6.js";
24
- import "./chunk-KIEPMIM5.js";
25
- import "./chunk-VH33ZWMW.js";
26
- import "./chunk-N432I7QH.js";
27
- import "./chunk-LRCG2JLP.js";
28
- import "./chunk-RPZZSXV3.js";
29
- import "./chunk-K3NQKI34.js";
30
- export {
31
- SleepManager,
32
- getSleepManager,
33
- getSleepManagerIfReady,
34
- initSleepManager,
35
- matchesGlob
36
- };
@@ -1,23 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ensureSpiritProject,
4
- getSpiritModel,
5
- spiritDir,
6
- syncSpiritTemplate
7
- } from "./chunk-7J3HEVR7.js";
8
- import "./chunk-G53F3JA4.js";
9
- import "./chunk-C7I35G4R.js";
10
- import "./chunk-QTUVYI7W.js";
11
- import "./chunk-YUIHSKR6.js";
12
- import "./chunk-KIEPMIM5.js";
13
- import "./chunk-VH33ZWMW.js";
14
- import "./chunk-N432I7QH.js";
15
- import "./chunk-LRCG2JLP.js";
16
- import "./chunk-RPZZSXV3.js";
17
- import "./chunk-K3NQKI34.js";
18
- export {
19
- ensureSpiritProject,
20
- getSpiritModel,
21
- spiritDir,
22
- syncSpiritTemplate
23
- };
@@ -1,63 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- resolveMindName
4
- } from "./chunk-NAOW2CLO.js";
5
- import {
6
- parseArgs
7
- } from "./chunk-D424ZQGI.js";
8
- import "./chunk-K3NQKI34.js";
9
-
10
- // src/commands/split.ts
11
- async function run(args) {
12
- const { positional, flags } = parseArgs(args, {
13
- from: { type: "string" },
14
- soul: { type: "string" },
15
- port: { type: "number" },
16
- "no-start": { type: "boolean" },
17
- json: { type: "boolean" }
18
- });
19
- const mindName = resolveMindName({ mind: flags.from });
20
- const variantName = positional[0];
21
- const { soul, port, json } = flags;
22
- const noStart = flags["no-start"];
23
- if (!variantName) {
24
- console.error(
25
- 'Usage: volute mind split <name> [--from <mind>] [--soul "..."] [--port N] [--no-start] [--json]'
26
- );
27
- process.exit(1);
28
- }
29
- if (!json) console.log("Creating variant via daemon...");
30
- const { daemonFetch } = await import("./daemon-client-6QXHZ7US.js");
31
- const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
32
- const client = getClient();
33
- const res = await daemonFetch(
34
- urlOf(client.api.minds[":name"].variants.$url({ param: { name: mindName } })),
35
- {
36
- method: "POST",
37
- headers: { "Content-Type": "application/json" },
38
- body: JSON.stringify({
39
- name: variantName,
40
- ...soul && { soul },
41
- ...port && { port },
42
- ...noStart && { noStart }
43
- })
44
- }
45
- );
46
- const data = await res.json();
47
- if (!res.ok) {
48
- console.error(data.error ?? "Failed to create variant");
49
- process.exit(1);
50
- }
51
- if (json) {
52
- console.log(JSON.stringify(data.variant, null, 2));
53
- } else {
54
- console.log(`
55
- Variant created: ${variantName}`);
56
- console.log(` Branch: ${data.variant?.branch}`);
57
- console.log(` Path: ${data.variant?.path}`);
58
- console.log(` Port: ${data.variant?.port}`);
59
- }
60
- }
61
- export {
62
- run
63
- };
@@ -1,33 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- getClient,
4
- urlOf
5
- } from "./chunk-4RQBJWQX.js";
6
- import {
7
- daemonFetch
8
- } from "./chunk-UKVWJRKN.js";
9
- import "./chunk-LRCG2JLP.js";
10
- import "./chunk-RPZZSXV3.js";
11
- import "./chunk-K3NQKI34.js";
12
-
13
- // src/commands/start.ts
14
- async function run(args) {
15
- const name = args[0];
16
- if (!name) {
17
- console.error("Usage: volute mind start <name>");
18
- process.exit(1);
19
- }
20
- const client = getClient();
21
- const res = await daemonFetch(urlOf(client.api.minds[":name"].start.$url({ param: { name } })), {
22
- method: "POST"
23
- });
24
- const data = await res.json();
25
- if (!res.ok) {
26
- console.error(data.error || "Failed to start mind");
27
- process.exit(1);
28
- }
29
- console.log(`${name} started on port ${data.port}`);
30
- }
31
- export {
32
- run
33
- };