601 Commits
Author SHA1 Message Date
haelyra b144908df6 fix(types): declare Git utility options 2026-10-25 19:43:37 -04:00
haelyra 0a7a9a718e fix(hooks): use session repository for console warnings 2026-10-25 19:32:16 -04:00
haelyra 9c8a66b696 Integrate L4XB PR #3664 2026-10-25 19:30:50 -04:00
haelyra 0e7588cec5 Integrate L4XB PR #3667 2026-10-25 19:30:50 -04:00
haelyra f390400944 Merge pull request #3583 from Tivonsico/fix/skill-run-timestamp-type-20261014
fix(skill-tracker): reject non-string execution timestamps
2026-10-25 19:16:34 -04:00
haelyra 7f0b6ce500 fix(install): reject malformed empty-container JSONC commas 2026-10-25 18:20:40 -04:00
haelyra f4e8f6eb3e Merge reviewed OpenCode JSONC fix from #3590 2026-10-25 18:17:10 -04:00
haelyra e3292b0010 Merge pull request #3594 from ketpatil77/fix/managed-hook-config-bom
fix(hooks): honor managed preferences in BOM-prefixed config
2026-10-25 17:44:47 -04:00
L4XB 10e7c5800f fix(hooks): recognize Prettier's TypeScript and JSON5 config files
Prettier's config searcher also reads .prettierrc.json5, .prettierrc.ts/.mts/.cts and prettier.config.ts/.mts/.cts. resolve-formatter knew none of them, so a project configured only through prettier.config.ts was never formatted by post-edit-format, quality-gate or the Stop batch. config-protection's rc pattern stopped at .yaml/.toml, so an existing .prettierrc.ts or .prettierrc.json5 could be edited freely.
2026-10-22 23:51:32 +02:00
L4XB b02e02dcd2 fix(hooks): list modified files from the repository root even with diff.relative
With diff.relative=true, `git diff --name-only` reports paths relative to the working directory, so joining them to the repository root pointed at files that do not exist, and a session in a subdirectory again got no console.log warning. getGitModifiedFiles now runs `git -c diff.relative=false diff --name-only HEAD`. The -c form also works on Git versions older than --no-relative.
2026-10-22 23:01:26 +02:00
haelyra 6e11d21dd1 Merge branch 'stewardship/verified-pr-batch-3538-3566' into stewardship/verified-pr-batch-3602-3621-owned 2026-10-20 18:41:32 -04:00
haelyra a6db53f835 fix(inspection): normalize diagnostic-looking Windows filenames 2026-10-20 18:41:19 -04:00
haelyra fcff074e6f Merge branch 'stewardship/verified-pr-batch-3538-3566' into stewardship/verified-pr-batch-3602-3621-owned 2026-10-20 18:28:33 -04:00
haelyra c04d00c15e fix(integration): address review findings in docs and diagnostics 2026-10-20 18:17:37 -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 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
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
haelyra 224f99c059 Merge branch 'main' into fix/managed-hook-config-bom 2026-10-20 15:18:22 -04:00
haelyra a31dfbf0e4 Merge branch 'main' into fix/jsonc-opencode-config-membership-check 2026-10-20 15:18:17 -04:00
Affaan Mustafa 6f1881aeaf refactor(lib): split nasiko install, uninstall and tar extraction
extractQualifiedTarGzip walked the archive, validated the terminator, read each header and classified the entry in one loop; installNasiko and uninstallNasiko each resolved the release and paths, then ran the whole download or staging sequence inside one try with rollback flags. The extractor now uses gunzipArchive, assertTarTerminator, readTarEntry, isBinaryEntry and isSidecarEntry. The two lifecycle calls share qualifiedReleaseFor and installPathsFor; install fetches through fetchVerifiedBinary and publishes through publishBinary, and uninstall stages and deletes through removeInstalledFiles with removeOrRetain.

