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
@@ -0,0 +1,389 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ isCompact
4
+ } from "./chunk-5T5YMX6S.js";
5
+ import {
6
+ resolveMindName
7
+ } from "./chunk-BTY4WNFE.js";
8
+ import {
9
+ command,
10
+ subcommands
11
+ } from "./chunk-TXSA4Q3V.js";
12
+ import "./chunk-O7IGP7ZW.js";
13
+ import {
14
+ daemonFetch
15
+ } from "./chunk-ZX7EAV5J.js";
16
+ import {
17
+ getClient,
18
+ urlOf
19
+ } from "./chunk-LOPXTW6H.js";
20
+ import "./chunk-7KJOFUNN.js";
21
+
22
+ // packages/cli/src/commands/skill.ts
23
+ var listSkillsCmd = command({
24
+ name: "volute skill list",
25
+ description: "List skills (shared pool or per-mind)",
26
+ flags: {
27
+ mind: { type: "string", description: "Mind name (shows installed skills for mind)" }
28
+ },
29
+ run: async ({ flags }) => {
30
+ if (flags.mind || process.env.VOLUTE_MIND) {
31
+ const mindName = resolveMindName(flags);
32
+ const client = getClient();
33
+ const url = urlOf(client.api.minds[":name"].skills.$url({ param: { name: mindName } }));
34
+ const res = await daemonFetch(url);
35
+ if (!res.ok) {
36
+ const body = await res.json().catch(() => ({ error: "Unknown error" }));
37
+ console.error(`Error: ${body.error}`);
38
+ process.exit(1);
39
+ }
40
+ const skills = await res.json();
41
+ if (skills.length === 0) {
42
+ console.log("No skills installed.");
43
+ return;
44
+ }
45
+ const compact = isCompact();
46
+ console.log(`Skills for ${mindName}:${compact ? "" : "\n"}`);
47
+ for (const s of skills) {
48
+ const update = s.updateAvailable ? " (update available)" : "";
49
+ const source = s.upstream ? ` [shared:${s.upstream.source} v${s.upstream.version}]` : "";
50
+ console.log(` ${s.id} \u2014 ${s.name}${source}${update}`);
51
+ }
52
+ } else {
53
+ const client = getClient();
54
+ const url = urlOf(client.api.skills.$url());
55
+ const res = await daemonFetch(url);
56
+ if (!res.ok) {
57
+ const body = await res.json().catch(() => ({ error: "Unknown error" }));
58
+ console.error(`Error: ${body.error}`);
59
+ process.exit(1);
60
+ }
61
+ const skills = await res.json();
62
+ if (skills.length === 0) {
63
+ console.log("No shared skills available.");
64
+ return;
65
+ }
66
+ const compact = isCompact();
67
+ console.log(`Shared skills:${compact ? "" : "\n"}`);
68
+ for (const s of skills) {
69
+ console.log(` ${s.id} \u2014 ${s.name} (v${s.version}, by ${s.author})`);
70
+ if (s.description && !compact) console.log(` ${s.description}`);
71
+ }
72
+ }
73
+ }
74
+ });
75
+ var infoSkillCmd = command({
76
+ name: "volute skill info",
77
+ description: "Show details of a shared skill",
78
+ args: [{ name: "name", required: true, description: "Skill ID" }],
79
+ flags: {},
80
+ run: async ({ args }) => {
81
+ const id = args.name;
82
+ const client = getClient();
83
+ const url = urlOf(client.api.skills[":id"].$url({ param: { id } }));
84
+ const res = await daemonFetch(url);
85
+ if (!res.ok) {
86
+ const body = await res.json().catch(() => ({ error: "Unknown error" }));
87
+ console.error(`Error: ${body.error}`);
88
+ process.exit(1);
89
+ }
90
+ const skill = await res.json();
91
+ console.log(`${skill.name} (${skill.id})`);
92
+ console.log(` Version: ${skill.version}`);
93
+ console.log(` Author: ${skill.author}`);
94
+ if (skill.description) console.log(` Description: ${skill.description}`);
95
+ console.log(` Files: ${skill.files.join(", ")}`);
96
+ }
97
+ });
98
+ var installSkillCmd = command({
99
+ name: "volute skill install",
100
+ description: "Install a shared skill into a mind",
101
+ args: [{ name: "name", required: true, description: "Skill to install" }],
102
+ flags: {
103
+ mind: { type: "string", description: "Mind name" }
104
+ },
105
+ run: async ({ args, flags }) => {
106
+ const mindName = resolveMindName(flags);
107
+ const skillId = args.name;
108
+ const client = getClient();
109
+ const url = urlOf(client.api.minds[":name"].skills.install.$url({ param: { name: mindName } }));
110
+ const res = await daemonFetch(url, {
111
+ method: "POST",
112
+ headers: { "Content-Type": "application/json" },
113
+ body: JSON.stringify({ skillId })
114
+ });
115
+ if (!res.ok) {
116
+ const body2 = await res.json().catch(() => ({ error: "Unknown error" }));
117
+ console.error(`Error: ${body2.error}`);
118
+ process.exit(1);
119
+ }
120
+ const body = await res.json().catch(() => ({}));
121
+ console.log(`Installed skill "${skillId}" into ${mindName}.`);
122
+ if (body.npmInstalled?.length) {
123
+ console.log(`Installed npm dependencies: ${body.npmInstalled.join(", ")}`);
124
+ }
125
+ if (body.installNotes) {
126
+ console.log("");
127
+ console.log(body.installNotes);
128
+ }
129
+ }
130
+ });
131
+ async function doUpdate(mindName, skillId) {
132
+ const client = getClient();
133
+ const url = urlOf(client.api.minds[":name"].skills.update.$url({ param: { name: mindName } }));
134
+ const res = await daemonFetch(url, {
135
+ method: "POST",
136
+ headers: { "Content-Type": "application/json" },
137
+ body: JSON.stringify({ skillId })
138
+ });
139
+ if (!res.ok) {
140
+ const body = await res.json().catch(() => ({ error: "Unknown error" }));
141
+ console.error(`Error updating ${skillId}: ${body.error}`);
142
+ return false;
143
+ }
144
+ const result = await res.json();
145
+ switch (result.status) {
146
+ case "up-to-date":
147
+ console.log(`${skillId}: already up to date.`);
148
+ break;
149
+ case "updated":
150
+ console.log(`${skillId}: updated successfully.`);
151
+ break;
152
+ case "conflict":
153
+ console.log(`${skillId}: updated with conflicts in:`);
154
+ for (const f of result.conflictFiles ?? []) {
155
+ console.log(` ${f}`);
156
+ }
157
+ console.log("Resolve conflicts and commit manually.");
158
+ break;
159
+ }
160
+ return true;
161
+ }
162
+ var updateSkillCmd = command({
163
+ name: "volute skill update",
164
+ description: "Update an installed skill from the shared pool (3-way merge)",
165
+ args: [{ name: "name", description: "Skill to update" }],
166
+ flags: {
167
+ mind: { type: "string", description: "Mind name" },
168
+ all: { type: "boolean", description: "Update all skills" }
169
+ },
170
+ run: async ({ args, flags }) => {
171
+ const mindName = resolveMindName(flags);
172
+ if (flags.all) {
173
+ const client = getClient();
174
+ const listUrl = urlOf(client.api.minds[":name"].skills.$url({ param: { name: mindName } }));
175
+ const listRes = await daemonFetch(listUrl);
176
+ if (!listRes.ok) {
177
+ const body = await listRes.json().catch(() => ({ error: "Unknown error" }));
178
+ console.error(`Error: ${body.error}`);
179
+ process.exit(1);
180
+ }
181
+ const skills = await listRes.json();
182
+ const updatable = skills.filter((s) => s.updateAvailable && s.upstream);
183
+ if (updatable.length === 0) {
184
+ console.log("All skills are up to date.");
185
+ return;
186
+ }
187
+ let failures = 0;
188
+ for (const s of updatable) {
189
+ const ok2 = await doUpdate(mindName, s.id);
190
+ if (!ok2) failures++;
191
+ }
192
+ if (failures > 0) process.exit(1);
193
+ return;
194
+ }
195
+ const skillId = args.name;
196
+ if (!skillId) {
197
+ console.error("Usage: volute skill update <name> [--mind <name>] [--all]");
198
+ process.exit(1);
199
+ }
200
+ const ok = await doUpdate(mindName, skillId);
201
+ if (!ok) process.exit(1);
202
+ }
203
+ });
204
+ var publishSkillCmd = command({
205
+ name: "volute skill publish",
206
+ description: "Publish a mind's skill to the shared repository",
207
+ args: [{ name: "name", required: true, description: "Skill to publish" }],
208
+ flags: {
209
+ mind: { type: "string", description: "Mind name" }
210
+ },
211
+ run: async ({ args, flags }) => {
212
+ const mindName = resolveMindName(flags);
213
+ const skillId = args.name;
214
+ const client = getClient();
215
+ const url = urlOf(client.api.minds[":name"].skills.publish.$url({ param: { name: mindName } }));
216
+ const res = await daemonFetch(url, {
217
+ method: "POST",
218
+ headers: { "Content-Type": "application/json" },
219
+ body: JSON.stringify({ skillId })
220
+ });
221
+ if (!res.ok) {
222
+ const body = await res.json().catch(() => ({ error: "Unknown error" }));
223
+ console.error(`Error: ${body.error}`);
224
+ process.exit(1);
225
+ }
226
+ const skill = await res.json();
227
+ console.log(`Published skill "${skillId}" (v${skill.version}).`);
228
+ }
229
+ });
230
+ var removeSkillCmd = command({
231
+ name: "volute skill remove",
232
+ description: "Remove a shared skill from the pool",
233
+ args: [{ name: "name", required: true, description: "Shared skill to remove" }],
234
+ flags: {},
235
+ run: async ({ args }) => {
236
+ const id = args.name;
237
+ const client = getClient();
238
+ const url = urlOf(client.api.skills[":id"].$url({ param: { id } }));
239
+ const res = await daemonFetch(url, { method: "DELETE" });
240
+ if (!res.ok) {
241
+ const body = await res.json().catch(() => ({ error: "Unknown error" }));
242
+ console.error(`Error: ${body.error}`);
243
+ process.exit(1);
244
+ }
245
+ console.log(`Removed shared skill "${id}".`);
246
+ }
247
+ });
248
+ var uninstallSkillCmd = command({
249
+ name: "volute skill uninstall",
250
+ description: "Uninstall a skill from a mind",
251
+ args: [{ name: "name", required: true, description: "Skill to uninstall" }],
252
+ flags: {
253
+ mind: { type: "string", description: "Mind name" }
254
+ },
255
+ run: async ({ args, flags }) => {
256
+ const mindName = resolveMindName(flags);
257
+ const skillId = args.name;
258
+ const client = getClient();
259
+ const url = urlOf(
260
+ client.api.minds[":name"].skills[":skill"].$url({
261
+ param: { name: mindName, skill: skillId }
262
+ })
263
+ );
264
+ const res = await daemonFetch(url, { method: "DELETE" });
265
+ if (!res.ok) {
266
+ const body = await res.json().catch(() => ({ error: "Unknown error" }));
267
+ console.error(`Error: ${body.error}`);
268
+ process.exit(1);
269
+ }
270
+ console.log(`Uninstalled skill "${skillId}" from ${mindName}.`);
271
+ }
272
+ });
273
+ var defaultsListCmd = command({
274
+ name: "volute skill defaults list",
275
+ description: "List default skills for new minds",
276
+ flags: {},
277
+ run: async () => {
278
+ const res = await daemonFetch("/api/skills/defaults/list");
279
+ if (!res.ok) {
280
+ const body = await res.json().catch(() => ({ error: "Unknown error" }));
281
+ console.error(`Error: ${body.error}`);
282
+ process.exit(1);
283
+ }
284
+ const { skills } = await res.json();
285
+ console.log("Default skills for new minds:\n");
286
+ for (const s of skills) {
287
+ console.log(` ${s}`);
288
+ }
289
+ }
290
+ });
291
+ var defaultsAddCmd = command({
292
+ name: "volute skill defaults add",
293
+ description: "Add a skill to the defaults",
294
+ args: [{ name: "name", required: true, description: "Skill to add" }],
295
+ flags: {},
296
+ run: async ({ args }) => {
297
+ const skillId = args.name;
298
+ const res = await daemonFetch("/api/skills/defaults/list", {
299
+ method: "POST",
300
+ headers: { "Content-Type": "application/json" },
301
+ body: JSON.stringify({ skill: skillId })
302
+ });
303
+ if (!res.ok) {
304
+ const body = await res.json().catch(() => ({ error: "Unknown error" }));
305
+ console.error(`Error: ${body.error}`);
306
+ process.exit(1);
307
+ }
308
+ console.log(`Added "${skillId}" to default skills.`);
309
+ }
310
+ });
311
+ var defaultsRemoveCmd = command({
312
+ name: "volute skill defaults remove",
313
+ description: "Remove a skill from the defaults",
314
+ args: [{ name: "name", required: true, description: "Skill to remove" }],
315
+ flags: {},
316
+ run: async ({ args }) => {
317
+ const skillId = args.name;
318
+ const res = await daemonFetch(`/api/skills/defaults/list/${encodeURIComponent(skillId)}`, {
319
+ method: "DELETE"
320
+ });
321
+ if (!res.ok) {
322
+ const body = await res.json().catch(() => ({ error: "Unknown error" }));
323
+ console.error(`Error: ${body.error}`);
324
+ process.exit(1);
325
+ }
326
+ console.log(`Removed "${skillId}" from default skills.`);
327
+ }
328
+ });
329
+ var defaultsCmd = subcommands({
330
+ name: "volute skill defaults",
331
+ description: "Manage default skills for new minds",
332
+ commands: {
333
+ list: {
334
+ description: "List default skills",
335
+ run: defaultsListCmd.execute
336
+ },
337
+ add: {
338
+ description: "Add a skill to the defaults",
339
+ run: defaultsAddCmd.execute
340
+ },
341
+ remove: {
342
+ description: "Remove a skill from the defaults",
343
+ run: defaultsRemoveCmd.execute
344
+ }
345
+ }
346
+ });
347
+ var cmd = subcommands({
348
+ name: "volute skill",
349
+ description: "Browse, install, and manage skills",
350
+ commands: {
351
+ list: {
352
+ description: "List skills (shared or per-mind with --mind)",
353
+ run: listSkillsCmd.execute
354
+ },
355
+ info: {
356
+ description: "Show details of a shared skill",
357
+ run: infoSkillCmd.execute
358
+ },
359
+ install: {
360
+ description: "Install a shared skill into a mind",
361
+ run: installSkillCmd.execute
362
+ },
363
+ update: {
364
+ description: "Update an installed skill (3-way merge)",
365
+ run: updateSkillCmd.execute
366
+ },
367
+ publish: {
368
+ description: "Publish a mind's skill to the shared repository",
369
+ run: publishSkillCmd.execute
370
+ },
371
+ remove: {
372
+ description: "Remove a shared skill",
373
+ run: removeSkillCmd.execute
374
+ },
375
+ uninstall: {
376
+ description: "Uninstall a skill from a mind",
377
+ run: uninstallSkillCmd.execute
378
+ },
379
+ defaults: {
380
+ description: "Manage default skills for new minds",
381
+ run: defaultsCmd.execute
382
+ }
383
+ },
384
+ footer: "Use --mind <name> or VOLUTE_MIND to identify the mind."
385
+ });
386
+ var run = cmd.execute;
387
+ export {
388
+ run
389
+ };
@@ -28,8 +28,8 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
28
28
  | `volute mind split --list` | List your variants |
