@rubytech/create-maxy-code 0.1.38 → 0.1.40

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 (328) hide show
  1. package/dist/__tests__/onboarding-state-readback.test.js +61 -0
  2. package/dist/index.js +35 -101
  3. package/dist/onboarding-readback.js +27 -0
  4. package/dist/uninstall.js +11 -102
  5. package/package.json +1 -1
  6. package/payload/platform/lib/anthropic-key/dist/index.d.ts +22 -0
  7. package/payload/platform/lib/anthropic-key/dist/index.d.ts.map +1 -0
  8. package/payload/platform/lib/anthropic-key/dist/index.js +232 -0
  9. package/payload/platform/lib/anthropic-key/dist/index.js.map +1 -0
  10. package/payload/platform/package-lock.json +513 -753
  11. package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.d.ts +39 -0
  12. package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.d.ts.map +1 -0
  13. package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.js +249 -0
  14. package/payload/platform/plugins/admin/mcp/dist/lib/onboarding.js.map +1 -0
  15. package/payload/platform/plugins/docs/references/deployment.md +7 -3
  16. package/payload/platform/plugins/docs/references/platform.md +1 -1
  17. package/payload/platform/plugins/real-agency/plugins/.claude-plugin/marketplace.json +13 -0
  18. package/payload/platform/plugins/real-agency/plugins/loop/.claude-plugin/plugin.json +17 -0
  19. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.d.ts +2 -0
  20. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.d.ts.map +1 -0
  21. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.js +293 -0
  22. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/index.js.map +1 -0
  23. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts +10 -0
  24. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts.map +1 -0
  25. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js +88 -0
  26. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js.map +1 -0
  27. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts +82 -0
  28. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +1 -0
  29. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js +427 -0
  30. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js.map +1 -0
  31. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts +5 -0
  32. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +1 -0
  33. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js +40 -0
  34. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js.map +1 -0
  35. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +10 -0
  36. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +1 -0
  37. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js +24 -0
  38. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js.map +1 -0
  39. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts +16 -0
  40. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts.map +1 -0
  41. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js +35 -0
  42. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js.map +1 -0
  43. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts +5 -0
  44. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +1 -0
  45. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js +19 -0
  46. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js.map +1 -0
  47. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts +4 -0
  48. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts.map +1 -0
  49. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js +14 -0
  50. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js.map +1 -0
  51. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts +9 -0
  52. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts.map +1 -0
  53. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js +60 -0
  54. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js.map +1 -0
  55. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +13 -0
  56. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +1 -0
  57. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js +41 -0
  58. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +1 -0
  59. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +9 -0
  60. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +1 -0
  61. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js +16 -0
  62. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +1 -0
  63. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +15 -0
  64. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +1 -0
  65. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js +11 -0
  66. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +1 -0
  67. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts +10 -0
  68. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +1 -0
  69. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js +39 -0
  70. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js.map +1 -0
  71. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts +9 -0
  72. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +1 -0
  73. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js +125 -0
  74. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js.map +1 -0
  75. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts +18 -0
  76. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts.map +1 -0
  77. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js +87 -0
  78. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js.map +1 -0
  79. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts +10 -0
  80. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +1 -0
  81. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js +82 -0
  82. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js.map +1 -0
  83. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts +12 -0
  84. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +1 -0
  85. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js +32 -0
  86. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js.map +1 -0
  87. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts +15 -0
  88. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts.map +1 -0
  89. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js +11 -0
  90. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js.map +1 -0
  91. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts +16 -0
  92. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts.map +1 -0
  93. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js +41 -0
  94. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js.map +1 -0
  95. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts +13 -0
  96. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts.map +1 -0
  97. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js +49 -0
  98. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js.map +1 -0
  99. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts +7 -0
  100. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +1 -0
  101. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js +19 -0
  102. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js.map +1 -0
  103. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts +5 -0
  104. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts.map +1 -0
  105. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js +32 -0
  106. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js.map +1 -0
  107. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts +14 -0
  108. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +1 -0
  109. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js +11 -0
  110. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js.map +1 -0
  111. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +9 -0
  112. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +1 -0
  113. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js +85 -0
  114. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js.map +1 -0
  115. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts +13 -0
  116. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +1 -0
  117. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js +44 -0
  118. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js.map +1 -0
  119. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts +14 -0
  120. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +1 -0
  121. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js +18 -0
  122. package/payload/platform/plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js.map +1 -0
  123. package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
  124. package/payload/platform/services/claude-session-manager/dist/config.js +6 -1
  125. package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
  126. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.d.ts +7 -0
  127. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.d.ts.map +1 -0
  128. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.js +90 -0
  129. package/payload/platform/services/claude-session-manager/dist/hooks-discovery.js.map +1 -0
  130. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  131. package/payload/platform/services/claude-session-manager/dist/http-server.js +62 -0
  132. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  133. package/payload/platform/services/claude-session-manager/dist/index.js +22 -2
  134. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  135. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +3 -1
  136. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  137. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +10 -3
  138. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  139. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +54 -0
  140. package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
  141. package/payload/platform/services/claude-session-manager/dist/system-prompt.js +111 -0
  142. package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
  143. package/payload/platform/templates/agents/admin/IDENTITY.md +4 -2
  144. package/payload/platform/templates/agents/admin/SOUL.md +8 -14
  145. package/payload/premium-plugins/real-agency/plugins/.claude-plugin/marketplace.json +13 -0
  146. package/payload/premium-plugins/real-agency/plugins/loop/.claude-plugin/plugin.json +17 -0
  147. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.d.ts +2 -0
  148. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.d.ts.map +1 -0
  149. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.js +293 -0
  150. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/index.js.map +1 -0
  151. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts +10 -0
  152. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.d.ts.map +1 -0
  153. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js +88 -0
  154. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/crypto.js.map +1 -0
  155. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts +82 -0
  156. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +1 -0
  157. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js +427 -0
  158. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/loop-api.js.map +1 -0
  159. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts +5 -0
  160. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +1 -0
  161. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js +40 -0
  162. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/lib/neo4j.js.map +1 -0
  163. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +10 -0
  164. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +1 -0
  165. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js +24 -0
  166. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/customer-preferences.js.map +1 -0
  167. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts +16 -0
  168. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.d.ts.map +1 -0
  169. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js +35 -0
  170. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/feedback.js.map +1 -0
  171. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts +5 -0
  172. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +1 -0
  173. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js +19 -0
  174. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-deregister.js.map +1 -0
  175. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts +4 -0
  176. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.d.ts.map +1 -0
  177. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js +14 -0
  178. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-list.js.map +1 -0
  179. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts +9 -0
  180. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.d.ts.map +1 -0
  181. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js +60 -0
  182. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/key-register.js.map +1 -0
  183. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +13 -0
  184. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +1 -0
  185. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js +41 -0
  186. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +1 -0
  187. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +9 -0
  188. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +1 -0
  189. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js +16 -0
  190. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +1 -0
  191. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +15 -0
  192. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +1 -0
  193. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js +11 -0
  194. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +1 -0
  195. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts +10 -0
  196. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +1 -0
  197. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js +39 -0
  198. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/marketing-match.js.map +1 -0
  199. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts +9 -0
  200. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +1 -0
  201. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js +125 -0
  202. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-detail.js.map +1 -0
  203. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts +18 -0
  204. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.d.ts.map +1 -0
  205. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js +87 -0
  206. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/people-search.js.map +1 -0
  207. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts +10 -0
  208. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +1 -0
  209. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js +82 -0
  210. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-detail.js.map +1 -0
  211. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts +12 -0
  212. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +1 -0
  213. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js +32 -0
  214. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-listed.js.map +1 -0
  215. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts +15 -0
  216. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.d.ts.map +1 -0
  217. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js +11 -0
  218. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-request.js.map +1 -0
  219. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts +16 -0
  220. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.d.ts.map +1 -0
  221. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js +41 -0
  222. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/property-search.js.map +1 -0
  223. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts +13 -0
  224. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.d.ts.map +1 -0
  225. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js +49 -0
  226. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/supplier.js.map +1 -0
  227. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts +7 -0
  228. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +1 -0
  229. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js +19 -0
  230. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-availability.js.map +1 -0
  231. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts +5 -0
  232. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.d.ts.map +1 -0
  233. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js +32 -0
  234. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/team-info.js.map +1 -0
  235. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts +14 -0
  236. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +1 -0
  237. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js +11 -0
  238. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-create.js.map +1 -0
  239. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +9 -0
  240. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +1 -0
  241. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js +85 -0
  242. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-detail.js.map +1 -0
  243. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts +13 -0
  244. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +1 -0
  245. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js +44 -0
  246. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-search.js.map +1 -0
  247. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts +14 -0
  248. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +1 -0
  249. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js +18 -0
  250. package/payload/premium-plugins/real-agency/plugins/loop/mcp/dist/tools/viewing-update.js.map +1 -0
  251. package/payload/server/{chunk-NNHHGQJL.js → chunk-4P2MPERV.js} +6 -163
  252. package/payload/server/{chunk-3G6JMV7N.js → chunk-MEGIQYUD.js} +1 -1
  253. package/payload/server/{chunk-QC5LHYPH.js → chunk-XJVJ2B2Q.js} +1 -1
  254. package/payload/server/{cloudflare-task-tracker-NEB3X6O2.js → cloudflare-task-tracker-R6MMORFU.js} +2 -2
  255. package/payload/server/maxy-edge.js +2 -2
  256. package/payload/server/public/assets/{Checkbox-DAki3vDW.js → Checkbox-6lLDKzMP.js} +1 -1
  257. package/payload/server/public/assets/{admin-CyAZtsYZ.js → admin-DO9W2D9g.js} +1 -1
  258. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-C-hla3Ip.js → architectureDiagram-Q4EWVU46-BbLtk_k6.js} +1 -1
  259. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-CbzjtNs3.js → blockDiagram-DXYQGD6D-B9IgcgeJ.js} +1 -1
  260. package/payload/server/public/assets/{brand-Cun0PBrA.css → brand-DQrOw38P.css} +1 -1
  261. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-B87UblA0.js → c4Diagram-AHTNJAMY-BrvPS09f.js} +1 -1
  262. package/payload/server/public/assets/channel-Bmc1qlCD.js +1 -0
  263. package/payload/server/public/assets/{chunk-336JU56O-2a2pVlSg.js → chunk-336JU56O-DXOr0ZnC.js} +2 -2
  264. package/payload/server/public/assets/{chunk-426QAEUC-j9NOD8_a.js → chunk-426QAEUC-BFW4zwrV.js} +1 -1
  265. package/payload/server/public/assets/{chunk-4TB4RGXK-Cs872xAq.js → chunk-4TB4RGXK-D7_xc8xf.js} +1 -1
  266. package/payload/server/public/assets/{chunk-5FUZZQ4R-BnDFbZ_I.js → chunk-5FUZZQ4R-CdCSpb8j.js} +1 -1
  267. package/payload/server/public/assets/{chunk-5PVQY5BW-Bu5B3Hyf.js → chunk-5PVQY5BW-BVgnD9QR.js} +1 -1
  268. package/payload/server/public/assets/{chunk-EDXVE4YY-B96Fw4FF.js → chunk-EDXVE4YY-CYrT1Tom.js} +1 -1
  269. package/payload/server/public/assets/{chunk-ENJZ2VHE-CcGrGQim.js → chunk-ENJZ2VHE-B70d0jN7.js} +1 -1
  270. package/payload/server/public/assets/{chunk-ICPOFSXX-ZRvcI4Ai.js → chunk-ICPOFSXX-BcLouRbd.js} +1 -1
  271. package/payload/server/public/assets/{chunk-OYMX7WX6-B6RI9Fbf.js → chunk-OYMX7WX6-C2ja2fPj.js} +1 -1
  272. package/payload/server/public/assets/{chunk-U2HBQHQK-BYGHVYyo.js → chunk-U2HBQHQK-CCjoTpL6.js} +1 -1
  273. package/payload/server/public/assets/{chunk-X2U36JSP-rwNs-gTO.js → chunk-X2U36JSP-QIVkp-XR.js} +1 -1
  274. package/payload/server/public/assets/{chunk-YZCP3GAM-jPttJRap.js → chunk-YZCP3GAM-qD9rebhx.js} +1 -1
  275. package/payload/server/public/assets/{chunk-ZZ45TVLE-DLykWOT5.js → chunk-ZZ45TVLE-C0J_f05H.js} +1 -1
  276. package/payload/server/public/assets/classDiagram-6PBFFD2Q-RVZorqSk.js +1 -0
  277. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BEZem5bl.js +1 -0
  278. package/payload/server/public/assets/clone-B6eXIhiR.js +1 -0
  279. package/payload/server/public/assets/{dagre-jnQDnF-5.js → dagre-B3cA7jId.js} +1 -1
  280. package/payload/server/public/assets/{dagre-KV5264BT-C6wSzHX2.js → dagre-KV5264BT-C8lVFO5U.js} +1 -1
  281. package/payload/server/public/assets/data-BaSmBQ7U.js +1 -0
  282. package/payload/server/public/assets/{device-url-actions-y1tXNDZx.js → device-url-actions-qu2-XiHc.js} +1 -1
  283. package/payload/server/public/assets/{diagram-5BDNPKRD-N3X-n90h.js → diagram-5BDNPKRD-BYkcTelK.js} +1 -1
  284. package/payload/server/public/assets/{diagram-G4DWMVQ6-vfmbzdPd.js → diagram-G4DWMVQ6-B6f_WR4j.js} +1 -1
  285. package/payload/server/public/assets/{diagram-MMDJMWI5-BETmPx_w.js → diagram-MMDJMWI5-ALaKcN6w.js} +1 -1
  286. package/payload/server/public/assets/{diagram-TYMM5635-BSUGM4wG.js → diagram-TYMM5635-CkVg3crF.js} +1 -1
  287. package/payload/server/public/assets/{erDiagram-SMLLAGMA-CWZ9OwMb.js → erDiagram-SMLLAGMA-DszlTGIQ.js} +1 -1
  288. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-BpQOQS1a.js → flowDiagram-DWJPFMVM-C9-FqSlk.js} +1 -1
  289. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-Dc59igCS.js → ganttDiagram-T4ZO3ILL-faJU-5Zy.js} +1 -1
  290. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-D6lXg3zl.js → gitGraphDiagram-UUTBAWPF-Cck8_tiG.js} +1 -1
  291. package/payload/server/public/assets/{graph-labels-DFyNH0jb.js → graph-labels-COhLbJD0.js} +1 -1
  292. package/payload/server/public/assets/graph-qg6fkRyC.js +1 -0
  293. package/payload/server/public/assets/{graphlib-yG7kH8Fr.js → graphlib-CYRxeBXj.js} +1 -1
  294. package/payload/server/public/assets/{infoDiagram-42DDH7IO-TS9Pv8Os.js → infoDiagram-42DDH7IO-CLjEjhJX.js} +1 -1
  295. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-BJiJJTq6.js → ishikawaDiagram-UXIWVN3A-nSIaVXdw.js} +1 -1
  296. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-C7PW4fmw.js → journeyDiagram-VCZTEJTY-DuKq7d3g.js} +1 -1
  297. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BEk21ciD.js → kanban-definition-6JOO6SKY-Bt5xqHfY.js} +1 -1
  298. package/payload/server/public/assets/{line-DusyVWDE.js → line-BgV8qCP_.js} +1 -1
  299. package/payload/server/public/assets/{mermaid-parser.core-DeeojQSb.js → mermaid-parser.core-DQzl__pY.js} +1 -1
  300. package/payload/server/public/assets/{mermaid.core-p65Lo7Sj.js → mermaid.core-BAPEOjwh.js} +3 -3
  301. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-B0jxFxdS.js → mindmap-definition-QFDTVHPH-CmMBrI79.js} +1 -1
  302. package/payload/server/public/assets/{page-x5khmfRx.js → page-BoDdtGsH.js} +1 -1
  303. package/payload/server/public/assets/{page-BeYGnDzI.js → page-D_NCNi5j.js} +1 -1
  304. package/payload/server/public/assets/{pieDiagram-DEJITSTG-DJ5GKYt6.js → pieDiagram-DEJITSTG-BhsR9k6j.js} +1 -1
  305. package/payload/server/public/assets/{public-cnoUs7vq.js → public-DCcGKIMW.js} +4 -4
  306. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-BV7R-kwV.js → quadrantDiagram-34T5L4WZ-DSKV6d_A.js} +1 -1
  307. package/payload/server/public/assets/{requirementDiagram-MS252O5E-DRiLzlGN.js → requirementDiagram-MS252O5E-BccM48AI.js} +1 -1
  308. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-C5-6_cCI.js → sankeyDiagram-XADWPNL6-C0pxiQfn.js} +1 -1
  309. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-5FXm_VYM.js → sequenceDiagram-FGHM5R23-BVsUIJsW.js} +1 -1
  310. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-FCQTaGqV.js → stateDiagram-FHFEXIEX-lqYQZ-F1.js} +1 -1
  311. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-D2eHThhC.js +1 -0
  312. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-tvtq62ef.js → timeline-definition-GMOUNBTQ-D-LxYOHq.js} +1 -1
  313. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-Dk-k7CE4.js → vennDiagram-DHZGUBPP-BNHzvNba.js} +1 -1
  314. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-CZSrqniY.js → wardleyDiagram-NUSXRM2D-BfXR9l5s.js} +1 -1
  315. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CpGLpk7Q.js → xychartDiagram-5P7HB3ND-CL7mVEbT.js} +1 -1
  316. package/payload/server/public/data.html +5 -5
  317. package/payload/server/public/graph.html +6 -6
  318. package/payload/server/public/index.html +8 -8
  319. package/payload/server/public/public.html +5 -5
  320. package/payload/server/server.js +981 -859
  321. package/payload/server/public/assets/channel-CTNo72W7.js +0 -1
  322. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BaV5nDmT.js +0 -1
  323. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DOKlCKjY.js +0 -1
  324. package/payload/server/public/assets/clone-sQSwlSln.js +0 -1
  325. package/payload/server/public/assets/data-DbkuXcPb.js +0 -1
  326. package/payload/server/public/assets/graph-CC5_6-dg.js +0 -1
  327. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BdpPhdqg.js +0 -1
  328. /package/payload/server/public/assets/{brand-lj7EhWRg.js → brand-Bky-hMVw.js} +0 -0
