myaiforone 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/README.md +113 -0
  2. package/agents/_template/CLAUDE.md +18 -0
  3. package/agents/_template/agent.json +7 -0
  4. package/agents/platform/agentcreator/CLAUDE.md +300 -0
  5. package/agents/platform/appcreator/CLAUDE.md +158 -0
  6. package/agents/platform/gym/CLAUDE.md +486 -0
  7. package/agents/platform/gym/agent.json +40 -0
  8. package/agents/platform/gym/programs/agent-building/program.json +160 -0
  9. package/agents/platform/gym/programs/automations-mastery/program.json +129 -0
  10. package/agents/platform/gym/programs/getting-started/program.json +124 -0
  11. package/agents/platform/gym/programs/mcp-integrations/program.json +116 -0
  12. package/agents/platform/gym/programs/multi-model-strategy/program.json +115 -0
  13. package/agents/platform/gym/programs/prompt-engineering/program.json +136 -0
  14. package/agents/platform/gym/souls/alex.md +12 -0
  15. package/agents/platform/gym/souls/jordan.md +12 -0
  16. package/agents/platform/gym/souls/morgan.md +12 -0
  17. package/agents/platform/gym/souls/riley.md +12 -0
  18. package/agents/platform/gym/souls/sam.md +12 -0
  19. package/agents/platform/hub/CLAUDE.md +372 -0
  20. package/agents/platform/promptcreator/CLAUDE.md +130 -0
  21. package/agents/platform/skillcreator/CLAUDE.md +163 -0
  22. package/bin/cli.js +566 -0
  23. package/config.example.json +310 -0
  24. package/dist/agent-registry.d.ts +32 -0
  25. package/dist/agent-registry.d.ts.map +1 -0
  26. package/dist/agent-registry.js +144 -0
  27. package/dist/agent-registry.js.map +1 -0
  28. package/dist/channels/discord.d.ts +17 -0
  29. package/dist/channels/discord.d.ts.map +1 -0
  30. package/dist/channels/discord.js +114 -0
  31. package/dist/channels/discord.js.map +1 -0
  32. package/dist/channels/imessage.d.ts +23 -0
  33. package/dist/channels/imessage.d.ts.map +1 -0
  34. package/dist/channels/imessage.js +214 -0
  35. package/dist/channels/imessage.js.map +1 -0
  36. package/dist/channels/slack.d.ts +19 -0
  37. package/dist/channels/slack.d.ts.map +1 -0
  38. package/dist/channels/slack.js +167 -0
  39. package/dist/channels/slack.js.map +1 -0
  40. package/dist/channels/telegram.d.ts +19 -0
  41. package/dist/channels/telegram.d.ts.map +1 -0
  42. package/dist/channels/telegram.js +274 -0
  43. package/dist/channels/telegram.js.map +1 -0
  44. package/dist/channels/types.d.ts +44 -0
  45. package/dist/channels/types.d.ts.map +1 -0
  46. package/dist/channels/types.js +18 -0
  47. package/dist/channels/types.js.map +1 -0
  48. package/dist/channels/whatsapp.d.ts +23 -0
  49. package/dist/channels/whatsapp.d.ts.map +1 -0
  50. package/dist/channels/whatsapp.js +189 -0
  51. package/dist/channels/whatsapp.js.map +1 -0
  52. package/dist/config.d.ts +134 -0
  53. package/dist/config.d.ts.map +1 -0
  54. package/dist/config.js +127 -0
  55. package/dist/config.js.map +1 -0
  56. package/dist/cron.d.ts +8 -0
  57. package/dist/cron.d.ts.map +1 -0
  58. package/dist/cron.js +35 -0
  59. package/dist/cron.js.map +1 -0
  60. package/dist/decrypt-keys.d.ts +7 -0
  61. package/dist/decrypt-keys.d.ts.map +1 -0
  62. package/dist/decrypt-keys.js +53 -0
  63. package/dist/decrypt-keys.js.map +1 -0
  64. package/dist/encrypt-keys.d.ts +8 -0
  65. package/dist/encrypt-keys.d.ts.map +1 -0
  66. package/dist/encrypt-keys.js +62 -0
  67. package/dist/encrypt-keys.js.map +1 -0
  68. package/dist/executor.d.ts +31 -0
  69. package/dist/executor.d.ts.map +1 -0
  70. package/dist/executor.js +2009 -0
  71. package/dist/executor.js.map +1 -0
  72. package/dist/gemini-executor.d.ts +27 -0
  73. package/dist/gemini-executor.d.ts.map +1 -0
  74. package/dist/gemini-executor.js +160 -0
  75. package/dist/gemini-executor.js.map +1 -0
  76. package/dist/goals.d.ts +24 -0
  77. package/dist/goals.d.ts.map +1 -0
  78. package/dist/goals.js +189 -0
  79. package/dist/goals.js.map +1 -0
  80. package/dist/gym/activity-digest.d.ts +30 -0
  81. package/dist/gym/activity-digest.d.ts.map +1 -0
  82. package/dist/gym/activity-digest.js +506 -0
  83. package/dist/gym/activity-digest.js.map +1 -0
  84. package/dist/gym/dimension-scorer.d.ts +76 -0
  85. package/dist/gym/dimension-scorer.d.ts.map +1 -0
  86. package/dist/gym/dimension-scorer.js +236 -0
  87. package/dist/gym/dimension-scorer.js.map +1 -0
  88. package/dist/gym/gym-router.d.ts +7 -0
  89. package/dist/gym/gym-router.d.ts.map +1 -0
  90. package/dist/gym/gym-router.js +718 -0
  91. package/dist/gym/gym-router.js.map +1 -0
  92. package/dist/gym/index.d.ts +11 -0
  93. package/dist/gym/index.d.ts.map +1 -0
  94. package/dist/gym/index.js +11 -0
  95. package/dist/gym/index.js.map +1 -0
  96. package/dist/heartbeat.d.ts +21 -0
  97. package/dist/heartbeat.d.ts.map +1 -0
  98. package/dist/heartbeat.js +163 -0
  99. package/dist/heartbeat.js.map +1 -0
  100. package/dist/index.d.ts +2 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +254 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/keystore.d.ts +22 -0
  105. package/dist/keystore.d.ts.map +1 -0
  106. package/dist/keystore.js +178 -0
  107. package/dist/keystore.js.map +1 -0
  108. package/dist/logger.d.ts +9 -0
  109. package/dist/logger.d.ts.map +1 -0
  110. package/dist/logger.js +45 -0
  111. package/dist/logger.js.map +1 -0
  112. package/dist/memory/daily.d.ts +22 -0
  113. package/dist/memory/daily.d.ts.map +1 -0
  114. package/dist/memory/daily.js +82 -0
  115. package/dist/memory/daily.js.map +1 -0
  116. package/dist/memory/embeddings.d.ts +15 -0
  117. package/dist/memory/embeddings.d.ts.map +1 -0
  118. package/dist/memory/embeddings.js +154 -0
  119. package/dist/memory/embeddings.js.map +1 -0
  120. package/dist/memory/index.d.ts +32 -0
  121. package/dist/memory/index.d.ts.map +1 -0
  122. package/dist/memory/index.js +159 -0
  123. package/dist/memory/index.js.map +1 -0
  124. package/dist/memory/search.d.ts +21 -0
  125. package/dist/memory/search.d.ts.map +1 -0
  126. package/dist/memory/search.js +77 -0
  127. package/dist/memory/search.js.map +1 -0
  128. package/dist/memory/store.d.ts +23 -0
  129. package/dist/memory/store.d.ts.map +1 -0
  130. package/dist/memory/store.js +144 -0
  131. package/dist/memory/store.js.map +1 -0
  132. package/dist/ollama-executor.d.ts +17 -0
  133. package/dist/ollama-executor.d.ts.map +1 -0
  134. package/dist/ollama-executor.js +112 -0
  135. package/dist/ollama-executor.js.map +1 -0
  136. package/dist/openai-executor.d.ts +38 -0
  137. package/dist/openai-executor.d.ts.map +1 -0
  138. package/dist/openai-executor.js +197 -0
  139. package/dist/openai-executor.js.map +1 -0
  140. package/dist/router.d.ts +11 -0
  141. package/dist/router.d.ts.map +1 -0
  142. package/dist/router.js +185 -0
  143. package/dist/router.js.map +1 -0
  144. package/dist/test-message.d.ts +2 -0
  145. package/dist/test-message.d.ts.map +1 -0
  146. package/dist/test-message.js +60 -0
  147. package/dist/test-message.js.map +1 -0
  148. package/dist/utils/imsg-db-reader.d.ts +24 -0
  149. package/dist/utils/imsg-db-reader.d.ts.map +1 -0
  150. package/dist/utils/imsg-db-reader.js +92 -0
  151. package/dist/utils/imsg-db-reader.js.map +1 -0
  152. package/dist/utils/imsg-rpc.d.ts +25 -0
  153. package/dist/utils/imsg-rpc.d.ts.map +1 -0
  154. package/dist/utils/imsg-rpc.js +149 -0
  155. package/dist/utils/imsg-rpc.js.map +1 -0
  156. package/dist/utils/message-formatter.d.ts +3 -0
  157. package/dist/utils/message-formatter.d.ts.map +1 -0
  158. package/dist/utils/message-formatter.js +69 -0
  159. package/dist/utils/message-formatter.js.map +1 -0
  160. package/dist/web-ui.d.ts +12 -0
  161. package/dist/web-ui.d.ts.map +1 -0
  162. package/dist/web-ui.js +5784 -0
  163. package/dist/web-ui.js.map +1 -0
  164. package/dist/whatsapp-chats.d.ts +2 -0
  165. package/dist/whatsapp-chats.d.ts.map +1 -0
  166. package/dist/whatsapp-chats.js +76 -0
  167. package/dist/whatsapp-chats.js.map +1 -0
  168. package/dist/whatsapp-login.d.ts +2 -0
  169. package/dist/whatsapp-login.d.ts.map +1 -0
  170. package/dist/whatsapp-login.js +90 -0
  171. package/dist/whatsapp-login.js.map +1 -0
  172. package/dist/wiki-sync.d.ts +21 -0
  173. package/dist/wiki-sync.d.ts.map +1 -0
  174. package/dist/wiki-sync.js +147 -0
  175. package/dist/wiki-sync.js.map +1 -0
  176. package/docs/AddNewAgentGuide.md +100 -0
  177. package/docs/AddNewMcpGuide.md +72 -0
  178. package/docs/Architecture.md +795 -0
  179. package/docs/CLAUDE-AI-SETUP.md +166 -0
  180. package/docs/Setup.md +297 -0
  181. package/docs/ai-gym-architecture.md +1040 -0
  182. package/docs/ai-gym-build-plan.md +343 -0
  183. package/docs/ai-gym-onboarding.md +122 -0
  184. package/docs/appcreator_plan.md +348 -0
  185. package/docs/platform-mcp-audit.md +320 -0
  186. package/docs/server-deployment-plan.md +503 -0
  187. package/docs/superpowers/plans/2026-03-25-marketplace.md +1281 -0
  188. package/docs/superpowers/specs/2026-03-25-marketplace-design.md +287 -0
  189. package/docs/user-guide.md +2016 -0
  190. package/mcp-catalog.json +628 -0
  191. package/package.json +63 -0
  192. package/public/MyAIforOne-logomark-512.svg +16 -0
  193. package/public/MyAIforOne-logomark-transparent.svg +15 -0
  194. package/public/activity.html +314 -0
  195. package/public/admin.html +1674 -0
  196. package/public/agent-dashboard.html +670 -0
  197. package/public/api-docs.html +1106 -0
  198. package/public/automations.html +722 -0
  199. package/public/canvas.css +223 -0
  200. package/public/canvas.js +588 -0
  201. package/public/changelog.html +231 -0
  202. package/public/gym.html +2766 -0
  203. package/public/home.html +1930 -0
  204. package/public/index.html +2809 -0
  205. package/public/lab.html +1643 -0
  206. package/public/library.html +1442 -0
  207. package/public/marketplace.html +1101 -0
  208. package/public/mcp-docs.html +441 -0
  209. package/public/mini.html +390 -0
  210. package/public/monitor.html +584 -0
  211. package/public/org.html +4304 -0
  212. package/public/projects.html +734 -0
  213. package/public/settings.html +645 -0
  214. package/public/tasks.html +932 -0
  215. package/public/trainers/alex.svg +12 -0
  216. package/public/trainers/jordan.svg +12 -0
  217. package/public/trainers/morgan.svg +12 -0
  218. package/public/trainers/riley.svg +12 -0
  219. package/public/trainers/sam.svg +12 -0
  220. package/public/user-guide.html +218 -0
  221. package/registry/agents.json +3 -0
  222. package/registry/apps.json +20 -0
  223. package/registry/installed-drafts.json +3 -0
  224. package/registry/mcps.json +1084 -0
  225. package/registry/prompts/personal/mcp-test-prompt.md +6 -0
  226. package/registry/prompts/personal/memory-recall.md +6 -0
  227. package/registry/prompts/platform/brainstorm.md +15 -0
  228. package/registry/prompts/platform/code-review.md +16 -0
  229. package/registry/prompts/platform/explain.md +16 -0
  230. package/registry/prompts.json +58 -0
  231. package/registry/skills/external/brainstorming.md +5 -0
  232. package/registry/skills/external/code-review.md +40 -0
  233. package/registry/skills/external/frontend-patterns.md +642 -0
  234. package/registry/skills/external/frontend-slides.md +184 -0
  235. package/registry/skills/external/systematic-debugging.md +5 -0
  236. package/registry/skills/external/tdd.md +328 -0
  237. package/registry/skills/external/verification-before-completion.md +5 -0
  238. package/registry/skills/external/writing-plans.md +5 -0
  239. package/registry/skills/platform/ai41_app_build.md +930 -0
  240. package/registry/skills/platform/ai41_app_deploy.md +168 -0
  241. package/registry/skills/platform/ai41_app_orchestrator.md +239 -0
  242. package/registry/skills/platform/ai41_app_patterns.md +359 -0
  243. package/registry/skills/platform/ai41_app_register.md +85 -0
  244. package/registry/skills/platform/ai41_app_scaffold.md +421 -0
  245. package/registry/skills/platform/ai41_app_verify.md +107 -0
  246. package/registry/skills/platform/opProjectCreate.md +239 -0
  247. package/registry/skills/platform/op_devbrowser.md +136 -0
  248. package/registry/skills/platform/sop_brandguidelines.md +103 -0
  249. package/registry/skills/platform/sop_docx.md +117 -0
  250. package/registry/skills/platform/sop_frontenddesign.md +44 -0
  251. package/registry/skills/platform/sop_frontenddesign_v2.md +659 -0
  252. package/registry/skills/platform/sop_mcpbuilder.md +133 -0
  253. package/registry/skills/platform/sop_pdf.md +172 -0
  254. package/registry/skills/platform/sop_pptx.md +133 -0
  255. package/registry/skills/platform/sop_skillcreator.md +104 -0
  256. package/registry/skills/platform/sop_themefactory.md +128 -0
  257. package/registry/skills/platform/sop_webapptesting.md +75 -0
  258. package/registry/skills/platform/sop_webartifactsbuilder.md +97 -0
  259. package/registry/skills/platform/sop_xlsx.md +134 -0
  260. package/registry/skills.json +1055 -0
  261. package/scripts/discover-chats.sh +11 -0
  262. package/scripts/install-service-windows.ps1 +87 -0
  263. package/scripts/install-service.sh +52 -0
  264. package/scripts/seed-registry.ts +195 -0
  265. package/scripts/test-send.sh +5 -0
  266. package/scripts/tray-indicator.ps1 +35 -0
  267. package/scripts/uninstall-service-windows.ps1 +23 -0
  268. package/scripts/uninstall-service.sh +15 -0
  269. package/scripts/xbar-myagent.5s.sh +32 -0
  270. package/server/mcp-server/dist/index.d.ts +11 -0
  271. package/server/mcp-server/dist/index.js +1332 -0
  272. package/server/mcp-server/dist/lib/api-client.d.ts +165 -0
  273. package/server/mcp-server/dist/lib/api-client.js +241 -0
  274. package/server/mcp-server/index.ts +1545 -0
  275. package/server/mcp-server/lib/api-client.ts +366 -0
  276. package/server/mcp-server/tsconfig.json +14 -0
  277. package/src/agent-registry.ts +180 -0
  278. package/src/channels/discord.ts +129 -0
  279. package/src/channels/imessage.ts +261 -0
  280. package/src/channels/slack.ts +208 -0
  281. package/src/channels/telegram.ts +307 -0
  282. package/src/channels/types.ts +62 -0
  283. package/src/channels/whatsapp.ts +227 -0
  284. package/src/config.ts +281 -0
  285. package/src/cron.ts +43 -0
  286. package/src/decrypt-keys.ts +60 -0
  287. package/src/encrypt-keys.ts +70 -0
  288. package/src/executor.ts +2190 -0
  289. package/src/gemini-executor.ts +212 -0
  290. package/src/goals.ts +240 -0
  291. package/src/gym/activity-digest.ts +546 -0
  292. package/src/gym/dimension-scorer.ts +297 -0
  293. package/src/gym/gym-router.ts +801 -0
  294. package/src/gym/index.ts +19 -0
  295. package/src/heartbeat.ts +220 -0
  296. package/src/index.ts +275 -0
  297. package/src/keystore.ts +190 -0
  298. package/src/logger.ts +51 -0
  299. package/src/memory/daily.ts +101 -0
  300. package/src/memory/embeddings.ts +185 -0
  301. package/src/memory/index.ts +218 -0
  302. package/src/memory/search.ts +124 -0
  303. package/src/memory/store.ts +189 -0
  304. package/src/ollama-executor.ts +126 -0
  305. package/src/openai-executor.ts +259 -0
  306. package/src/router.ts +230 -0
  307. package/src/test-message.ts +72 -0
  308. package/src/utils/imsg-db-reader.ts +109 -0
  309. package/src/utils/imsg-rpc.ts +178 -0
  310. package/src/utils/message-formatter.ts +90 -0
  311. package/src/web-ui.ts +5778 -0
  312. package/src/whatsapp-chats.ts +91 -0
  313. package/src/whatsapp-login.ts +110 -0
  314. package/src/wiki-sync.ts +199 -0
  315. package/tsconfig.json +19 -0