29
29
  | `volute mind join <variant-name> [--summary "..." --memory "..."]` | Merge a variant back |
30
30
  | `volute mind upgrade [--diff] [--continue] [--abort]` | Upgrade your server code (--diff to preview) |
31
- | `volute mind connect <type>` | Enable a connector (discord, slack, etc.) |
32
- | `volute mind disconnect <type>` | Disable a connector |
31
+ | `volute chat bridge add <platform>` | Set up a bridge (discord, slack, etc.) |
32
+ | `volute chat bridge remove <platform>` | Remove a bridge |
33
33
  | `volute clock add --id <name> --cron "..." --message/--script "..."` | Schedule a recurring task |
34
34
  | `volute clock add --id <name> --in <duration> --message/--script "..."` | Set a one-time timer (10m, 1h, 2h30m) |
35
35
  | `volute clock list` | List your schedules and timers |
@@ -41,10 +41,6 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
41
41
  | `volute mind profile --description "..."` | Set your description |
42
42
  | `volute mind profile --avatar <path>` | Set your avatar image |
43
43
  | `volute seed sprout` | Complete orientation and become a full mind |
44
- | `volute shared status` | See your pending changes vs main |
45
- | `volute shared merge "<message>"` | Share your changes with all minds |
46
- | `volute shared pull` | Get latest shared changes from other minds |
47
- | `volute shared log [--limit N]` | View recent shared history |
48
44
 
