Repository navigation
Releases: andyzengmath/copilot-plugin-cc
Release list
v0.0.22
Post-v0.0.21 hygiene + UX bundle. 16 untagged PRs (#88-#103) shipped
between the v0.0.21 tag and this release across two directed
4-team meta-review cycles. Most were doc/test hygiene; this entry
captures only the user-facing changes worth a CHANGELOG line.
Fixed:
formatActiveModelLinefallback display stringclaude-sonnet-4.5
→claude-sonnet-4.6(PR #89). The fallback surfaces in the setup
report and per-call stderr echo when no model is configured. The
pre-existing literal-format-locking test at
active-model-info.test.mjs:142silently agreed with the stale
literal, which is precisely why the bug shipped through 21 releases
— fixed in source + test together.task --prompt-file <path>now wrapped in try/catch with a
normalized error:Failed to read --prompt-file ...: <code>instead
of a raw NodeENOENTtrace (PR #93). The flag was previously
documented in the command MD but missing from theprintUsagehelp
banner; both surfaces are now in sync.
Added:
setup --probe-modelsnow emits a stderr progress signal:Probing N models in parallel (up to 60s each)...before the await, and
Probe complete: X ok, Y unavailable, Z unknown.after (PR #100).
Real Copilot CLI cold-start is ~33s per model — without the
heartbeat the user sees a silent 30-60s terminal and assumes the
plugin hung.- Top-level
--version/-vflag (PR #101). Reads version from
.claude-plugin/plugin.jsonso users can confirm which version is
installed without reading the manifest by hand. Helpful for bug
reports. printUsagebanner synced with eachcommands/<cmd>.md
argument-hint(PR #101): adds--default-model,--default-effort,
--probe-modelsto setup;--model,--effortto review and
adversarial-review;--wait,--timeout-msto status. A
// Keep in sync with each commands/<cmd>.md argument-hintcomment
was added to make the contract explicit.
Process notes:
- Two directed 4-team meta-review cycles. Round 1 (PR #93) found 7
dead exports + the snapshot-test rubber-stamp pattern. Round 2
(PR #99) — broader prompt scope per the recipe shipped in PR #92
— found 3 MORE dead exports the round-1 narrower scope missed,
plus a Path B cross-doc descope sweep (README + cli-runtime SKILL
still described the descoped feature as live). The audit ritual- cadence trigger added in PR #92 codifies the recipe in
CONTRIBUTING.md.
- cadence trigger added in PR #92 codifies the recipe in
- New maintainer memory entries this cycle:
feedback_audit_prompt_scope_determines_findings,
feedback_iterative_audit_converges_in_2_rounds,
feedback_snapshot_tests_can_rubber_stamp_stale_literals.
Test suite: 180 / 179 pass / 1 skipped (was 174 / 173 / 1 at v0.0.21;
+1 from PR #95 probe-timeout coverage, +4 from PR #97 setup-config
gate flag e2e tests, +1 from PR #100 probe-progress assertion).
CI green on Ubuntu and Windows across all 16 PRs.
See merged PRs #88-#103 for the full session arc; the canonical
audit-bundle list lives in CONTRIBUTING.md → Doc-vs-code audit ritual → Past audits and the per-PR rationale lives in the handoff
doc's ### Post-v0.0.21 hygiene (untagged) block.
v0.0.21
Single fix surfaced by the v0.0.20 post-release dogfooding smoke test (the first time the plugin exercised its own commands against a real Copilot CLI install immediately after a release).
Fixed
-
probeModelAvailabilitydefaulttimeoutMs15000 -> 60000ms (#85). Running/copilot:setup --probe-modelsagainst Copilot CLI 1.0.40-0 immediately after v0.0.20 reported all 7 probed models as 'unknown — probe timed out after 15000ms' with no real availability signal. Measured cold-start ofcopilot -p "ping" --model gpt-5.5was ~33s end-to-end (each one-shot CLI invocation re-loads agent skills + MCP servers before resolving the model — cold-start dominates). The 15s default (set in v0.0.7) was reliably below that.Bumped to 60s with a measurement comment in the source so future re-tunings are data-driven. Probes still run in parallel via
Promise.all, so wall-clock cost of--probe-modelsis bounded by the slowest probe, not the sum. Default extracted to aDEFAULT_PROBE_TIMEOUT_MSmodule-level constant per project convention.
Process notes
First release directly verified by the v0.0.20 CONTRIBUTING.md pre-release smoke test. Post-fix probe result on a real account: 6 / 7 models OK, 1 (claude-opus-4.6-fast) correctly identified as unavailable via isModelUnavailableStderr and surfaced in the next-steps banner.
Test suite
174 / 173 pass / 1 skipped (unchanged — the change is a default-value bump; existing setup-probe.test.mjs cases use a fake Copilot binary with no real cold-start).
See merged PRs #85, #86 for the full review history (including the /pr-review consistency finding that turned the inline 60000 into a named constant).
v0.0.20
User-facing model-alias refresh. The 2026-04-30 supported-models doc check (docs.github.com/en/copilot/reference/ai-models/supported-models) surfaced gpt-5.5 as the new top-of-family non-codex GPT model — bumps the plugin's gpt alias to track the catalog. Mirrors the v0.0.11 / v0.0.12 alias-refresh recipe.
Changed
MODEL_ALIASES(#76):gpt -> gpt-5.5(wasgpt-5.4since v0.0.12). Strictly additive — concrete model names always passed through verbatim, so--model gpt-5.5already worked; this just bumps the user-facing shortcut.- README and
copilot-cli-runtime/SKILL.mdalias lists refreshed to match. - Inline alias-resolution comment at
copilot-companion.mjs:321synced togpt -> gpt-5.5. The first commit missed it; the/code-reviewpass on PR #76 surfaced it and the fixup landed in the same PR.
Other catalog deltas (none actionable)
claude-opus-4.7,claude-sonnet-4.6,claude-haiku-4.5,gpt-5.3-codexare all still latest in their families — match existing aliases.gpt-5.4-miniandgpt-5.4-nanoexist but never had short aliases.
Added
tests/runtime-task.test.mjs:task --model gpt resolves the alias to --model gpt-5.5 via -p(+1 case). Mirrors existing codex/opus alias-resolution tests so a future bump cannot silently stale the alias.
COMMON_PROBE_MODELS deliberately retains both gpt-5.5 and gpt-5.4 (and other prior-generation models) since the probe list is about what users commonly ask for, not just current top-of-family.
Test suite
174 / 173 pass / 1 skipped (was 173 / 172 / 1; +1 from the new gpt-alias case). CI green on Ubuntu and Windows.
v0.0.19
Polish cycle on top of v0.0.18. Tightens engines.node to actually enforce the per-major-line floors v0.0.18 intended (#72), plus a documentation refresh that brings the README and handoff doc in sync with the v0.0.17 and v0.0.18 hardenings.
Fixed
engines.node(#72): tightened from>=18.20.2 || >=20.12.2 || >=22.0.0to^18.20.2 || ^20.12.2 || >=22.0.0. The previous expression reduced to effectively>=18.20.2because npm semver>=is unbounded above, silently accepting Node 19.x and 21.x (both EOL) on hosts that may lack the CVE-2024-27980 (.cmdargv-injection) patch v0.0.18 was trying to require. The new caret-bounded expression enforces 18.x ≥ 18.20.2, 20.x ≥ 20.12.2, and 22.0.0+ explicitly. Behavioral change: Node 19.x and 21.x users now hit a clear engines mismatch onnpm installinstead of silently passing through to an unpatched runtime. Both lines are EOL upstream, so the practical impact is small.
Changed
README.md(#71): refresh through v0.0.18. Status section bumped v0.0.16 → v0.0.18. Replaced the shell-metacharacter deny-list bullet with a description of the v0.0.18lib/safe-spawn.mjscross-spawn helper. Added a defense-in-depth bullet covering the v0.0.17--no-ask-user+--secret-env-varsflags and the v0.0.18--deny-tool=shell(<cmd>:*)denials forcurl/wget/nc/ncat/ssh. Test count169→173. Drop theSHELL_METACHAR_REreference from the unit-test list; mentiontests/safe-spawn.test.mjsas the first CI test exercising the production Windows.cmd-launcher spawn path. Requirements bumped to Copilot CLI 1.0.11+ and Node.js 18.20.2+/20.12.2+/22.0.0+. Security paragraph now references the v0.0.18 cross-spawn helper plus--deny-toolexfiltration denials.docs/plans/2026-04-20-v08-handoff.md(#67, #68, #69): post-v0.0.18 update folding the cross-spawn refactor notes; post-merge stale-reference cleanup (replaced the### Security deny-listsection with### Spawn safety (cross-spawn helper, v0.0.18); replaced the### EFFORT_TO_MODEL / fallback-chain tuningbacklog entry with### MODEL_ALIASES refresh); 2026-04-30 upstream audit (CLI 1.0.40-0) confirming both upstream-blocked items remain blocked. Net new flag surface since 1.0.39:--reasoning-effort(alias for--effort) and--no-bash-env— neither actionable..gitignore(#70): add.claude/alongside the existing.omc/entry. Per-user Claude Code agent-tool state shouldn't be staged by accidentalgit add ..
Test suite
173 / 172 pass / 1 skipped. Unchanged count (no source behavior changes apart from engines.node; test fixtures unaffected). CI green on Ubuntu and Windows runners (both on Node 22, satisfying the third clause of the new engines.node).
See merged PRs #67, #68, #69, #70, #71, #72, #73 for the full review history.
v0.0.18
0.0.18
Security hardening continuation on top of v0.0.17. Closes the
deferred items from the 2026-04-29 deep-dive: --deny-tool patterns
that previously broke under Windows shell:true cmd.exe parsing
now ship cleanly via a new cross-spawn-style helper.
Added:
lib/safe-spawn.mjs— drop-in replacement forchild_process.spawn
that handles Windows.cmd/.batlaunchers correctly without
usingshell: true. Modeled onmoxystudio/node-cross-spawn's
parseNonShell+ escape pipeline. Pre-resolves PATHEXT, builds
cmd.exe /d /s /c "<escaped>"with backslash-double-quoting +
caret-escape of cmd metacharacters, spawns with
windowsVerbatimArguments: true. cmd-shims under
node_modules/.binget a second escape pass (BatBadBut
mitigation).- 5x
--deny-tool=shell(<cmd>:*)flags pinned on broker
DEFAULT_COPILOT_SPAWN_ARGSand one-shotrunCopilotClifor
curl,wget,nc,ncat,ssh. Percopilot help permissions:
"Denial rules always take precedence over allow rules, even
--allow-all-tools." Closes the prompt-injection-via-curl /
exfiltration-via-nc threats. These commands have no legitimate
use in code-review or rescue workflows (GitHub API →gh; npm
registry →npm). tests/safe-spawn.test.mjs(3 tests). One Windows-only test
writes a.cmdshim aroundfake-copilot.mjsand asserts
metachar argv (--deny-tool=shell(curl:*)) reaches the child
verbatim through the launcher. This is the FIRST CI test that
exercises the production Windows.cmd-launcher path —
previously tests always pointedCOPILOT_COMPANION_COPILOT_COMMAND
atnode fake.mjsand never touched theshell:truebranch.
Changed:
- All three spawn sites (
SpawnedCopilotAcpClient.initialize,
runCopilotCli,probeSingleModel) migrated tosafeSpawnwith
shell: falseeverywhere. The Windows-vs-non-Windows shell
ternary is gone. engines.nodebumped from>=18.18.0to
>=18.20.2 || >=20.12.2 || >=22.0.0so the CVE-2024-27980 patch
(Node's mitigation against.cmdargv injection) is guaranteed
present. Older 18.x lines are unpatched and would silently lose
the entire mitigation.
Removed:
assertNoShellMetacharshelper +SHELL_METACHAR_REconstant
(-50 LOC). The hand-rolled deny-list was incomplete (didn't
cover(,),*) and applied only to a subset of argv
positions. safeSpawn's full escape pipeline replaces it across
all spawn sites.tests/shell-metachar-regex.test.mjs(-72 LOC). The unit tests
for the deleted helpers go with them.
Test suite: 173 / 172 pass / 1 skipped on Ubuntu + Windows CI.
The new safe-spawn.test.mjs Windows-only test passes on the
windows-latest runner — first CI exercise of the production
.cmd-launcher spawn path.
v0.0.17
0.0.17
Security hardening cycle on top of v0.0.16. Two new flags surfaced
from the 2026-04-29 upstream audit (Copilot CLI 1.0.39) make the
plugin's broker and one-shot CLI explicitly non-interactive and
redact auth tokens from any debug-style shell output the agent
might surface.
Added:
--no-ask-user(PR #60). The plugin runs through Claude Code's
ACP harness, so the agent'sask_usertool had no human to
answer it —firstAllowOptionwas auto-approving the
session/request_permissioninstead, which let the tool fire but
return without meaningful input. Now the tool is unavailable at
the CLI level, so the agent never tries to use it.--secret-env-vars=COPILOT_GITHUB_TOKEN,GH_TOKEN,GITHUB_TOKEN
(PR #61). Redacts the three auth-token env vars from broker logs
and any shell output the agent surfaces. An LLM-generated
cat $env:GH_TOKENwhile debugging now shows[REDACTED]instead
of the literal token in stdout.
Both flags are added to DEFAULT_COPILOT_SPAWN_ARGS (the broker
spawn) and to runCopilotCli (the one-shot -p path) so per-call
--model / --effort runs match the broker's behavior.
Internal cleanup since v0.0.16 (no user-visible behavior change):
- README rewrite + 3 pre-existing OneDrive-on-Windows test fixes
(PR #56 — root cause wasCLAUDE_PLUGIN_DATAand
COPILOT_COMPANION_SESSION_IDenv-leakage from real Claude Code
sessions into spawned test subprocesses; tests now scrub the vars
before spawn). - Drop pre-v0.0.16 effort-mapping prose from skill, agent, and
source comments (PR #57). README was updated in #56; #57 covers
the files #56 missed. - Remove dead
suppressActiveModelEchooption from
runAppServerTurn(PR #58). It was added speculatively in v0.0.15
and never used. Plus 3 new tests locking in the active-model
stderr echo format and edge cases (COPILOT_HOMEwith trailing
slash, JSONC inline comments). - 2026-04-29 upstream audit doc + design-doc deprecation note for
the removedEFFORT_TO_MODELmapping (PR #59).
Test suite: 169 / 168 pass / 1 skipped. Same on Ubuntu and Windows
CI. Two known flakes under high parallel load
(concurrent ensureBrokerSession, task --resume-last --effort high) — both pass cleanly when re-run alone; documented in
docs/plans/2026-04-20-v08-handoff.md "Known flakes".
v0.0.16
0.0.16
Closes the v0.0.15 user-reported bug: setting model: "gpt-5.5" in
~/.copilot/settings.json should mean every plugin command uses
GPT-5.5, but --effort high was silently overriding it with
claude-opus-4.6 because the plugin mapped reasoning-effort to a
specific Claude model. Copilot CLI 1.0.11+ has its own native
--effort flag now, so the plugin's mapping was double-counting.
Changed:
--effortnow passes straight through to Copilot CLI's native
--effort=<low|medium|high|xhigh>flag (1.0.11+ required). The
plugin'snone/minimalaliases still collapse tolowat spawn
time for codex-plugin-cc command parity.--modeland--effortcan be passed together; both flags forward
verbatim and Copilot's runtime applies them independently. The old
"--effort ignored because --model was passed" stderr notice is gone.- When
--effortis set without--model, the per-call CLI omits
--modelentirely so the user's~/.copilot/settings.jsondefault
model is preserved. - On
--resume-last, per-call--modeland--effortare dropped
together with a single combined stderr notice. (Broker holds the
session and cannot switch either mid-turn.) /copilot:setup --probe-modelsnow probes a fixed list
(COMMON_PROBE_MODELS: 7 entries spanning Claude and GPT)
instead of the now-removedEFFORT_TO_MODELderivation.
Removed:
EFFORT_TO_MODEL,EFFORT_FALLBACK_CHAIN,applyEffortFallbackModel,
buildEffortModelChain. Net -311 LOC across source + tests. The
multi-tier model-availability fallback chain is gone — Copilot's own
error surfaces directly when a model isn't available on the account.
Fixed:
writeCopilotDefaults(added in v0.0.15) usedDate.now()as part
of its temp filename, which could collide for two callers in the
same millisecond (CI / parallel-test scenarios). Switched to
crypto.randomUUID(). Caught by the soliton review of PR #54.
Tests:
- Rewrote 6 existing
--efforttests to assert the new
flag-passthrough behavior. Deleted 6 fallback-chain tests (behavior
removed). Added 1 test for "single spawn, no chain". Updated
tests/setup-probe.test.mjsfor the new probe list. - Full suite: 165/169 pass. The 3 remaining failures are pre-existing
resolveStateDir/statusissues on the OneDrive Windows
workspace, unrelated to this release.
v0.0.15
0.0.15
This release surfaces which Copilot model the plugin actually uses,
and adds a way to persist your default model + reasoning effort
without hand-editing settings.json.
Added:
- Active-model echo to stderr on every Copilot invocation so you can
see, at a glance, which model the plugin is dispatching to (alias- resolved model + source).
/copilot:setupoutput now prints the inherited model + effort +
source, alongside the existing auth/CLI checks./copilot:setup --default-model <name|alias>and
--default-effort <low|medium|high|xhigh>write your defaults
into~/.copilot/settings.jsonatomically. The writer preserves
leading//comments and unrelated keys, so hand-tuned files
survive the round-trip.--modeland--effortflags exposed in the
argument-hintfor/copilot:reviewand
/copilot:adversarial-review, matching the existing CLI runtime.- New
automodel alias maps to Copilot's auto-model selection
(GA 2026-04-17), so--model autonow works as a first-class
alias instead of a passthrough string.
Fixed:
~/.copilot/settings.jsonwas previously not read at all — model
preferences only lived inside the auth file (config.json). The
plugin now layerssettings.jsonon top so user-pinned defaults
actually take effect.COPILOT_HOMEenvironment variable is now honored when locating
the config dir. Earlier code only checkedXDG_CONFIG_HOME, which
meant users who relocated their Copilot data viaCOPILOT_HOME
silently fell back to~/.copilot.
Internal:
- Outdated
:92-93comment claiming Copilot has no per-call effort
knob is corrected. Copilot CLI 1.0.11+ added a real--effort
flag; a follow-up should pass it through directly instead of
routing effort through model aliases.
Test suite: 158 → 174 tests (+16: active-model-info ×8,
write-copilot-defaults ×9). 170 / 174 pass. The 3 remaining failures
are pre-existing OneDrive-on-Windows path-resolution issues in
resolveStateDir / status helpers, unrelated to this release.
v0.0.14
Two bugs found during a real local install + login on Copilot CLI
1.0.36. Both shipped in this release.
Fixed:
-
/copilot:setupreportedloggedIn: falseeven after a successful
copilot login(PR #52). Root cause: Copilot CLI 1.0+ changed the
~/.copilot/config.jsonschema in two ways the plugin didn't
track:- The file now starts with JS-style
//line comments that strict
JSON.parserejects, soreadCopilotConfigsilently returned
null. - Field names flipped snake_case → camelCase:
logged_in_users→loggedInUsers,
last_logged_in_user→lastLoggedInUser. Even on a success-
ful parse, the old field reads missed the signed-in user.
readCopilotConfignow strips full-line//comments before
parsing (narrow regex; block comments aren't observed in the
config).getCopilotAuthStatusreads both the camelCase and
snake_case key variants so CLI 0.x and 1.x both resolve.
tests/copilot-auth-status.test.mjsadded (+5) covering both
schemas, missing file, empty users, and malformed JSON. - The file now starts with JS-style
-
Marketplace manifest identifiers claimed "GitHub" ownership (PR
#51). Corrected to match the actual repo + author:.claude-plugin/marketplace.json"name":
"github-copilot"→"copilot-plugin-cc"(matches repo slug)..claude-plugin/marketplace.json"owner"and
plugins[0].author:"GitHub"→"andyzengmath".plugins/copilot/.claude-plugin/plugin.json"author":
"GitHub"→"andyzengmath".- README install command updated from
/plugin install copilot@github-copilotto
/plugin install copilot@copilot-plugin-cc.
Cross-checked against Anthropic's own
anthropics/claude-code/.claude-plugin/marketplace.json, which
uses a self-describing marketplace name and the real author
rather than the name of any plugin inside.Breaking change for users who installed via
/plugin install copilot@github-copilot: re-run with
/plugin install copilot@copilot-plugin-ccafter updating. The
/plugin marketplace add andyzengmath/copilot-plugin-ccstep is
unaffected (uses the repo path, not the manifest name).
Test suite: 153 → 158 tests (+5 auth-status cases). 157 pass, 1
skipped, 0 fail. CI green on both Linux and Windows.
v0.0.13
Small cleanup release. Two low-risk items that had drifted since
v0.0.8 (SECURITY.md) and v0.0.11 (SKILL.md alias list).
Changed:
EFFORT_TO_MODEL(PR #47):medium→claude-sonnet-4.6(was
claude-sonnet-4.5). Same Anthropic billing tier, no
cost/quota impact on--effort mediumflows.EFFORT_FALLBACK_CHAIN
first-fallback entry forhigh/xhighbumped to
claude-sonnet-4.6to stay consistent with the primary.- Unchanged —
--effort high/xhighstays on
claude-opus-4.6. The v0.0.12opusalias bumped to 4.7 for
users who explicitly type--model opus, but the effort-default
intentionally holds on 4.6 to avoid the 7.5x opus-4.7 premium-
request multiplier (through 2026-04-30) silently hitting
automation. plugins/copilot/agents/copilot-rescue.mdand
plugins/copilot/skills/copilot-cli-runtime/SKILL.mdhad stale
alias lists (still showedopus→ 4.6,sonnet→ 4.5, didn't
list the v0.0.11gpt/codexaliases). Refreshed to the
v0.0.12 state + the v0.0.13 sonnet default.SECURITY.md(PR #46): threat model refresh for everything
shipped since v0.0.3/4. Adds two bullets to "What the plugin IS
designed to defend against" — concurrent-session broker hijack
(v0.0.8broker.lock+ stale-PID recovery) and silent acceptance
of malformed structured review output (v0.0.8/9 schema
validator). Addsbroker.lockto the Secrets and paths table.
Expands "Known limits" to explicitly list per-ACP-session
sandboxing and Windows review-path--effortas upstream-
blocked rather than plugin-side plans.
Test suite: 153 tests, unchanged count (the sonnet bump is a
surgical rename, not new coverage). 152 pass, 1 skipped, 0 fail.
CI green on both Linux and Windows.