Commit Graph
1808 Commits
Author SHA1 Message Date
haelyra 45a021ea11 test: remove extra trailing blank line from installer coverage 2026-10-20 17:41:33 -04:00
Eneko Ruiz 21e0ab5271 fix(session-aliases): reject array-shaped alias maps
(cherry picked from commit b1668579f6)
2026-10-20 17:40:59 -04:00
Eneko Ruiz 0bdb6a52ab fix: validate session alias titles before saving
(cherry picked from commit e4f9aac414)
2026-10-20 17:40:58 -04:00
Alan Vo 67034687f3 Fix CLAUDE_CONFIG_DIR tilde expansion, blank path fallback, and inline WSL resolver parity
(cherry picked from commit 617ab29f8d)
2026-10-20 17:40:58 -04:00
Alan Vo 5701a4f2e1 fix: respect CLAUDE_CONFIG_DIR with WSL Windows-path conversion
(cherry picked from commit aaacbc7592)
2026-10-20 17:40:58 -04:00
Eneko Ruiz f1c6692f99 fix: include the oldest dashboard window boundary
(cherry picked from commit e32d1a4e4d)
2026-10-20 17:40:58 -04:00
Eneko Ruiz 65f7dfb735 fix: reject missing session database and limit values
(cherry picked from commit 299899941d)
2026-10-20 17:40:57 -04:00
Eneko Ruiz 8f72869987 fix: reject negative execution counters
(cherry picked from commit fed9eebed5)
2026-10-20 17:40:57 -04:00
Eneko Ruiz 3ac640f6cc fix: sort missing inspection dates after pre-epoch timestamps
(cherry picked from commit 774dfd6894)
2026-10-20 17:40:57 -04:00
Eneko Ruiz c2a28b2963 fix: order failure pattern timestamps chronologically
(cherry picked from commit 075d55e9cb)
2026-10-20 17:40:57 -04:00
haelyra 14693070a1 fix: normalize apostrophes inside quoted Windows paths
(cherry picked from commit 8ab9358e18)
2026-10-20 17:38:38 -04:00
Eneko Ruiz c73353e2c7 fix: normalize Windows backup filename suffixes
(cherry picked from commit f685582ebe)
2026-10-20 17:38:38 -04:00
Eneko Ruiz 9388e06ec7 fix: preserve diagnostics after extensionless Windows paths
(cherry picked from commit 2a2e6e3848)
2026-10-20 17:38:38 -04:00
Eneko Ruiz 58b191c25d fix: normalize trailing Windows paths and spaced filenames
(cherry picked from commit c31b1dd80c)
2026-10-20 17:38:38 -04:00
Eneko Ruiz 0931f66775 fix: normalize Windows paths containing spaces and Unicode
(cherry picked from commit 25b775edc1)
2026-10-20 17:38:37 -04:00
Eneko Ruiz 9824f422d2 fix: normalize Windows file paths in failure patterns
(cherry picked from commit e0de4739a9)
2026-10-20 17:38:37 -04:00
haelyra acc24a226f test: align Antigravity guide check with pinned release
(cherry picked from commit da132808b4)
2026-10-20 17:38:26 -04:00
Gaurav Dubey e4666abb01 fix(opencode): ship @opencode-ai/plugin as a runtime dependency
The compiled OpenCode tools import `tool` from `@opencode-ai/plugin/tool`
at module top level, and the hooks plugin imports those tools statically.
The package was only a devDependency, so production installs (OpenCode's
npm plugin cache, `npm install --omit=dev`) could not resolve it and the
whole plugin failed to load.

Move it to `dependencies` and add a build-opencode regression test that
fails when the built bundle imports a package not declared as a runtime
dependency.

Fixes #3543