49
45
  ## Clock
50
46
 
@@ -194,6 +190,6 @@ When configuring message routing, read `references/routing.md`.
194
190
 
195
191
  When working with variants or upgrades, read `references/variants.md`.
196
192
 
197
- When managing shared skills, shared files, or MCP, read `references/extensions.md`.
193
+ When managing shared skills or MCP, read `references/extensions.md`.
198
194
 
199
195
  For email, pages, or git introspection, read `references/integrations.md`.
@@ -18,19 +18,16 @@ Your system has a shared skill repository that all minds can browse and install
18
18
 
19
19
  When you install a skill, it's copied to your skills directory. You can modify it freely — updates use a 3-way merge to preserve your changes. If there are merge conflicts, resolve them like any git conflict.
20
20
 
21
- # Shared Files
21
+ # Shared Pages
22
22
 
23
- Your `shared/` directory is a collaborative space backed by git. Each mind works on its own branch changes are private until deliberately shared.
23
+ The pages extension provides collaborative web publishing. Minds can create HTML pages in `home/public/pages/` and share them with other minds.
24
24
 
25
- **Workflow:**
26
- 1. Edit files in `shared/` normally — auto-commit saves changes to your branch
27
- 2. `volute shared status` see what you've changed compared to main
28
- 3. `volute shared merge "description"` squash-merge your changes to main
29
- 4. `volute shared pull` rebase your branch onto latest main to get others' changes
30
-
31
- **Conflicts:** If your merge fails due to conflicts, pull the latest (`volute shared pull`), reconcile the conflicting files, and merge again. If pull itself conflicts (your uncommitted changes clash), reset to main with `git -C shared reset --hard main`, re-apply your changes, and merge.
32
-
33
- **Shared pages:** The `shared/pages/` directory is the system-level website. Any mind can contribute. Publishing is handled via the pages extension API.
25
+ | Command | Purpose |
26
+ |---------|---------|
27
+ | `volute pages publish` | Publish your pages (copy to shared snapshot) |
28
+ | `volute pages list` | List pages with publish status |
29
+ | `volute pages pull` | Pull latest shared page changes from other minds |
30
+ | `volute pages log` | View shared pages commit history |
34
31
 
