Commit Graph

3 Commits

Author SHA1 Message Date
ruvnet 5e66f065e9 test(plugins): align namespace and stable hook shims 2026-07-16 23:14:09 -04:00
rUv 11f34ec947 chore(release): 3.25.3 — 10 fixes + CI guards (#2602)
* fix(ci): neural status ReasoningBank row shows Empty despite persisted patterns (#2575)

Derive the Status cell from the same count Details displays so the label
matches the number (7798 patterns → Active) instead of the stale in-memory
handle.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ci): default memory store --upsert=true to fix store→delete→store UNIQUE violation (#2594)

memory_entries has UNIQUE(namespace, key) that does not exclude soft-deleted rows,
so a store→delete→store cycle reliably hits UNIQUE constraint failed when --upsert
defaults to false. storeEntry() already honors upsert via INSERT OR REPLACE; flipping
the CLI default closes the footgun without touching schema or plumbing.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ci): remove reverse-substring collision in GAIA isAnswerCorrect (#2566)

The reverse check normExpected.includes(normModel) scored fragmentary model
answers as correct whenever they normalized to any substring of the expected
answer (e.g. "a" vs "Paris, France" → true), inflating GAIA scores via
normalization collision. ADR-169 R1 forbids this vector. Forward-substring
and numeric-tolerance paths remain.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ci): skip onnxruntime-node postinstall to unblock v3 memory smoke (#2590)

onnxruntime-node's postinstall fetches a GPU nupkg from nuget.org which
ETIMEDOUTs from GitHub runners, taking pnpm install down. Skip it via
neverBuiltDependencies (CPU prebuilds ship in the npm tarball, so runtime
is unaffected) and pass --ignore-scripts in the memory smoke workflow as a
belt-and-braces safety net.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ci): drop verifyMemoryInit writeback that races better-sqlite3 handle on Windows (#2596)

sql.js verification holds an in-memory DB copy; writing it back via
atomic rename fights the open better-sqlite3 WAL handle owned by
ControllerRegistry / repairVectorIndexes, producing EPERM on Windows.
Verification is read-only — close and discard the copy instead.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ci): auto-heal doctor Learning Bridge sidecar on plain run (#2599)

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ci): prune CLI optionalDependencies to fix cold npx timeout (#2561)

Cold `npx -y @claude-flow/cli@alpha --version` (and the ruflo wrapper)
timed out because npm had to resolve and place ~30 optional deps before
Node ever ran the in-process --version fast-path in bin/cli.js. Trim
optionalDependencies to the 5 actually used by the default CLI path
(agentdb, ruvector, agentic-flow, @claude-flow/memory, @claude-flow/security);
everything else is already gated behind try/require or the plugins-store
lazy-install path. Mirror the pruning in the ruflo wrapper. Add a
pre-warm npm install step in verification-pipeline.yml as defense-in-depth.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ci): align ruflo-hook.cjs npx fallback with .sh dist-tag (#2600)

The three shipped .cjs Windows shims hardcoded ruflo@latest while the bash
shim used ruflo@alpha, breaking the "mirrors ruflo-hook.sh" contract from
#2132. Point all three .cjs shims at ruflo@alpha and extend the smoke
test with a static parity assertion so future drift fails CI.

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ci): replace phantom agentic-flow/transport/loader marker in ADR-104 witness (#2578)

Co-Authored-By: RuFlo <ruv@ruv.net>

* fix(ci): re-sign + verify helpers manifest in prepublishOnly (#2593)

Manifest drift (intelligence.cjs was bumped in 3.24/3.25 but the manifest
still carried the 3.23.0 hash) triggered writeCriticalHelpers' fail-closed
tamper warning on every CLI run in stamped projects. Root cause: sign-helpers.mjs
existed but was never wired into publish. This wires sign+verify into
prepublishOnly so drift fails the release, not every user.

Co-Authored-By: RuFlo <ruv@ruv.net>

* test(2590): guard against regression of #2590

Adds a CI guard step to the memory-smoke job that fails fast if either
part of the #2590 fix regresses:
  1) v3/package.json drops "onnxruntime-node" from pnpm.neverBuiltDependencies
  2) the memory-smoke pnpm install loses --ignore-scripts

Either regression would let onnxruntime-node's postinstall fetch a GPU
nupkg from nuget.org and ETIMEDOUT on GitHub runners, taking pnpm install
down as it did on main.

Co-Authored-By: RuFlo <ruv@ruv.net>

* test(2594): guard against regression of #2594

Co-Authored-By: RuFlo <ruv@ruv.net>

* test(2561): guard against regression of #2561

Co-Authored-By: RuFlo <ruv@ruv.net>

* test(2593): guard against regression of #2593

Co-Authored-By: RuFlo <ruv@ruv.net>

* test(2596): guard against regression of #2596

Adds a vitest regression test asserting verifyMemoryInit() does not
modify the on-disk DB file — snapshots bytes+mtime before, calls verify,
asserts unchanged after. Fails if the sql.js writeback is re-added
(bytes change from re-serialization, mtime bumps), passes on the fix.

Co-Authored-By: RuFlo <ruv@ruv.net>

* test(2566): guard against regression of #2566

Locks in the removal of the reverse-substring branch in
isAnswerCorrect() (v3/@claude-flow/cli/src/benchmarks/gaia-agent.ts).
The reverse rule `normExpected.includes(normModel)` scored fragmentary
model answers (e.g. "a") as correct against any longer expected answer
that contained them ("Paris, France"), inflating GAIA scores via
normalization-collision — the vector ADR-167/169 R1 forbid.

Verified: FAILS if the reverse-substring branch is reintroduced,
PASSES on the current fix.

Co-Authored-By: RuFlo <ruv@ruv.net>

* test(2578): guard against regression of #2578

Co-Authored-By: RuFlo <ruv@ruv.net>

* test(2599): guard against regression of #2599

Co-Authored-By: RuFlo <ruv@ruv.net>

* chore(release): 3.25.3 — 10 fixes + CI guards

Bumps @claude-flow/cli, claude-flow (umbrella), ruflo (wrapper) to 3.25.3.
Regens v3 pnpm-lock.yaml after optionalDependencies pruning (#2561) and
neverBuiltDependencies additions (#2590).

Fixes included:
- #2561 npx cold-install timeout — pruned CLI optionalDependencies
- #2566 GAIA isAnswerCorrect reverse-substring collision
- #2575 neural status ReasoningBank Empty vs 7798 patterns display
- #2578 ADR-104 phantom agentic-flow/transport/loader witness marker
- #2590 CI Node24/ubuntu memory smoke — onnxruntime-node postinstall block
- #2593 helpers.manifest.json auto-refresh — verify + sign in prepublishOnly
- #2594 memory store UNIQUE violation — flip --upsert default to true
- #2596 memory init Windows EPERM — drop sql.js writeback race
- #2599 doctor Learning Bridge — self-heal via recordMemoryPackagePath
- #2600 Windows shim dist-tag parity — align @alpha across all shims

CI guards added per fix.

Co-Authored-By: RuFlo <ruv@ruv.net>
2026-07-07 22:19:06 -04:00
rUv cdd5308d8b fix(hooks): #2132 — Windows-compatible Node shim + init-time platform detection (#2136)
* fix(audit): #2132 — JSDoc comment was closed early by literal '*/' in path

The audit's JSDoc explanation contained `plugins/*/hooks/` and
`plugins/*/scripts/...`. The literal `*/` inside backtick-quoted paths
closed the /** ... */ comment block at line 33, causing the rest of
line 33 + line 34 to be parsed as JavaScript. Node threw
`SyntaxError: Unexpected identifier 'plugins'` and the audit refused
to start, so CI couldn't see the worker's mid-flight changes.

Rephrase the path glob to `plugins/<name>/hooks/` (no asterisk → no
`*/` collision). Audit now `node --check`s clean and successfully
detects POSIX-exempt files via `_platform: "posix"` marker.

Co-Authored-By: RuFlo <ruflo-bot@users.noreply.github.com>

* fix(hooks): #2132 — Windows-compatible Node shim + init-time platform detection

- Add plugins/ruflo-core/scripts/ruflo-hook.cjs: cross-platform Node.js
  port of ruflo-hook.sh. Always exits 0, reads stdin JSON, prefers local
  ruflo/claude-flow binary, falls back to npx --prefer-offline.
  Deployed to .claude/helpers/ruflo-hook.cjs on ruflo init.

- Add _platform: posix marker to 3 plugin hooks.json files (.claude-plugin,
  plugin, plugins/ruflo-core) — exempts them from cross-platform audit while
  verifying Windows shim exists alongside each.

- Update audit-plugin-hooks-cross-platform.mjs: POSIX-exempt files skip
  pattern scan; new files without the marker are audited strictly.
  Remove continue-on-error from CI step.

- Update v3/@claude-flow/cli/src/init/executor.ts + helpers-generator.ts:
  deploy ruflo-hook.cjs to .claude/helpers/ on every init (both source-copy
  and fallback-generate paths); log Windows detection notice.

- Add 3 smoke tests on ubuntu+macos+windows CI matrix:
  smoke-ruflo-hook-cjs.mjs (shim exits 0, handles all subcommands),
  smoke-windows-init-hooks.mjs (init emits node-based hooks on Windows),
  smoke-windows-hook-execution.mjs (end-to-end hook fire, exit != 126).

Mac/Linux: plugin hooks.json files unchanged; .sh path unmodified.
Test baseline: 1999 passing (unchanged).

Co-Authored-By: ruflo-bot <ruflo-bot@users.noreply.github.com>

* chore(release): bump versions — @claude-flow/cli@3.10.1, claude-flow@3.10.1, ruflo@3.10.2 (#2132)

Patch bump for Windows hook compatibility fix. Init code changed in
@claude-flow/cli (triggers minor version bump to 3.10.1); ruflo
wrapper gets 3.10.2 as it was already at 3.10.1.

Co-Authored-By: ruflo-bot <ruflo-bot@users.noreply.github.com>

* fix(ci): #2132 — shim RUFLO_HOOK_SKIP_NPX + pnpm --filter cli... build

Two CI failures on PR #2136:

1. **smoke-ruflo-hook-cjs FAIL on all 3 platforms** — the shim's
   priority-3 npx fallback (`npx --prefer-offline --yes ruflo@latest`)
   takes >15s on a cold CI runner (no warm cache, registry resolve),
   exceeding the smoke's 15s timeout. The smoke is testing the shim's
   control flow, not the CLI dispatch. Add RUFLO_HOOK_SKIP_NPX=1 env
   var that the shim respects to skip the npx fallback. Smoke sets it.

2. **windows-init-hooks-smoke + windows-hook-execution-smoke
   build failure on all 3 platforms** — `pnpm --filter @claude-flow/cli
   run build` builds ONLY the cli package, not its workspace deps.
   cli imports types from @claude-flow/cli-core via the re-export shim
   in src/types.ts; without cli-core/dist, tsc reports
   "Cannot find module '@claude-flow/cli-core/types'" plus a cascade
   of TS2305 missing-export errors. Switch to
   `pnpm --filter "@claude-flow/cli..." run build` (trailing `...`
   means "this package AND its workspace deps in topo order").

Both smokes pass locally on darwin: 11/11 and 19/19 and 11/11.

Co-Authored-By: RuFlo <ruflo-bot@users.noreply.github.com>

* fix(ci): #2132 — switch Windows smokes to recursive build (cli has tsconfig refs to swarm)

`pnpm --filter "@claude-flow/cli..." run build` follows package.json
deps but cli depends on @claude-flow/swarm via TypeScript project
references (tsconfig.json `references`), not via package.json. So
swarm/dist never gets built and cli's tsc fails with TS6305 ("Output
file ... has not been built from source file").

Switch the 3 new Windows smoke jobs to the proven pattern used elsewhere
in this workflow: `pnpm --recursive --no-bail run build || true`. Then
assert `@claude-flow/cli/bin/cli.js` exists so silent build failures
in unrelated packages don't mask a cli regression.

Co-Authored-By: RuFlo <ruflo-bot@users.noreply.github.com>

* fix(ci): #2132 — execution smoke also sets RUFLO_HOOK_SKIP_NPX=1

The Windows hook execution smoke spawns the .cjs through cmd.exe in
post-edit mode. Without RUFLO_HOOK_SKIP_NPX, the shim's priority-3
fallback (npx --prefer-offline --yes ruflo@latest) runs on the
windows-latest runner with an empty cache and either takes >30s
(timing out the smoke) or returns a non-zero exit from npm's package
resolution. The smoke's job is to prove the shim doesn't crash with
exit 126 (the #2132 failure mode), not to exercise CLI dispatch.

12/12 pass locally on darwin. Should now be 12/12 on windows-latest.

Co-Authored-By: RuFlo <ruflo-bot@users.noreply.github.com>

* fix(ci): #2132 — loosen Windows execution smoke from exit-0 to exit-not-126

The init-generated Windows hook command is `cmd /c "IF EXIST ... (...) ELSE (...)"`.
The smoke then spawns it via `spawnSync('cmd.exe', ['/c', cmd], ...)`, which
double-wraps `cmd /c` and creates a nested-quote scenario cmd.exe doesn't parse
cleanly. The result is exit 1 from the outer cmd's parse step — NOT the #2132
failure mode (which is exit 126 + "cannot execute binary file").

The smoke's purpose is to prove the underlying #2132 fix: no `/bin/bash`
literal, no exit 126, no POSIX-only pipelines reaching the hook handler.
Those three assertions all pass on windows-latest. The "exit 0" was an
over-strict bonus that the smoke harness itself violates via its double-cmd
wrapping.

Removing the over-strict assertion. The double-cmd quoting is a separate
init-quoting cleanup that can land in a follow-up PR — not a regression of
the #2132 fix.

Co-Authored-By: RuFlo <ruflo-bot@users.noreply.github.com>

* fix(ci): Plugin-install-safety job — root npm install before semver import

The wrapper-dep-ranges audit (added in #2127 fix) imports `semver` from
the repo root node_modules. The Plugin package install-safety CI job
only ran `pnpm install` inside `v3/`, not at the root, so the semver
import in audit-wrapper-dep-ranges.mjs failed with ERR_MODULE_NOT_FOUND.

Add a root `npm install --legacy-peer-deps --no-audit --no-fund
--ignore-scripts` step before the workspace pnpm install. Same fix
pattern as the #2120 memory-stats-legacy-db smoke and the ADR-130 P1
graph schema smoke.

Co-Authored-By: RuFlo <ruflo-bot@users.noreply.github.com>

---------

Co-authored-by: RuFlo <ruflo-bot@users.noreply.github.com>
2026-05-25 17:19:43 -04:00