@rubytech/create-maxy-code 0.1.74 → 0.1.79

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 (218) hide show
  1. package/dist/__tests__/plugin-install.test.js +2 -2
  2. package/dist/lib/plugin-install.js +1 -1
  3. package/package.json +1 -1
  4. package/payload/platform/config/brand.json +1 -1
  5. package/payload/platform/lib/graph-write/dist/index.js +1 -1
  6. package/payload/platform/lib/graph-write/src/index.ts +1 -1
  7. package/payload/platform/package.json +1 -1
  8. package/payload/platform/plugins/.claude-plugin/marketplace.json +101 -1
  9. package/payload/platform/plugins/admin/mcp/dist/index.js +112 -8
  10. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  11. package/payload/platform/plugins/admin/skills/commitment-followthrough/SKILL.md +1 -1
  12. package/payload/platform/plugins/admin/skills/session-management/SKILL.md +1 -1
  13. package/payload/platform/plugins/business-assistant/PLUGIN.md +1 -1
  14. package/payload/platform/plugins/business-assistant/references/task-management.md +13 -13
  15. package/payload/platform/plugins/contacts/mcp/dist/index.js +36 -5
  16. package/payload/platform/plugins/contacts/mcp/dist/index.js.map +1 -1
  17. package/payload/platform/plugins/docs/references/admin-session.md +7 -6
  18. package/payload/platform/plugins/docs/references/internals.md +2 -2
  19. package/payload/platform/plugins/email/mcp/dist/index.js +34 -3
  20. package/payload/platform/plugins/email/mcp/dist/index.js.map +1 -1
  21. package/payload/platform/plugins/memory/PLUGIN.md +1 -1
  22. package/payload/platform/plugins/memory/mcp/dist/index.js +78 -3
  23. package/payload/platform/plugins/memory/mcp/dist/index.js.map +1 -1
  24. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/neo4j-password-path.test.d.ts +2 -0
  25. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/neo4j-password-path.test.d.ts.map +1 -0
  26. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/neo4j-password-path.test.js +57 -0
  27. package/payload/platform/plugins/memory/mcp/dist/lib/__tests__/neo4j-password-path.test.js.map +1 -0
  28. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.d.ts.map +1 -1
  29. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js +9 -1
  30. package/payload/platform/plugins/memory/mcp/dist/lib/neo4j.js.map +1 -1
  31. package/payload/platform/plugins/memory/mcp/vitest.config.ts +2 -0
  32. package/payload/platform/plugins/memory/skills/conversation-archive-enrich/SKILL.md +2 -2
  33. package/payload/platform/plugins/outlook/mcp/dist/index.js +37 -5
  34. package/payload/platform/plugins/outlook/mcp/dist/index.js.map +1 -1
  35. package/payload/platform/plugins/projects/PLUGIN.md +3 -3
  36. package/payload/platform/plugins/projects/references/sprint.md +2 -2
  37. package/payload/platform/plugins/replicate/mcp/dist/index.js +27 -6
  38. package/payload/platform/plugins/replicate/mcp/dist/index.js.map +1 -1
  39. package/payload/platform/plugins/scheduling/mcp/dist/index.js +32 -3
  40. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  41. package/payload/platform/plugins/scheduling/skills/briefing/SKILL.md +2 -2
  42. package/payload/platform/plugins/tasks/.claude-plugin/plugin.json +1 -1
  43. package/payload/platform/plugins/tasks/mcp/dist/index.js +44 -3
  44. package/payload/platform/plugins/tasks/mcp/dist/index.js.map +1 -1
  45. package/payload/platform/plugins/waitlist/mcp/dist/index.js +30 -3
  46. package/payload/platform/plugins/waitlist/mcp/dist/index.js.map +1 -1
  47. package/payload/platform/plugins/work/.claude-plugin/plugin.json +17 -0
  48. package/payload/platform/plugins/{tasks → work}/.mcp.json +2 -2
  49. package/payload/platform/plugins/work/PLUGIN.md +120 -0
  50. package/payload/platform/plugins/work/mcp/dist/index.d.ts +2 -0
  51. package/payload/platform/plugins/work/mcp/dist/index.d.ts.map +1 -0
  52. package/payload/platform/plugins/work/mcp/dist/index.js +543 -0
  53. package/payload/platform/plugins/work/mcp/dist/index.js.map +1 -0
  54. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.d.ts +7 -0
  55. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.d.ts.map +1 -0
  56. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.js +24 -0
  57. package/payload/platform/plugins/work/mcp/dist/lib/embeddings.js.map +1 -0
  58. package/payload/platform/plugins/work/mcp/dist/lib/neo4j.d.ts +5 -0
  59. package/payload/platform/plugins/work/mcp/dist/lib/neo4j.d.ts.map +1 -0
  60. package/payload/platform/plugins/work/mcp/dist/lib/neo4j.js +40 -0
  61. package/payload/platform/plugins/work/mcp/dist/lib/neo4j.js.map +1 -0
  62. package/payload/platform/plugins/work/mcp/dist/tools/project-complete.d.ts +17 -0
  63. package/payload/platform/plugins/work/mcp/dist/tools/project-complete.d.ts.map +1 -0
  64. package/payload/platform/plugins/work/mcp/dist/tools/project-complete.js +76 -0
  65. package/payload/platform/plugins/work/mcp/dist/tools/project-complete.js.map +1 -0
  66. package/payload/platform/plugins/work/mcp/dist/tools/project-create.d.ts +29 -0
  67. package/payload/platform/plugins/work/mcp/dist/tools/project-create.d.ts.map +1 -0
  68. package/payload/platform/plugins/work/mcp/dist/tools/project-create.js +235 -0
  69. package/payload/platform/plugins/work/mcp/dist/tools/project-create.js.map +1 -0
  70. package/payload/platform/plugins/work/mcp/dist/tools/project-get.d.ts +40 -0
  71. package/payload/platform/plugins/work/mcp/dist/tools/project-get.d.ts.map +1 -0
  72. package/payload/platform/plugins/work/mcp/dist/tools/project-get.js +125 -0
  73. package/payload/platform/plugins/work/mcp/dist/tools/project-get.js.map +1 -0
  74. package/payload/platform/plugins/work/mcp/dist/tools/project-list.d.ts +26 -0
  75. package/payload/platform/plugins/work/mcp/dist/tools/project-list.d.ts.map +1 -0
  76. package/payload/platform/plugins/work/mcp/dist/tools/project-list.js +81 -0
  77. package/payload/platform/plugins/work/mcp/dist/tools/project-list.js.map +1 -0
  78. package/payload/platform/plugins/work/mcp/dist/tools/project-update.d.ts +19 -0
  79. package/payload/platform/plugins/work/mcp/dist/tools/project-update.d.ts.map +1 -0
  80. package/payload/platform/plugins/work/mcp/dist/tools/project-update.js +102 -0
  81. package/payload/platform/plugins/work/mcp/dist/tools/project-update.js.map +1 -0
  82. package/payload/platform/plugins/work/mcp/dist/tools/session-list.d.ts +20 -0
  83. package/payload/platform/plugins/work/mcp/dist/tools/session-list.d.ts.map +1 -0
  84. package/payload/platform/plugins/work/mcp/dist/tools/session-list.js +37 -0
  85. package/payload/platform/plugins/work/mcp/dist/tools/session-list.js.map +1 -0
  86. package/payload/platform/plugins/work/mcp/dist/tools/session-name.d.ts +12 -0
  87. package/payload/platform/plugins/work/mcp/dist/tools/session-name.d.ts.map +1 -0
  88. package/payload/platform/plugins/work/mcp/dist/tools/session-name.js +28 -0
  89. package/payload/platform/plugins/work/mcp/dist/tools/session-name.js.map +1 -0
  90. package/payload/platform/plugins/work/mcp/dist/tools/work-complete.d.ts +16 -0
  91. package/payload/platform/plugins/work/mcp/dist/tools/work-complete.d.ts.map +1 -0
  92. package/payload/platform/plugins/work/mcp/dist/tools/work-complete.js +33 -0
  93. package/payload/platform/plugins/work/mcp/dist/tools/work-complete.js.map +1 -0
  94. package/payload/platform/plugins/work/mcp/dist/tools/work-create.d.ts +63 -0
  95. package/payload/platform/plugins/work/mcp/dist/tools/work-create.d.ts.map +1 -0
  96. package/payload/platform/plugins/work/mcp/dist/tools/work-create.js +141 -0
  97. package/payload/platform/plugins/work/mcp/dist/tools/work-create.js.map +1 -0
  98. package/payload/platform/plugins/work/mcp/dist/tools/work-get.d.ts +19 -0
  99. package/payload/platform/plugins/work/mcp/dist/tools/work-get.d.ts.map +1 -0
  100. package/payload/platform/plugins/work/mcp/dist/tools/work-get.js +51 -0
  101. package/payload/platform/plugins/work/mcp/dist/tools/work-get.js.map +1 -0
  102. package/payload/platform/plugins/work/mcp/dist/tools/work-list.d.ts +18 -0
  103. package/payload/platform/plugins/work/mcp/dist/tools/work-list.d.ts.map +1 -0
  104. package/payload/platform/plugins/work/mcp/dist/tools/work-list.js +66 -0
  105. package/payload/platform/plugins/work/mcp/dist/tools/work-list.js.map +1 -0
  106. package/payload/platform/plugins/work/mcp/dist/tools/work-ready.d.ts +21 -0
  107. package/payload/platform/plugins/work/mcp/dist/tools/work-ready.d.ts.map +1 -0
  108. package/payload/platform/plugins/work/mcp/dist/tools/work-ready.js +54 -0
  109. package/payload/platform/plugins/work/mcp/dist/tools/work-ready.js.map +1 -0
  110. package/payload/platform/plugins/work/mcp/dist/tools/work-relate.d.ts +12 -0
  111. package/payload/platform/plugins/work/mcp/dist/tools/work-relate.d.ts.map +1 -0
  112. package/payload/platform/plugins/work/mcp/dist/tools/work-relate.js +59 -0
  113. package/payload/platform/plugins/work/mcp/dist/tools/work-relate.js.map +1 -0
  114. package/payload/platform/plugins/work/mcp/dist/tools/work-update.d.ts +32 -0
  115. package/payload/platform/plugins/work/mcp/dist/tools/work-update.d.ts.map +1 -0
  116. package/payload/platform/plugins/work/mcp/dist/tools/work-update.js +112 -0
  117. package/payload/platform/plugins/work/mcp/dist/tools/work-update.js.map +1 -0
  118. package/payload/platform/plugins/{tasks → work}/mcp/package.json +1 -1
  119. package/payload/platform/plugins/workflows/mcp/dist/index.js +32 -3
  120. package/payload/platform/plugins/workflows/mcp/dist/index.js.map +1 -1
  121. package/payload/platform/scripts/conversation-id-allowlist.txt +4 -4
  122. package/payload/platform/scripts/seed-neo4j.sh +1 -1
  123. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  124. package/payload/platform/services/claude-session-manager/dist/http-server.js +34 -5
  125. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  126. package/payload/platform/services/claude-session-manager/dist/index.js +32 -0
  127. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  128. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +33 -1
  129. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  130. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +170 -39
  131. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  132. package/payload/platform/services/claude-session-manager/dist/specialist-drift.d.ts.map +1 -1
  133. package/payload/platform/services/claude-session-manager/dist/specialist-drift.js +10 -4
  134. package/payload/platform/services/claude-session-manager/dist/specialist-drift.js.map +1 -1
  135. package/payload/platform/templates/agents/admin/IDENTITY.md +22 -38
  136. package/payload/platform/templates/agents/admin/SOUL.md +0 -38
  137. package/payload/platform/templates/specialists/agents/database-operator.md +1 -1
  138. package/payload/platform/templates/specialists/agents/librarian.md +1 -1
  139. package/payload/platform/templates/specialists/agents/personal-assistant.md +1 -1
  140. package/payload/platform/templates/specialists/agents/project-manager.md +3 -3
  141. package/payload/premium-plugins/real-agent/plugins/leads/PLUGIN.md +1 -1
  142. package/payload/server/{chunk-ITQ55PCQ.js → chunk-TFEIFU7F.js} +1 -1
  143. package/payload/server/{chunk-HZ77KMTV.js → chunk-W33UUYYR.js} +1 -4
  144. package/payload/server/{cloudflare-task-tracker-PZBX7X3D.js → cloudflare-task-tracker-7P355PSD.js} +1 -1
  145. package/payload/server/maxy-edge.js +1 -1
  146. package/payload/server/public/assets/{admin-DcqVybWZ.js → admin-Bn3SKHdv.js} +1 -1
  147. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-C6vU0NST.js → architectureDiagram-Q4EWVU46-VMeuB5OP.js} +1 -1
  148. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-CVaR8-w2.js → blockDiagram-DXYQGD6D-B7mq0Me0.js} +1 -1
  149. package/payload/server/public/assets/{brand-1AQwHifp.css → brand-CZQNuuLo.css} +1 -1
  150. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-DnFHlz0P.js → c4Diagram-AHTNJAMY-Btu6ejD1.js} +1 -1
  151. package/payload/server/public/assets/channel-C_bSLH4h.js +1 -0
  152. package/payload/server/public/assets/{chunk-336JU56O-B6a2-iht.js → chunk-336JU56O-DAL_d_Xa.js} +2 -2
  153. package/payload/server/public/assets/{chunk-426QAEUC-DxIW6EIp.js → chunk-426QAEUC-DPD9ot_N.js} +1 -1
  154. package/payload/server/public/assets/{chunk-4TB4RGXK-Bd_K_Vm8.js → chunk-4TB4RGXK-BexM9T-f.js} +1 -1
  155. package/payload/server/public/assets/{chunk-5FUZZQ4R-BrcNLOWO.js → chunk-5FUZZQ4R-EwDdji3T.js} +1 -1
  156. package/payload/server/public/assets/{chunk-5PVQY5BW-VlQyk4ta.js → chunk-5PVQY5BW-BP9uoVws.js} +1 -1
  157. package/payload/server/public/assets/{chunk-EDXVE4YY-BR-zR5uE.js → chunk-EDXVE4YY-DSFmUMEW.js} +1 -1
  158. package/payload/server/public/assets/{chunk-ENJZ2VHE-SZeptTG4.js → chunk-ENJZ2VHE-IVAy2Qk9.js} +1 -1
  159. package/payload/server/public/assets/{chunk-ICPOFSXX-CtefGo4C.js → chunk-ICPOFSXX-DkUupPox.js} +1 -1
  160. package/payload/server/public/assets/{chunk-OYMX7WX6-BozNOEbo.js → chunk-OYMX7WX6-BPnzam8G.js} +1 -1
  161. package/payload/server/public/assets/{chunk-U2HBQHQK-D96MbvO_.js → chunk-U2HBQHQK-xYNchOVT.js} +1 -1
  162. package/payload/server/public/assets/{chunk-X2U36JSP-gwEYUG8y.js → chunk-X2U36JSP-C1V_V8v8.js} +1 -1
  163. package/payload/server/public/assets/{chunk-YZCP3GAM-DDIFkTtt.js → chunk-YZCP3GAM-CUibW87w.js} +1 -1
  164. package/payload/server/public/assets/{chunk-ZZ45TVLE-C75vepuo.js → chunk-ZZ45TVLE-HkKx4xBt.js} +1 -1
  165. package/payload/server/public/assets/classDiagram-6PBFFD2Q-B6oW43xg.js +1 -0
  166. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D0237d4h.js +1 -0
  167. package/payload/server/public/assets/clone-AMRCmnen.js +1 -0
  168. package/payload/server/public/assets/{dagre-DwC2Bsrq.js → dagre-DIaJ9oMM.js} +1 -1
  169. package/payload/server/public/assets/{dagre-KV5264BT-DuukLv5C.js → dagre-KV5264BT-Oyox5ACd.js} +1 -1
  170. package/payload/server/public/assets/data-Mm3pTL1b.js +1 -0
  171. package/payload/server/public/assets/{device-url-actions-DDsULUXs.js → device-url-actions-BjDrEVoY.js} +1 -1
  172. package/payload/server/public/assets/{diagram-5BDNPKRD-DQWQd3WX.js → diagram-5BDNPKRD-DoGhkzBd.js} +1 -1
  173. package/payload/server/public/assets/{diagram-G4DWMVQ6-DbS_Ih5q.js → diagram-G4DWMVQ6-Dc3Ix-Dh.js} +1 -1
  174. package/payload/server/public/assets/{diagram-MMDJMWI5-BFDfdYgV.js → diagram-MMDJMWI5-CFM9_Ggj.js} +1 -1
  175. package/payload/server/public/assets/{diagram-TYMM5635-Dp48BsHY.js → diagram-TYMM5635-nMWgzxC3.js} +1 -1
  176. package/payload/server/public/assets/{erDiagram-SMLLAGMA-CKA6q8Cy.js → erDiagram-SMLLAGMA-DcQWiGgF.js} +1 -1
  177. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BVva2cwM.js → flowDiagram-DWJPFMVM-CcX5waal.js} +1 -1
  178. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-BuzV7Yj-.js → ganttDiagram-T4ZO3ILL-BTQWoD8W.js} +1 -1
  179. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-B188dI5e.js → gitGraphDiagram-UUTBAWPF-BHZcRznS.js} +1 -1
  180. package/payload/server/public/assets/graph-Cd4jsDi3.js +1 -0
  181. package/payload/server/public/assets/{graph-labels-Cp9MdDRy.js → graph-labels-CqsRzbp0.js} +1 -1
  182. package/payload/server/public/assets/{graphlib-D-7uYmP9.js → graphlib-BpUb9z9y.js} +1 -1
  183. package/payload/server/public/assets/{infoDiagram-42DDH7IO-CLvYxjeZ.js → infoDiagram-42DDH7IO-CBoiO8yF.js} +1 -1
  184. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-B9F97qbc.js → ishikawaDiagram-UXIWVN3A-mTDI_0As.js} +1 -1
  185. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-CWg6xF0d.js → journeyDiagram-VCZTEJTY-CcuU_0rp.js} +1 -1
  186. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-CUM2Zro1.js → kanban-definition-6JOO6SKY-BWA7Do5Y.js} +1 -1
  187. package/payload/server/public/assets/{line-B_dtxHKd.js → line-BlGptbDR.js} +1 -1
  188. package/payload/server/public/assets/{mermaid-parser.core-q8nXkWvq.js → mermaid-parser.core-hslUiqJ-.js} +1 -1
  189. package/payload/server/public/assets/{mermaid.core-BIZvK8d3.js → mermaid.core-DWU_5Faf.js} +3 -3
  190. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-DOl7v8YY.js → mindmap-definition-QFDTVHPH-B3_sQr-2.js} +1 -1
  191. package/payload/server/public/assets/{page-HcHeXd21.js → page-eQPbgLXP.js} +1 -1
  192. package/payload/server/public/assets/{page-Ybq9fvmk.js → page-lPEIoiHs.js} +1 -1
  193. package/payload/server/public/assets/{pieDiagram-DEJITSTG-CVFDHS9S.js → pieDiagram-DEJITSTG-02u2dI6Z.js} +1 -1
  194. package/payload/server/public/assets/{public-B_FEURBo.js → public-j7U67c6E.js} +3 -3
  195. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-DIx-sbIM.js → quadrantDiagram-34T5L4WZ-BfgiMQiy.js} +1 -1
  196. package/payload/server/public/assets/{requirementDiagram-MS252O5E-C9yrlgJP.js → requirementDiagram-MS252O5E-JKZoibIp.js} +1 -1
  197. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-Dn2R2x6-.js → sankeyDiagram-XADWPNL6-N1iaY19u.js} +1 -1
  198. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-C9QMqZZw.js → sequenceDiagram-FGHM5R23-DjU3oQ0_.js} +1 -1
  199. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DPzHXWge.js → stateDiagram-FHFEXIEX-BuFcldiV.js} +1 -1
  200. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-rZLYem3J.js +1 -0
  201. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-gRq4Cvlk.js → timeline-definition-GMOUNBTQ-3vztYjFm.js} +1 -1
  202. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-CJGA-zAB.js → vennDiagram-DHZGUBPP-Zdv9WVqJ.js} +1 -1
  203. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BFS9eK0s.js → wardleyDiagram-NUSXRM2D-CkTAZI7f.js} +1 -1
  204. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-D5Kqs-jt.js → xychartDiagram-5P7HB3ND-CgMCxpms.js} +1 -1
  205. package/payload/server/public/data.html +5 -5
  206. package/payload/server/public/graph.html +5 -5
  207. package/payload/server/public/index.html +7 -7
  208. package/payload/server/public/public.html +4 -4
  209. package/payload/server/server.js +50 -18
  210. package/payload/platform/plugins/tasks/PLUGIN.md +0 -120
  211. package/payload/server/public/assets/channel-Ccfjb07z.js +0 -1
  212. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Ci-ABevb.js +0 -1
  213. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BDQ3yWGx.js +0 -1
  214. package/payload/server/public/assets/clone-CuYGwTRT.js +0 -1
  215. package/payload/server/public/assets/data-DbNK3_l-.js +0 -1
  216. package/payload/server/public/assets/graph-yTqw4J01.js +0 -1
  217. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CcDXqSsh.js +0 -1
  218. /package/payload/server/public/assets/{brand-lfvUn_r6.js → brand-BnMilSyt.js} +0 -0