35
32
  # MCP Configuration
36
33
 
@@ -27,13 +27,13 @@ import {
27
27
  syncBuiltinSkills,
28
28
  uninstallSkill,
29
29
  updateSkill
30
- } from "./chunk-N3DNFPVA.js";
31
- import "./chunk-YUIHSKR6.js";
32
- import "./chunk-U5BTYSAL.js";
33
- import "./chunk-BDK73LK6.js";
34
- import "./chunk-6OWJXUAR.js";
35
- import "./chunk-N7BLAHNE.js";
36
- import "./chunk-4JSR7YO7.js";
30
+ } from "./chunk-IJHIXLVN.js";
31
+ import "./chunk-BKF4WQCY.js";
32
+ import "./chunk-AN2W47GW.js";
33
+ import "./chunk-VHJRZM2S.js";
34
+ import "./chunk-BMZQYACC.js";
35
+ import "./chunk-BDYXIWA5.js";
36
+ import "./chunk-5N7Y5WAM.js";
37
37
  import "./chunk-7KJOFUNN.js";
38
38
  export {
39
39
  SEED_SKILLS,
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ SleepManager,
4
+ getSleepManager,
5
+ getSleepManagerIfReady,
6
+ initSleepManager,
7
+ matchesGlob
8
+ } from "./chunk-WJPROOU5.js";
9
+ import "./chunk-5XJYUFZH.js";
10
+ import "./chunk-AOB6GVRM.js";
11
+ import "./chunk-IJHIXLVN.js";
12
+ import "./chunk-QWTR6AWZ.js";
13
+ import "./chunk-N446KRP7.js";
14
+ import "./chunk-QHG4OMZL.js";
15
+ import "./chunk-XRQSAMX2.js";
16
+ import "./chunk-WZRZFFCL.js";
17
+ import "./chunk-CORXD635.js";
18
+ import "./chunk-ZSR72JB3.js";
19
+ import "./chunk-PWQ2ITYG.js";
20
+ import "./chunk-A2ZLHBHG.js";
21
+ import "./chunk-FT5KETXZ.js";
22
+ import "./chunk-BKF4WQCY.js";
23
+ import "./chunk-AN2W47GW.js";
24
+ import "./chunk-VHJRZM2S.js";
25
+ import "./chunk-BMZQYACC.js";
26
+ import "./chunk-BDYXIWA5.js";
27
+ import "./chunk-5N7Y5WAM.js";
28
+ import "./chunk-7KJOFUNN.js";
29
+ export {
30
+ SleepManager,
31
+ getSleepManager,
32
+ getSleepManagerIfReady,
33
+ initSleepManager,
34
+ matchesGlob
35
+ };
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ensureSpiritProject,
4
+ getSpiritModel,
5
+ spiritDir,
6
+ syncSpiritTemplate
7
+ } from "./chunk-5XJYUFZH.js";
8
+ import "./chunk-AOB6GVRM.js";
9
+ import "./chunk-IJHIXLVN.js";
10
+ import "./chunk-FT5KETXZ.js";
11
+ import "./chunk-BKF4WQCY.js";
12
+ import "./chunk-AN2W47GW.js";
13
+ import "./chunk-VHJRZM2S.js";
14
+ import "./chunk-BMZQYACC.js";
15
+ import "./chunk-BDYXIWA5.js";
16
+ import "./chunk-5N7Y5WAM.js";
17
+ import "./chunk-7KJOFUNN.js";
18
+ export {
19
+ ensureSpiritProject,
20
+ getSpiritModel,
21
+ spiritDir,
22
+ syncSpiritTemplate
23
+ };
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ resolveMindName
4
+ } from "./chunk-BTY4WNFE.js";
5
+ import {
6
+ command
7
+ } from "./chunk-TXSA4Q3V.js";
8
+ import "./chunk-O7IGP7ZW.js";
9
+ import "./chunk-7KJOFUNN.js";
10
+
11
+ // packages/cli/src/commands/split.ts
12
+ var cmd = command({
13
+ name: "volute mind split",
14
+ description: "Create an experimental variant",
15
+ args: [{ name: "name", required: true, description: "Name for the variant" }],
16
+ flags: {
17
+ from: { type: "string", description: "Parent mind to split from" },
18
+ soul: { type: "string", description: "Custom SOUL.md content" },
19
+ port: { type: "number", description: "Port for variant server" },
20
+ "no-start": { type: "boolean", description: "Don't start the variant" },
21
+ json: { type: "boolean", description: "Output JSON result" }
22
+ },
23
+ run: async ({ args, flags }) => {
24
+ const mindName = resolveMindName({ mind: flags.from });
25
+ const variantName = args.name;
26
+ const { soul, port, json } = flags;
27
+ const noStart = flags["no-start"];
28
+ if (!json) console.log("Creating variant via daemon...");
29
+ const { daemonFetch } = await import("./daemon-client-RVIKXGFQ.js");
30
+ const { getClient, urlOf } = await import("./api-client-3A77HMH7.js");
31
+ const client = getClient();
32
+ const res = await daemonFetch(
33
+ urlOf(client.api.minds[":name"].variants.$url({ param: { name: mindName } })),
34
+ {
35
+ method: "POST",
36
+ headers: { "Content-Type": "application/json" },
37
+ body: JSON.stringify({
38
+ name: variantName,
39
+ ...soul && { soul },
40
+ ...port && { port },
41
+ ...noStart && { noStart }
42
+ })
43
+ }
44
+ );
45
+ const data = await res.json();
46
+ if (!res.ok) {
47
+ console.error(data.error ?? "Failed to create variant");
48
+ process.exit(1);
49
+ }
50
+ if (json) {
51
+ console.log(JSON.stringify(data.variant, null, 2));
52
+ } else {
53
+ console.log(`
54
+ Variant created: ${variantName}`);
55
+ console.log(` Branch: ${data.variant?.branch}`);
56
+ console.log(` Path: ${data.variant?.path}`);
57
+ console.log(` Port: ${data.variant?.port}`);
58
+ }
59
+ }
60
+ });
61
+ var run = cmd.execute;
62
+ export {
63
+ run
64
+ };
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import "./chunk-7KJOFUNN.js";
3
3
 
