## Summary
- Broaden the Beeper iMessage macOS build patch so BetterSwiftAX
`kAX...` constants compile on GitHub `macos-15`/`macos-15-intel`.
- Pin the fixed `platform-imessage` submodule source and add Swift 6.2 /
Peekaboo dependency patching for the CLI binary workflow.
- Package and verify macOS local-tool sidecars plus `release-tag.txt` in
CLI release zips.
- Fix installed beta metadata/upgrade behavior so `--version`, update
checks, and beta-default experimental flags use the installed release
tag.
- Let `LOCAL_*` execution bypass remote auth/project/schema validation.
- Add runtime self-heal for missing installed `local-tools-binaries`: if
an old upgrader installs the fixed beta binary without sidecars, first
local-tool execution downloads the matching release zip, verifies
checksum when available, and restores the sidecars.
## Validation
- `pnpm --filter @composio/cli-local-tools build:beeper-imessage --
--target darwin-arm64`
- `pnpm --filter @composio/cli-local-tools build:beeper-imessage --
--target darwin-x64`
- `pnpm --filter @composio/cli-local-tools build:peekaboo -- --target
darwin-arm64`
- `pnpm --filter @composio/cli-local-tools build:peekaboo -- --target
darwin-x64`
- `pnpm --filter @composio/cli-local-tools typecheck:tsc`
- `pnpm --filter @composio/cli-local-tools test`
- `pnpm --filter @composio/cli typecheck:tsc`
- `pnpm --filter @composio/cli build:binary`
- Targeted CLI tests for execute/config/upgrade/version/update-check
paths.
- Packaged binary smoke test confirmed bundled Beeper sidecar works.
- Repair smoke test: copied only the new `composio` binary plus
`release-tag.txt` into a temp install with no `local-tools-binaries`;
`execute LOCAL_BEEPER_IMESSAGE_VERSION -d '{}'` restored sidecars from
`@composio/cli@0.2.29-beta.235` and succeeded.
## Release workflow
- Beta build run `25405049712` succeeded for commit
`9d0910c909b7b257d0f17b6d082980952d1e6c59` and published
`@composio/cli@0.2.29-beta.235`.
- This PR now includes one follow-up commit (`2c32cff4c`) to cover the
old-upgrader/missing-sidecars incremental upgrade path; normal branch CI
and beta build run `25406984535` are running again.
## Summary
- Add experimental CLI local tools behind `local_tools` (beta-on,
stable-off unless `composio config experimental local_tools on`).
- Add reusable `@composio/cli-local-tools` package: declarations,
metadata, readiness, command/MCP/native/FFI runtimes, bundled-binary
resolution, and Tool Router search/execute/schema integration.
- Add first-class local toolkits for:
- `BEEPER_IMESSAGE` backed by `imessage-cli` from the ComposioHQ
`platform-imessage` fork.
- `CHROME_DEVTOOLS` backed by the official `chrome-devtools-mcp@0.24.0`
npm/npx package.
- `PEEKABOO` backed by upstream Peekaboo CLI.
- Remove generated native executables from git: Beeper and Peekaboo
binaries are now ignored, pinned via git submodules, and generated
during CLI binary release jobs.
- Update CLI binary workflow so Linux artifacts skip native sidecars,
while macOS artifacts run on macOS runners and build only the matching
`darwin-x64` or `darwin-arm64` Beeper/Peekaboo sidecars before
packaging.
## Native binary policy
- No generated `imessage-cli` or `peekaboo` binary blobs are committed
in this PR history.
- Beeper source is pinned as
`ts/packages/cli-local-tools/vendor/platform-imessage` at
`364445a1b3089ad9fe293d5951efe160c5677c42` from
`https://github.com/ComposioHQ/platform-imessage`.
- Peekaboo source is pinned as
`ts/packages/cli-local-tools/vendor/peekaboo` at
`31e66e8d02656141d18f60bf3b46b24c2b9bc785` from
`https://github.com/steipete/Peekaboo`.
- Build commands:
- `pnpm --filter @composio/cli-local-tools build:local-tool-binaries --
--target darwin-arm64`
- `pnpm --filter @composio/cli-local-tools build:local-tool-binaries --
--target darwin-x64`
- Chrome DevTools is an npm/npx integration and is pinned as a dev
dependency (`chrome-devtools-mcp@0.24.0`) instead of using native
sidecars.
## Validation
- `pnpm --filter @composio/cli-local-tools build:local-tool-binaries --
--target darwin-arm64`
- `pnpm --filter @composio/cli-local-tools build:peekaboo -- --target
darwin-x64`
- `pnpm --filter @composio/cli-local-tools build:beeper-imessage --
--target darwin-x64`
- `pnpm --filter @composio/cli-local-tools typecheck:tsc`
- `pnpm --filter @composio/cli-local-tools test`
- `COMPOSIO_REAL_LOCAL_TOOLS_TESTS=1 pnpm --filter
@composio/cli-local-tools test -- src/toolkits/beeper-imessage.test.ts
src/toolkits/peekaboo.test.ts`
- `pnpm --filter @composio/cli typecheck:tsc`
- `pnpm --filter @composio/cli build`
- `COMPOSIO_CACHE_DIR=<tmp-config-with-local_tools-enabled> bun
ts/packages/cli/dist/bin.mjs local-tools doctor --json`
- `pnpm turbo build`
- Verified rewritten branch has no >1MB objects relative to
`origin/next` and no native executable paths in the PR diff.
## Notes / risks
- Beeper iMessage and Peekaboo are macOS-only and depend on local
permissions.
- Peekaboo requires macOS 15+; GUI tools require Screen Recording,
Accessibility, and sometimes Automation.
- Beeper send/reaction behavior can still depend on upstream Messages
automation reliability.
- Chrome DevTools can inspect/modify browser contents; avoid sensitive
browser sessions.
## Summary
- Update issue triage classifier guidance so hosted integration/tool
bugs that are not SDK/CLI/docs/Python code defects route to `support`.
- Add GitHub #3291 / `SPOTIFY_GET_PLAYLIST_ITEMS` as an explicit example
that should be `support` + bug and forwarded to Plain.
- Clarify broken existing tools are never `tool-request`, and should
route to Plain when they need backend/tool-catalog/support follow-up.
## Tests
- `ruby -e "require 'yaml'; data =
YAML.load_file('.github/workflows/issue-triage.yml'); abort 'bad name'
unless data['name'] == 'Issue Triage'; puts 'YAML OK'"`
## Notes
- The existing workflow already forwards `support` issues to Plain; this
change makes the classifier choose that path for non-SDK hosted tool
bugs.
## Summary
- add a `support` triage category for product/support/configuration
issues that are not SDK bugs
- avoid applying `bug`/`ts` labels or assigning Alberto for
support-classified issues
- create/use a `support` GitHub label and forward support issues to
Plain via the GraphQL API when `PLAIN_API_KEY` is configured
## Tests
- `ruby -e 'require "yaml";
YAML.load_file(".github/workflows/issue-triage.yml"); puts "yaml
ok"'`\n- `git diff --check`\n\n## Notes\n- Plain forwarding uses
`secrets.PLAIN_API_KEY` and optional `vars.PLAIN_SUPPORT_EMAIL`
(defaults to `github-support@composio.dev`).\n- `actionlint` was not
installed locally, so workflow syntax validation was limited to YAML
parsing.
## Summary
- Normalize triage output so bug reports are never classified as
`tool-request`.
- Treat broken existing integrations or tools as bugs instead of new
integration requests.
- Preserve existing label, assignee, and auto-close behavior for genuine
tool requests.
## Testing
- Not run (workflow-only change).
- Reviewed the updated triage logic to confirm bug reports fall back to
`other` when the classifier emits `tool-request`.
- Verified the issue comment and close-path behavior remain unchanged
for valid tool requests.
## Summary
- Adds `decimal-pr-bot[bot]`, `github-actions[bot]`, `dependabot[bot]`,
and `zen-agent` to `allowed_bots` in both `.github/workflows/claude.yml`
and `.github/workflows/claude-code-doc-review.yml`.
- So Claude review runs on PRs opened by our CI bots (docs/SDK
auto-update, dep bumps) and by the decimal and zen agents.
Motivation: #3224 (decimal-pr-bot) did not get a Claude review because
it wasn't in the allowlist.
## Test plan
- [ ] Merge and confirm Claude review fires on the next
`github-actions[bot]` docs-update PR.
- [ ] Retrigger Claude on #3224 (or wait for the next decimal-pr-bot PR)
and confirm it runs.
- [ ] Confirm it runs on the next dependabot PR.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary
- Add a new GitHub issue triage workflow that classifies incoming issues
with Claude Sonnet into `docs`, `py`, `ts`, `cli`, `tool-request`, or
`other`.
- Automatically applies labels and assignees for the matching area, and
closes `tool-request` issues after posting a redirect comment.
- Update `CODEOWNERS` to reflect current ownership for docs, TS, and
Python.
- Tighten the stale workflow messaging and close issues immediately
after the stale period.
## Testing
- Not run (workflow and config changes only).
- Verified the new workflow YAML is syntactically structured and uses
strict JSON classification output.
- Reviewed the stale workflow diff to confirm the stale/close timing and
message text changes.
macOS runners ship bash 3.2 which lacks mapfile, causing
"command not found" failures in the bundled support files test.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary
- Add a generated `composio-cli` skill source that can render stable and
beta variants from a single channel-aware definition.
- Introduce build and validation scripts to generate the skill output
and verify channel-specific content, references, and reproducibility.
- Update the CLI packaging workflow to validate skills and package the
correct release-channel build for beta vs stable releases.
- Expand the skill content with clearer top-level CLI guidance,
troubleshooting, developer-project workflows, and beta-only power-user
examples.
- Tighten CLI install/upgrade behavior and add tests covering skill
installation behavior.
- Add example validation to the repo test flow and align example package
metadata with workspace expectations.
## Testing
- Not run locally.
- Added `ts/packages/cli/scripts/validate-skills.ts` checks for
stable/beta markers, channel-specific content, and required reference
files.
- Added `ts/packages/cli/test/src/effects/install-skill.test.ts`
coverage for skill installation behavior.
- Added `ts/scripts/validate-examples.ts` to validate example package
manifests during `pnpm test`.
- CI workflow now runs `pnpm run validate:skills` before packaging CLI
skill files.
## Summary
- Adds a persisted CLI user config file for experimental feature flags,
artifact directory overrides, and experimental subagent target
selection.
- Wires config-aware command visibility into root command construction,
help text, and validation error handling so experimental commands only
appear when enabled.
- Updates runtime helpers and session artifact resolution to honor the
new CLI config values.
- Expands installation workflow checks and adds tests for the new CLI
config service.
## Testing
- `pnpm test ts/packages/cli/test/src/services/cli-user-config.test.ts`
- `pnpm test ts/packages/cli/test/src/commands/$default.cmd.test.ts`
- Not run: full repo test suite
- Not run: install workflow end-to-end in this environment
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary
- **Auto-beta on push to `next`**: any merge touching
`ts/packages/cli/**` automatically builds binaries and creates a
`@composio/cli@X.Y.Z-beta.<run_number>` prerelease. Version = latest
stable + patch bump.
- **Stable on version bump**: if `ts/packages/cli/package.json` version
changed in the push commit (i.e. changeset "Release: update version"
merge), creates a stable release instead.
- **`workflow_dispatch` build-beta**: build a beta from any branch on
demand.
- **`workflow_dispatch` promote-stable**: promote an existing beta tag
to stable (unchanged).
- Removes the old PR-title-gated flow (`pull_request` trigger with title
check).
## Test plan
- [ ] Merge into `next` with a CLI change → verify beta release is
created
- [ ] Trigger `workflow_dispatch` with `build-beta` on a feature branch
→ verify beta release
- [ ] Merge a changeset "Release: update version" PR → verify stable
release is created
- [ ] Trigger `workflow_dispatch` with `promote-stable` + existing beta
tag → verify stable release
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When triggered by repository_dispatch, github.actor is a bot that
can't be added as a reviewer, causing the workflow to fail. Fall back
to adding Sushmithamallesh and use continue-on-error so the workflow
always succeeds.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The indented PY heredoc delimiters weren't matched because <<'PY'
requires an unindented terminator. Replace with python3 -c one-liners.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary
- Add support for beta CLI releases in the binary publish workflow,
including beta tag validation and promotion to stable from an existing
prerelease tag.
- Update `composio upgrade` to support a `--beta` flag that stays on the
prerelease channel.
- Refresh release documentation and CLI README to describe the new
beta/stable release model.
- Expand upgrade binary tests to cover prerelease resolution and
channel-specific behavior.
## Testing
- Not run (PR content generation only).
- Checked the workflow and CLI changes for beta/stable tag handling
paths.
- Reviewed updated release documentation for the new promotion flow.
## Summary
- replace runtime MCP SDK path resolution with static imports in the
structured-output helper
- ensure the helper works when shipped next to the standalone CLI binary
without repo-local node_modules
## Verification
- pnpm --filter @composio/cli run typecheck:src
- pnpm --filter @composio/cli test
test/src/services/run-subagent-acp.test.ts
- built and executed the bundled helper from a temp directory outside
the repo
## What changed
- make `build:binary:cross` emit the `run-subagent-*.mjs` companion
modules alongside the compiled CLI binary
- update the `Build CLI Binaries` workflow to include those companion
modules in the published release archives
- make `install.sh` copy companion modules when they are present, while
remaining backward compatible with older archives that only contain
`composio`
- fix the CLI installation workflow assertions to match the actual
installer behavior and paths
## Why
`composio run` launches a separate Bun runtime that imports the
`run-subagent-*` helpers from disk. The main binary alone is not
sufficient. The previous release workflow zipped only the `composio`
binary, so prerelease assets installed successfully but failed at
runtime with missing-module errors.
The installation test workflow also had stale expectations for
`~/.composio/bin/composio` and `COMPOSIO_INSTALL`, which caused false
negatives even when installation itself succeeded.
## Impact
- newly built CLI release assets will contain the files required for
`composio run`
- `install.sh` will install sidecars for new releases and ignore them
for older releases
- the installation workflow will validate the real install layout
instead of the stale `bin/` path
## Validation
- `pnpm --filter @composio/cli run build:binary:cross --target
bun-darwin-arm64` from the existing checkout emitted:
- `dist/binaries/composio-darwin-aarch64`
- `dist/binaries/companions/run-subagent-shared.mjs`
- `dist/binaries/companions/run-subagent-acp.mjs`
- `dist/binaries/companions/run-subagent-legacy.mjs`
- simulated the GitHub Actions archive step and verified the zip
contains `composio` plus all three companion modules
- earlier local binary/package validation on the main fix branch
confirmed the extracted binary runs `composio run
'console.log("hello")'` successfully once those files are packaged
## Summary
- **Skill installer**: New `installSkill` effect that downloads and
installs the `composio-cli` skill for Claude Code during `composio
login`. Downloads `composio-skill.zip` from the matching GitHub release,
extracts to `~/.agents/skills/composio-cli/`, and creates a symlink at
`~/.claude/skills/composio-cli`. Non-fatal — wrapped in
`installSkillSafe` so failures don't block login. Adds
`--no-skill-install` flag to skip.
- **Root help improvements**: Added `composio files` subcommand help,
richer examples (multi-query search, parallel execute, multi-step `run`
scripts), and inline FILES section in main help output.
- **Contextual help on errors**: When a CLI command fails or receives
unknown arguments, the relevant subcommand help text is now printed
alongside the error message.
- **Session artifacts hardening**: `resolveArtifactsRoot()` now respects
`COMPOSIO_SESSION_DIR` / `COMPOSIO_CACHE_DIR` env vars and falls back to
`os.tmpdir()`. All filesystem operations (mkdirSync, appendFileSync,
writeFileSync) are wrapped in try/catch to avoid crashes in sandboxed
environments.
- **Analytics dir creation**: Wrapped `mkdirSync` for the analytics
directory in try/catch (non-fatal in sandboxed environments).
- **Consumer cache hardening**: Added error handling for cache
read/write in sandboxed environments.
- **FetchHttpClient layer**: Added `FetchHttpClient.layer` to production
layers so `installSkill` HTTP requests work correctly.
- **Symlink fix**: Fixed stale/broken symlink handling in
`install-skill.ts` — uses `lstatSync` instead of `existsSync` to
correctly detect and remove broken symlinks and directories.
- **TS fix**: Changed `detectMaster` parameter type from
`NodeJS.ProcessEnv` to `Record<string, string | undefined>` to avoid
type conflict from bun env augmentation.
- **Cleanup**: Removed accidentally committed `workdir/temp.md`.
## Test plan
- [ ] `composio login` installs skill to
`~/.agents/skills/composio-cli/` and creates symlink at
`~/.claude/skills/composio-cli`
- [ ] `composio login --no-skill-install` skips skill installation
- [ ] `composio --help` shows updated examples and FILES section
- [ ] Passing an unknown flag to a command prints contextual help
alongside error
- [ ] CLI works in sandboxed environments where `$TMPDIR` or
`~/.composio/` may not be writable
- [ ] `pnpm typecheck` passes with no errors
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Modified the TS release workflow to use the publishedPackages output from changesets/action.
Previously, it relied on 'pnpm changeset status' which is empty after publishing.
Added logic to fetch the previous version from the repository history to show the bump.
Made-with: Cursor
Claude was getting 15 permission denials because the default sandbox
blocks file writes. Add allowed_tools to let Claude read/edit docs files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On manual trigger, github.event.before and github.event.after are empty.
Fall back to HEAD and HEAD~1 respectively.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
claude-code-action requires OIDC token access (id-token: write) to function.
Both docs.sync-connect-clients.yml and docs.sdk-change-sync.yml were missing
this permission, causing the connect clients sync to fail.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All docs automation workflows now request a review from github.actor
(the person who pushed, dispatched, or manually triggered the run).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fall back to HEAD~1 when the before SHA is either null or not
reachable (e.g., after a force-push).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Handle null SHA on force-push/first push in sdk-change-sync
- Add error handling for empty/failed fetches in sync-connect-clients
- Remove unnecessary id-token:write permission from both workflows
- Write diff directly to file instead of shell variable
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use github.event.before..after to capture all SDK changes in
multi-commit pushes, not just the last commit.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace manual git/gh PR creation with peter-evans/create-pull-request
in both sync-connect-clients and sdk-change-sync workflows, matching
the pattern used by docs-update-data and generate-sdk-docs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pass repository_dispatch payload values through env variables instead
of inline ${{ }} expansion in run: blocks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pass repository_dispatch payload values through env variables instead
of inline ${{ }} expansion in run: blocks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When SDK source code changes land on next, Claude reviews the diff
and updates any guides, FAQs, or examples that reference the changed
APIs. Auto-generated reference pages are handled separately.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add structured summaries and what-changed sections to auto-generated
PRs from docs-update-data and generate-sdk-docs workflows.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of polling on cron and failing silently because Claude can't
access the private dashboard repo, accept repository_dispatch events
from dashboard production deploys with client definitions in the
payload. Falls back to CI_BOT_TOKEN fetch for manual triggers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The claude-code-action rejects PRs from non-human actors by default.
Add devin-ai-integration[bot] to allowed_bots so the doc review
workflow can run on Devin's PRs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>