@rubytech/create-maxy-code 0.1.279 → 0.1.281

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 (299) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/mcp-spawn-tee/dist/index.d.ts +31 -43
  3. package/payload/platform/lib/mcp-spawn-tee/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/mcp-spawn-tee/dist/index.js +112 -85
  5. package/payload/platform/lib/mcp-spawn-tee/dist/index.js.map +1 -1
  6. package/payload/platform/lib/mcp-spawn-tee/src/__tests__/spawn-tee.test.ts +111 -0
  7. package/payload/platform/lib/mcp-spawn-tee/src/index.ts +113 -84
  8. package/payload/platform/lib/mcp-spawn-tee/tsconfig.json +2 -1
  9. package/payload/platform/plugins/admin/PLUGIN.md +1 -0
  10. package/payload/platform/plugins/admin/hooks/__tests__/prompt-optimiser-directive.test.sh +42 -0
  11. package/payload/platform/plugins/admin/hooks/prompt-optimiser-directive.sh +60 -15
  12. package/payload/platform/plugins/admin/mcp/dist/__tests__/e-sign-discoverable.test.d.ts +2 -0
  13. package/payload/platform/plugins/admin/mcp/dist/__tests__/e-sign-discoverable.test.d.ts.map +1 -0
  14. package/payload/platform/plugins/admin/mcp/dist/__tests__/e-sign-discoverable.test.js +54 -0
  15. package/payload/platform/plugins/admin/mcp/dist/__tests__/e-sign-discoverable.test.js.map +1 -0
  16. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.d.ts +2 -0
  17. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.d.ts.map +1 -0
  18. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.js +19 -0
  19. package/payload/platform/plugins/admin/mcp/dist/content-producer-authoring-skills.js.map +1 -0
  20. package/payload/platform/plugins/admin/mcp/dist/skill-resolution.d.ts.map +1 -1
  21. package/payload/platform/plugins/admin/mcp/dist/skill-resolution.js +2 -5
  22. package/payload/platform/plugins/admin/mcp/dist/skill-resolution.js.map +1 -1
  23. package/payload/platform/plugins/admin/skills/a4-print-documents/SKILL.md +2 -0
  24. package/payload/platform/plugins/admin/skills/access-manager/SKILL.md +2 -0
  25. package/payload/platform/plugins/admin/skills/admin-user-management/SKILL.md +2 -0
  26. package/payload/platform/plugins/admin/skills/business-profile/SKILL.md +2 -0
  27. package/payload/platform/plugins/admin/skills/capabilities-here/SKILL.md +2 -0
  28. package/payload/platform/plugins/admin/skills/datetime/SKILL.md +2 -0
  29. package/payload/platform/plugins/admin/skills/deck-pages/SKILL.md +2 -0
  30. package/payload/platform/plugins/admin/skills/file-presentation/SKILL.md +2 -0
  31. package/payload/platform/plugins/admin/skills/investigate/SKILL.md +2 -0
  32. package/payload/platform/plugins/admin/skills/plainly/SKILL.md +2 -0
  33. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +5 -1
  34. package/payload/platform/plugins/admin/skills/plugin-management/SKILL.md +2 -0
  35. package/payload/platform/plugins/admin/skills/professional-document/SKILL.md +2 -0
  36. package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +2 -0
  37. package/payload/platform/plugins/admin/skills/qr-code/SKILL.md +2 -0
  38. package/payload/platform/plugins/admin/skills/session-management/SKILL.md +2 -0
  39. package/payload/platform/plugins/admin/skills/skill-builder/SKILL.md +2 -0
  40. package/payload/platform/plugins/admin/skills/specialist-management/SKILL.md +2 -0
  41. package/payload/platform/plugins/admin/skills/stream-log-review/SKILL.md +2 -0
  42. package/payload/platform/plugins/admin/skills/superpowers-sprint/SKILL.md +2 -0
  43. package/payload/platform/plugins/admin/skills/task/SKILL.md +2 -0
  44. package/payload/platform/plugins/admin/skills/update-knowledge/SKILL.md +2 -0
  45. package/payload/platform/plugins/admin/skills/upgrade/SKILL.md +2 -0
  46. package/payload/platform/plugins/aeo/skills/structured-answer/SKILL.md +2 -0
  47. package/payload/platform/plugins/business-assistant/PLUGIN.md +2 -1
  48. package/payload/platform/plugins/business-assistant/{references/e-sign.md → skills/e-sign/SKILL.md} +9 -2
  49. package/payload/platform/plugins/cloudflare/skills/cloudflare/SKILL.md +2 -0
  50. package/payload/platform/plugins/deep-research/skills/academic-verify/SKILL.md +2 -0
  51. package/payload/platform/plugins/deep-research/skills/book-mirror/SKILL.md +2 -0
  52. package/payload/platform/plugins/deep-research/skills/data-research/SKILL.md +2 -0
  53. package/payload/platform/plugins/deep-research/skills/deep-research/SKILL.md +2 -0
  54. package/payload/platform/plugins/deep-research/skills/strategic-reading/SKILL.md +2 -0
  55. package/payload/platform/plugins/docs/references/platform.md +2 -0
  56. package/payload/platform/plugins/email/PLUGIN.md +2 -0
  57. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.d.ts +2 -0
  58. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.d.ts.map +1 -0
  59. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.js +68 -0
  60. package/payload/platform/plugins/email/mcp/dist/__tests__/attachment-resolve.test.js.map +1 -0
  61. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.d.ts +2 -0
  62. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.d.ts.map +1 -0
  63. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.js +55 -0
  64. package/payload/platform/plugins/email/mcp/dist/__tests__/email-setup.test.js.map +1 -0
  65. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.d.ts +2 -0
  66. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.d.ts.map +1 -0
  67. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.js +110 -0
  68. package/payload/platform/plugins/email/mcp/dist/__tests__/providers.test.js.map +1 -0
  69. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.d.ts +2 -0
  70. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.d.ts.map +1 -0
  71. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.js +57 -0
  72. package/payload/platform/plugins/email/mcp/dist/__tests__/recipient-filter.test.js.map +1 -0
  73. package/payload/platform/plugins/email/mcp/dist/index.js +8 -1
  74. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  75. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts +5 -0
  76. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.d.ts.map +1 -1
  77. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js +35 -5
  78. package/payload/platform/plugins/email/mcp/dist/lib/attachment-resolve.js.map +1 -1
  79. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +50 -14
  80. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  81. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +143 -66
  82. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  83. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts +8 -0
  84. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.d.ts.map +1 -1
  85. package/payload/platform/plugins/email/mcp/dist/lib/ingest-batch.js.map +1 -1
  86. package/payload/platform/plugins/email/mcp/dist/lib/providers.d.ts +16 -5
  87. package/payload/platform/plugins/email/mcp/dist/lib/providers.d.ts.map +1 -1
  88. package/payload/platform/plugins/email/mcp/dist/lib/providers.js +120 -13
  89. package/payload/platform/plugins/email/mcp/dist/lib/providers.js.map +1 -1
  90. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js +3 -3
  91. package/payload/platform/plugins/email/mcp/dist/tools/email-fetch.js.map +1 -1
  92. package/payload/platform/plugins/email/mcp/dist/tools/email-otp-extract.d.ts.map +1 -1
  93. package/payload/platform/plugins/email/mcp/dist/tools/email-otp-extract.js +4 -2
  94. package/payload/platform/plugins/email/mcp/dist/tools/email-otp-extract.js.map +1 -1
  95. package/payload/platform/plugins/email/mcp/dist/tools/email-read.d.ts.map +1 -1
  96. package/payload/platform/plugins/email/mcp/dist/tools/email-read.js +18 -8
  97. package/payload/platform/plugins/email/mcp/dist/tools/email-read.js.map +1 -1
  98. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.d.ts.map +1 -1
  99. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js +5 -3
  100. package/payload/platform/plugins/email/mcp/dist/tools/email-reply.js.map +1 -1
  101. package/payload/platform/plugins/email/mcp/dist/tools/email-search.d.ts.map +1 -1
  102. package/payload/platform/plugins/email/mcp/dist/tools/email-search.js +18 -8
  103. package/payload/platform/plugins/email/mcp/dist/tools/email-search.js.map +1 -1
  104. package/payload/platform/plugins/email/mcp/dist/tools/email-send.d.ts.map +1 -1
  105. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js +6 -3
  106. package/payload/platform/plugins/email/mcp/dist/tools/email-send.js.map +1 -1
  107. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.d.ts.map +1 -1
  108. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js +22 -4
  109. package/payload/platform/plugins/email/mcp/dist/tools/email-setup.js.map +1 -1
  110. package/payload/platform/plugins/email/mcp/package.json +4 -2
  111. package/payload/platform/plugins/email/mcp/vitest.config.ts +9 -0
  112. package/payload/platform/plugins/email/references/email-reference.md +22 -5
  113. package/payload/platform/plugins/email/skills/email-composition/SKILL.md +3 -1
  114. package/payload/platform/plugins/email/skills/email-ingest/SKILL.md +2 -0
  115. package/payload/platform/plugins/graph/PLUGIN.md +2 -0
  116. package/payload/platform/plugins/graph-viewer/skills/render-graph/SKILL.md +2 -0
  117. package/payload/platform/plugins/linkedin-extension/skills/linkedin-extension/SKILL.md +2 -0
  118. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.d.ts +2 -0
  119. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.d.ts.map +1 -0
  120. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.js +31 -0
  121. package/payload/platform/plugins/memory/mcp/dist/tools/__tests__/kd-classify-account-dir.test.js.map +1 -0
  122. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.d.ts +5 -0
  123. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.d.ts.map +1 -1
  124. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.js +21 -2
  125. package/payload/platform/plugins/memory/mcp/dist/tools/kd-classify.js.map +1 -1
  126. package/payload/platform/plugins/memory/skills/archive-crawler/SKILL.md +2 -0
  127. package/payload/platform/plugins/memory/skills/challenge/SKILL.md +2 -0
  128. package/payload/platform/plugins/memory/skills/concept-synthesis/SKILL.md +2 -0
  129. package/payload/platform/plugins/memory/skills/connect/SKILL.md +2 -0
  130. package/payload/platform/plugins/memory/skills/conversational-memory/SKILL.md +2 -0
  131. package/payload/platform/plugins/memory/skills/emerge/SKILL.md +2 -0
  132. package/payload/platform/plugins/outlook/skills/outlook/SKILL.md +2 -0
  133. package/payload/platform/plugins/prompt-optimiser/skills/prompt-optimiser/SKILL.md +3 -1
  134. package/payload/platform/plugins/prompt-optimiser/skills/prompt-optimiser/__tests__/restatement-ladder.test.sh +21 -0
  135. package/payload/platform/plugins/scheduling/skills/briefing/SKILL.md +2 -0
  136. package/payload/platform/plugins/scheduling/skills/daily-prep/SKILL.md +2 -0
  137. package/payload/platform/plugins/slides/skills/deck-system/SKILL.md +2 -0
  138. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js +5 -5
  139. package/payload/platform/plugins/url-get/mcp/dist/tools/url-get.js.map +1 -1
  140. package/payload/platform/plugins/whatsapp/skills/connect-whatsapp/SKILL.md +2 -0
  141. package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +2 -0
  142. package/payload/platform/plugins/work/skills/execute-task/SKILL.md +2 -0
  143. package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +2 -0
  144. package/payload/platform/scripts/lib/__tests__/admin-skills-bootstrap.test.sh +64 -0
  145. package/payload/platform/scripts/lib/admin-skills-bootstrap.sh +109 -0
  146. package/payload/platform/scripts/setup-account.sh +8 -0
  147. package/payload/platform/services/claude-session-manager/dist/fs-watcher.d.ts.map +1 -1
  148. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js +43 -11
  149. package/payload/platform/services/claude-session-manager/dist/fs-watcher.js.map +1 -1
  150. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  151. package/payload/platform/services/claude-session-manager/dist/http-server.js +74 -1
  152. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  153. package/payload/platform/services/claude-session-manager/dist/index.js +48 -2
  154. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  155. package/payload/platform/services/claude-session-manager/dist/liveness-divergence.d.ts +19 -0
  156. package/payload/platform/services/claude-session-manager/dist/liveness-divergence.d.ts.map +1 -0
  157. package/payload/platform/services/claude-session-manager/dist/liveness-divergence.js +38 -0
  158. package/payload/platform/services/claude-session-manager/dist/liveness-divergence.js.map +1 -0
  159. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +8 -0
  160. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  161. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +19 -1
  162. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  163. package/payload/platform/services/claude-session-manager/dist/scope-record.d.ts +11 -0
  164. package/payload/platform/services/claude-session-manager/dist/scope-record.d.ts.map +1 -0
  165. package/payload/platform/services/claude-session-manager/dist/scope-record.js +81 -0
  166. package/payload/platform/services/claude-session-manager/dist/scope-record.js.map +1 -0
  167. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts +10 -7
  168. package/payload/platform/services/whatsapp-channel/dist/notification.d.ts.map +1 -1
  169. package/payload/platform/services/whatsapp-channel/dist/notification.js +14 -14
  170. package/payload/platform/services/whatsapp-channel/dist/notification.js.map +1 -1
  171. package/payload/platform/templates/agents/admin/IDENTITY.md +2 -6
  172. package/payload/server/public/assets/AdminShell-FO766lOW.js +1 -0
  173. package/payload/server/public/assets/{Checkbox-2reCESkb.js → Checkbox-syHoU9nY.js} +1 -1
  174. package/payload/server/public/assets/{admin-xRCXEFNW.js → admin-0_VxffD5.js} +1 -1
  175. package/payload/server/public/assets/{arc-BgelqC_3.js → arc-BW1WhwmV.js} +1 -1
  176. package/payload/server/public/assets/architecture-YZFGNWBL-xHbVjatf.js +1 -0
  177. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BabnAZJm.js → architectureDiagram-Q4EWVU46-DsionCio.js} +1 -1
  178. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BJzZqNsy.js → blockDiagram-DXYQGD6D-NOG5yVZk.js} +1 -1
  179. package/payload/server/public/assets/{browser-DT2XfRpL.js → browser-Cxjkhtsk.js} +1 -1
  180. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-By-xuh9F.js → c4Diagram-AHTNJAMY-DwFV1k9I.js} +1 -1
  181. package/payload/server/public/assets/channel-D8Go_zJk.js +1 -0
  182. package/payload/server/public/assets/{chunk-2KRD3SAO-Gj2dSpBl.js → chunk-2KRD3SAO-CKn-bEkI.js} +1 -1
  183. package/payload/server/public/assets/{chunk-336JU56O-2PXVPCUA.js → chunk-336JU56O-iJ4ISPCi.js} +2 -2
  184. package/payload/server/public/assets/chunk-426QAEUC-sWe0Iexz.js +1 -0
  185. package/payload/server/public/assets/{chunk-4BX2VUAB-9XIBlnC2.js → chunk-4BX2VUAB-B2mSmC97.js} +1 -1
  186. package/payload/server/public/assets/{chunk-4TB4RGXK-Cr3mXPnI.js → chunk-4TB4RGXK-kKNYi2_i.js} +1 -1
  187. package/payload/server/public/assets/{chunk-55IACEB6-Ccg46J3A.js → chunk-55IACEB6-JLT9m7Hd.js} +1 -1
  188. package/payload/server/public/assets/{chunk-5FUZZQ4R-Cz9MvPKc.js → chunk-5FUZZQ4R-Car3r0he.js} +1 -1
  189. package/payload/server/public/assets/{chunk-5PVQY5BW-BleOdlgO.js → chunk-5PVQY5BW-DR9EfLvj.js} +1 -1
  190. package/payload/server/public/assets/{chunk-67CJDMHE-CyCYCQWy.js → chunk-67CJDMHE-CCdP3Pdx.js} +1 -1
  191. package/payload/server/public/assets/{chunk-7N4EOEYR-KpT3uHzH.js → chunk-7N4EOEYR-bXgVzdM9.js} +1 -1
  192. package/payload/server/public/assets/{chunk-AA7GKIK3-BfOzbuxq.js → chunk-AA7GKIK3-CYeDvY8B.js} +1 -1
  193. package/payload/server/public/assets/{chunk-BSJP7CBP-Bq0M3wlv.js → chunk-BSJP7CBP-U0Fi-Ers.js} +1 -1
  194. package/payload/server/public/assets/{chunk-CIAEETIT-CR-2dNaL.js → chunk-CIAEETIT-C8QrV6Gg.js} +1 -1
  195. package/payload/server/public/assets/{chunk-EDXVE4YY-egUGMTOS.js → chunk-EDXVE4YY-DLUWVRZV.js} +1 -1
  196. package/payload/server/public/assets/{chunk-ENJZ2VHE-CQohBEFw.js → chunk-ENJZ2VHE-B4bNJo6C.js} +1 -1
  197. package/payload/server/public/assets/{chunk-FMBD7UC4-DIxBUbLP.js → chunk-FMBD7UC4-DxAQS3UB.js} +1 -1
  198. package/payload/server/public/assets/{chunk-FOC6F5B3-C2694Zoq.js → chunk-FOC6F5B3-CyIK3zeY.js} +1 -1
  199. package/payload/server/public/assets/{chunk-ICPOFSXX-DpXZKHyn.js → chunk-ICPOFSXX-Qzl8Ki0l.js} +2 -2
  200. package/payload/server/public/assets/{chunk-K5T4RW27-CUicG0Rp.js → chunk-K5T4RW27-7GcDzjyJ.js} +1 -1
  201. package/payload/server/public/assets/{chunk-KGLVRYIC-B5mPJhOr.js → chunk-KGLVRYIC-B7pAr9hf.js} +1 -1
  202. package/payload/server/public/assets/{chunk-LIHQZDEY-q81QhuMs.js → chunk-LIHQZDEY-DEoU2jrz.js} +1 -1
  203. package/payload/server/public/assets/{chunk-ORNJ4GCN-DgurdFZs.js → chunk-ORNJ4GCN-BwMFuN24.js} +1 -1
  204. package/payload/server/public/assets/{chunk-OYMX7WX6-CxqMRu2d.js → chunk-OYMX7WX6-BenBO6O_.js} +1 -1
  205. package/payload/server/public/assets/chunk-QZHKN3VN-CHE_iZO7.js +1 -0
  206. package/payload/server/public/assets/{chunk-U2HBQHQK-BSLctJC9.js → chunk-U2HBQHQK-DewM8R0D.js} +1 -1
  207. package/payload/server/public/assets/{chunk-X2U36JSP--0AUeeFl.js → chunk-X2U36JSP-C22Q6Ea4.js} +1 -1
  208. package/payload/server/public/assets/{chunk-XPW4576I-D-hf9Bcn.js → chunk-XPW4576I-BA0a8Ygs.js} +1 -1
  209. package/payload/server/public/assets/{chunk-YZCP3GAM-PvOhSwI9.js → chunk-YZCP3GAM-DfUUNTnA.js} +1 -1
  210. package/payload/server/public/assets/{chunk-ZZ45TVLE-1zPUlNWz.js → chunk-ZZ45TVLE-CUT6zma2.js} +1 -1
  211. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BLb1mzrT.js +1 -0
  212. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Ctj5qYTS.js +1 -0
  213. package/payload/server/public/assets/clone-DGZ2vydA.js +1 -0
  214. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-Cvo-gkBd.js → cose-bilkent-S5V4N54A-Df_JmB8E.js} +1 -1
  215. package/payload/server/public/assets/{dagre-CMHsNfjP.js → dagre-CYXRIdv0.js} +1 -1
  216. package/payload/server/public/assets/{dagre-KV5264BT-CM1DSx4E.js → dagre-KV5264BT-D4EGb60h.js} +1 -1
  217. package/payload/server/public/assets/{data-Dr7XUvAx.js → data-BOgwOWnw.js} +1 -1
  218. package/payload/server/public/assets/{diagram-5BDNPKRD-VDHiHwEI.js → diagram-5BDNPKRD-BzieCEfT.js} +1 -1
  219. package/payload/server/public/assets/{diagram-G4DWMVQ6-OKdufoeW.js → diagram-G4DWMVQ6-DDbO71XD.js} +1 -1
  220. package/payload/server/public/assets/{diagram-MMDJMWI5-Yg6QdCA1.js → diagram-MMDJMWI5-DqQ_UXDA.js} +1 -1
  221. package/payload/server/public/assets/{diagram-TYMM5635-CpEMZQDu.js → diagram-TYMM5635-CFyxA1aZ.js} +1 -1
  222. package/payload/server/public/assets/{dist-811BIK0R.js → dist-BmvZ8OaX.js} +1 -1
  223. package/payload/server/public/assets/{erDiagram-SMLLAGMA-Dw5gAkFM.js → erDiagram-SMLLAGMA-BMaEBbOK.js} +1 -1
  224. package/payload/server/public/assets/{flatten-BsWEYbBB.js → flatten-Bo6YRmWl.js} +1 -1
  225. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-Cy_R1XHz.js → flowDiagram-DWJPFMVM-De5ChZQP.js} +1 -1
  226. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BYARP_eH.js → ganttDiagram-T4ZO3ILL-CXEMPVaK.js} +1 -1
  227. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CmHdoS27.js +1 -0
  228. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BGOe0unY.js → gitGraphDiagram-UUTBAWPF-OZedr_6y.js} +1 -1
  229. package/payload/server/public/assets/{graph-DOEjjQHD.js → graph-BqD2GjQd.js} +2 -2
  230. package/payload/server/public/assets/{graph-labels-eOrWYy0R.js → graph-labels-DSDTSBfM.js} +1 -1
  231. package/payload/server/public/assets/{graphlib-DaefxCga.js → graphlib-CN4nhD2U.js} +1 -1
  232. package/payload/server/public/assets/info-OMHHGYJF-DTA9msO-.js +1 -0
  233. package/payload/server/public/assets/infoDiagram-42DDH7IO-CSqg4nRL.js +2 -0
  234. package/payload/server/public/assets/{isEmpty-BWl67LAZ.js → isEmpty-D6Kr-M1M.js} +1 -1
  235. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-YrGuzpiI.js → ishikawaDiagram-UXIWVN3A-ChlzrZyx.js} +1 -1
  236. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-EIykOcqg.js → journeyDiagram-VCZTEJTY-DsrK55ZO.js} +1 -1
  237. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BR0TC6Je.js → kanban-definition-6JOO6SKY-DYF-_Rym.js} +1 -1
  238. package/payload/server/public/assets/{line-DPGcT5IM.js → line-3zmwI8XK.js} +1 -1
  239. package/payload/server/public/assets/{linear-CPN03uSh.js → linear-COm19-p7.js} +1 -1
  240. package/payload/server/public/assets/{mermaid-parser.core-D7Iu4c9M.js → mermaid-parser.core-BrcX8-cl.js} +2 -2
  241. package/payload/server/public/assets/{mermaid.core-krXRpXn9.js → mermaid.core-CBdz3b1N.js} +3 -3
  242. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-HwiCtPzN.js → mindmap-definition-QFDTVHPH-BqCqlYZb.js} +1 -1
  243. package/payload/server/public/assets/{ordinal-krseTxxN.js → ordinal-BDi6f4xk.js} +1 -1
  244. package/payload/server/public/assets/packet-4T2RLAQJ-6GjqIKgu.js +1 -0
  245. package/payload/server/public/assets/pie-ZZUOXDRM-T72DJ5JR.js +1 -0
  246. package/payload/server/public/assets/{pieDiagram-DEJITSTG-xodxyWLe.js → pieDiagram-DEJITSTG-D5LiILuM.js} +1 -1
  247. package/payload/server/public/assets/{public-xVaPcg6i.js → public-udi_Z7la.js} +3 -3
  248. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DuYYY4ZZ.js → quadrantDiagram-34T5L4WZ-C3iuI5l_.js} +1 -1
  249. package/payload/server/public/assets/radar-PYXPWWZC-x-6xW1dE.js +1 -0
  250. package/payload/server/public/assets/{reduce-tk-xY6Fv.js → reduce-CGi9ik8i.js} +1 -1
  251. package/payload/server/public/assets/{requirementDiagram-MS252O5E-D0ta3kru.js → requirementDiagram-MS252O5E-CTPOw5qQ.js} +1 -1
  252. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-KdHdlzvT.js → sankeyDiagram-XADWPNL6-D_5aVlYp.js} +1 -1
  253. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DoSFUTQZ.js → sequenceDiagram-FGHM5R23-D7h5vocM.js} +1 -1
  254. package/payload/server/public/assets/{src-Cpl1JzME.js → src-DLEIsjER.js} +1 -1
  255. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-BLW0KiSA.js → stateDiagram-FHFEXIEX-DyZjuwPj.js} +1 -1
  256. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BiW9pGXy.js +1 -0
  257. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-8QAzhYz1.js → timeline-definition-GMOUNBTQ-BqpVYJz_.js} +1 -1
  258. package/payload/server/public/assets/treeView-SZITEDCU-5-6wEryJ.js +1 -0
  259. package/payload/server/public/assets/treemap-W4RFUUIX-DF48Cc86.js +1 -0
  260. package/payload/server/public/assets/{useSelectionMode-DlJsX-_X.js → useSelectionMode-BPzPjKP_.js} +1 -1
  261. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BKvfScOi.js → vennDiagram-DHZGUBPP-Czflml0e.js} +1 -1
  262. package/payload/server/public/assets/wardley-RL74JXVD-duKIa6Hq.js +1 -0
  263. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-DaMfDpJ3.js → wardleyDiagram-NUSXRM2D-Cqz3pSTK.js} +1 -1
  264. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-BIkNQlLa.js → xychartDiagram-5P7HB3ND-CS5dEuUO.js} +1 -1
  265. package/payload/server/public/browser.html +4 -4
  266. package/payload/server/public/data.html +5 -5
  267. package/payload/server/public/graph.html +6 -6
  268. package/payload/server/public/index.html +5 -5
  269. package/payload/server/public/public.html +4 -4
  270. package/payload/server/server.js +339 -482
  271. package/payload/server/public/assets/AdminShell-DnH3kou-.js +0 -1
  272. package/payload/server/public/assets/architecture-YZFGNWBL-YM-TtgPY.js +0 -1
  273. package/payload/server/public/assets/channel-BRPH0atd.js +0 -1
  274. package/payload/server/public/assets/chunk-426QAEUC-QhauxjvK.js +0 -1
  275. package/payload/server/public/assets/chunk-QZHKN3VN-BDAQvtxz.js +0 -1
  276. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BJv89PB6.js +0 -1
  277. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DNUszH5M.js +0 -1
  278. package/payload/server/public/assets/clone-CREg9jLM.js +0 -1
  279. package/payload/server/public/assets/gitGraph-7Q5UKJZL-CtOPqykB.js +0 -1
  280. package/payload/server/public/assets/info-OMHHGYJF-Jba5enA8.js +0 -1
  281. package/payload/server/public/assets/infoDiagram-42DDH7IO-Df9BlkPA.js +0 -2
  282. package/payload/server/public/assets/packet-4T2RLAQJ-D_eWzeAP.js +0 -1
  283. package/payload/server/public/assets/pie-ZZUOXDRM-BDiy1Ob2.js +0 -1
  284. package/payload/server/public/assets/radar-PYXPWWZC-C5mlfmtg.js +0 -1
  285. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-C5zlCV4X.js +0 -1
  286. package/payload/server/public/assets/treeView-SZITEDCU-CM-9m-cS.js +0 -1
  287. package/payload/server/public/assets/treemap-W4RFUUIX-DDHPB-Xh.js +0 -1
  288. package/payload/server/public/assets/wardley-RL74JXVD-CUb3Br4q.js +0 -1
  289. package/payload/server/public/assets/whatsapp-cDxgZkbM.js +0 -1
  290. package/payload/server/public/whatsapp.html +0 -18
  291. /package/payload/server/public/assets/{_baseFor-BHtDrjIo.js → _baseFor-Cam2PbSt.js} +0 -0
  292. /package/payload/server/public/assets/{array-DetWRiSa.js → array-DYRGGQae.js} +0 -0
  293. /package/payload/server/public/assets/{chunk-CWOGyPgy.js → chunk-CnGqDkHZ.js} +0 -0
  294. /package/payload/server/public/assets/{cytoscape.esm-C9yNhe1u.js → cytoscape.esm-nWsJMTNI.js} +0 -0
  295. /package/payload/server/public/assets/{defaultLocale-_WRwicXn.js → defaultLocale-Du1XY3Dp.js} +0 -0
  296. /package/payload/server/public/assets/{init-sTEcj9YX.js → init-B5BXBRcm.js} +0 -0
  297. /package/payload/server/public/assets/{katex-s61Rgv6l.js → katex-HOUACuRw.js} +0 -0
  298. /package/payload/server/public/assets/{path-B0Ik7Tu9.js → path-CNO468J-.js} +0 -0
  299. /package/payload/server/public/assets/{rough.esm-DKRO8IF-.js → rough.esm-DRO6hWPh.js} +0 -0
