## Release cli v1.0.2
**Scope:** `cli` | **Bump:** `patch`
---
### How this release process works
1. **This PR was created automatically** by the "release / create-pr"
workflow.
It bumped the `cli` packages to `1.0.2`
and generated AI-enhanced release notes.
2. **CI runs on this PR** — the full test suite (unit tests, lint, type
checks, build)
must pass before merging. This is the review gate.
3. **Review the release notes** in `release-notes.md` in this PR.
If a Notion draft was created, you can edit the release notes there
before merging.
4. **When this PR is merged**, the `release / publish` workflow
automatically:
- Builds all packages
- Publishes the `cli` packages to npm at version `1.0.2`
- Creates git tag `cli/v1.0.2`
- Creates a GitHub Release with the final release notes
### Before merging
- [ ] CI is green (tests, lint, types, build)
- [ ] Version bumps look correct
- [ ] Release notes are accurate (edit in Notion if a draft was created)
---
> **Do not merge until CI is fully green.** The full test suite runs
automatically on this PR.
- Add tests for bumpPackages: verifies workspace:* protocol is
preserved and exact version deps are updated
- Add vitest config for scripts/release/
- Add release script test step to test_unit.yml so these run on
every PR and push to main
bumpPackages was overwriting internal dependency references like
"workspace:*" with the new version string, causing pnpm to try
resolving the version from the npm registry (which fails because
it hasn't been published yet). Now skips deps using workspace protocol.
Each release scope has its own packages, version source, and
independent version track:
- monorepo: 12 core @copilotkit/* packages (shared version)
- cli: copilotkit CLI (independent version)
- angular: @copilotkitnext/angular (independent version)
Branch pattern is now release/publish/<scope>/v<version> and git
tags use <scope>/v<version> for non-monorepo scopes.
- Replace import.meta.dirname (Node 21.2+) with fileURLToPath workaround
for Node 20 compatibility
- Rename workflows to release / pre, release / publish, release /
create-pr so they group together in the Actions UI
- Fix semver regex to allow hyphens in prerelease identifiers
- Add unit tests for parseSemver, computeNextStableVersion,
computePrereleaseVersion
- Replace import.meta.dirname (Node 21.2+) with fileURLToPath
workaround for Node 20 compatibility
- Rename workflows to release / pre, release / publish, release /
create-pr so they group together in the Actions UI
- Fix semver regex to allow hyphens in prerelease identifiers
- Add unit tests for parseSemver, computeNextStableVersion,
computePrereleaseVersion
Remove the entire changesets infrastructure (config, patches, custom
GitHub Action, pre.json mode switching) and replace it with a simple,
stateless release system designed around two workflows:
Stable release:
1. Run "create release PR" workflow — pick patch/minor/major
2. Workflow bumps all package.json versions, generates AI release notes,
opens a PR
3. Full CI test suite runs on the PR (lint, types, build, tests)
4. Merge the PR → "publish release" workflow triggers automatically
5. Publishes all @copilotkit/* packages to npm, creates git tag +
GitHub Release with AI-generated notes
Pre-release:
1. Run "publish prerelease" workflow — pick patch/minor/major
2. Computes stateless version (e.g. 1.56.0-next.<timestamp>)
3. Publishes to npm with "next" tag. No commits, no state files.
Key improvements over changesets:
- No pre.json mode switching or state corruption
- No patches to upstream packages
- No enter/exit prerelease ceremonies
- Version management is just "pick patch/minor/major"
- AI-generated release notes via Anthropic API
- SOC2 compliant — nothing auto-merges, release PR is the review gate
- Private packages automatically excluded via allowlist in config
Replace changesets with a simple, stateless release system:
Stable release (PR-gated):
Actions → "create release PR" → pick patch/minor/major → CI runs →
merge → publishes to npm, creates git tag + GitHub Release
Prerelease (ad-hoc):
Actions → "publish / prerelease" → publishes current version with
-canary.<suffix|timestamp> to npm under "canary" tag
Key features:
- All 12 core @copilotkit/* packages share a single version
- AI-generated release notes via Anthropic API
- Notion draft for team editing before merge
- Notion link commented on the release PR
- Guards: concurrent release PR check, version > npm check, clean
semver check, canary-only prerelease tag
- release/publish/v* branch pattern (hard to accidentally match)
- TypeScript throughout (tsx runner)
- release.config.json with versionedTogether/versionedIndependently
Templates were pinned at old @ag-ui/client versions (0.0.40–0.0.46).
@copilotkit/runtime@1.55.2 ships 0.0.52, which added private fields to
AbstractAgent. The version split caused a nominal type error on build.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
## Summary
Two UI regressions introduced in 1.55, both in `react-ui`:
**1. Input not pinned to bottom of chat window**
The attachments drag-and-drop feature (`fc1cfa09d`) wrapped
messages+input in a `<div className={dragOver ? "copilotKitDragOver" :
""}>`. When not dragging that's `class=""` — no CSS rule targets it, so
it collapses to content height inside the flex-column window. Fix:
always apply `copilotKitChatBody` class and give it `flex: 1 1 0%;
display: flex; flex-direction: column; min-height: 0`.
**2. Empty space below app content when sidebar is mounted**
`818e4e767` added `min-height: 100vh; height: 100%` to
`.copilotKitSidebarContentWrapper`, causing a full-viewport gap below
page content even when collapsed. Fix: remove those height rules — the
wrapper only needs `margin-right` to push content left.
## Test plan
- [ ] Open `CopilotSidebar` — input pinned to bottom, messages fill
remaining space
- [ ] Open `CopilotPopup` — same
- [ ] Mount `CopilotSidebar` collapsed — no empty space below app
content
- [ ] Open/close sidebar — margin-right transitions correctly, no blank
space
- [ ] Drag file over chat — `copilotKitDragOver` class still applies
- [ ] CI passes
🤖 Generated with [Claude Code](https://claude.com/claude-code)
818e4e767 added min-height: 100vh / height: 100% to
.copilotKitSidebarContentWrapper and its children in an attempt to
support full-height children inside the sidebar. This caused empty
space equal to the full viewport height to appear below the app
content whenever CopilotSidebar was mounted, even when collapsed.
The wrapper only needs to push the page content left (via margin-right)
when the sidebar expands — it does not need to control its own height.
Remove the height rules; child layout is the responsibility of the
app, not the sidebar wrapper.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Templates had stale pinned versions ranging from 1.9.3 to 1.52.1.
The CLI does a verbatim sparse checkout of these files, so users
scaffolding via `copilotkit create` were getting old versions installed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The drag-and-drop wrapper div added in fc1cfa09d (attachments feature)
broke the flex layout of the chat window. The div had no class when
not dragging, so no CSS rule applied flex-grow — messages and input
collapsed to their natural height instead of filling the window.
Add copilotKitChatBody class to the wrapper and give it flex: 1 1 0%
so it claims the remaining window height, restoring the input-pinned-
to-bottom behaviour present in 1.51.1.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
## Summary
The showcase image drift detection compared image tags against `main`
HEAD SHA, but deploys only trigger when `showcase/` or
`examples/integrations/` paths change. Any non-showcase commit to main
(package bumps, workflow changes, docs, etc.) made ALL images appear
stale, triggering unnecessary rebuild workflows and Slack alerts.
## Root Cause
```bash
# Before: always stale after non-showcase commits
MAIN_SHA=$(git ls-remote ... main | cut -f1)
```
## Fix
Query the GitHub API for the last commit that actually touched
showcase-related paths, then check image tags against those SHAs:
```bash
SHOWCASE_SHA=$(gh api "repos/.../commits?path=showcase&per_page=1" --jq '.[0].sha')
EXAMPLES_SHA=$(gh api "repos/.../commits?path=examples/integrations&per_page=1" --jq '.[0].sha')
# Image is up-to-date if it matches EITHER SHA
```
## Impact
- No more false-positive drift alerts flooding #oss-alerts
- No more unnecessary rebuild triggers for every non-showcase commit
- Drift detection now only fires when showcase code actually changed but
images weren't rebuilt
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The drift check compared image tags against main HEAD SHA, but deploys
only trigger when showcase/ or examples/integrations/ paths change. Any
non-showcase commit to main made ALL images appear stale, triggering
unnecessary rebuild workflows and Slack alerts.
Fix: query the GitHub API for the last commit that touched each path
and check image tags against those SHAs instead.
When #3550 was landed, it dropped the thread routes used for the
intelligence platform. This restores them and adds tests to ensure
they're not dropped again.
## Summary
Showcase drift detection has been failing since the LFS fix landed
because `pnpm install` doesn't work in `showcase/tests/` — it only has
`package-lock.json`, not `pnpm-lock.yaml`.
Changed `pnpm install` → `npm ci` and removed the unnecessary
`pnpm/action-setup` step. Also added `--with-deps` to Playwright install
for OS dependencies.
Closes#3689
## Test plan
- [ ] Next scheduled drift detection run succeeds
🤖 Generated with [Claude Code](https://claude.com/claude-code)
## Summary
The showcase drift detection workflow has been failing on every
scheduled run since Apr 9 (issue #3689) because Git LFS fetch fails:
```
error: failed to fetch some objects from 'https://github.com/CopilotKit/CopilotKit.git/info/lfs'
```
The workflow runs Playwright against deployed Railway backends — it
doesn't need any LFS blobs. Changing `lfs: true` to `lfs: false` fixes
the checkout and restores drift detection.
## Impact
Every 6-hour drift detection run has been failing, firing Slack alerts
to #oss-alerts and masking actual drift. This is urgent.
Closes#3689
## Test plan
- [ ] Next scheduled run completes successfully
🤖 Generated with [Claude Code](https://claude.com/claude-code)
## Summary
- Remove `sed` build-time patches and `grep` verification lines from 6
`Dockerfile.app` files
- Delete `crewai-crews/docker-route-override.ts` (no longer needed)
- Source `route.ts` files now read `process.env.AGENT_URL` natively
(merged in #3737)
These patches were added when building the starter e2e smoke tests
(#3698) because the source code hardcoded `http://localhost:8000`. Now
that the source reads from `AGENT_URL`, the Docker build-time
workarounds are redundant.
## Test plan
- [x] Verified all 6 starters have `AGENT_URL` in source route.ts on
main
- [ ] CI starter smoke tests pass (same behavior, fewer moving parts)
🤖 Generated with [Claude Code](https://claude.com/claude-code)