Commit Graph

209 Commits

Author SHA1 Message Date
gavrielc
bd2e236f73 docs: add AmaxGuan to CONTRIBUTORS.md
Co-Authored-By: Lingfeng Guan <6004247+AmaxGuan@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:51:31 +02:00
gavrielc
9232c11312 docs: add rgarcia to CONTRIBUTORS.md
Co-Authored-By: Rafael <raf@kernel.sh>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:50:41 +02:00
gavrielc
7d95ddf0b8 docs: add pottertech to CONTRIBUTORS.md
Co-Authored-By: Skip Potter <skip.potter.va@gmail.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:49:42 +02:00
gavrielc
3e578eb0a7 docs: add tydev-new to CONTRIBUTORS.md
Co-Authored-By: tydev-new <198171537+tydev-new@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:49:16 +02:00
gavrielc
40882ab32a docs: add CONTRIBUTORS.md with Alakazam03
Co-Authored-By: vaibhav aggarwal <vaibhav.045@iiitb.org>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:47:21 +02:00
gavrielc
ee1dab8f81 chore: add gabi-simons as codeowner for core paths
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:31:01 +02:00
gavrielc
e0cf045518 chore: remove .claude/settings.local.json
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:23:39 +02:00
Darrell O'Donnell
ee7f720617 /add-slack (#366)
* feat: add Slack channel skill (/add-slack)

Slack Bot integration via @slack/bolt with Socket Mode. Can replace
WhatsApp entirely (SLACK_ONLY=true) or run alongside it.

- SlackChannel implementing Channel interface (46 unit tests)
- Socket Mode connection (no public URL needed)
- @mention translation (Slack <@UBOTID> → TRIGGER_PATTERN)
- Message splitting at 4000-char Slack API limit
- Thread flattening (threaded replies delivered as channel messages)
- User name resolution with caching
- Outgoing message queue with flush-on-reconnect
- Channel metadata sync with pagination
- Proper Bolt types (GenericMessageEvent | BotMessageEvent)
- Multi-channel orchestrator changes (conditional channel creation)
- Setup guide (SLACK_SETUP.md) and known limitations documented

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* local settings

* adjusted when installing

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 15:34:34 +02:00
gavrielc
bc05d5fbea fix(add-telegram): update test assertions for 5-arg onChatMetadata signature
The telegram.ts implementation was updated to pass channel and isGroup
to onChatMetadata but the test file still asserted the old 3-arg form.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:30:54 +02:00
Gabi Simons
ae2f339fcf chore(skills): rebase core skills (telegram, discord, voice) to latest main and fix db schema gaps 2026-02-25 00:26:01 +02:00
gavrielc
3dd48f311a fix(add-gmail): restore YAML frontmatter to SKILL.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:24:08 +02:00
gavrielc
8e164f608c fix(add-gmail): graceful startup when credentials missing + poll backoff
- connect() warns and returns instead of throwing when ~/.gmail-mcp/
  credentials are missing, preventing app crash
- index.ts wraps gmail.connect() in try/catch as a safety net
- Poll loop uses exponential backoff on consecutive errors (caps at 30m)
  instead of hammering the Gmail API every 60s on auth failures
- Switch from setInterval to setTimeout chain for proper backoff timing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 00:23:11 +02:00
gavrielc
695ff08f4c Merge pull request #477 from Fritzzzz1/add-gmail-refactor
Add gmail skill refactor
2026-02-25 00:18:50 +02:00
Fritzzzz
df0e5fc26b remove unused 2026-02-24 23:52:53 +02:00
Fritzzzz
6dd90829e1 refactor: remove GMAIL_CHANNEL_ENABLED env flag from add-gmail skill
Channel vs tool-only is now a code-level decision at skill apply time.
If the user chose channel mode, GmailChannel is wired unconditionally.
If tool-only, no channel code is added. No runtime flag needed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:46:24 +02:00
Will Monk
18c0432db4 Fix QR data handling in WhatsApp auth (#467)
Running WhatsApp setup fails because the string interpolation of `qrData` does not inject quotes.
2026-02-24 23:32:54 +02:00
Kyle Johnson
52984491b6 chore: add .nvmrc specifying Node 22 (#473)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 23:10:37 +02:00
Fritzzzz
41e2424856 refactor: restructure add-gmail skill for new skill architecture
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 22:36:32 +02:00
Fritzzzz
1c31726c63 add npm cache to gitignore 2026-02-24 22:36:32 +02:00
Gabi Simons
29a5dafe01 refactor: remove deterministic caching system from skills engine (#453) 2026-02-24 15:49:29 +02:00
github-actions[bot]
1448a14a94 docs: update token count to 38.2k tokens · 19% of context window 2026-02-24 05:04:48 +00:00
github-actions[bot]
796906baa2 chore: bump version to 1.1.2 2026-02-24 05:04:43 +00:00
Gavriel Cohen
7631a5c686 fix: add error handling and tests for WA Web version fetch
The fetchLatestWaWebVersion call added in #443 could crash the
connection flow if the HTTP fetch fails. Wrap with .catch() to log
and fall back to the default Baileys version.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 07:04:33 +02:00
github-actions[bot]
f4277b295a docs: update token count to 38.1k tokens · 19% of context window 2026-02-24 04:57:00 +00:00
github-actions[bot]
3a876c10f6 chore: bump version to 1.1.1 2026-02-24 04:56:55 +00:00
Lorenzo Fränkel
ec176a05e1 fix: use fetchLatestWaWebVersion to prevent 405 connection failures (#443)
Baileys' default WhatsApp version can fall behind when WhatsApp updates
their protocol, causing 405 "Method Not Allowed" errors on the websocket
handshake. This prevents both new authentication and reconnection.

Now fetches the latest version on each connection so it stays current.

Applied to both the runtime connection (whatsapp.ts) and the setup auth
flow (whatsapp-auth.ts).
2026-02-24 06:56:43 +02:00
gavrielc
9f802bc5d4 docs: rewrite README for broader audience and updated feature set
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 23:37:25 +02:00
Guy Vago
1ff1fd6bc7 feat: add official Qodo skills and codebase intelligence (#428) 2026-02-23 23:34:24 +02:00
gavrielc
226b520131 chore: bump version to 1.1.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 02:05:42 +02:00
gavrielc
f59ca7cd6d docs: make /update skill discoverable, add auto version bumping
Add /update to skills tables in CLAUDE.md and REQUIREMENTS.md. Add
"Updating" section to README. Remove /add-telegram and /add-discord
from RFS (already exist). Add CI workflow to bump patch version on
source/container changes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 02:04:55 +02:00
gavrielc
1216b5b99c feat: add /update skill for pulling upstream changes (#372)
Interactive skill that guides Claude through fetching upstream NanoClaw,
previewing changes, merging with customizations, running migrations, and
verifying the result. Includes:

- SKILL.md with 9-step update flow
- fetch-upstream.sh: detects remote, fetches, extracts tracked paths
- run-migrations.ts: discovers and runs version-ordered migrations
- post-update.ts: clears backup after conflict resolution
- update-core.ts: adds --json and --preview-only flags
- BASE_INCLUDES moved to constants.ts as single source of truth
- 16 new tests covering fetch, migrations, and CLI flags

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 01:03:13 +02:00
github-actions[bot]
628d434799 docs: update token count to 38.0k tokens · 19% of context window 2026-02-22 22:12:05 +00:00
Chujiang
9fb1790e12 fix: improve type safety and add error logging (#378)
- Replace 'as any' with proper type definition for error status code access
- Add error logging to sendPresenceUpdate() catch block
- Add debug logging when .env file is not found

These changes improve type safety and visibility into potential failures
without changing any core functionality.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: gavrielc <gabicohen22@yahoo.com>
2026-02-23 00:11:52 +02:00
Lawyered
856f98023c Fix critical skills path-remap root escape (including symlink traversal) (#367)
* Block skills path-remap escapes outside project root

* Harden path remap against symlink-based root escape

* test: isolate update tests from real git index
2026-02-23 00:10:45 +02:00
Tom Sella
264f855566 Replace 'ask the user' with AskUserQuestion tool in skills (#389)
- Updated add-voice-transcription to use AskUserQuestion for API key prompt
- Updated add-gmail to use AskUserQuestion for mode selection and channel config
- Updated add-discord to use AskUserQuestion for mode and token prompts
- Updated add-parallel to use AskUserQuestion for API key and permission prompts
- Updated add-telegram to use AskUserQuestion for mode and token prompts
- Updated setup to use AskUserQuestion for Node.js, Docker, and container runtime prompts

The AskUserQuestion tool provides a structured way to collect user input during
skill execution, making the interaction pattern consistent across all skills.
2026-02-23 00:08:14 +02:00
Daniel M
e59856fbec Fix: filter empty messages from polling queries (#383)
* fix: filter empty messages from polling queries

WhatsApp history sync writes empty protocol artifacts (delivery receipts,
status updates) to the database. On fresh installs, the main channel
(no trigger required) picks these up and spawns a container agent
unnecessarily, causing a message loop on first startup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: update test to match empty-content filtering in queries

The getMessagesSince query now filters out empty messages, so the test
should expect 0 results instead of 1.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 00:06:08 +02:00
github-actions[bot]
f5b2068852 docs: update token count to 37.9k tokens · 19% of context window 2026-02-22 22:04:36 +00:00
gavrielc
5958175ba1 fix: use 'Assistant' as fallback name instead of 'AssistantNameMissing'
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 00:04:16 +02:00
gavrielc
495b7df5fc merge: resolve conflict with origin/main
Keep ASSISTANT_NAME import, drop removed GROUPS_DIR import.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 00:03:20 +02:00
github-actions[bot]
1046a79682 docs: update token count to 37.8k tokens · 19% of context window 2026-02-22 21:23:47 +00:00
gavrielc
77f7423172 fix: pass host timezone to container and reject UTC-suffixed timestamps (#371)
Containers had no TZ set, so any time-aware code inside ran in UTC while
the host interpreted bare timestamps as local time. Now TIMEZONE from
config.ts is passed via -e TZ= to the container args.

Also rejects Z-suffixed or offset-suffixed timestamps in the container's
schedule_task validation, since bare timestamps are expected to be local
time and silently accepting UTC suffixes would cause an offset mismatch.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 23:23:34 +02:00
Dan Shapiro
107aff850c fix: pass assistantName to container agent instead of hardcoding 'Andy'
The container agent-runner had 'Andy' hardcoded as the sender name in
archived conversation transcripts. This ignored the configurable
ASSISTANT_NAME setting, so users who changed their assistant's name
(via .env or config) would still see 'Andy' in transcripts.

- Add assistantName field to ContainerInput interface (both host and
  container copies)
- Pass ASSISTANT_NAME from config through to container in index.ts
  and task-scheduler.ts
- Thread assistantName through createPreCompactHook and
  formatTranscriptMarkdown in the agent-runner
- Use 'AssistantNameMissing' as fallback instead of 'Andy' so a
  missing name is visible rather than silently wrong

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 12:22:07 -08:00
github-actions[bot]
6b85ac59bd docs: update token count to 37.7k tokens · 19% of context window 2026-02-22 19:02:53 +00:00
gavrielc
2e1c768207 fix: block group folder path escapes (#387) 2026-02-22 21:02:27 +02:00
Lawyered
02d8528684 fix: pause malformed scheduled tasks 2026-02-22 21:01:53 +02:00
Lawyered
c6391cceb1 fix: block group folder path escapes 2026-02-22 21:01:53 +02:00
gavrielc
de64dab3e9 Merge pull request #369 from lawyered0/codex/fix-file-ops-symlink-escape
Fix critical symlink escape in skills file operations
2026-02-22 21:01:11 +02:00
github-actions[bot]
6d4277f669 docs: update token count to 37.0k tokens · 18% of context window 2026-02-22 18:58:12 +00:00
gavrielc
5fb10645cd fix: mount project root read-only to prevent container escape (#392)
The main group's project root was mounted read-write, allowing the
container agent to modify host application code (e.g. dist/container-runner.js)
to inject arbitrary mounts on next restart — a full sandbox escape.

Fix: mount the project root read-only. Writable paths the agent needs
(group folder, IPC, .claude/) are already mounted separately. The
agent-runner source is now copied into a per-group writable location
so agents can still customize container-side behavior without affecting
host code or other groups.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 20:57:57 +02:00
gavrielc
ef00320018 Update README.md 2026-02-22 18:47:01 +02:00