* Use isolation_env_id with fallback to worktree_path in orchestrator and github adapter
* Fix status command to display isolation_env_id (#88)
The /status command was only checking worktree_path and would not
display worktree information for conversations using the new
isolation_env_id field. This broke status display after the
isolation provider migration.
Changes:
- Updated status command to use isolation_env_id ?? worktree_path fallback pattern
- Added three comprehensive tests:
1. Display worktree from isolation_env_id when set
2. Prefer isolation_env_id over worktree_path when both exist
3. Fall back to worktree_path when isolation_env_id is null
This ensures backward compatibility while properly supporting the new
isolation provider abstraction introduced in PR #88.
Fixes#88🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* Migrate from Node.js/npm/Jest to Bun runtime
- Replace npm with bun for package management (bun.lock)
- Replace Jest with bun:test for testing
- Update tsconfig for Bun (ESNext module, bundler resolution)
- Update Dockerfile to use oven/bun:1-slim
- Update CI workflow to use oven-sh/setup-bun@v2
- Remove dynamic import hack from codex.ts (direct ESM imports)
- Fix test mocking for Bun (export execFileAsync, use spyOn)
- Update all documentation (CLAUDE.md, README.md, CONTRIBUTING.md)
All 395 tests pass, type-check passes, E2E validated with curl.
* ci: retrigger CI build
* fix: make execFileAsync a function for better Bun mockability
* fix: ensure execFileAsync returns string not Buffer
* fix: rename _execFileAsync to comply with naming convention
* fix: make mkdirAsync mockable for Bun tests
* fix: update engines to bun>=1.0.0 and add mkdirAsync mock
* fix: pin Bun to 1.3.4 in CI to fix mock.module test failures
Newer Bun versions have different mock.module() behavior that causes
cross-test module pollution, resulting in 71 test failures in CI while
tests pass locally. Pinning to 1.3.4 ensures consistent behavior.
* fix: run orchestrator tests last to avoid mock.module pollution
Bun's mock.module() pollutes the global module cache, causing tests to
fail when orchestrator.test.ts (which mocks command-handler and factory)
runs before those modules' own test files.
Fix by running tests in two batches:
1. All tests except orchestrator
2. Orchestrator tests last
This ensures orchestrator's mocks don't affect other test files.
- Add SlackAdapter using @slack/bolt with Socket Mode (no HTTP endpoints needed)
- Implement thread handling mirroring Discord pattern (channel:thread_ts conversation IDs)
- Add Slack URL normalization to strip <url> formatting from messages
- Add user whitelist authorization (SLACK_ALLOWED_USER_IDS)
- Support @mention activation in channels and direct DMs
- Add comprehensive setup guide and update README with Slack section
* Fix npm deprecation warnings and vulnerability
- Update Jest 29→30.2.0 to eliminate glob@7/inflight deprecation warnings
- Update Express 5.1.0→5.2.1 to fix query property vulnerability
- Update ts-jest 29.1.0→29.4.6 for Jest 30 compatibility
- Update @types/jest 29.5.0→30.0.0 for Jest 30 types
- Add npm override for test-exclude@7 to fully eliminate glob@7
* Update SDK and tooling dependencies to latest
- Implement DiscordAdapter using discord.js v14 with IPlatformAdapter interface
- Support 2000 char message limit with automatic splitting
- Add MESSAGE_CONTENT intent for reading messages
- Fix dotenv import order to use 'dotenv/config' for proper env loading
- Update batch mode tests to account for "starting" message
Co-Authored-By: Claude <noreply@anthropic.com>
* feat: Add Telegram MarkdownV2 formatting for AI responses
- Add telegramify-markdown package to convert GitHub-flavored markdown
to Telegram's MarkdownV2 format
- Create telegram-markdown utility with:
- convertToTelegramMarkdown(): Main conversion function
- stripMarkdown(): Fallback for plain text
- escapeMarkdownV2(): Manual escaping helper
- Update TelegramAdapter to:
- Format short messages with MarkdownV2
- Split long messages by paragraphs for better formatting
- Fallback to stripped plain text when MarkdownV2 parsing fails
- Add comprehensive tests for markdown conversion
Transforms AI responses from raw markdown (## headers, **bold**) to
properly formatted Telegram messages with bold text, code blocks, etc.
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
* fix: Correct telegram adapter test mocks and assertions
- Add missing stripMarkdown mock to telegram-markdown module mock
- Fix paragraph splitting test to use double newlines (\n\n) matching
actual implementation behavior
- Use smaller paragraph sizes (3000 chars) to stay within MAX_LENGTH
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>