@jcheesepkg/nanobot 0.9.0 → 0.9.2

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 (245) hide show
  1. package/README.md +18 -18
  2. package/dist/agent/context.d.mts +4 -4
  3. package/dist/agent/context.d.mts.map +1 -1
  4. package/dist/agent/context.mjs +27 -28
  5. package/dist/agent/context.mjs.map +1 -1
  6. package/dist/agent/loop.d.mts +5 -3
  7. package/dist/agent/loop.d.mts.map +1 -1
  8. package/dist/agent/loop.mjs +64 -55
  9. package/dist/agent/loop.mjs.map +1 -1
  10. package/dist/agent/memory.d.mts.map +1 -1
  11. package/dist/agent/memory.mjs +3 -3
  12. package/dist/agent/memory.mjs.map +1 -1
  13. package/dist/agent/skills.d.mts.map +1 -1
  14. package/dist/agent/skills.mjs +4 -4
  15. package/dist/agent/skills.mjs.map +1 -1
  16. package/dist/agent/subagent.d.mts.map +1 -1
  17. package/dist/agent/subagent.mjs +22 -22
  18. package/dist/agent/subagent.mjs.map +1 -1
  19. package/dist/agent/tools/base.mjs +2 -2
  20. package/dist/agent/tools/base.mjs.map +1 -1
  21. package/dist/agent/tools/cron.d.mts +1 -1
  22. package/dist/agent/tools/cron.d.mts.map +1 -1
  23. package/dist/agent/tools/cron.mjs +11 -11
  24. package/dist/agent/tools/cron.mjs.map +1 -1
  25. package/dist/agent/tools/filesystem.d.mts +4 -4
  26. package/dist/agent/tools/filesystem.d.mts.map +1 -1
  27. package/dist/agent/tools/filesystem.mjs +20 -20
  28. package/dist/agent/tools/filesystem.mjs.map +1 -1
  29. package/dist/agent/tools/flex.d.mts +1 -1
  30. package/dist/agent/tools/flex.d.mts.map +1 -1
  31. package/dist/agent/tools/flex.mjs +112 -112
  32. package/dist/agent/tools/flex.mjs.map +1 -1
  33. package/dist/agent/tools/flex.test.mjs +60 -59
  34. package/dist/agent/tools/flex.test.mjs.map +1 -1
  35. package/dist/agent/tools/message.d.mts +1 -1
  36. package/dist/agent/tools/message.d.mts.map +1 -1
  37. package/dist/agent/tools/message.mjs +4 -4
  38. package/dist/agent/tools/message.mjs.map +1 -1
  39. package/dist/agent/tools/registry.d.mts.map +1 -1
  40. package/dist/agent/tools/registry.mjs +4 -4
  41. package/dist/agent/tools/registry.mjs.map +1 -1
  42. package/dist/agent/tools/shell.d.mts +1 -1
  43. package/dist/agent/tools/shell.mjs +4 -4
  44. package/dist/agent/tools/shell.mjs.map +1 -1
  45. package/dist/agent/tools/spawn.d.mts +1 -1
  46. package/dist/agent/tools/spawn.d.mts.map +1 -1
  47. package/dist/agent/tools/spawn.mjs +4 -4
  48. package/dist/agent/tools/spawn.mjs.map +1 -1
  49. package/dist/agent/tools/web.d.mts +2 -2
  50. package/dist/agent/tools/web.d.mts.map +1 -1
  51. package/dist/agent/tools/web.mjs +36 -36
  52. package/dist/agent/tools/web.mjs.map +1 -1
  53. package/dist/bus/events.mjs +1 -1
  54. package/dist/bus/events.mjs.map +1 -1
  55. package/dist/bus/queue.d.mts.map +1 -1
  56. package/dist/bus/queue.mjs.map +1 -1
  57. package/dist/channels/base.d.mts.map +1 -1
  58. package/dist/channels/base.mjs +2 -2
  59. package/dist/channels/base.mjs.map +1 -1
  60. package/dist/channels/line.d.mts +1 -0
  61. package/dist/channels/line.d.mts.map +1 -1
  62. package/dist/channels/line.mjs +65 -65
  63. package/dist/channels/line.mjs.map +1 -1
  64. package/dist/channels/line.test.mjs +26 -27
  65. package/dist/channels/line.test.mjs.map +1 -1
  66. package/dist/channels/manager.d.mts.map +1 -1
  67. package/dist/channels/manager.mjs +9 -9
  68. package/dist/channels/manager.mjs.map +1 -1
  69. package/dist/channels/telegram.mjs +34 -34
  70. package/dist/channels/telegram.mjs.map +1 -1
  71. package/dist/cli/index.mjs +36 -36
  72. package/dist/cli/index.mjs.map +1 -1
  73. package/dist/config/loader.d.mts.map +1 -1
  74. package/dist/config/loader.mjs +1 -1
  75. package/dist/config/loader.mjs.map +1 -1
  76. package/dist/config/schema.d.mts +381 -381
  77. package/dist/config/schema.d.mts.map +1 -1
  78. package/dist/config/schema.mjs +42 -42
  79. package/dist/config/schema.mjs.map +1 -1
  80. package/dist/gateway/server.d.mts.map +1 -1
  81. package/dist/gateway/server.mjs +48 -54
  82. package/dist/gateway/server.mjs.map +1 -1
  83. package/dist/heartbeat/service.d.mts.map +1 -1
  84. package/dist/heartbeat/service.mjs +8 -8
  85. package/dist/heartbeat/service.mjs.map +1 -1
  86. package/dist/index.d.mts +1 -1
  87. package/dist/index.d.mts.map +1 -1
  88. package/dist/index.mjs +2 -2
  89. package/dist/index.mjs.map +1 -1
  90. package/dist/node_modules/{@jridgewell → .bun/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell}/sourcemap-codec/dist/sourcemap-codec.mjs +1 -1
  91. package/dist/node_modules/.bun/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +1 -0
  92. package/dist/node_modules/{@vitest → .bun/@vitest_expect@2.1.9/node_modules/@vitest}/expect/dist/index.mjs +8 -8
  93. package/dist/node_modules/.bun/@vitest_expect@2.1.9/node_modules/@vitest/expect/dist/index.mjs.map +1 -0
  94. package/dist/node_modules/{@vitest → .bun/@vitest_pretty-format@2.1.9/node_modules/@vitest}/pretty-format/dist/index.mjs +2 -2
  95. package/dist/node_modules/.bun/@vitest_pretty-format@2.1.9/node_modules/@vitest/pretty-format/dist/index.mjs.map +1 -0
  96. package/dist/node_modules/{@vitest → .bun/@vitest_runner@2.1.9/node_modules/@vitest}/runner/dist/chunk-tasks.mjs +1 -1
  97. package/dist/node_modules/.bun/@vitest_runner@2.1.9/node_modules/@vitest/runner/dist/chunk-tasks.mjs.map +1 -0
  98. package/dist/node_modules/{@vitest → .bun/@vitest_runner@2.1.9/node_modules/@vitest}/runner/dist/index.mjs +6 -6
  99. package/dist/node_modules/.bun/@vitest_runner@2.1.9/node_modules/@vitest/runner/dist/index.mjs.map +1 -0
  100. package/dist/node_modules/{@vitest → .bun/@vitest_snapshot@2.1.9/node_modules/@vitest}/snapshot/dist/index.mjs +5 -5
  101. package/dist/node_modules/.bun/@vitest_snapshot@2.1.9/node_modules/@vitest/snapshot/dist/index.mjs.map +1 -0
  102. package/dist/node_modules/{@vitest → .bun/@vitest_spy@2.1.9/node_modules/@vitest}/spy/dist/index.mjs +2 -2
  103. package/dist/node_modules/.bun/@vitest_spy@2.1.9/node_modules/@vitest/spy/dist/index.mjs.map +1 -0
  104. package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/chunk-_commonjsHelpers.mjs +3 -3
  105. package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/chunk-_commonjsHelpers.mjs.map +1 -0
  106. package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/diff.mjs +4 -4
  107. package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/diff.mjs.map +1 -0
  108. package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/error.mjs +3 -3
  109. package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/error.mjs.map +1 -0
  110. package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/helpers.mjs +1 -1
  111. package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/helpers.mjs.map +1 -0
  112. package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/index.mjs +3 -3
  113. package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/index.mjs.map +1 -0
  114. package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/source-map.mjs +1 -1
  115. package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/source-map.mjs.map +1 -0
  116. package/dist/node_modules/{chai → .bun/chai@5.3.3/node_modules/chai}/index.mjs +1 -1
  117. package/dist/node_modules/.bun/chai@5.3.3/node_modules/chai/index.mjs.map +1 -0
  118. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/arguments.mjs +1 -1
  119. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/arguments.mjs.map +1 -0
  120. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/array.mjs +1 -1
  121. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/array.mjs.map +1 -0
  122. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/bigint.mjs +1 -1
  123. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/bigint.mjs.map +1 -0
  124. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/class.mjs +1 -1
  125. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/class.mjs.map +1 -0
  126. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/date.mjs +1 -1
  127. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/date.mjs.map +1 -0
  128. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/error.mjs +1 -1
  129. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/error.mjs.map +1 -0
  130. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/function.mjs +1 -1
  131. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/function.mjs.map +1 -0
  132. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/helpers.mjs +1 -1
  133. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/helpers.mjs.map +1 -0
  134. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/html.mjs +1 -1
  135. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/html.mjs.map +1 -0
  136. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/index.mjs +1 -1
  137. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/index.mjs.map +1 -0
  138. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/map.mjs +1 -1
  139. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/map.mjs.map +1 -0
  140. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/number.mjs +1 -1
  141. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/number.mjs.map +1 -0
  142. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/object.mjs +1 -1
  143. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/object.mjs.map +1 -0
  144. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/promise.mjs +6 -0
  145. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/promise.mjs.map +1 -0
  146. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/regexp.mjs +1 -1
  147. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/regexp.mjs.map +1 -0
  148. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/set.mjs +1 -1
  149. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/set.mjs.map +1 -0
  150. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/string.mjs +1 -1
  151. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/string.mjs.map +1 -0
  152. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/symbol.mjs +1 -1
  153. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/symbol.mjs.map +1 -0
  154. package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/typedarray.mjs +1 -1
  155. package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/typedarray.mjs.map +1 -0
  156. package/dist/node_modules/{magic-string → .bun/magic-string@0.30.21/node_modules/magic-string}/dist/magic-string.es.mjs +2 -2
  157. package/dist/node_modules/.bun/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.mjs.map +1 -0
  158. package/dist/node_modules/{@vitest/snapshot → .bun/pathe@1.1.2}/node_modules/pathe/dist/shared/pathe.ff20891b.mjs +1 -1
  159. package/dist/node_modules/.bun/pathe@1.1.2/node_modules/pathe/dist/shared/pathe.ff20891b.mjs.map +1 -0
  160. package/dist/node_modules/{tinyrainbow → .bun/tinyrainbow@1.2.0/node_modules/tinyrainbow}/dist/chunk-BVHSVHOK.mjs +1 -1
  161. package/dist/node_modules/.bun/tinyrainbow@1.2.0/node_modules/tinyrainbow/dist/chunk-BVHSVHOK.mjs.map +1 -0
  162. package/dist/node_modules/{tinyrainbow → .bun/tinyrainbow@1.2.0/node_modules/tinyrainbow}/dist/node.mjs +1 -1
  163. package/dist/node_modules/.bun/tinyrainbow@1.2.0/node_modules/tinyrainbow/dist/node.mjs.map +1 -0
  164. package/dist/node_modules/{tinyspy → .bun/tinyspy@3.0.2/node_modules/tinyspy}/dist/index.mjs +1 -1
  165. package/dist/node_modules/.bun/tinyspy@3.0.2/node_modules/tinyspy/dist/index.mjs.map +1 -0
  166. package/dist/node_modules/{vitest → .bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest}/dist/chunks/_commonjsHelpers.BFTU3MAI.mjs +1 -1
  167. package/dist/node_modules/.bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.mjs.map +1 -0
  168. package/dist/node_modules/{vitest → .bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest}/dist/chunks/date.W2xKR2qe.mjs +1 -1
  169. package/dist/node_modules/.bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest/dist/chunks/date.W2xKR2qe.mjs.map +1 -0
  170. package/dist/node_modules/{vitest → .bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest}/dist/chunks/utils.C8RiOc4B.mjs +2 -2
  171. package/dist/node_modules/.bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest/dist/chunks/utils.C8RiOc4B.mjs.map +1 -0
  172. package/dist/node_modules/{vitest → .bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest}/dist/chunks/vi.DgezovHB.mjs +11 -11
  173. package/dist/node_modules/.bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest/dist/chunks/vi.DgezovHB.mjs.map +1 -0
  174. package/dist/providers/base.d.mts +2 -2
  175. package/dist/providers/base.d.mts.map +1 -1
  176. package/dist/providers/openai-provider.d.mts.map +1 -1
  177. package/dist/providers/openai-provider.mjs +10 -9
  178. package/dist/providers/openai-provider.mjs.map +1 -1
  179. package/dist/providers/registry.d.mts +1 -1
  180. package/dist/providers/registry.d.mts.map +1 -1
  181. package/dist/providers/registry.mjs +99 -99
  182. package/dist/providers/registry.mjs.map +1 -1
  183. package/dist/session/manager.d.mts +2 -2
  184. package/dist/session/manager.d.mts.map +1 -1
  185. package/dist/session/manager.mjs +18 -19
  186. package/dist/session/manager.mjs.map +1 -1
  187. package/dist/utils/helpers.d.mts.map +1 -1
  188. package/dist/utils/helpers.mjs.map +1 -1
  189. package/package.json +11 -11
  190. package/skills/cron/SKILL.md +12 -8
  191. package/skills/daily-summary/SKILL.md +5 -1
  192. package/skills/english/SKILL.md +72 -14
  193. package/skills/expense/SKILL.md +15 -11
  194. package/skills/fortune/SKILL.md +25 -21
  195. package/skills/habit/SKILL.md +7 -6
  196. package/skills/hydration/SKILL.md +8 -5
  197. package/skills/memory/SKILL.md +1 -0
  198. package/skills/mood/SKILL.md +13 -9
  199. package/skills/skill-creator/SKILL.md +22 -0
  200. package/skills/summarize/SKILL.md +1 -0
  201. package/skills/weather/SKILL.md +11 -9
  202. package/dist/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +0 -1
  203. package/dist/node_modules/@vitest/expect/dist/index.mjs.map +0 -1
  204. package/dist/node_modules/@vitest/pretty-format/dist/index.mjs.map +0 -1
  205. package/dist/node_modules/@vitest/runner/dist/chunk-tasks.mjs.map +0 -1
  206. package/dist/node_modules/@vitest/runner/dist/index.mjs.map +0 -1
  207. package/dist/node_modules/@vitest/snapshot/dist/index.mjs.map +0 -1
  208. package/dist/node_modules/@vitest/snapshot/node_modules/pathe/dist/shared/pathe.ff20891b.mjs.map +0 -1
  209. package/dist/node_modules/@vitest/spy/dist/index.mjs.map +0 -1
  210. package/dist/node_modules/@vitest/utils/dist/chunk-_commonjsHelpers.mjs.map +0 -1
  211. package/dist/node_modules/@vitest/utils/dist/diff.mjs.map +0 -1
  212. package/dist/node_modules/@vitest/utils/dist/error.mjs.map +0 -1
  213. package/dist/node_modules/@vitest/utils/dist/helpers.mjs.map +0 -1
  214. package/dist/node_modules/@vitest/utils/dist/index.mjs.map +0 -1
  215. package/dist/node_modules/@vitest/utils/dist/source-map.mjs.map +0 -1
  216. package/dist/node_modules/chai/index.mjs.map +0 -1
  217. package/dist/node_modules/loupe/lib/arguments.mjs.map +0 -1
  218. package/dist/node_modules/loupe/lib/array.mjs.map +0 -1
  219. package/dist/node_modules/loupe/lib/bigint.mjs.map +0 -1
  220. package/dist/node_modules/loupe/lib/class.mjs.map +0 -1
  221. package/dist/node_modules/loupe/lib/date.mjs.map +0 -1
  222. package/dist/node_modules/loupe/lib/error.mjs.map +0 -1
  223. package/dist/node_modules/loupe/lib/function.mjs.map +0 -1
  224. package/dist/node_modules/loupe/lib/helpers.mjs.map +0 -1
  225. package/dist/node_modules/loupe/lib/html.mjs.map +0 -1
  226. package/dist/node_modules/loupe/lib/index.mjs.map +0 -1
  227. package/dist/node_modules/loupe/lib/map.mjs.map +0 -1
  228. package/dist/node_modules/loupe/lib/number.mjs.map +0 -1
  229. package/dist/node_modules/loupe/lib/object.mjs.map +0 -1
  230. package/dist/node_modules/loupe/lib/promise.mjs +0 -6
  231. package/dist/node_modules/loupe/lib/promise.mjs.map +0 -1
  232. package/dist/node_modules/loupe/lib/regexp.mjs.map +0 -1
  233. package/dist/node_modules/loupe/lib/set.mjs.map +0 -1
  234. package/dist/node_modules/loupe/lib/string.mjs.map +0 -1
  235. package/dist/node_modules/loupe/lib/symbol.mjs.map +0 -1
  236. package/dist/node_modules/loupe/lib/typedarray.mjs.map +0 -1
  237. package/dist/node_modules/magic-string/dist/magic-string.es.mjs.map +0 -1
  238. package/dist/node_modules/tinyrainbow/dist/chunk-BVHSVHOK.mjs.map +0 -1
  239. package/dist/node_modules/tinyrainbow/dist/node.mjs.map +0 -1
  240. package/dist/node_modules/tinyspy/dist/index.mjs.map +0 -1
  241. package/dist/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.mjs.map +0 -1
  242. package/dist/node_modules/vitest/dist/chunks/date.W2xKR2qe.mjs.map +0 -1
  243. package/dist/node_modules/vitest/dist/chunks/utils.C8RiOc4B.mjs.map +0 -1
  244. package/dist/node_modules/vitest/dist/chunks/vi.DgezovHB.mjs.map +0 -1
  245. /package/dist/node_modules/{@vitest → .bun/@vitest_runner@2.1.9/node_modules/@vitest}/runner/dist/utils.mjs +0 -0