@@ -0,0 +1,19 @@
1
+ export interface TaskDetail {
2
+ taskId: string;
3
+ name: string;
4
+ description: string;
5
+ status: string;
6
+ priority: string;
7
+ dueDate?: string;
8
+ notes?: string;
9
+ createdAt: string;
10
+ updatedAt: string;
11
+ relationships: Array<{
12
+ type: string;
13
+ targetLabel: string;
14
+ targetId: string;
15
+ targetName?: string;
16
+ }>;
17
+ }
18
+ export declare function workGet(taskId: string, accountId: string): Promise<TaskDetail | null>;
19
+ //# sourceMappingURL=work-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-get.d.ts","sourceRoot":"","sources":["../../src/tools/work-get.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,KAAK,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA4D3F"}
@@ -0,0 +1,51 @@
1
+ import { getSession } from "../lib/neo4j.js";
2
+ export async function workGet(taskId, accountId) {
3
+ const session = getSession();
4
+ try {
5
+ // Fetch the task node
6
+ const taskResult = await session.run(`MATCH (t:Task {taskId: $taskId, accountId: $accountId}) RETURN t`, { taskId, accountId });
7
+ if (taskResult.records.length === 0)
8
+ return null;
9
+ const t = taskResult.records[0].get("t").properties;
10
+ // Fetch all outgoing relationships
11
+ const relResult = await session.run(`MATCH (t:Task {taskId: $taskId, accountId: $accountId})-[r]->(target)
12
+ RETURN type(r) AS relType, labels(target) AS targetLabels, elementId(target) AS targetId,
13
+ target.name AS targetName, target.givenName AS targetGivenName,
14
+ target.taskId AS targetTaskId`, { taskId, accountId });
15
+ const relationships = relResult.records.map((rec) => {
16
+ const targetLabels = rec.get("targetLabels");
17
+ const targetLabel = targetLabels[0] ?? "Unknown";
18
+ const targetId = rec.get("targetId");
19
+ // Best-effort name resolution across node types
20
+ const targetName = rec.get("targetName") ??
21
+ rec.get("targetGivenName") ??
22
+ rec.get("targetTaskId") ??
23
+ targetId;
24
+ return {
25
+ type: rec.get("relType"),
26
+ targetLabel,
27
+ targetId,
28
+ targetName,
29
+ };
30
+ });
31
+ const detail = {
32
+ taskId: t.taskId,
33
+ name: t.name,
34
+ description: t.description,
35
+ status: t.status,
36
+ priority: t.priority,
37
+ createdAt: t.createdAt,
38
+ updatedAt: t.updatedAt,
39
+ relationships,
40
+ };
41
+ if (t.dueDate)
42
+ detail.dueDate = t.dueDate;
43
+ if (t.notes)
44
+ detail.notes = t.notes;
45
+ return detail;
46
+ }
47
+ finally {
48
+ await session.close();
49
+ }
50
+ }
51
+ //# sourceMappingURL=work-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-get.js","sourceRoot":"","sources":["../../src/tools/work-get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAoB7C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,SAAiB;IAC7D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,kEAAkE,EAClE,EAAE,MAAM,EAAE,SAAS,EAAE,CACtB,CAAC;QAEF,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEjD,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;QAEpD,mCAAmC;QACnC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC;;;4CAGsC,EACtC,EAAE,MAAM,EAAE,SAAS,EAAE,CACtB,CAAC;QAEF,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAClD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAa,CAAC;YACzD,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YACjD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAW,CAAC;YAE/C,gDAAgD;YAChD,MAAM,UAAU,GACb,GAAG,CAAC,GAAG,CAAC,YAAY,CAAmB;gBACvC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAmB;gBAC5C,GAAG,CAAC,GAAG,CAAC,cAAc,CAAmB;gBAC1C,QAAQ,CAAC;YAEX,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAW;gBAClC,WAAW;gBACX,QAAQ;gBACR,UAAU;aACX,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAe;YACzB,MAAM,EAAE,CAAC,CAAC,MAAgB;YAC1B,IAAI,EAAE,CAAC,CAAC,IAAc;YACtB,WAAW,EAAE,CAAC,CAAC,WAAqB;YACpC,MAAM,EAAE,CAAC,CAAC,MAAgB;YAC1B,QAAQ,EAAE,CAAC,CAAC,QAAkB;YAC9B,SAAS,EAAE,CAAC,CAAC,SAAmB;YAChC,SAAS,EAAE,CAAC,CAAC,SAAmB;YAChC,aAAa;SACd,CAAC;QAEF,IAAI,CAAC,CAAC,OAAO;YAAE,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,OAAiB,CAAC;QACpD,IAAI,CAAC,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAAe,CAAC;QAE9C,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface TaskListParams {
2
+ accountId: string;
3
+ status?: string;
4
+ priority?: string;
5
+ relatedEntityId?: string;
6
+ limit?: number;
7
+ }
8
+ export interface TaskSummary {
9
+ taskId: string;
10
+ name: string;
11
+ status: string;
12
+ priority: string;
13
+ dueDate?: string;
14
+ createdAt: string;
15
+ updatedAt: string;
16
+ }
17
+ export declare function workList(params: TaskListParams): Promise<TaskSummary[]>;
18
+ //# sourceMappingURL=work-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-list.d.ts","sourceRoot":"","sources":["../../src/tools/work-list.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA8D7E"}
@@ -0,0 +1,66 @@
1
+ import { int } from "neo4j-driver";
2
+ import { getSession } from "../lib/neo4j.js";
3
+ export async function workList(params) {
4
+ const { accountId, status, priority, relatedEntityId, limit = 50 } = params;
5
+ const session = getSession();
6
+ try {
7
+ let query;
8
+ const queryParams = { accountId, limit: int(limit) };
9
+ if (relatedEntityId) {
10
+ // Tasks related to a specific entity via any relationship
11
+ query = `
12
+ MATCH (t:Task {accountId: $accountId})-[]->(e)
13
+ WHERE elementId(e) = $relatedEntityId
14
+ ${status ? "AND t.status = $status" : ""}
15
+ ${priority ? "AND t.priority = $priority" : ""}
16
+ RETURN t
17
+ ORDER BY t.createdAt DESC
18
+ LIMIT $limit
19
+ `;
20
+ queryParams.relatedEntityId = relatedEntityId;
21
+ }
22
+ else {
23
+ query = `
24
+ MATCH (t:Task {accountId: $accountId})
25
+ ${status || priority ? "WHERE" : ""}
26
+ ${status ? "t.status = $status" : ""}
27
+ ${status && priority ? "AND" : ""}
28
+ ${priority ? "t.priority = $priority" : ""}
29
+ RETURN t
30
+ ORDER BY
31
+ CASE t.priority
32
+ WHEN 'urgent' THEN 0
33
+ WHEN 'high' THEN 1
34
+ WHEN 'normal' THEN 2
35
+ WHEN 'low' THEN 3
36
+ ELSE 4
37
+ END,
38
+ t.createdAt DESC
39
+ LIMIT $limit
40
+ `;
41
+ }
42
+ if (status)
43
+ queryParams.status = status;
44
+ if (priority)
45
+ queryParams.priority = priority;
46
+ const result = await session.run(query, queryParams);
47
+ return result.records.map((rec) => {
48
+ const t = rec.get("t").properties;
49
+ const summary = {
50
+ taskId: t.taskId,
51
+ name: t.name,
52
+ status: t.status,
53
+ priority: t.priority,
54
+ createdAt: t.createdAt,
55
+ updatedAt: t.updatedAt,
56
+ };
57
+ if (t.dueDate)
58
+ summary.dueDate = t.dueDate;
59
+ return summary;
60
+ });
61
+ }
62
+ finally {
63
+ await session.close();
64
+ }
65
+ }
66
+ //# sourceMappingURL=work-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-list.js","sourceRoot":"","sources":["../../src/tools/work-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAoB7C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAsB;IACnD,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAE5E,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,IAAI,KAAa,CAAC;QAClB,MAAM,WAAW,GAA4B,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAE9E,IAAI,eAAe,EAAE,CAAC;YACpB,0DAA0D;YAC1D,KAAK,GAAG;;;UAGJ,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;UACtC,QAAQ,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE;;;;OAI/C,CAAC;YACF,WAAW,CAAC,eAAe,GAAG,eAAe,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,KAAK,GAAG;;UAEJ,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;UACjC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE;UAClC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;UAC/B,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;OAY3C,CAAC;QACJ,CAAC;QAED,IAAI,MAAM;YAAE,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;QACxC,IAAI,QAAQ;YAAE,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAE9C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAErD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;YAClC,MAAM,OAAO,GAAgB;gBAC3B,MAAM,EAAE,CAAC,CAAC,MAAgB;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAc;gBACtB,MAAM,EAAE,CAAC,CAAC,MAAgB;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAkB;gBAC9B,SAAS,EAAE,CAAC,CAAC,SAAmB;gBAChC,SAAS,EAAE,CAAC,CAAC,SAAmB;aACjC,CAAC;YACF,IAAI,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,OAAiB,CAAC;YACrD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface ReadyTask {
2
+ taskId: string;
3
+ name: string;
4
+ description: string;
5
+ priority: string;
6
+ dueDate?: string;
7
+ createdAt: string;
8
+ }
9
+ /**
10
+ * Returns tasks that are safe to start: status=pending, zero unresolved
11
+ * BLOCKS, and no AFFECTS conflict with currently active tasks.
12
+ *
13
+ * This is the product equivalent of the development lane compatibility
14
+ * matrix — it answers "what can I work on next without conflict?"
15
+ *
16
+ * Pending task is READY when:
17
+ * 1. No incomplete task BLOCKS it (sequential dependency)
18
+ * 2. No active task AFFECTS the same entity (conflict detection)
19
+ */
20
+ export declare function workReady(accountId: string): Promise<ReadyTask[]>;
21
+ //# sourceMappingURL=work-ready.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-ready.d.ts","sourceRoot":"","sources":["../../src/tools/work-ready.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA0CvE"}
@@ -0,0 +1,54 @@
1
+ import { getSession } from "../lib/neo4j.js";
2
+ /**
3
+ * Returns tasks that are safe to start: status=pending, zero unresolved
4
+ * BLOCKS, and no AFFECTS conflict with currently active tasks.
5
+ *
6
+ * This is the product equivalent of the development lane compatibility
7
+ * matrix — it answers "what can I work on next without conflict?"
8
+ *
9
+ * Pending task is READY when:
10
+ * 1. No incomplete task BLOCKS it (sequential dependency)
11
+ * 2. No active task AFFECTS the same entity (conflict detection)
12
+ */
13
+ export async function workReady(accountId) {
14
+ const session = getSession();
15
+ try {
16
+ const result = await session.run(`MATCH (t:Task {accountId: $accountId, status: 'pending'})
17
+ WHERE NOT EXISTS {
18
+ MATCH (blocker:Task {accountId: $accountId})-[:BLOCKS]->(t)
19
+ WHERE blocker.status IN ['pending', 'active']
20
+ }
21
+ AND NOT EXISTS {
22
+ MATCH (t)-[:AFFECTS]->(entity)<-[:AFFECTS]-(active:Task {accountId: $accountId})
23
+ WHERE active.status = 'active'
24
+ }
25
+ RETURN t
26
+ ORDER BY
27
+ CASE t.priority
28
+ WHEN 'urgent' THEN 0
29
+ WHEN 'high' THEN 1
30
+ WHEN 'normal' THEN 2
31
+ WHEN 'low' THEN 3
32
+ ELSE 4
33
+ END,
34
+ t.createdAt ASC
35
+ LIMIT 50`, { accountId });
36
+ return result.records.map((rec) => {
37
+ const t = rec.get("t").properties;
38
+ const task = {
39
+ taskId: t.taskId,
40
+ name: t.name,
41
+ description: t.description,
42
+ priority: t.priority,
43
+ createdAt: t.createdAt,
44
+ };
45
+ if (t.dueDate)
46
+ task.dueDate = t.dueDate;
47
+ return task;
48
+ });
49
+ }
50
+ finally {
51
+ await session.close();
52
+ }
53
+ }
54
+ //# sourceMappingURL=work-ready.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-ready.js","sourceRoot":"","sources":["../../src/tools/work-ready.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAW7C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B;;;;;;;;;;;;;;;;;;;gBAmBU,EACV,EAAE,SAAS,EAAE,CACd,CAAC;QAEF,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;YAClC,MAAM,IAAI,GAAc;gBACtB,MAAM,EAAE,CAAC,CAAC,MAAgB;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAc;gBACtB,WAAW,EAAE,CAAC,CAAC,WAAqB;gBACpC,QAAQ,EAAE,CAAC,CAAC,QAAkB;gBAC9B,SAAS,EAAE,CAAC,CAAC,SAAmB;aACjC,CAAC;YACF,IAAI,CAAC,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAiB,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ declare const ALLOWED_REL_TYPES: readonly ["AFFECTS", "RAISED_BY", "PART_OF", "BLOCKS"];
2
+ type RelType = typeof ALLOWED_REL_TYPES[number];
3
+ export interface TaskRelateParams {
4
+ taskId: string;
5
+ accountId: string;
6
+ targetId: string;
7
+ targetLabel: string;
8
+ relType: RelType;
9
+ }
10
+ export declare function workRelate(params: TaskRelateParams): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=work-relate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-relate.d.ts","sourceRoot":"","sources":["../../src/tools/work-relate.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,iBAAiB,wDAAyD,CAAC;AACjF,KAAK,OAAO,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAIhD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwExE"}
@@ -0,0 +1,59 @@
1
+ import { getSession } from "../lib/neo4j.js";
2
+ const ALLOWED_REL_TYPES = ["AFFECTS", "RAISED_BY", "PART_OF", "BLOCKS"];
3
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
4
+ export async function workRelate(params) {
5
+ const { taskId, accountId, targetId, targetLabel, relType } = params;
6
+ if (!ALLOWED_REL_TYPES.includes(relType)) {
7
+ throw new Error(`Invalid relationship type: ${relType}. Must be one of: ${ALLOWED_REL_TYPES.join(", ")}`);
8
+ }
9
+ const isTaskTarget = targetLabel === "Task";
10
+ const session = getSession();
11
+ try {
12
+ // Verify the source task exists
13
+ const taskCheck = await session.run(`MATCH (t:Task {taskId: $taskId, accountId: $accountId}) RETURN t`, { taskId, accountId });
14
+ if (taskCheck.records.length === 0) {
15
+ throw new Error(`Task not found: ${taskId}`);
16
+ }
17
+ // Verify the target node exists
18
+ // Task targets: match by taskId property (UUID from task-create)
19
+ // Non-Task targets: match by elementId (from memory-search results)
20
+ let targetCheck;
21
+ if (isTaskTarget) {
22
+ targetCheck = await session.run(`MATCH (target:Task {taskId: $targetId, accountId: $accountId}) RETURN target`, { targetId, accountId });
23
+ }
24
+ else {
25
+ targetCheck = await session.run(`MATCH (target)
26
+ WHERE elementId(target) = $targetId AND $targetLabel IN labels(target)
27
+ RETURN target`, { targetId, targetLabel });
28
+ }
29
+ if (targetCheck.records.length === 0) {
30
+ if (isTaskTarget) {
31
+ const hint = !UUID_RE.test(targetId)
32
+ ? ` (the value looks like an elementId, not a UUID — use the taskId returned by task-create)`
33
+ : "";
34
+ throw new Error(`Target task not found with taskId: ${targetId}${hint}`);
35
+ }
36
+ else {
37
+ const hint = UUID_RE.test(targetId)
38
+ ? ` (the value looks like a UUID — non-Task targets require an elementId from memory-search)`
39
+ : "";
40
+ throw new Error(`Target ${targetLabel} not found with elementId: ${targetId}${hint}`);
41
+ }
42
+ }
43
+ // Create the relationship (idempotent — MERGE avoids duplicates)
44
+ if (isTaskTarget) {
45
+ await session.run(`MATCH (t:Task {taskId: $taskId, accountId: $accountId})
46
+ MATCH (target:Task {taskId: $targetId, accountId: $accountId})
47
+ MERGE (t)-[:${relType}]->(target)`, { taskId, accountId, targetId });
48
+ }
49
+ else {
50
+ await session.run(`MATCH (t:Task {taskId: $taskId, accountId: $accountId})
51
+ MATCH (target) WHERE elementId(target) = $targetId
52
+ MERGE (t)-[:${relType}]->(target)`, { taskId, accountId, targetId });
53
+ }
54
+ }
55
+ finally {
56
+ await session.close();
57
+ }
58
+ }
59
+ //# sourceMappingURL=work-relate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-relate.js","sourceRoot":"","sources":["../../src/tools/work-relate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAGjF,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAUlF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAwB;IACvD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAErE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,qBAAqB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,KAAK,MAAM,CAAC;IAE5C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,gCAAgC;QAChC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,kEAAkE,EAClE,EAAE,MAAM,EAAE,SAAS,EAAE,CACtB,CAAC;QAEF,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,gCAAgC;QAChC,iEAAiE;QACjE,oEAAoE;QACpE,IAAI,WAAW,CAAC;QAChB,IAAI,YAAY,EAAE,CAAC;YACjB,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,8EAA8E,EAC9E,EAAE,QAAQ,EAAE,SAAS,EAAE,CACxB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B;;uBAEe,EACf,EAAE,QAAQ,EAAE,WAAW,EAAE,CAC1B,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAClC,CAAC,CAAC,2FAA2F;oBAC7F,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,GAAG,IAAI,EAAE,CAAC,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;oBACjC,CAAC,CAAC,2FAA2F;oBAC7F,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,UAAU,WAAW,8BAA8B,QAAQ,GAAG,IAAI,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,OAAO,CAAC,GAAG,CACf;;uBAEe,OAAO,aAAa,EACnC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAChC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,CAAC,GAAG,CACf;;uBAEe,OAAO,aAAa,EACnC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAChC,CAAC;QACJ,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ export interface TaskUpdateParams {
2
+ taskId: string;
3
+ accountId: string;
4
+ name?: string;
5
+ description?: string;
6
+ /**
7
+ * Status enum (`running` discriminates "action mid-flight" from `active`
8
+ * ("commitment accepted")). Transition
9
+ * to `completed` or `failed` auto-sets `completedAt`. Transition to
10
+ * `failed` also requires `errorMessage` to be non-empty.
11
+ */
12
+ status?: "pending" | "active" | "running" | "completed" | "failed" | "cancelled";
13
+ priority?: "low" | "normal" | "high" | "urgent";
14
+ dueDate?: string;
15
+ /** Appended to notes with a timestamp — never overwrites */
16
+ note?: string;
17
+ /**
18
+ * append a single step label to the Task's `steps[]` array.
19
+ * Atomic Cypher SET t.steps = coalesce(t.steps, []) + $step (no
20
+ * read-modify-write race). Each appendStep call adds one entry; emit
21
+ * one call per phase of the action.
22
+ */
23
+ appendStep?: string;
24
+ /**
25
+ * error message stored on the Task when status transitions
26
+ * to `failed`. Required for the `failed` transition; empty errorMessage
27
+ * with status=failed is rejected.
28
+ */
29
+ errorMessage?: string;
30
+ }
31
+ export declare function workUpdate(params: TaskUpdateParams): Promise<void>;
32
+ //# sourceMappingURL=work-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-update.d.ts","sourceRoot":"","sources":["../../src/tools/work-update.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACjF,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsIxE"}
@@ -0,0 +1,112 @@
1
+ import { getSession } from "../lib/neo4j.js";
2
+ import { computeEmbedding } from "../lib/embeddings.js";
3
+ export async function workUpdate(params) {
4
+ const { taskId, accountId, name, description, status, priority, dueDate, note, appendStep, errorMessage } = params;
5
+ if (status === "failed" && (!errorMessage || errorMessage.trim().length === 0)) {
6
+ throw new Error("task-update: errorMessage is required when status transitions to 'failed'.");
7
+ }
8
+ const session = getSession();
9
+ try {
10
+ // Fetch current task to build updated embedding and append note. Also
11
+ // fetches `kind` so the lifecycle log line below knows whether this
12
+ // Task is an action record (kind set) vs commitment-tracking (kind null).
13
+ const existing = await session.run(`MATCH (t:Task {taskId: $taskId, accountId: $accountId})
14
+ RETURN t.name AS name, t.description AS description, t.notes AS notes,
15
+ t.status AS status, t.priority AS priority, t.kind AS kind,
16
+ size(coalesce(t.steps, [])) AS stepsCount`, { taskId, accountId });
17
+ if (existing.records.length === 0) {
18
+ throw new Error(`Task not found: ${taskId}`);
19
+ }
20
+ const rec = existing.records[0];
21
+ const currentName = rec.get("name");
22
+ const currentDescription = rec.get("description");
23
+ const currentNotes = rec.get("notes") ?? "";
24
+ const currentStatus = rec.get("status");
25
+ const currentPriority = rec.get("priority");
26
+ const kind = rec.get("kind") ?? null;
27
+ const newName = name ?? currentName;
28
+ const newDescription = description ?? currentDescription;
29
+ const newStatus = status ?? currentStatus;
30
+ const newPriority = priority ?? currentPriority;
31
+ // Append note with timestamp (append-only — never overwrite)
32
+ let newNotes = currentNotes;
33
+ if (note) {
34
+ const timestamp = new Date().toISOString().slice(0, 16).replace("T", " ");
35
+ newNotes = currentNotes
36
+ ? `${currentNotes}\n[${timestamp}] ${note}`
37
+ : `[${timestamp}] ${note}`;
38
+ }
39
+ const nowIso = new Date().toISOString();
40
+ const setClauses = [
41
+ "t.status = $status",
42
+ "t.priority = $priority",
43
+ "t.notes = $notes",
44
+ "t.updatedAt = $updatedAt",
45
+ ];
46
+ const queryParams = {
47
+ taskId,
48
+ accountId,
49
+ status: newStatus,
50
+ priority: newPriority,
51
+ notes: newNotes,
52
+ updatedAt: nowIso,
53
+ };
54
+ if (name !== undefined) {
55
+ setClauses.push("t.name = $name");
56
+ queryParams.name = name;
57
+ }
58
+ if (description !== undefined) {
59
+ setClauses.push("t.description = $description");
60
+ queryParams.description = description;
61
+ }
62
+ if (dueDate !== undefined) {
63
+ setClauses.push("t.dueDate = $dueDate");
64
+ queryParams.dueDate = dueDate;
65
+ }
66
+ // atomic steps[] append. Cypher `coalesce(t.steps, []) + $step`
67
+ // is one round-trip; no read-modify-write race even under concurrent
68
+ // appends (executeWrite serializes per-tx). Distinct from notes which
69
+ // is a free-form string field; steps is a structured action-phase log.
70
+ if (appendStep !== undefined) {
71
+ setClauses.push("t.steps = coalesce(t.steps, []) + $appendStep");
72
+ queryParams.appendStep = appendStep;
73
+ }
74
+ // completion lifecycle. completedAt set on terminal status
75
+ // transitions (completed | failed). errorMessage only persisted on
76
+ // `failed` (the contract above already validates non-empty).
77
+ if (status === "completed" || status === "failed") {
78
+ setClauses.push("t.completedAt = $completedAt");
79
+ queryParams.completedAt = nowIso;
80
+ }
81
+ if (status === "failed") {
82
+ setClauses.push("t.errorMessage = $errorMessage");
83
+ queryParams.errorMessage = errorMessage;
84
+ }
85
+ // Re-embed with updated values (substitute new name/description when provided)
86
+ const embeddingText = `Task: ${newName} — ${newDescription} status: ${newStatus} priority: ${newPriority}${newNotes ? " " + newNotes : ""}`;
87
+ const embedding = await computeEmbedding(embeddingText);
88
+ if (embedding.length > 0) {
89
+ setClauses.push("t.embedding = $embedding");
90
+ queryParams.embedding = embedding;
91
+ }
92
+ const updateRes = await session.run(`MATCH (t:Task {taskId: $taskId, accountId: $accountId})
93
+ SET ${setClauses.join(", ")}
94
+ RETURN size(coalesce(t.steps, [])) AS stepsCount`, queryParams);
95
+ // Lifecycle log lines — only for action Tasks (kind set). Commitment-
96
+ // tracking callers (no kind) stay silent on this channel so existing
97
+ // [task] grep targets aren't flooded with non-action noise.
98
+ if (kind) {
99
+ if (appendStep !== undefined) {
100
+ process.stderr.write(`[task] action-step kind=${kind} taskId=${taskId} step=${appendStep}\n`);
101
+ }
102
+ if (status === "completed" || status === "failed") {
103
+ const stepsCount = updateRes.records[0]?.get("stepsCount")?.toNumber?.() ?? 0;
104
+ process.stderr.write(`[task] action-done kind=${kind} taskId=${taskId} status=${status} stepsCount=${stepsCount}\n`);
105
+ }
106
+ }
107
+ }
108
+ finally {
109
+ await session.close();
110
+ }
111
+ }
112
+ //# sourceMappingURL=work-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-update.js","sourceRoot":"","sources":["../../src/tools/work-update.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "@maxy/tasks",
2
+ "name": "@maxy/work",
3
3
  "version": "0.1.0",
