From 50b56600ddc38b85c9308cb9d541b15720aaf5ce Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sat, 28 Mar 2026 09:47:23 -0400 Subject: [PATCH 1/5] fix(docker): include docker/ assets in npm package The docker/ directory was missing from package.json files array, causing all ccs docker commands to fail after npm install with "Missing bundled Docker asset" error. Also add .npmignore exception for docker/*.sh since the blanket *.sh exclusion stripped the entrypoint script. Closes #829 --- .npmignore | 3 ++- package.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.npmignore b/.npmignore index 3df4e806..5b875530 100644 --- a/.npmignore +++ b/.npmignore @@ -12,9 +12,10 @@ docs/ .gitignore .gitmodules -# Development tools (keep installer scripts) +# Development tools (keep installer scripts and docker entrypoints) *.sh !installers/*.sh +!docker/*.sh # Logs and temp *.log diff --git a/package.json b/package.json index f8b205a8..2e5dee24 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "lib/", "scripts/", "config/", + "docker/", ".claude/", "VERSION", "README.md", From 13254f28a6d6170fe0a46ed2ed2326441cc2d717 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sat, 28 Mar 2026 09:47:37 -0400 Subject: [PATCH 2/5] test(docker): add regression test for bundled asset availability Verify all four integrated Docker assets (compose file, Dockerfile, supervisord config, entrypoint script) resolve and exist on disk. Prevents silent exclusion from future packaging changes. --- .../unit/docker/docker-assets-bundled.test.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tests/unit/docker/docker-assets-bundled.test.ts diff --git a/tests/unit/docker/docker-assets-bundled.test.ts b/tests/unit/docker/docker-assets-bundled.test.ts new file mode 100644 index 00000000..ec681518 --- /dev/null +++ b/tests/unit/docker/docker-assets-bundled.test.ts @@ -0,0 +1,21 @@ +import { existsSync } from 'fs'; +import { describe, expect, it } from 'bun:test'; +import { getDockerAssetPaths } from '../../../src/docker/docker-assets'; + +describe('docker bundled assets', () => { + const assets = getDockerAssetPaths(); + + it('resolves all required asset paths', () => { + expect(assets.composeFile).toContain('docker-compose.integrated.yml'); + expect(assets.dockerfile).toContain('Dockerfile.integrated'); + expect(assets.supervisordConfig).toContain('supervisord.conf'); + expect(assets.entrypoint).toContain('entrypoint-integrated.sh'); + }); + + it('all bundled assets exist on disk', () => { + expect(existsSync(assets.composeFile)).toBe(true); + expect(existsSync(assets.dockerfile)).toBe(true); + expect(existsSync(assets.supervisordConfig)).toBe(true); + expect(existsSync(assets.entrypoint)).toBe(true); + }); +}); From 228ed3b03673144a25563b6cf64309d4fef27871 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 28 Mar 2026 14:03:00 +0000 Subject: [PATCH 3/5] chore(release): 7.61.0-dev.1 [skip ci] --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2e5dee24..bdcf22db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kaitranntt/ccs", - "version": "7.61.0", + "version": "7.61.0-dev.1", "description": "Claude Code Switch - Instant profile switching between Claude, GLM, Kimi, and more", "keywords": [ "cli", From 3ebf17f1701f9d7fd60aade0ec6bd8147b91e761 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sat, 28 Mar 2026 10:10:31 -0400 Subject: [PATCH 4/5] fix(ci): require explicit /review command for AI review reruns --- .github/workflows/ai-review.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ai-review.yml b/.github/workflows/ai-review.yml index 96d22d3f..431cdbde 100644 --- a/.github/workflows/ai-review.yml +++ b/.github/workflows/ai-review.yml @@ -24,11 +24,12 @@ on: required: true type: string -# Smart concurrency: Prevents self-cancellation when bot posts review comment +# Smart concurrency: Prevents self-cancellation when non-command comments arrive # -# Problem: When the bot posts a review comment, GitHub fires an issue_comment event. -# This new workflow run joins the same concurrency group and cancels the in-progress -# run BEFORE job `if` conditions are evaluated - causing "operation was canceled" error. +# Problem: When a bot or maintainer posts a normal PR note, GitHub fires an +# issue_comment event. A loose substring match on "/review" can accidentally +# treat text like "CI/review" as a manual command, which joins the PR +# concurrency group and cancels the in-progress review. # # Solution: Non-actionable triggers (bot comments, comments without /review) get a # unique per-run group, while legitimate triggers share the PR-based group for proper @@ -38,7 +39,7 @@ concurrency: ai-review-${{ github.event_name == 'issue_comment' && ( github.event.comment.user.type == 'Bot' || - !contains(github.event.comment.body, '/review') + !startsWith(github.event.comment.body, '/review') ) && format('skip-{0}', github.run_id) || github.event.pull_request.number || github.event.issue.number || @@ -66,13 +67,13 @@ jobs: # Conditions: # - PR event: on opened, synchronize (new commits), or reopened - # - Comment event: only if it's a PR, contains /review, and NOT from a bot + # - Comment event: only if it's a PR, starts with /review, and NOT from a bot if: > github.event_name == 'pull_request_target' || github.event_name == 'workflow_dispatch' || (github.event_name == 'issue_comment' && github.event.issue.pull_request && - contains(github.event.comment.body, '/review') && + startsWith(github.event.comment.body, '/review') && github.event.comment.user.type != 'Bot' && contains(fromJSON('["COLLABORATOR","MEMBER","OWNER"]'), github.event.comment.author_association)) From 91b800003bb8440aeb547c8a2f67d7fe67281c62 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 28 Mar 2026 14:14:56 +0000 Subject: [PATCH 5/5] chore(release): 7.61.1 [skip ci] ## [7.61.1](https://github.com/kaitranntt/ccs/compare/v7.61.0...v7.61.1) (2026-03-28) ### Bug Fixes * **ci:** require explicit /review command for AI review reruns ([3ebf17f](https://github.com/kaitranntt/ccs/commit/3ebf17f1701f9d7fd60aade0ec6bd8147b91e761)) --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd7c55f8..6f4d94a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## [7.61.1](https://github.com/kaitranntt/ccs/compare/v7.61.0...v7.61.1) (2026-03-28) + +### Bug Fixes + +* **ci:** require explicit /review command for AI review reruns ([3ebf17f](https://github.com/kaitranntt/ccs/commit/3ebf17f1701f9d7fd60aade0ec6bd8147b91e761)) + ## [7.61.0](https://github.com/kaitranntt/ccs/compare/v7.60.1...v7.61.0) (2026-03-27) ### Features diff --git a/package.json b/package.json index f8b205a8..df1e2e28 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kaitranntt/ccs", - "version": "7.61.0", + "version": "7.61.1", "description": "Claude Code Switch - Instant profile switching between Claude, GLM, Kimi, and more", "keywords": [ "cli",