feat: promotion polish — docs UX, CLI hyperlinks, completions auto-install#90
feat: promotion polish — docs UX, CLI hyperlinks, completions auto-install#90
Conversation
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
f59515e to
80350b7
Compare
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
…stall ## Docs / VitePress - ComparisonTable: add per-row descriptions, target=_blank links, bump font sizes, fix hover contrast (text stays readable on violet bg) - VersionBadge: bump badge font-size 13→15 px - InstallSection: subtitle and step-label font-size 15→16 px - ProductionCta: body text 15→16 px, replace ↗ emoji with inline SVG arrow (iOS Safari fix), switch button to inline-flex - TestimonialsSection: fix hover border/shadow, replace arrow emoji with SVG, fix cta-btn hover contrast (force color:#fff) - RichFooter: replace ↗ emoji with SVG arrow on fulll.fr link ## CLI / core - help colorizer: colorize all bare https:// URLs in any description line (not only Docs: prefix) - upgrade output: render all post-upgrade URLs in cyan underline via upgradeLink() helper - refreshCompletions: always create completion file (install + refresh), not only overwrite existing ones - output.ts: replay command summary now links to https://fulll.github.io/github-code-search/ ## Tests - output.test.ts: update summary assertion to match new link text - upgrade.test.ts: update refreshCompletions tests to reflect 'always install' behaviour
80350b7 to
851e4d8
Compare
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Pull request overview
This PR polishes promotion-readiness across the VitePress marketing/docs UI and the CLI UX by improving link presentation (help/upgrade), updating completion refresh behavior, and refining several docs theme components.
Changes:
- CLI: colorize hyperlinks more broadly in
--help, and render upgrade-related URLs as TTY-friendly cyan/underlined links. - CLI: change
refreshCompletions()to always install/write completion files (not only refresh existing ones) and update tests/output accordingly. - Docs theme: multiple UX tweaks (font sizes, hover styles) and replace arrow/↗ glyphs with inline SVG icons.
Reviewed changes
Copilot reviewed 12 out of 12 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
src/upgrade.ts |
Adds upgradeLink() for TTY hyperlink styling; changes refreshCompletions() to install/write even when missing. |
src/upgrade.test.ts |
Updates tests for the “always install completions” behavior and debug messages. |
src/output.ts |
Updates replay <summary> text to include a homepage reference. |
src/output.test.ts |
Updates assertions to match the new replay <summary> text. |
github-code-search.ts |
Expands URL colorization in help descriptions; tweaks completions status message wording. |
docs/.vitepress/theme/VersionBadge.vue |
Increases badge font size. |
docs/.vitepress/theme/TestimonialsSection.vue |
Replaces arrow text with SVG; improves hover styling and button layout. |
docs/.vitepress/theme/RichFooter.vue |
Replaces ↗ with SVG icon in an external link. |
docs/.vitepress/theme/ProductionCta.vue |
Replaces ↗ with SVG icon; adjusts CTA font size and button layout. |
docs/.vitepress/theme/InstallSection.vue |
Slightly increases subtitle/step label font sizes. |
docs/.vitepress/theme/ComparisonTable.vue |
Adds per-row descriptions and documentation links; adjusts typography/hover styles and adds external-link icon. |
.vscode/settings.json |
Adds a VS Code workspace setting to auto-approve a terminal command pattern. |
- Add ARIA tabs pattern (roving tabindex, keyboard nav) to UseCaseTabs - Add table semantics (caption, scope, aria-label) to ComparisonTable - Fix heading hierarchy and landmarks in InstallSection, ProductionCta, TestimonialsSection, HowItWorks - Fix contrast failures: .ct-feature-desc, .ct-tool-alt, .ts-role → text-1/2; .ts-avatar #CC88FF → #8833cc; .td-ps #9933ff → #aa55ff - Switch Shiki light theme to github-light-high-contrast (fixes #D73A49, #6A737D, #22863A tokens below 4.5:1); add CSS fallback overrides - aria-hidden="true" on decorative TerminalDemo - Add .sr-only utility and global :focus-visible ring to custom.css - Fix hero alt="" (decorative image) in docs/index.md - Add .github/workflows/a11y.yml (pa11y-ci, WCAG2AA, sitemap-driven) - Add .pa11yci.json with WCAG2AA config and F77 ignore (Mermaid SVG ids) - Add docs:a11y and docs:build:a11y scripts (VITEPRESS_HOSTNAME override so sitemap.xml uses localhost URLs during CI audit) - Split mermaid+d3 into dedicated Rollup chunk; raise chunkSizeWarningLimit to 2500 kB to silence legitimate Mermaid size warning - Increase HowItWorks step description font-size 14px → 15px
…Table 2-col - custom.css: hide VPNavBarMenu/Extra and show hamburger below 960px; unlock VPNavScreen at 768-960px so the mobile menu actually opens; overflow-x guard on VPHome / pre blocks - ComparisonTable.vue: keep both tool columns at all viewports; abbreviated headers (ct-name-short) on ≤640px; remove 480px column-hiding rule - InstallSection.vue / UseCaseTabs.vue: overflow-x fixes for mobile - ProductionCta.vue: add aria-label on external CTA link; remove duplicate .cta-btn:focus-visible rule - config.mts: remove redundant dynamic import of fileURLToPath (already imported at top)
- scripts/responsive.pw.ts: 4 viewports × 5 pages = 20 tests; overflow detection skips fixed/sticky ancestors and hidden elements; saves screenshot on failure under test-results/screenshots/ - playwright.config.ts: fullyParallel, 4 workers (2 CI), domcontentloaded, 15s timeout → ~24s total for the full suite - package.json: add docs:test:responsive and docs:a11y scripts; VITEPRESS_BASE variable for pa11y-ci; @playwright/test devDependency - knip.json: exclude scripts/responsive.pw.ts from knip analysis - .gitignore: ignore test-results/ and playwright-report/
- responsive.yaml: new workflow running Playwright responsive tests on push/PR; builds VitePress, serves preview, runs bun docs:test:responsive - a11y.yml: fix corrupted setup-bun action pin comment (# v2.1.3) - ci.yaml: same comment fix - cd.yaml: same comment fix - docs.yml: same comment fix (2 occurrences)
…ctions - .github/skills/documentation.md: VitePress theme map, CSS vars, WCAG 2.1 AA patterns, responsive breakpoints, VitePress 768px quirks, validation checklist - .github/skills/feature.md: layer map, type-first design, CLI conventions, render sub-module extension playbook, test patterns - .github/skills/bug-fixing.md: extended symptom→module table, test-first patterns, minimal fix principles - .github/skills/refactoring.md: architectural invariants, safe rename playbook, module extraction pattern, knip interpretation guide - .github/skills/release.md: semver guide, CD pipeline, binary targets, blog post format, CHANGELOG rules, versioned docs snapshot mechanics - All 5 instruction files: add Skill reference header pointing to companion skill - CONTRIBUTING.md: add docs validation commands + AI agent tooling section
- UseCaseTabs.vue: fix tabRefs ref callback to write to tabRefs.value[i] so roving-tabindex focus logic works correctly (was writing to tabRefs[i], i.e. the ref wrapper, not the underlying array) - ComparisonTable.vue: add role="img" + aria-hidden on ✓/✗ symbols so AT announces 'Yes'/'No' reliably across AT/browser combos - config.mts: replace dead vitepress-plugin-mermaid pattern with the actual package vitepress-mermaid-renderer in manualChunks rule - responsive.pw.ts: fix header comment (domcontentloaded, not networkidle); derive PATHS from VITEPRESS_BASE env var so tests work on snapshot builds
Make VitePress docs fully WCAG 2.1 AA accessible
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
…in permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
…in permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
In Vue 3 SFC templates, ref<T> values are auto-unwrapped, so 'tabRefs' in the template already resolves to tabRefs.value (HTMLButtonElement[]). A previous commit incorrectly changed to tabRefs.value[i], which in the template context resolves to tabRefs.value.value[i] = undefined[i], causing: TypeError: Cannot set properties of undefined (setting '0'). Revert to indexing tabRefs directly (template auto-unwrap), with a null guard against the cleanup call Vue makes on unmount.
- workflows/a11y.yml, responsive.yaml: add permissions: contents: read (GitHub Advanced Security — GITHUB_TOKEN least-privilege) - .vscode/settings.json: remove chat.tools.terminal.autoApprove (security footgun — keep in local user settings only) - src/output.ts + output.test.ts: replace Markdown link syntax in <summary> with <a href> HTML (GFM does not render [text](url) inside HTML blocks) - ComparisonTable.vue: remove target=_blank / rel / ext-link SVG icon from internal doc links; also remove orphaned .ct-ext-icon CSS rules - scripts/responsive.pw.ts: only skip position:fixed in overflow detection; VitePress nav elements (.VPNav/.VPNavBar/.VPLocalNav/.VPFlyout) are now whitelisted by class instead of blanket-skipping all sticky elements — fixes potential false negatives for non-nav sticky content
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- Add composite action start-preview-server for reuse across jobs - Rename a11y.yml → a11y.yaml and responsive.yaml (consistency) - Add docs.yaml replacing the old monolithic docs.yml deployment - Pin all third-party actions to full SHA hashes - Update docs.yml to drop duplicate steps covered by new docs.yaml
- Add .lhci.config.cjs with collect/assert/upload settings (preset desktop, 2 runs, minScore 0.99 on all 4 categories) - Add lighthouse.yaml: lhci autorun → generate-lhci-report.ts → PR comment - Add scripts/generate-lhci-report.ts: concise summary table with links to uploaded HTML reports from links.json (lhci upload output) - Add @lhci/cli devDependency, docs:lhci npm script - Move pa11y-ci from bunx to proper devDependency, remove bunx - Ignore .lighthouseci/ in .gitignore, .lhci.config.cjs in knip
- Apply backdrop-filter glass effect to VitePress navbar via --vp-nav-bg-color CSS variable override on .VPNavBar - Fix inline code contrast in tables for WCAG AA compliance - Add aria-hidden on DocSearch button keys to fix label-content-name - Fix contrast issues in ComparisonTable, InstallSection, RichFooter, TerminalDemo, UseCaseTabs Vue components - Raise LHCI thresholds to ≥ 0.99 for all four Lighthouse categories - Update config.mts as needed for docs build
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
🔦 Lighthouse Report
|
- .td-body: add explicit color #e8e8f0 to override inherited dark VitePress text color on #0f0d1a background (was ~1.5:1, now n/a) - .td-hints spans: rgba(255,255,255,0.22) → 0.55 (2.5:1 → 6.1:1 ✓) - .td-replay-label: rgba(153,51,255,0.55) → #aa55ff (1.9:1 → 5.0:1 ✓) - .td-mark: rgba(153,51,255,0.65) → #aa55ff (2.3:1 → 5.0:1 ✓)
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Strip the hardcoded /github-code-search/ prefix from all docLink values and apply withBase() at render time so links remain correct in versioned snapshot builds (where VITEPRESS_BASE changes, e.g. /github-code-search/v2/). Addresses copilot review comment: #90 (comment)
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- Use withBase() from vitepress (properly recognized by template compiler) - Strip /github-code-search/ prefix from all docLink values so withBase() prepends the base exactly once at render time - Remove intermediate docHref() helper (was duplicating the base)
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Coverage after merging feat/promotion-polish into main will be
Coverage Report
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Motivation
Série d'améliorations mineures pour préparer la promotion de l'outil.
Docs / VitePress
ComparisonTable.vue--vp-c-text-3)target="_blank")VersionBadge.vueInstallSection.vue.is-subtitleet.is-step-label: 15→16 pxProductionCta.vue.cta-text: 15→16 px↗emoji (moche sur iOS Safari) par un SVG<path>inlineinline-flex(fix rendu SVG mobile)TestimonialsSection.vue→texte du bouton par SVGcolor: #fff !importantforcé pour éviter l'override VitePressRichFooter.vuefulll.fr ↗: remplacement emoji → SVGCLI / core
Colorisation des URLs dans
--helpcolorDesc()colorise désormais toutes les URLshttps://dans n'importe quelle ligne de description, pas seulement les lignesDocs:.URLs colorées dans
upgradeImport de
picocolorsdansupgrade.ts+ helperupgradeLink(): tous les liens du message post-upgrade (What's new, Release notes, Commit log, Report a bug) s'affichent en cyan souligné sur TTY.Completions auto-installées à l'upgrade
refreshCompletions()crée systématiquement le fichier s'il n'existe pas (install) et le rafraîchit sinon, au lieu de seulement écraser les fichiers existants.Replay command
<summary>mis à jour :Tests
output.test.ts: assertions mises à jour pour le nouveau texte du<summary>upgrade.test.ts: testsrefreshCompletionsadaptés au comportement "always install"Checklist
bun test— 526 pass, 0 failbun run lint— 0 errorsbun run format:check— no diffbun run knip— no unused exports