@@ -0,0 +1,343 @@
1
+ # AI Gym — Build Plan
2
+
3
+ > Explicit task checklist from MVP through P2. Each item is a discrete, completable unit of work.
4
+ > Phases are concentric circles — each is a shippable product. Never start a phase until the previous is working end-to-end.
5
+
6
+ **Status key:** `[ ]` not started · `[~]` in progress · `[x]` done
7
+
8
+ ---
9
+
10
+ ## Phase 0 — MCP Foundation
11
+ > Prerequisite for everything. The gym agent is MCP-first — these tools must exist before the agent can do anything useful.
12
+
13
+ ### New API Endpoints (`src/web-ui.ts` or new `src/gym/gym-router.ts`)
14
+
15
+ - [x] `GET /api/agents/:id/logs` — paginated conversation log for one agent (newest first, limit/offset params)
16
+ - [x] `GET /api/agents/:id/activity-summary` — aggregated summary: message count, active days, topics (array), tool use counts, last active timestamp
17
+ - [x] `GET /api/agents/logs/search?q=&agentIds=` — full-text search across agent logs
18
+ - [x] `GET /api/gym/plan` — return `agents/platform/gym/memory/plan.json`
19
+ - [x] `PUT /api/gym/plan` — write `agents/platform/gym/memory/plan.json`
20
+ - [x] `GET /api/gym/progress` — return `agents/platform/gym/memory/program-progress.json`
21
+ - [x] `PUT /api/gym/progress` — write `agents/platform/gym/memory/program-progress.json`
22
+ - [x] `GET /api/gym/cards` — return current gym cards array
23
+ - [x] `POST /api/gym/cards` — append a new gym card
24
+ - [x] `DELETE /api/gym/cards/:id` — dismiss a card
25
+ - [x] `POST /api/gym/dimensions/snapshot` — append weekly dimension scores to `dimension-history.json`
26
+ - [x] `GET /api/gym/programs` — list all programs (bundled + user-created)
27
+ - [x] `GET /api/gym/programs/:slug` — get full program with modules + steps
28
+ - [x] `POST /api/gym/programs` — create a new program
29
+ - [x] `PATCH /api/gym/programs/:id` — update program metadata
30
+ - [x] `DELETE /api/gym/programs/:id` — delete a program
31
+ - [x] `POST /api/gym/programs/import-markdown` — parse markdown into Program→Module→Step and save
32
+
33
+ ### New MCP Tools (`server/mcp-server/index.ts`)
34
+
35
+ - [x] `get_agent_logs` — wraps `GET /api/agents/:id/logs`
36
+ - [x] `get_agent_activity_summary` — wraps `GET /api/agents/:id/activity-summary`
37
+ - [x] `search_agent_logs` — wraps `GET /api/agents/logs/search`
38
+ - [x] `get_plan` — wraps `GET /api/gym/plan`
39
+ - [x] `update_plan` — wraps `PUT /api/gym/plan`
40
+ - [x] `get_gym_progress` — wraps `GET /api/gym/progress`
41
+ - [x] `update_gym_progress` — wraps `PUT /api/gym/progress`
42
+ - [x] `list_gym_cards` — wraps `GET /api/gym/cards`
43
+ - [x] `create_gym_card` — wraps `POST /api/gym/cards`
44
+ - [x] `dismiss_gym_card` — wraps `DELETE /api/gym/cards/:id`
45
+ - [x] `snapshot_dimensions` — wraps `POST /api/gym/dimensions/snapshot`
46
+ - [x] `list_gym_programs` — wraps `GET /api/gym/programs`
47
+ - [x] `get_gym_program` — wraps `GET /api/gym/programs/:slug`
48
+ - [x] `import_program` — wraps `POST /api/gym/programs/import-markdown`
49
+
50
+ ### Data Files (created on first `gymEnabled: true`)
51
+
52
+ - [x] `agents/platform/gym/memory/learner-profile.json` — initialized with empty schema on onboarding complete
53
+ - [x] `agents/platform/gym/memory/plan.json` — initialized after onboarding Step 3
54
+ - [x] `agents/platform/gym/memory/program-progress.json` — empty object `{}`
55
+ - [x] `agents/platform/gym/memory/gym-cards.json` — empty array `[]`
56
+ - [x] `agents/platform/gym/memory/dimension-history.json` — empty array `[]`
57
+
58
+ ---
59
+
60
+ ## MVP — The Core Loop
61
+ > Shippable product. Delivers: meet your trainer → get profiled → follow a program → coach watches and adapts.
62
+
63
+ ### 1. Gym Subfolder Setup
64
+
65
+ - [x] Create `src/gym/` directory
66
+ - [x] Create `src/gym/index.ts` — exports all gym registrations (agent, routes, MCP tools, cron)
67
+ - [x] Soul.md loading implemented in `src/executor.ts` (both regular and streaming paths) — reads `selectedTrainer` from learner-profile.json, prepends `souls/<name>.md`
68
+ - [x] Create `src/gym/gym-router.ts` — all `/api/gym/*` route handlers (imports Phase 0 endpoint logic)
69
+ - [x] MCP tool definitions live in `server/mcp-server/index.ts` (co-located with other platform MCP tools)
70
+ - [x] Create `src/gym/activity-digest.ts` — scheduled digest goal runner
71
+ - [x] Create `src/gym/dimension-scorer.ts` — dimension scoring logic
72
+ - [x] Markdown parser + import logic implemented inline in `gym-router.ts` (POST /api/gym/programs/import-markdown)
73
+ - [x] Onboarding state machine implemented in `public/gym.html` JavaScript (3-step flow with API calls)
74
+ - [x] Update `src/web-ui.ts` — import and mount `src/gym/index.ts` when `gymEnabled: true`; no inline gym logic
75
+ - [x] Update `server/mcp-server/index.ts` — all gym MCP tools registered
76
+
77
+ ### 2. Feature Flag
78
+
79
+ - [x] Add `gymEnabled: false` to `config.json` and `config.example.json`
80
+ - [x] Add `aibriefingEnabled: false` to `config.json` and `config.example.json` (Feed: AI Briefing off by default)
81
+ - [x] Gate gym agent registration behind `gymEnabled`
82
+ - [x] Gate `/gym` nav item behind `gymEnabled`
83
+ - [x] Gate activity digest cron job behind `gymEnabled`
84
+ - [x] Gate all `/api/gym/*` routes behind `gymEnabled`
85
+
86
+ ### 3. Gym Agent
87
+
88
+ - [x] Create `agents/platform/gym/agent.json` with all fields (`id: "gym"`, `class: "gym"`, `advancedMemory: true`, `wiki: true`, `persistentSession: true`, full `allowedTools`, `mcps: ["myaiforone"]`, `featureFlag: "gymEnabled"`)
89
+ - [x] Create `agents/platform/gym/CLAUDE.md` — core coaching logic:
90
+ - [x] Assessment methodology section (how to score dimensions from activity patterns)
91
+ - [x] Recommendation engine section (capability gap → program mapping)
92
+ - [x] Verification approach section (how to use MCP tools to check step completion)
93
+ - [x] Proactive insight patterns section
94
+ - [x] Plan management section (how to read/write plan.json via `get_plan` / `update_plan`)
95
+ - [x] MCP-first instruction: always reach for MCP tools before file tools
96
+ - [x] Create `agents/platform/gym/souls/alex.md` — Alex personality layer
97
+ - [x] Create `agents/platform/gym/souls/jordan.md` — Jordan personality layer
98
+ - [x] Create `agents/platform/gym/souls/morgan.md` — Morgan personality layer
99
+ - [x] Create `agents/platform/gym/souls/riley.md` — Riley personality layer
100
+ - [x] Create `agents/platform/gym/souls/sam.md` — Sam personality layer
101
+ - [x] Implement soul.md loading in `src/executor.ts`: read `selectedTrainer` from `learner-profile.json`, prepend `souls/<name>.md` before `CLAUDE.md` at spawn time
102
+
103
+ ### 4. Onboarding Flow
104
+
105
+ - [x] Design onboarding state: `{ step: 0|1|2|3, complete: boolean }` stored in `learner-profile.json`
106
+ - [x] **Step 1 — Choose Trainer**: UI card picker (5 trainer cards with avatar + name + intro quote)
107
+ - [x] Trainer card component (avatar, name, intro text)
108
+ - [x] Selection writes `selectedTrainer` to `learner-profile.json` via `PUT /api/gym/learner-profile`
109
+ - [x] Avatar placeholder SVGs at `public/trainers/alex.svg` (etc.)
110
+ - [x] **Step 2 — Get to Know You**: coach sends the one-question prompt once trainer is selected
111
+ - [x] Onboarding shows trainer's fullQuote message in step 2
112
+ - [x] User response sent to gym agent via `POST /api/chat/gym/stream`
113
+ - [x] Coach processes response and populates `identity` fields in learner profile
114
+ - [x] **Step 3 — Get Your Plan**: coach generates plan via SSE stream, writes via `update_plan`
115
+ - [x] Plan displayed with two-bucket structure (on-the-job + platform-driven)
116
+ - [x] Onboarding marked complete; gym main view unlocked
117
+ - [x] Gate gym main view behind `onboardingComplete: true` — incomplete users always land in onboarding
118
+
119
+ ### 5. Learner Profile
120
+
121
+ - [x] Add `GET /api/gym/learner-profile` endpoint
122
+ - [x] Add `PUT /api/gym/learner-profile` endpoint
123
+ - [x] Add `get_learner_profile` MCP tool
124
+ - [x] Add `update_learner_profile` MCP tool
125
+ - [x] Initialize `learner-profile.json` with full schema (identity, activity, features, patterns, programs, streak, dimensions, selectedTrainer) on first gym activation
126
+
127
+ ### 6. Getting Started Program
128
+
129
+ - [x] Create `agents/platform/gym/programs/getting-started/program.json` with metadata (title, slug, difficulty: beginner, tier: free, isPublic: true)
130
+ - [x] Module 1: Meet Your AI
131
+ - [x] Step 1: What is an agent? (knowledge verification — coach asks 2 comprehension questions)
132
+ - [x] Step 2: Your first conversation (platform-check — verify ≥5 messages sent to any agent)
133
+ - [x] Module 2: Give It Context
134
+ - [x] Step 1: What makes a good prompt? (knowledge verification)
135
+ - [x] Step 2: Try a detailed prompt (self-report — user marks done after attempting)
136
+ - [x] Step 3: Upload a file to your agent (platform-check — verify file upload used)
137
+ - [x] Module 3: Make It Yours
138
+ - [x] Step 1: Create a specialized agent (platform-check — verify new agent exists in `list_agents`)
139
+ - [x] Step 2: Write a system prompt for it (platform-check — coach reads the agent's CLAUDE.md via `get_agent` and evaluates length/quality)
140
+ - [x] Program pre-seeded in `agents/platform/gym/programs/getting-started/`
141
+
142
+ ### 7. Activity Digest
143
+
144
+ - [x] Implement `src/gym/activity-digest.ts`:
145
+ - [x] Scheduled cron: `0 6 * * *` (daily 6am), only runs if `gymEnabled: true`
146
+ - [x] Step 1: Scan agent directories — get full agent roster
147
+ - [x] Step 2: For each agent, call `GET /api/agents/:id/activity-summary` — get aggregated stats
148
+ - [x] Step 3: Read agent.json configs for craft/orchestration scoring
149
+ - [x] Step 4: Score dimensions based on observed patterns (use `dimension-scorer.ts`)
150
+ - [x] Step 5: Call `POST /api/gym/dimensions/snapshot` if ≥7 days since last snapshot
151
+ - [x] Step 6: Write digest to `agents/platform/gym/memory/daily/<date>.md`
152
+ - [x] Step 7: Call `PUT /api/gym/learner-profile` with updated `activity`, `features`, `patterns`, `dimensions`, `streak`
153
+ - [x] Step 8: Generate 2–3 gym cards; call `POST /api/gym/cards` for each
154
+ - [x] Implement `src/gym/dimension-scorer.ts`:
155
+ - [x] `scoreApplication(activitySummaries)` — frequency, breadth, session depth
156
+ - [x] `scoreCommunication(logSamples)` — tool diversity, topic breadth, depth signals
157
+ - [x] `scoreKnowledge(profile, programProgress)` — program completions, engagement breadth
158
+ - [x] `scoreOrchestration(agentList)` — goals, cron, MCPs, multi-agent patterns
159
+ - [x] `scoreCraft(agentList)` — agents created, system prompt quality, MCP configs, tool configs
160
+
161
+ ### 8. /gym Page — UI
162
+
163
+ - [x] Add `/gym` route to frontend, gated by `gymEnabled`
164
+ - [x] Add **Gym** item to main nav (gated)
165
+ - [x] **Onboarding view** — full-screen 3-step flow (shown when `onboardingComplete: false`)
166
+ - [x] **Main gym layout** — left sidebar + main panel + bottom feed strip
167
+ - [x] **Left sidebar**:
168
+ - [x] Program list with progress indicators (✓ complete, N/M in progress, ○ not started)
169
+ - [x] Gym cards section (2–3 cards, each with title + short description + CTA button)
170
+ - [x] "New card" badge when digest has generated something new
171
+ - [x] **Main panel — Coach tab**:
172
+ - [x] Chat interface with the gym agent (SSE streaming via `POST /api/chat/gym/stream`)
173
+ - [x] Trainer name + avatar shown in chat header
174
+ - [x] **Main panel — Progress tab**:
175
+ - [x] Radar/spider chart — 5 dimensions, current scores (SVG-based)
176
+ - [x] Dimension breakdown list — progress bar + score + label + trend arrow per dimension
177
+ - [x] "Next focus" callout — lowest-score dimension with guidance text
178
+ - [x] Milestones list — chronological achievements
179
+ - [x] *(History line chart deferred to P1 — needs snapshot history to be meaningful)*
180
+ - [x] **Bottom feed strip** — placeholder bar for P1 (shows "Feed coming in P1")
181
+ - [x] **Streak counter** — shown in gym header (days active streak from learner profile)
182
+
183
+ ### 9. Trainer Avatars
184
+
185
+ - [x] Create 5 placeholder avatar SVGs at `public/trainers/alex.svg`, `jordan.svg`, `morgan.svg`, `riley.svg`, `sam.svg`
186
+ - [x] Consistent visual style — gradient circles with initials
187
+ - [x] Color-coded per trainer (cyan, orange, purple, red, green)
188
+
189
+ ---
190
+
191
+ ## P1 — Depth
192
+ > Everything a user needs to keep growing after Getting Started. Coach gets smarter. Program library fills out. Feed activates.
193
+
194
+ ### 1. Remaining Bundled Programs
195
+
196
+ - [x] **Prompt Engineering** (intermediate)
197
+ - [x] Module 1: Context and specificity
198
+ - [x] Module 2: System prompts
199
+ - [x] Module 3: Iterating and debugging prompts
200
+ - [x] All steps with platform-check or knowledge verification
201
+ - [x] **Agent Building** (intermediate)
202
+ - [x] Module 1: Anatomy of an agent
203
+ - [x] Module 2: Create your first specialized agent
204
+ - [x] Module 3: Writing an effective system prompt
205
+ - [x] Module 4: Tools and workspace setup
206
+ - [x] **Automations Mastery** (intermediate)
207
+ - [x] Module 1: Goals and scheduled tasks (cron)
208
+ - [x] Module 2: Agent-to-agent delegation
209
+ - [x] Module 3: Building a workflow that runs while you sleep
210
+ - [x] **MCP Integrations** (advanced)
211
+ - [x] Module 1: What MCPs enable
212
+ - [x] Module 2: Connecting your first MCP
213
+ - [x] Module 3: Building an agent workflow with external APIs
214
+ - [x] **Multi-Model Strategy** (advanced)
215
+ - [x] Module 1: Model landscape (Claude, GPT, Gemini, Groq, local)
216
+ - [x] Module 2: When to use which model
217
+ - [x] Module 3: Switching and comparing models on the platform
218
+
219
+ ### 2. AI Program Generator
220
+
221
+ - [x] Port `AIGenerator.jsx` conversation flow to local gym (or build equivalent in gym chat)
222
+ - [x] Coach enters "program generation mode" when user says "create a program" or similar
223
+ - [x] Structured conversation: scope → skill level → time budget → generate
224
+ - [x] Coach outputs markdown in H1/H2/H3 format: `# Program`, `## Module N: Title`, `### Step N: Title`
225
+ - [x] Preview step: coach shows parsed structure (program title, module list, step count)
226
+ - [x] User confirms → coach calls `import_program` MCP tool → program added to gym
227
+ - [x] Program appears in sidebar program list immediately
228
+
229
+ ### 3. All Verification Types Wired
230
+
231
+ - [x] `knowledge` verification: coach asks 2–3 targeted comprehension questions after step content, evaluates answers, decides pass/fail, marks step complete via `update_gym_progress`
232
+ - [x] `platform-check` verification: coach calls appropriate MCP tool per step's `check` field, evaluates result, marks step complete
233
+ - [x] `new-agent-exists`: `list_agents` before/after
234
+ - [x] `agent-has-custom-prompt`: `get_agent` → read CLAUDE.md path → evaluate length + content
235
+ - [x] `automation-exists`: `list_agents` → check goals/cron arrays
236
+ - [x] `mcp-configured`: `list_agents` → check mcps array
237
+ - [x] `feature-used`: `get_agent_activity_summary` → check features.used array
238
+
239
+ ### 4. Continuous Coaching
240
+
241
+ - [x] **Struggle detection** in `activity-digest.ts`:
242
+ - [x] Detect sessions ending with "never mind", "I'll do it manually", "forget it" patterns
243
+ - [x] Detect high correction rate (>4 back-and-forth before resolution)
244
+ - [x] Write detected struggles to `patterns.struggles` in learner profile
245
+ - [x] Generate gym card with specific suggestion when struggle detected
246
+ - [x] **Capability gap analysis** in `activity-digest.ts`:
247
+ - [x] Compare `features.used` vs full platform feature list
248
+ - [x] Identify highest-value unused capability based on current usage patterns
249
+ - [x] Generate gym card for top gap (max 1 per digest to avoid noise)
250
+
251
+ ### 5. Progress History Chart
252
+
253
+ - [x] Confirm `dimension-history.json` accumulates weekly snapshots
254
+ - [x] Add line chart component to Progress tab (renders dimension scores over time, one line per dimension, color-coded)
255
+ - [x] Show empty state: "Your progress chart will fill in as weeks go by"
256
+
257
+ ### 6. The Feed
258
+
259
+ - [x] **Platform Updates**: read changelog / version notes → surface "new capability" cards to users likely to care (filter by relevant `features.neverUsed`)
260
+ - [x] `GET /api/changelog` endpoint that returns recent platform updates
261
+ - [x] Match updates to learner profile: only show if the capability is in `features.neverUsed`
262
+ - [x] **Tips**: contextual nudges generated by activity digest — idle agents, usage plateaus, etc.
263
+ - [x] Tips generated in `activity-digest.ts` alongside gym cards but tagged `type: "tip"` for Feed
264
+ - [x] Rendered in the bottom Feed strip
265
+ - [x] **AI Briefing** (requires `aibriefingEnabled: true` in config + web search MCP configured):
266
+ - [x] Briefing data read from `agents/platform/gym/memory/briefing.json`
267
+ - [x] Rendered in Feed strip under "AI Briefing" tab
268
+ - [x] Clear "off by default" messaging in UI
269
+ - [x] Feed UI strip — bottom panel with 3 tabs: **Tips** · **Platform Updates** · **Briefing**
270
+ - [x] `GET /api/gym/feed` aggregator endpoint
271
+
272
+ ### 7. Gym-Only Mode
273
+
274
+ - [x] Add `gymOnlyMode` to ServiceConfig interface in `config.ts`
275
+ - [x] When `gymOnlyMode: true`: set landing page to `/gym` instead of `/home`
276
+ - [x] When `gymOnlyMode: true`: nav shows only **Gym** · **Agents** · **Settings**
277
+ - [x] Other pages remain accessible via direct URL
278
+ - [x] `GET /api/gym/config` returns gymOnlyMode flag for frontend
279
+
280
+ ---
281
+
282
+ ## P2 — Reach
283
+ > Programs leave the gym and travel. Other people can install programs. Gym becomes a network effect.
284
+
285
+ ### 1. Marketplace — Programs
286
+
287
+ - [ ] Add `isMarketplaceListed: boolean` and `isPublic: boolean` to program schema
288
+ - [ ] `GET /api/marketplace/programs` — list all public marketplace programs (across all users, SaaS; from a directory on local)
289
+ - [ ] Marketplace browse page (`/marketplace/programs`):
290
+ - [ ] Grid of program cards: title, description, author, dimension tags, difficulty, step count
291
+ - [ ] Filter by: dimension, difficulty, topic, trainer compatibility, tier
292
+ - [ ] Search
293
+ - [ ] Program install flow:
294
+ - [ ] "Install" button on program card
295
+ - [ ] Copies program into user's gym via `POST /api/gym/programs` (deep copy, not a reference)
296
+ - [ ] Installed program appears in sidebar program list
297
+ - [ ] Author attribution: `createdBy: { name, orgName }` on program cards
298
+ - [ ] "Publish to marketplace" option in program settings (sets `isMarketplaceListed: true`)
299
+
300
+ ### 2. Trainer Variations in Programs
301
+
302
+ - [ ] Support `trainerVariations: { [trainerId]: string }` field on steps
303
+ - [ ] When rendering a step, check if `trainerVariations[selectedTrainer]` exists — use it if so, fall back to base `content`
304
+ - [ ] Program editor / AI generator can optionally generate trainer-specific variants
305
+ - [ ] Marketplace programs that include trainer variations show a "Trainer-optimized" badge
306
+
307
+ ### 3. Channel Notifications
308
+
309
+ - [ ] Opt-in setting per user: `gymNotifications: { enabled: false, channel: "slack"|"telegram"|"discord"|null }`
310
+ - [ ] When enabled, activity digest can send a brief summary to the configured channel after running
311
+ - [ ] "Here's your weekly gym update: Your Application score went up. You have a new challenge from Riley."
312
+ - [ ] Coach can send a nudge if user hasn't been active for 3+ days (once, not repeatedly)
313
+ - [ ] Notification channel set in gym settings UI
314
+
315
+ ### 4. Gamification
316
+
317
+ - [ ] **Badges**: defined set of achievement badges
318
+ - [ ] "First Steps" — complete Getting Started program
319
+ - [ ] "Prompt Pro" — reach Communication score 4+
320
+ - [ ] "Builder" — create 3+ specialized agents
321
+ - [ ] "Automator" — set up first automation
322
+ - [ ] "Streak: 7 Days", "Streak: 30 Days"
323
+ - [ ] "Program Creator" — author + publish a program to marketplace
324
+ - [ ] Badge awarded by digest when condition first detected → stored in `learner-profile.json`
325
+ - [ ] Badges displayed on Progress tab below milestones
326
+ - [ ] Badge unlock shown as a gym card ("You earned: Builder 🏗️")
327
+
328
+ ### 5. Program Export / Share
329
+
330
+ - [ ] `GET /api/gym/programs/:id/export` — returns program as formatted markdown (H1/H2/H3)
331
+ - [ ] "Export" button in program detail view
332
+ - [ ] "Share link" — generates a deep link to install the program (local: imports from exported markdown; SaaS: link to marketplace listing)
333
+
334
+ ---
335
+
336
+ ## Notes
337
+
338
+ - **Order within phases matters.** In MVP: Phase 0 MCP foundation first, then gym agent + souls, then onboarding, then the page. Don't build UI before the agent exists.
339
+ - **Programs are seeded on first `gymEnabled: true`.** Getting Started imports automatically. Subsequent bundled programs import in P1.
340
+ - **The Feed strip** can be a stub (empty) in MVP with a placeholder — real content in P1.
341
+ - **Avatar images** are blocked on having art. Use placeholders (initials on colored backgrounds) for MVP; replace with final illustrated avatars when ready.
342
+ - **`aibriefingEnabled`** is off by default and stays off until user explicitly opts in. Never run a web search without the flag.
343
+ - **SaaS porting note:** After MVP commit, flag for @ma41saas — the gym is a significant feature that will need adaptation (Prisma tables for programs/progress/cards, multi-user learner profiles, auth-gated gym routes).
@@ -0,0 +1,122 @@
1
+ # AI Gym — Onboarding Design Document
2
+
3
+ > Brainstorming / planning doc. See `ai-gym-architecture.md` for the full system design.
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ The AI Gym is a separate, toggleable module on the MyAI for One platform. When enabled, it gets its own dedicated tab in the app. The gym agent is a **distinct agent class** — not a personal agent, not a platform agent — but built on the same underlying infrastructure with the same capabilities (sessions, memory, MCP tools, etc.).
10
+
11
+ Onboarding is the entry point. It's a three-step flow:
12
+ 1. Choose your trainer
13
+ 2. Tell us about you
14
+ 3. Get your plan
15
+
16
+ ---
17
+
18
+ ## Step 1 — Choose Your Trainer
19
+
20
+ The user picks one of **5 trainers**. Presented as cards: avatar, name, and a short first-person intro. The goal is for it to feel like meeting a real person — not configuring a feature.
21
+
22
+ Tone and pacing are baked into each profile. No separate dropdowns.
23
+
24
+ | Trainer | Style | Pace |
25
+ |---------|-------|------|
26
+ | **Alex** | Collaborative, celebratory | Steady |
27
+ | **Jordan** | Direct, accountable | Steady |
28
+ | **Morgan** | Thoughtful, frameworks-first | Steady |
29
+ | **Riley** | Challenging, hard questions | Immersive |
30
+ | **Sam** | Patient, no pressure | Steady |
31
+
32
+ **The intro each trainer shows on their card:**
33
+
34
+ > **Alex** — "Hey, I'm Alex. I work right alongside you — we figure things out together. I'm not here to lecture you; I'm here to build with you. Expect consistent progress every session and a lot of high-fives along the way."
35
+
36
+ > **Jordan** — "I'm Jordan. I'm direct, I don't sugarcoat, and I'll hold you accountable. We set a goal, we hit it. I'll tell you exactly what to work on and call you out when you're avoiding the hard stuff."
37
+
38
+ > **Morgan** — "I'm Morgan. I care a lot about the 'why.' I won't just show you what to click — I'll make sure you understand what's actually happening. We'll take things one layer at a time, and you'll leave with real understanding, not just checked boxes."
39
+
40
+ > **Riley** — "I'm Riley. I'm going to push you — hard questions, uncomfortable exercises, things you'll want to skip. That's exactly where we're going. When you're with me, we go deep and fast."
41
+
42
+ > **Sam** — "I'm Sam. I meet you exactly where you are — no pressure, no judgment. We go at your pace. One thing at a time, building from what you already know. Nothing overwhelming, ever."
43
+
44
+ Each card has an avatar image (`public/trainers/<name>.png`, illustrated style). Users can switch trainers at any time; history, plan, and progress persist.
45
+
46
+ ### Implementation Note
47
+ Each trainer profile is a `soul.md` file — the system prompt personality layer for the gym agent. Switching trainers = swapping which `soul.md` is active. Users can switch profiles at any time; their history, plan, and progress persist unchanged.
48
+
49
+ ---
50
+
51
+ ## Step 2 — Get to Know You
52
+
53
+ Once the trainer profile is selected and adopted by the gym agent, the agent opens a **single conversational message** — not a questionnaire. The agent sends one prompt that covers three topics and gives the user suggested angles to respond to. The user replies however they want, in whatever order, in one go.
54
+
55
+ ### The Three Topics
56
+
57
+ **1. About You (professional)**
58
+ Gathered passively where possible — user shares LinkedIn, Twitter, or any links. Agent reads and builds a profile. User can review and edit. Goal: understand their professional context and background. Nothing too personal.
59
+
60
+ **2. Your AI Use**
61
+ Where are you today? Heavy user with real workflows? Curious beginner? Somewhere in between? Give an example. The user tells this in their own words — the agent doesn't quiz them with options.
62
+
63
+ **3. Your Goals**
64
+ What do you want out of AI? More productive at work? Build something? Just not feel left behind? Open-ended.
65
+
66
+ ### The One-Question Format
67
+ > "Before we get started, tell me a bit about yourself — I'll use this to make everything we do together actually useful to you. You can share things like: your LinkedIn or any links (I'll read them), what you do for work, where you are with AI right now (total beginner, dabbler, daily user — give me an example), and what you're hoping to get out of this. One message, however you want to write it."
68
+
69
+ The agent processes the response, builds the user profile, and confirms back with a brief summary before moving to the plan.
70
+
71
+ ---
72
+
73
+ ## Step 3 — The Plan
74
+
75
+ The plan is a **real, visible, living document** — not a background concept. It has its own section in the gym UI. Users can see it, the gym agent can update it, and the user can edit it too. It tracks what's been done, what's mastered, and surfaces wins over time.
76
+
77
+ The plan always has two buckets:
78
+
79
+ ### Bucket 1 — On the Job Training (User-Driven)
80
+ The user brings their real work to the platform. The gym agent observes, assists, suggests, and tracks skill development as a byproduct of actual usage. Learning by doing. Value is delivered immediately — they're not studying AI, they're using AI to get things done, and the gym is tracking the growth in the background.
81
+
82
+ ### Bucket 2 — Platform-Driven
83
+ Two sub-buckets:
84
+
85
+ **Textbook**
86
+ Curated modules: read this article, watch this video, learn this concept. Structured, sequenced content for foundational knowledge.
87
+
88
+ **Dynamic**
89
+ Personalized suggestions based on observed platform activity. If the user did something with Excel through the platform, and the gym agent knows a Claude + Excel technique they haven't seen, it surfaces it as a training moment. Reactive, contextual, continuously generated.
90
+
91
+ ### Plan Properties
92
+ - Created at end of onboarding, based on the user profile built in Step 2
93
+ - Updated continuously by the gym agent as usage patterns emerge
94
+ - User can add goals, mark things done, or reorder priorities
95
+ - Tracks: mastered skills, in-progress learning, suggested next steps, wins/milestones
96
+ - Will have dedicated APIs and MCP tools for read/write access
97
+ - The bucket structure (on-the-job vs. platform-driven / textbook vs. dynamic) is preserved as the organizing frame — always visible in the UI
98
+
99
+ ---
100
+
101
+ ## Gym Agent — Notes
102
+
103
+ - Distinct agent class, separate from personal agents and platform agents
104
+ - Has all standard platform capabilities (sessions, memory, MCP, goals, crons, etc.)
105
+ - Personality layer = `soul.md` (swappable per trainer profile)
106
+ - One gym agent per user (or per install in local mode)
107
+ - Owns the user's learner profile, plan, and training history
108
+ - Connects to platform activity data (with permission) to power the dynamic bucket
109
+
110
+ ---
111
+
112
+ ## Open Questions
113
+
114
+ - How many trainer profiles at launch? 5 feels right — enough variety, not overwhelming
115
+ - Does the gym agent have a fixed `agentId` (e.g. `gym`) or is it user-created on first launch?
116
+ - Where does the learner profile live — agent memory (`context.md`) or a dedicated `learner-profile.json`?
117
+ - Plan UI: separate `/gym/plan` sub-page or a panel within the `/gym` tab?
118
+ - Dynamic bucket: pull-based (agent checks activity periodically) or event-driven (hooks on agent activity)?
119
+
120
+ ---
121
+
122
+ *Last updated: 2026-04-09 — brainstorming phase*