@@ -11,6 +11,8 @@ description: >
11
11
 
12
12
  # A4 Print-Ready HTML Documents
13
13
 
14
+ Invoked from `specialists:content-producer`.
15
+
14
16
  Constraints for producing HTML documents that render correctly when saved as PDF via the on-device `browser-pdf-save` tool. Every rule exists because violating it caused a visible problem in production documents.
15
17
 
16
18
  ## Rendering path
@@ -5,6 +5,8 @@ description: "Manage per-agent access grants for gated public agents — invite
5
5
 
6
6
  # Access Manager
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  Applies when the business owner wants to control who can access a gated public agent.
9
11
 
10
12
  ## When to Activate
@@ -5,6 +5,8 @@ description: "Add, remove, list admins on this account, and update an admin PIN.
5
5
 
6
6
  # Admin user management
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  This skill manages who has admin access to this account. It wraps four MCP tools and carries the discipline that keeps the three identity stores in lockstep. The owner (or any current admin) can manage admins; roles are labels only, with no capability differences enforced.
9
11
 
10
12
  ## The four tools
@@ -5,6 +5,8 @@ description: "Populate the business's operational data in the graph — identity
5
5
 
6
6
  # Business Profile Setup
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  Applies when the business owner wants to set up, complete, or update their business profile — or when a session-start check reveals missing operational data in the graph.
9
11
 