The rollback rules are the same: a failed publish removes only the files this call created, a failed rename puts the staged file back, and a failed delete keeps the tombstone and reports it in cleanupPending. The plan still takes its version from the requested release, not from releaseOverride, and every dependency hook is called in the same order. Exports are unchanged, and a run of the old and new extractor over 20k generated archives covering sidecars, bad padding, bad size fields, truncation and trailing data produced identical results and messages.
2026-10-19 23:39:18 -04:00
Affaan Mustafa 5c507e0704 refactor(lib): split search evidence by tool and credit path
searchEvidence built the Glob, Grep and LS evidence inline before falling through to the shell path, and findCreditingSearch and findClosestMiss each nested the per-search and per-item loops with the stem and directory checks in one body. The tool builders are now globEvidence, grepEvidence and lsEvidence behind a small Map, the item loop of findCreditingSearch is creditingItem, and findClosestMiss hands the miss reasons to missReason and the Read scan to considerReads. searchHasMessage replaces the repeated messageId check.

Results are unchanged: the same first crediting search wins, the same lowest-ranked miss is reported, and errors still resolve to null inside the two public functions. Checked by running the old and new factory side by side over 40k generated scans and targets with identical output.
2026-10-19 23:39:18 -04:00
Affaan Mustafa 87aaef56cb refactor(lib): split the gateguard code lexer by token class
lexCodeLines ran every state (code, line comment, block comment, string) through one loop body with three closures over its locals, and shCodeLines and psCodeLines each inlined their escape, quote and comment readers. The C-family lexer now keeps its partial line on a small lx record and dispatches by state to lexNewline, lexLineComment, lexBlockComment, lexString and lexCode, with lexCommentStart, startsJsx and lexStringStart under lexCode. The shell lexers share pushShellLine, readEscapedPair, readQuotedSpan and readLineComment; shCodeLines looks its readers up in a table and psCodeLines splits into psBlockComment and psToken.

Every reader returns the index of the last character it consumed, so the loops advance exactly as before, and the sentinel for an unlexable edit is still null from the C-family path and a null result from the shell paths. Exports are unchanged. A differential run against the previous version over the unit test strings plus 40k generated inputs, across all nine spec shapes change-profile builds, produced identical lines, normalized signatures and isTrivialEdit verdicts.
2026-10-19 23:39:18 -04:00
Affaan Mustafa 905bb16ff2 refactor(lib): split gateguard file-context scanners by token
cFamilyStartsFresh ran one 130-line loop over template literals, comments,
regex-vs-division, C# and Rust raw strings, quotes, words, and punctuation.
It now keeps scanner state in one object and walks a fixed list of step
functions, each returning consumed, abort, or not-mine. The Python f-string
field scan, the shell heredoc and quote tokens, and the PowerShell
here-string, block comment, and hash tokens get the same treatment.

Verified byte-for-byte against the recorded test inputs, four hundred real
source files from the repo, random prefixes, and single-character mutations
across every flavor spec. Clears the five complexity warnings on this file.
2026-10-19 22:18:32 -04:00
Affaan Mustafa 1e787f62f5 refactor(lib): split install-lifecycle repair and inspect paths
executeRepairOperation, executeUninstallOperation, and inspectManagedOperation
now dispatch on operation kind to one small function per kind, with the
repeated uninstall result shapes and previous-content restore pulled into
helpers. executeRepairOperation takes an options object instead of four
trailing positionals. analyzeRecord is a sequence of collect* steps, and the
per-record repair closure inside repairInstalledStates hands off to
runRecordRepair with the legacy OpenCode, build-only dry run, and managed
repair paths as separate functions.

Result objects keep the same keys in the same order, and lock, build, and
require ordering is unchanged. Clears the max-params and complexity warnings
on this file.
2026-10-19 22:18:32 -04:00
Affaan Mustafa 8c1925722c refactor(lib): split powershell destructive-command scanners
The here-string normalizer, comment stripper, and balanced-group reader each
carried their own copy of the same inert-region state machine. They now share
createLexState, consumeInertChar, and openInertRegion. The container
extractor, statement tokenizer, nested pwsh scanner, cmd scanner, Start-Process
scanner, and top-level statement walk are split into small named helpers that
each handle one region or one command family.

No classification change. Verified against the recorded test inputs plus
mutated variants with an order-sensitive comparison of findings. Clears the
eleven complexity and prefer-const warnings on this file.
2026-10-19 22:18:32 -04:00
Affaan Mustafa cfcd81c076 refactor(lib): share span readers in shell-substitution
extractSubshellGroups and extractBraceGroups each carried their own copies of the quote-aware skipping for $(...), backtick and (...) spans, which is where the complexity and nesting warnings came from. The skipping now lives in findParenSpanEnd, findBacktickEnd and skipOuterSpan, with readSubshellBody and readBraceBody doing the body collection.

