docs(site): show release version and github stars#872
Conversation
There was a problem hiding this comment.
Code Review
This pull request automates the version display in the documentation by reading the version from Cargo.toml and introduces a dynamic GitHub star count badge in the social links. Feedback was provided to optimize the DOM manipulation logic for the star count, suggesting the use of querySelectorAll and a more focused MutationObserver scope to improve performance and ensure the badge appears in all navigation contexts.
| const addStarCount = () => { | ||
| const githubLink = document.querySelector( | ||
| '.VPSocialLinks a[href*="github.com/jdx/hk"]', | ||
| ) | ||
| if (githubLink && !githubLink.querySelector('.star-count')) { | ||
| const starBadge = document.createElement('span') | ||
| starBadge.className = 'star-count' | ||
| starBadge.textContent = starsData.stars | ||
| starBadge.title = 'GitHub Stars' | ||
| githubLink.appendChild(starBadge) | ||
| } | ||
| } | ||
|
|
||
| addStarCount() | ||
| setTimeout(addStarCount, 100) | ||
| const observer = new MutationObserver(addStarCount) | ||
| observer.observe(document.body, { childList: true, subtree: true }) |
There was a problem hiding this comment.
Using MutationObserver on document.body with subtree: true can have a negative impact on performance as it triggers on every DOM change across the entire page. Additionally, document.querySelector only targets the first matching element, which might miss the social links in the mobile navigation if both desktop and mobile navs are present in the DOM.
Consider using querySelectorAll to update all instances and narrowing the observer's scope to the navigation bar (.VPNav) for better efficiency. The setTimeout is also likely redundant if the observer is correctly configured.
const addStarCount = () => {
const githubLinks = document.querySelectorAll(
'.VPSocialLinks a[href*="github.com/jdx/hk"]',
)
githubLinks.forEach((githubLink) => {
if (!githubLink.querySelector('.star-count')) {
const starBadge = document.createElement('span')
starBadge.className = 'star-count'
starBadge.textContent = starsData.stars
starBadge.title = 'GitHub Stars'
githubLink.appendChild(starBadge)
}
})
}
addStarCount()
const nav = document.querySelector('.VPNav')
const observer = new MutationObserver(addStarCount)
observer.observe(nav || document.body, { childList: true, subtree: true })
Greptile SummaryThis PR updates the VitePress docs to surface two pieces of repo metadata: the nav bar now shows the current release version parsed from Confidence Score: 5/5Safe to merge — docs-only change with no runtime or security impact on the tool itself. No P0 or P1 issues found. Both previously flagged concerns (hardcoded fallback stars and uncleared MutationObserver) are resolved. The build-time Cargo.toml parsing has a graceful fallback, the GitHub API fetch is opt-in with a silent-catch, and the observer lifecycle is properly managed with onUnmounted. No files require special attention. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
subgraph Build["Build Time (config.mts)"]
A[Read Cargo.toml] --> B{Regex match /package/ version}
B -- match --> C[latestVersion = semver]
B -- no match --> D[latestVersion = '0.0.0' + console.warn]
C --> E[Nav: vX.Y.Z → GitHub releases]
end
subgraph Stars["Build Time (stars.data.ts)"]
F{GITHUB_TOKEN / UPDATE_GITHUB_STARS?}
F -- yes --> G[GET api.github.com/repos/jdx/hk]
G -- ok --> H[stars = stargazers_count]
G -- error/timeout --> I[stars = 0 / empty string]
F -- no --> I
H --> J[return formatStars]
I --> K[return empty string]
end
subgraph Runtime["Runtime (theme/index.ts)"]
L[onMounted] --> M{starsData.stars not empty?}
M -- yes --> N[querySelectorAll .VPSocialLinks]
N -- found --> O[Append .star-count span]
N -- not found --> P[MutationObserver watches .VPNav]
P -- element appears --> O
M -- empty --> Q[Observer watches but returns false immediately]
O --> R[observer.disconnect]
S[onUnmounted] --> T[observer?.disconnect]
end
Reviews (2): Last reviewed commit: "docs(site): address release nav feedback" | Re-trigger Greptile |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 7235569. Configure here.
| observer = new MutationObserver(() => { | ||
| if (addStarCount()) observer?.disconnect() | ||
| }) | ||
| observer.observe(document.querySelector('.VPNav') || document.body, { childList: true, subtree: true }) |
There was a problem hiding this comment.
MutationObserver runs forever when stars data is empty
Low Severity
When starsData.stars is "" (the common case when no GITHUB_TOKEN or UPDATE_GITHUB_STARS env var is set during build), addStarCount() returns false immediately. The if (addStarCount()) return check at the outer level then falls through and creates a MutationObserver that can never disconnect — because every subsequent call to addStarCount() also returns false. This leaves a subtree observer permanently attached to .VPNav or document.body, firing its callback on every DOM mutation to no effect.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 7235569. Configure here.
### 🐛 Bug Fixes - **(builtins)** silence pklr deprecation warnings on Builtins.pkl load by [@jdx](https://github.com/jdx) in [#880](#880) - **(ci)** serialize docs lint step by [@jdx](https://github.com/jdx) in [#874](#874) - **(config)** include main pkl path in cache fresh files by [@jdx](https://github.com/jdx) in [#879](#879) - **(docs)** stack banner message and link on mobile by [@jdx](https://github.com/jdx) in [#865](#865) - **(docs)** pin banner close button to top-right corner on mobile by [@jdx](https://github.com/jdx) in [#867](#867) ### 📚 Documentation - **(site)** show release version and github stars by [@jdx](https://github.com/jdx) in [#872](#872) ### 🔍 Other Changes - add pr-closer workflow by [@jdx](https://github.com/jdx) in [#876](#876) ### 📦️ Dependency Updates - bump communique 1.0.3 → 1.0.4 by [@jdx](https://github.com/jdx) in [#868](#868) - update anthropics/claude-code-action digest to 2da6cfa by [@renovate[bot]](https://github.com/renovate[bot]) in [#869](#869) - update anthropics/claude-code-action digest to 567fe95 by [@renovate[bot]](https://github.com/renovate[bot]) in [#870](#870) - bump communique to 1.1.2 by [@jdx](https://github.com/jdx) in [#875](#875) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > <sup>[Cursor Bugbot](https://cursor.com/bugbot) is generating a summary for commit 62ff432. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: mise-en-dev <[email protected]>


Summary
Cargo.tomland show it as the releases nav itemValidation
npm run docs:buildin/home/jdx/src/hk-release-version/docsNote: local git hooks were skipped for commit/push because the fresh worktree hook config could not evaluate
pkl/Builtins.pkl; the targeted docs build passed.This PR was generated by Codex.
Note
Low Risk
Low risk docs-only changes, but adds build-time parsing of
Cargo.tomland an optional GitHub API call that could affect docs builds if environment/network assumptions change.Overview
Updates the VitePress docs nav to show the current release label (e.g.
vX.Y.Z) by parsingCargo.tomlat build time, replacing the static “Releases” text.Adds an optional GitHub star counter:
stars.data.tscan fetchstargazers_countfrom the GitHub API (gated by env vars/tokens and tolerant of offline/rate limits), and the theme injects/stylizes a.star-countbadge onto the GitHub social link using aMutationObserverfor late-rendered DOM.Reviewed by Cursor Bugbot for commit 7235569. Bugbot is set up for automated code reviews on this repo. Configure here.