@@ -15,21 +15,25 @@ Use the `cron` tool to schedule reminders or recurring tasks.
15
15
  ## Examples
16
16
 
17
17
  Fixed reminder (kind="direct", the default):
18
+
18
19
  ```
19
20
  cron(action="add", message="Time to take a break!", every_seconds=1200)
20
21
  ```
21
22
 
22
23
  Dynamic task (kind="task", agent executes each time):
24
+
23
25
  ```
24
26
  cron(action="add", message="Check HKUDS/nanobot GitHub stars and report", kind="task", every_seconds=600)
25
27
  ```
26
28
 
27
29
  Daily at 8am (user is in Asia/Tokyo):
30
+
28
31
  ```
29
32
  cron(action="add", message="おはよう!今日も頑張ろう", cron_expr="0 8 * * *", timezone="Asia/Tokyo")
30
33
  ```
31
34
 
32
35
  List/remove:
36
+
33
37
  ```
34
38
  cron(action="list")
35
39
  cron(action="remove", job_id="abc123")
@@ -49,11 +53,11 @@ For `every_seconds`, no timezone is needed — it's just an interval.
49
53
 
50
54
  ## Time Expressions
51
55
 
52
- | User says | Parameters |
53
- |-----------|------------|
54
- | every 20 minutes | every_seconds: 1200 |
55
- | every hour | every_seconds: 3600 |
56
- | every day at 8am | cron_expr: "0 8 * * *", timezone: (from system prompt) |
57
- | weekdays at 5pm | cron_expr: "0 17 * * 1-5", timezone: (from system prompt) |
58
- | In 10 minutes | at: (current time + 10min, with tz offset) |
59
- | at a specific date/time | at: ISO-8601 with timezone offset |
56
+ | User says | Parameters |
57
+ | ----------------------- | ----------------------------------------------------------- |
58
+ | every 20 minutes | every_seconds: 1200 |
59
+ | every hour | every_seconds: 3600 |
60
+ | every day at 8am | cron_expr: "0 8 \* \* \*", timezone: (from system prompt) |
61
+ | weekdays at 5pm | cron_expr: "0 17 \* \* 1-5", timezone: (from system prompt) |
62
+ | In 10 minutes | at: (current time + 10min, with tz offset) |
63
+ | at a specific date/time | at: ISO-8601 with timezone offset |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: daily-summary
3
- description: Morning briefing with weather and schedule.
3
+ description: Automated morning briefing combining weather, schedule, and trash day. Use when user asks for 朝の要約 or wants a daily digest setup.
4
4
  ---
5
5
 
6
6
  # Daily Summary (朝の要約)
@@ -31,6 +31,7 @@ curl -s "wttr.in/Tokyo?format=j1" | jq -r '
31
31
  ### 2. Schedule
32
32
 
33
33
  Check for events:
34
+
34
35
  ```bash
