volute 0.34.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 (209) hide show
  1. package/README.md +7 -6
  2. package/dist/accept-ZBDVVCEU.js +42 -0
  3. package/dist/{activity-events-BN7V6KCC.js → activity-events-ZW4SDL2C.js} +4 -4
  4. package/dist/{ai-service-PSILB5WD.js → ai-service-LURBEDDB.js} +5 -5
  5. package/dist/{api-client-XUXOB7LI.js → api-client-3A77HMH7.js} +1 -1
  6. package/dist/api.d.ts +1 -5618
  7. package/dist/{archive-C2VEMQOR.js → archive-ESU2FUN4.js} +3 -3
  8. package/dist/{auth-ZFZXJZDQ.js → auth-WX4TESEI.js} +5 -5
  9. package/dist/bridge-PXIO6PS2.js +206 -0
  10. package/dist/chat-QXAJF3FU.js +51 -0
  11. package/dist/{chunk-7F2SW2KD.js → chunk-2TGZJFAT.js} +3 -3
  12. package/dist/{chunk-6LXAAQ43.js → chunk-33ODGMFZ.js} +1 -1
  13. package/dist/{chunk-4JSR7YO7.js → chunk-5N7Y5WAM.js} +1 -1
  14. package/dist/{chunk-FYCALD4Q.js → chunk-5T5YMX6S.js} +1 -1
  15. package/dist/{chunk-B2BVAIZ4.js → chunk-5XJYUFZH.js} +21 -15
  16. package/dist/{chunk-M3K5AARV.js → chunk-A2ZLHBHG.js} +2 -2
  17. package/dist/{chunk-U5BTYSAL.js → chunk-AN2W47GW.js} +2 -2
  18. package/dist/{chunk-G53F3JA4.js → chunk-AOB6GVRM.js} +1 -1
  19. package/dist/{chunk-N7BLAHNE.js → chunk-BDYXIWA5.js} +5 -5
  20. package/dist/{chunk-YUIHSKR6.js → chunk-BKF4WQCY.js} +2 -2
  21. package/dist/{chunk-6OWJXUAR.js → chunk-BMZQYACC.js} +2 -2
  22. package/dist/{chunk-NAOW2CLO.js → chunk-BTY4WNFE.js} +1 -1
  23. package/dist/{chunk-MLOQKQNB.js → chunk-BV65KRHM.js} +2 -2
  24. package/dist/{chunk-XWXBJQBE.js → chunk-CORXD635.js} +4 -4
  25. package/dist/{chunk-PVY5W6QN.js → chunk-F7ZNLYKZ.js} +2 -2
  26. package/dist/{chunk-BFWHBQK4.js → chunk-FT5KETXZ.js} +3 -3
  27. package/dist/{chunk-N3DNFPVA.js → chunk-IJHIXLVN.js} +8 -8
  28. package/dist/{chunk-V6ZCNULL.js → chunk-J6CJQDWI.js} +37 -28
  29. package/dist/{chunk-4RQBJWQX.js → chunk-LOPXTW6H.js} +1 -1
  30. package/dist/{chunk-47ZPNLF4.js → chunk-MDJGMOSD.js} +8 -137
  31. package/dist/{chunk-BTWAGDV5.js → chunk-N446KRP7.js} +3 -3
  32. package/dist/{chunk-6WAWMWR5.js → chunk-N5LMGYXX.js} +2 -2
  33. package/dist/{chunk-G6BSYHPK.js → chunk-NJK5SDGR.js} +1 -1
  34. package/dist/{chunk-D424ZQGI.js → chunk-O7IGP7ZW.js} +11 -3
  35. package/dist/{chunk-2IOP6PHB.js → chunk-OTC67N2Z.js} +2 -2
  36. package/dist/{chunk-V45JXOWY.js → chunk-PWQ2ITYG.js} +4 -4
  37. package/dist/{chunk-KTLFDYPT.js → chunk-QCH6K235.js} +1 -1
  38. package/dist/chunk-QHG4OMZL.js +145 -0
  39. package/dist/{chunk-IS7WJ56Q.js → chunk-QWTR6AWZ.js} +3 -3
  40. package/dist/chunk-TXSA4Q3V.js +116 -0
  41. package/dist/{chunk-BDK73LK6.js → chunk-VHJRZM2S.js} +2 -2
  42. package/dist/{chunk-SSI47XP2.js → chunk-VHWGEJ4V.js} +1 -1
  43. package/dist/chunk-VY3RB2V7.js +164 -0
  44. package/dist/chunk-WJPROOU5.js +8314 -0
  45. package/dist/{chunk-E5C7OWZ2.js → chunk-WZRZFFCL.js} +8 -8
  46. package/dist/{chunk-BM474GX6.js → chunk-XRQSAMX2.js} +4 -4
  47. package/dist/{chunk-OYAKCAVY.js → chunk-ZSR72JB3.js} +1 -1
  48. package/dist/{chunk-PLDWHR4D.js → chunk-ZX7EAV5J.js} +17 -7
  49. package/dist/cli.js +90 -29
  50. package/dist/clock-HSEKS5AR.js +289 -0
  51. package/dist/{cloud-sync-TG3TIX5H.js → cloud-sync-6JL4C24T.js} +21 -22
  52. package/dist/config-UTS7QULS.js +76 -0
  53. package/dist/connectors/discord-bridge.js +3 -3
  54. package/dist/connectors/slack-bridge.js +3 -3
  55. package/dist/connectors/telegram-bridge.js +3 -3
  56. package/dist/{conversations-HL2JP5GI.js → conversations-2PW57WO2.js} +5 -5
  57. package/dist/create-5BPOOJAN.js +75 -0
  58. package/dist/create-UVCK2CS6.js +50 -0
  59. package/dist/daemon-client-RVIKXGFQ.js +12 -0
  60. package/dist/daemon-restart-HSZ3BCX5.js +65 -0
  61. package/dist/daemon.js +845 -1766
  62. package/dist/{db-PLEDCBHZ.js → db-BDMH4SZ2.js} +7 -3
  63. package/dist/{db-RYX3SS2W.js → db-BVBJ57TU.js} +2 -2
  64. package/dist/delete-L5PAVDGQ.js +42 -0
  65. package/dist/delivery-manager-H5ZVBMCQ.js +31 -0
  66. package/dist/{delivery-router-D5ELDMS2.js → delivery-router-HEJSJAHQ.js} +4 -4
  67. package/dist/down-74VXM45A.js +17 -0
  68. package/dist/env-E4XHO2BI.js +223 -0
  69. package/dist/{exec-DVLXKRIO.js → exec-PY7THYH4.js} +4 -4
  70. package/dist/export-OAS6QVBN.js +113 -0
  71. package/dist/{extension-PM42QCID.js → extension-D74CNM7G.js} +25 -33
  72. package/dist/{extensions-BBGVL5JC.js → extensions-XDDFY72A.js} +22 -11
  73. package/dist/files-CWTK6V3H.js +53 -0
  74. package/dist/import-5A3T7QV4.js +143 -0
  75. package/dist/{isolation-62MKDZN3.js → isolation-TK5RX2WM.js} +3 -3
  76. package/dist/join-DF5XSJAC.js +67 -0
  77. package/dist/list-PDMQM7ZV.js +53 -0
  78. package/dist/login-7TE6CIZF.js +60 -0
  79. package/dist/login-GOTAYLXP.js +51 -0
  80. package/dist/logout-6KIA74EV.js +29 -0
  81. package/dist/logout-T4XS6LRU.js +50 -0
  82. package/dist/message-delivery-GRC4W6P7.js +41 -0
  83. package/dist/mind-5IEYKV7I.js +97 -0
  84. package/dist/{mind-activity-tracker-2ACNHA7B.js → mind-activity-tracker-QBLIV7ZJ.js} +5 -5
  85. package/dist/{mind-history-WOYFLQAI.js → mind-history-IE2QH7U5.js} +82 -71
  86. package/dist/mind-list-GEWHWAL4.js +38 -0
  87. package/dist/mind-manager-HFLB5653.js +31 -0
  88. package/dist/mind-profile-DCBDVF5B.js +53 -0
  89. package/dist/mind-service-X2CAA6W6.js +37 -0
  90. package/dist/mind-sleep-ITCF6OQA.js +47 -0
  91. package/dist/mind-status-X4SX3YUG.js +65 -0
  92. package/dist/mind-wake-KXMKMGWX.js +42 -0
  93. package/dist/{package-V2WHWVG6.js → package-D2FSVFAX.js} +5 -5
  94. package/dist/read-67VRP2DO.js +91 -0
  95. package/dist/{read-stdin-PIRM6A2Y.js → read-stdin-3X5VYKNS.js} +1 -1
  96. package/dist/register-SB7NXCOE.js +51 -0
  97. package/dist/{registry-UYV5S6QT.js → registry-GBSNW3HG.js} +2 -2
  98. package/dist/reject-MUR2KWJ4.js +40 -0
  99. package/dist/restart-5EGG4JXU.js +42 -0
  100. package/dist/{sandbox-SI5HMBP3.js → sandbox-R37VIU36.js} +5 -5
  101. package/dist/scheduler-Y7O4CJXL.js +31 -0
  102. package/dist/{schema-ETMABTW4.js → schema-XVZ2CLKW.js} +1 -1
  103. package/dist/{seed-WNGI6PNW.js → seed-EQORWX77.js} +2 -2
  104. package/dist/seed-check-KJNTL72M.js +35 -0
  105. package/dist/seed-cmd-ZM2XGVU2.js +30 -0
  106. package/dist/seed-create-DRWGGHEI.js +113 -0
  107. package/dist/seed-sprout-JYXGXOP3.js +148 -0
  108. package/dist/send-JBJJQ7CA.js +409 -0
  109. package/dist/service-WNPCNHOX.js +121 -0
  110. package/dist/{setup-Z3DEVWV7.js → setup-BJ4YAY26.js} +153 -127
  111. package/dist/{setup-GGMKENLN.js → setup-RHJRFURI.js} +3 -3
  112. package/dist/skill-TAAKEYBV.js +389 -0
  113. package/dist/skills/volute-mind/SKILL.md +3 -7
  114. package/dist/skills/volute-mind/references/extensions.md +8 -11
  115. package/dist/{skills-Q6VZ2UGD.js → skills-EKMCQ46K.js} +7 -7
  116. package/dist/sleep-manager-7KFK3USC.js +35 -0
  117. package/dist/spirit-ZFRDXMG7.js +23 -0
  118. package/dist/split-AWVOYOPZ.js +64 -0
  119. package/dist/{sprout-E3HJIV2Z.js → sprout-HE4TITMK.js} +2 -2
  120. package/dist/start-3UXOPXQG.js +39 -0
  121. package/dist/status-ZK34WYIM.js +125 -0
  122. package/dist/stop-3XYIBGFM.js +41 -0
  123. package/dist/system-chat-IDPHYHY4.js +35 -0
  124. package/dist/systems-O43WGQY6.js +52 -0
  125. package/dist/{tailscale-ZEUK7GKZ.js → tailscale-ZIZ2HWJ5.js} +4 -4
  126. package/dist/{template-hash-EJRTKE36.js → template-hash-A7FNHTB7.js} +2 -2
  127. package/dist/up-77ICEDEW.js +19 -0
  128. package/dist/update-ANE5ZM7F.js +225 -0
  129. package/dist/{update-check-X3YG4WVP.js → update-check-UV55CBEP.js} +3 -3
  130. package/dist/upgrade-ZMDGC7M2.js +74 -0
  131. package/dist/variant-QWL2WSRI.js +62 -0
  132. package/dist/{version-notify-YCH4UVQ2.js → version-notify-FXSEMXWW.js} +28 -27
  133. package/dist/{volute-config-WBKYJGYQ.js → volute-config-D2XVS2YI.js} +1 -1
  134. package/dist/web-assets/assets/index-BhxWKvbB.css +1 -0
  135. package/dist/web-assets/assets/index-CHVKJ9II.js +75 -0
  136. package/dist/web-assets/index.html +2 -2
  137. package/dist/web-assets/sw.js +117 -0
  138. package/package.json +5 -5
  139. package/packages/extensions/pages/dist/ui/assets/index-DKZLNMED.js +2 -0
  140. package/packages/extensions/pages/dist/ui/index.html +1 -1
  141. package/packages/extensions/pages/skills/pages/SKILL.md +84 -9
  142. package/templates/_base/src/lib/auto-commit.ts +8 -8
  143. package/templates/_base/src/lib/volute-server.ts +6 -0
  144. package/templates/claude/src/agent.ts +8 -1
  145. package/dist/accept-TW6V4WI4.js +0 -42
  146. package/dist/bridge-O753D5F4.js +0 -207
  147. package/dist/chat-BHYX7DJ4.js +0 -68
  148. package/dist/chunk-47XDEWWV.js +0 -156
  149. package/dist/chunk-CVL5IGIR.js +0 -2084
  150. package/dist/chunk-PB65JZK2.js +0 -85
  151. package/dist/chunk-TAHX36HZ.js +0 -3679
  152. package/dist/clock-3X4DSC2N.js +0 -281
  153. package/dist/config-OROA5DUA.js +0 -72
  154. package/dist/create-3SEKKI6P.js +0 -71
  155. package/dist/create-UOSOQ2HN.js +0 -44
  156. package/dist/daemon-client-WOAQXXBM.js +0 -12
  157. package/dist/daemon-restart-5ABHNXJZ.js +0 -52
  158. package/dist/delete-KYOVWR23.js +0 -35
  159. package/dist/delivery-manager-2BR5NZKF.js +0 -32
  160. package/dist/down-QVFN4UPK.js +0 -15
  161. package/dist/env-R34DT7XL.js +0 -195
  162. package/dist/export-6ZXAXATG.js +0 -112
  163. package/dist/files-VQV2VZQO.js +0 -47
  164. package/dist/import-MK2I2T6F.js +0 -23
  165. package/dist/join-DGYHTJUH.js +0 -66
  166. package/dist/list-C644WTHV.js +0 -49
  167. package/dist/login-IIGEQPHL.js +0 -47
  168. package/dist/login-KZQLMAWE.js +0 -47
  169. package/dist/logout-AGTZVRGP.js +0 -40
  170. package/dist/logout-KD6GXIJJ.js +0 -21
  171. package/dist/message-delivery-V3R6NXJP.js +0 -42
  172. package/dist/mind-BI4EPBVZ.js +0 -108
  173. package/dist/mind-list-6VPM7GUQ.js +0 -30
  174. package/dist/mind-manager-MWW3BTS4.js +0 -32
  175. package/dist/mind-profile-WPG42U5Y.js +0 -47
  176. package/dist/mind-service-VIKZJK2M.js +0 -38
  177. package/dist/mind-sleep-XDISJY74.js +0 -42
  178. package/dist/mind-status-7FTZWPZF.js +0 -56
  179. package/dist/mind-wake-KIIKEI3A.js +0 -37
  180. package/dist/read-H5C26YO7.js +0 -85
  181. package/dist/register-J27WP33N.js +0 -47
  182. package/dist/reject-OEANJYIA.js +0 -40
  183. package/dist/restart-V5EGYBJG.js +0 -33
  184. package/dist/scheduler-AGG3L2FO.js +0 -32
  185. package/dist/seed-check-PXTH7YXS.js +0 -32
  186. package/dist/seed-cmd-VENFTGS3.js +0 -36
  187. package/dist/seed-create-663ALOKH.js +0 -112
  188. package/dist/seed-sprout-EH3AGKAI.js +0 -132
  189. package/dist/send-7FUUUZZH.js +0 -386
  190. package/dist/skill-DKNYJS4P.js +0 -362
  191. package/dist/skills/shared-files/SKILL.md +0 -44
  192. package/dist/skills/shared-files/scripts/merge.ts +0 -72
  193. package/dist/skills/shared-files/scripts/pull.ts +0 -52
  194. package/dist/sleep-manager-BJK2ROPX.js +0 -36
  195. package/dist/spirit-4JP4TY4C.js +0 -23
  196. package/dist/split-3YPMS2CL.js +0 -63
  197. package/dist/start-W3TPKX4D.js +0 -33
  198. package/dist/status-4OVFXFEJ.js +0 -115
  199. package/dist/stop-GTT6YWYO.js +0 -32
  200. package/dist/system-channel-DXD2JBOU.js +0 -36
  201. package/dist/system-chat-TYLOL7SX.js +0 -36
  202. package/dist/systems-AYLO727G.js +0 -61
  203. package/dist/up-PA7F2CXE.js +0 -18
  204. package/dist/update-HG4LCUSG.js +0 -215
  205. package/dist/upgrade-YGNIDICG.js +0 -67
  206. package/dist/variant-MZUMRTQO.js +0 -41
  207. package/dist/web-assets/assets/index-DiiwC-CZ.css +0 -1
  208. package/dist/web-assets/assets/index-d6y5b9Ij.js +0 -75
  209. package/packages/extensions/pages/dist/ui/assets/index-tLTROSk5.js +0 -2
