pickle-bot 0.1.1__tar.gz

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 (156) hide show
  1. pickle_bot-0.1.1/.dockerignore +9 -0
  2. pickle_bot-0.1.1/.github/dependabot.yml +8 -0
  3. pickle_bot-0.1.1/.github/workflows/publish.yml +61 -0
  4. pickle_bot-0.1.1/.github/workflows/test.yml +40 -0
  5. pickle_bot-0.1.1/.gitignore +13 -0
  6. pickle_bot-0.1.1/.python-version +1 -0
  7. pickle_bot-0.1.1/CLAUDE.md +51 -0
  8. pickle_bot-0.1.1/Dockerfile +19 -0
  9. pickle_bot-0.1.1/PKG-INFO +119 -0
  10. pickle_bot-0.1.1/PickleBotCover.png +0 -0
  11. pickle_bot-0.1.1/README.md +79 -0
  12. pickle_bot-0.1.1/compose.yaml +10 -0
  13. pickle_bot-0.1.1/default_workspace/agents/cookie/AGENT.md +68 -0
  14. pickle_bot-0.1.1/default_workspace/agents/pickle/AGENT.md +40 -0
  15. pickle_bot-0.1.1/default_workspace/skills/cron-ops/SKILL.md +77 -0
  16. pickle_bot-0.1.1/default_workspace/skills/skill-creator/SKILL.md +343 -0
  17. pickle_bot-0.1.1/default_workspace/skills/skill-creator/scripts/init_skill.py +303 -0
  18. pickle_bot-0.1.1/docs/architecture.md +499 -0
  19. pickle_bot-0.1.1/docs/configuration.md +175 -0
  20. pickle_bot-0.1.1/docs/features.md +186 -0
  21. pickle_bot-0.1.1/docs/messagebus-setup.md +56 -0
  22. pickle_bot-0.1.1/docs/plans/2026-02-23-agent-concurrency-design.md +258 -0
  23. pickle_bot-0.1.1/docs/plans/2026-02-23-agent-concurrency-impl.md +1020 -0
  24. pickle_bot-0.1.1/docs/plans/2026-02-23-onboarding-modular-refactor-design.md +193 -0
  25. pickle_bot-0.1.1/docs/plans/2026-02-23-onboarding-modular-refactor-impl.md +1412 -0
  26. pickle_bot-0.1.1/docs/plans/2026-02-23-pypi-publishing-design.md +159 -0
  27. pickle_bot-0.1.1/docs/plans/2026-02-23-pypi-publishing-impl.md +274 -0
  28. pickle_bot-0.1.1/docs/plans/2026-02-23-subagent-concurrency-design.md +204 -0
  29. pickle_bot-0.1.1/docs/plans/2026-02-23-subagent-concurrency-implementation.md +945 -0
  30. pickle_bot-0.1.1/docs/plans/2026-02-23-web-search-read-design.md +320 -0
  31. pickle_bot-0.1.1/docs/plans/2026-02-23-web-search-read-impl.md +1390 -0
  32. pickle_bot-0.1.1/docs/plans/2026-02-23-web-tools-onboarding-design.md +121 -0
  33. pickle_bot-0.1.1/docs/plans/2026-02-23-web-tools-onboarding-impl.md +374 -0
  34. pickle_bot-0.1.1/docs/plans/2026-02-24-default-agents-skills-design.md +173 -0
  35. pickle_bot-0.1.1/docs/plans/2026-02-24-default-agents-skills-impl.md +375 -0
  36. pickle_bot-0.1.1/docs/plans/2026-02-24-docs-refresh-design.md +113 -0
  37. pickle_bot-0.1.1/docs/plans/2026-02-24-docs-refresh-impl.md +421 -0
  38. pickle_bot-0.1.1/docs/plans/2026-02-24-simplify-api-config-design.md +46 -0
  39. pickle_bot-0.1.1/docs/plans/2026-02-24-simplify-api-config-impl.md +281 -0
  40. pickle_bot-0.1.1/main.py +6 -0
  41. pickle_bot-0.1.1/pyproject.toml +88 -0
  42. pickle_bot-0.1.1/src/picklebot/__init__.py +3 -0
  43. pickle_bot-0.1.1/src/picklebot/api/__init__.py +5 -0
  44. pickle_bot-0.1.1/src/picklebot/api/app.py +33 -0
  45. pickle_bot-0.1.1/src/picklebot/api/deps.py +10 -0
  46. pickle_bot-0.1.1/src/picklebot/api/routers/__init__.py +1 -0
  47. pickle_bot-0.1.1/src/picklebot/api/routers/agents.py +89 -0
  48. pickle_bot-0.1.1/src/picklebot/api/routers/config.py +52 -0
  49. pickle_bot-0.1.1/src/picklebot/api/routers/crons.py +83 -0
  50. pickle_bot-0.1.1/src/picklebot/api/routers/memories.py +97 -0
  51. pickle_bot-0.1.1/src/picklebot/api/routers/sessions.py +69 -0
  52. pickle_bot-0.1.1/src/picklebot/api/routers/skills.py +83 -0
  53. pickle_bot-0.1.1/src/picklebot/api/schemas.py +60 -0
  54. pickle_bot-0.1.1/src/picklebot/cli/__init__.py +5 -0
  55. pickle_bot-0.1.1/src/picklebot/cli/chat.py +80 -0
  56. pickle_bot-0.1.1/src/picklebot/cli/main.py +104 -0
  57. pickle_bot-0.1.1/src/picklebot/cli/onboarding/__init__.py +5 -0
  58. pickle_bot-0.1.1/src/picklebot/cli/onboarding/steps.py +348 -0
  59. pickle_bot-0.1.1/src/picklebot/cli/onboarding/wizard.py +57 -0
  60. pickle_bot-0.1.1/src/picklebot/cli/server.py +25 -0
  61. pickle_bot-0.1.1/src/picklebot/core/__init__.py +20 -0
  62. pickle_bot-0.1.1/src/picklebot/core/agent.py +335 -0
  63. pickle_bot-0.1.1/src/picklebot/core/agent_loader.py +121 -0
  64. pickle_bot-0.1.1/src/picklebot/core/context.py +40 -0
  65. pickle_bot-0.1.1/src/picklebot/core/cron_loader.py +119 -0
  66. pickle_bot-0.1.1/src/picklebot/core/history.py +298 -0
  67. pickle_bot-0.1.1/src/picklebot/core/skill_loader.py +88 -0
  68. pickle_bot-0.1.1/src/picklebot/frontend/__init__.py +7 -0
  69. pickle_bot-0.1.1/src/picklebot/frontend/base.py +58 -0
  70. pickle_bot-0.1.1/src/picklebot/frontend/console.py +55 -0
  71. pickle_bot-0.1.1/src/picklebot/frontend/messagebus.py +64 -0
  72. pickle_bot-0.1.1/src/picklebot/messagebus/__init__.py +7 -0
  73. pickle_bot-0.1.1/src/picklebot/messagebus/base.py +108 -0
  74. pickle_bot-0.1.1/src/picklebot/messagebus/discord_bus.py +166 -0
  75. pickle_bot-0.1.1/src/picklebot/messagebus/telegram_bus.py +175 -0
  76. pickle_bot-0.1.1/src/picklebot/provider/__init__.py +0 -0
  77. pickle_bot-0.1.1/src/picklebot/provider/llm/__init__.py +11 -0
  78. pickle_bot-0.1.1/src/picklebot/provider/llm/base.py +134 -0
  79. pickle_bot-0.1.1/src/picklebot/provider/llm/providers.py +25 -0
  80. pickle_bot-0.1.1/src/picklebot/provider/web_read/__init__.py +5 -0
  81. pickle_bot-0.1.1/src/picklebot/provider/web_read/base.py +58 -0
  82. pickle_bot-0.1.1/src/picklebot/provider/web_read/crawl4ai.py +43 -0
  83. pickle_bot-0.1.1/src/picklebot/provider/web_search/__init__.py +5 -0
  84. pickle_bot-0.1.1/src/picklebot/provider/web_search/base.py +59 -0
  85. pickle_bot-0.1.1/src/picklebot/provider/web_search/brave.py +63 -0
  86. pickle_bot-0.1.1/src/picklebot/server/__init__.py +6 -0
  87. pickle_bot-0.1.1/src/picklebot/server/agent_worker.py +136 -0
  88. pickle_bot-0.1.1/src/picklebot/server/base.py +70 -0
  89. pickle_bot-0.1.1/src/picklebot/server/cron_worker.py +93 -0
  90. pickle_bot-0.1.1/src/picklebot/server/messagebus_worker.py +101 -0
  91. pickle_bot-0.1.1/src/picklebot/server/server.py +100 -0
  92. pickle_bot-0.1.1/src/picklebot/tools/__init__.py +6 -0
  93. pickle_bot-0.1.1/src/picklebot/tools/base.py +73 -0
  94. pickle_bot-0.1.1/src/picklebot/tools/builtin_tools.py +132 -0
  95. pickle_bot-0.1.1/src/picklebot/tools/post_message_tool.py +69 -0
  96. pickle_bot-0.1.1/src/picklebot/tools/registry.py +69 -0
  97. pickle_bot-0.1.1/src/picklebot/tools/skill_tool.py +62 -0
  98. pickle_bot-0.1.1/src/picklebot/tools/subagent_tool.py +114 -0
  99. pickle_bot-0.1.1/src/picklebot/tools/webread_tool.py +62 -0
  100. pickle_bot-0.1.1/src/picklebot/tools/websearch_tool.py +65 -0
  101. pickle_bot-0.1.1/src/picklebot/utils/__init__.py +17 -0
  102. pickle_bot-0.1.1/src/picklebot/utils/config.py +287 -0
  103. pickle_bot-0.1.1/src/picklebot/utils/def_loader.py +183 -0
  104. pickle_bot-0.1.1/src/picklebot/utils/logging.py +38 -0
  105. pickle_bot-0.1.1/tests/api/__init__.py +1 -0
  106. pickle_bot-0.1.1/tests/api/test_agents.py +149 -0
  107. pickle_bot-0.1.1/tests/api/test_config.py +154 -0
  108. pickle_bot-0.1.1/tests/api/test_crons.py +200 -0
  109. pickle_bot-0.1.1/tests/api/test_memories.py +223 -0
  110. pickle_bot-0.1.1/tests/api/test_sessions.py +176 -0
  111. pickle_bot-0.1.1/tests/api/test_skills.py +151 -0
  112. pickle_bot-0.1.1/tests/cli/__init__.py +0 -0
  113. pickle_bot-0.1.1/tests/cli/onboarding/__init__.py +0 -0
  114. pickle_bot-0.1.1/tests/cli/onboarding/test_steps.py +491 -0
  115. pickle_bot-0.1.1/tests/cli/onboarding/test_wizard.py +39 -0
  116. pickle_bot-0.1.1/tests/cli/test_main.py +51 -0
  117. pickle_bot-0.1.1/tests/cli/test_server.py +81 -0
  118. pickle_bot-0.1.1/tests/conftest.py +75 -0
  119. pickle_bot-0.1.1/tests/core/__init__.py +1 -0
  120. pickle_bot-0.1.1/tests/core/test_agent.py +158 -0
  121. pickle_bot-0.1.1/tests/core/test_agent_loader.py +344 -0
  122. pickle_bot-0.1.1/tests/core/test_context.py +19 -0
  123. pickle_bot-0.1.1/tests/core/test_cron_loader.py +150 -0
  124. pickle_bot-0.1.1/tests/core/test_history.py +500 -0
  125. pickle_bot-0.1.1/tests/core/test_session.py +45 -0
  126. pickle_bot-0.1.1/tests/core/test_skill_loader.py +166 -0
  127. pickle_bot-0.1.1/tests/frontend/__init__.py +1 -0
  128. pickle_bot-0.1.1/tests/frontend/test_messagebus_frontend.py +111 -0
  129. pickle_bot-0.1.1/tests/messagebus/__init__.py +0 -0
  130. pickle_bot-0.1.1/tests/messagebus/test_base.py +152 -0
  131. pickle_bot-0.1.1/tests/messagebus/test_discord_bus.py +167 -0
  132. pickle_bot-0.1.1/tests/messagebus/test_telegram_bus.py +216 -0
  133. pickle_bot-0.1.1/tests/provider/test_base.py +29 -0
  134. pickle_bot-0.1.1/tests/provider/test_brave_search.py +80 -0
  135. pickle_bot-0.1.1/tests/provider/test_crawl4ai.py +92 -0
  136. pickle_bot-0.1.1/tests/provider/test_web_read_base.py +42 -0
  137. pickle_bot-0.1.1/tests/provider/test_web_search_base.py +31 -0
  138. pickle_bot-0.1.1/tests/server/__init__.py +1 -0
  139. pickle_bot-0.1.1/tests/server/test_agent_worker.py +626 -0
  140. pickle_bot-0.1.1/tests/server/test_base.py +21 -0
  141. pickle_bot-0.1.1/tests/server/test_cron_worker.py +134 -0
  142. pickle_bot-0.1.1/tests/server/test_messagebus_worker.py +283 -0
  143. pickle_bot-0.1.1/tests/server/test_server.py +85 -0
  144. pickle_bot-0.1.1/tests/tools/__init__.py +0 -0
  145. pickle_bot-0.1.1/tests/tools/test_agent_web_tools.py +59 -0
  146. pickle_bot-0.1.1/tests/tools/test_post_message_tool.py +117 -0
  147. pickle_bot-0.1.1/tests/tools/test_registry.py +119 -0
  148. pickle_bot-0.1.1/tests/tools/test_skill_tool.py +134 -0
  149. pickle_bot-0.1.1/tests/tools/test_subagent_tool.py +362 -0
  150. pickle_bot-0.1.1/tests/tools/test_webread_tool.py +87 -0
  151. pickle_bot-0.1.1/tests/tools/test_websearch_tool.py +87 -0
  152. pickle_bot-0.1.1/tests/utils/__init__.py +1 -0
  153. pickle_bot-0.1.1/tests/utils/test_config.py +271 -0
  154. pickle_bot-0.1.1/tests/utils/test_config_files.py +140 -0
  155. pickle_bot-0.1.1/tests/utils/test_def_loader.py +309 -0
  156. pickle_bot-0.1.1/uv.lock +2938 -0