@@ -0,0 +1,61 @@
1
+ // Task 033 — install-invariant for OnboardingState seed.
2
+ //
3
+ // The installer re-reads Neo4j after seed-neo4j.sh to verify the
4
+ // OnboardingState node landed. The parser turns cypher-shell's plain-
5
+ // format output into a tri-state outcome consumed by the loud-fail
6
+ // branch in src/index.ts. These tests fence the three outcomes the
7
+ // installer logs name: present / missing / unreachable.
8
+ import test from "node:test";
9
+ import assert from "node:assert/strict";
10
+ import { classifyOnboardingReadBack } from "../onboarding-readback.js";
11
+ test("non-zero exit → unreachable, with stderr tail captured", () => {
12
+ const outcome = classifyOnboardingReadBack({
13
+ status: 1,
14
+ stdout: "",
15
+ stderr: "Connection refused: bolt://localhost:7687",
16
+ });
17
+ assert.equal(outcome.kind, "unreachable");
18
+ if (outcome.kind === "unreachable") {
19
+ assert.match(outcome.stderrTail, /Connection refused/);
20
+ }
21
+ });
22
+ test("header row only (no match) → missing", () => {
23
+ // cypher-shell --format plain emits the column header even when zero rows
24
+ // matched. The seed-or-fail contract treats header-only as the loud-fail.
25
+ const outcome = classifyOnboardingReadBack({
26
+ status: 0,
27
+ stdout: "currentStep\n",
28
+ stderr: "",
29
+ });
30
+ assert.equal(outcome.kind, "missing");
31
+ });
32
+ test("data row present → present, currentStep relayed verbatim", () => {
33
+ const outcome = classifyOnboardingReadBack({
34
+ status: 0,
35
+ stdout: "currentStep\n0\n",
36
+ stderr: "",
37
+ });
38
+ assert.equal(outcome.kind, "present");
39
+ if (outcome.kind === "present") {
40
+ assert.equal(outcome.currentStep, "0");
41
+ }
42
+ });
43
+ test("empty stdout + zero exit → missing (defensive: cypher-shell flushed nothing)", () => {
44
+ const outcome = classifyOnboardingReadBack({
45
+ status: 0,
46
+ stdout: "",
47
+ stderr: "",
48
+ });
49
+ assert.equal(outcome.kind, "missing");
50
+ });
51
+ test("trailing whitespace tolerated on present row", () => {
52
+ const outcome = classifyOnboardingReadBack({
53
+ status: 0,
54
+ stdout: "currentStep\n0 \n\n",
55
+ stderr: "",
56
+ });
57
+ assert.equal(outcome.kind, "present");
58
+ if (outcome.kind === "present") {
59
+ assert.equal(outcome.currentStep, "0");
60
+ }
61
+ });
package/dist/index.js CHANGED
@@ -1597,9 +1597,8 @@ function provisionRemoteSessionSecret() {
1597
1597
  // install-time admin-auth invariant. Walks every account.json
1598
1598
  // under accountsDir and compares its admins[] to the persistent users.json,
1599
1599
  // emitting one [install-invariant] line per divergence and one summary line.
1600
- // Log-only (no install abort) so pre-Task-904 devices with already-divergent
1601
- // state still upgrade; future sprint can promote to refuse-or-degrade once
1602
- // the deployed fleet is audited clean. Mirror of
1600
+ // Log-only (no install abort); future sprint can promote to refuse-or-degrade
1601
+ // once the deployed fleet is audited clean. Mirror of
1603
1602
  // checkAdminAuthInvariant() in platform/lib/admins-write/src/index.ts.
1604
1603
  function runInstallInvariantCheck(usersFile, accountsDir) {
1605
1604
  const TAG = "[install-invariant]";
@@ -1686,71 +1685,23 @@ function deployPayload() {
1686
1685
  // Persistent config lives at ~/{configDir}/ — survives rm -rf ~/{installDir}
1687
1686
  const persistentDir = resolve(process.env.HOME ?? "/root", BRAND.configDir);
1688
1687
  const persistentPasswordFile = join(persistentDir, ".neo4j-password");
1689
- const persistentAccountsDir = join(persistentDir, "accounts");
1690
1688
  // Migrate: if password is in old location, move to persistent
1691
1689
  const oldPasswordFile = join(INSTALL_DIR, "platform/config/.neo4j-password");
1692
1690
  if (existsSync(oldPasswordFile) && !existsSync(persistentPasswordFile)) {
1693
1691
  mkdirSync(persistentDir, { recursive: true });
1694
1692
  cpSync(oldPasswordFile, persistentPasswordFile);
1695
1693
  }
1696
- const oldAccountsDir = join(INSTALL_DIR, "platform/config/accounts");
1697
- if (existsSync(oldAccountsDir) && !existsSync(persistentAccountsDir)) {
1698
- mkdirSync(persistentDir, { recursive: true });
1699
- cpSync(oldAccountsDir, persistentAccountsDir, { recursive: true });
1700
- }
1701
- // users.json lives at <persistentDir>/users.json. earlier
1702
- // installs wrote to <INSTALL_DIR>/platform/config/users.json (the wipe zone)
1703
- // and relied on a one-shot copy-up at first install plus a copy-back after
1704
- // every wipe. The copy-back overwrote LIVE with the FROZEN-AT-FIRST-INSTALL
1705
- // backup, dropping every admin row added since first install. Writers (paths.ts,
1706
- // admin-add, set-pin, seed-neo4j.sh, migrate-import.sh) now target the
1694
+ // users.json lives at <persistentDir>/users.json. Writers (paths.ts,
1695
+ // admin-add, set-pin, seed-neo4j.sh, migrate-import.sh) target the
1707
1696
  // persistent file directly — see comment in platform/ui/app/lib/paths.ts.
1708
- //
1709
- // Legacy pickup: if a pre-Task-904 install left users.json inside the wipe
1710
- // zone, copy it up once. Idempotent — guarded by !existsSync(persistentUsersFile).
1711
- // Safe to delete this block one release has been deployed
1712
- // everywhere; until then it absorbs upgrades from any pre-Task-904 version.
1713
1697
  const persistentUsersFile = join(persistentDir, "users.json");
1714
- const oldUsersFile = join(INSTALL_DIR, "platform/config/users.json");
1715
- if (existsSync(oldUsersFile) && !existsSync(persistentUsersFile)) {
1716
- mkdirSync(persistentDir, { recursive: true });
1717
- cpSync(oldUsersFile, persistentUsersFile);
1718
- console.log(" Migrated pre-Task-904 users.json to persistent storage.");
1719
- }
1720
- // Claude Code OAuth credentials legacy pickup. earlier
1721
- // installs shared `~/.claude/.credentials.json` across brands; the brand
1722
- // main service's `claude` SDK subprocess and admin server now read from
1723
- // `${persistDir}/.claude/.credentials.json` per the new
1724
- // Environment=CLAUDE_CONFIG_DIR= block in port-resolution.ts.
1725
- //
1726
- // Move-semantics: the FIRST brand to install grabs the legacy file. The
1727
- // operation is cpSync + unlinkSync (not renameSync) so it survives cross-
1728
- // volume `~/` mounts that would EXDEV-fail rename. Subsequent brand
1729
- // installs find no legacy file and require a fresh `claude /login`.
1730
- //
1731
- // Idempotency stamp at `${persistentDir}/.claude/.credentials-migrated`
1732
- // prevents re-pickup on re-installs of the same brand even if an operator
1733
- // later runs `claude /login` with no CLAUDE_CONFIG_DIR set, which would
1734
- // re-create the legacy path.
1698
+ // Claude Code OAuth credentials live at
1699
+ // `${persistDir}/.claude/.credentials.json`. The brand main service's
1700
+ // `claude` SDK subprocess and admin server read from there via the
1701
+ // Environment=CLAUDE_CONFIG_DIR= block in port-resolution.ts. Fresh
1702
+ // installs prompt the operator to run `claude /login`.
1735
1703
  const persistentClaudeDir = join(persistentDir, ".claude");
1736
- const persistentCredsFile = join(persistentClaudeDir, ".credentials.json");
1737
- const legacyCredsFile = join(process.env.HOME ?? "/root", ".claude", ".credentials.json");
1738
- const credsMigratedStamp = join(persistentClaudeDir, ".credentials-migrated");
1739
- if (!existsSync(credsMigratedStamp)) {
1740
- mkdirSync(persistentClaudeDir, { recursive: true });
1741
- if (existsSync(legacyCredsFile) && !existsSync(persistentCredsFile)) {
1742
- cpSync(legacyCredsFile, persistentCredsFile);
1743
- try {
1744
- unlinkSync(legacyCredsFile);
1745
- }
1746
- catch (err) {
1747
- const msg = err instanceof Error ? err.message : String(err);
1748
- console.log(` [install] claude-creds pickup: legacy unlink warn=${msg}`);
1749
- }
1750
- console.log(` [install] claude-creds pickup: brand=${BRAND.hostname} source=${legacyCredsFile} target=${persistentCredsFile}`);
1751
- }
1752
- writeFileSync(credsMigratedStamp, new Date().toISOString() + "\n");
1753
- }
1704
+ mkdirSync(persistentClaudeDir, { recursive: true });
1754
1705
  // pre-populate the brand `.claude.json` so the manager's
1755
1706
  // PTY-spawned `claude --verbose --remote-control` boots straight into the
1756
1707
  // session URL without stopping at the first-run theme picker or the
@@ -1813,31 +1764,9 @@ function deployPayload() {
1813
1764
  spawnSync("sleep", ["1"]);
1814
1765
  }
1815
1766
  }
1816
- // Migrate user data to {installDir}/data/ — outside the platform/ wipe zone.
1817
- // Runs after service stop to avoid copying files while the agent is writing.
1818
- // Once data/ is populated, subsequent reinstalls skip this entirely.
1819
- const dataDir = join(INSTALL_DIR, "data");
1820
- const dataAccountsDir = join(dataDir, "accounts");
1821
- const dataUploadsDir = join(dataDir, "uploads");
1822
- const oldLiveAccounts = join(INSTALL_DIR, "platform/config/accounts");
1823
- if (!existsSync(dataAccountsDir)) {
1824
- if (existsSync(oldLiveAccounts)) {
1825
- mkdirSync(dataDir, { recursive: true });
1826
- cpSync(oldLiveAccounts, dataAccountsDir, { recursive: true });
1827
- console.log(" Migrated accounts to data/.");
1828
- }
1829
- else if (existsSync(persistentAccountsDir)) {
1830
- mkdirSync(dataDir, { recursive: true });
1831
- cpSync(persistentAccountsDir, dataAccountsDir, { recursive: true });
1832
- console.log(" Restored accounts from persistent backup to data/.");
1833
- }
1834
- }
1835
- const oldLiveUploads = join(INSTALL_DIR, "platform/data/attachments");
1836
- if (!existsSync(dataUploadsDir) && existsSync(oldLiveUploads)) {
1837
- mkdirSync(dataDir, { recursive: true });
1838
- cpSync(oldLiveUploads, dataUploadsDir, { recursive: true });
1839
- console.log(" Migrated uploads to data/.");
1840
- }
1767
+ // User data lives at {installDir}/data/ — outside the platform/ wipe zone.
1768
+ // Install path creates this fresh; runtime writers populate it on demand.
1769
+ mkdirSync(join(INSTALL_DIR, "data"), { recursive: true });
1841
1770
  // Wipe deployment directories to prevent stale files.
1842
1771
  // data/ is NOT wiped — it contains user data (accounts, uploads) that must survive.
1843
1772
  for (const dir of ["platform", "server", "maxy", "premium-plugins", "docs", ".claude"]) {
@@ -1862,11 +1791,9 @@ function deployPayload() {
1862
1791
  // users.json is read directly from persistentDir by both
1863
1792
  // platform/ui/app/lib/paths.ts (USERS_FILE = MAXY_DIR/users.json) and the
1864
1793
  // admin MCP plugin (USERS_FILE = CONFIG_DIR/users.json). No copy into the
1865
- // wipe zone the pre-Task-904 cpSync to platform/config/users.json was the
1866
- // copy that overwrote new admin rows on every install. The line below
1867
- // observes the row count + userId prefixes so a future regression is grep-
1868
- // detectable in the install log without any runtime change (singular
1869
- // "userId preserved" hid the multi-row failure mode).
1794
+ // wipe zone. The line below observes the row count + userId prefixes so a
1795
+ // future regression is grep-detectable in the install log without any
1796
+ // runtime change.
1870
1797
  if (existsSync(persistentUsersFile)) {
1871
1798
  try {
1872
1799
  const raw = readFileSync(persistentUsersFile, "utf-8").trim();
@@ -1886,8 +1813,7 @@ function deployPayload() {
1886
1813
  }
1887
1814
  // install-time admin-auth invariant check. Walks every
1888
1815
  // data/accounts/*/account.json admins[] and compares to the persistent
1889
- // users.json. Log-only (does NOT refuse install) so pre-Task-904 devices
1890
- // with already-divergent state still upgrade; the [install-invariant]
1816
+ // users.json. Log-only (does NOT refuse install); the [install-invariant]
1891
1817
  // line surfaces the bug to the operator without bricking the device.
1892
1818
  // Inline rather than imported from platform/lib/admins-write because the
1893
1819
  // installer is its own npm package and doesn't bundle the platform lib.
@@ -2406,11 +2332,26 @@ function writeInstallDefaults(accountId) {
2406
2332
  writeFileSync(accountJsonPath, JSON.stringify(config, null, 2) + "\n");
2407
2333
  console.log(` [install-defaults] account-json plugins=${enabledPlugins.length} outputStyle=default thinkingView=default`);
2408
2334
  logFile(` [install-defaults] account-json plugins=${enabledPlugins.length} outputStyle=default thinkingView=default`);
2335
+ // Admin SOUL.md is sourced from the bundled template with ${PRODUCT_NAME}
2336
+ // substituted at install time. The template carries the Phase 1 standing
2337
+ // offer (brochure / preval / Loop CRM) so the agent ships with a stated
2338
+ // capability set rather than a one-line operator-tag.
2409
2339
  const soulPath = join(accountDir, "agents/admin/SOUL.md");
2410
2340
  mkdirSync(dirname(soulPath), { recursive: true });
2411
- writeFileSync(soulPath, `You are ${BRAND.productName}, an AI operations manager.\n`);
2412
- console.log(` [install-defaults] soul-md path=${soulPath}`);
2413
- logFile(` [install-defaults] soul-md path=${soulPath}`);
2341
+ const adminSoulTemplate = join(INSTALL_DIR, "platform/templates/agents/admin/SOUL.md");
2342
+ let soulContent;
2343
+ try {
2344
+ soulContent = readFileSync(adminSoulTemplate, "utf-8");
2345
+ }
2346
+ catch (err) {
2347
+ console.error(` [install-defaults] admin-soul template missing at ${adminSoulTemplate}: ${err.message}`);
2348
+ logFile(` [install-defaults] admin-soul template missing: ${err.message}`);
2349
+ return;
2350
+ }
2351
+ soulContent = soulContent.replace(/\$\{PRODUCT_NAME\}/g, BRAND.productName);
2352
+ writeFileSync(soulPath, soulContent);
2353
+ console.log(` [install-defaults] soul-md path=${soulPath} bytes=${soulContent.length}`);
2354
+ logFile(` [install-defaults] soul-md path=${soulPath} bytes=${soulContent.length}`);
2414
2355
  // Public agent files — IDENTITY.md is always overwritten (Rubytech-controlled);
2415
2356
  // SOUL.md and config.json are created if missing (user-controlled). All three
2416
2357
  // are sourced from the payload templates under
@@ -2552,13 +2493,6 @@ function resolveInstallAccountId() {
2552
2493
  catch { /* directory unreadable */ }
2553
2494
  return "";
2554
2495
  }
2555
- // `installCrons()` and the `# BEGIN/END <BRAND> CRONS` block lived
2556
- // here. All such events must be user-driven, not scheduled by the installer.
2557
- // The legacy block recreated `data/accounts/<accountId>/logs/` every 60s via
2558
- // `mkdir -p`, which tripped seed-neo4j.sh's stub-account-dirs guard on every
2559
- // reinstall after `rm -rf ~/<installDir>`. Uninstall now strips the legacy
2560
- // block (uninstall.ts `removeLegacyCronBlock`) so older installs migrate
2561
- // cleanly. Consumer-side dispatcher replacement is tracked separately.
2562
2496
  // retired the ttyd/tmux/xterm admin terminal stack. Upgrades run
2563
2497
  // via the action runner — `systemd-run --user` transient units spawned by
2564
2498
  // POST /api/admin/actions/upgrade — whose lifetime is independent of
@@ -0,0 +1,27 @@
1
+ // Task 033 — pure parser for the OnboardingState read-back assertion.
2
+ //
3
+ // Extracted into a dedicated module (not src/index.ts) so the test
4
+ // suite can import it without triggering index's brand.json-at-load
5
+ // side effect. The installer's loud-fail branches at
6
+ // `assertOnboardingStateSeeded` consume the tri-state outcome.
7
+ /**
8
+ * Classify cypher-shell --format plain output into one of three states:
9
+ *
10
+ * - `unreachable` — non-zero exit (auth, network, syntax). Stderr tail
11
+ * (last 200 chars) is preserved so the install log carries the
12
+ * symptom verbatim.
13
+ * - `missing` — exit 0 but no data row beyond the header. cypher-shell
14
+ * prints the column name even on a zero-match query.
15
+ * - `present` — exit 0 with at least one data row. `currentStep` is the
16
+ * first field on row 2.
17
+ */
18
+ export function classifyOnboardingReadBack(input) {
19
+ if (input.status !== 0) {
20
+ return { kind: "unreachable", stderrTail: input.stderr.trim().slice(-200) };
21
+ }
22
+ const lines = input.stdout.trim().split("\n").filter((l) => l.length > 0);
23
+ if (lines.length < 2) {
24
+ return { kind: "missing" };
25
+ }
26
+ return { kind: "present", currentStep: lines[1].trim() };
27
+ }
package/dist/uninstall.js CHANGED
@@ -158,11 +158,7 @@ function stopServices() {
158
158
  // the edge service owns the public port and VNC stack. Stop it
159
159
  // after the main brand service so the edge's ExecStopPost (vnc.sh stop)
160
160
  // runs cleanly. The edge unit is per-brand (`<hostname>-edge`).
161
- // retired the ttyd unit; pre-664 devices may still have
162
- // `<hostname>-ttyd` — best-effort stop so the uninstall is clean on
163
- // upgraded devices too.
164
161
  const edgeUnitShort = `${BRAND.hostname}-edge`;
165
- const legacyTtydUnitShort = `${BRAND.hostname}-ttyd`;
166
162
  try {
167
163
  spawnSync("systemctl", ["--user", "stop", edgeUnitShort], { stdio: "pipe", timeout: 15_000 });
168
164
  console.log(` Stopped ${edgeUnitShort}`);
@@ -170,11 +166,6 @@ function stopServices() {
170
166
  catch {
171
167
  console.log(` ${edgeUnitShort} not running`);
172
168
  }
173
- try {
174
- spawnSync("systemctl", ["--user", "stop", legacyTtydUnitShort], { stdio: "pipe", timeout: 15_000 });
175
- console.log(` Stopped ${legacyTtydUnitShort} (legacy pre-664 unit)`);
176
- }
177
- catch { /* not present on post-664 installs */ }
178
169
  // Stop Neo4j — dedicated branded instance if this brand uses one, else shared.
179
170
  // Brand isolation: never stop `neo4j.service` when this brand runs
180
171
  // a dedicated `neo4j-<hostname>.service` — stopping the shared instance would
@@ -234,80 +225,6 @@ function stopServices() {
234
225
  console.log(" Stopped Ollama");
235
226
  }
236
227
  // ---------------------------------------------------------------------------
237
- // Step 1b: Strip the legacy installer-registered cron block
238
- //
239
- // retired `installCrons()` in src/index.ts. Older installs (every
240
- // brand prior to the release) wrote three minute-cadence entries
241
- // between `# BEGIN <BRAND> CRONS` and `# END <BRAND> CRONS`. This step
242
- // removes that block on uninstall so an upgraded device is fully torn down
243
- // and a subsequent reinstall does not get re-seeded by cron recreating
244
- // `data/accounts/<accountId>/logs/` every 60s (which tripped seed-neo4j.sh's
245
- // stub-account-dirs guard). Idempotent:
246
- // no-op when the block is absent. Gated on Linux to mirror the installer's
247
- // `installCrons` which early-returned on every other platform.
248
- // ---------------------------------------------------------------------------
249
- function removeLegacyCronBlock() {
250
- log("1b", "Removing legacy cron block...");
251
- if (!isLinux()) {
252
- console.log(" Skipped — non-Linux platform.");
253
- return;
254
- }
255
- if (!commandExists("crontab")) {
256
- console.log(" crontab not available — nothing to strip.");
257
- return;
258
- }
259
- const current = spawnSync("crontab", ["-l"], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
260
- // Non-zero status (or empty stdout) on `crontab -l` means the user has no
261
- // crontab at all — nothing to strip, and writing back would create one.
262
- if (current.status !== 0 || !current.stdout) {
263
- console.log(" Cron block: none present");
264
- return;
265
- }
266
- const beginMarker = `# BEGIN ${BRAND.productName.toUpperCase()} CRONS`;
267
- const endMarker = `# END ${BRAND.productName.toUpperCase()} CRONS`;
268
- const escapeRegex = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
269
- const blockPattern = new RegExp(`${escapeRegex(beginMarker)}[\\s\\S]*?${escapeRegex(endMarker)}\\n?`, "g");
270
- // Count entry lines (non-comment, non-blank) between markers for the
271
- // operator-visible log. matchAll returns all block bodies in one pass.
272
- const extractPattern = new RegExp(`${escapeRegex(beginMarker)}([\\s\\S]*?)${escapeRegex(endMarker)}`, "g");
273
- let entryCount = 0;
274
- for (const match of current.stdout.matchAll(extractPattern)) {
275
- entryCount += match[1]
276
- .split("\n")
277
- .filter((l) => l.trim().length > 0 && !l.trim().startsWith("#"))
278
- .length;
279
- }
280
- if (entryCount === 0 && !blockPattern.test(current.stdout)) {
281
- console.log(" Cron block: none present");
282
- return;
283
- }
284
- const stripped = current.stdout.replace(blockPattern, "").trimEnd();
285
- if (stripped.length === 0) {
286
- // Block was the only content — remove the crontab outright so `crontab -l`
287
- // reports "no crontab for admin" (success criterion). Writing an
288
- // empty buffer via `crontab -` leaves a zero-byte crontab on Debian.
289
- const removed = spawnSync("crontab", ["-r"], { stdio: "pipe" });
290
- if (removed.status !== 0) {
291
- console.log(` Cron block: stripped ${entryCount} entries but crontab -r failed — ${(removed.stderr ?? "").toString().trim()}`);
292
- logFile(` crontab -r failed: ${removed.stderr}`);
293
- return;
294
- }
295
- }
296
- else {
297
- const write = spawnSync("crontab", ["-"], {
298
- input: stripped + "\n",
299
- encoding: "utf-8",
300
- stdio: ["pipe", "pipe", "pipe"],
301
- });
302
- if (write.status !== 0) {
303
- console.log(` Cron block: write failed — ${(write.stderr ?? "").trim()}`);
304
- logFile(` crontab write failed: ${write.stderr}`);
305
- return;
306
- }
307
- }
308
- console.log(` Cron block: removed ${entryCount} entries`);
309
- }
310
- // ---------------------------------------------------------------------------
311
228
  // Step 2: Delete Cloudflare tunnel
312
229
  // ---------------------------------------------------------------------------
313
230
  function deleteCloudflareTunnel() {
@@ -702,27 +619,20 @@ function removeSystemdService() {
702
619
  console.log(` Failed to remove service file: ${err instanceof Error ? err.message : String(err)}`);
703
620
  }
704
621
  }
705
- // remove this brand's per-brand edge unit alongside the
706
- // main brand unit. The per-brand ttyd unit is retired, but an
707
- // upgraded device may still have `<hostname>-ttyd.service` on disk from
708
- // a pre-664 install — cleanup both so the uninstall leaves nothing
709
- // behind on either generation.
622
+ // remove this brand's per-brand edge unit alongside the main brand unit.
710
623
  const thisBrandEdge = `${BRAND.hostname}-edge`;
711
- const legacyBrandTtyd = `${BRAND.hostname}-ttyd`;
712
- for (const unit of [thisBrandEdge, legacyBrandTtyd]) {
624
+ try {
625
+ spawnSync("systemctl", ["--user", "disable", thisBrandEdge], { stdio: "pipe" });
626
+ }
627
+ catch { /* ignore */ }
628
+ const edgeUnitFile = resolve(HOME, `.config/systemd/user/${thisBrandEdge}.service`);
629
+ if (existsSync(edgeUnitFile)) {
713
630
  try {
714
- spawnSync("systemctl", ["--user", "disable", unit], { stdio: "pipe" });
631
+ rmSync(edgeUnitFile);
632
+ console.log(` Removed ${thisBrandEdge}.service`);
715
633
  }
716
- catch { /* ignore */ }
717
- const unitFile = resolve(HOME, `.config/systemd/user/${unit}.service`);
718
- if (existsSync(unitFile)) {
719
- try {
720
- rmSync(unitFile);
721
- console.log(` Removed ${unit}.service`);
722
- }
723
- catch (err) {
724
- console.log(` Failed to remove ${unit}.service: ${err instanceof Error ? err.message : String(err)}`);
725
- }
634
+ catch (err) {
635
+ console.log(` Failed to remove ${thisBrandEdge}.service: ${err instanceof Error ? err.message : String(err)}`);
726
636
  }
727
637
  }
728
638
  // Reload daemon
@@ -965,7 +875,6 @@ export async function runUninstall(options) {
965
875
  const failures = [];
966
876
  const steps = [
967
877
  { name: "Stop services", fn: stopServices },
968
- { name: "Remove legacy cron block", fn: removeLegacyCronBlock },
969
878
  { name: "Delete Cloudflare tunnel", fn: deleteCloudflareTunnel },
970
879
  ...(options.exportPath
971
880
  ? [{ name: "Export data", fn: () => exportData(options.exportPath) }]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.38",
3
+ "version": "0.1.40",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Centralised Anthropic API key management.
3
+ *
4
+ * Provides read/write/validate operations for the Anthropic API key
5
+ * used by the public agent. All consumers import from this module
6
+ * instead of inlining the env-var-then-file lookup pattern.
7
+ *
8
+ * Follows the same shape as cloudflare/mcp/src/lib/cloudflared.ts
9
+ * (readToken, writeToken, hasToken, validateToken).
10
+ */
11
+ export declare function readKey(): string | null;
12
+ export declare function writeKey(key: string): void;
13
+ export declare function hasKey(): boolean;
14
+ export declare function deleteKey(): void;
15
+ export type KeyStatus = "valid" | "billing" | "auth_error" | "missing" | "error";
16
+ export interface KeyValidation {
17
+ status: KeyStatus;
18
+ message: string;
19
+ }
20
+ export declare function validateKey(key?: string): Promise<KeyValidation>;
21
+ export declare function keyFilePath(): string;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoEH,wBAAgB,OAAO,IAAI,MAAM,GAAG,IAAI,CAiDvC;AAMD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAiB1C;AAMD,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAaD,wBAAgB,SAAS,IAAI,IAAI,CAsBhC;AAUD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAsFtE;AAOD,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}