mirror of
https://github.com/mksglu/context-mode.git
synced 2026-10-02 04:14:38 +08:00
main
17
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
8b1c018635 | docs(readme): correct Zed MCP config shape (#870) | ||
|
|
2608e344bb |
refactor(antigravity-cli): one-command agy plugin install (drop npm wrapper) + doc cleanup (#853)
refactor(antigravity-cli): one-command agy plugin install; drop npm wrapper agy 1.0.7 added GitHub-subpath plugin install (with branch resolution), so the former three-step flow shipped in #787 — `npm install -g` + `git clone` + `npm run install:agy` (scripts/install-antigravity-cli-plugin.mjs) — is dead weight. agy (<=1.0.6) `plugin install` accepted only a local directory, which is why the wrapper existed; that constraint is gone. Install is now one command, no clone, no wrapper: npm install -g context-mode agy plugin install https://github.com/mksglu/context-mode/tree/main/configs/antigravity-cli - remove scripts/install-antigravity-cli-plugin.mjs + the install:agy npm script and its files[] entry - antigravity-cli doctor `fix` strings now point at the one-command install - README: split the conflated "Antigravity" entry into Antigravity IDE vs Antigravity CLI (agy); bring the agy section to the other install guides' level (Prerequisites / Install / MCP-only / Verify / Routing / Full configs); Verify points to the existing "Try It" prompts. Deep mechanics and troubleshooting stay in docs/platform-support.md - docs/platform-support.md: one-command update + a "Verified: agy 1.0.10" note recording the >=1.0.7 install floor; hook contract unchanged through 1.0.10 (config/hooks.json canonical since 1.0.8) - tests: drop the wrapper-shape regression assertions (no leftover trace); bundle-content tests still guard the installable artifact Preserved invariants: the bundle still registers MCP via its native mcp_config.json (command: context-mode, env-pinned CONTEXT_MODE_PLATFORM=antigravity-cli); the dual hooks.json + hooks/hooks.json is kept (agy runtime reads root, validate reads subdir). Verified on agy 1.0.10 (Linux): clean-room single-command install registers MCP + hooks + skill from a zero baseline; tools/list exposes 11 Gemini-safe ctx_* tools (0 const / 0 additionalProperties); `agy -p` smoke returns 12. npm run build + tsc --noEmit + targeted vitest (47) pass. Bundles are CI-managed (bundle.yml) and not included. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
77e22a46cc |
fix(lifecycle): reap idle MCP bridge children to stop pi/omp accumulation (#854) (#855)
On hosts that spawn one MCP server per sub-context/subagent under a single long-lived parent (pi / oh-my-pi `omp`), context-mode servers never self- terminate and accumulate for the parent's whole lifetime. Reproduced on macOS: one `omp` session delegating to subagents accumulated 13 `server.bundle.mjs` children (all `CONTEXT_MODE_BRIDGE_DEPTH=1`), none reaped; the reporter saw 188 (~8.8 GB) over a multi-day session. Root cause: the pi extension spawns a bridge child (`server.bundle.mjs`, depth=1) from `before_agent_start` — which fires per sub-context — but tears it down only at `session_shutdown`, which never fires for sub-contexts while the parent lives. The lifecycle guard only reaps on parent-death (ppid poll + signals + a stdin-EOF assist itself gated on parent-death), so with the parent alive nothing fires. Same class as #565, whose generic idle-shutdown was reverted in #602 ("restore tools on 12 hosts"). Fix — a request-idle self-shutdown scoped strictly to MCP bridge children (`CONTEXT_MODE_BRIDGE_DEPTH>0`): - src/lifecycle.ts: a depth-gated idle timer shuts the child down after no MCP activity for `bridgeChildIdleTimeoutMs()` (default 3 min; override `CONTEXT_MODE_BRIDGE_IDLE_MS`, non-positive disables). It NEVER fires while a tool call is in flight (`noteRequestStart`/`noteRequestEnd`), so a long single ctx_execute/ctx_batch_execute that emits no further inbound frames (#643 unbounded calls) is not reaped mid-execution. Logs one stderr line when it reaps. New testable export `attachMcpActivityTap()`. - src/server.ts: wrap the SDK transport's `onmessage` (via attachMcpActivityTap) and mark tool calls in-flight in `wrapToolHandler` (try/finally, success+error); responses also refresh the idle clock via `trackResponse`. No stdin touch. Safety / invariants preserved: - depth-0 / absent -> timeout 0 -> reaper never installed, so the long-lived keep-alive servers #602 restored are never reaped on idle. - Trigger is idle TIME via the MCP message layer, never stdin EOF — the #236 contract and lifecycle's hands-off-stdin invariant are intact. - #311/#388 orphan fast-detect and #534 1s bridge poll unchanged. Hardened against an in-flight false-reap regression surfaced by an adversarial review. Verified on macOS (omp 16.1.11 + Claude); lifecycle (24) + pi suites pass, `npm run build` + typecheck pass. Bundles regenerate via CI. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
ff5b0cff21 |
fix(codex): MCP sentinel namespace + PreToolUse rewrites + tool annotations (#844 #845 #846) (#851)
* fix(hooks): keep MCP sentinel alive across isolated PID namespaces (#844) isMCPReady() unlinked any sentinel whose PID failed process.kill(pid, 0). In a sandbox that shares /tmp but runs in a separate PID namespace, a live host MCP PID is invisible, so the probe threw ESRCH and the readiness sentinel was deleted — flipping readiness to false and making hooks fail open while the MCP server was still running. The reader now treats EPERM as alive, and on ESRCH trusts a recently refreshed sentinel (90s window) instead of deleting it; only sentinels older than the window are cleaned up. The server refreshes its sentinel mtime every 30s (3x margin) while alive and clears the timer on shutdown. Tests live in tests/hooks/core-routing.test.ts, which already owns the mcp-ready directory-scan contract. Fixes #844. * fix(codex): emit allow+updatedInput / additionalContext, fail closed on older builds (#845) The Codex PreToolUse formatter returned null for modify and context, so curl/wget/HTTP/build redirects (routing `modify`) and guidance nudges (routing `context`) were silently dropped — the original command ran and its output flooded the model context. The drop dated to #225 when Codex rejected updatedInput; current Codex (codex-cli >= 0.141.0) honors permissionDecision:"allow" + updatedInput and additionalContext. Capability is detected at runtime (codex-caps.mjs parses `codex --version`, caches with a TTL, fails closed on any error) — no opt-in env flag, which would rot into dead code. When supported, modify emits allow+updatedInput (command rewrite) and context emits additionalContext. When not supported, a command redirect FAILS CLOSED as a deny carrying the same guidance (mirrors the claude-code / antigravity-cli echo extraction); non-command rewrites and advisory context nudges are dropped rather than blocking the tool. `ask` stays dropped (Codex still rejects permissionDecision:"ask"). The TS adapter (src/adapters/codex/index.ts) is a separate in-process layer not on the external hook path; its conservative behavior is unchanged. Tests (formatter + capability detection) live in tests/hooks/formatters.test.ts, which owns Hook formatting. codex-caps.mjs is a new source module because no existing module owns Codex runtime capability detection. Fixes #845. * fix(mcp): add accurate tool annotations to ctx_* descriptors (#846) context-mode registered its ctx_* MCP tools without annotations. Codex cancels unannotated tool calls before execution ("user cancelled MCP tool call"), so read-only tools like ctx_stats and ctx_doctor never ran even though the server was reachable. Each tool now carries explicit annotations classified by real behavior (no blanket readOnlyHint): read-only query/diagnostic tools (ctx_search, ctx_stats, ctx_doctor) are readOnlyHint:true; executing/mutating/destructive tools (ctx_execute, ctx_execute_file, ctx_batch_execute, ctx_index, ctx_fetch_and_index, ctx_purge, ctx_upgrade, ctx_insight) are not, with destructiveHint / openWorldHint set per behavior. Tests live in tests/core/server.test.ts (Server & tools) and inspect the actual registered descriptors via REGISTERED_CTX_TOOLS, not descriptions. Fixes #846. * refactor(codex): replace regex with algorithmic equivalents per no-regex rule (#844 #845 #846) --------- Co-authored-by: Mert Köseoğlu <bm.ksglu@gmail.com> |
||
|
|
9f34c6f11b |
Add GitHub Copilot CLI + Antigravity CLI (agy) support (#787)
* feat(adapters): add Antigravity CLI (agy) + GitHub Copilot CLI support
Add two agentic CLI adapters onto next's existing adapter registration —
without the abandoned PR's setup subcommand / consolidated registry.
Antigravity CLI (agy):
- MCP + capture-only PostToolUse hook adapter (agy honors no stdout veto in
auto-run mode; verified against agy 1.0.5). The agy hook payload
{conversationId, toolCall, workspacePaths} is mapped onto the shared
capture pipeline.
- Ships a Claude-layout plugin bundle (configs/antigravity-cli/) installed via
`npm run install:agy` (mirrors install:openclaw), with a version-skew
capture-hook probe in the installer.
GitHub Copilot CLI (1.0.59):
- json-stdio hook adapter with six events: PreToolUse, PostToolUse, PreCompact,
SessionStart, UserPromptSubmit, Stop. Overrides CopilotBaseAdapter to emit the
FLAT {type,command} + top-level "version": 1 hook config Copilot CLI requires.
- MCP install via `copilot mcp add context-mode -- context-mode`.
- Fix a latent Stop-hook bug: a session_end event with no `data` threw inside
insertEvent (createHash(undefined)) and was silently dropped.
Cross-cutting:
- #774: probe agy/copilot config markers before the generic ~/.claude check.
The copilot marker is narrowed to context-mode-written files
(~/.copilot/mcp-config.json | hooks/context-mode.json), not a bare ~/.copilot/
dir, so a co-installed-but-unconfigured Copilot CLI cannot steal detection
from a Claude Code user.
- Dispatcher fails OPEN (exit 0) on a missing hook script: GitHub Copilot CLI
treats an exit-1 PreToolUse hook as DENY, so a version skew (a newer adapter's
hook command on an older global) would otherwise brick the agent.
Fixes #774. Fixes #775.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* ci: regenerate bundles for antigravity-cli + copilot-cli support
Picks up the new HOOK_MAP entries, client-map keys, validPlatforms,
getSessionDirSegments cases, and the fail-open dispatcher into the
esbuild-generated runtime bundles.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs(platform-support): sync support docs to 18 platforms + fix stale Kiro classification
Make README.md and docs/platform-support.md internally consistent and aligned
with the adapter source of truth.
Header sync (18 platforms everywhere):
- The Main Comparison Table (was 11 cols), the Capability Matrix (was 11), and
the README Platform Compatibility table (was 17, missing Kimi Code) now list
the SAME 18 platforms in one shared order. Adds the two branch-new platforms
(GitHub Copilot CLI, Antigravity CLI `agy`) plus previously-omitted Qwen Code,
KiloCode, OpenClaw, Zed, Pi as columns. Each cell sourced from the per-platform
detail sections / adapter source and independently verified.
- Fix five ragged rows in the Main Comparison Table (a dropped trailing OMP cell)
and add CLI Hook Dispatcher rows for qwen-code + copilot-cli.
- GitHub Copilot CLI section: normalize the `**Hook Names:**` label and add the
missing `**Output Modification:**` field for json-stdio-family parity.
Fix stale Kiro classification (code is the source of truth):
- The kiro adapter is json-stdio with working preToolUse/postToolUse hooks
(hooks/kiro/{pretooluse,posttooluse}.mjs + a kiro HOOK_MAP entry), yet the docs
called it "MCP-only (Phase 2 — not implemented)" and the README contradicted
itself ("no hook support" in one place, "native preToolUse/postToolUse" in two
others).
- Reclassify Kiro as json-stdio with PreToolUse + PostToolUse + exit-code-2
blocking across the Overview paradigm table, both wide tables, the dispatcher
table, and the Kiro detail section; document that agentSpawn (SessionStart) and
stop are not yet wired, so session restore after compaction is unavailable.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(antigravity-cli): drop vestigial .mcp.json dependency that broke fresh clones
The agy plugin-bundle test asserted configs/antigravity-cli/.mcp.json, but
.mcp.json is gitignored repo-wide and was never committed — so the test passed
on the dev machine (file present locally) yet failed on a fresh clone with
ENOENT. Committing the file is the wrong fix: the .gitignore comment documents
that shipping .mcp.json has silently broken fresh installs before (#253/#531).
- The bundle declares MCP the Claude way via .claude-plugin/plugin.json
mcpServers (committed — the mechanism agy reads on `agy plugin install`),
mirrored by the agy-native mcp_config.json (committed). Remove the vestigial
bundle .mcp.json and stop the test + docs from requiring it. Every file the
plugin test reads is now git-tracked, so a fresh clone passes.
- README: Kiro was still grouped under "Non-hook platforms" in the routing-
enforcement note. Kiro has native preToolUse/postToolUse hooks; it needs the
manual KIRO.md copy only because agentSpawn/SessionStart is not yet wired.
Reword to say so.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(adapters): cross-platform agy installer + copilot-cli COPILOT_HOME parity
Windows fix (real): replace the bash-only agy plugin installer with a
cross-platform Node script so `npm run install:agy` runs natively on Windows
(PowerShell/cmd), not just Git Bash/WSL. agy runs on Windows, so its installer
must too — the old `node -e` wrapper hard-exited 1 on win32. openclaw stays
bash-only (it is genuinely POSIX-only). Removes
scripts/install-antigravity-cli-plugin.sh in favor of
scripts/install-antigravity-cli-plugin.mjs (same preflight + version-skew probe).
copilot-cli hardening (COPILOT_HOME edge case only — the default ~/.copilot
install was and remains correct):
- CopilotCliAdapter.getSessionDir() now roots at getConfigDir() (COPILOT_HOME-
aware), mirroring codex/kimi, so the TS server reads sessions from the same
place the hook runtime (COPILOT_OPTS configDirEnv: COPILOT_HOME) writes them.
Previously a relocated COPILOT_HOME split hook writes ($COPILOT_HOME/...) from
server reads (~/.copilot/...), making sessions appear empty.
- detect.ts copilot-cli marker honors COPILOT_HOME, not just ~/.copilot.
No change to the default (COPILOT_HOME-unset) behavior; a regression test pins
both the ~/.copilot default and the COPILOT_HOME-rooted path.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* ci: regenerate bundles for copilot-cli COPILOT_HOME parity
Picks up CopilotCliAdapter.getSessionDir() and the COPILOT_HOME-aware detect.ts
marker into the esbuild runtime bundles.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(antigravity-cli): installer registers the MCP server (agy plugin install skips it)
`npm run install:agy` ran only `agy plugin install`, which — verified against
agy 1.0.5 — processes a bundle's skills + hooks but logs "mcpServers : skipped
(not found)" and registers NO MCP server. agy reads a plugin's MCP only from a
bundle `.mcp.json` (intentionally not shipped — gitignored repo-wide after
#253/#531) and has no `agy mcp add` command, so context-mode's MCP server was
never registered: users had to add it to ~/.gemini/config/mcp_config.json by hand
(reported on Windows; reproduced on Linux: `mcpServers : skipped (not found)`).
The installer now also writes context-mode into agy's GLOBAL MCP profile
~/.gemini/config/mcp_config.json (idempotent JSON merge, preserves other servers,
tolerates a malformed file) — the file agy actually loads and `context-mode
doctor` checks. Verified end-to-end on agy 1.0.5: `npm run install:agy` →
mcp_config.json gains context-mode → `agy -p "... ctx_execute ... 7 + 5"` → 12.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(server): emit Gemini-safe tool schemas so agy/Gemini CLI expose ctx_* tools
Antigravity CLI (agy) and Gemini CLI use Gemini's function-calling API, which
rejects JSON Schema `const` and `additionalProperties`. When a tool's parameter
schema contains either, the host SILENTLY DROPS that tool from the model's
function list — so agy never sees the ctx_* tools and works around them by
hand-rolling the MCP protocol through its Bash tool (verified on Windows: agy
wrote scratch/call_ctx_stats.js + list_mcp_tools.js MCP clients instead of
calling the tools natively). That defeats the point of context-mode — bash
output floods the context window instead of staying in the sandbox.
context-mode builds schemas with Zod, which emits `const` (from coerce/preprocess
constructs) and `additionalProperties`, with no Gemini sanitization. Wrap the
SDK's tools/list handler to rewrite the EMITTED schema:
- `const: X` -> `enum: [X]` (an identical single-value constraint)
- drop `additionalProperties` (advisory-only; every ctx_* handler parses args
with Zod, which strips unknown keys server-side regardless)
Both transforms are behavior-preserving for every other client (Claude Code,
Copilot, Cursor): const and a one-value enum are equivalent, and no model sends
undeclared properties — only the wire schema changes, never validation or how a
tool is called. Best-effort: if the MCP SDK internals shift, the original handler
is left untouched (no regression). Verified on the real tools/list: all 11 ctx_*
tools now emit 0 `const` / 0 `additionalProperties`.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* ci: regenerate bundles for Gemini-safe tool schema sanitizer
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(antigravity-cli): clear agy's stale MCP tool-schema cache on install
agy caches each MCP server's tool schemas under
~/.gemini/antigravity-cli/mcp/<server>/ and does NOT refresh them on reconnect
(verified on agy 1.0.6 against a live Windows install). A cache captured by a
context-mode older than the Gemini-safe-schema fix (
|
||
|
|
85f64d2cc2 |
fix(hooks): respect subagent ctx tool availability (#834)
* fix(hooks): respect subagent ctx tool availability * test(hooks): exercise subagent pretooluse routing * test(hooks): strengthen subagent routing coverage * refactor(hooks): drop redundant CONTEXT_MODE_DISABLE_AGENT_INJECTION env var The #832 foreground-subagent hang root cause is already fixed by the #794 mcpToolsAvailable path: subagent-originated WebFetch/curl/inline-HTTP/build redirects now pass through instead of forcing blocking ctx_* calls. The Agent prompt-injection block is advisory text and cannot itself hang, so the dedicated opt-out env var gates no remaining behavior. Removes the env-var read in routing.mjs, the orphaned isTruthyEnv helper, the README entry, and the dead #832 unit test. The #794 fix and its coverage are left intact. --------- Co-authored-by: Mert Köseoğlu <bm.ksglu@gmail.com> |
||
|
|
6c513fbf60 | test: isolate next full-suite env assumptions (#837) | ||
|
|
c5e0fbc066 | fix(server): exit on fatal uncaught exception storm (#833) | ||
|
|
98d239b7f5 |
fix(codex): resolve plugin-manager root for doctor and upgrade (#771)
* Fix Codex plugin-root drift diagnostics Codex marketplace installs can run doctor or MCP from a cache/global root that differs from the runtime root reported by the Codex plugin manager. That made doctor check a stale hooks manifest and made upgrade remove native fallback hooks before plugin ownership was proven. Constraint: Codex plugin-manager roots can differ across marketplace tmp roots, plugin cache roots, global npm roots, and already-running MCP sessions. Rejected: Always deleting native fallback hooks in plugin mode | unsafe when the current package root and plugin-manager runtime root diverge. Confidence: high Scope-risk: moderate Directive: Only let Codex substitute the plugin-manager runtime root; other adapters can coexist with Codex on the same machine. Tested: npm test; npm run build; npm run assert-bundle; git diff --check; runtime doctor; Codex hook smoke; direct MCP ctx_doctor smoke. Not-tested: CI matrix before PR creation. * test(server): use valid tsc option for on-demand build |
||
|
|
e2bce0b518 |
fix(windows): preserve Git Bash path conversion for native git (#826)
* fix(windows): preserve Git Bash path conversion for native git * test(windows): cover shell override edge cases |
||
|
|
8ca114c473 |
fix(opencode): string-aware JSONC stripping via shared util/jsonc (#808)
fix(opencode,server): string-aware JSONC stripping via shared util/jsonc (#806)
opencode.jsonc/kilo.jsonc with URLs in string values (e.g. "$schema":
"https://opencode.ai/config.json") were corrupted by the adapter's naive
stripJsonComments regex (/\/\/.*$/gm eats everything after "https:"),
so readSettings() returned null and ctx doctor emitted the false
"[FAIL] Plugin configuration: Could not read opencode.json or
opencode.jsonc".
- add src/util/jsonc.ts: two-pass string-aware comment + trailing-comma
stripping and tolerant parseJsonc (byte-identical to the #787-reviewed
implementation so the branches merge cleanly)
- opencode adapter: drop the naive regex stripper (introduced in
|
||
|
|
1df5d3ca93 |
Fix mobile overflow on Insights persona cards (#772)
Prevent persona cards from overflowing on mobile The live Insights landing uses long tool-call and pattern identifiers inside grid cards. Mobile one-column grids still kept min-content widths, so persona content pushed beyond the viewport and duplicated CSS quotes made the first question look broken. Constraint: / and /insights route to web/insights.html through the Workers router. Rejected: Copying live HTML into web/index.html | /oss uses index.html, while the broken live route is served from insights.html. Confidence: high Scope-risk: narrow Directive: Keep mobile grid columns as minmax(0, 1fr) when cards contain long code-like tokens. Tested: Playwright mobile render at 320, 375, 390, and 430 px; document/body width matched viewport and persona cards/tool calls stayed within card bounds. Copilot review follow-up kept persona calls accessible with overflow-x:auto and removed non-standard word-break usage. Not-tested: Production deploy; this commit only updates the source file. Co-authored-by: OmX <omx@oh-my-codex.dev> |
||
|
|
62bc5ad654 |
Fix mobile overflow on Insights persona cards (#772)
Prevent persona cards from overflowing on mobile The live Insights landing uses long tool-call and pattern identifiers inside grid cards. Mobile one-column grids still kept min-content widths, so persona content pushed beyond the viewport and duplicated CSS quotes made the first question look broken. Constraint: / and /insights route to web/insights.html through the Workers router. Rejected: Copying live HTML into web/index.html | /oss uses index.html, while the broken live route is served from insights.html. Confidence: high Scope-risk: narrow Directive: Keep mobile grid columns as minmax(0, 1fr) when cards contain long code-like tokens. Tested: Playwright mobile render at 320, 375, 390, and 430 px; document/body width matched viewport and persona cards/tool calls stayed within card bounds. Copilot review follow-up kept persona calls accessible with overflow-x:auto and removed non-standard word-break usage. Not-tested: Production deploy; this commit only updates the source file. Co-authored-by: OmX <omx@oh-my-codex.dev> |
||
|
|
ec48166e68 | fix(codex): dedupe plugin-owned context-mode hooks (#746) | ||
|
|
9e2e623792 | feat(session): persist /goal directives across compaction and resume (#695) | ||
|
|
a01c8531e6 |
fix(doctor): surface missing launch files when integrity helper is absent (#689)
* fix(doctor): surface missing launch files when integrity helper itself is absent When an interrupted /ctx-upgrade leaves the plugin cache partially populated, scripts/plugin-cache-integrity.mjs (the integrity helper, shipped in package.json files[]) can itself be among the missing files. checkPluginCacheIntegritySync then reported only 'integrity helper unavailable', masking that the MCP launch entrypoint (start.mjs / server bundle) was also gone — the actual reason the MCP server failed to start. Add findMissingLaunchFiles(): a dependency-free (fs-only) check of start.mjs (the no-fallback command target from .claude-plugin/plugin.json) and the server bundle (server.bundle.mjs, or its build/server.js fallback). When the integrity helper cannot load, the doctor now names the missing launch files and points to the reinstall command instead of stopping at an opaque 'helper unavailable'. Verified: new tests/util/plugin-cache-launch-files.test.ts (5 cases) + full suite (3663 pass) + build (tsc + bundle + assert-bundle + assert-asymmetric-drift) green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * test(cli): fold findMissingLaunchFiles tests into tests/core/cli.test.ts CONTRIBUTING L282 prohibits new test files — extend the existing file that covers the same domain. The 5 findMissingLaunchFiles cases from the original tests/util/plugin-cache-launch-files.test.ts naturally belong alongside the existing tests/core/cli.test.ts plugin-cache- integrity coverage (assertPluginCacheIntegrity, derivePluginManifest, package.json files[] shipping). All in the same describe block now. No behaviour change. 5/5 GREEN. --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Mert Koseoglu <bm.ksglu@gmail.com> |
||
|
|
61fd3fb0a0 |
Fix worktree suffix project root detection (#435)
* ci: update install stats * ci: update install stats * fix worktree suffix project root detection * fix: normalize project paths for session helpers * fix: align kiro hooks with normalized session paths --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Mert Köseoğlu <bm.ksglu@gmail.com> Co-authored-by: Ken Jo <ikchan.jo@lge.com> |