10
12
  ## When to Activate
@@ -5,6 +5,8 @@ description: Use when grounding any claim about what is installed on the current
5
5
 
6
6
  # capabilities-here
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  The `capabilities-here` admin MCP tool returns a single JSON object describing the live install state on the current account. Call it whenever you are about to:
9
11
 
10
12
  - Tell the operator what you can or cannot do here.
@@ -10,6 +10,8 @@ description: >
10
10
 
11
11
  # Datetime & Timezone Queries
12
12
 
13
+ Invoked by the admin agent directly.
14
+
13
15
  Answer timezone-related questions and relative-date arithmetic using Node.js — never freelance the math. Relative dates and quarter forms must go through the deterministic one-liner in this skill; the same algorithm runs server-side in the memory plugin's `relative-date.ts`, so chat answers stay consistent with timeline rows the operator sees in the graph.
14
16
 
15
17
  ## When to Activate
@@ -13,6 +13,8 @@ description: >
13
13
 
14
14
  # Deck Pages — Slide-Based PDF Documents
15
15
 
16
+ Invoked by the admin agent directly.
17
+
16
18
  Constraints for producing HTML slide decks that render correctly on screen and export as pixel-perfect PDFs via client-side `html2canvas-pro` + `jsPDF`. Every rule exists because violating it caused a visible rendering problem in exported decks.
