Skip to content

Releases: andyzengmath/copilot-plugin-cc

v0.0.22

Choose a tag to compare

@andyzengmath andyzengmath released this 02 May 22:07
2165299

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:

  • formatActiveModelLine fallback display string claude-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:142 silently 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 Node ENOENT trace (PR #93). The flag was previously
    documented in the command MD but missing from the printUsage help
    banner; both surfaces are now in sync.

Added:

  • setup --probe-models now 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 / -v flag (PR #101). Reads version from
    .claude-plugin/plugin.json so users can confirm which version is
    installed without reading the manifest by hand. Helpful for bug
    reports.
  • printUsage banner synced with each commands/<cmd>.md
    argument-hint (PR #101): adds --default-model, --default-effort,
    --probe-models to setup; --model, --effort to review and
    adversarial-review; --wait, --timeout-ms to status. A
    // Keep in sync with each commands/<cmd>.md argument-hint comment
    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.
  • 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

Choose a tag to compare

@andyzengmath andyzengmath released this 01 May 17:37
95e8470

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

  • probeModelAvailability default timeoutMs 15000 -> 60000ms (#85). Running /copilot:setup --probe-models against 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 of copilot -p "ping" --model gpt-5.5 was ~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-models is bounded by the slowest probe, not the sum. Default extracted to a DEFAULT_PROBE_TIMEOUT_MS module-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

Choose a tag to compare

@andyzengmath andyzengmath released this 01 May 13:26
3347b86

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 (was gpt-5.4 since v0.0.12). Strictly additive — concrete model names always passed through verbatim, so --model gpt-5.5 already worked; this just bumps the user-facing shortcut.
  • README and copilot-cli-runtime/SKILL.md alias lists refreshed to match.
  • Inline alias-resolution comment at copilot-companion.mjs:321 synced to gpt -> gpt-5.5. The first commit missed it; the /code-review pass 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-codex are all still latest in their families — match existing aliases.
  • gpt-5.4-mini and gpt-5.4-nano exist 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.

See merged PRs #76, #77 for the full review history.

v0.0.19

Choose a tag to compare

@andyzengmath andyzengmath released this 30 Apr 10:57
fb042a9

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.0 to ^18.20.2 || ^20.12.2 || >=22.0.0. The previous expression reduced to effectively >=18.20.2 because npm semver >= is unbounded above, silently accepting Node 19.x and 21.x (both EOL) on hosts that may lack the CVE-2024-27980 (.cmd argv-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 on npm install instead 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.18 lib/safe-spawn.mjs cross-spawn helper. Added a defense-in-depth bullet covering the v0.0.17 --no-ask-user + --secret-env-vars flags and the v0.0.18 --deny-tool=shell(<cmd>:*) denials for curl/wget/nc/ncat/ssh. Test count 169 → 173. Drop the SHELL_METACHAR_RE reference from the unit-test list; mention tests/safe-spawn.test.mjs as 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-tool exfiltration 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-list section with ### Spawn safety (cross-spawn helper, v0.0.18); replaced the ### EFFORT_TO_MODEL / fallback-chain tuning backlog 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 accidental git 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

Choose a tag to compare

@andyzengmath andyzengmath released this 30 Apr 01:08
641c040

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 for child_process.spawn
    that handles Windows .cmd/.bat launchers correctly without
    using shell: true. Modeled on moxystudio/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/.bin get a second escape pass (BatBadBut
    mitigation).
  • 5x --deny-tool=shell(<cmd>:*) flags pinned on broker
    DEFAULT_COPILOT_SPAWN_ARGS and one-shot runCopilotCli for
    curl, wget, nc, ncat, ssh. Per copilot 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 .cmd shim around fake-copilot.mjs and 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 pointed COPILOT_COMPANION_COPILOT_COMMAND
    at node fake.mjs and never touched the shell:true branch.

Changed:

  • All three spawn sites (SpawnedCopilotAcpClient.initialize,
    runCopilotCli, probeSingleModel) migrated to safeSpawn with
    shell: false everywhere. The Windows-vs-non-Windows shell
    ternary is gone.
  • engines.node bumped from >=18.18.0 to
    >=18.20.2 || >=20.12.2 || >=22.0.0 so the CVE-2024-27980 patch
    (Node's mitigation against .cmd argv injection) is guaranteed
    present. Older 18.x lines are unpatched and would silently lose
    the entire mitigation.

Removed:

  • assertNoShellMetachars helper + SHELL_METACHAR_RE constant
    (-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

Choose a tag to compare

@andyzengmath andyzengmath released this 29 Apr 13:35
d2c9be2

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's ask_user tool had no human to
    answer it — firstAllowOption was auto-approving the
    session/request_permission instead, 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_TOKEN while 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 was CLAUDE_PLUGIN_DATA and
    COPILOT_COMPANION_SESSION_ID env-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 suppressActiveModelEcho option 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_HOME with trailing
    slash, JSONC inline comments).
  • 2026-04-29 upstream audit doc + design-doc deprecation note for
    the removed EFFORT_TO_MODEL mapping (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

Choose a tag to compare

@andyzengmath andyzengmath released this 29 Apr 05:05
ce12c91

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:

  • --effort now passes straight through to Copilot CLI's native
    --effort=<low|medium|high|xhigh> flag (1.0.11+ required). The
    plugin's none/minimal aliases still collapse to low at spawn
    time for codex-plugin-cc command parity.
  • --model and --effort can 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 --effort is set without --model, the per-call CLI omits
    --model entirely so the user's ~/.copilot/settings.json default
    model is preserved.
  • On --resume-last, per-call --model and --effort are dropped
    together with a single combined stderr notice. (Broker holds the
    session and cannot switch either mid-turn.)
  • /copilot:setup --probe-models now probes a fixed list
    (COMMON_PROBE_MODELS: 7 entries spanning Claude and GPT)
    instead of the now-removed EFFORT_TO_MODEL derivation.

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) used Date.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 --effort tests 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.mjs for the new probe list.
  • Full suite: 165/169 pass. The 3 remaining failures are pre-existing
    resolveStateDir / status issues on the OneDrive Windows
    workspace, unrelated to this release.

v0.0.15

Choose a tag to compare

@andyzengmath andyzengmath released this 29 Apr 02:00
2324968

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:setup output 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.json atomically. The writer preserves
    leading // comments and unrelated keys, so hand-tuned files
    survive the round-trip.
  • --model and --effort flags exposed in the
    argument-hint for /copilot:review and
    /copilot:adversarial-review, matching the existing CLI runtime.
  • New auto model alias maps to Copilot's auto-model selection
    (GA 2026-04-17), so --model auto now works as a first-class
    alias instead of a passthrough string.

Fixed:

  • ~/.copilot/settings.json was previously not read at all — model
    preferences only lived inside the auth file (config.json). The
    plugin now layers settings.json on top so user-pinned defaults
    actually take effect.
  • COPILOT_HOME environment variable is now honored when locating
    the config dir. Earlier code only checked XDG_CONFIG_HOME, which
    meant users who relocated their Copilot data via COPILOT_HOME
    silently fell back to ~/.copilot.

Internal:

  • Outdated :92-93 comment 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

Choose a tag to compare

@andyzengmath andyzengmath released this 24 Apr 19:59
cbe0e22

Two bugs found during a real local install + login on Copilot CLI
1.0.36. Both shipped in this release.

Fixed:

  • /copilot:setup reported loggedIn: false even after a successful
    copilot login (PR #52). Root cause: Copilot CLI 1.0+ changed the
    ~/.copilot/config.json schema in two ways the plugin didn't
    track:

    • The file now starts with JS-style // line comments that strict
      JSON.parse rejects, so readCopilotConfig silently 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.

    readCopilotConfig now strips full-line // comments before
    parsing (narrow regex; block comments aren't observed in the
    config). getCopilotAuthStatus reads both the camelCase and
    snake_case key variants so CLI 0.x and 1.x both resolve.
    tests/copilot-auth-status.test.mjs added (+5) covering both
    schemas, missing file, empty users, and malformed JSON.

  • 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-copilot to
      /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-cc after updating. The
    /plugin marketplace add andyzengmath/copilot-plugin-cc step 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.

See merged PRs #51, #52 for the full review history.

v0.0.13

Choose a tag to compare

@andyzengmath andyzengmath released this 21 Apr 18:43
22fcd22

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 medium flows. EFFORT_FALLBACK_CHAIN
    first-fallback entry for high / xhigh bumped to
    claude-sonnet-4.6 to stay consistent with the primary.
  • Unchanged — --effort high / xhigh stays on
    claude-opus-4.6. The v0.0.12 opus alias 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.md and
    plugins/copilot/skills/copilot-cli-runtime/SKILL.md had stale
    alias lists (still showed opus → 4.6, sonnet → 4.5, didn't
    list the v0.0.11 gpt / codex aliases). 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.8 broker.lock + stale-PID recovery) and silent acceptance
    of malformed structured review output (v0.0.8/9 schema
    validator). Adds broker.lock to the Secrets and paths table.
    Expands "Known limits" to explicitly list per-ACP-session
    sandboxing and Windows review-path --effort as 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.

See merged PRs #46, #47 for the full review history.