Skip to content

feat(release): extend the release-due watcher + tarball pack-check to engine/miner/ui-kit#8592

Merged
JSONbored merged 2 commits into
mainfrom
feat/package-release-watch
Jul 25, 2026
Merged

feat(release): extend the release-due watcher + tarball pack-check to engine/miner/ui-kit#8592
JSONbored merged 2 commits into
mainfrom
feat/package-release-watch

Conversation

@JSONbored

Copy link
Copy Markdown
Owner

Closes #8591.

Summary

Only MCP had a "release due" tracking-issue safety net (mcp-release-watch.yml) and a published-tarball dry-run validator (test:mcp-pack) — engine, miner, and ui-kit had neither. If release-please ever silently stopped proposing a release PR for one of them, nothing would flag it, and their published npm tarballs were never checked for stray/forbidden/secret-like content.

  • scripts/release-semver-utils.ts: pure semver/conventional-commit primitives extracted from mcp-release-core.ts so both MCP's bespoke watcher and the new generic one share one implementation instead of duplicating it. MCP's own public API is unchanged (same exports, same behavior — verified against its full existing test suite, 105 tests across 8 files, zero regressions).
  • scripts/package-release-core.ts: the generic due-detection/issue-building core for engine/miner/ui-kit. Deliberately simpler than MCP's — none of the three have commits needing cross-cutting-path attribution the way MCP wraps app-side Worker logic, and all three already have release-please maintaining their CHANGELOG.md natively, so no bespoke changelog renderer is needed.
  • scripts/check-package-release-due.ts: generic upsert/close CLI, parameterized by --package engine|miner|ui-kit, mirroring check-mcp-release-due.ts (including the MCP release due: 4.0.0 #6145 auto-close-once-caught-up fix).
  • .github/workflows/package-release-watch.yml: one new job checking all three packages sequentially (not a matrix) — the shared Actions runner pool is org-wide, and Epic: consolidate the '-coverage' bolt-on test-file family #8574's investigation found extra concurrent scheduled-run runners a direct contributor to queue saturation, so this adds zero additional concurrent runner load.
  • scripts/check-engine-package.ts / check-ui-kit-package.ts: npm-pack dry-run validators (test:engine-pack / test:ui-kit-pack, wired into test:ci and ci.yml). Pattern-based allowlists, not enumerated file lists like MCP/miner's small hand-curated ones — engine ships 358 files and ui-kit 152, mirroring their src/ trees 1:1, and will keep growing as the engine extraction continues.

Bonus fix: the new ui-kit pack-check immediately caught two real gaps — CHANGELOG.md existed on disk but was missing from package.json's files field (silently excluded from the published npm tarball), and ui-kit had no README.md at all. Both fixed.

Test plan

  • npx vitest run test/unit/generate-mcp-changelog-script.test.ts test/unit/mcp-release.test.ts test/unit/mcp-release-candidate.test.ts test/unit/package-release.test.ts test/unit/check-engine-package.test.ts test/unit/check-ui-kit-package.test.ts test/unit/check-mcp-package.test.ts test/unit/check-miner-package.test.ts — 105/105 pass
  • npm run typecheck / npm run actionlint — clean
  • npm run test:engine-pack / npm run test:ui-kit-pack — pass against the real built packages (358 / 152 files)
  • Ran check-package-release-due.ts --package {engine,miner,ui-kit} --json directly against real repo state to confirm end-to-end correctness

… engine/miner/ui-kit (#8591)

Only MCP had a "release due" tracking-issue safety net (mcp-release-watch.yml)
and a published-tarball dry-run validator (test:mcp-pack) -- engine, miner,
and ui-kit had neither. If release-please ever silently stopped proposing a
release PR for one of them, nothing would flag it, and their published npm
tarballs were never checked for stray/forbidden/secret-like content.

- scripts/release-semver-utils.ts: pure semver/conventional-commit primitives
  extracted from mcp-release-core.ts (parseConventionalSubject, compareSemver,
  bumpVersion, latestSemverTagWithPrefix, inferReleaseTypeFromSubjects,
  escapeIssueMarkdownText, shortSha) so both MCP's bespoke watcher and the new
  generic one share one implementation instead of duplicating it. MCP's own
  public API is unchanged (same exports, same behavior -- verified against its
  full existing test suite, 105 tests across 8 files, zero regressions).
- scripts/package-release-core.ts: the generic due-detection/issue-building
  core for engine/miner/ui-kit. Deliberately simpler than MCP's: none of the
  three have commits needing cross-cutting-path attribution the way MCP wraps
  app-side Worker logic, and all three already have release-please maintaining
  their CHANGELOG.md natively (release-please-config.json), so no bespoke
  changelog renderer is needed here.
- scripts/check-package-release-due.ts: generic upsert/close CLI, parameterized
  by --package engine|miner|ui-kit, mirroring check-mcp-release-due.ts
  (including the #6145 auto-close-once-caught-up fix).
- .github/workflows/package-release-watch.yml: ONE new job checking all three
  packages sequentially (not a matrix) -- the shared Actions runner pool is
  org-wide, and #8574's investigation found extra concurrent scheduled-run
  runners a direct contributor to queue saturation, so this adds zero
  additional concurrent runner load.
- scripts/check-engine-package.ts / check-ui-kit-package.ts: npm-pack dry-run
  validators (test:engine-pack / test:ui-kit-pack, wired into test:ci and
  ci.yml). Pattern-based allowlists (^dist/.*\.(js|d\.ts)$ etc.), not
  enumerated file lists like MCP/miner's small hand-curated ones -- engine
  ships 358 files and ui-kit 152, mirroring their src/ trees 1:1 via tsc's
  default output shape, and will keep growing as the engine extraction
  continues (per its own README).

Also fixes two real gaps the new ui-kit pack-check immediately caught:
ui-kit's CHANGELOG.md existed on disk but was missing from package.json's
"files" field (silently excluded from the published npm tarball), and
ui-kit had no README.md at all. Both fixed.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
❌ Deployment failed
View logs
loopover-ui 730d805 Jul 24 2026, 11:41 PM

@superagent-security

Copy link
Copy Markdown
Contributor

Superagent didn't find any vulnerabilities or security issues in this PR.

@codecov

codecov Bot commented Jul 24, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.54%. Comparing base (626bc33) to head (3606ed7).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #8592   +/-   ##
=======================================
  Coverage   92.54%   92.54%           
=======================================
  Files         796      796           
  Lines       79850    79850           
  Branches    24135    24135           
=======================================
  Hits        73899    73899           
  Misses       4802     4802           
  Partials     1149     1149           
Flag Coverage Δ
backend 93.72% <ø> (ø)
control-plane 99.85% <ø> (ø)
rees 88.56% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

@codecov

codecov Bot commented Jul 24, 2026

Copy link
Copy Markdown

Bundle Report

Bundle size has no change ✅

@loopover-orb loopover-orb Bot added the gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier. label Jul 24, 2026
@loopover-orb

loopover-orb Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Warning

⏸️ LoopOver review result - manual review recommended

Review updated: 2026-07-25 00:26:58 UTC

14 files · 1 AI reviewer · no blockers · CI green · clean

⏸️ Suggested Action - Manual Review

  • Touches a guarded path — held for manual review: This PR changes guardrail-protected path(s): .github/workflows/ci.yml (matched .github/workflows/**), .github/workflows/package-release-watch.yml (matched .github/workflows/**).

Review summary
This PR extracts MCP's semver/conventional-commit primitives into a shared release-semver-utils.ts, adds a generic package-release-core.ts + check-package-release-due.ts watcher for engine/miner/ui-kit, wires a new scheduled workflow, and adds npm-pack dry-run validators for engine/ui-kit mirroring the existing MCP/miner ones. The extraction from mcp-release-core.ts is a clean move-and-re-export (parseConventionalSubject, compareSemver, bumpVersion still re-exported for back-compat) with MCP's own 105-test suite cited as a regression guard. The isPackageReleaseRelevantCommit logic is deliberately simpler than MCP's cross-cutting-path variant and is well-tested against merge-commit exclusion, release/changelog-scope exclusion, and cross-package isolation.

Nits — 7 non-blocking
  • scripts/check-package-release-due.ts:204 uses `any` for the GitHub API response payload; a minimal typed shape (or `unknown` + narrowing) would be safer than blanket `any`.
  • scripts/check-engine-package.ts:56 and check-ui-kit-package.ts:57 hardcode `1024 * 1024 * 16` for maxBuffer; a named constant (as check-package-release-due.ts does with GITHUB_REQUEST_TIMEOUT_MS) would make the intent clearer.
  • package-release-watch.yml's inline `node <<'NODE'` summary step duplicates structure across three packages; a small helper script would avoid the copy-pasted lines list, though this is minor for a 3-item loop.
  • The PR description says 'Closes Extend the MCP-only 'release due' watcher to engine/miner/ui-kit #8591' but the brief flags issue coverage as only partial — worth confirming the issue's full scope (e.g. whether miner's pack-check was also required) is satisfied by this diff.
  • Consider extracting the three near-identical check-engine-package.ts/check-ui-kit-package.ts/check-miner-package.ts pack-check scripts' common validate/run/load-from-npm scaffolding into a shared helper, similar to what was done for release-semver-utils.ts, to avoid drift as allowlists evolve.
  • PR author also opened the linked issue — Link an issue that was opened by a different contributor, or provide a rationale for why this self-authored issue represents genuine discovery work.
  • Touches a guarded path — held for manual review — A maintainer must review and merge this change.

Decision drivers

  • ✅ Code review — No blockers (1 reviewer)
  • ⚠️ Gate result — Not blocking (Advisory; not blocking this PR.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #8591
Related work ✅ No active overlap found No same-issue or scoped active PR overlap found.
Change scope ✅ 20/20 Low review scope from cached public metadata (1 linked issue).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 13 registered-repo PR(s), 13 merged, 277 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 13 PR(s), 277 issue(s).
Improvement ✅ Minor risk: clean · value: minor
Linked issue satisfaction

Addressed
The PR adds test:engine-pack/test:ui-kit-pack scripts, extracts a shared per-package config (paths, tag prefix, checklist, script names) into package-release-core.ts while factoring semver/conventional-commit primitives into release-semver-utils.ts, adds a single sequential (non-matrix) package-release-watch.yml covering engine/miner/ui-kit, and includes regression tests mirroring the upsert/close

Review context
  • Author: JSONbored
  • Role context: owner (maintainer lane)
  • Public audience mode: oss maintainer
  • Lane context: Repository is configured for direct PR review.
  • Public profile languages: not available
  • Official Gittensor activity: 13 PR(s), 277 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Treat this as maintainer-lane context rather than normal contributor-lane activity.
Signal definitions
  • Related work = same linked issue, overlapping active PRs, or title/path similarity.
  • Change scope = cached public metadata such as size labels, draft state, and review-burden hints.
  • Validation posture = whether the PR provides enough public validation/test evidence for maintainer review.
  • Contributor workload = public contributor activity and cleanup pressure, not a repo-wide quality failure.
  • Contributor context = public GitHub/Gittensor identity context; non-Gittensor status is not a blocker.
🧪 Chat with LoopOver

Ask LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.

  • @loopover ask &lt;question&gt; answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat &lt;question&gt; answers in natural prose from cached decision-pack facts via local inference (maintainer/collaborator; read-only).
  • A plain-language @loopover mention with a real question is routed to the closest matching read-only command automatically — no exact syntax required.

Full command reference: https://loopover.ai/docs/loopover-commands

🧪 Experimental — new and may change.

🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed


💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →.

Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.

  • Re-run LoopOver review

@loopover-orb loopover-orb Bot added the manual-review Gittensor contributor context label Jul 25, 2026
test/unit/check-ui-kit-package.test.ts's real-package regression test
needs packages/loopover-ui-kit/dist/ on disk, but validate-tests never
built ui-kit -- only validate-code did, in a separate job/runner. This
job runs the general test/unit/*.test.ts suite unconditionally whenever
it runs at all, so the test failed on CI (confirmed live on #8592) even
though it passed locally where ui-kit had already been built manually.

Reproduced locally by deleting packages/loopover-ui-kit/dist/ and
confirming npm run test:ui-kit-pack fails exactly as CI reported, then
confirming the new Build UI-kit package step (mirroring engine/MCP/
miner's existing pattern in this same job) fixes it.
@JSONbored
JSONbored merged commit 25e99c2 into main Jul 25, 2026
10 checks passed
@JSONbored
JSONbored deleted the feat/package-release-watch branch July 25, 2026 00:32
JSONbored added a commit that referenced this pull request Jul 25, 2026
* fix(deps): resolve postcss + tar audit findings via overrides

npm audit flagged postcss <=8.5.17 (path traversal in previous-sourcemap
auto-loading, GHSA-r28c-9q8g-f849, high) and tar <=7.5.20 (uncontrolled
recursion DoS via crafted long-path tar, GHSA-r292-9mhp-454m, moderate),
both transitive. Pin both via overrides, matching this file's existing
pattern for other transitive-dep security fixes: bump the existing tar
override past its first-patched version (7.5.19 -> 7.5.21) and add a new
postcss override (8.5.18, first patched version).

Closes task 1 of #8588's checklist. The remaining findings in that issue
(eslint v10 bump for the brace-expansion/minimatch chain, the
@esbuild-kit->tsx trace, and the recharts v3 migration) are unrelated,
each need their own scoping, and are now tracked as sub-issues #8608,
#8609, #8610.

* build: add the missing ui-kit build step to the local test:ci gate

Discovered incidentally while running the full local gate for #8588:
test/unit/check-ui-kit-package.test.ts's own regression guard needs
packages/loopover-ui-kit/dist/ to exist, but the root test:ci script
never built that workspace before test:coverage -- unlike the real CI
validate-tests job, which already builds it via `npx turbo run build
--filter=@loopover/ui-kit` right before its own coverage step (added in
#8592 to close this exact gap, but only in the CI workflow, not the
local script this repo's own contributing guide points everyone at).
Anyone running `npm run test:ci` from a clean checkout hit a spurious
failure that real CI never showed.

Adds `npm run build --workspace @loopover/ui-kit` alongside the other
per-package builds already in the chain (engine, discovery-index, mcp,
miner), so the local script matches CI again.

* fix(mcp): stop CLI stdout truncation on >64KB piped output

Discovered incidentally while running the full local gate for #8588:
test/unit/mcp-cli-profiles.test.ts's changelog test started failing with
a JSON parse error once packages/loopover-mcp/CHANGELOG.md grew past the
OS pipe buffer size (verified: `loopover-mcp changelog --json | wc -c`
returned exactly 65536 bytes instead of the real 65603+ -- the classic
64KB pipe-buffer boundary).

Root cause: process.stdout/stderr writes to a POSIX pipe are
asynchronous, but the CLI entrypoint called process.exit() immediately
after the command's async work resolved, cutting off any pending write
larger than one pipe buffer's worth before it finished flushing. This
silently truncates any command's output over ~64KB for any real
consumer piping the CLI (not just this test) -- e.g. `loopover-mcp
changelog --json | jq` would get invalid JSON.

Fix: drain both streams (wait for their internal buffer to empty) right
before calling process.exit(), instead of changing when/whether
process.exit() itself is called -- keeps the existing fast-exit behavior
for everything else (no risk of hanging on a lingering fetch keep-alive
socket) while fixing the truncation at its actual source.

* test(miner): raise timeout for build:verify syntax-check regression guard

Discovered incidentally while running the full local gate for #8588:
this test spawns a real subprocess (node --check over every
dist/bin+dist/lib file in packages/loopover-miner) -- 5.5s in isolation,
but it exceeded the default 15s testTimeout once under the full suite's
parallel load. Genuinely necessary real subprocess work with no
redundancy to cut, matching this repo's established real-subprocess
timeout-flake pattern (agent-sdk-driver.test.ts, miner-attempt-worktree
.test.ts, miner-repo-clone.test.ts, #6869/#6871): raise to the same
evidence-based 60000ms ceiling already used for that class of test,
rather than reflexively widening without a reason.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gittensor:bug Gittensor-scored bug fix — scores a 0.05x multiplier. manual-review Gittensor contributor context

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Extend the MCP-only 'release due' watcher to engine/miner/ui-kit

1 participant