17
19
 
18
20
  ## How this differs from A4 print documents
@@ -5,6 +5,8 @@ description: "Deliver a file or document to the owner inside chat for review and
5
5
 
6
6
  # File presentation
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  This skill covers presenting editable content for inline review before it is persisted, and delivering a finished file to the owner. Deliver by inventory, not by recipe: if you have a file-sending tool, use it — on a turn that arrived over a channel such as WhatsApp the platform relays that delivery to the channel for you. If you do not (for example you are a specialist running as a subagent), write the file under `output/` and state its full path in your result; the main session relays it to the owner.
9
11
 
10
12
  ## The trigger
@@ -17,6 +17,8 @@ allowed-tools:
17
17
 
18
18
  # Systematic Debugging
19
19
 
20
+ Invoked by the admin agent directly.
21
+
20
22
  ## Iron Laws
21
23
 
22
24
  **NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST.**
@@ -5,6 +5,8 @@ description: Use when the user asks for a "plain English" explanation, definitio
5
5
 
6
6
  # plainly
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  **Scope — agent-to-human only.** Plainly applies to prose returned to a human reader (the operator, a customer, the admin agent when admin renders prose to the operator). It does NOT apply to arguments passed to `image-generate`, `memory-write`, `memory-classify`, `memory-ingest`, `cypher-shell`, or any other MCP tool — those are agent-to-machine payloads where technical descriptors and structured tokens are required, not jargon to strip.
9
11
 