@@ -1,362 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- isCompact
4
- } from "./chunk-FYCALD4Q.js";
5
- import {
6
- resolveMindName
7
- } from "./chunk-NAOW2CLO.js";
8
- import {
9
- getClient,
10
- urlOf
11
- } from "./chunk-4RQBJWQX.js";
12
- import {
13
- parseArgs
14
- } from "./chunk-D424ZQGI.js";
15
- import {
16
- daemonFetch
17
- } from "./chunk-PLDWHR4D.js";
18
- import "./chunk-N7BLAHNE.js";
19
- import "./chunk-4JSR7YO7.js";
20
- import "./chunk-7KJOFUNN.js";
21
-
22
- // src/commands/skill.ts
23
- async function run(args) {
24
- const subcommand = args[0];
25
- switch (subcommand) {
26
- case "list":
27
- await listSkills(args.slice(1));
28
- break;
29
- case "info":
30
- await infoSkill(args.slice(1));
31
- break;
32
- case "install":
33
- await installSkill(args.slice(1));
34
- break;
35
- case "update":
36
- await updateSkill(args.slice(1));
37
- break;
38
- case "publish":
39
- await publishSkill(args.slice(1));
40
- break;
41
- case "remove":
42
- await removeSkill(args.slice(1));
43
- break;
44
- case "uninstall":
45
- await uninstallSkill(args.slice(1));
46
- break;
47
- case "defaults":
48
- await manageDefaults(args.slice(1));
49
- break;
50
- case "--help":
51
- case "-h":
52
- case void 0:
53
- printUsage();
54
- break;
55
- default:
56
- console.error(`Unknown subcommand: ${subcommand}`);
57
- printUsage();
58
- process.exit(1);
59
- }
60
- }
61
- function printUsage() {
62
- console.log(`Usage:
63
- volute skill list List shared skills available to install
64
- volute skill list --mind <name> List installed skills for a mind
65
- volute skill info <name> Show details of a shared skill
66
- volute skill install <name> --mind Install a shared skill into a mind
67
- volute skill update <name> --mind Update an installed skill (3-way merge)
68
- volute skill update --all --mind Update all installed skills
69
- volute skill publish <name> --mind Publish a mind's skill to the shared repository
70
- volute skill remove <name> Remove a shared skill
71
- volute skill uninstall <name> --mind Uninstall a skill from a mind
72
- volute skill defaults List default skills for new minds
73
- volute skill defaults add <name> Add a skill to the default set
74
- volute skill defaults remove <name> Remove a skill from the default set`);
75
- }
76
- async function listSkills(args) {
77
- const { flags } = parseArgs(args, { mind: { type: "string" } });
78
- if (flags.mind || process.env.VOLUTE_MIND) {
79
- const mindName = resolveMindName(flags);
80
- const client = getClient();
81
- const url = urlOf(client.api.minds[":name"].skills.$url({ param: { name: mindName } }));
82
- const res = await daemonFetch(url);
83
- if (!res.ok) {
84
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
85
- console.error(`Error: ${body.error}`);
86
- process.exit(1);
87
- }
88
- const skills = await res.json();
89
- if (skills.length === 0) {
90
- console.log("No skills installed.");
91
- return;
92
- }
93
- const compact = isCompact();
94
- console.log(`Skills for ${mindName}:${compact ? "" : "\n"}`);
95
- for (const s of skills) {
96
- const update = s.updateAvailable ? " (update available)" : "";
97
- const source = s.upstream ? ` [shared:${s.upstream.source} v${s.upstream.version}]` : "";
98
- console.log(` ${s.id} \u2014 ${s.name}${source}${update}`);
99
- }
100
- } else {
101
- const client = getClient();
102
- const url = urlOf(client.api.skills.$url());
103
- const res = await daemonFetch(url);
104
- if (!res.ok) {
105
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
106
- console.error(`Error: ${body.error}`);
107
- process.exit(1);
108
- }
109
- const skills = await res.json();
110
- if (skills.length === 0) {
111
- console.log("No shared skills available.");
112
- return;
113
- }
114
- const compact = isCompact();
115
- console.log(`Shared skills:${compact ? "" : "\n"}`);
116
- for (const s of skills) {
117
- console.log(` ${s.id} \u2014 ${s.name} (v${s.version}, by ${s.author})`);
118
- if (s.description && !compact) console.log(` ${s.description}`);
119
- }
120
- }
121
- }
122
- async function infoSkill(args) {
123
- const { positional } = parseArgs(args, {});
124
- const id = positional[0];
125
- if (!id) {
126
- console.error("Usage: volute skill info <name>");
127
- process.exit(1);
128
- }
129
- const client = getClient();
130
- const url = urlOf(client.api.skills[":id"].$url({ param: { id } }));
131
- const res = await daemonFetch(url);
132
- if (!res.ok) {
133
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
134
- console.error(`Error: ${body.error}`);
135
- process.exit(1);
136
- }
137
- const skill = await res.json();
138
- console.log(`${skill.name} (${skill.id})`);
139
- console.log(` Version: ${skill.version}`);
140
- console.log(` Author: ${skill.author}`);
141
- if (skill.description) console.log(` Description: ${skill.description}`);
142
- console.log(` Files: ${skill.files.join(", ")}`);
143
- }
144
- async function installSkill(args) {
145
- const { positional, flags } = parseArgs(args, { mind: { type: "string" } });
146
- const mindName = resolveMindName(flags);
147
- const skillId = positional[0];
148
- if (!skillId) {
149
- console.error("Usage: volute skill install <name> [--mind <name>]");
150
- process.exit(1);
151
- }
152
- const client = getClient();
153
- const url = urlOf(client.api.minds[":name"].skills.install.$url({ param: { name: mindName } }));
154
- const res = await daemonFetch(url, {
155
- method: "POST",
156
- headers: { "Content-Type": "application/json" },
157
- body: JSON.stringify({ skillId })
158
- });
159
- if (!res.ok) {
160
- const body2 = await res.json().catch(() => ({ error: "Unknown error" }));
161
- console.error(`Error: ${body2.error}`);
162
- process.exit(1);
163
- }
164
- const body = await res.json().catch(() => ({}));
165
- console.log(`Installed skill "${skillId}" into ${mindName}.`);
166
- if (body.npmInstalled?.length) {
167
- console.log(`Installed npm dependencies: ${body.npmInstalled.join(", ")}`);
168
- }
169
- if (body.installNotes) {
170
- console.log("");
171
- console.log(body.installNotes);
172
- }
173
- }
174
- async function updateSkill(args) {
175
- const { positional, flags } = parseArgs(args, {
176
- mind: { type: "string" },
177
- all: { type: "boolean" }
178
- });
179
- const mindName = resolveMindName(flags);
180
- if (flags.all) {
181
- const client = getClient();
182
- const listUrl = urlOf(client.api.minds[":name"].skills.$url({ param: { name: mindName } }));
183
- const listRes = await daemonFetch(listUrl);
184
- if (!listRes.ok) {
185
- const body = await listRes.json().catch(() => ({ error: "Unknown error" }));
186
- console.error(`Error: ${body.error}`);
187
- process.exit(1);
188
- }
189
- const skills = await listRes.json();
190
- const updatable = skills.filter((s) => s.updateAvailable && s.upstream);
191
- if (updatable.length === 0) {
192
- console.log("All skills are up to date.");
193
- return;
194
- }
195
- let failures = 0;
196
- for (const s of updatable) {
197
- const ok2 = await doUpdate(mindName, s.id);
198
- if (!ok2) failures++;
199
- }
200
- if (failures > 0) process.exit(1);
201
- return;
202
- }
203
- const skillId = positional[0];
204
- if (!skillId) {
205
- console.error("Usage: volute skill update <name> [--mind <name>] [--all]");
206
- process.exit(1);
207
- }
208
- const ok = await doUpdate(mindName, skillId);
209
- if (!ok) process.exit(1);
210
- }
211
- async function doUpdate(mindName, skillId) {
212
- const client = getClient();
213
- const url = urlOf(client.api.minds[":name"].skills.update.$url({ param: { name: mindName } }));
214
- const res = await daemonFetch(url, {
215
- method: "POST",
216
- headers: { "Content-Type": "application/json" },
217
- body: JSON.stringify({ skillId })
218
- });
219
- if (!res.ok) {
220
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
221
- console.error(`Error updating ${skillId}: ${body.error}`);
222
- return false;
223
- }
224
- const result = await res.json();
225
- switch (result.status) {
226
- case "up-to-date":
227
- console.log(`${skillId}: already up to date.`);
228
- break;
229
- case "updated":
230
- console.log(`${skillId}: updated successfully.`);
231
- break;
232
- case "conflict":
233
- console.log(`${skillId}: updated with conflicts in:`);
234
- for (const f of result.conflictFiles ?? []) {
235
- console.log(` ${f}`);
236
- }
237
- console.log("Resolve conflicts and commit manually.");
238
- break;
239
- }
240
- return true;
241
- }
242
- async function publishSkill(args) {
243
- const { positional, flags } = parseArgs(args, { mind: { type: "string" } });
244
- const mindName = resolveMindName(flags);
245
- const skillId = positional[0];
246
- if (!skillId) {
247
- console.error("Usage: volute skill publish <name> [--mind <name>]");
248
- process.exit(1);
249
- }
250
- const client = getClient();
251
- const url = urlOf(client.api.minds[":name"].skills.publish.$url({ param: { name: mindName } }));
252
- const res = await daemonFetch(url, {
253
- method: "POST",
254
- headers: { "Content-Type": "application/json" },
255
- body: JSON.stringify({ skillId })
256
- });
257
- if (!res.ok) {
258
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
259
- console.error(`Error: ${body.error}`);
260
- process.exit(1);
261
- }
262
- const skill = await res.json();
263
- console.log(`Published skill "${skillId}" (v${skill.version}).`);
264
- }
265
- async function removeSkill(args) {
266
- const { positional } = parseArgs(args, {});
267
- const id = positional[0];
268
- if (!id) {
269
- console.error("Usage: volute skill remove <name>");
270
- process.exit(1);
271
- }
272
- const client = getClient();
273
- const url = urlOf(client.api.skills[":id"].$url({ param: { id } }));
274
- const res = await daemonFetch(url, { method: "DELETE" });
275
- if (!res.ok) {
276
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
277
- console.error(`Error: ${body.error}`);
278
- process.exit(1);
279
- }
280
- console.log(`Removed shared skill "${id}".`);
281
- }
282
- async function manageDefaults(args) {
283
- const action = args[0];
284
- if (!action || action === "list") {
285
- const res = await daemonFetch("/api/skills/defaults/list");
286
- if (!res.ok) {
287
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
288
- console.error(`Error: ${body.error}`);
289
- process.exit(1);
290
- }
291
- const { skills } = await res.json();
292
- console.log("Default skills for new minds:\n");
293
- for (const s of skills) {
294
- console.log(` ${s}`);
295
- }
296
- return;
297
- }
298
- if (action === "add") {
299
- const skillId = args[1];
300
- if (!skillId) {
301
- console.error("Usage: volute skill defaults add <name>");
302
- process.exit(1);
303
- }
304
- const res = await daemonFetch("/api/skills/defaults/list", {
305
- method: "POST",
306
- headers: { "Content-Type": "application/json" },
307
- body: JSON.stringify({ skill: skillId })
308
- });
309
- if (!res.ok) {
310
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
311
- console.error(`Error: ${body.error}`);
312
- process.exit(1);
313
- }
314
- console.log(`Added "${skillId}" to default skills.`);
315
- return;
316
- }
317
- if (action === "remove") {
318
- const skillId = args[1];
319
- if (!skillId) {
320
- console.error("Usage: volute skill defaults remove <name>");
321
- process.exit(1);
322
- }
323
- const res = await daemonFetch(`/api/skills/defaults/list/${encodeURIComponent(skillId)}`, {
324
- method: "DELETE"
325
- });
326
- if (!res.ok) {
327
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
328
- console.error(`Error: ${body.error}`);
329
- process.exit(1);
330
- }
331
- console.log(`Removed "${skillId}" from default skills.`);
332
- return;
333
- }
334
- console.error(`Unknown defaults action: ${action}`);
335
- console.log("Usage: volute skill defaults [add|remove] [<name>]");
336
- process.exit(1);
337
- }
338
- async function uninstallSkill(args) {
339
- const { positional, flags } = parseArgs(args, { mind: { type: "string" } });
340
- const mindName = resolveMindName(flags);
341
- const skillId = positional[0];
342
- if (!skillId) {
343
- console.error("Usage: volute skill uninstall <name> [--mind <name>]");
344
- process.exit(1);
345
- }
346
- const client = getClient();
347
- const url = urlOf(
348
- client.api.minds[":name"].skills[":skill"].$url({
349
- param: { name: mindName, skill: skillId }
350
- })
351
- );
352
- const res = await daemonFetch(url, { method: "DELETE" });
353
- if (!res.ok) {
354
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
355
- console.error(`Error: ${body.error}`);
356
- process.exit(1);
357
- }
358
- console.log(`Uninstalled skill "${skillId}" from ${mindName}.`);
359
- }
360
- export {
361
- run
362
- };
@@ -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-TAHX36HZ.js";
9
- import "./chunk-CVL5IGIR.js";
10
- import "./chunk-B2BVAIZ4.js";
11
- import "./chunk-G53F3JA4.js";
12
- import "./chunk-N3DNFPVA.js";
13
- import "./chunk-OYAKCAVY.js";
14
- import "./chunk-V45JXOWY.js";
15
- import "./chunk-IS7WJ56Q.js";
16
- import "./chunk-BTWAGDV5.js";
17
- import "./chunk-M3K5AARV.js";
18
- import "./chunk-PB65JZK2.js";
19
- import "./chunk-BM474GX6.js";
20
- import "./chunk-E5C7OWZ2.js";
21
- import "./chunk-XWXBJQBE.js";
22
- import "./chunk-BFWHBQK4.js";
23
- import "./chunk-YUIHSKR6.js";
24
- import "./chunk-U5BTYSAL.js";
25
- import "./chunk-BDK73LK6.js";
26
- import "./chunk-6OWJXUAR.js";
27
- import "./chunk-N7BLAHNE.js";
28
- import "./chunk-4JSR7YO7.js";
29
- import "./chunk-7KJOFUNN.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-B2BVAIZ4.js";
8
- import "./chunk-G53F3JA4.js";
9
- import "./chunk-N3DNFPVA.js";
10
- import "./chunk-BFWHBQK4.js";
11
- import "./chunk-YUIHSKR6.js";
12
- import "./chunk-U5BTYSAL.js";
13
- import "./chunk-BDK73LK6.js";
14
- import "./chunk-6OWJXUAR.js";
15
- import "./chunk-N7BLAHNE.js";
16
- import "./chunk-4JSR7YO7.js";
17
- import "./chunk-7KJOFUNN.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-7KJOFUNN.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-WOAQXXBM.js");
31
- const { getClient, urlOf } = await import("./api-client-XUXOB7LI.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-PLDWHR4D.js";
9
- import "./chunk-N7BLAHNE.js";
10
- import "./chunk-4JSR7YO7.js";
11
- import "./chunk-7KJOFUNN.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
- };