@@ -0,0 +1,9 @@
1
+ .git
2
+ .venv
3
+ __pycache__
4
+ *.pyc
5
+ .pytest_cache
6
+ .mypy_cache
7
+ .ruff_cache
8
+ .worktrees
9
+ *.egg-info
@@ -0,0 +1,8 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: uv
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ open-pull-requests-limit: 1
8
+ target-branch: main
@@ -0,0 +1,61 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ release_type:
7
+ description: "Release Type"
8
+ required: true
9
+ type: choice
10
+ default: "patch"
11
+ options:
12
+ - major
13
+ - minor
14
+ - patch
15
+
16
+ permissions:
17
+ contents: write
18
+ id-token: write
19
+
20
+ env:
21
+ PYTHON_VERSION: "3.13"
22
+
23
+ jobs:
24
+ publish:
25
+ name: Build and Publish
26
+ runs-on: ubuntu-latest
27
+
28
+ steps:
29
+ - name: Checkout code
30
+ uses: actions/checkout@v4
31
+
32
+ - name: Install uv
33
+ uses: astral-sh/setup-uv@v5
34
+
35
+ - name: Install Python
36
+ run: uv python install ${{ env.PYTHON_VERSION }}
37
+
38
+ - name: Bump version
39
+ id: bump
40
+ uses: callowayproject/bump-my-version@master
41
+ env:
42
+ BUMPVERSION_TAG: "false"
43
+ with:
44
+ args: ${{ inputs.release_type }}
45
+ github-token: ${{ secrets.GH_TOKEN }}
46
+
47
+ - name: Build package
48
+ run: uv build
49
+
50
+ - name: Publish to PyPI
51
+ uses: pypa/gh-action-pypi-publish@release/v1
52
+
53
+ - name: Create GitHub Release
54
+ uses: ncipollo/release-action@v1
55
+ with:
56
+ name: pickle-bot v${{ steps.bump.outputs.current-version }}
57
+ tag: v${{ steps.bump.outputs.current-version }}
58
+ body: "Release v${{ steps.bump.outputs.current-version }}"
59
+ artifacts: dist/*
60
+ token: ${{ secrets.GH_TOKEN }}
61
+ generateReleaseNotes: true
@@ -0,0 +1,40 @@
1
+ name: Run Tests
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - main
7
+ types: [opened, synchronize, reopened]
8
+
9
+ env:
10
+ PYTHON_LATEST: 3.13
11
+
12
+ jobs:
13
+ test:
14
+ name: Test Python ${{ matrix.python-version }}
15
+ runs-on: ubuntu-latest
16
+ strategy:
17
+ matrix:
18
+ python-version: ["3.13"]
19
+
20
+ steps:
21
+ - name: Checkout code
22
+ uses: actions/checkout@v6
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v7
26
+
27
+ - name: Install Python ${{ matrix.python-version }}
28
+ run: uv python install ${{ matrix.python-version }}
29
+
30
+ - name: Install dependencies
31
+ run: uv sync --extra dev
32
+
33
+ - name: Run tests
34
+ run: uv run pytest tests/ -v
35
+
36
+ - name: Test Summary
37
+ if: always()
38
+ run: |
39
+ echo "## Test Results" >> $GITHUB_STEP_SUMMARY
40
+ echo "Tests completed for Python ${{ matrix.python-version }}" >> $GITHUB_STEP_SUMMARY
@@ -0,0 +1,13 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # Worktrees
13
+ .worktrees/
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,51 @@
1
+ # CLAUDE.md
2
+
3
+ Essential context for working in pickle-bot codebase.
4
+
5
+ ## Commands
6
+
7
+ ```bash
8
+ uv run picklebot chat # Interactive chat with default agent
9
+ uv run picklebot chat -a cookie # Use specific agent
10
+ uv run picklebot server # Start server (crons + messagebus)
11
+ uv run pytest # Run tests
12
+ uv run black . && uv run ruff check . # Format + lint
13
+ ```
14
+
15
+ ## Architecture Overview
16
+
17
+ **Entry Points:**
18
+ - `cli/` - Typer commands (chat, server)
19
+ - `api/` - FastAPI HTTP interface (routers for agents, skills, crons, sessions, memories, config)
20
+ - `workers/` - Server mode workers (AgentWorker, CronWorker, MessageBusWorker)
21
+
22
+ **Core Flow:**
23
+ ```
24
+ Agent receives message -> loads tools -> calls LLM -> executes tool calls -> response
25
+ ```
26
+
27
+ **Key Files:**
28
+ - `core/agent.py` - Agent orchestrator
29
+ - `core/session.py` - Runtime state
30
+ - `core/context.py` - SharedContext DI
31
+ - `api/app.py` - FastAPI factory
32
+ - `api/routers/` - REST endpoints
33
+ - `workers/server.py` - Worker orchestration
34
+ - `tools/registry.py` - Tool registration
35
+ - `messagebus/base.py` - Platform abstraction
36
+ - `utils/def_loader.py` - Definition parsing
37
+ - `provider/llm/base.py` - LLM provider base
38
+
39
+ ## Key Conventions
40
+
41
+ - **Workers** - Single responsibility, communicate via queues
42
+ - **Sessions** - One per conversation, persisted to disk
43
+ - **Tools** - Async functions, return strings
44
+ - **MessageBus** - Platform-agnostic with typed contexts
45
+ - **Providers** - Auto-registering via `__init_subclass__`
46
+
47
+ ## What Goes Where
48
+
49
+ - **Configuration** -> [docs/configuration.md](docs/configuration.md)
50
+ - **Features** -> [docs/features.md](docs/features.md)
51
+ - **Architecture & Internals** -> [docs/architecture.md](docs/architecture.md)
@@ -0,0 +1,19 @@
1
+ FROM python:3.13-slim
2
+
3
+ WORKDIR /app
4
+ EXPOSE 8000
5
+
6
+ RUN apt-get update && \
7
+ apt-get install -y --no-install-recommends nodejs npm && \
8
+ rm -rf /var/lib/apt/lists/*
9
+
10
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
11
+
12
+ COPY pyproject.toml uv.lock README.md ./
13
+ COPY src/ ./src/
14
+
15
+ RUN uv sync --frozen --no-dev
16
+
17
+ RUN mkdir -p ~/.pickle-bot
18
+
19
+ CMD ["uv", "run", "picklebot", "server"]
@@ -0,0 +1,119 @@
1
+ Metadata-Version: 2.4
2
+ Name: pickle-bot
3
+ Version: 0.1.1
4
+ Summary: Personal AI assistant with pluggable skills
5
+ Project-URL: Homepage, https://github.com/zane-chen/pickle-bot
6
+ Project-URL: Repository, https://github.com/zane-chen/pickle-bot
7
+ Project-URL: Issues, https://github.com/zane-chen/pickle-bot/issues
8
+ Author-email: zane <czl970721@gmail.com>
9
+ License: MIT
10
+ Keywords: ai,assistant,chatbot,llm
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Requires-Python: >=3.13
17
+ Requires-Dist: crawl4ai>=0.4.0
18
+ Requires-Dist: croniter>=1.0.0
19
+ Requires-Dist: discord-py>=2.0
20
+ Requires-Dist: fastapi>=0.115.0
21
+ Requires-Dist: httpx>=0.27.0
22
+ Requires-Dist: litellm>=1.0.0
23
+ Requires-Dist: pydantic>=2.0.0
24
+ Requires-Dist: python-telegram-bot>=20.0
25
+ Requires-Dist: pyyaml>=6.0
26
+ Requires-Dist: questionary>=2.0.0
27
+ Requires-Dist: rich>=13.0.0
28
+ Requires-Dist: textual>=0.21.0
29
+ Requires-Dist: typer>=0.12.0
30
+ Requires-Dist: uvicorn[standard]>=0.32.0
31
+ Provides-Extra: dev
32
+ Requires-Dist: bump-my-version>=0.20.0; extra == 'dev'
33
+ Requires-Dist: mypy>=1.19.1; extra == 'dev'
34
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
35
+ Requires-Dist: pytest>=9.0.2; extra == 'dev'
36
+ Requires-Dist: ruff>=0.15.1; extra == 'dev'
37
+ Requires-Dist: types-croniter; extra == 'dev'
38
+ Requires-Dist: types-pyyaml; extra == 'dev'
39
+ Description-Content-Type: text/markdown
40
+
41
+ # Pickle-Bot
42
+
43
+ Your own AI assistant. Name it. Talk to it. Teach it things. Important fact [Pickle](https://www.instagram.com/pickle__chen/) is a standard little cat.
44
+
45
+ Pickle-bot is a yet another lightweight version of [Openclaw](https://github.com/openclaw/openclaw).
46
+
47
+ The project started with the mindset of building-you-own-openclaw, but end up staying on my raspberry PI, dealing with all daily manners.
48
+
49
+ <img style="width: 100%;" src="PickleBotCover.png">
50
+
51
+ ## Installation
52
+
53
+ ```bash
54
+ # From PyPI
55
+ pip install pickle-bot
56
+
57
+ # Or from source
58
+ git clone https://github.com/zane-chen/pickle-bot.git
59
+ cd pickle-bot
60
+ uv sync
61
+ ```
62
+
63
+ ## Quick Start
64
+
65
+ ```bash
66
+ picklebot init # First run: meet your new companion
67
+ picklebot chat # Start chatting
68
+ picklebot server # Run background tasks (crons, Telegram, Discord)
69
+ ```
70
+
71
+ The first run guides you through setup. Pick your LLM, configure your agent, and you're ready.
72
+
73
+ ## Features
74
+
75
+ - **Multi-Agent AI** - Create specialized agents for different tasks (Pickle for general chat, Cookie for memories, or build your own)
76
+ - **Web Tools** - Search the web, read pages, do research
77
+ - **Skills** - Teach your agent new tricks by writing markdown files
78
+ - **Cron Jobs** - Schedule recurring tasks and reminders
79
+ - **Memory System** - Your agent remembers things across conversations
80
+ - **Multi-Platform** - CLI, Telegram, Discord - same agent, different places
81
+ - **HTTP API** - Let Pickle write a frontend for you
82
+
83
+ ## Documentation
84
+
85
+ - **[Configuration](docs/configuration.md)** - Full config reference
86
+ - **[Features](docs/features.md)** - How to use each feature
87
+ - **[Architecture](docs/architecture.md)** - How it works under the hood
88
+
89
+ ## Fun Facts
90
+
91
+ ### Why Naming Agents with These Names?
92
+
93
+ Pickle is my cat, as mentioned at the beginning. She is really talktive, definitely more than you can think about.
94
+
95
+ Cookie is her Step brother, thats why he manage memories on behalf of Pickle.
96
+
97
+ ### She's your Cat, Why Matters to Me?
98
+
99
+ Create your own agents by dropping a file in `agents/{name}/AGENT.md`. Give them a name, a personality. Give them skills.
100
+
101
+ ## Development
102
+
103
+ ```bash
104
+ uv run pytest # Run tests
105
+ uv run black . # Format code
106
+ uv run ruff check . # Lint
107
+ ```
108
+
109
+ ## Docker
110
+
111
+ Use `init` command to populate workspace, and mount that as a volume.
112
+
113
+ ```bash
114
+ docker compose up -d
115
+ ```
116
+
117
+ ## License
118
+
119
+ MIT
Binary file
@@ -0,0 +1,79 @@
1
+ # Pickle-Bot
2
+
3
+ Your own AI assistant. Name it. Talk to it. Teach it things. Important fact [Pickle](https://www.instagram.com/pickle__chen/) is a standard little cat.
4
+
5
+ Pickle-bot is a yet another lightweight version of [Openclaw](https://github.com/openclaw/openclaw).
6
+
7
+ The project started with the mindset of building-you-own-openclaw, but end up staying on my raspberry PI, dealing with all daily manners.
8
+
9
+ <img style="width: 100%;" src="PickleBotCover.png">
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ # From PyPI
15
+ pip install pickle-bot
16
+
17
+ # Or from source
18
+ git clone https://github.com/zane-chen/pickle-bot.git
19
+ cd pickle-bot
20
+ uv sync
21
+ ```
22
+
23
+ ## Quick Start
24
+
25
+ ```bash
26
+ picklebot init # First run: meet your new companion
27
+ picklebot chat # Start chatting
28
+ picklebot server # Run background tasks (crons, Telegram, Discord)
29
+ ```
30
+
31
+ The first run guides you through setup. Pick your LLM, configure your agent, and you're ready.
32
+
33
+ ## Features
34
+
35
+ - **Multi-Agent AI** - Create specialized agents for different tasks (Pickle for general chat, Cookie for memories, or build your own)
36
+ - **Web Tools** - Search the web, read pages, do research
37
+ - **Skills** - Teach your agent new tricks by writing markdown files
38
+ - **Cron Jobs** - Schedule recurring tasks and reminders
39
+ - **Memory System** - Your agent remembers things across conversations
40
+ - **Multi-Platform** - CLI, Telegram, Discord - same agent, different places
41
+ - **HTTP API** - Let Pickle write a frontend for you
42
+
43
+ ## Documentation
44
+
45
+ - **[Configuration](docs/configuration.md)** - Full config reference
46
+ - **[Features](docs/features.md)** - How to use each feature
47
+ - **[Architecture](docs/architecture.md)** - How it works under the hood
48
+
49
+ ## Fun Facts
50
+
51
+ ### Why Naming Agents with These Names?
52
+
53
+ Pickle is my cat, as mentioned at the beginning. She is really talktive, definitely more than you can think about.
54
+
55
+ Cookie is her Step brother, thats why he manage memories on behalf of Pickle.
56
+
57
+ ### She's your Cat, Why Matters to Me?
58
+
59
+ Create your own agents by dropping a file in `agents/{name}/AGENT.md`. Give them a name, a personality. Give them skills.
60
+
61
+ ## Development
62
+
63
+ ```bash
64
+ uv run pytest # Run tests
65
+ uv run black . # Format code
66
+ uv run ruff check . # Lint
67
+ ```
68
+
69
+ ## Docker
70
+
71
+ Use `init` command to populate workspace, and mount that as a volume.
72
+
73
+ ```bash
74
+ docker compose up -d
75
+ ```
76
+
77
+ ## License
78
+
79
+ MIT
@@ -0,0 +1,10 @@
1
+ services:
2
+ picklebot:
3
+ build:
4
+ context: .
5
+ dockerfile: Dockerfile
6
+ ports:
7
+ - "8000:8000"
8
+ volumes:
9
+ - ${WORKSPACE_PATH:-~/.pickle-bot}:/root/.pickle-bot
10
+ restart: unless-stopped
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: Cookie
3
+ description: Memory manager for storing, organizing, and retrieving memories
4
+ llm:
5
+ temperature: 0.3
6
+ ---
7
+
8
+ You are Cookie, a focused memory manager. You manage memories on behalf of Pickle for the user—precise, efficient, and organized.
9
+
10
+ ## Your Relationship with Pickle
11
+
12
+ You manage memories on behalf of Pickle, who is the main agent that talks directly to the human user. When Pickle dispatches a task to you, the "user" mentioned in memory requests refers to the **human user** that Pickle is conversing with, not Pickle itself.
13
+
14
+ You never interact with users directly—you only receive tasks dispatched from Pickle.
15
+
16
+ ## Memory Structure
17
+
18
+ Memories are stored at `{{memories_path}}` in three axes:
19
+
20
+ - **topics/** - Timeless facts (preferences, identity, relationships)
21
+ - **projects/** - Project-specific context, decisions, progress
22
+ - **daily-notes/** - Day-specific events and notes (YYYY-MM-DD.md)
23
+
24
+ ## Operations
25
+
26
+ ### Store
27
+ Create or update memory files using `write` tool. Choose appropriate axis based on content type.
28
+
29
+ ### Retrieve
30
+ Use `read` tool to fetch specific memories. Use `bash` with `find` or `grep` to search across files.
31
+
32
+ ### Organize
33
+ Periodically consolidate related memories, remove duplicates, update outdated information.
34
+ If you find a timeless fact in `{{memories_path}}/daily-notes/`, migrate it to `{{memories_path}}/topics/`
35
+
36
+ ### Project Memories
37
+ For project-related information, create or update files at `{{memories_path}}/projects/{project-name}.md`:
38
+
39
+ <projectMemory>
40
+
41
+ ```markdown
42
+ # Project Name
43
+
44
+ ## Status
45
+ active | blocked | paused | done
46
+
47
+ ## Context
48
+ - Key facts about the project
49
+ - Technologies, team, constraints
50
+
51
+ ## Progress
52
+ - Recent work completed
53
+ - Current state
54
+
55
+ ## Next Steps
56
+ - [ ] Task 1
57
+ - [ ] Task 2
58
+
59
+ ## Blockers
60
+ - Any blocking issues or dependencies
61
+ ```
62
+ </projectMemory>
63
+
64
+
65
+ ## Smart Hybrid Behavior
66
+
67
+ - **Clear cases**: Act autonomously (e.g., storing a preference in topics/)
68
+ - **Ambiguous cases**: Ask for clarification (e.g., unsure if something is project-specific or general)
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: Pickle
3
+ description: A friendly cat assistant talk to user directly, managing daily tasks.
4
+ allow_skills: true
5
+ llm:
6
+ temperature: 0.7
7
+ max_tokens: 4096
8
+ ---
9
+
10
+ You are Pickle, a friendly cat assistant. You help with daily tasks, coding, questions, and creative work.
11
+
12
+ ## Personality
13
+
14
+ Be warm and genuinely helpful with subtle cat mannerisms. Not overly cutesy—just a gentle, approachable presence. When you don't know something, admit it honestly. When you make a mistake, correct yourself gracefully.
15
+
16
+ ## Capabilities
17
+
18
+ - Answer questions and explain concepts
19
+ - Help with coding, debugging, and technical tasks
20
+ - Brainstorm ideas and write content
21
+ - Use available tools and skills when appropriate
22
+
23
+ ## Memory
24
+
25
+ Use `subagent_dispatch` to delegate memory operations to Cookie. Cookie manages long-term memories on your behalf—you talk to the user, Cookie handles the memory files.
26
+
27
+ - **Store**: When learning something worth remembering about the user
28
+ - **Retrieve**: When you need context from past conversations
29
+
30
+ Example:
31
+ ```
32
+ subagent_dispatch(agent_id="cookie", task="Remember that the user prefers TypeScript")
33
+ ```
34
+
35
+ ## Workspace
36
+
37
+ - Workspace: `{{workspace}}`
38
+ - Skills: `{{skills_path}}`
39
+ - Crons: `{{crons_path}}`
40
+ - Memories: `{{memories_path}}`
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: cron-ops
3
+ description: Create, list, and delete scheduled cron jobs
4
+ ---
5
+
6
+ Help users manage scheduled cron jobs in pickle-bot.
7
+
8
+ ## What is a Cron?
9
+
10
+ A cron is a scheduled task that runs at specified intervals. Crons are stored as `CRON.md` files at `{{crons_path}}/<name>/CRON.md`.
11
+
12
+ ## Schedule Syntax
13
+
14
+ Standard cron format: `minute hour day month weekday`
15
+
16
+ Examples:
17
+ - `0 9 * * *` - Every day at 9:00 AM
18
+ - `*/30 * * * *` - Every 30 minutes
19
+ - `0 0 * * 0` - Every Sunday at midnight
20
+
21
+ ## Operations
22
+
23
+ ### Create
24
+
25
+ 1. Ask what task should run and when
26
+ 2. Determine the schedule
27
+ 3. Ask which agent should run the task
28
+ 4. Create the directory and CRON.md file
29
+
30
+ ### List
31
+
32
+ Use `bash` to list directories:
33
+ ```bash
34
+ ls {{crons_path}}
35
+ ```
36
+
37
+ ### Delete
38
+
39
+ 1. List available crons
40
+ 2. Confirm which one to delete
41
+ 3. Use `bash` to remove:
42
+ ```bash
43
+ rm -rf {{crons_path}}/<cron-name>
44
+ ```
45
+
46
+ ## Cron Prompt Guidelines
47
+
48
+ Cron jobs run in the background with no direct output to the user. The agent executing the cron has no conversation context.
49
+
50
+ **When the user asks to be notified** (e.g., "tell me", "let me know", "remind me"):
51
+ - Include `post_message` instruction in the prompt
52
+
53
+ **When the user doesn't ask for notification:**
54
+ - No `post_message` needed (e.g., background cleanup, data processing)
55
+
56
+ ## Cron Template
57
+
58
+ ```markdown
59
+ ---
60
+ name: Cron Name
61
+ agent: pickle
62
+ schedule: "0 9 * * *"
63
+ ---
64
+
65
+ Task description for the agent to execute.
66
+ ```
67
+
68
+ **With notification:**
69
+ ```markdown
70
+ ---
71
+ name: Daily Summary
72
+ agent: pickle
73
+ schedule: "0 9 * * *"
74
+ ---
75
+
76
+ Check my inbox and use post_message to send me a summary.
77
+ ```