10
12
  Produce an explanation that *teaches* the concept to a reader who is bright and motivated but **new to the topic**. They hold general vocabulary (integrals, polynomials, bell curves, logarithms) but do not own the specialist machinery (quadrature rules, weight functions, exactness orders, regime generators). Every phrase in the explanation must be one such a reader can either already understand or be brought up to speed on within the explanation itself. Plain English is the **spoken register**: a sentence has to parse if you read it aloud, in conversation, without a whiteboard. The goal is working understanding the reader can apply and pass on, not a textbook entry they could find in a glossary. Hit the bar on the first attempt; iteration is a leak.
@@ -1,13 +1,15 @@
1
1
  ---
2
2
  name: platform-architecture
3
3
  description: Use when grounding any documented-surface claim about what Maxy ships — plugins, skills, specialists, install/deploy flows, internals. This is the install catalogue, not evidence of what is enabled on the current account. For install state on this account, call `capabilities-here`; for documented surface, cite the `Source:` URL inline.
4
- content-hash: sha256:2002a63079af7332d583e86fd68fe798a5736452310f3412e20b99320194b383
4
+ content-hash: sha256:137ecdb03fdbb733f6150e0d931f4e5f30bf7daafcf738398d8c2768b868936e
5
5
  brand: maxy-code
6
6
  product-name: Maxy
7
7
  ---
8
8
 
9
9
  # Maxy platform architecture (catalogue)
10
10
 
11
+ Invoked by the admin agent directly.
12
+
11
13
  This skill is the install catalogue — every surface the platform can ship. It is not evidence of what is installed on the current account. Cite for documented surface. For 'what is installed here' / 'what can you do', call `capabilities-here` and read `account-manage`; do not infer install state from this body.
12
14
 
13
15
  This skill is generated. Its body is the concatenated source markdown for every public Maxy docs page, emitted by `docs/scripts/copy-docs.mjs` as `docs/public/llms-full.maxy-code.txt` and assembled here by `maxy-code/scripts/assemble-architecture-skill.mjs`. Do not hand-edit — the drift gate in `platform/scripts/check-architecture-skill-no-drift.mjs` will fail CI.
@@ -143,6 +145,8 @@ Everything Maxy can do is provided by a plugin. Each plugin is a self-contained
143
145
 
144
146
  **How tools and roles reach the session.** Each `claude` PTY spawn registers every plugin's MCP server and every bundled subagent directory before the operator's first turn — a per-spawn `mcp-config.json` written by the session manager and passed as `--mcp-config` on the PTY argv, plus one `--add-dir` per agents directory. Admin sessions see every plugin and every role; public sessions see only plugins with at least one public-allowlisted tool. The manager refuses to start when a plugin's `PLUGIN.md` declares tools without a matching `mcp:` block (forensic signal: `boot-failed reason=mcp-allowlist-without-server …`). See `internals.md` "Spawn-time MCP and subagent registration" for the full mechanism and `internals.md` "Tool Eagerness" for the separate ToolSearch-vs-eager registration concern.
145
147
 
148
+ **MCP helper death observability (Task 706).** `claude` spawns each plugin MCP helper as its own child, so the manager cannot see a helper die. Every spawn-capable plugin therefore wraps its `mcp:` command with `lib/mcp-spawn-tee`, a parent-side node wrapper that is the helper's real parent and observes its true exit code, signal, and lifetime (including SIGKILL / transport crashes). The wrapper tees the helper's stderr to a wrapper-only per-session file `~/.{brand}/logs/mcp-<server>-<sessionId>.log` — never mixed with the admin-server enumeration copy — and emits lifecycle lines keyed `session=<id8> server=<name>`: `[mcp-helper] op=spawn … pid= entry=`, `[mcp-helper] op=boot … head=<first stderr bytes>`, and `[mcp-helper] op=exit … code= signal= lifetimeMs= stderr-tail=` on every exit (including a clean one). Lines are written synchronously to the per-session file and best-effort mirrored to `server.log` via the loopback log-ingest route. Diagnose a dead helper by `grep '\[mcp-helper\]' ~/.{brand}/logs/server.log` filtered by `session=<id8>`, then read the per-session file for its last output. Full contract and diagnostic path in [`.docs/mcp-helper-observability.md`](../../../.docs/mcp-helper-observability.md). The alive-but-wedged case (no process exit) is the deferred `[mcp-helper-census]` reconciler (Task 710).
149
+
146
150
  **Where premium bundle subs live.** Bundle subs (`loop`, `property-data`, `brochures`, etc. inside `real-agent`) live exclusively at `premium-plugins/<bundle>/plugins/<sub>/` and are registered via the resolver's bundle-descent walk. Standalone premiums (no `BUNDLE.md`, e.g. `writer-craft`, `teaching`, `venture-studio`) live exclusively at `premium-plugins/<name>/` and are registered via the resolver's dual-root scan (`platform/plugins/` and `premium-plugins/` are both `pluginsRoots`). Neither shape is flat-copied into `platform/plugins/<name>/`. A divergent flat copy of a bundle sub is treated as an operator override: the resolver refuses to boot with `boot-failed reason=mcp-plugin-duplicate <plugin> declared by more than one plugins root: <pathA> (sha=…) vs <pathB> (sha=…)` so the operator can `sha256sum` both paths and remove the stale one. Byte-identical bundle-sub flat copies left over from installer versions that flat-copied bundle subs are reaped on the first post-upgrade boot (`[premium-auto-deliver] reaped sub=<name> reason=duplicate-of-premium-tree`). Standalone flat copies (leaked by the pre-fix `autoDeliverPremiumPlugins` standalone branch) are reaped unconditionally — there is no documented override path for standalones at `platform/plugins/<name>/` — and the reaper logs `[premium-auto-deliver] reaped standalone=<name> matches-source=<true|false>` so divergent reaps leave a forensic trail.
147
151
 
148
152
  Plugins are installed and managed through conversation. You can add marketplace plugins (like Stripe) or use Maxy's built-in ones (contacts, memory, Telegram).
@@ -5,6 +5,8 @@ description: "Install, remove, enable, and configure plugins and account setting
5
5
 
6
6
  # Plugin Management
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  Manage plugins and account settings at any time via conversation.
9
11
 
10
12
  ## Claude Official Plugins
@@ -22,6 +22,8 @@ description: >
22
22
 
23
23
  # Professional document
24
24
 
25
+ Invoked from `specialists:content-producer`.
26
+
25
27
  Compose a single A4 PDF of a generic business document from an operator brief, brand tokens, and the graph. The skill body is the workflow contract; load it once via `Skill professional-document` at the start of the turn and follow it through to delivery.
26
28
 
27
29
  ## Refusal taxonomy (run first, before any composition)
@@ -5,6 +5,8 @@ description: "Create, edit, clone, list, preview, and delete public agents, each
5
5
 
6
6
  # Public Agent Manager
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  Create, edit, clone, list, preview, and delete public agents. Each public agent is a self-contained directory under `agents/` with its own identity, personality, knowledge, and model.
9
11
 
10
12
  ## Agent Directory Structure
@@ -9,6 +9,8 @@ description: >
9
9
 
10
10
  # QR Code Generation
11
11
 
12
+ Invoked by the admin agent directly.
13
+
12
14
  Generate QR codes from user-provided data and deliver by stating the file path.
13
15
 
14
16
  ## When to Activate
@@ -5,6 +5,8 @@ description: "Reset the current session, list past sessions, continue a previous
5
5
 
6
6
  # Session management
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  This skill wraps the session tools and carries the discipline that keeps long-running work coherent across sessions. The platform handles a lot of session machinery automatically: this skill is for the moments where the owner names a session intent directly.
9
11
 
