19 Commits
Author SHA1 Message Date
Brandon Thomas 0022e899bc Merge pull request #6 from storytold/bt-typescript
Port the UI to TypeScript and ban raw JavaScript
2026-10-12 23:56:20 -04:00
Brandon ThomasandClaude Opus 5.5 e621098b09 Port the UI to TypeScript and ban raw JavaScript
All UI code moves to strict TypeScript in ui/src/, compiled by tsc (no
bundler) to ui/build/, which index.html loads; the app's build.rs runs the
compile so every cargo build ships the current UI. Sources import each
other as ./x.ts so node --test runs them directly, and the data types
mirror crates/craft-core/src/model.rs.

app.ts now exports start(api) and main.ts wires it to Tauri or the browser
preview, so the UI can be tested in happy-dom against a fake host: sorting,
dragging, clicks, the window picker, status, the urgent view and shortcuts.
Sort toggling and drop placement move into model.ts with unit tests. The
inline error-reporting script becomes report.ts.

CLAUDE.md records the rule: no .js/.mjs/.cjs/.jsx files, inline scripts,
inline handlers or javascript: URLs. ui/src/repo.test.ts enforces it in
make test; make check adds a tsc type-check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 23:56:15 -04:00
Brandon Thomas 95cd695017 Merge pull request #5 from storytold/bt-drag-reorder
Drag repo rows into a manual order
2026-10-12 23:45:42 -04:00
Brandon ThomasandClaude Opus 5.5 e1d5939490 Drag repo rows into a manual order
Rows can be dragged into any order at any time, so higher-priority repos
can sit on top. Dropping saves the order on screen and switches the table
to it, clearing the sort column; clicking a column header sorts again and
keeps the manual order for the next drag. Repos added to the config later
go at the bottom of a manual list.

Dragging uses pointer events, not HTML5 drag and drop, which the webview's
file-drop handling can swallow. A press only becomes a drag after moving a
few pixels, so clicking a row still opens its urgent issues, and the table
doesn't re-render mid-drag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 23:45:03 -04:00
Brandon Thomas 7cfc870255 Merge pull request #4 from storytold/bt-incremental-cache
Pace GraphQL requests and cache raw GitHub activity
2026-10-11 17:41:45 -04:00
Brandon ThomasandClaude Opus 5.5 b204c6ecce Cache raw GitHub activity on disk and fetch only what's new
Walking a week of commit authors, PRs and issues was ~80% of each poll's
GitHub time. Keep them per repo in ~/Library/Caches/craft-status/raw/,
keyed by commit oid and PR/issue number, and fetch only from just before
the previous fetch; refetch from scratch every six hours. Three busy repos
go from 111 s to 28 s with identical counts. The snapshot (the rendered
view) is now saved after each repo, not only at the end of a poll.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:09:42 -04:00
Brandon ThomasandClaude Opus 5.5 1def58fcf3 Fetch one repo at a time and pace GraphQL requests
Polls still hit a secondary rate limit about a minute in: GitHub allows
60 s of GraphQL server time per minute, and two workers firing heavy
queries back to back exceed it. Fetch serially and, after each GraphQL
request, wait as long as it took. A full poll of 15 repos now takes ~4
minutes with no rate limiting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 16:48:37 -04:00
Brandon Thomas 632c6367bc Merge pull request #3 from storytold/bt-poll-without-search
Stop tripping GitHub's rate limits; keep the window dropdown alive
2026-10-11 16:36:32 -04:00
Brandon ThomasandClaude Opus 5.5 4250329aa6 Fix blank window: windowPicker must return its select
The previous commit dropped the return along with the value assignment,
so every render threw before drawing anything.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 16:36:01 -04:00
Brandon ThomasandClaude Opus 5.5 05704ff7c9 Stop tripping GitHub's rate limits; keep the window dropdown alive
Each poll ran 24 GraphQL searches per repo (~360 per poll), which trips
GitHub's search secondary rate limit even with plenty of hourly budget
left. Per-window PR/issue counts now come from walking recent PRs and
issues newest first and bucketing them locally; no search at all.

A rate-limited repo now halts the rest of the poll, the error reports
GitHub's retry-after time, and two repos are fetched at a time, not four.

The UI rebuilt the window dropdown on every render (every 15 s and per
repo during a poll), which could close it mid-choice. The group header
row is now built once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 16:30:29 -04:00
Brandon Thomas 0d4aad04f6 Merge pull request #2 from storytold/bt-add-launcher-figcraft
Poll craft-launcher and figcraft; show inaccessible repos as empty rows
2026-10-10 12:50:24 -04:00
Brandon ThomasandClaude Opus 5.5 daebcb02fb Poll craft-launcher and figcraft; show inaccessible repos as empty rows
Add storytold/craft-launcher and storytold/figcraft to the default repo list
and config template.

GitHub answers 404 / NOT_FOUND for private repos the token can't see. Treat
that as a successful poll with no data: the row renders blank (with a
"Not accessible" tooltip) instead of as an error, and doesn't count toward
the failed-repos banner or retry backoff.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 12:49:22 -04:00
Brandon Thomas 47aabd6635 Merge pull request #1 from storytold/bt-since-release
since release
2026-10-09 19:23:31 -04:00
Brandon Thomas c6ff0a72ed since release 2026-10-09 19:22:40 -04:00
Brandon ThomasandClaude Opus 5.5 16c8aa9b68 update screenshot
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:30:16 -04:00
Brandon Thomas f714ef390b update the summary statistics 2026-10-09 13:28:27 -04:00
Brandon Thomas f8ee91bce3 readme update 2026-10-09 09:27:42 -04:00
Brandon Thomas f2fe44aa11 update ux 2026-10-09 08:23:19 -04:00
Brandon Thomas 5780653c25 tracking app 2026-10-08 22:49:44 -04:00