@robbiesrobotics/alice-agents 1.5.7 → 1.5.9

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 (581) hide show
  1. package/README.md +5 -2
  2. package/bin/alice-cloud.cjs +71 -55
  3. package/package.json +1 -1
  4. package/templates/skills/acculynx/SKILL.md +183 -0
  5. package/templates/skills/acculynx/references/analysis_template.py +116 -0
  6. package/templates/skills/acculynx/references/dashboard_page.tsx +641 -0
  7. package/templates/skills/claude-code/SKILL.md +2 -2
  8. package/templates/skills/coding-agent/SKILL.md +68 -0
  9. package/templates/skills/crawl4ai/SKILL.md +119 -0
  10. package/templates/skills/crawl4ai/scripts/crwl +3 -0
  11. package/templates/workspaces/accuscope/AGENTS.md +38 -0
  12. package/templates/workspaces/accuscope/FEEDBACK.md +27 -0
  13. package/templates/workspaces/accuscope/HEARTBEAT.md +26 -0
  14. package/templates/workspaces/accuscope/IDENTITY.md +48 -0
  15. package/templates/workspaces/accuscope/LEARNINGS.md +46 -0
  16. package/templates/workspaces/accuscope/MEMORY.md +47 -0
  17. package/templates/workspaces/accuscope/PLAYBOOK.md +65 -0
  18. package/templates/workspaces/accuscope/SOUL.md +40 -0
  19. package/templates/workspaces/accuscope/TOOLS.md +63 -0
  20. package/templates/workspaces/accuscope/USER.md +39 -0
  21. package/templates/workspaces/aiden/AGENTS.md +52 -0
  22. package/templates/workspaces/aiden/FEEDBACK.md +12 -0
  23. package/templates/workspaces/aiden/HEARTBEAT.md +9 -0
  24. package/templates/workspaces/aiden/IDENTITY.md +6 -0
  25. package/templates/workspaces/aiden/LEARNINGS.md +6 -0
  26. package/templates/workspaces/aiden/MEMORY.md +22 -0
  27. package/templates/workspaces/aiden/PLAYBOOK.md +16 -0
  28. package/templates/workspaces/aiden/SOUL.md +1 -1
  29. package/templates/workspaces/aiden/USER.md +17 -0
  30. package/templates/workspaces/alex/AGENTS.md +52 -0
  31. package/templates/workspaces/alex/FEEDBACK.md +11 -0
  32. package/templates/workspaces/alex/HEARTBEAT.md +9 -0
  33. package/templates/workspaces/alex/IDENTITY.md +6 -0
  34. package/templates/workspaces/alex/LEARNINGS.md +5 -0
  35. package/templates/workspaces/alex/MEMORY.md +22 -0
  36. package/templates/workspaces/alex/PLAYBOOK.md +16 -0
  37. package/templates/workspaces/alex/SOUL.md +1 -1
  38. package/templates/workspaces/alex/USER.md +13 -0
  39. package/templates/workspaces/aria/AGENTS.md +18 -0
  40. package/templates/workspaces/aria/FEEDBACK.md +12 -0
  41. package/templates/workspaces/aria/HEARTBEAT.md +32 -0
  42. package/templates/workspaces/aria/IDENTITY.md +12 -0
  43. package/templates/workspaces/aria/LEARNINGS.md +31 -0
  44. package/templates/workspaces/aria/MEMORY.md +29 -0
  45. package/templates/workspaces/aria/PLAYBOOK.md +71 -0
  46. package/templates/workspaces/aria/SOUL.md +57 -0
  47. package/templates/workspaces/aria/TOOLS.md +47 -0
  48. package/templates/workspaces/aria/USER.md +18 -0
  49. package/templates/workspaces/audrey/AGENTS.md +59 -0
  50. package/templates/workspaces/audrey/FEEDBACK.md +11 -0
  51. package/templates/workspaces/audrey/HEARTBEAT.md +9 -0
  52. package/templates/workspaces/audrey/IDENTITY.md +6 -0
  53. package/templates/workspaces/audrey/LEARNINGS.md +5 -0
  54. package/templates/workspaces/audrey/MEMORY.md +22 -0
  55. package/templates/workspaces/audrey/PLAYBOOK.md +16 -0
  56. package/templates/workspaces/audrey/SOUL.md +1 -1
  57. package/templates/workspaces/audrey/TOOLS.md +15 -0
  58. package/templates/workspaces/audrey/USER.md +13 -0
  59. package/templates/workspaces/avery/AGENTS.md +52 -0
  60. package/templates/workspaces/avery/FEEDBACK.md +12 -0
  61. package/templates/workspaces/avery/HEARTBEAT.md +5 -0
  62. package/templates/workspaces/avery/IDENTITY.md +6 -0
  63. package/templates/workspaces/avery/LEARNINGS.md +6 -0
  64. package/templates/workspaces/avery/MEMORY.md +22 -0
  65. package/templates/workspaces/avery/PLAYBOOK.md +16 -0
  66. package/templates/workspaces/avery/SOUL.md +1 -1
  67. package/templates/workspaces/avery/USER.md +17 -0
  68. package/templates/workspaces/avery/skills/claude-code/SKILL.md +38 -0
  69. package/templates/workspaces/avery/skills/claude-code/claude_code +55 -0
  70. package/templates/workspaces/caleb/AGENTS.md +52 -0
  71. package/templates/workspaces/caleb/FEEDBACK.md +11 -0
  72. package/templates/workspaces/caleb/HEARTBEAT.md +9 -0
  73. package/templates/workspaces/caleb/IDENTITY.md +6 -0
  74. package/templates/workspaces/caleb/LEARNINGS.md +5 -0
  75. package/templates/workspaces/caleb/MEMORY.md +22 -0
  76. package/templates/workspaces/caleb/PLAYBOOK.md +16 -0
  77. package/templates/workspaces/caleb/SOUL.md +1 -1
  78. package/templates/workspaces/caleb/TOOLS.md +30 -0
  79. package/templates/workspaces/caleb/USER.md +13 -0
  80. package/templates/workspaces/clara/AGENTS.md +59 -0
  81. package/templates/workspaces/clara/FEEDBACK.md +12 -0
  82. package/templates/workspaces/clara/HEARTBEAT.md +5 -0
  83. package/templates/workspaces/clara/IDENTITY.md +6 -0
  84. package/templates/workspaces/clara/LEARNINGS.md +6 -0
  85. package/templates/workspaces/clara/MEMORY.md +22 -0
  86. package/templates/workspaces/clara/PLAYBOOK.md +16 -0
  87. package/templates/workspaces/clara/SOUL.md +1 -1
  88. package/templates/workspaces/clara/TOOLS.md +15 -0
  89. package/templates/workspaces/clara/USER.md +17 -0
  90. package/templates/workspaces/daphne/AGENTS.md +59 -0
  91. package/templates/workspaces/daphne/FEEDBACK.md +18 -0
  92. package/templates/workspaces/daphne/HEARTBEAT.md +5 -0
  93. package/templates/workspaces/daphne/IDENTITY.md +6 -0
  94. package/templates/workspaces/daphne/LEARNINGS.md +6 -0
  95. package/templates/workspaces/daphne/MEMORY.md +22 -0
  96. package/templates/workspaces/daphne/PLAYBOOK.md +48 -0
  97. package/templates/workspaces/daphne/SOUL.md +1 -1
  98. package/templates/workspaces/daphne/TOOLS.md +15 -0
  99. package/templates/workspaces/daphne/USER.md +17 -0
  100. package/templates/workspaces/darius/AGENTS.md +52 -0
  101. package/templates/workspaces/darius/FEEDBACK.md +12 -0
  102. package/templates/workspaces/darius/HEARTBEAT.md +5 -0
  103. package/templates/workspaces/darius/IDENTITY.md +6 -0
  104. package/templates/workspaces/darius/LEARNINGS.md +6 -0
  105. package/templates/workspaces/darius/MEMORY.md +22 -0
  106. package/templates/workspaces/darius/PLAYBOOK.md +16 -0
  107. package/templates/workspaces/darius/SOUL.md +1 -1
  108. package/templates/workspaces/darius/USER.md +17 -0
  109. package/templates/workspaces/darius/skills/claude-code/SKILL.md +38 -0
  110. package/templates/workspaces/darius/skills/claude-code/claude_code +55 -0
  111. package/templates/workspaces/devon/AGENTS.md +52 -0
  112. package/templates/workspaces/devon/FEEDBACK.md +11 -0
  113. package/templates/workspaces/devon/HEARTBEAT.md +5 -0
  114. package/templates/workspaces/devon/IDENTITY.md +6 -0
  115. package/templates/workspaces/devon/LEARNINGS.md +11 -0
  116. package/templates/workspaces/devon/MEMORY.md +22 -0
  117. package/templates/workspaces/devon/PLAYBOOK.md +16 -0
  118. package/templates/workspaces/devon/SOUL.md +1 -1
  119. package/templates/workspaces/devon/USER.md +13 -0
  120. package/templates/workspaces/devon/check_github.py +12 -0
  121. package/templates/workspaces/devon/check_mc_env.py +30 -0
  122. package/templates/workspaces/devon/check_sb.py +34 -0
  123. package/templates/workspaces/devon/check_vercel.py +12 -0
  124. package/templates/workspaces/devon/get_mc_files.py +17 -0
  125. package/templates/workspaces/devon/write_heartbeat.py +67 -0
  126. package/templates/workspaces/dylan/.env.example +33 -0
  127. package/templates/workspaces/dylan/00007_verify_licenses_table.sql +100 -0
  128. package/templates/workspaces/dylan/AGENTS.md +52 -0
  129. package/templates/workspaces/dylan/FEEDBACK.md +28 -0
  130. package/templates/workspaces/dylan/HEARTBEAT.md +5 -0
  131. package/templates/workspaces/dylan/IDENTITY.md +6 -0
  132. package/templates/workspaces/dylan/LEARNINGS.md +70 -0
  133. package/templates/workspaces/dylan/MEMORY.md +22 -0
  134. package/templates/workspaces/dylan/PLAYBOOK.md +16 -0
  135. package/templates/workspaces/dylan/SOUL.md +1 -1
  136. package/templates/workspaces/dylan/STRIPE_PIPELINE.md +185 -0
  137. package/templates/workspaces/dylan/USER.md +17 -0
  138. package/templates/workspaces/dylan/n8n-stripe-welcome-workflow.json +123 -0
  139. package/templates/workspaces/dylan/skills/claude-code/SKILL.md +38 -0
  140. package/templates/workspaces/dylan/skills/claude-code/claude_code +55 -0
  141. package/templates/workspaces/dylan/stripe-webhook-handler.py +433 -0
  142. package/templates/workspaces/dylan/test_mock_webhook.py +103 -0
  143. package/templates/workspaces/elena/AGENTS.md +59 -0
  144. package/templates/workspaces/elena/FEEDBACK.md +11 -0
  145. package/templates/workspaces/elena/HEARTBEAT.md +9 -0
  146. package/templates/workspaces/elena/IDENTITY.md +6 -0
  147. package/templates/workspaces/elena/LEARNINGS.md +5 -0
  148. package/templates/workspaces/elena/MEMORY.md +22 -0
  149. package/templates/workspaces/elena/PLAYBOOK.md +16 -0
  150. package/templates/workspaces/elena/SOUL.md +1 -1
  151. package/templates/workspaces/elena/TOOLS.md +15 -0
  152. package/templates/workspaces/elena/USER.md +13 -0
  153. package/templates/workspaces/eva/AGENTS.md +59 -0
  154. package/templates/workspaces/eva/FEEDBACK.md +11 -0
  155. package/templates/workspaces/eva/HEARTBEAT.md +9 -0
  156. package/templates/workspaces/eva/IDENTITY.md +6 -0
  157. package/templates/workspaces/eva/LEARNINGS.md +5 -0
  158. package/templates/workspaces/eva/MEMORY.md +22 -0
  159. package/templates/workspaces/eva/PLAYBOOK.md +16 -0
  160. package/templates/workspaces/eva/SOUL.md +1 -1
  161. package/templates/workspaces/eva/TOOLS.md +15 -0
  162. package/templates/workspaces/eva/USER.md +13 -0
  163. package/templates/workspaces/felix/AGENTS.md +52 -0
  164. package/templates/workspaces/felix/FEEDBACK.md +11 -0
  165. package/templates/workspaces/felix/HEARTBEAT.md +5 -0
  166. package/templates/workspaces/felix/IDENTITY.md +6 -0
  167. package/templates/workspaces/felix/LEARNINGS.md +17 -0
  168. package/templates/workspaces/felix/MEMORY.md +22 -0
  169. package/templates/workspaces/felix/PLAYBOOK.md +16 -0
  170. package/templates/workspaces/felix/SOUL.md +1 -1
  171. package/templates/workspaces/felix/USER.md +13 -0
  172. package/templates/workspaces/felix/fidelia-psychology.html +1594 -0
  173. package/templates/workspaces/felix/task.txt +164 -0
  174. package/templates/workspaces/hannah/AGENTS.md +59 -0
  175. package/templates/workspaces/hannah/FEEDBACK.md +12 -0
  176. package/templates/workspaces/hannah/HEARTBEAT.md +5 -0
  177. package/templates/workspaces/hannah/IDENTITY.md +6 -0
  178. package/templates/workspaces/hannah/LEARNINGS.md +6 -0
  179. package/templates/workspaces/hannah/MEMORY.md +22 -0
  180. package/templates/workspaces/hannah/PLAYBOOK.md +16 -0
  181. package/templates/workspaces/hannah/SOUL.md +1 -1
  182. package/templates/workspaces/hannah/TOOLS.md +15 -0
  183. package/templates/workspaces/hannah/USER.md +17 -0
  184. package/templates/workspaces/isaac/AGENTS.md +52 -0
  185. package/templates/workspaces/isaac/FEEDBACK.md +12 -0
  186. package/templates/workspaces/isaac/HEARTBEAT.md +9 -0
  187. package/templates/workspaces/isaac/IDENTITY.md +6 -0
  188. package/templates/workspaces/isaac/LEARNINGS.md +6 -0
  189. package/templates/workspaces/isaac/MEMORY.md +22 -0
  190. package/templates/workspaces/isaac/PLAYBOOK.md +16 -0
  191. package/templates/workspaces/isaac/SOUL.md +1 -1
  192. package/templates/workspaces/isaac/USER.md +17 -0
  193. package/templates/workspaces/isaac/skills/claude-code/SKILL.md +38 -0
  194. package/templates/workspaces/isaac/skills/claude-code/claude_code +55 -0
  195. package/templates/workspaces/logan/AGENTS.md +59 -0
  196. package/templates/workspaces/logan/FEEDBACK.md +11 -0
  197. package/templates/workspaces/logan/HEARTBEAT.md +9 -0
  198. package/templates/workspaces/logan/IDENTITY.md +6 -0
  199. package/templates/workspaces/logan/LEARNINGS.md +5 -0
  200. package/templates/workspaces/logan/MEMORY.md +22 -0
  201. package/templates/workspaces/logan/PLAYBOOK.md +16 -0
  202. package/templates/workspaces/logan/SOUL.md +1 -1
  203. package/templates/workspaces/logan/TOOLS.md +15 -0
  204. package/templates/workspaces/logan/USER.md +13 -0
  205. package/templates/workspaces/maxxipro/AGENTS.md +29 -0
  206. package/templates/workspaces/maxxipro/FEEDBACK.md +19 -0
  207. package/templates/workspaces/maxxipro/HEARTBEAT.md +22 -0
  208. package/templates/workspaces/maxxipro/IDENTITY.md +35 -0
  209. package/templates/workspaces/maxxipro/KNOWLEDGE.md +335 -0
  210. package/templates/workspaces/maxxipro/LEARNINGS.md +47 -0
  211. package/templates/workspaces/maxxipro/MEMORY.md +60 -0
  212. package/templates/workspaces/maxxipro/OUTREACH_TEMPLATES.md +143 -0
  213. package/templates/workspaces/maxxipro/PLAYBOOK.md +81 -0
  214. package/templates/workspaces/maxxipro/SOUL.md +146 -0
  215. package/templates/workspaces/maxxipro/TOOLS.md +81 -0
  216. package/templates/workspaces/maxxipro/USER.md +40 -0
  217. package/templates/workspaces/morgan/AGENTS.md +59 -0
  218. package/templates/workspaces/morgan/FEEDBACK.md +19 -0
  219. package/templates/workspaces/morgan/HEARTBEAT.md +5 -0
  220. package/templates/workspaces/morgan/IDENTITY.md +6 -0
  221. package/templates/workspaces/morgan/LEARNINGS.md +18 -0
  222. package/templates/workspaces/morgan/MEMORY.md +22 -0
  223. package/templates/workspaces/morgan/PLAYBOOK.md +16 -0
  224. package/templates/workspaces/morgan/SOUL.md +1 -1
  225. package/templates/workspaces/morgan/TOOLS.md +15 -0
  226. package/templates/workspaces/morgan/USER.md +13 -0
  227. package/templates/workspaces/nadia/AGENTS.md +59 -0
  228. package/templates/workspaces/nadia/FEEDBACK.md +12 -0
  229. package/templates/workspaces/nadia/HEARTBEAT.md +5 -0
  230. package/templates/workspaces/nadia/IDENTITY.md +6 -0
  231. package/templates/workspaces/nadia/LEARNINGS.md +6 -0
  232. package/templates/workspaces/nadia/MEMORY.md +22 -0
  233. package/templates/workspaces/nadia/PLAYBOOK.md +16 -0
  234. package/templates/workspaces/nadia/SOUL.md +1 -1
  235. package/templates/workspaces/nadia/TOOLS.md +15 -0
  236. package/templates/workspaces/nadia/USER.md +13 -0
  237. package/templates/workspaces/nate/AGENTS.md +24 -0
  238. package/templates/workspaces/nate/FEEDBACK.md +12 -0
  239. package/templates/workspaces/nate/HEARTBEAT.md +33 -0
  240. package/templates/workspaces/nate/IDENTITY.md +15 -0
  241. package/templates/workspaces/nate/LEARNINGS.md +33 -0
  242. package/templates/workspaces/nate/MEMORY.md +39 -0
  243. package/templates/workspaces/nate/PLAYBOOK.md +160 -0
  244. package/templates/workspaces/nate/SOUL.md +50 -0
  245. package/templates/workspaces/nate/TOOLS.md +111 -0
  246. package/templates/workspaces/nate/USER.md +32 -0
  247. package/templates/workspaces/olivia/.last-openclaw-version +1 -0
  248. package/templates/workspaces/olivia/.npmrc.tmp +0 -0
  249. package/templates/workspaces/olivia/AGENTS.md +77 -0
  250. package/templates/workspaces/olivia/ALPHA_CODING_BENCHMARK.txt +148 -0
  251. package/templates/workspaces/olivia/ALPHA_MODEL_GUIDE.md +393 -0
  252. package/templates/workspaces/olivia/FEEDBACK.md +13 -0
  253. package/templates/workspaces/olivia/HEADTOHEAD_BENCHMARK.txt +1289 -0
  254. package/templates/workspaces/olivia/HEARTBEAT.md +267 -0
  255. package/templates/workspaces/olivia/IDENTITY.md +6 -0
  256. package/templates/workspaces/olivia/LEARNINGS.md +708 -0
  257. package/templates/workspaces/olivia/MEMORY.md +202 -0
  258. package/templates/workspaces/olivia/MISSION_CONTROL_DESIGN_SPEC_v1.md +1143 -0
  259. package/templates/workspaces/olivia/MVP-COMPLETION-SUMMARY.md +175 -0
  260. package/templates/workspaces/olivia/NETWORK_IMPLEMENTATION_PLAN.md +1556 -0
  261. package/templates/workspaces/olivia/NEW_NODES_BENCHMARK.txt +947 -0
  262. package/templates/workspaces/olivia/PLAYBOOK.md +42 -0
  263. package/templates/workspaces/olivia/SELF-HEALING-COMPLETE.md +150 -0
  264. package/templates/workspaces/olivia/SOUL.md +8 -8
  265. package/templates/workspaces/olivia/TOOLS.md +15 -0
  266. package/templates/workspaces/olivia/USER.md +17 -0
  267. package/templates/workspaces/olivia/alicefleet-supabase-credentials.md +50 -0
  268. package/templates/workspaces/olivia/dzombo-copy-rewrite.md +115 -0
  269. package/templates/workspaces/olivia/dzombo-implementation-plan.md +1248 -0
  270. package/templates/workspaces/olivia/fidelia-psychology.html +1594 -0
  271. package/templates/workspaces/olivia/lead_debug.png +0 -0
  272. package/templates/workspaces/olivia/minimatch-10.2.4.tgz +0 -0
  273. package/templates/workspaces/olivia/operation-bllm-research.md +157 -0
  274. package/templates/workspaces/olivia/qa-audit-mission-control-v2.md +538 -0
  275. package/templates/workspaces/olivia/roofmaxx_logo.svg +1 -0
  276. package/templates/workspaces/olivia/roofmaxx_social.jpg +0 -0
  277. package/templates/workspaces/olivia/skills/1password/SKILL.md +53 -0
  278. package/templates/workspaces/olivia/skills/1password/_meta.json +6 -0
  279. package/templates/workspaces/olivia/skills/afrexai-recruiting-engine/README.md +57 -0
  280. package/templates/workspaces/olivia/skills/afrexai-recruiting-engine/SKILL.md +534 -0
  281. package/templates/workspaces/olivia/skills/afrexai-recruiting-engine/_meta.json +6 -0
  282. package/templates/workspaces/olivia/skills/agent-security/SKILL.md +69 -0
  283. package/templates/workspaces/olivia/skills/agent-security/_meta.json +6 -0
  284. package/templates/workspaces/olivia/skills/agentic-security-audit/SKILL.md +855 -0
  285. package/templates/workspaces/olivia/skills/agentic-security-audit/_meta.json +6 -0
  286. package/templates/workspaces/olivia/skills/ai-automation-consulting/SKILL.md +67 -0
  287. package/templates/workspaces/olivia/skills/ai-automation-consulting/_meta.json +6 -0
  288. package/templates/workspaces/olivia/skills/ai-automation-consulting/skill.json +12 -0
  289. package/templates/workspaces/olivia/skills/ai-presentation-maker/SKILL.md +1104 -0
  290. package/templates/workspaces/olivia/skills/ai-presentation-maker/_meta.json +6 -0
  291. package/templates/workspaces/olivia/skills/ai-productivity-audit/SKILL.md +181 -0
  292. package/templates/workspaces/olivia/skills/ai-productivity-audit/_meta.json +6 -0
  293. package/templates/workspaces/olivia/skills/ai-researcher/README.md +31 -0
  294. package/templates/workspaces/olivia/skills/ai-researcher/SKILL.md +59 -0
  295. package/templates/workspaces/olivia/skills/ai-researcher/_meta.json +6 -0
  296. package/templates/workspaces/olivia/skills/ai-seo-writer/README.md +19 -0
  297. package/templates/workspaces/olivia/skills/ai-seo-writer/SKILL.md +100 -0
  298. package/templates/workspaces/olivia/skills/ai-seo-writer/_meta.json +6 -0
  299. package/templates/workspaces/olivia/skills/analytics-tracking-2/SKILL.md +309 -0
  300. package/templates/workspaces/olivia/skills/analytics-tracking-2/_meta.json +6 -0
  301. package/templates/workspaces/olivia/skills/api-doc-writer/SKILL.md +232 -0
  302. package/templates/workspaces/olivia/skills/api-doc-writer/_meta.json +6 -0
  303. package/templates/workspaces/olivia/skills/api-generator/SKILL.md +49 -0
  304. package/templates/workspaces/olivia/skills/api-generator/_meta.json +6 -0
  305. package/templates/workspaces/olivia/skills/api-generator/tips.md +10 -0
  306. package/templates/workspaces/olivia/skills/apple-notes/SKILL.md +50 -0
  307. package/templates/workspaces/olivia/skills/apple-notes/_meta.json +6 -0
  308. package/templates/workspaces/olivia/skills/apple-reminders/SKILL.md +67 -0
  309. package/templates/workspaces/olivia/skills/apple-reminders/_meta.json +6 -0
  310. package/templates/workspaces/olivia/skills/automation-workflows/SKILL.md +267 -0
  311. package/templates/workspaces/olivia/skills/automation-workflows/_meta.json +6 -0
  312. package/templates/workspaces/olivia/skills/autoresearch/SKILL.md +46 -0
  313. package/templates/workspaces/olivia/skills/autoresearch/aria_write.py +148 -0
  314. package/templates/workspaces/olivia/skills/autoresearch/autoresearch.py +75 -0
  315. package/templates/workspaces/olivia/skills/azure-devops/SKILL.md +115 -0
  316. package/templates/workspaces/olivia/skills/azure-devops/_meta.json +6 -0
  317. package/templates/workspaces/olivia/skills/blogwatcher/SKILL.md +46 -0
  318. package/templates/workspaces/olivia/skills/blogwatcher/_meta.json +6 -0
  319. package/templates/workspaces/olivia/skills/blucli/SKILL.md +27 -0
  320. package/templates/workspaces/olivia/skills/blucli/_meta.json +6 -0
  321. package/templates/workspaces/olivia/skills/check-analytics/SKILL.md +92 -0
  322. package/templates/workspaces/olivia/skills/check-analytics/_meta.json +6 -0
  323. package/templates/workspaces/olivia/skills/cloud-architect/SKILL.md +89 -0
  324. package/templates/workspaces/olivia/skills/cloud-architect/_meta.json +6 -0
  325. package/templates/workspaces/olivia/skills/cloud-infra-automation/SKILL.md +50 -0
  326. package/templates/workspaces/olivia/skills/cloud-infra-automation/_meta.json +6 -0
  327. package/templates/workspaces/olivia/skills/cloud-storage/SKILL.md +61 -0
  328. package/templates/workspaces/olivia/skills/cloud-storage/_meta.json +6 -0
  329. package/templates/workspaces/olivia/skills/cloud-storage/auth.md +97 -0
  330. package/templates/workspaces/olivia/skills/cloud-storage/costs.md +88 -0
  331. package/templates/workspaces/olivia/skills/cloud-storage/providers.md +55 -0
  332. package/templates/workspaces/olivia/skills/copywriting-pro/SKILL.md +107 -0
  333. package/templates/workspaces/olivia/skills/copywriting-pro/_meta.json +6 -0
  334. package/templates/workspaces/olivia/skills/data-analyst-pro/SKILL.md +21 -0
  335. package/templates/workspaces/olivia/skills/data-analyst-pro/_meta.json +6 -0
  336. package/templates/workspaces/olivia/skills/database-designer/README.md +388 -0
  337. package/templates/workspaces/olivia/skills/database-designer/SKILL.md +66 -0
  338. package/templates/workspaces/olivia/skills/database-designer/_meta.json +6 -0
  339. package/templates/workspaces/olivia/skills/database-designer/index_optimizer.py +926 -0
  340. package/templates/workspaces/olivia/skills/database-designer/migration_generator.py +1199 -0
  341. package/templates/workspaces/olivia/skills/database-designer/schema_analyzer.py +982 -0
  342. package/templates/workspaces/olivia/skills/deploy-agent/SKILL.md +255 -0
  343. package/templates/workspaces/olivia/skills/deploy-agent/_meta.json +6 -0
  344. package/templates/workspaces/olivia/skills/devops-automation-pack/SKILL.md +72 -0
  345. package/templates/workspaces/olivia/skills/devops-automation-pack/_meta.json +6 -0
  346. package/templates/workspaces/olivia/skills/devops-automation-pack/deploy.sh +0 -0
  347. package/templates/workspaces/olivia/skills/financial-analysis-agent/SKILL.md +489 -0
  348. package/templates/workspaces/olivia/skills/financial-analysis-agent/_meta.json +6 -0
  349. package/templates/workspaces/olivia/skills/gdpr-compliance-tracker/README.md +72 -0
  350. package/templates/workspaces/olivia/skills/gdpr-compliance-tracker/SKILL.md +226 -0
  351. package/templates/workspaces/olivia/skills/gdpr-compliance-tracker/_meta.json +6 -0
  352. package/templates/workspaces/olivia/skills/gifgrep/SKILL.md +47 -0
  353. package/templates/workspaces/olivia/skills/gifgrep/_meta.json +6 -0
  354. package/templates/workspaces/olivia/skills/github/SKILL.md +47 -0
  355. package/templates/workspaces/olivia/skills/github/_meta.json +6 -0
  356. package/templates/workspaces/olivia/skills/gog/SKILL.md +36 -0
  357. package/templates/workspaces/olivia/skills/gog/_meta.json +6 -0
  358. package/templates/workspaces/olivia/skills/growth-strategy-hub/SKILL.md +135 -0
  359. package/templates/workspaces/olivia/skills/growth-strategy-hub/_meta.json +6 -0
  360. package/templates/workspaces/olivia/skills/growth-strategy-hub/metadata.json +4 -0
  361. package/templates/workspaces/olivia/skills/hetzner-cloud/SKILL.md +130 -0
  362. package/templates/workspaces/olivia/skills/hetzner-cloud/_meta.json +6 -0
  363. package/templates/workspaces/olivia/skills/himalaya/SKILL.md +217 -0
  364. package/templates/workspaces/olivia/skills/himalaya/_meta.json +6 -0
  365. package/templates/workspaces/olivia/skills/hotel-recommendation/SKILL.md +117 -0
  366. package/templates/workspaces/olivia/skills/hotel-recommendation/_meta.json +6 -0
  367. package/templates/workspaces/olivia/skills/hr-policy-generator/SKILL.md +54 -0
  368. package/templates/workspaces/olivia/skills/hr-policy-generator/_meta.json +6 -0
  369. package/templates/workspaces/olivia/skills/human-writing/SKILL.md +41 -0
  370. package/templates/workspaces/olivia/skills/human-writing/_meta.json +6 -0
  371. package/templates/workspaces/olivia/skills/imsg/SKILL.md +25 -0
  372. package/templates/workspaces/olivia/skills/imsg/_meta.json +6 -0
  373. package/templates/workspaces/olivia/skills/in-depth-research/SKILL.md +124 -0
  374. package/templates/workspaces/olivia/skills/in-depth-research/_meta.json +6 -0
  375. package/templates/workspaces/olivia/skills/in-depth-research/methodology.md +75 -0
  376. package/templates/workspaces/olivia/skills/in-depth-research/output-formats.md +168 -0
  377. package/templates/workspaces/olivia/skills/in-depth-research/sources.md +80 -0
  378. package/templates/workspaces/olivia/skills/javascript-skills/README.md +71 -0
  379. package/templates/workspaces/olivia/skills/javascript-skills/SKILL.md +746 -0
  380. package/templates/workspaces/olivia/skills/javascript-skills/_meta.json +6 -0
  381. package/templates/workspaces/olivia/skills/leadership-strategy-playbook/SKILL.md +147 -0
  382. package/templates/workspaces/olivia/skills/leadership-strategy-playbook/_meta.json +6 -0
  383. package/templates/workspaces/olivia/skills/market-research-agent/README.md +29 -0
  384. package/templates/workspaces/olivia/skills/market-research-agent/SKILL.md +52 -0
  385. package/templates/workspaces/olivia/skills/market-research-agent/_meta.json +6 -0
  386. package/templates/workspaces/olivia/skills/marketing-analytics/SKILL.md +74 -0
  387. package/templates/workspaces/olivia/skills/marketing-analytics/_meta.json +6 -0
  388. package/templates/workspaces/olivia/skills/marketing-master-io/SKILL.md +125 -0
  389. package/templates/workspaces/olivia/skills/marketing-master-io/_meta.json +6 -0
  390. package/templates/workspaces/olivia/skills/marketing-strategy-pmm/SKILL.md +398 -0
  391. package/templates/workspaces/olivia/skills/marketing-strategy-pmm/_meta.json +6 -0
  392. package/templates/workspaces/olivia/skills/meta-ads-analytics/SKILL.md +53 -0
  393. package/templates/workspaces/olivia/skills/meta-ads-analytics/_meta.json +6 -0
  394. package/templates/workspaces/olivia/skills/obsidian/SKILL.md +55 -0
  395. package/templates/workspaces/olivia/skills/obsidian/_meta.json +6 -0
  396. package/templates/workspaces/olivia/skills/openclaw-accounting/SKILL.md +125 -0
  397. package/templates/workspaces/olivia/skills/openclaw-accounting/_meta.json +6 -0
  398. package/templates/workspaces/olivia/skills/openclaw-security-toolkit/CHANGELOG.md +35 -0
  399. package/templates/workspaces/olivia/skills/openclaw-security-toolkit/CHANNELLOG.md +73 -0
  400. package/templates/workspaces/olivia/skills/openclaw-security-toolkit/README.md +161 -0
  401. package/templates/workspaces/olivia/skills/openclaw-security-toolkit/SKILL.md +130 -0
  402. package/templates/workspaces/olivia/skills/openclaw-security-toolkit/_meta.json +6 -0
  403. package/templates/workspaces/olivia/skills/openclaw-security-toolkit/config.json +36 -0
  404. package/templates/workspaces/olivia/skills/openclaw-security-toolkit/metadata.json +19 -0
  405. package/templates/workspaces/olivia/skills/openhue/SKILL.md +30 -0
  406. package/templates/workspaces/olivia/skills/openhue/_meta.json +6 -0
  407. package/templates/workspaces/olivia/skills/orgx-operations-agent/SKILL.md +41 -0
  408. package/templates/workspaces/olivia/skills/orgx-operations-agent/_meta.json +6 -0
  409. package/templates/workspaces/olivia/skills/outreach/SKILL.md +84 -0
  410. package/templates/workspaces/olivia/skills/outreach/_meta.json +6 -0
  411. package/templates/workspaces/olivia/skills/outreach/by-type.md +166 -0
  412. package/templates/workspaces/olivia/skills/outreach/templates.md +154 -0
  413. package/templates/workspaces/olivia/skills/outreach/tracking.md +145 -0
  414. package/templates/workspaces/olivia/skills/persona-hr-coordinator/SKILL.md +38 -0
  415. package/templates/workspaces/olivia/skills/persona-hr-coordinator/_meta.json +6 -0
  416. package/templates/workspaces/olivia/skills/personal-productivity/SKILL.md +161 -0
  417. package/templates/workspaces/olivia/skills/personal-productivity/_meta.json +6 -0
  418. package/templates/workspaces/olivia/skills/personal-productivity/index.js +363 -0
  419. package/templates/workspaces/olivia/skills/personal-productivity/package.json +15 -0
  420. package/templates/workspaces/olivia/skills/personal-travel/README.md +34 -0
  421. package/templates/workspaces/olivia/skills/personal-travel/SKILL.md +46 -0
  422. package/templates/workspaces/olivia/skills/personal-travel/_meta.json +6 -0
  423. package/templates/workspaces/olivia/skills/presentation-html-generator-skill/SKILL.md +185 -0
  424. package/templates/workspaces/olivia/skills/presentation-html-generator-skill/_meta.json +6 -0
  425. package/templates/workspaces/olivia/skills/product-manager/SKILL.md +77 -0
  426. package/templates/workspaces/olivia/skills/product-manager/_meta.json +6 -0
  427. package/templates/workspaces/olivia/skills/quant-strategy/SKILL.md +28 -0
  428. package/templates/workspaces/olivia/skills/quant-strategy/_meta.json +6 -0
  429. package/templates/workspaces/olivia/skills/sales-pipeline-tracker/README.md +29 -0
  430. package/templates/workspaces/olivia/skills/sales-pipeline-tracker/SKILL.md +45 -0
  431. package/templates/workspaces/olivia/skills/sales-pipeline-tracker/_meta.json +6 -0
  432. package/templates/workspaces/olivia/skills/security-auditor/SKILL.md +399 -0
  433. package/templates/workspaces/olivia/skills/security-auditor/_meta.json +6 -0
  434. package/templates/workspaces/olivia/skills/security-hardening/SKILL.md +296 -0
  435. package/templates/workspaces/olivia/skills/security-hardening/_meta.json +6 -0
  436. package/templates/workspaces/olivia/skills/security-scanner/SKILL.md +67 -0
  437. package/templates/workspaces/olivia/skills/security-scanner/_meta.json +6 -0
  438. package/templates/workspaces/olivia/skills/seo-optimization/SKILL.md +31 -0
  439. package/templates/workspaces/olivia/skills/seo-optimization/_meta.json +6 -0
  440. package/templates/workspaces/olivia/skills/service-booking/SKILL.md +193 -0
  441. package/templates/workspaces/olivia/skills/service-booking/_meta.json +6 -0
  442. package/templates/workspaces/olivia/skills/sme-hr-automation/SKILL.md +131 -0
  443. package/templates/workspaces/olivia/skills/sme-hr-automation/_meta.json +6 -0
  444. package/templates/workspaces/olivia/skills/social-media-scheduler/README.md +29 -0
  445. package/templates/workspaces/olivia/skills/social-media-scheduler/SKILL.md +49 -0
  446. package/templates/workspaces/olivia/skills/social-media-scheduler/_meta.json +6 -0
  447. package/templates/workspaces/olivia/skills/sonoscli/SKILL.md +26 -0
  448. package/templates/workspaces/olivia/skills/sonoscli/_meta.json +6 -0
  449. package/templates/workspaces/olivia/skills/strategy-advisor/SKILL.md +33 -0
  450. package/templates/workspaces/olivia/skills/strategy-advisor/_meta.json +6 -0
  451. package/templates/workspaces/olivia/skills/summarize/SKILL.md +49 -0
  452. package/templates/workspaces/olivia/skills/summarize/_meta.json +6 -0
  453. package/templates/workspaces/olivia/skills/things-mac/SKILL.md +61 -0
  454. package/templates/workspaces/olivia/skills/things-mac/_meta.json +6 -0
  455. package/templates/workspaces/olivia/skills/travel-itinerary-planner/SKILL.md +121 -0
  456. package/templates/workspaces/olivia/skills/travel-itinerary-planner/_meta.json +6 -0
  457. package/templates/workspaces/olivia/skills/travel-manager/SKILL.md +36 -0
  458. package/templates/workspaces/olivia/skills/travel-manager/_meta.json +6 -0
  459. package/templates/workspaces/olivia/skills/travel-planning/SKILL.md +238 -0
  460. package/templates/workspaces/olivia/skills/travel-planning/_meta.json +6 -0
  461. package/templates/workspaces/olivia/skills/travel-planning/booking-guide.md +91 -0
  462. package/templates/workspaces/olivia/skills/travel-planning/memory-template.md +111 -0
  463. package/templates/workspaces/olivia/skills/travel-planning/multi-city.md +131 -0
  464. package/templates/workspaces/olivia/skills/travel-planning/packing-templates.md +155 -0
  465. package/templates/workspaces/olivia/skills/travel-planning/setup.md +66 -0
  466. package/templates/workspaces/olivia/skills/update-it-all/SKILL.md +143 -0
  467. package/templates/workspaces/olivia/skills/update-it-all/_meta.json +6 -0
  468. package/templates/workspaces/olivia/skills/voice/SKILL.md +62 -0
  469. package/templates/workspaces/olivia/skills/weather/SKILL.md +49 -0
  470. package/templates/workspaces/olivia/skills/weather/_meta.json +6 -0
  471. package/templates/workspaces/olivia/skills/web-researcher/SKILL.md +21 -0
  472. package/templates/workspaces/olivia/skills/web-researcher/_meta.json +6 -0
  473. package/templates/workspaces/olivia/skills/website-seo/SKILL.md +284 -0
  474. package/templates/workspaces/olivia/skills/website-seo/_meta.json +6 -0
  475. package/templates/workspaces/olivia/stripe-welcome-n8n.json +103 -0
  476. package/templates/workspaces/olivia/test2.wav.wav +0 -0
  477. package/templates/workspaces/olivia/test_speech.json +1 -0
  478. package/templates/workspaces/olivia/test_speech.srt +0 -0
  479. package/templates/workspaces/olivia/test_speech.tsv +1 -0
  480. package/templates/workspaces/olivia/test_speech.txt +0 -0
  481. package/templates/workspaces/olivia/test_speech.vtt +2 -0
  482. package/templates/workspaces/owen/AGENTS.md +59 -0
  483. package/templates/workspaces/owen/FEEDBACK.md +12 -0
  484. package/templates/workspaces/owen/HEARTBEAT.md +5 -0
  485. package/templates/workspaces/owen/IDENTITY.md +6 -0
  486. package/templates/workspaces/owen/LEARNINGS.md +46 -0
  487. package/templates/workspaces/owen/MEMORY.md +22 -0
  488. package/templates/workspaces/owen/PLAYBOOK.md +16 -0
  489. package/templates/workspaces/owen/SOUL.md +1 -1
  490. package/templates/workspaces/owen/TOOLS.md +15 -0
  491. package/templates/workspaces/owen/USER.md +17 -0
  492. package/templates/workspaces/parker/AGENTS.md +59 -0
  493. package/templates/workspaces/parker/FEEDBACK.md +11 -0
  494. package/templates/workspaces/parker/HEARTBEAT.md +5 -0
  495. package/templates/workspaces/parker/IDENTITY.md +6 -0
  496. package/templates/workspaces/parker/LEARNINGS.md +17 -0
  497. package/templates/workspaces/parker/MEMORY.md +22 -0
  498. package/templates/workspaces/parker/PLAYBOOK.md +16 -0
  499. package/templates/workspaces/parker/SOUL.md +1 -1
  500. package/templates/workspaces/parker/TOOLS.md +15 -0
  501. package/templates/workspaces/parker/USER.md +13 -0
  502. package/templates/workspaces/quinn/AGENTS.md +52 -0
  503. package/templates/workspaces/quinn/FEEDBACK.md +11 -0
  504. package/templates/workspaces/quinn/HEARTBEAT.md +5 -0
  505. package/templates/workspaces/quinn/IDENTITY.md +6 -0
  506. package/templates/workspaces/quinn/LEARNINGS.md +35 -0
  507. package/templates/workspaces/quinn/MEMORY.md +22 -0
  508. package/templates/workspaces/quinn/PLAYBOOK.md +16 -0
  509. package/templates/workspaces/quinn/SOUL.md +1 -1
  510. package/templates/workspaces/quinn/USER.md +17 -0
  511. package/templates/workspaces/quinn/alice-login-page.png +0 -0
  512. package/templates/workspaces/rowan/AGENTS.md +59 -0
  513. package/templates/workspaces/rowan/FEEDBACK.md +12 -0
  514. package/templates/workspaces/rowan/HEARTBEAT.md +5 -0
  515. package/templates/workspaces/rowan/IDENTITY.md +6 -0
  516. package/templates/workspaces/rowan/LEARNINGS.md +12 -0
  517. package/templates/workspaces/rowan/MEMORY.md +22 -0
  518. package/templates/workspaces/rowan/PLAYBOOK.md +16 -0
  519. package/templates/workspaces/rowan/SOUL.md +1 -1
  520. package/templates/workspaces/rowan/USER.md +17 -0
  521. package/templates/workspaces/selena/AGENTS.md +59 -0
  522. package/templates/workspaces/selena/FEEDBACK.md +12 -0
  523. package/templates/workspaces/selena/HEARTBEAT.md +5 -0
  524. package/templates/workspaces/selena/IDENTITY.md +6 -0
  525. package/templates/workspaces/selena/LEARNINGS.md +24 -0
  526. package/templates/workspaces/selena/MEMORY.md +22 -0
  527. package/templates/workspaces/selena/PLAYBOOK.md +16 -0
  528. package/templates/workspaces/selena/SOUL.md +1 -1
  529. package/templates/workspaces/selena/USER.md +17 -0
  530. package/templates/workspaces/selena/kids-ai-security-compliance-plan.md +791 -0
  531. package/templates/workspaces/selena/kidspark-coppa-compliance-audit.md +866 -0
  532. package/templates/workspaces/sloane/AGENTS.md +59 -0
  533. package/templates/workspaces/sloane/FEEDBACK.md +12 -0
  534. package/templates/workspaces/sloane/HEARTBEAT.md +9 -0
  535. package/templates/workspaces/sloane/IDENTITY.md +6 -0
  536. package/templates/workspaces/sloane/LEARNINGS.md +6 -0
  537. package/templates/workspaces/sloane/MEMORY.md +22 -0
  538. package/templates/workspaces/sloane/PLAYBOOK.md +16 -0
  539. package/templates/workspaces/sloane/SOUL.md +1 -1
  540. package/templates/workspaces/sloane/TOOLS.md +15 -0
  541. package/templates/workspaces/sloane/USER.md +13 -0
  542. package/templates/workspaces/smoketestagent/AGENTS.md +52 -0
  543. package/templates/workspaces/smoketestagent/FEEDBACK.md +3 -0
  544. package/templates/workspaces/smoketestagent/HEARTBEAT.md +14 -0
  545. package/templates/workspaces/smoketestagent/IDENTITY.md +6 -0
  546. package/templates/workspaces/smoketestagent/LEARNINGS.md +3 -0
  547. package/templates/workspaces/smoketestagent/MEMORY.md +24 -0
  548. package/templates/workspaces/smoketestagent/PLAYBOOK.md +7 -0
  549. package/templates/workspaces/smoketestagent/SOUL.md +32 -0
  550. package/templates/workspaces/smoketestagent/TOOLS.md +13 -0
  551. package/templates/workspaces/smoketestagent/USER.md +5 -0
  552. package/templates/workspaces/sophie/AGENTS.md +59 -0
  553. package/templates/workspaces/sophie/FEEDBACK.md +12 -0
  554. package/templates/workspaces/sophie/HEARTBEAT.md +9 -0
  555. package/templates/workspaces/sophie/IDENTITY.md +6 -0
  556. package/templates/workspaces/sophie/LEARNINGS.md +6 -0
  557. package/templates/workspaces/sophie/MEMORY.md +22 -0
  558. package/templates/workspaces/sophie/PLAYBOOK.md +16 -0
  559. package/templates/workspaces/sophie/SOUL.md +1 -1
  560. package/templates/workspaces/sophie/TOOLS.md +15 -0
  561. package/templates/workspaces/sophie/USER.md +17 -0
  562. package/templates/workspaces/tommy/AGENTS.md +59 -0
  563. package/templates/workspaces/tommy/FEEDBACK.md +12 -0
  564. package/templates/workspaces/tommy/HEARTBEAT.md +9 -0
  565. package/templates/workspaces/tommy/IDENTITY.md +6 -0
  566. package/templates/workspaces/tommy/LEARNINGS.md +6 -0
  567. package/templates/workspaces/tommy/MEMORY.md +22 -0
  568. package/templates/workspaces/tommy/PLAYBOOK.md +16 -0
  569. package/templates/workspaces/tommy/SOUL.md +1 -1
  570. package/templates/workspaces/tommy/TOOLS.md +15 -0
  571. package/templates/workspaces/tommy/USER.md +17 -0
  572. package/templates/workspaces/uma/AGENTS.md +59 -0
  573. package/templates/workspaces/uma/FEEDBACK.md +11 -0
  574. package/templates/workspaces/uma/HEARTBEAT.md +5 -0
  575. package/templates/workspaces/uma/IDENTITY.md +6 -0
  576. package/templates/workspaces/uma/LEARNINGS.md +11 -0
  577. package/templates/workspaces/uma/MEMORY.md +22 -0
  578. package/templates/workspaces/uma/PLAYBOOK.md +16 -0
  579. package/templates/workspaces/uma/SOUL.md +1 -1
  580. package/templates/workspaces/uma/TOOLS.md +15 -0
  581. package/templates/workspaces/uma/USER.md +13 -0
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Adaptive Learning & Intelligent Coordination Engine**
4
4
 