Behavior is unchanged: the same bodies come back in the same order, trailing backslashes and unterminated spans resolve the same way, and the three exports keep their signatures.
2026-10-19 22:03:57 -04:00
KET ⚡ 35d7c698e9 fix(hooks): read BOM-prefixed managed hook preferences 2026-10-15 23:22:53 +05:30
Hemang Varshney 8e2cdefba6 fix(install): reject unterminated comments, keep plugin shape check, handle CR endings
Address review findings on #3590:

- Unterminated block comments now throw instead of silently passing:
  {'plugin':[]} /* no longer parses, so the install keeps its
  source-context error for genuinely malformed configs (CodeRabbit,
  Greptile).
- Line-comment scanners stop at CR as well as LF, so CR-only line
  endings do not consume the rest of the file (CodeRabbit).
- activationIsInactive restores the 'plugin must be an array' shape
  check that the strict parser surfaced, so a non-array plugin no
  longer counts as inactive (Greptile).

Regression tests: unterminated comment with source context, CR-only
endings, and non-array plugin across apply/repair/doctor modes.
2026-10-15 17:49:10 +05:30
Hemang Varshney ced82ccf9f fix(install): tolerate JSONC comments in the OpenCode config membership check
The read-only plugin-membership check in activationIsInactive and the
validation inside disableOpenCodeHookPluginRegistration used strict
JSON.parse, so any user whose ~/.config/opencode/opencode.json contains
JSONC comments (which OpenCode itself accepts) could not install the
OpenCode catalog. The plan never writes the user-owned config; this
parse is purely a membership read (issue #3546).

Add a string-aware JSONC parser (line/block comments, the trailing
commas they hide, URL strings untouched) and route both call sites
through it. Truly malformed JSON keeps its source-context error.

Tests: unit coverage for comment/trailing-comma/URL handling, plus an
apply-level regression test that installs over an inactive JSONC user
config byte-for-byte, across default and declined consent modes.
2026-10-15 17:02:16 +05:30
Tivonsico f3457a3483 fix(skill-tracker): reject non-string execution timestamps 2026-10-15 08:51:57 +08:00
haelyra 1d1b62e58e fix: recover plugin migration at the effective settings scope 2026-10-11 15:36:49 -04:00
haelyra 87c136fcae fix: integrate strict issue targeting and Windows Python discovery 2026-10-11 15:07:29 -04:00
haelyra c7a467061b Merge remote-tracking branch 'origin/pr-3523' into steward/late-arrivals-20261011 2026-10-11 15:00:38 -04:00
haelyra a4d9297da1 fix: allow bounded sustained Windows atomic replacement contention 2026-10-11 13:47:57 -04:00
akushonkamen 3cf0e709d5 fix(github-coordination): reject malformed issue numbers instead of truncating them
normalizeIssueNumber parsed with Number.parseInt, which stops at the
first non-digit ("42oops" -> 42, "42.9" -> 42, "4e2" -> 4) and loses
precision past 2^53 (9007199254740993 became 9007199254740992). The CLI
shares this helper for --issue, --limit, and the positional issue number,
so malformed values silently targeted the wrong issue before any integer
guard downstream could notice.

Validate the entire trimmed decimal token and require
Number.isSafeInteger so malformed or out-of-range values throw
"Invalid issue number" during argument parsing, before the state store
is opened or GitHub is contacted. Whitespace, leading plus, and leading
zero tolerance is preserved. Regression coverage added at both the
library level (tests/lib/github-coordination-gh-api.test.js) and the CLI
argument parser (tests/scripts/github-coordination.test.js).

Fixes #3514
2026-10-12 01:25:09 +08:00
haelyra 0d4fd902ca fix: carry verified storage capability and deterministic Canvas checks 2026-10-11 12:49:24 -04:00
haelyra bded8387eb fix: preflight and document snapshot storage capability 2026-10-11 12:34:15 -04:00
haelyra 99ee8a8818 fix: carry reviewed staging and plugin-root input guards into follow-up batch 2026-10-11 12:09:35 -04:00