10
12
  ## The tools
@@ -5,6 +5,8 @@ description: "Guide the user through creating a new lean skill — collect name,
5
5
 
6
6
  # Skill Builder
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  A deterministic walkthrough for creating new lean skills. Follow each step in order. Be conversational — one question at a time.
9
11
 
10
12
  ## When to Activate
@@ -5,6 +5,8 @@ description: "Install, remove, and manage specialist subagents and premium plugi
5
5
 
6
6
  # Specialist Management
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  Manage specialist subagents at any time via conversation.
9
11
 
10
12
  ## Install a specialist
@@ -10,6 +10,8 @@ description: >
10
10
 
11
11
  # Stream Log Review
12
12
 
13
+ Invoked by the admin agent directly.
14
+
13
15
  Analyse Claude agent stream logs — the `claude-agent-stream-{sessionId}.log` files generated by the platform. Each file is scoped to exactly one conversation; a resumed conversation accumulates in one file across multiple process lifetimes, delimited by `[spawn]` / `[process-exit]`. Pre-conversation events (CDP auth-poll, module-init warnings) live in `preconversation-claude-agent-stream-{YYYY-MM-DD}.log` — a separate file per UTC day, read only when investigating boot-time failures.
14
16
 
15
17
  Parse the log, identify problems, attempt diagnosis, and produce a structured report.
@@ -5,6 +5,8 @@ description: Structured sprint workflow built only on officially-distributed Cla
5
5
 
6
6
  # Superpowers Sprint
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  A structured workflow for executing development work — features, bug fixes, refactors, any scoped unit of work — using only skills that ship with the official Claude Code distribution. No `gstack`, no custom plugin required.
9
11
 
10
12
  This skill is the maxy-code counterpart to `sprint`. The phase chain is identical in spirit; the difference is the skill at each phase. If both `gstack` and superpowers are installed and the project is set up for it, prefer `sprint` — its plan reviews are richer. Use this skill when `gstack` is not available.
@@ -17,6 +17,8 @@ allowed-tools:
17
17
 
18
18
  # Task Generation
19
19
 
20
+ Invoked by the admin agent directly.
21
+
20
22
  ## What this skill produces
21
23
 
22
24
  A single task entry that fully defines a unit of work — its motivation,
@@ -5,6 +5,8 @@ description: "Refresh a public agent's KNOWLEDGE.md from the current graph, scop
5
5
 
6
6
  # Update Knowledge
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  Refresh a public agent's KNOWLEDGE.md from the current graph, scoped to that agent's knowledge configuration.
9
11
 
10
12
  ## When to Use
@@ -5,6 +5,8 @@ description: "Upgrade Maxy to the latest published version by re-running the bra
5
5
 
6
6
  # Upgrade
7
7
 
8
+ Invoked by the admin agent directly.
9
+
8
10
  The operator wants to upgrade Maxy. Re-run the installer for the active brand; it is idempotent, brings the install to the latest published version, and restarts the brand service when it finishes.
9
11
 
10
12
  ## Resolve the brand package
@@ -5,6 +5,8 @@ description: Use when authoring or auditing a page whose primary purpose is to a
5
5
 
6
6
  # Structured-answer page template
7
7
 
8
+ Invoked from `specialists:content-producer`.
9
+
8
10
  Answer engines (Claude, ChatGPT, Perplexity, Google AI Overviews, Bing Copilot) lift a single short span when they cite a page. That span is almost always the first paragraph after the H1, when it is short and direct. Every other element on the page either supports the lift or gets ignored.
9
11
 
10
12
  ## The shape
@@ -32,6 +32,8 @@ Enquiries also arrive through the business's **published-site contact form**, wh
32
32
 
33
33
  Track status through the pipeline: enquiry → quoted → booked → completed → invoiced → paid.
34
34
 
35
+ When a built document — a quote, contract, proposal, or set of terms — needs a recordable signature without DocuSign, load the `e-sign` skill (`skill-load skillName="e-sign"`).
36
+
35
37
  ## Session & Task Continuity
36
38
 
37
39
  Every conversation is a session. At the start of each session:
@@ -57,7 +59,6 @@ Load the relevant reference when the task requires it:
57
59
  - **Triage & escalation** → `references/escalation.md` — urgency classification (RED/AMBER/GREEN), customer handoff protocol, voice IVR handling
58
60
  - **Scheduling & briefings** → `references/scheduling.md` — booking protocol, geographic clustering, travel time estimation, morning briefings, holiday mode, GPS integration
59
61
  - **Invoices & payment** → `references/invoicing.md` — HTML invoice creation, PDF generation via `browser-navigate` + `browser-pdf-save`, sending, payment chase protocol
60
- - **E-signatures** → `references/e-sign.md` — sign any hosted document (quote, contract, proposal): a Cloudflare Pages signing form captures the acceptance to D1, then the agent sweeps the row and emails both parties a PDF of the signed content
61
62
  - **Customer records** → `references/crm.md` — contact record management, `contact_lookup`/`contact_update` usage, pipeline tracking, when to create/update records
62
63
  - **Site form submissions** → `references/site-lead-intake.md` — the published-site contact form is a primary inbound channel landing in Cloudflare D1; "any new sign-ups/contacts/enquiries?" reads D1 first, then dedupes each unswept row into the graph and routes it to the recorded front-line owner
63
64
  - **Document filing** → `references/document-management.md` — dual-scope filing system, naming conventions, folder structure for customer-facing vs internal documents
@@ -1,12 +1,19 @@
1
+ ---
2
+ name: e-sign
3
+ description: "Put a legally-recordable signature on any hosted document — a quote, contract, proposal, or set of terms — without DocuSign. A Cloudflare Pages signing form captures the acceptance to D1; the agent then sweeps the row, renders the signed content to PDF, and emails both parties. Triggers: 'sign this proposal', 'get this contract signed', 'put a signature on this', 'e-signature', 'send for signature', 'accept a proposal online', 'signature on a document'."
4
+ ---
5
+
1
6
  # E-signatures — signing any hosted document (form → D1 → PDF + email)
2
7
 
8
+ **Invoked by the business-assistant (or admin) directly** when a built document — a quote, contract, proposal, or set of terms — needs a recordable signature.
9
+
3
10
  How to put a legally-recordable signature on **any** document the business hosts — a quote, a contract, a proposal, a set of terms — without DocuSign. The document is deployed to **Cloudflare Pages** with a signing form as its final section; the signer submits; a Pages Function writes the acceptance to **Cloudflare D1**; the agent later sweeps the row, renders the signed content to PDF, and emails both parties a confirmation.
4
11
 
5
- This reference owns **only the signature**: the form, the capture, the PDF, and the dispatch. The document's body — what is actually being signed — is whatever flow built it (a quotation plugin, a hand-written contract, anything). This begins at *"a built document needs a signature."*
12
+ This skill owns **only the signature**: the form, the capture, the PDF, and the dispatch. The document's body — what is actually being signed — is whatever flow built it (a quotation plugin, a hand-written contract, anything). This begins at *"a built document needs a signature."*
6
13
 
7
14
  It composes two patterns you must read alongside it:
8
15
 
9
- - **`cloudflare/references/d1-data-capture.md`** — the form → Pages Function → D1 → sweep mechanics, and the token-scope breakage (§ 0). Everything about minting the Pages-+-D1 token, `wrangler.toml`, and `wrangler d1 execute --remote` lives there; this reference does not repeat it.
16
+ - **`cloudflare/references/d1-data-capture.md`** — the form → Pages Function → D1 → sweep mechanics, and the token-scope breakage (§ 0). Everything about minting the Pages-+-D1 token, `wrangler.toml`, and `wrangler d1 execute --remote` lives there; this skill does not repeat it.
10
17
  - **`business-assistant/references/invoicing.md`** — PDF generation via `browser-navigate` + `browser-pdf-save` (its step 4). The signed-content PDF uses that exact pattern.
11
18
 
12
19
  Auth for every `wrangler`/API call is a minted narrow token per `cloudflare/references/api.md`. Deploy mechanics are `cloudflare/references/hosting-sites.md`.
@@ -5,6 +5,8 @@ description: Cloudflare operations for the install — tunnel setup/diagnosis/re
5
5
 
6
6
  # Cloudflare operations
7
7
 