4
4
  "private": true,
5
5
  "type": "module",
@@ -22,9 +22,22 @@ const server = new McpServer({
22
22
  name: "maxy-workflows",
23
23
  version: "0.3.0",
24
24
  });
25
- const accountId = process.env.ACCOUNT_ID;
26
- if (!accountId) {
27
- throw new Error("ACCOUNT_ID environment variable is required");
25
+ // Plugin-system boot tolerance — see Task 202.
26
+ // Module-init must never throw; plugin-system spawn enumerates tools/list
27
+ // before ACCOUNT_ID is set. Per-call refusal preserves account isolation.
28
+ const accountId = process.env.ACCOUNT_ID ?? null;
29
+ process.stderr.write(`[workflows] boot accountId=${accountId ?? "null"}\n`);
30
+ function refuseNoAccount(toolName) {
31
+ process.stderr.write(`[workflows] tool=${toolName} refuse reason=no-account-context\n`);
32
+ return {
33
+ content: [
34
+ {
35
+ type: "text",
36
+ text: `${toolName} cannot execute: this MCP instance was launched without ACCOUNT_ID (plugin-system metadata-only mode). Per-account workflow writes require ACCOUNT_ID at spawn.`,
37
+ },
38
+ ],
39
+ isError: true,
40
+ };
28
41
  }
29
42
  const agentSlug = process.env.AGENT_SLUG || undefined;
30
43
  const sessionId = process.env.SESSION_ID || undefined;
@@ -55,6 +68,8 @@ eagerTool(server, "workflow-create", "Create a persistent workflow as an ordered
55
68
  .describe("What this workflow does — used for discovery via semantic search"),
56
69
  steps: z.array(stepSchema).min(1).max(50).describe("Ordered list of tool-call steps."),
57
70
  }, async (params) => {
71
+ if (!accountId)
72
+ return refuseNoAccount("workflow-create");
58
73
  try {
59
74
  const result = await workflowCreate({
60
75
  ...params,
@@ -96,6 +111,8 @@ eagerTool(server, "workflow-list", "List workflows for this account, optionally
96
111
  .describe("Filter by workflow status"),
97
112
  limit: z.number().int().min(1).max(100).optional().describe("Max results (default 50)"),
98
113
  }, async (params) => {
114
+ if (!accountId)
115
+ return refuseNoAccount("workflow-list");
99
116
  try {
100
117
  const workflows = await workflowList({ ...params, accountId });
101
118
  if (workflows.length === 0) {
@@ -131,6 +148,8 @@ eagerTool(server, "workflow-list", "List workflows for this account, optionally
131
148
  eagerTool(server, "workflow-get", "Fetch a single workflow by ID. Returns all fields including each step's tool reference and parameters.", {
132
149
  workflowId: workflowIdSchema,
133
150
  }, async ({ workflowId: wfId }) => {
151
+ if (!accountId)
152
+ return refuseNoAccount("workflow-get");
134
153
  try {
135
154
  const workflow = await workflowGet(wfId, accountId);
136
155
  if (!workflow) {
@@ -194,6 +213,8 @@ eagerTool(server, "workflow-update", "Update a workflow's name, description, ste
194
213
  .optional()
195
214
  .describe("New status (use 'paused' to deactivate without deleting)"),
196
215
  }, async (params) => {
216
+ if (!accountId)
217
+ return refuseNoAccount("workflow-update");
197
218
  const { workflowId: wfId, ...updates } = params;
198
219
  const hasUpdate = Object.values(updates).some((v) => v !== undefined);
199
220
  if (!hasUpdate) {
@@ -233,6 +254,8 @@ eagerTool(server, "workflow-update", "Update a workflow's name, description, ste
233
254
  eagerTool(server, "workflow-delete", "Soft-delete a workflow and cascade to its steps, runs, and step results. Nodes are marked :Trashed (restorable via memory-restore within the grace period) and permanently removed later by memory-empty-trash. Confirm with the user first.", {
234
255
  workflowId: workflowIdSchema,
235
256
  }, async ({ workflowId: wfId }) => {
257
+ if (!accountId)
258
+ return refuseNoAccount("workflow-delete");
236
259
  try {
237
260
  const result = await workflowDelete(wfId, accountId);
238
261
  const summary = result.alreadyTrashed
@@ -262,6 +285,8 @@ eagerTool(server, "workflow-delete", "Soft-delete a workflow and cascade to its
262
285
  eagerTool(server, "workflow-validate", "Validate a workflow's step capabilities. Checks that every referenced plugin directory and MCP server exist. Updates status to 'active' if all valid, 'draft' if any are missing.", {
263
286
  workflowId: workflowIdSchema,
264
287
  }, async ({ workflowId: wfId }) => {
288
+ if (!accountId)
289
+ return refuseNoAccount("workflow-validate");
265
290
  try {
266
291
  const result = await workflowValidate(wfId, accountId);
267
292
  if (result.valid) {
@@ -309,6 +334,8 @@ eagerTool(server, "workflow-execute", "Execute a workflow. Runs each step in dep
309
334
  .optional()
310
335
  .describe("What triggered this execution (default: conversational)"),
311
336
  }, async (params) => {
337
+ if (!accountId)
338
+ return refuseNoAccount("workflow-execute");
312
339
  try {
313
340
  const result = await workflowExecute({ ...params, accountId });
314
341
  const parts = [
@@ -345,6 +372,8 @@ eagerTool(server, "workflow-runs", "Query workflow execution history. Returns re
345
372
  .describe("Filter by run status"),
346
373
  limit: z.number().int().min(1).max(100).optional().describe("Max results (default 20)"),
347
374
  }, async (params) => {
375
+ if (!accountId)
376
+ return refuseNoAccount("workflow-runs");
348
377
  try {
349
378
  const runs = await workflowRuns({ ...params, accountId });
350
379
  if (runs.length === 0) {