5
- One conversation. One orchestrator. Ten starter agents — with 21 more in Pro. A.L.I.C.E. turns your agent runtime into a full AI team — talk to A.L.I.C.E. (or just Alice), and she routes your request to the right expert.
5
+ One conversation. One orchestrator. Ten starter agents — with 23 more in Pro. A.L.I.C.E. turns your agent runtime into a full AI team — talk to A.L.I.C.E. (or just Alice), and she routes your request to the right expert.
6
6
 
7
7
  **NemoClaw compatible** — A.L.I.C.E. v1.2.7+ runs natively on [NVIDIA NemoClaw](https://nvidia.com/nemoclaw), the secure open-source agent runtime. Agents execute inside the OpenShell sandbox for enterprise-grade security.
8
8
 
@@ -16,7 +16,7 @@ That's it. The installer detects your runtime (NemoClaw or OpenClaw) and sets ev
16
16
 
17
17
  ## What You Get
18
18
 
19
- **Starter** includes 10 agents. **Pro** unlocks 21 more — [sign up at getalice.av3.ai](https://getalice.av3.ai/signup?plan=pro)
19
+ **Starter** includes 10 agents. **Pro** unlocks 23 more — [sign up at getalice.av3.ai](https://getalice.av3.ai/signup?plan=pro)
20
20
 
21
21
  **A.L.I.C.E. | Control Cloud** is available as a Pro add-on. If enabled during install, the package now:
22
22
  - installs the `mission-control-bridge` plugin into your OpenClaw home
@@ -58,6 +58,9 @@ An orchestrator (A.L.I.C.E., also addressable as Alice or Olivia) backed by spec
58
58
  | **Parker** | Project Management | 📅 | Pro |
59
59
  | **Aria** | Autonomous Research | 🔬 | Pro |
60
60
  | **Nate** | n8n Automation | 🔧 | Pro |
61
+ | **MaxxiPro** | Roof Maxx Expert | 🏠 | Pro |
62
+ | **AccuScope** | AccuLynx CRM Auditor | 📊 | Pro |
63
+ | **SmokeTestAgent** | QA Specialist | 🧪 | Pro |
61
64
 
62
65
  ## Model Flexibility
63
66
 
@@ -50,10 +50,34 @@ function runCommand(cmd, args) {
50
50
  });
51
51
  }
52
52
 
53
+ /** Fetch JSON helper — replaces `got` with native fetch (Node 18+) */
54
+ async function fetchJson(url, options = {}) {
55
+ const { method = 'GET', json, headers = {}, timeoutMs = 15000 } = options;
56
+ const controller = new AbortController();
57
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
58
+ try {
59
+ const fetchOpts = {
60
+ method,
61
+ headers: { ...headers },
62
+ signal: controller.signal,
63
+ };
64
+ if (json !== undefined) {
65
+ fetchOpts.headers['Content-Type'] = 'application/json';
66
+ fetchOpts.body = JSON.stringify(json);
67
+ }
68
+ const res = await fetch(url, fetchOpts);
69
+ const text = await res.text();
70
+ let data;
71
+ try { data = JSON.parse(text); } catch (_) { data = text; }
72
+ return { ok: res.ok, status: res.status, data };
73
+ } finally {
74
+ clearTimeout(timer);
75
+ }
76
+ }
77
+
53
78
  // ── Login ──────────────────────────────────────────────────────────────────────
54
79
  async function login(args) {
55
80
  const open = (await import('open')).default;
56
- const got = (await import('got')).default;
57
81
 
58
82
  // Non-interactive mode: use token from env
59
83
  if (NON_INTERACTIVE) {
@@ -63,15 +87,15 @@ async function login(args) {
63
87
  process.exit(1);
64
88
  }
65
89
  try {
66
- const res = await got(`${process.env.ALICE_SUPABASE_URL || 'https://xxxgvtwnlbtdgmlgccee.supabase.co'}/auth/v1/user`, {
67
- headers: { Authorization: `Bearer ${token}` },
68
- throwHttpErrors: false,
69
- }).json();
90
+ const supabaseUrl = process.env.ALICE_SUPABASE_URL || 'https://xxxgvtwnlbtdgmlgccee.supabase.co';
91
+ const { ok, data } = await fetchJson(`${supabaseUrl}/auth/v1/user`, {
92
+ headers: { Authorization: `Bearer ${token}`, apikey: token },
93
+ });
70
94
  const config = loadConfig();
71
95
  config.supabaseToken = token;
72
- config.user = res;
96
+ config.user = data;
73
97
  saveConfig(config);
74
- console.log('✅ Logged in as', res.email || res.user_metadata?.user_name || 'unknown');
98
+ console.log('✅ Logged in as', data.email || data.user_metadata?.user_name || 'unknown');
75
99
  return;
76
100
  } catch (err) {
77
101
  console.error('❌ Token validation failed:', err.message);
@@ -80,15 +104,13 @@ async function login(args) {
80
104
  }
81
105
 
82
106
  console.log('🔐 A.L.I.C.E. Cloud login');
83
- console.log(' Opening browser for Supabase OAuth…');
107
+ console.log(' Opening browser for login…');
84
108
 
85
- const supabaseUrl = process.env.ALICE_SUPABASE_URL || 'https://xxxgvtwnlbtdgmlgccee.supabase.co';
86
- const redirectUri = `${API_BASE}/auth/callback`;
87
- const oauthUrl = `${supabaseUrl}/auth/v1/authorize?provider=github&redirect_to=${encodeURIComponent(redirectUri)}`;
88
-
89
- await open(oauthUrl);
90
- console.log(' Browser opened. Complete login in your browser.');
91
- console.log(' After login, paste your Supabase access token here:');
109
+ const loginUrl = `${API_BASE.replace('/api/cloud', '')}/login?cli=1`;
110
+ try { await open(loginUrl); } catch (_) {
111
+ console.log(` Could not open browser. Visit: ${loginUrl}`);
112
+ }
113
+ console.log(' After login, copy the access token and paste it here:');
92
114
  process.stdout.write(' > ');
93
115
 
94
116
  return new Promise((resolve, reject) => {
@@ -99,15 +121,15 @@ async function login(args) {
99
121
  token = token.trim();
100
122
  if (!token) { reject(new Error('No token provided')); return; }
101
123
  try {
102
- const res = await got(`${supabaseUrl}/auth/v1/user`, {
103
- headers: { Authorization: `Bearer ${token}` },
104
- throwHttpErrors: false,
105
- }).json();
124
+ const supabaseUrl = process.env.ALICE_SUPABASE_URL || 'https://xxxgvtwnlbtdgmlgccee.supabase.co';
125
+ const { ok, data } = await fetchJson(`${supabaseUrl}/auth/v1/user`, {
126
+ headers: { Authorization: `Bearer ${token}`, apikey: token },
127
+ });
106
128
  const config = loadConfig();
107
129
  config.supabaseToken = token;
108
- config.user = res;
130
+ config.user = data;
109
131
  saveConfig(config);
110
- console.log(' ✅ Logged in as', res.email || res.user_metadata?.user_name || 'unknown');
132
+ console.log(' ✅ Logged in as', data.email || data.user_metadata?.user_name || 'unknown');
111
133
  resolve();
112
134
  } catch (err) {
113
135
  reject(new Error('Token validation failed: ' + err.message));
@@ -118,11 +140,10 @@ async function login(args) {
118
140
 
119
141
  // ── Register ───────────────────────────────────────────────────────────────────
120
142
  async function detectGatewayUrl() {
121
- const got = (await import('got')).default;
122
143
  const candidates = ['https://localhost:18789', 'http://localhost:18789'];
123
144
  for (const url of candidates) {
124
145
  try {
125
- await got.get(url, { throwHttpErrors: true, timeout: { request: 2000 }, retry: { limit: 0 } });
146
+ const { ok } = await fetchJson(url, { timeoutMs: 2000 });
126
147
  return url;
127
148
  } catch (_) {}
128
149
  }
@@ -144,7 +165,6 @@ async function getOpenClawVersion() {
144
165
  }
145
166
 
146
167
  async function register(args) {
147
- const got = (await import('got')).default;
148
168
  const config = loadConfig();
149
169
 
150
170
  if (!config.supabaseToken) {
@@ -165,11 +185,12 @@ async function register(args) {
165
185
  let lastError;
166
186
  for (let attempt = 1; attempt <= 3; attempt++) {
167
187
  try {
168
- const response = await got.post(`${API_BASE}/register`, {
188
+ const { ok, status, data } = await fetchJson(`${API_BASE}/register`, {
189
+ method: 'POST',
169
190
  json: { gatewayUrl, gatewayToken, hostname, version },
170
191
  headers: { Authorization: `Bearer ${config.supabaseToken}` },
171
- throwHttpErrors: true,
172
- }).json();
192
+ });
193
+ if (!ok) throw new Error(`HTTP ${status}: ${typeof data === 'string' ? data : JSON.stringify(data)}`);
173
194
  config.registration = { gatewayUrl, hostname, version, registeredAt: new Date().toISOString() };
174
195
  saveConfig(config);
175
196
  console.log(' ✅ Gateway registered!');
@@ -187,7 +208,6 @@ async function register(args) {
187
208
 
188
209
  // ── Status ─────────────────────────────────────────────────────────────────────
189
210
  async function status(args) {
190
- const got = (await import('got')).default;
191
211
  const config = loadConfig();
192
212
 
193
213
  if (!config.supabaseToken) {
@@ -196,12 +216,16 @@ async function status(args) {
196
216
  }
197
217
 
198
218
  try {
199
- const data = await got.get(`${API_BASE}/status`, {
219
+ const { ok, status: httpStatus, data } = await fetchJson(`${API_BASE}/status`, {
200
220
  headers: { Authorization: `Bearer ${config.supabaseToken}` },
201
- throwHttpErrors: false,
202
- }).json();
221
+ });
222
+
223
+ if (httpStatus === 401) {
224
+ console.error('❌ Session expired. Run `alice-cloud login` again.');
225
+ process.exit(1);
226
+ }
203
227
 
204
- if (!data.registered) {
228
+ if (!ok || !data.registered) {
205
229
  console.log('⚪ No gateway registered.');
206
230
  console.log(' Run `alice-cloud register` to connect your gateway.');
207
231
  return;
@@ -214,18 +238,13 @@ async function status(args) {
214
238
  console.log(` Last heartbeat: ${data.lastHeartbeat ? new Date(data.lastHeartbeat).toLocaleString() : 'Never'}`);
215
239
  console.log(` Version : ${data.version}`);
216
240
  } catch (err) {
217
- if (err.response?.statusCode === 401) {
218
- console.error('❌ Session expired. Run `alice-cloud login` again.');
219
- } else {
220
- console.error('❌ Status check failed:', err.message);
221
- }
241
+ console.error('❌ Status check failed:', err.message);
222
242
  process.exit(1);
223
243
  }
224
244
  }
225
245
 
226
246
  // ── Unregister ─────────────────────────────────────────────────────────────────
227
247
  async function unregister(args) {
228
- const got = (await import('got')).default;
229
248
  const config = loadConfig();
230
249
 
231
250
  if (!config.supabaseToken) {
@@ -235,35 +254,33 @@ async function unregister(args) {
235
254
 
236
255
  console.log('🗑️ Unregistering gateway…');
237
256
  try {
238
- await got.delete(`${API_BASE}/status`, {
257
+ const { ok, status } = await fetchJson(`${API_BASE}/status`, {
258
+ method: 'DELETE',
239
259
  headers: { Authorization: `Bearer ${config.supabaseToken}` },
240
- throwHttpErrors: false,
241
260
  });
242
- delete config.registration;
243
- saveConfig(config);
244
- console.log(' ✅ Gateway unregistered.');
245
- } catch (err) {
246
- if (err.response?.statusCode === 404) {
261
+ if (status === 404) {
247
262
  console.log(' ℹ️ No gateway was registered.');
248
263
  } else {
249
- console.error('❌ Unregister failed:', err.message);
250
- process.exit(1);
264
+ delete config.registration;
265
+ saveConfig(config);
266
+ console.log(' ✅ Gateway unregistered.');
251
267
  }
268
+ } catch (err) {
269
+ console.error('❌ Unregister failed:', err.message);
270
+ process.exit(1);
252
271
  }
253
272
  }
254
273
 
255
274
  // ── Watch (daemon) ─────────────────────────────────────────────────────────────
256
275
  async function checkGatewayUp(gatewayUrl) {
257
- const got = (await import('got')).default;
258
276
  try {
259
- await got.get(gatewayUrl, { throwHttpErrors: true, timeout: { request: 3000 }, retry: { limit: 0 } });
277
+ const { ok } = await fetchJson(gatewayUrl, { timeoutMs: 3000 });
260
278
  return true;
261
279
  } catch (_) {}
262
280
  return false;
263
281
  }
264
282
 
265
283
  async function startHeartbeatLoop(config) {
266
- const got = (await import('got')).default;
267
284
  const gatewayUrl = config.registration?.gatewayUrl || 'https://localhost:18789';
268
285
 
269
286
  async function heartbeat() {
@@ -273,10 +290,11 @@ async function startHeartbeatLoop(config) {
273
290
  console.log('[watch] Gateway down, attempting restart…');
274
291
  try { await runCommand('openclaw', ['gateway', 'start']); await sleep(3000); } catch (_) {}
275
292
  }
276
- await got.post(`${API_BASE}/heartbeat`, {
293
+ await fetchJson(`${API_BASE}/heartbeat`, {
294
+ method: 'POST',
277
295
  json: { hostname: os.hostname(), connected: await checkGatewayUp(gatewayUrl), timestamp: new Date().toISOString() },
278
296
  headers: { Authorization: `Bearer ${config.supabaseToken}` },
279
- throwHttpErrors: false, timeout: { request: 10000 },
297
+ timeoutMs: 10000,
280
298
  });
281
299
  console.log(`[${new Date().toLocaleTimeString()}] heartbeat sent (gateway: ${isUp ? 'up' : 'down'})`);
282
300
  } catch (err) {
@@ -312,7 +330,6 @@ async function watch(args) {
312
330
  }
313
331
 
314
332
  // ── Programmatic API exports ───────────────────────────────────────────────────
315
- // Allow ESM callers to import these via createRequire or spawn as child process.
316
333
  module.exports = {
317
334
  login,
318
335
  register,
@@ -328,13 +345,12 @@ module.exports = {
328
345
  };
329
346
 
330
347
  // ── CLI dispatcher ─────────────────────────────────────────────────────────────
331
- // Only run as CLI when this file is the main module (not when required/imported)
332
348
  if (require.main === module) {
333
349
  const commands = { login, register, status, unregister, watch };
334
350
  const cmd = process.argv[2];
335
351
 
336
352
  if (!cmd) {
337
- console.log(`alice-cloud v1.0.1 — A.L.I.C.E. | Control Cloud CLI
353
+ console.log(`alice-cloud v1.1.0 — A.L.I.C.E. | Control Cloud CLI
338
354
 
339
355
  Usage: alice-cloud <command> [options]
340
356
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robbiesrobotics/alice-agents",
3
- "version": "1.5.7",
3
+ "version": "1.5.9",
4
4
  "description": "A.L.I.C.E. \u2014 31 AI agents for OpenClaw. One conversation, one team.",
5
5
  "bin": {
6
6
  "alice-agents": "bin/alice-install.mjs",
@@ -0,0 +1,183 @@
1
+ ---
2
+ name: acculynx
3
+ description: 'Analyze AccuLynx CRM CSV exports and build a live visual P&L dashboard on Vercel. Use when: Jesse or Rob drops AccuLynx CSV files in the A.L.I.C.E Sales chat and asks for analysis, a visual dashboard, or a PDF report. Covers Job Profitability Report and Job Expenses Report. Handles data quality flagging, trade/rep/stage breakdowns, and Vercel deployment.'
4
+ metadata:
5
+ {
6
+ "openclaw": { "emoji": "📊", "requires": { "anyBins": ["python3", "node", "npx", "vercel"] } }
7
+ }
8
+ ---
9
+
10
+ # AccuLynx Analysis Skill
11
+
12
+ Builds a full visual P&L + Cash Flow dashboard from AccuLynx CSV exports and deploys it live to Vercel.
13
+
14
+ ## Trigger Phrases
15
+ - "analyze acculynx"
16
+ - "build acculynx dashboard"
17
+ - "upload acculynx csv"
18
+ - "drop acculynx"
19
+ - "refresh the dashboard"
20
+ - "acclynx report"
21
+ - Any message with a `.csv` attachment from AccuLynx in the A.L.I.C.E Sales thread
22
+
23
+ ## Two CSV Types (know the difference)
24
+
25
+ ### 1. Job Profitability Report
26
+ **Filename pattern:** `Job_Profitability_Report*.csv`
27
+ **What it contains:** Per-job revenue, expenses, profit, margin %, stage, trades, salesperson
28
+ **Key columns:** `Contract Amount`, `Orders Total`, `Profit`, `Profit %`, `Total Expenses`, `Primary Salesperson`, `Order Trades`, `Current Milestone`
29
+ **Use for:** Overall P&L, top/bottom jobs, rep performance, trade profitability, margin distributions, data quality
30
+ **NOT for:** Cash flow (that's the Expenses Report)
31
+
32
+ ### 2. Job Expenses Report
33
+ **Filename pattern:** `Job_Expenses_Report*.csv` or `job_expenses_report*.csv`
34
+ **What it contains:** Weekly cash outflows (paid expenses, unbudgeted/additional costs)
35
+ **Key columns:** `Payment Date (by week)`, `Total Paid Expenses`, `Paid Expenses Count`, `Additional Expenses Total`, `Additional Expenses Count`
36
+ **Use for:** Cash flow analysis, monthly expense trends, peak payout weeks
37
+ **NOT for:** Per-job profitability (use the Profitability Report for that)
38
+
39
+ ## Standard Workflow
40
+
41
+ ### Step 1 — Save the CSV(s)
42
+ When a CSV arrives via Telegram media attachment, it's auto-saved to:
43
+ ```
44
+ /Users/aliceclaw/.openclaw/media/inbound/
45
+ ```
46
+ Look for the newest matching file. The filename will contain the report type and date.
47
+
48
+ ### Step 2 — Analyze the Data
49
+ Write and run a Python analysis script. Key things to compute:
50
+
51
+ **From Job Profitability Report:**
52
+ ```python
53
+ import csv
54
+ from collections import defaultdict
55
+
56
+ jobs = []
57
+ with open('/path/to/Job_Profitability_Report*.csv') as f:
58
+ reader = csv.DictReader(f)
59
+ for row in reader:
60
+ try:
61
+ jobs.append({
62
+ 'name': row['Job Name'],
63
+ 'contract': float(row['Contract Amount'] or 0),
64
+ 'profit': float(row['Profit'] or 0),
65
+ 'profit_pct': float(row['Profit %'] or 0),
66
+ 'expenses': float(row['Total Expenses'] or 0),
67
+ 'salesperson': row['Primary Salesperson'],
68
+ 'trades': row['Order Trades'],
69
+ 'milestone': row['Current Milestone'],
70
+ })
71
+ except: pass
72
+ ```
73
+ Compute: total revenue/profit/expenses, overall margin, profitable/lost counts, by-stage summaries, by-rep summaries, by-trade summaries, top 10/bottom 10 jobs, data quality issues (zero contract, missing trades, pending losses).
74
+
75
+ **From Job Expenses Report:**
76
+ ```python
77
+ rows = []
78
+ with open('/path/to/job_expenses_report*.csv') as f:
79
+ reader = csv.DictReader(f)
80
+ for row in reader:
81
+ rows.append({
82
+ 'date': row['Payment Date (by week)'],
83
+ 'paid': float(row['Total Paid Expenses']),
84
+ 'additional': float(row['Additional Expenses Total']),
85
+ 'count': int(row['Paid Expenses Count']),
86
+ })
87
+ ```
88
+ Compute: total paid, avg weekly, monthly aggregation, peak week, trend over time.
89
+
90
+ ### Step 3 — Build the Dashboard
91
+ Use Next.js 14 + Tailwind CSS + Chart.js (via CDN in layout.tsx).
92
+
93
+ **Project location:** `/tmp/acculynx-dashboard/`
94
+ **Vercel deploy token:** `<VERCEL_TOKEN>`
95
+
96
+ **Standard sections:**
97
+ 1. About This Data (explain both CSV types)
98
+ 2. Portfolio KPIs (revenue, profit, margin, win rate)
99
+ 3. Cash Flow Analysis (expenses data — if Job Expenses Report available)
100
+ 4. P&L by Job Stage
101
+ 5. Top 10 Jobs vs Biggest Losses
102
+ 6. Sales Rep Performance (bar charts for profit and margin)
103
+ 7. Trade Type Profitability
104
+ 8. Margin / Profit Distributions
105
+ 9. Data Quality Issues (zero contract, missing trades, pending losses)
106
+
107
+ **Required package.json dependencies:**
108
+ ```json
109
+ {
110
+ "dependencies": {
111
+ "next": "^14.2.0",
112
+ "react": "^18.3.0",
113
+ "react-dom": "^18.3.0"
114
+ },
115
+ "devDependencies": {
116
+ "typescript": "^5.4.0",
117
+ "tailwindcss": "^3.4.0",
118
+ "autoprefixer": "^10.4.0",
119
+ "postcss": "^8.4.0",
120
+ "@types/node": "^20.0.0",
121
+ "@types/react": "^18.3.0",
122
+ "@types/react-dom": "^18.3.0"
123
+ }
124
+ }
125
+ ```
126
+
127
+ **Chart.js CDN (add to layout.tsx head):**
128
+ ```tsx
129
+ <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js" />
130
+ ```
131
+
132
+ **Build command:** `cd /tmp/acculynx-dashboard && npm run build`
133
+ **Deploy command:** `cd /tmp/acculynx-dashboard && npx vercel deploy --prod --yes --token <VERCEL_TOKEN>`
134
+
135
+ ### Step 4 — Deploy and Report
136
+ 1. Run build — fix any TypeScript errors (common: `const` redeclaration, missing `any` type on Chart.js callbacks)
137
+ 2. Deploy to Vercel with the token above
138
+ 3. Reply in the Telegram thread with the live URL
139
+ 4. Summarize key findings in the message
140
+
141
+ ## Common Issues
142
+
143
+ ### TypeScript error: Parameter 'ctx' implicitly has 'any' type
144
+ ```tsx
145
+ // Wrong:
146
+ label: ctx => ...
147
+ // Right:
148
+ label: (ctx: any) => ...
149
+ ```
150
+
151
+ ### BUILD ERROR: 'const' declarations must be initialized
152
+ Spaces in constant names — use underscores:
153
+ ```python
154
+ # Wrong:
155
+ BREAK EVEN = 11
156
+ # Right:
157
+ BREAK_EVEN = 11
158
+ ```
159
+
160
+ ### Chart.js not loading
161
+ Load via CDN script tags in `layout.tsx <head>` — don't use npm install for Chart.js in this setup.
162
+
163
+ ## Key Thresholds (construction industry)
164
+ - **Good margin:** 30%+
165
+ - **Acceptable margin:** 20–30%
166
+ - **Warning:** <20% or any negative
167
+ - **Roofing typically:** 10–20% (thin — flag if <10%)
168
+ - **Service trades:** usually high margin (40%+)
169
+ - **Overall portfolio margin:** good at >15%
170
+
171
+ ## Data Quality Flags to Always Report
172
+ 1. Jobs with `Contract Amount = 0` — profit can't be calculated
173
+ 2. Jobs with `Profit % = 0` but nonzero profit — margin not computable
174
+ 3. Jobs with no `Order Trades` — unclassified
175
+ 4. Approved/Completed/Invoiced jobs with negative profit — embedded losses
176
+ 5. `Additional Expenses` with no corresponding payments — unbudgeted costs
177
+
178
+ ## Reply Format
179
+ Always lead with the dashboard URL, then summarize:
180
+ 1. Key P&L numbers (revenue, profit, margin)
181
+ 2. The most important insight (worst job, worst rep, worst trade, or cash flow flag)
182
+ 3. Data quality summary
183
+ 4. Ask: "Want me to set up weekly auto-refresh?"
@@ -0,0 +1,116 @@
1
+ import csv
2
+ from collections import defaultdict
3
+
4
+ jobs = []
5
+
6
+ with open('/Users/aliceclaw/.openclaw/media/inbound/Job_Profitability_Report-4_08_2026_14_4_7---1ed402bb-54d3-4511-b88f-76cdbc4769ae.csv') as f:
7
+ reader = csv.DictReader(f)
8
+ for row in reader:
9
+ try:
10
+ contract = float(row['Contract Amount'] or 0)
11
+ orders_total = float(row['Orders Total'] or 0)
12
+ profit = float(row['Profit'] or 0)
13
+ profit_pct = float(row['Profit %'] or 0)
14
+ total_expenses = float(row['Total Expenses'] or 0)
15
+ salesperson = row['Primary Salesperson']
16
+ trades = row['Order Trades']
17
+ name = row['Job Name']
18
+ jobs.append({
19
+ 'name': name,
20
+ 'contract': contract,
21
+ 'orders': orders_total,
22
+ 'profit': profit,
23
+ 'profit_pct': profit_pct,
24
+ 'expenses': total_expenses,
25
+ 'salesperson': salesperson,
26
+ 'trades': trades
27
+ })
28
+ except:
29
+ pass
30
+
31
+ # Sort by profit
32
+ by_profit = sorted(jobs, key=lambda x: x['profit'], reverse=True)
33
+ by_margin = sorted(jobs, key=lambda x: x['profit_pct'], reverse=True)
34
+ losers = sorted(jobs, key=lambda x: x['profit'])
35
+
36
+ total_profit = sum(j['profit'] for j in jobs)
37
+ total_revenue = sum(j['contract'] for j in jobs)
38
+ total_expenses = sum(j['expenses'] for j in jobs)
39
+ profitable_count = len([j for j in jobs if j['profit'] > 0])
40
+ lost_money_count = len([j for j in jobs if j['profit'] < 0])
41
+ zero_count = len([j for j in jobs if j['profit'] == 0])
42
+
43
+ print("=" * 72)
44
+ print("JESSE -- FULL P&L ANALYSIS (Job Profitability Report)")
45
+ print("=" * 72)
46
+
47
+ print("\nOVERALL P&L SUMMARY")
48
+ print(f" Total Revenue: ${total_revenue:>14,.2f}")
49
+ print(f" Total Expenses: ${total_expenses:>14,.2f}")
50
+ print(f" TOTAL PROFIT: ${total_profit:>14,.2f}")
51
+ print(f" Overall Margin: {(total_profit/total_revenue*100):>14.1f}%")
52
+ print(f" ")
53
+ print(f" Jobs Profitable: {profitable_count}")
54
+ print(f" Jobs Lost Money: {lost_money_count}")
55
+ print(f" Jobs Break-Even: {zero_count}")
56
+ print(f" Total Jobs: {len(jobs)}")
57
+
58
+ print("\n" + "=" * 72)
59
+ print("TOP 10 JOBS BY PROFIT $")
60
+ print("-" * 72)
61
+ print(f"{'Job':<38} {'Profit':>10} {'Margin':>8} {'Salesperson':<20}")
62
+ print("-" * 72)
63
+ for j in by_profit[:10]:
64
+ print(f"{j['name'][:36]:<38} ${j['profit']:>9,.0f} {j['profit_pct']*100:>6.0f}% {j['salesperson'][:18]:<20}")
65
+
66
+ print("\n" + "=" * 72)
67
+ print("TOP 10 JOBS BY MARGIN %")
68
+ print("-" * 72)
69
+ print(f"{'Job':<38} {'Margin':>8} {'Profit':>10} {'Salesperson':<20}")
70
+ print("-" * 72)
71
+ for j in by_margin[:10]:
72
+ if j['contract'] > 0:
73
+ print(f"{j['name'][:36]:<38} {j['profit_pct']*100:>6.0f}% ${j['profit']:>9,.0f} {j['salesperson'][:18]:<20}")
74
+
75
+ print("\n" + "=" * 72)
76
+ print("⚠️ JOBS THAT LOST MONEY")
77
+ print("-" * 72)
78
+ print(f"{'Job':<38} {'Loss':>10} {'Margin':>8} {'Salesperson':<20}")
79
+ print("-" * 72)
80
+ lost = [j for j in jobs if j['profit'] < 0]
81
+ for j in sorted(lost, key=lambda x: x['profit'])[:10]:
82
+ print(f"{j['name'][:36]:<38} ${j['profit']:>9,.0f} {j['profit_pct']*100:>6.0f}% {j['salesperson'][:18]:<20}")
83
+ if not lost:
84
+ print(" No jobs with negative profit found")
85
+
86
+ print("\n" + "=" * 72)
87
+ print("SALESRep PERFORMANCE (Profit)")
88
+ print("-" * 72)
89
+ reps = defaultdict(lambda: {'profit': 0, 'revenue': 0, 'count': 0})
90
+ for j in jobs:
91
+ reps[j['salesperson']]['profit'] += j['profit']
92
+ reps[j['salesperson']]['revenue'] += j['contract']
93
+ reps[j['salesperson']]['count'] += 1
94
+ print(f"{'Salesperson':<22} {'Jobs':>5} {'Revenue':>12} {'Profit':>12} {'Margin':>8}")
95
+ print("-" * 72)
96
+ for rep, d in sorted(reps.items(), key=lambda x: x[1]['profit'], reverse=True):
97
+ margin = (d['profit']/d['revenue']*100) if d['revenue'] > 0 else 0
98
+ print(f"{rep[:20]:<22} {d['count']:>5} ${d['revenue']:>10,.0f} ${d['profit']:>10,.0f} {margin:>7.0f}%")
99
+
100
+ print("\n" + "=" * 72)
101
+ print("TRADE PERFORMANCE (Profit by Primary Trade)")
102
+ print("-" * 72)
103
+ trades = defaultdict(lambda: {'profit': 0, 'revenue': 0, 'count': 0})
104
+ for j in jobs:
105
+ primary_trade = j['trades'].split(',')[0].strip() if j['trades'] else 'Unknown'
106
+ trades[primary_trade]['profit'] += j['profit']
107
+ trades[primary_trade]['revenue'] += j['contract']
108
+ trades[primary_trade]['count'] += 1
109
+ print(f"{'Trade':<20} {'Jobs':>5} {'Revenue':>12} {'Profit':>12} {'Margin':>8}")
110
+ print("-" * 72)
111
+ for trade, d in sorted(trades.items(), key=lambda x: x[1]['profit'], reverse=True):
112
+ margin = (d['profit']/d['revenue']*100) if d['revenue'] > 0 else 0
113
+ print(f"{trade[:18]:<20} {d['count']:>5} ${d['revenue']:>10,.0f} ${d['profit']:>10,.0f} {margin:>7.0f}%")
114
+
115
+ EOF
116
+ python3 /tmp/acculynx_analysis.py