(cherry picked from commit 106024070e)
2026-10-20 17:38:25 -04:00
Eneko Ruiz 5367671a22 fix: reject missing session inspection option values
(cherry picked from commit a6619f5efd)
2026-10-20 17:38:13 -04:00
ethereal49 f7c6809bd7 fix(commands): address Santa Loop review feedback
(cherry picked from commit 3a0e3313d5)
2026-10-20 17:38:05 -04:00
ethereal49 4aa28ccac5 fix(commands): honor Codex model configuration in Santa Loop
(cherry picked from commit 2109d97b40)
2026-10-20 17:38:04 -04:00
30b68924ae fix(install): treat .pi as a foreign platform path (#3560)
The platform-configs module lists `.pi`, but PLATFORM_SOURCE_PATH_OWNERS
had no entry for it, so isForeignPlatformPath() returned false and every
install-apply target (e.g. `--target opencode`) copied the Pi harness
adapter (.pi/README.md, .pi/extensions/*) into its config root and
recorded it as ECC-managed.

Pi consumes ECC through `pi install`, not install-apply, so map `.pi` to
the `pi` owner. No install target has that id, so the directory is now
filtered out everywhere, like `.codex`, `.cursor`, and `.zed`.

Add regression tests for the opencode plan and for every registered
target.

Fixes #3558

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: haelyra <49814733+haelyra@users.noreply.github.com>
2026-10-20 15:37:53 -04:00
Affaan Mustafa 07971588f8 ci: replace the 33-way test matrix with full and package-manager lanes
The test job ran the entire suite on 3 OSes x 3 Node lines x 4 package
managers, 33 full runs per push. Windows lanes took 28 to 39 minutes and
macOS 14 to 19, so one push queued about 1.5 hours of wall clock behind
runner concurrency, and timing-sensitive tests got 33 chances to flake.
The package-manager axis only ever changed one environment variable that
nine suites read.

Now there are 13 lanes. Five run the full suite: Linux on Node 18, 20
and 22, plus Windows and macOS on Node 22. Eight are package-manager
lanes on Node 22 that run only the suites which read
CLAUDE_CODE_PACKAGE_MANAGER or CLAUDE_PACKAGE_MANAGER; the file list is
grepped at run time so it cannot drift as tests are added. Full lanes
use the runner's 4-process pool on Linux and macOS; Windows stays serial
because its process spawn and temp-dir cleanup are the flaky part.
2026-10-20 10:47:58 -04:00
Affaan Mustafa 9471ef4724 test(runner): add a worker pool and an ECC_TEST_ONLY filter to run-all
The runner executed 422 files one process at a time, which is most of
the 12 to 40 minutes a CI lane spends in "Run tests". ECC_TEST_JOBS
above 1 now runs files through a pool of that many processes; output is
still buffered and printed per file, so logs read the same. The default
stays 1 and that path is the original synchronous spawnSync loop, so the
VM-driven runner test and the piped-output tests are unchanged.

ECC_TEST_ONLY is the mirror of ECC_TEST_SKIP: a comma-separated list of
path substrings, and only matching files run. CI uses it to give the
package-manager lanes just the suites that read the package-manager
variable instead of the whole suite.

Two real-process tests cover the pool (grouped output, counted failure,
summary last) and the ONLY filter.
2026-10-20 10:47:58 -04:00
Affaan Mustafa 944ea9d050 fix(ci): unescape node -e inline programs in one pass
validateInlineJs unescaped the shell body with four chained replaces,
so a backslash pair followed by n or t was unescaped twice: the pair
became one backslash, then the new backslash-n became a newline. A
valid hook command such as console.log('\\n') failed validation with
an unterminated string. CodeQL flags the chain as double unescaping.

One regex pass maps each escape exactly once. The regression test
feeds the escaped-backslash program through the validator CLI.
2026-10-19 22:03:57 -04:00
Affaan Mustafa 5af4395e5c test(lib): cover five untested scripts/lib modules (#3641)
* test(lib): cover feedback-links routes and payload

Pins the three public issue routes to the ECC repository and checks each template name actually exists under .github/ISSUE_TEMPLATE. Also locks the ecc.feedback.v1 payload shape, the no-diagnostics-upload promise, and that every call returns fresh copies so a caller cannot alter the frozen route table.

* test(lib): cover cursor-agent-names prefixing and path handling

Pins the ecc- prefix rule the Cursor install applies to agent files: idempotent, lowercase-prefix only, empty names pass through. Covers the relative path variant across backslash, repeated, and trailing separators, and that a leading separator cannot re-root the destination under the target agents directory.

* test(lib): cover agent-tool-map Pi mapping and authority invariant

Pins the Claude to Pi tool table: six core tools, every target a real Pi built-in, and read-only tools never escalating to bash, edit, or write. Covers the unsupported path for MCP, web, unknown, empty, and non-string names, and that prototype member names like constructor are not treated as table hits.

* test(lib): cover compute-sponsor URL and passive copy

Pins the compute URL to the bare https route with no path, query, or credentials, and that the sponsor copy links it exactly once and nowhere else. Locks the wording that keeps the link passive, keeps the ecc ito find bridge opt-in and non-reserving, and does not claim managed inference is live. The existing surface test only reads docs and CLI output, so the module itself had no direct test.

* test(lib): cover invocation-environment precedence and isolation

Pins the three branches every install path relies on: an explicit env is copied and wins, a scoped homeDir yields an empty environment so ambient variables cannot leak into a contained install, and anything else snapshots process.env. Also checks the copy is shallow, own-keys only, and never writes back.
2026-10-19 18:41:26 -04:00
Affaan Mustafa 8293d0da8f fix(commands): drop unrendered LITE_MODE_FLAG token from codeagent-wrapper calls (#3640)
The multi-backend, multi-frontend, multi-plan, multi-execute and multi-workflow commands were copied from ccg-workflow's command templates, which carry {{LITE_MODE_FLAG}} and {{GEMINI_MODEL_FLAG}} for that project's installer to substitute. ECC has no substitution step, so bash passed the literal token to codeagent-wrapper as a positional argument, the backend name landed in the working-directory slot, and every call exited 1. Remove the tokens from the five commands and the ja-JP, tr and zh-CN docs copies so the wrapper receives a plain --backend invocation. A regression test scans every multi-* command and translated copy for codeagent-wrapper lines that still contain a {{TEMPLATE}} token.

Fixes #3595
2026-10-19 18:41:07 -04:00
Affaan Mustafa 6c557856af feat(ci): cap open PRs per contributor at ten (#3639)
Extend the PR burst guard with an open-PR cap. On every opened or reopened
PR by a non-collaborator, the guard lists the repository's open PRs, keeps
the author's oldest `maxOpen` (10) open and closes the newer ones with a
bot comment that names the count and the limit. No lock, no maintainer
alert: the cap is about review capacity, not spam. PRs the burst logic
already closed in the same run are excluded so nothing is mutated twice.
Collaborators with write access stay exempt, dry run reports without
mutating, and the comment is deduplicated on a bot-authored marker.

Haley asked for this on 2026-10-19: each contributor should only have 10
to 15 PRs open at a time. Existing open PRs are not bulk-closed; the cap
applies as each author opens or reopens their next PR.

Verification: 22 unit tests and the HTTP workflow test pass,
validate-workflow-security passes, eslint and markdownlint clean. Dry run
against affaan-m/ECC on #3621 reports openCount 19 and nine cap excess
PRs for that author, with no writes.
2026-10-19 18:08:53 -04:00
haelyra 0ad248d199 feat(ci): guard PR submission bursts and alert maintainers 2026-10-15 14:33:45 -04:00
haelyra 70f571e205 test: drain synthetic scanner input before reporting status 2026-10-11 20:23:42 -04:00
haelyra d0f5632287 fix: reject linked sandbox bases before scenario cleanup 2026-10-11 19:59:01 -04:00
haelyra 345cd364a3 test: accept Windows directory refusal before piped evaluator input 2026-10-11 19:41:13 -04:00
haelyra 6cb9f0a162 fix: distinguish auth failures from ordinary provider discussion 2026-10-11 19:16:09 -04:00
haelyra 8d969b0ec4 fix: retain authentication diagnostics across empty stream blocks 2026-10-11 19:01:56 -04:00
haelyra 2ec80189a4 fix: preserve missing-result auth diagnostics and bound fixture contention 2026-10-11 18:46:07 -04:00
haelyra 6ef38a2993 fix: validate evaluator files before pipe reads and strengthen grader controls 2026-10-11 17:54:29 -04:00
haelyra cfeb773d96 fix: reject constant grader output and classify overflow errors 2026-10-11 17:32:22 -04:00
haelyra f6fe47de27 merge: preserve latest contributor CSV grading repair 2026-10-11 16:22:18 -04:00
haelyra 3515db6aad fix: preserve evaluator input and audit contracts across platforms 2026-10-11 15:39:40 -04:00
haelyra 1d1b62e58e fix: recover plugin migration at the effective settings scope 2026-10-11 15:36:49 -04:00
haelyra 6c9c25158a fix: address evaluator portability and recording review findings 2026-10-11 15:35:17 -04:00
haelyra 87c136fcae fix: integrate strict issue targeting and Windows Python discovery 2026-10-11 15:07:29 -04:00
haelyra d60c90708c test: exercise real Python discovery failure controls 2026-10-11 15:05:36 -04:00
haelyra 03f9a59bc7 test: separate stdin fixture startup budget from drain deadline 2026-10-11 15:04:53 -04:00
haelyra acc453d357 Merge remote-tracking branch 'origin/pr-3524' into steward/late-arrivals-20261011 2026-10-11 15:00:38 -04:00
haelyra c7a467061b Merge remote-tracking branch 'origin/pr-3523' into steward/late-arrivals-20261011 2026-10-11 15:00:38 -04:00
montjeffrey 72f2105cf6 test: run the Hermes hook tests with a resolved Python 3 on Windows
- windows-test-env.js gains resolvePython: it probes each candidate with
  `-c "import sys; sys.exit(0 if sys.version_info[0] == 3 else 1)"`, so the
  Store stub is rejected.
- hermes-hooks.test.js launches its four hook spawns through the resolved
  interpreter, falling back to python3 when none is found so a machine
  without Python still fails loudly instead of skipping.

hermes-hooks goes from 0/14 to 14/14 on Windows 11; the other users of the
helper are unchanged. Product code is untouched: Hermes runs these hooks
itself and the installer writes no interpreter.
2026-10-11 14:21:25 -04:00
montjeffrey e9efbc2626 test: pin a Python resolver that skips the Windows Store python3 stub
tests/hermes-hooks.test.js spawns python3, which on Windows is usually the
Microsoft Store alias stub: it exits 9009 instead of running Python, so all
14 Hermes cases fail with "hook must always exit 0 (got 9009)". python.org
installs provide python and the py launcher, not python3.

Pin resolvePython({ platform, probe }) in the shared windows-test-env
helper: the first candidate that actually runs Python 3 (Windows: python,
py -3, python3; elsewhere: python3, python), or null when none does, plus a
real smoke run of the resolved interpreter.

Against main: 4 of 8 windows-test-env cases fail (no resolvePython).
2026-10-11 14:21:24 -04:00
haelyra 1b7cf4e417 test: align alias failure bounds with reviewed Windows writer retry policy 2026-10-11 14:18:52 -04:00
montjeffrey deb5d0a1d0 test(gateguard): pin a CSV decoy that overwrites its input rows
The CSV grader reads its expected values from the same ROWS objects it
passes to exportCsv, so an exporter that overwrites the input fields and
exports them scores 1 (Greptile on #3519). decoy-mutates does exactly
that; graderIsSound reports the grader unsound on this head
(decoy-mutates=1). The grader-soundness test now prints every decoy
score through formatGraderScores.
2026-10-11 14:14:13 -04:00