35
36
  grep "$(date +%Y-%m-%d)" memory/HISTORY.md 2>/dev/null
36
37
  ```
@@ -38,6 +39,7 @@ grep "$(date +%Y-%m-%d)" memory/HISTORY.md 2>/dev/null
38
39
  ### 3. Trash Day
39
40
 
40
41
  Day of week:
42
+
41
43
  - 火・金 = 燃えるゴミ
42
44
  - 水 = 燃えないゴミ
43
45
  - 土 = ペットボトル (varies by ward)
@@ -47,6 +49,7 @@ Day of week:
47
49
  **ALWAYS use the `flex_message` tool** to display the daily summary as a rich card.
48
50
 
49
51
  Call the tool like this:
52
+
50
53
  ```
51
54
  flex_message(template="morning_summary", data={
52
55
  greeting: "おはよう!",
@@ -63,6 +66,7 @@ The card is sent automatically — do NOT repeat the JSON. Just respond naturall
63
66
  ## Personalization
64
67
 
65
68
  Read from `memory/MEMORY.md`:
69
+
66
70
  - `city:` for weather location
67
71
  - `ward:` for trash schedule
68
72
  - `wake_time:` for optimal push time
@@ -1,18 +1,28 @@
1
1
  ---
2
2
  name: english
3
- description: Casual English conversation practice with corrections.
3
+ description: English conversation practice with level-based corrections, vocab tracking, and quizzes. Use when user says 英語, English mode, 英会話, 英語クイズ, or vocab test.
4
4
  ---
5
5
 
6
6
  # English Chat (英会話練習)
7
7
 
8
+ ## Data
9
+
10
+ All data in `data/english/`:
11
+
12
+ - `settings.json` — level preference
13
+ - `vocab.json` — accumulated vocabulary list
14
+ - `sessions.jsonl` — session logs (one JSON object per line)
15
+
8
16
  ## Difficulty Level
9
17
 
10
- Settings stored in `data/english.json`:
18
+ Settings stored in `data/english/settings.json`:
19
+
11
20
  ```json
12
21
  { "level": "beginner" }
13
22
  ```
14
23
 
15
- On first activation, if `data/english.json` doesn't exist, ask the user to choose their level:
24
+ On first activation, if `data/english/settings.json` doesn't exist, ask the user to choose their level:
25
+
16
26
  ```
17
27
  flex_message(template="action_buttons", data={
18
28
  prompt: "英語レベルを選んでね!\nChoose your English level:",
@@ -24,22 +34,22 @@ flex_message(template="action_buttons", data={
24
34
  })
25
35
  ```
26
36
 
27
- Save the choice to `data/english.json`. User can change anytime with "レベル変更".
37
+ Save the choice to `data/english/settings.json`. User can change anytime with "レベル変更".
28
38
 
29
39
  ### Level behavior
30
40
 
31
- | | Beginner | Intermediate | Advanced |
32
- |---|---|---|---|
33
- | Bot's vocab | Simple, common words | Natural, varied | Idioms, slang, nuance |
34
- | Corrections | Only major grammar | Grammar + word choice | Everything incl. nuance |
35
- | Japanese help | Always add 日本語 hints | On request only | Never unless asked |
36
- | Sentence length | Short, simple | Natural | Complex, compound |
41
+ | | Beginner | Intermediate | Advanced |
42
+ | --------------- | ----------------------- | --------------------- | ----------------------- |
43
+ | Bot's vocab | Simple, common words | Natural, varied | Idioms, slang, nuance |
44
+ | Corrections | Only major grammar | Grammar + word choice | Everything incl. nuance |
45
+ | Japanese help | Always add 日本語 hints | On request only | Never unless asked |
46
+ | Sentence length | Short, simple | Natural | Complex, compound |
37
47
 
38
48
  ## Mode
39
49
 
40
50
  When user says "英語モード" / "English mode" / "英会話":
41
51
 
42
- 1. Read `data/english.json` for level (default: beginner if missing)
52
+ 1. Read `data/english/settings.json` for level (default: beginner if missing)
43
53
  2. Reply in English, adapted to level
44
54
  3. Gently correct mistakes (strictness based on level)
45
55
  4. Offer Japanese translation based on level rules above
@@ -51,11 +61,12 @@ Casual and natural. Like chatting with a friend.
51
61
  User: "Yesterday I go to Tokyo"
52
62
  Bot: "Oh nice! Where did you go in Tokyo? 🗼
53
63
 
54
- (Correction: 'Yesterday I *went* to Tokyo' - past tense!)"
64
+ (Correction: 'Yesterday I _went_ to Tokyo' - past tense!)"
55
65
 
56
66
  ## Corrections
57
67
 
58
68
  Only fix:
69
+
59
70
  - Major grammar (tense, word order)
60
71
  - Wrong word usage
61
72
  - Natural phrasing
@@ -65,6 +76,7 @@ Adjust strictness per level. Skip minor stuff. Keep flow.
65
76
  ## Topic Selection
66
77
 
67
78
  Use quick_replies directive:
79
+
68
80
  ```
69
81
  What do you want to practice?
70
82
 
@@ -74,14 +86,17 @@ What do you want to practice?
74
86
  ## Topic Prompts
75
87
 
76
88
  **Daily life:**
89
+
77
90
  - "What did you have for breakfast?"
78
91
  - "How do you spend weekends?"
79
92
 
80
93
  **Travel:**
94
+
81
95
  - "Where do you want to go next?"
82
96
  - "Best place you've visited?"
83
97
 
84
98
  **Work:**
99
+
85
100
  - "What do you do?"
86
101
  - "Remote or office?"
87
102
 
@@ -93,6 +108,7 @@ What do you want to practice?
93
108
  ## Code-switching
94
109
 
95
110
  If user struggles:
111
+
96
112
  ```
97
113
  How was your day? (今日どうだった?)
98
114
  ```
@@ -106,12 +122,30 @@ When user says "日本語に戻して" / "exit English" / "おわり":
106
122
  - Corrections you made (original → fixed)
107
123
  - New vocabulary or phrases you introduced
108
124
  - An encouraging comment about their performance
109
- 2. Send a session summary using `flex_message`:
125
+
126
+ 2. **Save session log** — append one JSON line to `data/english/sessions.jsonl`:
127
+
128
+ ```bash
129
+ echo '{"date":"2025-02-13","topics":["daily life","food"],"corrections":[{"wrong":"I go","right":"I went","rule":"past tense"}],"vocab":["commute","grab a bite"],"duration_msgs":12}' >> data/english/sessions.jsonl
130
+ ```
131
+
132
+ 3. **Update vocab list** — read `data/english/vocab.json`, merge new words, write back:
133
+
134
+ ```json
135
+ [
136
+ { "word": "commute", "meaning": "通勤する", "date": "2025-02-13" },
137
+ { "word": "grab a bite", "meaning": "軽く食べる", "date": "2025-02-13" }
138
+ ]
139
+ ```
140
+
141
+ If the file doesn't exist, create it with the new entries. Skip duplicates (same `word`).
142
+
143
+ 4. **Send session summary card**:
110
144
 
111
145
  ```
112
146
  flex_message(template="custom", data={
113
147
  title: "📝 English Session",
114
- body: "Topics: ...\n\nCorrections:\n❌ I go → ✅ I went\n❌ more easy → ✅ easier\n\nNew vocab:\n• commute (通勤する)\n• grab a bite (軽く食べる)\n\n💪 Great job! Your past tense is improving!",
148
+ body: "Topics: daily life, food\n\nCorrections:\n❌ I go → ✅ I went\n❌ more easy → ✅ easier\n\nNew vocab:\n• commute (通勤する)\n• grab a bite (軽く食べる)\n\n💪 Great job! Your past tense is improving!",
115
149
  header_color: "#4CAF50"
116
150
  })
117
151
  ```
@@ -120,6 +154,30 @@ Keep it honest — if there were no corrections, say so. If there were many, pic
120
154
 
121
155
  After the card, respond: "英語練習お疲れ様!👍"
122
156
 
157
+ ## Vocab Review
158
+
159
+ When user says "英語クイズ" / "vocab test" / "復習":
160
+
161
+ 1. Read `data/english/vocab.json`
162
+ 2. Pick 5 random words from past sessions
163
+ 3. Quiz the user — show the English word, ask for meaning or usage in a sentence
164
+ 4. Use `action_buttons` for multiple choice if beginner level
165
+
166
+ Example:
167
+
168
+ ```
169
+ flex_message(template="action_buttons", data={
170
+ prompt: "What does 'commute' mean?",
171
+ buttons: [
172
+ { label: "通勤する", text: "答え 通勤する", style: "primary" },
173
+ { label: "通信する", text: "答え 通信する", style: "secondary" },
174
+ { label: "通過する", text: "答え 通過する", style: "secondary" }
175
+ ]
176
+ })
177
+ ```
178
+
179
+ For intermediate/advanced: just ask in text, no multiple choice.
180
+
123
181
  ## Tips
124
182
 
125
183
  - Match user's level
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: expense
3
- description: Track daily expenses and show monthly summaries.
3
+ description: Expense tracker with auto-categorization and monthly receipt summaries. Use when user mentions spending like 出費, 500円, or asks for expense reports.
4
4
  ---
5
5
 
6
6
  # Expense Tracker (出費記録)
@@ -10,21 +10,22 @@ description: Track daily expenses and show monthly summaries.
10
10
  User says: "コンビニで500円" / "出費 +380 カフェ" / "ランチ 1200"
11
11
 
12
12
  Log to CSV:
13
+
13
14
  ```bash
14
- echo "$(date +%Y-%m-%d),$(date +%H:%M),500,コンビニ,コンビニ" >> data/expenses.csv
15
+ echo "$(date +%Y-%m-%d),$(date +%H:%M),500,コンビニ,コンビニ" >> data/expense/log.csv
15
16
  ```
16
17
 
17
18
  Format: `date,time,amount,note,category`
18
19
 
19
20
  ## Auto-categorize
20
21
 
21
- | Keywords | Category |
22
- |----------|----------|
23
- | コンビニ, セブン, ローソン, ファミマ | コンビニ |
24
- | カフェ, スタバ, ドトール | カフェ |
25
- | ランチ, 食事, 丼, ラーメン | 食事 |
26
- | 電車, 地下鉄, バス | 交通 |
27
- | amazon, ヨドバシ | ショッピング |
22
+ | Keywords | Category |
23
+ | ------------------------------------ | ------------ |
24
+ | コンビニ, セブン, ローソン, ファミマ | コンビニ |
25
+ | カフェ, スタバ, ドトール | カフェ |
26
+ | ランチ, 食事, 丼, ラーメン | 食事 |
27
+ | 電車, 地下鉄, バス | 交通 |
28
+ | amazon, ヨドバシ | ショッピング |
28
29
 
29
30
  Default: 雑費
30
31
 
@@ -35,18 +36,21 @@ After recording, confirm with a short text: "✅ 記録: カフェ ¥380"
35
36
  ## Summary
36
37
 
37
38
  Monthly totals:
39
+
38
40
  ```bash
39
- awk -F, '$1 ~ /^2025-02/ {sum+=$3} END {print sum}' data/expenses.csv
41
+ awk -F, '$1 ~ /^2025-02/ {sum+=$3} END {print sum}' data/expense/log.csv
40
42
  ```
41
43
 
42
44
  By category:
45
+
43
46
  ```bash
44
- awk -F, '$1 ~ /^2025-02/ {cat[$5]+=$3} END {for(c in cat) print c, cat[c]}' data/expenses.csv
47
+ awk -F, '$1 ~ /^2025-02/ {cat[$5]+=$3} END {for(c in cat) print c, cat[c]}' data/expense/log.csv
45
48
  ```
46
49
 
47
50
  **ALWAYS use `flex_message`** for summaries. The card is auto-sent.
48
51
 
49
52
  Monthly summary as receipt card:
53
+
50
54
  ```
51
55
  flex_message(template="receipt", data={
52
56
  title: "2月の出費",
@@ -1,30 +1,31 @@
1
1
  ---
2
2
  name: fortune
3
- description: Daily horoscope readings.
3
+ description: Daily horoscope and zodiac readings. Use when user says 占い, 運勢, 星座, or asks about their fortune/horoscope.
4
4
  ---
5
5
 
6
6
  # Fortune (占い)
7
7
 
8
8
  ## 12 Signs
9
9
 
10
- | Sign | Dates | Emoji |
11
- |------|-------|-------|
12
- | 牡羊座 | 3/21-4/19 | ♈ |
13
- | 牡牛座 | 4/20-5/20 | ♉ |
14
- | 双子座 | 5/21-6/21 | ♊ |
15
- | 蟹座 | 6/22-7/22 | ♋ |
16
- | 獅子座 | 7/23-8/22 | ♌ |
17
- | 乙女座 | 8/23-9/22 | ♍ |
18
- | 天秤座 | 9/23-10/23 | ♎ |
19
- | 蠍座 | 10/24-11/22 | ♏ |
20
- | 射手座 | 11/23-12/21 | ♐ |
21
- | 山羊座 | 12/22-1/19 | ♑ |
22
- | 水瓶座 | 1/20-2/18 | ♒ |
23
- | 魚座 | 2/19-3/20 | ♓ |
10
+ | Sign | Dates | Emoji |
11
+ | ------ | ----------- | ----- |
12
+ | 牡羊座 | 3/21-4/19 | ♈ |
13
+ | 牡牛座 | 4/20-5/20 | ♉ |
14
+ | 双子座 | 5/21-6/21 | ♊ |
15
+ | 蟹座 | 6/22-7/22 | ♋ |
16
+ | 獅子座 | 7/23-8/22 | ♌ |
17
+ | 乙女座 | 8/23-9/22 | ♍ |
18
+ | 天秤座 | 9/23-10/23 | ♎ |
19
+ | 蠍座 | 10/24-11/22 | ♏ |
20
+ | 射手座 | 11/23-12/21 | ♐ |
21
+ | 山羊座 | 12/22-1/19 | ♑ |
22
+ | 水瓶座 | 1/20-2/18 | ♒ |
23
+ | 魚座 | 2/19-3/20 | ♓ |
24
24
 
25
25
  ## Generate Fortune
26
26
 
27
27
  Random daily seed:
28
+
28
29
  ```bash
29
30
  seed=$(date +%Y%m%d)$sign_index
30
31
  fortune_level=$((seed % 5 + 1)) # 1-5 stars
@@ -32,19 +33,20 @@ fortune_level=$((seed % 5 + 1)) # 1-5 stars
32
33
 
33
34
  Fortune messages:
34
35
 
35
- | Stars | Message |
36
- |-------|---------|
37
- | ★★★★★ | 最高の日!自信を持って |
36
+ | Stars | Message |
37
+ | ----- | ---------------------------- |
38
+ | ★★★★★ | 最高の日!自信を持って |
38
39
  | ★★★★☆ | いい流れ。チャンスを掴んで! |
39
- | ★★★☆☆ | 普通。マイペースで |
40
- | ★★☆☆☆ | 注意深く。深呼吸して |
41
- | ★☆☆☆☆ | 慎重に。無理は禁物 |
40
+ | ★★★☆☆ | 普通。マイペースで |
41
+ | ★★☆☆☆ | 注意深く。深呼吸して |
42
+ | ★☆☆☆☆ | 慎重に。無理は禁物 |
42
43
 
43
44
  ## Output
44
45
 
45
46
  **ALWAYS use the `flex_message` tool** to display fortune results as a rich card.
46
47
 
47
48
  Call the tool like this:
49
+
48
50
  ```
49
51
  flex_message(template="fortune", data={
50
52
  sign: "♍ 乙女座",
@@ -65,6 +67,7 @@ The card is sent automatically — do NOT repeat the JSON. Just respond naturall
65
67
  ## Personalization
66
68
 
67
69
  Store in `memory/MEMORY.md`:
70
+
68
71
  ```
69
72
  - 星座: 牡羊座
70
73
  - 誕生日: 4月15日
@@ -79,6 +82,7 @@ cron(action="add", message="今日の運勢見る?", cron_expr="0 8 * * *", ti
79
82
  ## Personality
80
83
 
81
84
  Match bot tone:
85
+
82
86
  - フレンドリー: message="今日はラッキーかも!"
83
87
  - 執事: message="本日の運勢でございます"
84
88
  - ツンデレ: message="べ、別に...星4つ"
@@ -1,13 +1,14 @@
1
1
  ---
2
2
  name: habit
3
- description: Track daily habits with streaks.
3
+ description: Habit tracker with streak counting and weekly summaries. Use when user says 習慣, mentions completing a habit, or wants to add/check habits.
4
4
  ---
5
5
 
6
6
  # Habit Tracker (習慣トラッカー)
7
7
 
8
8
  ## Setup
9
9
 
10
- Store habits in `data/habits.json`:
10
+ Store habits in `data/habit/config.json`:
11
+
11
12
  ```json
12
13
  {
13
14
  "habits": [
@@ -45,19 +46,19 @@ The card is auto-sent — do NOT repeat the JSON.
45
46
 
46
47
  - Green header (#4CAF50) = already done today
47
48
  - Orange header (#FF9800) = not done yet
48
- - Read `data/habit-log.csv` to check today's status before building the carousel
49
+ - Read `data/habit/log.csv` to check today's status before building the carousel
49
50
 
50
51
  ## Logging
51
52
 
52
53
  ```bash
53
- echo "$(date +%Y-%m-%d)|meditate|1" >> data/habit-log.csv
54
+ echo "$(date +%Y-%m-%d)|meditate|1" >> data/habit/log.csv
54
55
  ```
55
56
 
56
57
  ## Streaks
57
58
 
58
59
  ```bash
59
60
  # Count consecutive days
60
- awk -F"|" '$2=="meditate" && $3=="1" {print $1}' data/habit-log.csv | uniq | tail -7 | wc -l
61
+ awk -F"|" '$2=="meditate" && $3=="1" {print $1}' data/habit/log.csv | uniq | tail -7 | wc -l
61
62
  ```
62
63
 
63
64
  ## Summary
@@ -82,4 +83,4 @@ flex_message(template="custom", data={
82
83
  ## Motivation
83
84
 
84
85
  - Streak celebration: "🔥 7日連続すごい!"
85
- - Gentle nudge: "今日まだ瞑想してないよ〜"
86
+ - Gentle nudge: "今日まだ瞑想してないよ〜"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: hydration
3
- description: Track daily water intake with reminders.
3
+ description: Water intake tracker with reminders and progress display. Use when user says 水飲んだ, 一杯, or asks about hydration.
4
4
  ---
5
5
 
6
6
  # Hydration Tracker (水分摂取)
@@ -10,14 +10,15 @@ description: Track daily water intake with reminders.
10
10
  User says: "水飲んだ" / "一杯飲んだ" / "+1"
11
11
 
12
12
  Log:
13
+
13
14
  ```bash
14
- echo "$(date -Iseconds)|1" >> data/hydration.log
15
+ echo "$(date -Iseconds)|1" >> data/hydration/log.csv
15
16
  ```
16
17
 
17
18
  ## Check Progress
18
19
 
19
20
  ```bash
20
- grep "$(date +%Y-%m-%d)" data/hydration.log | wc -l
21
+ grep "$(date +%Y-%m-%d)" data/hydration/log.csv | wc -l
21
22
  ```
22
23
 
23
24
  ## Output
@@ -25,6 +26,7 @@ grep "$(date +%Y-%m-%d)" data/hydration.log | wc -l
25
26
  **ALWAYS use the `flex_message` tool** to display hydration status.
26
27
 
27
28
  Call the tool like this:
29
+
28
30
  ```
29
31
  flex_message(template="hydration", data={
30
32
  title: "水飲んだ?",
@@ -47,11 +49,12 @@ cron(action="add", message="水飲んだ?リマインド送って", every_seco
47
49
  ## Reset
48
50
 
49
51
  Archive at midnight:
52
+
50
53
  ```bash
51
- [ -f data/hydration.log ] && mv data/hydration.log data/hydration-$(date +%Y-%m-%d).log
54
+ [ -f data/hydration/log.csv ] && mv data/hydration/log.csv data/hydration/log-$(date +%Y-%m-%d).csv
52
55
  ```
53
56
 
54
57
  ## Notes
55
58
 
56
59
  - ALWAYS use the `flex_message` tool — the card is auto-sent
57
- - Update `current` count by reading from `data/hydration.log` before calling the tool
60
+ - Update `current` count by reading from `data/hydration/log.csv` before calling the tool
@@ -22,6 +22,7 @@ Use the `exec` tool to run grep. Combine patterns: `grep -iE "meeting|deadline"
22
22
  ## When to Update MEMORY.md
23
23
 
24
24
  Write important facts immediately using `edit_file` or `write_file`:
25
+
25
26
  - User preferences ("I prefer dark mode")
26
27
  - Project context ("The API uses OAuth2")
27
28
  - Relationships ("Alice is the project lead")
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: mood
3
- description: Daily mood tracking with emoji and optional notes.
3
+ description: Mood journal with emoji tracking and weekly reports. Use when user shares feelings like 気分, だるい, 疲れた, いい感じ, or asks for mood summary.
4
4
  ---
5
5
 
6
6
  # Mood Journal (気分日記)
@@ -11,16 +11,17 @@ User says: "今日はいい感じ" / "気分いい" / "だるい" / "疲れた"
11
11
 
12
12
  Map to emoji + score:
13
13
 
14
- | Input patterns | Emoji | Score |
15
- |----------------|-------|-------|
16
- | いい, 最高, 😊, 🥰, 嬉しい | 😊 | 5 |
17
- | まあまあ, 普通, 😐 | 😐 | 3 |
18
- | だるい, 疲れた, 😔, 悲しい | 😔 | 2 |
19
- | 最悪, 😢, 辛い | 😢 | 1 |
14
+ | Input patterns | Emoji | Score |
15
+ | -------------------------- | ----- | ----- |
16
+ | いい, 最高, 😊, 🥰, 嬉しい | 😊 | 5 |
17
+ | まあまあ, 普通, 😐 | 😐 | 3 |
18
+ | だるい, 疲れた, 😔, 悲しい | 😔 | 2 |
19
+ | 最悪, 😢, 辛い | 😢 | 1 |
20
20
 
21
21
  Log to CSV:
22
+
22
23
  ```bash
23
- echo "$(date +%Y-%m-%d),$(date +%H:%M),😊,5,今日はいい感じ" >> data/mood.csv
24
+ echo "$(date +%Y-%m-%d),$(date +%H:%M),😊,5,今日はいい感じ" >> data/mood/log.csv
24
25
  ```
25
26
 
26
27
  Format: `date,time,emoji,score,note`
@@ -28,6 +29,7 @@ Format: `date,time,emoji,score,note`
28
29
  ## Daily Check-in
29
30
 
30
31
  Use `action_buttons` flex for tap response:
32
+
31
33
  ```
32
34
  flex_message(template="action_buttons", data={
33
35
  prompt: "今日の気分は?",
@@ -41,6 +43,7 @@ flex_message(template="action_buttons", data={
41
43
  ```
42
44
 
43
45
  The card is auto-sent. Set up cron for nightly check-in:
46
+
44
47
  ```
45
48
  cron(action="add", message="気分チェックインのカードを送って", cron_expr="0 21 * * *", timezone="Asia/Tokyo", kind="task")
46
49
  ```
@@ -48,8 +51,9 @@ cron(action="add", message="気分チェックインのカードを送って", c
48
51
  ## Summary
49
52
 
50
53
  Calculate average:
54
+
51
55
  ```bash
52
- awk -F, 'NR>7 {sum+=$4; count++} END {print "avg:", sum/count}' data/mood.csv
56
+ awk -F, 'NR>7 {sum+=$4; count++} END {print "avg:", sum/count}' data/mood/log.csv
53
57
  ```
54
58
 
55
59
  **ALWAYS use `flex_message`** for weekly summaries. The card is auto-sent.
@@ -36,6 +36,7 @@ skill-name/
36
36
  scripts/ (optional) - Executable code
37
37
  references/ (optional) - Documentation for context
38
38
  assets/ (optional) - Files used in output
39
+ data/ (optional) - User data, settings, logs
39
40
  ```
40
41
 
41
42
  #### SKILL.md
@@ -72,6 +73,24 @@ Skills use three-level loading:
72
73
  - `description`: What the skill does AND when to use it. Include trigger contexts.
73
74
  All "when to use" info goes here since the body only loads after triggering.
74
75
 
76
+ ### Data Storage
77
+
78
+ **Custom skills** live in the workspace `skills/` directory. Store user data in `data/` within the skill, using the **full path from workspace root** in SKILL.md:
79
+
80
+ ```
81
+ skills/my-skill/
82
+ SKILL.md
83
+ data/
84
+ log.csv
85
+ settings.json
86
+ ```
87
+
88
+ ```bash
89
+ echo "..." >> skills/my-skill/data/log.csv
90
+ ```
91
+
92
+ NOT `data/log.csv` — that would write to the workspace root.
93
+
75
94
  ### Flex Message Integration
76
95
 
77
96
  If the skill produces output that would benefit from rich visual display (cards, progress trackers, summaries, confirmations), include `flex_message` tool usage in the SKILL.md.
@@ -81,6 +100,7 @@ Available templates: `fortune`, `info_card`, `action_buttons`, `receipt`, `morni
81
100
  #### Custom template
82
101
 
83
102
  Single card with auto-built layout:
103
+
84
104
  ```
85
105
  flex_message(template="custom", data={
86
106
  title: "カードタイトル",
@@ -96,6 +116,7 @@ flex_message(template="custom", data={
96
116
  ```
97
117
 
98
118
  Carousel (horizontally swipeable cards):
119
+
99
120
  ```
100
121
  flex_message(template="custom", data={
101
122
  bubbles: [
@@ -108,6 +129,7 @@ flex_message(template="custom", data={
108
129
  #### Output section for skills using flex
109
130
 
110
131
  The card is **auto-sent** when the tool returns. Include this in SKILL.md:
132
+
111
133
  ```markdown
112
134
  ## Output
113
135
 
@@ -10,6 +10,7 @@ Fast CLI to summarize URLs, local files, and YouTube links.
10
10
  ## When to use
11
11
 
12
12
  Use this skill when the user:
13
+
13
14
  - Sends a URL and asks "what's this about?"
14
15
  - Asks to summarize an article, blog post, or web page
15
16
  - Asks to transcribe or summarize a YouTube video