From 70157c5725c397e90872f2a54f0e39d96cf5b0b4 Mon Sep 17 00:00:00 2001 From: John Smith Date: Thu, 26 Feb 2026 22:31:59 +0000 Subject: [PATCH] feat: improve frontend search and document remaining backlog [skip ci] --- IMPROVEMENTS.md | 63 ++++++++ extract_packages.py | 10 +- index.html | 370 +++++++++++++++++++++++++++++++++++++------- 3 files changed, 375 insertions(+), 68 deletions(-) diff --git a/IMPROVEMENTS.md b/IMPROVEMENTS.md index 7907ca4..7d0d47d 100644 --- a/IMPROVEMENTS.md +++ b/IMPROVEMENTS.md @@ -6,6 +6,69 @@ It is intended as a starting point for new contributors or an LLM asked to find Each item notes which file(s) are affected, the effort involved, and whether the change is backend-only (Python / CI), frontend-only (index.html), or both. +## Branch Progress Update (2026-02-26) + +This section tracks what is already implemented on branch `codex/frontend-search-improvements` +so future contributors/LLMs can continue from the remaining items. + +### Completed In This Branch + +- `#1` Regex crash fix in `highlightMatch()` (escaped regex input) +- `#5` Minified JSON output in `extract_packages.py` (`separators=(",", ":")`) +- `#6` Ranked/weighted search scoring in frontend +- `#7` `shortDescription` fallback in result rendering +- `#8` Incremental result rendering with `Load more` paging +- `#9` URL search state support (`?q=`) + back/forward handling +- `#10` Homepage link + license badge shown in cards +- `#11` Click-to-filter for publisher and tags +- `#26` Removed unused `re` import and unused `is_english_manifest()` helper + +### Current Status By Item + +| # | Status on this branch | Notes / next step | +|---|---|---| +| 1 | Done | `highlightMatch()` now escapes regex tokens before `RegExp` creation. | +| 2 | Open | CI cache key still uses `${{ github.run_id }}` and misses cache reuse. | +| 3 | Open | Footer still has `YOUR_USERNAME/YOUR_REPO_NAME` placeholder URL. | +| 4 | Open | README still has duplicated summary/malformed opening heading block. | +| 5 | Done | `packages.json` output no longer pretty-printed. | +| 6 | Done | Weighted ranking added; exact/prefix/id/name matches now rank higher. | +| 7 | Done | Description fallback now uses `pkg.description || pkg.shortDescription`. | +| 8 | Done | Results render in pages of 25 with a `Load more` button. | +| 9 | Done | Search query is read/written from URL query string. | +| 10 | Done | Homepage and license are rendered in result cards. | +| 11 | Done | Publisher/tags are interactive filters feeding back into search. | +| 12 | Open | No compact/expandable details modal yet. | +| 13 | Open | No copy-command variants UI yet. | +| 14 | Open | No fuzzy/typo-tolerant search dependency integrated yet. | +| 15 | Open | No pre-built backend search index artifact yet. | +| 16 | Open | No inferred package categories generated/displayed yet. | +| 17 | Open | Template leftover config files still present. | +| 18 | Open | `license.txt` still has placeholder copyright holder. | +| 19 | Open | 404 redirect path is still hardcoded in workflow. | +| 20 | Open | Cached winget update still resets to `origin/master`. | +| 21 | Open | `force_pages_update.sh` still assumes return branch `master`. | +| 22 | Open | README license link/file mismatch still unresolved. | +| 23 | Open | README still describes stricter locale behavior than extractor implements. | +| 24 | Open | Version fallback logic still collapses non-PEP440 versions to `0.0.0`. | +| 25 | Open | `packages.json` tracking policy remains ambiguous. | +| 26 | Done | Dead code/import cleanup completed in extractor. | + +### Suggested Next Low-Risk Work (Recommended Order) + +1. `#3` Replace placeholder repository URL in footer (`index.html`). +2. `#4` Clean up duplicate README summary + malformed heading. +3. `#22` Fix README license link mismatch (`LICENSE` vs `license.txt`). +4. `#2` Improve CI cache key strategy (date-based key + restore keys). +5. `#20` Make cached winget reset use detected default branch. +6. `#19` Remove hardcoded 404 redirect repo path. +7. `#21` Make `force_pages_update.sh` restore original branch. + +### Workflow Safety Note For This Branch + +`github_workflows_build.yml` runs on push to `main`/`master`, on schedule, and via manual dispatch. +Pushing `codex/frontend-search-improvements` should not trigger that workflow automatically. + --- ## Bugs diff --git a/extract_packages.py b/extract_packages.py index d15bfde..784cc18 100644 --- a/extract_packages.py +++ b/extract_packages.py @@ -4,7 +4,6 @@ import json import datetime from packaging import version -import re class EnhancedJSONEncoder(json.JSONEncoder): def default(self, obj): @@ -20,11 +19,6 @@ def parse_version(ver_str): # Fallback for non-standard versions return version.parse("0.0.0") -def is_english_manifest(filepath): - """Check if manifest is English or default (no locale specified)""" - # Default manifests (no locale) or English manifests - return '.locale.' not in filepath or '.locale.en-US.' in filepath - def extract_package_info(manifest_dir): """Extract comprehensive package info from a manifest directory""" package_info = { @@ -164,7 +158,7 @@ def main(manifests_dir, out_path): "extracted_at": datetime.datetime.utcnow().isoformat(), "source": "microsoft/winget-pkgs" } - }, out, indent=2, ensure_ascii=False, cls=EnhancedJSONEncoder) + }, out, separators=(",", ":"), ensure_ascii=False, cls=EnhancedJSONEncoder) print(f"Output written to: {out_path}") @@ -172,4 +166,4 @@ def main(manifests_dir, out_path): if len(sys.argv) != 3: print("Usage: python extract_packages.py ") sys.exit(1) - main(sys.argv[1], sys.argv[2]) \ No newline at end of file + main(sys.argv[1], sys.argv[2]) diff --git a/index.html b/index.html index ac86490..4a383e6 100644 --- a/index.html +++ b/index.html @@ -154,6 +154,22 @@ border-radius: 12px; } + .pkg-badges { + display: flex; + gap: 6px; + align-items: center; + flex-wrap: wrap; + } + + .license-badge { + font-size: 0.8em; + color: var(--text-secondary); + background-color: var(--bg-primary); + border: 1px solid var(--border-color); + padding: 2px 8px; + border-radius: 12px; + } + .pkg-desc { color: var(--text-secondary); margin: 8px 0; @@ -181,6 +197,44 @@ margin-bottom: 4px; } + .tag-filter { + border: 1px solid var(--border-color); + cursor: pointer; + transition: all 0.2s; + } + + .tag-filter:hover { + color: var(--accent-color); + border-color: var(--accent-color); + } + + .meta-filter { + border: none; + background: none; + color: var(--accent-color); + font: inherit; + padding: 0; + cursor: pointer; + } + + .meta-filter:hover { + text-decoration: underline; + } + + .pkg-links { + margin-top: 8px; + font-size: 0.9em; + } + + .pkg-link { + color: var(--accent-color); + text-decoration: none; + } + + .pkg-link:hover { + text-decoration: underline; + } + .copy-section { display: flex; gap: 8px; @@ -257,6 +311,27 @@ margin-top: 4px; } + .load-more-wrap { + text-align: center; + margin: 16px 0; + } + + .load-more-btn { + padding: 8px 14px; + border: 1px solid var(--border-color); + border-radius: 8px; + background-color: var(--bg-secondary); + color: var(--text-primary); + cursor: pointer; + font-size: 0.9em; + transition: all 0.2s; + } + + .load-more-btn:hover { + border-color: var(--accent-color); + color: var(--accent-color); + } + @media (max-width: 600px) { body { padding: 12px; @@ -320,7 +395,13 @@

- \ No newline at end of file +