8
+ Invoked from `specialists:personal-assistant`.
9
+
8
10
  This is the entry point for every Cloudflare task on the install. Pick the operation class, read the matching reference, run the command via Bash, relay the literal output, and prove the outcome with a live signal. There are no Cloudflare MCP tools; the plugin registers none. The agent never browser-automates the dashboard — the operator clicks where a click is genuinely required.
9
11
 
10
12
  | You want to… | Read | Outcome contract |
@@ -5,6 +5,8 @@ description: "Traces an academic or scientific claim through the publication cha
5
5
 
6
6
  # Academic verify
7
7
 
8
+ Invoked from `specialists:research-assistant`.
9
+
8
10
  This skill is for claims that arrive as "studies show", "research suggests", or a named paper title. It traces the claim to the actual paper, the actual journal, and the actual conclusion of the source. It never says "verified" without a primary source URL.
9
11
 
10
12
  ## When to run
@@ -5,6 +5,8 @@ description: "Reads a book the owner provides (PDF, ePub, web link, or text), wa
5
5
 
6
6
  # Book mirror
7
7
 
8
+ Invoked from `specialists:research-assistant`.
9
+
8
10
  This skill turns a book into a usable document by walking the chapters one at a time and asking, for each: "what does this say, and how does it apply to this specific owner". The output is a personalised pack the owner can read once and act on. It is grounded in the graph; the right-hand column is always specific to what the graph already knows about the owner.
9
11
 
10
12
  ## When to run
@@ -5,6 +5,8 @@ description: "Recipe-driven structured-data extraction. Takes a named recipe and
5
5
 
6
6
  # Data research
7
7
 
8
+ Invoked from `specialists:research-assistant`.
9
+
8
10
  This skill turns unstructured-looking sources (emails, reports, forms, web pages) into structured graph entities. The transformation is always recipe-driven: a named YAML recipe declares what fields to extract, what validations to apply, and what graph nodes to write. The skill runs a named recipe; it never invents a schema on the fly.
9
11
 
10
12
  **Default parent.** Every recipe declares its hierarchy parent via `graph_target.parent` — either `Project` (the run-time recipe argument names which Project elementId to attach to) or `LocalBusiness` (the account root, for cross-project recipes like investor-updates). The skill refuses to run a recipe whose `parent` field is missing or whose named Project does not exist. Per-row writes attach to that parent via the canonical containment edge; the recipe's `relationships:` block describes cross-hierarchy edges (e.g. `ROUND_FOR → Organization`) which are written separately and do not substitute for the parent.
@@ -20,6 +20,8 @@ config:
20
20
 
21
21
  # Deep Research Skill
22
22
 
23
+ Invoked from `specialists:research-assistant`.
24
+
23
25
  You are a research agent. Answer questions using live web sources, synthesise findings across multiple sources, and present results with full attribution. You do not guess. You search, read, extract, and cite.
24
26
 
25
27
  ## Workflow
@@ -5,6 +5,8 @@ description: "Reads a source (article, book, report, document) through a specifi
5
5
 
6
6
  # Strategic reading
7
7
 
8
+ Invoked from `specialists:research-assistant`.
9
+
8
10
  This skill reads a document with a specific question in mind. The owner names the lens (a project, a problem, a goal). The skill summarises what the source actually says, then translates each section into how it applies to the named lens, and closes with a playbook of three to seven concrete steps. Both halves are grounded: the left half in the source text, the right half in the graph.
9
11
 
10
12
  ## When to run
@@ -31,6 +31,8 @@ Everything {{productName}} can do is provided by a plugin. Each plugin is a self
31
31
 
32
32
  **How tools and roles reach the session.** Each `claude` PTY spawn registers every plugin's MCP server and every bundled subagent directory before the operator's first turn — a per-spawn `mcp-config.json` written by the session manager and passed as `--mcp-config` on the PTY argv, plus one `--add-dir` per agents directory. Admin sessions see every plugin and every role; public sessions see only plugins with at least one public-allowlisted tool. The manager refuses to start when a plugin's `PLUGIN.md` declares tools without a matching `mcp:` block (forensic signal: `boot-failed reason=mcp-allowlist-without-server …`). See `internals.md` "Spawn-time MCP and subagent registration" for the full mechanism and `internals.md` "Tool Eagerness" for the separate ToolSearch-vs-eager registration concern.
33
33
 
34
+ **MCP helper death observability (Task 706).** `claude` spawns each plugin MCP helper as its own child, so the manager cannot see a helper die. Every spawn-capable plugin therefore wraps its `mcp:` command with `lib/mcp-spawn-tee`, a parent-side node wrapper that is the helper's real parent and observes its true exit code, signal, and lifetime (including SIGKILL / transport crashes). The wrapper tees the helper's stderr to a wrapper-only per-session file `~/.{brand}/logs/mcp-<server>-<sessionId>.log` — never mixed with the admin-server enumeration copy — and emits lifecycle lines keyed `session=<id8> server=<name>`: `[mcp-helper] op=spawn … pid= entry=`, `[mcp-helper] op=boot … head=<first stderr bytes>`, and `[mcp-helper] op=exit … code= signal= lifetimeMs= stderr-tail=` on every exit (including a clean one). Lines are written synchronously to the per-session file and best-effort mirrored to `server.log` via the loopback log-ingest route. Diagnose a dead helper by `grep '\[mcp-helper\]' ~/.{brand}/logs/server.log` filtered by `session=<id8>`, then read the per-session file for its last output. Full contract and diagnostic path in [`.docs/mcp-helper-observability.md`](../../../.docs/mcp-helper-observability.md). The alive-but-wedged case (no process exit) is the deferred `[mcp-helper-census]` reconciler (Task 710).
35
+
34
36
  **Where premium bundle subs live.** Bundle subs (`loop`, `property-data`, `brochures`, etc. inside `real-agent`) live exclusively at `premium-plugins/<bundle>/plugins/<sub>/` and are registered via the resolver's bundle-descent walk. Standalone premiums (no `BUNDLE.md`, e.g. `writer-craft`, `teaching`, `venture-studio`) live exclusively at `premium-plugins/<name>/` and are registered via the resolver's dual-root scan (`platform/plugins/` and `premium-plugins/` are both `pluginsRoots`). Neither shape is flat-copied into `platform/plugins/<name>/`. A divergent flat copy of a bundle sub is treated as an operator override: the resolver refuses to boot with `boot-failed reason=mcp-plugin-duplicate <plugin> declared by more than one plugins root: <pathA> (sha=…) vs <pathB> (sha=…)` so the operator can `sha256sum` both paths and remove the stale one. Byte-identical bundle-sub flat copies left over from installer versions that flat-copied bundle subs are reaped on the first post-upgrade boot (`[premium-auto-deliver] reaped sub=<name> reason=duplicate-of-premium-tree`). Standalone flat copies (leaked by the pre-fix `autoDeliverPremiumPlugins` standalone branch) are reaped unconditionally — there is no documented override path for standalones at `platform/plugins/<name>/` — and the reaper logs `[premium-auto-deliver] reaped standalone=<name> matches-source=<true|false>` so divergent reaps leave a forensic trail.
35
37
 
36
38
  Plugins are installed and managed through conversation. You can add marketplace plugins (like Stripe) or use {{productName}}'s built-in ones (contacts, memory, Telegram).
@@ -58,6 +58,8 @@ Manages the agent's own dedicated email account — IMAP for reading, SMTP for s
58
58
 
59
59
  **Identity boundary (operator-identity fix).** This plugin manages the AGENT's email channel: an `:EmailAccount` node with IMAP/SMTP credentials, polling state, and the agent's `agentAddress`. It is NOT the operator-identity store. The operator's own email lives on the OWNS-bound `:Person` (`Person.email`) and is captured via `profile-update` with `personFields`. Confusing the two surfaces (writing the operator's personal email to `EmailAccount.agentAddress`, or vice versa) breaks routing AND identity coverage. See [.docs/agents.md § Coverage-driven elicitation bias] for the operator-identity contract.
60
60
 
