@jcheesepkg/nanobot 0.9.1 → 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.
- package/README.md +18 -18
- package/dist/agent/context.d.mts +4 -4
- package/dist/agent/context.d.mts.map +1 -1
- package/dist/agent/context.mjs +27 -28
- package/dist/agent/context.mjs.map +1 -1
- package/dist/agent/loop.d.mts +5 -3
- package/dist/agent/loop.d.mts.map +1 -1
- package/dist/agent/loop.mjs +64 -55
- package/dist/agent/loop.mjs.map +1 -1
- package/dist/agent/memory.d.mts.map +1 -1
- package/dist/agent/memory.mjs +3 -3
- package/dist/agent/memory.mjs.map +1 -1
- package/dist/agent/skills.d.mts.map +1 -1
- package/dist/agent/skills.mjs +4 -4
- package/dist/agent/skills.mjs.map +1 -1
- package/dist/agent/subagent.d.mts.map +1 -1
- package/dist/agent/subagent.mjs +22 -22
- package/dist/agent/subagent.mjs.map +1 -1
- package/dist/agent/tools/base.mjs +2 -2
- package/dist/agent/tools/base.mjs.map +1 -1
- package/dist/agent/tools/cron.d.mts +1 -1
- package/dist/agent/tools/cron.d.mts.map +1 -1
- package/dist/agent/tools/cron.mjs +11 -11
- package/dist/agent/tools/cron.mjs.map +1 -1
- package/dist/agent/tools/filesystem.d.mts +4 -4
- package/dist/agent/tools/filesystem.d.mts.map +1 -1
- package/dist/agent/tools/filesystem.mjs +20 -20
- package/dist/agent/tools/filesystem.mjs.map +1 -1
- package/dist/agent/tools/flex.d.mts +1 -1
- package/dist/agent/tools/flex.d.mts.map +1 -1
- package/dist/agent/tools/flex.mjs +112 -112
- package/dist/agent/tools/flex.mjs.map +1 -1
- package/dist/agent/tools/flex.test.mjs +60 -59
- package/dist/agent/tools/flex.test.mjs.map +1 -1
- package/dist/agent/tools/message.d.mts +1 -1
- package/dist/agent/tools/message.d.mts.map +1 -1
- package/dist/agent/tools/message.mjs +4 -4
- package/dist/agent/tools/message.mjs.map +1 -1
- package/dist/agent/tools/registry.d.mts.map +1 -1
- package/dist/agent/tools/registry.mjs +4 -4
- package/dist/agent/tools/registry.mjs.map +1 -1
- package/dist/agent/tools/shell.d.mts +1 -1
- package/dist/agent/tools/shell.mjs +4 -4
- package/dist/agent/tools/shell.mjs.map +1 -1
- package/dist/agent/tools/spawn.d.mts +1 -1
- package/dist/agent/tools/spawn.d.mts.map +1 -1
- package/dist/agent/tools/spawn.mjs +4 -4
- package/dist/agent/tools/spawn.mjs.map +1 -1
- package/dist/agent/tools/web.d.mts +2 -2
- package/dist/agent/tools/web.d.mts.map +1 -1
- package/dist/agent/tools/web.mjs +36 -36
- package/dist/agent/tools/web.mjs.map +1 -1
- package/dist/bus/events.mjs +1 -1
- package/dist/bus/events.mjs.map +1 -1
- package/dist/bus/queue.d.mts.map +1 -1
- package/dist/bus/queue.mjs.map +1 -1
- package/dist/channels/base.d.mts.map +1 -1
- package/dist/channels/base.mjs +2 -2
- package/dist/channels/base.mjs.map +1 -1
- package/dist/channels/line.d.mts +1 -0
- package/dist/channels/line.d.mts.map +1 -1
- package/dist/channels/line.mjs +65 -65
- package/dist/channels/line.mjs.map +1 -1
- package/dist/channels/line.test.mjs +26 -27
- package/dist/channels/line.test.mjs.map +1 -1
- package/dist/channels/manager.d.mts.map +1 -1
- package/dist/channels/manager.mjs +9 -9
- package/dist/channels/manager.mjs.map +1 -1
- package/dist/channels/telegram.mjs +34 -34
- package/dist/channels/telegram.mjs.map +1 -1
- package/dist/cli/index.mjs +36 -36
- package/dist/cli/index.mjs.map +1 -1
- package/dist/config/loader.d.mts.map +1 -1
- package/dist/config/loader.mjs +1 -1
- package/dist/config/loader.mjs.map +1 -1
- package/dist/config/schema.d.mts +387 -387
- package/dist/config/schema.d.mts.map +1 -1
- package/dist/config/schema.mjs +42 -42
- package/dist/config/schema.mjs.map +1 -1
- package/dist/gateway/server.d.mts.map +1 -1
- package/dist/gateway/server.mjs +48 -54
- package/dist/gateway/server.mjs.map +1 -1
- package/dist/heartbeat/service.d.mts.map +1 -1
- package/dist/heartbeat/service.mjs +8 -8
- package/dist/heartbeat/service.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/node_modules/{@jridgewell → .bun/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell}/sourcemap-codec/dist/sourcemap-codec.mjs +1 -1
- package/dist/node_modules/.bun/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_expect@2.1.9/node_modules/@vitest}/expect/dist/index.mjs +8 -8
- package/dist/node_modules/.bun/@vitest_expect@2.1.9/node_modules/@vitest/expect/dist/index.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_pretty-format@2.1.9/node_modules/@vitest}/pretty-format/dist/index.mjs +2 -2
- package/dist/node_modules/.bun/@vitest_pretty-format@2.1.9/node_modules/@vitest/pretty-format/dist/index.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_runner@2.1.9/node_modules/@vitest}/runner/dist/chunk-tasks.mjs +1 -1
- package/dist/node_modules/.bun/@vitest_runner@2.1.9/node_modules/@vitest/runner/dist/chunk-tasks.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_runner@2.1.9/node_modules/@vitest}/runner/dist/index.mjs +6 -6
- package/dist/node_modules/.bun/@vitest_runner@2.1.9/node_modules/@vitest/runner/dist/index.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_snapshot@2.1.9/node_modules/@vitest}/snapshot/dist/index.mjs +5 -5
- package/dist/node_modules/.bun/@vitest_snapshot@2.1.9/node_modules/@vitest/snapshot/dist/index.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_spy@2.1.9/node_modules/@vitest}/spy/dist/index.mjs +2 -2
- package/dist/node_modules/.bun/@vitest_spy@2.1.9/node_modules/@vitest/spy/dist/index.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/chunk-_commonjsHelpers.mjs +3 -3
- package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/chunk-_commonjsHelpers.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/diff.mjs +4 -4
- package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/diff.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/error.mjs +3 -3
- package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/error.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/helpers.mjs +1 -1
- package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/helpers.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/index.mjs +3 -3
- package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/index.mjs.map +1 -0
- package/dist/node_modules/{@vitest → .bun/@vitest_utils@2.1.9/node_modules/@vitest}/utils/dist/source-map.mjs +1 -1
- package/dist/node_modules/.bun/@vitest_utils@2.1.9/node_modules/@vitest/utils/dist/source-map.mjs.map +1 -0
- package/dist/node_modules/{chai → .bun/chai@5.3.3/node_modules/chai}/index.mjs +1 -1
- package/dist/node_modules/.bun/chai@5.3.3/node_modules/chai/index.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/arguments.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/arguments.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/array.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/array.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/bigint.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/bigint.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/class.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/class.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/date.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/date.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/error.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/error.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/function.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/function.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/helpers.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/helpers.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/html.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/html.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/index.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/index.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/map.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/map.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/number.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/number.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/object.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/object.mjs.map +1 -0
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/promise.mjs +6 -0
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/promise.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/regexp.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/regexp.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/set.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/set.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/string.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/string.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/symbol.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/symbol.mjs.map +1 -0
- package/dist/node_modules/{loupe → .bun/loupe@3.2.1/node_modules/loupe}/lib/typedarray.mjs +1 -1
- package/dist/node_modules/.bun/loupe@3.2.1/node_modules/loupe/lib/typedarray.mjs.map +1 -0
- package/dist/node_modules/{magic-string → .bun/magic-string@0.30.21/node_modules/magic-string}/dist/magic-string.es.mjs +2 -2
- package/dist/node_modules/.bun/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.mjs.map +1 -0
- package/dist/node_modules/{@vitest/snapshot → .bun/pathe@1.1.2}/node_modules/pathe/dist/shared/pathe.ff20891b.mjs +1 -1
- package/dist/node_modules/.bun/pathe@1.1.2/node_modules/pathe/dist/shared/pathe.ff20891b.mjs.map +1 -0
- package/dist/node_modules/{tinyrainbow → .bun/tinyrainbow@1.2.0/node_modules/tinyrainbow}/dist/chunk-BVHSVHOK.mjs +1 -1
- package/dist/node_modules/.bun/tinyrainbow@1.2.0/node_modules/tinyrainbow/dist/chunk-BVHSVHOK.mjs.map +1 -0
- package/dist/node_modules/{tinyrainbow → .bun/tinyrainbow@1.2.0/node_modules/tinyrainbow}/dist/node.mjs +1 -1
- package/dist/node_modules/.bun/tinyrainbow@1.2.0/node_modules/tinyrainbow/dist/node.mjs.map +1 -0
- package/dist/node_modules/{tinyspy → .bun/tinyspy@3.0.2/node_modules/tinyspy}/dist/index.mjs +1 -1
- package/dist/node_modules/.bun/tinyspy@3.0.2/node_modules/tinyspy/dist/index.mjs.map +1 -0
- package/dist/node_modules/{vitest → .bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest}/dist/chunks/_commonjsHelpers.BFTU3MAI.mjs +1 -1
- package/dist/node_modules/.bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.mjs.map +1 -0
- package/dist/node_modules/{vitest → .bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest}/dist/chunks/date.W2xKR2qe.mjs +1 -1
- package/dist/node_modules/.bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest/dist/chunks/date.W2xKR2qe.mjs.map +1 -0
- package/dist/node_modules/{vitest → .bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest}/dist/chunks/utils.C8RiOc4B.mjs +2 -2
- package/dist/node_modules/.bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest/dist/chunks/utils.C8RiOc4B.mjs.map +1 -0
- package/dist/node_modules/{vitest → .bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest}/dist/chunks/vi.DgezovHB.mjs +11 -11
- package/dist/node_modules/.bun/vitest@2.1.9_7700f9e9ace41f23/node_modules/vitest/dist/chunks/vi.DgezovHB.mjs.map +1 -0
- package/dist/providers/base.d.mts +2 -2
- package/dist/providers/base.d.mts.map +1 -1
- package/dist/providers/openai-provider.d.mts.map +1 -1
- package/dist/providers/openai-provider.mjs +10 -9
- package/dist/providers/openai-provider.mjs.map +1 -1
- package/dist/providers/registry.d.mts +1 -1
- package/dist/providers/registry.d.mts.map +1 -1
- package/dist/providers/registry.mjs +99 -99
- package/dist/providers/registry.mjs.map +1 -1
- package/dist/session/manager.d.mts +2 -2
- package/dist/session/manager.d.mts.map +1 -1
- package/dist/session/manager.mjs +18 -19
- package/dist/session/manager.mjs.map +1 -1
- package/dist/utils/helpers.d.mts.map +1 -1
- package/dist/utils/helpers.mjs.map +1 -1
- package/package.json +11 -11
- package/skills/cron/SKILL.md +12 -8
- package/skills/daily-summary/SKILL.md +4 -0
- package/skills/english/SKILL.md +21 -7
- package/skills/expense/SKILL.md +11 -7
- package/skills/fortune/SKILL.md +24 -20
- package/skills/habit/SKILL.md +2 -1
- package/skills/hydration/SKILL.md +3 -0
- package/skills/memory/SKILL.md +1 -0
- package/skills/mood/SKILL.md +10 -6
- package/skills/skill-creator/SKILL.md +3 -0
- package/skills/summarize/SKILL.md +1 -0
- package/skills/weather/SKILL.md +10 -8
- package/dist/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +0 -1
- package/dist/node_modules/@vitest/expect/dist/index.mjs.map +0 -1
- package/dist/node_modules/@vitest/pretty-format/dist/index.mjs.map +0 -1
- package/dist/node_modules/@vitest/runner/dist/chunk-tasks.mjs.map +0 -1
- package/dist/node_modules/@vitest/runner/dist/index.mjs.map +0 -1
- package/dist/node_modules/@vitest/snapshot/dist/index.mjs.map +0 -1
- package/dist/node_modules/@vitest/snapshot/node_modules/pathe/dist/shared/pathe.ff20891b.mjs.map +0 -1
- package/dist/node_modules/@vitest/spy/dist/index.mjs.map +0 -1
- package/dist/node_modules/@vitest/utils/dist/chunk-_commonjsHelpers.mjs.map +0 -1
- package/dist/node_modules/@vitest/utils/dist/diff.mjs.map +0 -1
- package/dist/node_modules/@vitest/utils/dist/error.mjs.map +0 -1
- package/dist/node_modules/@vitest/utils/dist/helpers.mjs.map +0 -1
- package/dist/node_modules/@vitest/utils/dist/index.mjs.map +0 -1
- package/dist/node_modules/@vitest/utils/dist/source-map.mjs.map +0 -1
- package/dist/node_modules/chai/index.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/arguments.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/array.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/bigint.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/class.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/date.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/error.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/function.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/helpers.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/html.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/index.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/map.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/number.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/object.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/promise.mjs +0 -6
- package/dist/node_modules/loupe/lib/promise.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/regexp.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/set.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/string.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/symbol.mjs.map +0 -1
- package/dist/node_modules/loupe/lib/typedarray.mjs.map +0 -1
- package/dist/node_modules/magic-string/dist/magic-string.es.mjs.map +0 -1
- package/dist/node_modules/tinyrainbow/dist/chunk-BVHSVHOK.mjs.map +0 -1
- package/dist/node_modules/tinyrainbow/dist/node.mjs.map +0 -1
- package/dist/node_modules/tinyspy/dist/index.mjs.map +0 -1
- package/dist/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.mjs.map +0 -1
- package/dist/node_modules/vitest/dist/chunks/date.W2xKR2qe.mjs.map +0 -1
- package/dist/node_modules/vitest/dist/chunks/utils.C8RiOc4B.mjs.map +0 -1
- package/dist/node_modules/vitest/dist/chunks/vi.DgezovHB.mjs.map +0 -1
- /package/dist/node_modules/{@vitest → .bun/@vitest_runner@2.1.9/node_modules/@vitest}/runner/dist/utils.mjs +0 -0
package/skills/cron/SKILL.md
CHANGED
|
@@ -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
|
|
53
|
-
|
|
54
|
-
| every 20 minutes
|
|
55
|
-
| every hour
|
|
56
|
-
| every day at 8am
|
|
57
|
-
| weekdays at 5pm
|
|
58
|
-
| In 10 minutes
|
|
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 |
|
|
@@ -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
|
package/skills/english/SKILL.md
CHANGED
|
@@ -8,6 +8,7 @@ description: English conversation practice with level-based corrections, vocab t
|
|
|
8
8
|
## Data
|
|
9
9
|
|
|
10
10
|
All data in `data/english/`:
|
|
11
|
+
|
|
11
12
|
- `settings.json` — level preference
|
|
12
13
|
- `vocab.json` — accumulated vocabulary list
|
|
13
14
|
- `sessions.jsonl` — session logs (one JSON object per line)
|
|
@@ -15,11 +16,13 @@ All data in `data/english/`:
|
|
|
15
16
|
## Difficulty Level
|
|
16
17
|
|
|
17
18
|
Settings stored in `data/english/settings.json`:
|
|
19
|
+
|
|
18
20
|
```json
|
|
19
21
|
{ "level": "beginner" }
|
|
20
22
|
```
|
|
21
23
|
|
|
22
24
|
On first activation, if `data/english/settings.json` doesn't exist, ask the user to choose their level:
|
|
25
|
+
|
|
23
26
|
```
|
|
24
27
|
flex_message(template="action_buttons", data={
|
|
25
28
|
prompt: "英語レベルを選んでね!\nChoose your English level:",
|
|
@@ -35,12 +38,12 @@ Save the choice to `data/english/settings.json`. User can change anytime with "
|
|
|
35
38
|
|
|
36
39
|
### Level behavior
|
|
37
40
|
|
|
38
|
-
|
|
|
39
|
-
|
|
40
|
-
| Bot's vocab
|
|
41
|
-
| Corrections
|
|
42
|
-
| Japanese help
|
|
43
|
-
| Sentence length | Short, simple
|
|
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 |
|
|
44
47
|
|
|
45
48
|
## Mode
|
|
46
49
|
|
|
@@ -58,11 +61,12 @@ Casual and natural. Like chatting with a friend.
|
|
|
58
61
|
User: "Yesterday I go to Tokyo"
|
|
59
62
|
Bot: "Oh nice! Where did you go in Tokyo? 🗼
|
|
60
63
|
|
|
61
|
-
(Correction: 'Yesterday I
|
|
64
|
+
(Correction: 'Yesterday I _went_ to Tokyo' - past tense!)"
|
|
62
65
|
|
|
63
66
|
## Corrections
|
|
64
67
|
|
|
65
68
|
Only fix:
|
|
69
|
+
|
|
66
70
|
- Major grammar (tense, word order)
|
|
67
71
|
- Wrong word usage
|
|
68
72
|
- Natural phrasing
|
|
@@ -72,6 +76,7 @@ Adjust strictness per level. Skip minor stuff. Keep flow.
|
|
|
72
76
|
## Topic Selection
|
|
73
77
|
|
|
74
78
|
Use quick_replies directive:
|
|
79
|
+
|
|
75
80
|
```
|
|
76
81
|
What do you want to practice?
|
|
77
82
|
|
|
@@ -81,14 +86,17 @@ What do you want to practice?
|
|
|
81
86
|
## Topic Prompts
|
|
82
87
|
|
|
83
88
|
**Daily life:**
|
|
89
|
+
|
|
84
90
|
- "What did you have for breakfast?"
|
|
85
91
|
- "How do you spend weekends?"
|
|
86
92
|
|
|
87
93
|
**Travel:**
|
|
94
|
+
|
|
88
95
|
- "Where do you want to go next?"
|
|
89
96
|
- "Best place you've visited?"
|
|
90
97
|
|
|
91
98
|
**Work:**
|
|
99
|
+
|
|
92
100
|
- "What do you do?"
|
|
93
101
|
- "Remote or office?"
|
|
94
102
|
|
|
@@ -100,6 +108,7 @@ What do you want to practice?
|
|
|
100
108
|
## Code-switching
|
|
101
109
|
|
|
102
110
|
If user struggles:
|
|
111
|
+
|
|
103
112
|
```
|
|
104
113
|
How was your day? (今日どうだった?)
|
|
105
114
|
```
|
|
@@ -115,20 +124,24 @@ When user says "日本語に戻して" / "exit English" / "おわり":
|
|
|
115
124
|
- An encouraging comment about their performance
|
|
116
125
|
|
|
117
126
|
2. **Save session log** — append one JSON line to `data/english/sessions.jsonl`:
|
|
127
|
+
|
|
118
128
|
```bash
|
|
119
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
|
|
120
130
|
```
|
|
121
131
|
|
|
122
132
|
3. **Update vocab list** — read `data/english/vocab.json`, merge new words, write back:
|
|
133
|
+
|
|
123
134
|
```json
|
|
124
135
|
[
|
|
125
136
|
{ "word": "commute", "meaning": "通勤する", "date": "2025-02-13" },
|
|
126
137
|
{ "word": "grab a bite", "meaning": "軽く食べる", "date": "2025-02-13" }
|
|
127
138
|
]
|
|
128
139
|
```
|
|
140
|
+
|
|
129
141
|
If the file doesn't exist, create it with the new entries. Skip duplicates (same `word`).
|
|
130
142
|
|
|
131
143
|
4. **Send session summary card**:
|
|
144
|
+
|
|
132
145
|
```
|
|
133
146
|
flex_message(template="custom", data={
|
|
134
147
|
title: "📝 English Session",
|
|
@@ -151,6 +164,7 @@ When user says "英語クイズ" / "vocab test" / "復習":
|
|
|
151
164
|
4. Use `action_buttons` for multiple choice if beginner level
|
|
152
165
|
|
|
153
166
|
Example:
|
|
167
|
+
|
|
154
168
|
```
|
|
155
169
|
flex_message(template="action_buttons", data={
|
|
156
170
|
prompt: "What does 'commute' mean?",
|
package/skills/expense/SKILL.md
CHANGED
|
@@ -10,6 +10,7 @@ description: Expense tracker with auto-categorization and monthly receipt summar
|
|
|
10
10
|
User says: "コンビニで500円" / "出費 +380 カフェ" / "ランチ 1200"
|
|
11
11
|
|
|
12
12
|
Log to CSV:
|
|
13
|
+
|
|
13
14
|
```bash
|
|
14
15
|
echo "$(date +%Y-%m-%d),$(date +%H:%M),500,コンビニ,コンビニ" >> data/expense/log.csv
|
|
15
16
|
```
|
|
@@ -18,13 +19,13 @@ Format: `date,time,amount,note,category`
|
|
|
18
19
|
|
|
19
20
|
## Auto-categorize
|
|
20
21
|
|
|
21
|
-
| Keywords
|
|
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,11 +36,13 @@ After recording, confirm with a short text: "✅ 記録: カフェ ¥380"
|
|
|
35
36
|
## Summary
|
|
36
37
|
|
|
37
38
|
Monthly totals:
|
|
39
|
+
|
|
38
40
|
```bash
|
|
39
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
47
|
awk -F, '$1 ~ /^2025-02/ {cat[$5]+=$3} END {for(c in cat) print c, cat[c]}' data/expense/log.csv
|
|
45
48
|
```
|
|
@@ -47,6 +50,7 @@ awk -F, '$1 ~ /^2025-02/ {cat[$5]+=$3} END {for(c in cat) print c, cat[c]}' data
|
|
|
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月の出費",
|
package/skills/fortune/SKILL.md
CHANGED
|
@@ -7,24 +7,25 @@ description: Daily horoscope and zodiac readings. Use when user says 占い, 運
|
|
|
7
7
|
|
|
8
8
|
## 12 Signs
|
|
9
9
|
|
|
10
|
-
| Sign
|
|
11
|
-
|
|
12
|
-
| 牡羊座 | 3/21-4/19
|
|
13
|
-
| 牡牛座 | 4/20-5/20
|
|
14
|
-
| 双子座 | 5/21-6/21
|
|
15
|
-
| 蟹座
|
|
16
|
-
| 獅子座 | 7/23-8/22
|
|
17
|
-
| 乙女座 | 8/23-9/22
|
|
18
|
-
| 天秤座 | 9/23-10/23
|
|
19
|
-
| 蠍座
|
|
20
|
-
| 射手座 | 11/23-12/21 | ♐
|
|
21
|
-
| 山羊座 | 12/22-1/19
|
|
22
|
-
| 水瓶座 | 1/20-2/18
|
|
23
|
-
| 魚座
|
|
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つ"
|
package/skills/habit/SKILL.md
CHANGED
|
@@ -8,6 +8,7 @@ description: Habit tracker with streak counting and weekly summaries. Use when u
|
|
|
8
8
|
## Setup
|
|
9
9
|
|
|
10
10
|
Store habits in `data/habit/config.json`:
|
|
11
|
+
|
|
11
12
|
```json
|
|
12
13
|
{
|
|
13
14
|
"habits": [
|
|
@@ -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: "今日まだ瞑想してないよ〜"
|
|
@@ -10,6 +10,7 @@ description: Water intake tracker with reminders and progress display. Use when
|
|
|
10
10
|
User says: "水飲んだ" / "一杯飲んだ" / "+1"
|
|
11
11
|
|
|
12
12
|
Log:
|
|
13
|
+
|
|
13
14
|
```bash
|
|
14
15
|
echo "$(date -Iseconds)|1" >> data/hydration/log.csv
|
|
15
16
|
```
|
|
@@ -25,6 +26,7 @@ grep "$(date +%Y-%m-%d)" data/hydration/log.csv | 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,6 +49,7 @@ cron(action="add", message="水飲んだ?リマインド送って", every_seco
|
|
|
47
49
|
## Reset
|
|
48
50
|
|
|
49
51
|
Archive at midnight:
|
|
52
|
+
|
|
50
53
|
```bash
|
|
51
54
|
[ -f data/hydration/log.csv ] && mv data/hydration/log.csv data/hydration/log-$(date +%Y-%m-%d).csv
|
|
52
55
|
```
|
package/skills/memory/SKILL.md
CHANGED
|
@@ -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")
|
package/skills/mood/SKILL.md
CHANGED
|
@@ -11,14 +11,15 @@ User says: "今日はいい感じ" / "気分いい" / "だるい" / "疲れた"
|
|
|
11
11
|
|
|
12
12
|
Map to emoji + score:
|
|
13
13
|
|
|
14
|
-
| Input patterns
|
|
15
|
-
|
|
16
|
-
| いい, 最高, 😊, 🥰, 嬉しい | 😊
|
|
17
|
-
| まあまあ, 普通, 😐
|
|
18
|
-
| だるい, 疲れた, 😔, 悲しい | 😔
|
|
19
|
-
| 最悪, 😢, 辛い
|
|
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
24
|
echo "$(date +%Y-%m-%d),$(date +%H:%M),😊,5,今日はいい感じ" >> data/mood/log.csv
|
|
24
25
|
```
|
|
@@ -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,6 +51,7 @@ cron(action="add", message="気分チェックインのカードを送って", c
|
|
|
48
51
|
## Summary
|
|
49
52
|
|
|
50
53
|
Calculate average:
|
|
54
|
+
|
|
51
55
|
```bash
|
|
52
56
|
awk -F, 'NR>7 {sum+=$4; count++} END {print "avg:", sum/count}' data/mood/log.csv
|
|
53
57
|
```
|
|
@@ -100,6 +100,7 @@ Available templates: `fortune`, `info_card`, `action_buttons`, `receipt`, `morni
|
|
|
100
100
|
#### Custom template
|
|
101
101
|
|
|
102
102
|
Single card with auto-built layout:
|
|
103
|
+
|
|
103
104
|
```
|
|
104
105
|
flex_message(template="custom", data={
|
|
105
106
|
title: "カードタイトル",
|
|
@@ -115,6 +116,7 @@ flex_message(template="custom", data={
|
|
|
115
116
|
```
|
|
116
117
|
|
|
117
118
|
Carousel (horizontally swipeable cards):
|
|
119
|
+
|
|
118
120
|
```
|
|
119
121
|
flex_message(template="custom", data={
|
|
120
122
|
bubbles: [
|
|
@@ -127,6 +129,7 @@ flex_message(template="custom", data={
|
|
|
127
129
|
#### Output section for skills using flex
|
|
128
130
|
|
|
129
131
|
The card is **auto-sent** when the tool returns. Include this in SKILL.md:
|
|
132
|
+
|
|
130
133
|
```markdown
|
|
131
134
|
## Output
|
|
132
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
|
package/skills/weather/SKILL.md
CHANGED
|
@@ -66,16 +66,17 @@ Weather codes: 0=晴れ, 1-3=曇り, 45-48=霧, 51-67=雨, 71-77=雪, 80-82=に
|
|
|
66
66
|
|
|
67
67
|
Based on **feels like** temp:
|
|
68
68
|
|
|
69
|
-
| Feels Like | Suggestion
|
|
70
|
-
|
|
71
|
-
| < 0°C
|
|
72
|
-
| 0-10°C
|
|
73
|
-
| 10-15°C
|
|
74
|
-
| 15-20°C
|
|
75
|
-
| 20-25°C
|
|
76
|
-
| > 25°C
|
|
69
|
+
| Feels Like | Suggestion |
|
|
70
|
+
| ---------- | --------------------------- |
|
|
71
|
+
| < 0°C | ダウン、マフラー、手袋 🧥🧤 |
|
|
72
|
+
| 0-10°C | コート + ヒートテック |
|
|
73
|
+
| 10-15°C | ジャケット or カーディガン |
|
|
74
|
+
| 15-20°C | 薄手アウター持参 |
|
|
75
|
+
| 20-25°C | 長袖でOK |
|
|
76
|
+
| > 25°C | 半袖、日焼け止め ☀️ |
|
|
77
77
|
|
|
78
78
|
Additional:
|
|
79
|
+
|
|
79
80
|
- 雨/雪: 傘 ☔
|
|
80
81
|
- 風強い: 帽子注意 💨
|
|
81
82
|
|
|
@@ -86,6 +87,7 @@ Additional:
|
|
|
86
87
|
**ALWAYS use `flex_message`** to display weather results. The card is auto-sent.
|
|
87
88
|
|
|
88
89
|
Color the header based on conditions:
|
|
90
|
+
|
|
89
91
|
- 晴れ: `#1DB446` (green)
|
|
90
92
|
- 曇り: `#607D8B` (grey)
|
|
91
93
|
- 雨/雪: `#2196F3` (blue)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sourcemap-codec.mjs","names":[],"sources":["../../../../../node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs"],"sourcesContent":["// src/vlq.ts\nvar comma = \",\".charCodeAt(0);\nvar semicolon = \";\".charCodeAt(0);\nvar chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar intToChar = new Uint8Array(64);\nvar charToInt = new Uint8Array(128);\nfor (let i = 0; i < chars.length; i++) {\n const c = chars.charCodeAt(i);\n intToChar[i] = c;\n charToInt[c] = i;\n}\nfunction decodeInteger(reader, relative) {\n let value = 0;\n let shift = 0;\n let integer = 0;\n do {\n const c = reader.next();\n integer = charToInt[c];\n value |= (integer & 31) << shift;\n shift += 5;\n } while (integer & 32);\n const shouldNegate = value & 1;\n value >>>= 1;\n if (shouldNegate) {\n value = -2147483648 | -value;\n }\n return relative + value;\n}\nfunction encodeInteger(builder, num, relative) {\n let delta = num - relative;\n delta = delta < 0 ? -delta << 1 | 1 : delta << 1;\n do {\n let clamped = delta & 31;\n delta >>>= 5;\n if (delta > 0) clamped |= 32;\n builder.write(intToChar[clamped]);\n } while (delta > 0);\n return num;\n}\nfunction hasMoreVlq(reader, max) {\n if (reader.pos >= max) return false;\n return reader.peek() !== comma;\n}\n\n// src/strings.ts\nvar bufLength = 1024 * 16;\nvar td = typeof TextDecoder !== \"undefined\" ? /* @__PURE__ */ new TextDecoder() : typeof Buffer !== \"undefined\" ? {\n decode(buf) {\n const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);\n return out.toString();\n }\n} : {\n decode(buf) {\n let out = \"\";\n for (let i = 0; i < buf.length; i++) {\n out += String.fromCharCode(buf[i]);\n }\n return out;\n }\n};\nvar StringWriter = class {\n constructor() {\n this.pos = 0;\n this.out = \"\";\n this.buffer = new Uint8Array(bufLength);\n }\n write(v) {\n const { buffer } = this;\n buffer[this.pos++] = v;\n if (this.pos === bufLength) {\n this.out += td.decode(buffer);\n this.pos = 0;\n }\n }\n flush() {\n const { buffer, out, pos } = this;\n return pos > 0 ? out + td.decode(buffer.subarray(0, pos)) : out;\n }\n};\nvar StringReader = class {\n constructor(buffer) {\n this.pos = 0;\n this.buffer = buffer;\n }\n next() {\n return this.buffer.charCodeAt(this.pos++);\n }\n peek() {\n return this.buffer.charCodeAt(this.pos);\n }\n indexOf(char) {\n const { buffer, pos } = this;\n const idx = buffer.indexOf(char, pos);\n return idx === -1 ? buffer.length : idx;\n }\n};\n\n// src/scopes.ts\nvar EMPTY = [];\nfunction decodeOriginalScopes(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const scopes = [];\n const stack = [];\n let line = 0;\n for (; reader.pos < length; reader.pos++) {\n line = decodeInteger(reader, line);\n const column = decodeInteger(reader, 0);\n if (!hasMoreVlq(reader, length)) {\n const last = stack.pop();\n last[2] = line;\n last[3] = column;\n continue;\n }\n const kind = decodeInteger(reader, 0);\n const fields = decodeInteger(reader, 0);\n const hasName = fields & 1;\n const scope = hasName ? [line, column, 0, 0, kind, decodeInteger(reader, 0)] : [line, column, 0, 0, kind];\n let vars = EMPTY;\n if (hasMoreVlq(reader, length)) {\n vars = [];\n do {\n const varsIndex = decodeInteger(reader, 0);\n vars.push(varsIndex);\n } while (hasMoreVlq(reader, length));\n }\n scope.vars = vars;\n scopes.push(scope);\n stack.push(scope);\n }\n return scopes;\n}\nfunction encodeOriginalScopes(scopes) {\n const writer = new StringWriter();\n for (let i = 0; i < scopes.length; ) {\n i = _encodeOriginalScopes(scopes, i, writer, [0]);\n }\n return writer.flush();\n}\nfunction _encodeOriginalScopes(scopes, index, writer, state) {\n const scope = scopes[index];\n const { 0: startLine, 1: startColumn, 2: endLine, 3: endColumn, 4: kind, vars } = scope;\n if (index > 0) writer.write(comma);\n state[0] = encodeInteger(writer, startLine, state[0]);\n encodeInteger(writer, startColumn, 0);\n encodeInteger(writer, kind, 0);\n const fields = scope.length === 6 ? 1 : 0;\n encodeInteger(writer, fields, 0);\n if (scope.length === 6) encodeInteger(writer, scope[5], 0);\n for (const v of vars) {\n encodeInteger(writer, v, 0);\n }\n for (index++; index < scopes.length; ) {\n const next = scopes[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || l === endLine && c >= endColumn) {\n break;\n }\n index = _encodeOriginalScopes(scopes, index, writer, state);\n }\n writer.write(comma);\n state[0] = encodeInteger(writer, endLine, state[0]);\n encodeInteger(writer, endColumn, 0);\n return index;\n}\nfunction decodeGeneratedRanges(input) {\n const { length } = input;\n const reader = new StringReader(input);\n const ranges = [];\n const stack = [];\n let genLine = 0;\n let definitionSourcesIndex = 0;\n let definitionScopeIndex = 0;\n let callsiteSourcesIndex = 0;\n let callsiteLine = 0;\n let callsiteColumn = 0;\n let bindingLine = 0;\n let bindingColumn = 0;\n do {\n const semi = reader.indexOf(\";\");\n let genColumn = 0;\n for (; reader.pos < semi; reader.pos++) {\n genColumn = decodeInteger(reader, genColumn);\n if (!hasMoreVlq(reader, semi)) {\n const last = stack.pop();\n last[2] = genLine;\n last[3] = genColumn;\n continue;\n }\n const fields = decodeInteger(reader, 0);\n const hasDefinition = fields & 1;\n const hasCallsite = fields & 2;\n const hasScope = fields & 4;\n let callsite = null;\n let bindings = EMPTY;\n let range;\n if (hasDefinition) {\n const defSourcesIndex = decodeInteger(reader, definitionSourcesIndex);\n definitionScopeIndex = decodeInteger(\n reader,\n definitionSourcesIndex === defSourcesIndex ? definitionScopeIndex : 0\n );\n definitionSourcesIndex = defSourcesIndex;\n range = [genLine, genColumn, 0, 0, defSourcesIndex, definitionScopeIndex];\n } else {\n range = [genLine, genColumn, 0, 0];\n }\n range.isScope = !!hasScope;\n if (hasCallsite) {\n const prevCsi = callsiteSourcesIndex;\n const prevLine = callsiteLine;\n callsiteSourcesIndex = decodeInteger(reader, callsiteSourcesIndex);\n const sameSource = prevCsi === callsiteSourcesIndex;\n callsiteLine = decodeInteger(reader, sameSource ? callsiteLine : 0);\n callsiteColumn = decodeInteger(\n reader,\n sameSource && prevLine === callsiteLine ? callsiteColumn : 0\n );\n callsite = [callsiteSourcesIndex, callsiteLine, callsiteColumn];\n }\n range.callsite = callsite;\n if (hasMoreVlq(reader, semi)) {\n bindings = [];\n do {\n bindingLine = genLine;\n bindingColumn = genColumn;\n const expressionsCount = decodeInteger(reader, 0);\n let expressionRanges;\n if (expressionsCount < -1) {\n expressionRanges = [[decodeInteger(reader, 0)]];\n for (let i = -1; i > expressionsCount; i--) {\n const prevBl = bindingLine;\n bindingLine = decodeInteger(reader, bindingLine);\n bindingColumn = decodeInteger(reader, bindingLine === prevBl ? bindingColumn : 0);\n const expression = decodeInteger(reader, 0);\n expressionRanges.push([expression, bindingLine, bindingColumn]);\n }\n } else {\n expressionRanges = [[expressionsCount]];\n }\n bindings.push(expressionRanges);\n } while (hasMoreVlq(reader, semi));\n }\n range.bindings = bindings;\n ranges.push(range);\n stack.push(range);\n }\n genLine++;\n reader.pos = semi + 1;\n } while (reader.pos < length);\n return ranges;\n}\nfunction encodeGeneratedRanges(ranges) {\n if (ranges.length === 0) return \"\";\n const writer = new StringWriter();\n for (let i = 0; i < ranges.length; ) {\n i = _encodeGeneratedRanges(ranges, i, writer, [0, 0, 0, 0, 0, 0, 0]);\n }\n return writer.flush();\n}\nfunction _encodeGeneratedRanges(ranges, index, writer, state) {\n const range = ranges[index];\n const {\n 0: startLine,\n 1: startColumn,\n 2: endLine,\n 3: endColumn,\n isScope,\n callsite,\n bindings\n } = range;\n if (state[0] < startLine) {\n catchupLine(writer, state[0], startLine);\n state[0] = startLine;\n state[1] = 0;\n } else if (index > 0) {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, range[1], state[1]);\n const fields = (range.length === 6 ? 1 : 0) | (callsite ? 2 : 0) | (isScope ? 4 : 0);\n encodeInteger(writer, fields, 0);\n if (range.length === 6) {\n const { 4: sourcesIndex, 5: scopesIndex } = range;\n if (sourcesIndex !== state[2]) {\n state[3] = 0;\n }\n state[2] = encodeInteger(writer, sourcesIndex, state[2]);\n state[3] = encodeInteger(writer, scopesIndex, state[3]);\n }\n if (callsite) {\n const { 0: sourcesIndex, 1: callLine, 2: callColumn } = range.callsite;\n if (sourcesIndex !== state[4]) {\n state[5] = 0;\n state[6] = 0;\n } else if (callLine !== state[5]) {\n state[6] = 0;\n }\n state[4] = encodeInteger(writer, sourcesIndex, state[4]);\n state[5] = encodeInteger(writer, callLine, state[5]);\n state[6] = encodeInteger(writer, callColumn, state[6]);\n }\n if (bindings) {\n for (const binding of bindings) {\n if (binding.length > 1) encodeInteger(writer, -binding.length, 0);\n const expression = binding[0][0];\n encodeInteger(writer, expression, 0);\n let bindingStartLine = startLine;\n let bindingStartColumn = startColumn;\n for (let i = 1; i < binding.length; i++) {\n const expRange = binding[i];\n bindingStartLine = encodeInteger(writer, expRange[1], bindingStartLine);\n bindingStartColumn = encodeInteger(writer, expRange[2], bindingStartColumn);\n encodeInteger(writer, expRange[0], 0);\n }\n }\n }\n for (index++; index < ranges.length; ) {\n const next = ranges[index];\n const { 0: l, 1: c } = next;\n if (l > endLine || l === endLine && c >= endColumn) {\n break;\n }\n index = _encodeGeneratedRanges(ranges, index, writer, state);\n }\n if (state[0] < endLine) {\n catchupLine(writer, state[0], endLine);\n state[0] = endLine;\n state[1] = 0;\n } else {\n writer.write(comma);\n }\n state[1] = encodeInteger(writer, endColumn, state[1]);\n return index;\n}\nfunction catchupLine(writer, lastLine, line) {\n do {\n writer.write(semicolon);\n } while (++lastLine < line);\n}\n\n// src/sourcemap-codec.ts\nfunction decode(mappings) {\n const { length } = mappings;\n const reader = new StringReader(mappings);\n const decoded = [];\n let genColumn = 0;\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n do {\n const semi = reader.indexOf(\";\");\n const line = [];\n let sorted = true;\n let lastCol = 0;\n genColumn = 0;\n while (reader.pos < semi) {\n let seg;\n genColumn = decodeInteger(reader, genColumn);\n if (genColumn < lastCol) sorted = false;\n lastCol = genColumn;\n if (hasMoreVlq(reader, semi)) {\n sourcesIndex = decodeInteger(reader, sourcesIndex);\n sourceLine = decodeInteger(reader, sourceLine);\n sourceColumn = decodeInteger(reader, sourceColumn);\n if (hasMoreVlq(reader, semi)) {\n namesIndex = decodeInteger(reader, namesIndex);\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex];\n } else {\n seg = [genColumn, sourcesIndex, sourceLine, sourceColumn];\n }\n } else {\n seg = [genColumn];\n }\n line.push(seg);\n reader.pos++;\n }\n if (!sorted) sort(line);\n decoded.push(line);\n reader.pos = semi + 1;\n } while (reader.pos <= length);\n return decoded;\n}\nfunction sort(line) {\n line.sort(sortComparator);\n}\nfunction sortComparator(a, b) {\n return a[0] - b[0];\n}\nfunction encode(decoded) {\n const writer = new StringWriter();\n let sourcesIndex = 0;\n let sourceLine = 0;\n let sourceColumn = 0;\n let namesIndex = 0;\n for (let i = 0; i < decoded.length; i++) {\n const line = decoded[i];\n if (i > 0) writer.write(semicolon);\n if (line.length === 0) continue;\n let genColumn = 0;\n for (let j = 0; j < line.length; j++) {\n const segment = line[j];\n if (j > 0) writer.write(comma);\n genColumn = encodeInteger(writer, segment[0], genColumn);\n if (segment.length === 1) continue;\n sourcesIndex = encodeInteger(writer, segment[1], sourcesIndex);\n sourceLine = encodeInteger(writer, segment[2], sourceLine);\n sourceColumn = encodeInteger(writer, segment[3], sourceColumn);\n if (segment.length === 4) continue;\n namesIndex = encodeInteger(writer, segment[4], namesIndex);\n }\n }\n return writer.flush();\n}\nexport {\n decode,\n decodeGeneratedRanges,\n decodeOriginalScopes,\n encode,\n encodeGeneratedRanges,\n encodeOriginalScopes\n};\n//# sourceMappingURL=sourcemap-codec.mjs.map\n"],"x_google_ignoreList":[0],"mappings":";AACA,IAAI,QAAQ,IAAI,WAAW,EAAE;AAC7B,IAAI,YAAY,IAAI,WAAW,EAAE;AACjC,IAAI,QAAQ;AACZ,IAAI,YAAY,IAAI,WAAW,GAAG;AAClC,IAAI,YAAY,IAAI,WAAW,IAAI;AACnC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;CACrC,MAAM,IAAI,MAAM,WAAW,EAAE;AAC7B,WAAU,KAAK;AACf,WAAU,KAAK;;AAmBjB,SAAS,cAAc,SAAS,KAAK,UAAU;CAC7C,IAAI,QAAQ,MAAM;AAClB,SAAQ,QAAQ,IAAI,CAAC,SAAS,IAAI,IAAI,SAAS;AAC/C,IAAG;EACD,IAAI,UAAU,QAAQ;AACtB,aAAW;AACX,MAAI,QAAQ,EAAG,YAAW;AAC1B,UAAQ,MAAM,UAAU,SAAS;UAC1B,QAAQ;AACjB,QAAO;;AAQT,IAAI,YAAY,OAAO;AACvB,IAAI,KAAK,OAAO,gBAAgB,8BAA8B,IAAI,aAAa,GAAG,OAAO,WAAW,cAAc,EAChH,OAAO,KAAK;AAEV,QADY,OAAO,KAAK,IAAI,QAAQ,IAAI,YAAY,IAAI,WAAW,CACxD,UAAU;GAExB,GAAG,EACF,OAAO,KAAK;CACV,IAAI,MAAM;AACV,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,IAC9B,QAAO,OAAO,aAAa,IAAI,GAAG;AAEpC,QAAO;GAEV;AACD,IAAI,eAAe,MAAM;CACvB,cAAc;AACZ,OAAK,MAAM;AACX,OAAK,MAAM;AACX,OAAK,SAAS,IAAI,WAAW,UAAU;;CAEzC,MAAM,GAAG;EACP,MAAM,EAAE,WAAW;AACnB,SAAO,KAAK,SAAS;AACrB,MAAI,KAAK,QAAQ,WAAW;AAC1B,QAAK,OAAO,GAAG,OAAO,OAAO;AAC7B,QAAK,MAAM;;;CAGf,QAAQ;EACN,MAAM,EAAE,QAAQ,KAAK,QAAQ;AAC7B,SAAO,MAAM,IAAI,MAAM,GAAG,OAAO,OAAO,SAAS,GAAG,IAAI,CAAC,GAAG;;;AAyThE,SAAS,OAAO,SAAS;CACvB,MAAM,SAAS,IAAI,cAAc;CACjC,IAAI,eAAe;CACnB,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,IAAI,aAAa;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,OAAO,QAAQ;AACrB,MAAI,IAAI,EAAG,QAAO,MAAM,UAAU;AAClC,MAAI,KAAK,WAAW,EAAG;EACvB,IAAI,YAAY;AAChB,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;GACpC,MAAM,UAAU,KAAK;AACrB,OAAI,IAAI,EAAG,QAAO,MAAM,MAAM;AAC9B,eAAY,cAAc,QAAQ,QAAQ,IAAI,UAAU;AACxD,OAAI,QAAQ,WAAW,EAAG;AAC1B,kBAAe,cAAc,QAAQ,QAAQ,IAAI,aAAa;AAC9D,gBAAa,cAAc,QAAQ,QAAQ,IAAI,WAAW;AAC1D,kBAAe,cAAc,QAAQ,QAAQ,IAAI,aAAa;AAC9D,OAAI,QAAQ,WAAW,EAAG;AAC1B,gBAAa,cAAc,QAAQ,QAAQ,IAAI,WAAW;;;AAG9D,QAAO,OAAO,OAAO"}
|