4
- // src/commands/sprout.ts
4
+ // packages/cli/src/commands/sprout.ts
5
5
  async function run(args) {
6
6
  console.error("Note: `volute mind sprout` is now `volute seed sprout`");
7
- await import("./seed-sprout-EH3AGKAI.js").then((m) => m.run(args));
7
+ await import("./seed-sprout-JYXGXOP3.js").then((m) => m.run(args));
8
8
  }
9
9
  export {
10
10
  run
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ command
4
+ } from "./chunk-TXSA4Q3V.js";
5
+ import "./chunk-O7IGP7ZW.js";
6
+ import {
7
+ daemonFetch
8
+ } from "./chunk-ZX7EAV5J.js";
9
+ import {
10
+ getClient,
11
+ urlOf
12
+ } from "./chunk-LOPXTW6H.js";
13
+ import "./chunk-7KJOFUNN.js";
14
+
15
+ // packages/cli/src/commands/start.ts
16
+ var cmd = command({
17
+ name: "volute mind start",
18
+ description: "Start a mind",
19
+ args: [{ name: "name", required: true, description: "Mind to start" }],
20
+ flags: {},
21
+ async run({ args }) {
22
+ const name = args.name;
23
+ const client = getClient();
24
+ const res = await daemonFetch(
25
+ urlOf(client.api.minds[":name"].start.$url({ param: { name } })),
26
+ { method: "POST" }
27
+ );
28
+ const data = await res.json();
29
+ if (!res.ok) {
30
+ console.error(data.error || "Failed to start mind");
31
+ process.exit(1);
32
+ }
33
+ console.log(`${name} started on port ${data.port}`);
34
+ }
35
+ });
36
+ var run = cmd.execute;
37
+ export {
38
+ run
39
+ };