61
+ **Login vs alias — the default recipient set.** A config carries two addresses. `email` is the IMAP login: the address you authenticate as, and an address this mailbox owns. `agentAddress` is an *additional* alias to surface (often a per-agent address on a shared catch-all mailbox). When they differ, `email-read`, `email-search`, `email-otp-extract`, and `email-fetch` default to surfacing mail whose **To or Cc** carries **either** address — not the alias alone — because replies commonly arrive at the login address, and a reply or multi-party thread routinely Cc's the alias rather than To'ing it (a proposal sent from `info@` is answered to `info@`, not the `maxy@` alias; a thread copies `maxy@` on Cc). When no distinct alias is configured, no recipient filter is applied. Pass an explicit `to=` to narrow to a single address. Whenever the default filter hides messages from the fetched window, `email-read`/`email-search` append a `Recipient filter: kept N, hid M (to ∈ {…}); pass to="…" to change.` line — including when every message was hidden — so "I can't see it" is never indistinguishable from "it isn't there". `email-fetch` has no tool-output filter line; its kept-vs-hidden split is recorded in the stderr `diag("fetchSinceUid", "filter applied", …)` log instead.
62
+
61
63
  ## Capabilities
62
64
 
63
65
  - **Provider lookup:** `email-provider-info` — given just an email address, returns the inferred IMAP/SMTP hosts and the provider's app-password / trusted-application / IMAP-enable requirement, deterministically from the provider map. Call this BEFORE soliciting a password so the requirement is relayed first; most providers reject the normal login password. Returns "unknown" (operator supplies hosts) or "unsupported" (provider blocks IMAP/SMTP, e.g. Tuta).
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=attachment-resolve.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-resolve.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/attachment-resolve.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, realpathSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { resolveOutboundAttachments, accountDirFor } from '../lib/attachment-resolve.js';
6
+ describe('Task 714 — attachment-resolve account-dir resolution', () => {
7
+ let root = ''; // stands in for dirname(PLATFORM_ROOT)
8
+ let platformRoot = '';
9
+ const accountId = 'acc-1';
10
+ let accountDir = '';
11
+ let inFile = '';
12
+ const saved = { ...process.env };
13
+ beforeEach(() => {
14
+ // realpath up front so realpathSync() inside the resolver (which canonicalizes
15
+ // /var → /private/var on macOS) matches the paths we assert against.
16
+ root = realpathSync(mkdtempSync(join(tmpdir(), 't714-')));
17
+ platformRoot = join(root, 'platform');
18
+ mkdirSync(platformRoot, { recursive: true });
19
+ accountDir = join(root, 'data', 'accounts', accountId);
20
+ mkdirSync(accountDir, { recursive: true });
21
+ inFile = join(accountDir, 'doc.pdf');
22
+ writeFileSync(inFile, 'x');
23
+ delete process.env.ACCOUNT_DIR;
24
+ delete process.env.PLATFORM_ROOT;
25
+ delete process.env.ACCOUNT_ID;
26
+ });
27
+ afterEach(() => {
28
+ process.env = { ...saved };
29
+ if (root)
30
+ rmSync(root, { recursive: true, force: true });
31
+ });
32
+ it('accountDirFor derives PLATFORM_ROOT/../data/accounts/<id>', () => {
33
+ process.env.PLATFORM_ROOT = platformRoot;
34
+ expect(accountDirFor(accountId)).toBe(accountDir);
35
+ });
36
+ it('accountDirFor returns undefined when PLATFORM_ROOT is absent', () => {
37
+ expect(accountDirFor(accountId)).toBeUndefined();
38
+ });
39
+ it('explicit accountDir validates an in-account file', () => {
40
+ const out = resolveOutboundAttachments(accountDir, [inFile]);
41
+ expect(out).toHaveLength(1);
42
+ expect(out[0].path).toBe(inFile);
43
+ });
44
+ it('falls back to PLATFORM_ROOT+ACCOUNT_ID when ACCOUNT_DIR is unset', () => {
45
+ process.env.PLATFORM_ROOT = platformRoot;
46
+ process.env.ACCOUNT_ID = accountId;
47
+ const out = resolveOutboundAttachments(undefined, [inFile]);
48
+ expect(out).toHaveLength(1);
49
+ });
50
+ it('uses ACCOUNT_DIR directly when present', () => {
51
+ process.env.ACCOUNT_DIR = accountDir;
52
+ const out = resolveOutboundAttachments(undefined, [inFile]);
53
+ expect(out).toHaveLength(1);
54
+ });
55
+ it('throws a precise error when neither source resolves', () => {
56
+ expect(() => resolveOutboundAttachments(undefined, [inFile])).toThrow(/no account context/);
57
+ });
58
+ it('still rejects a path outside the account directory', () => {
59
+ const outside = join(root, 'outside.pdf');
60
+ writeFileSync(outside, 'x');
61
+ expect(() => resolveOutboundAttachments(accountDir, [outside])).toThrow(/outside the account directory/);
62
+ });
63
+ it('returns [] for empty paths without needing any account context', () => {
64
+ expect(resolveOutboundAttachments(undefined, [])).toEqual([]);
65
+ expect(resolveOutboundAttachments(undefined, undefined)).toEqual([]);
66
+ });
67
+ });
68
+ //# sourceMappingURL=attachment-resolve.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-resolve.test.js","sourceRoot":"","sources":["../../src/__tests__/attachment-resolve.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=email-setup.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-setup.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/email-setup.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ // Mock the MX surface so an M365 custom domain can be driven deterministically,
3
+ // and the heavy IMAP/SMTP/credentials deps so emailSetup is exercised in
4
+ // isolation. The Microsoft short-circuit must return BEFORE any of these run.
5
+ const { resolveMx } = vi.hoisted(() => ({ resolveMx: vi.fn() }));
6
+ vi.mock("node:dns/promises", () => ({ resolveMx }));
7
+ const imap = vi.hoisted(() => ({ testConnection: vi.fn(), getInboxCount: vi.fn() }));
8
+ const smtp = vi.hoisted(() => ({ testConnection: vi.fn() }));
9
+ vi.mock("../lib/imap.js", () => imap);
10
+ vi.mock("../lib/smtp.js", () => smtp);
11
+ vi.mock("../lib/credentials.js", () => ({
12
+ writeConfig: vi.fn(),
13
+ writePassword: vi.fn(),
14
+ removeConfig: vi.fn(),
15
+ checkAddressBinding: vi.fn().mockResolvedValue(null),
16
+ writeBindingConfig: vi.fn(),
17
+ }));
18
+ const { emailSetup } = await import("../tools/email-setup.js");
19
+ describe("email-setup short-circuits Microsoft addresses", () => {
20
+ beforeEach(() => {
21
+ resolveMx.mockReset();
22
+ imap.testConnection.mockReset();
23
+ smtp.testConnection.mockReset();
24
+ });
25
+ it("refuses a static Microsoft address without attempting a connection", async () => {
26
+ const result = await emailSetup({
27
+ email: "agent@outlook.com",
28
+ password: "irrelevant",
29
+ accountId: "acct-1",
30
+ });
31
+ expect(result.success).toBe(false);
32
+ expect(result.message).toMatch(/outlook-account-register/);
33
+ expect(result.message).toMatch(/outlook plugin/i);
34
+ expect(imap.testConnection).not.toHaveBeenCalled();
35
+ expect(smtp.testConnection).not.toHaveBeenCalled();
36
+ expect(resolveMx).not.toHaveBeenCalled();
37
+ });
38
+ it("refuses an M365 custom domain detected by MX, even with hosts supplied", async () => {
39
+ resolveMx.mockResolvedValue([
40
+ { exchange: "contoso-com.mail.protection.outlook.com", priority: 0 },
41
+ ]);
42
+ const result = await emailSetup({
43
+ email: "ceo@contoso.com",
44
+ password: "irrelevant",
45
+ imapHost: "outlook.office365.com",
46
+ smtpHost: "smtp.office365.com",
47
+ accountId: "acct-1",
48
+ });
49
+ expect(result.success).toBe(false);
50
+ expect(result.message).toMatch(/outlook-account-register/);
51
+ expect(imap.testConnection).not.toHaveBeenCalled();
52
+ expect(smtp.testConnection).not.toHaveBeenCalled();
53
+ });
54
+ });
55
+ //# sourceMappingURL=email-setup.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-setup.test.js","sourceRoot":"","sources":["../../src/__tests__/email-setup.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=providers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/providers.test.ts"],"names":[],"mappings":""}