Skip to content

feat: add just watch for continuous clippy feedback - #9

Merged
srid merged 3 commits into
masterfrom
claude/lucid-kilby
Mar 20, 2026
Merged

feat: add just watch for continuous clippy feedback#9
srid merged 3 commits into
masterfrom
claude/lucid-kilby

Conversation

@srid

@srid srid commented Mar 20, 2026

Copy link
Copy Markdown
Member

Summary

Closes #5

  • Add just watch recipe: runs cargo watch -x 'clippy --workspace --all-targets' for continuous compilation/lint feedback across all crates
  • Update AGENTS.md: instruct Claude Code to run just watch in the background at the start of code-editing tasks, replacing the manual end-of-task clippy check
  • Add nix-rust skill documenting the cargo-watch workflow

Test plan

  • Run just watch, edit a .rs file with an error, verify it's caught automatically
  • Verify just --list shows the new watch recipe

srid added 2 commits March 20, 2026 16:29
Add cargo-watch recipe and nix-rust skill so Claude Code can run
clippy in the background during code-editing tasks for rapid feedback.
@srid
srid marked this pull request as ready for review March 20, 2026 20:32
@srid
srid merged commit eb204f3 into master Mar 20, 2026
5 checks passed
@srid
srid deleted the claude/lucid-kilby branch March 20, 2026 20:35
srid added a commit that referenced this pull request May 19, 2026
…te-aware

Two structural sweeps in one commit since they touch the same surface.

**`hostId` is now a concrete string on every persisted record.**
`SavedTerminal.hostId` and `RecentRepo.hostId` default to `"local"` via
Zod, so the codebase no longer has to mean two things by
`hostId === undefined` (legacy "field missing" vs "explicit local").
Schema ladder bumped to **1.23.0** with an additive migration that
backfills `recentRepos[].hostId = "local"` on read. New
`isLocalHostId()` helper centralizes the sentinel check so callers
don't compare strings inline. Test fixtures (`session.test.ts`,
`state.test.ts`, `dockModel.test.ts`, `terminalDisplay.test.ts`)
updated to carry the field.

`meta/agent.ts`, `meta/github.ts`, and the iframe-preview route now
resolve the host directly: `getHost(entry.meta.hostId)` instead of
`entry.meta.hostId ? getHost(entry.meta.hostId) : undefined`. Same
result for local + remote; one less branch each.

**Reviewer #9 — Worktrees executor-aware.** `worktreeCreate` /
`worktreeRemove` in `kolu-git/worktree.ts` rewritten without simple-git
or `fs.existsSync` — every IO routes through the executor (`exec` for
git invocations, `statMtimeMs` for existence probes, `readlink -f`
through `exec` for canonicalizing `git-common-dir`). The contract
schemas `WorktreeCreateInputSchema` / `WorktreeRemoveInputSchema` now
require `hostId`. Server router picks executor by host. Client
threads `hostId` from the worktree palette entry through
`handleCreateWorktree` and into `client.git.worktreeCreate`. Recent
repos are keyed by `{hostId, repoRoot}` — two hosts with the same
on-disk repo path are distinct entries, and the palette
disambiguates by showing the alias in the description.

`getRecentRepos` only filesystem-checks local entries — a remote
repo can't be sync-validated, and a transient SSH outage shouldn't
expire the MRU.
srid added a commit that referenced this pull request Jun 2, 2026
Paulg-method rewrite of the 14 panel-flagged passages. 11 applied
after an adversarial skeptic confirmed each cleared the reader's
stumble while preserving meaning, facts, the physics metaphors, and
voice. 4 of the 11 are the skeptic's own endorsed fix (the rewriter's
version was rejected and replaced).

Headline fixes:
- #1 "the invariant" now named ("the code's analogue of that
  frame-invariant interval") — was undefined-on-a-definite-article.
- #6 "structural review has." -> "has become that." — elliptical
  gapping after a negative had inverted the meaning.
- #4 lede "volatilities that got bound" -> "fast-moving and
  slow-moving parts coupled" — one reader had read "bound" as the
  opposite (good) meaning.
- #12 moved "space-like" off the observer onto the slice/reading.
- #3, #7, #8, #9, #10, #11, #14: see optimization log.

3 deliberate keeps (over-fix guard): #5 (the physics is fine as-is),
#13 (gloss would steal the next paragraph's reveal), #2 (deferred to
pass 2 — pass-1 rewrite contradicted the post's thesis).

Behaviour gate: `just website::build` PASS.
srid added a commit that referenced this pull request Jun 6, 2026
#7 chord-arbitration (Family B, candidate): who owns a chord when a PTY
tool stacks under the app (Ctrl+B/J); tested but hand-shifted.
#8 capability-gate (Family B, extract-now): probe→degrade→notify scattered
at 5+ sites; tryFeature seam.
#9 terminal-probes (Family B, extract-now·partly-built): read volatile
xterm/WebGL internals via null-safe thunks; harden the leaks.
srid added a commit that referenced this pull request Jun 7, 2026
- Sticky scroll-spy rail over the 7 guide sections (#quickstart…#faq) — the
  /welcome→home merge dropped the guide's TOC, leaving the long page with no
  way to orient. Dot rail (xl+), labels on hover/active, IntersectionObserver-
  free scroll-spy, hidden until a guide section is on screen.
- Dedup: drop #power's "Export & record" how-to — it restated features #8
  (transcript export) and #9 (recording) almost verbatim; the grid keeps them.
- Perf/LCP: preload the hero poster (the LCP element) with fetchpriority=high,
  ship the video preload="none", and start playback only once it scrolls into
  view, so the 2.6MB webm never races the poster. No <img> on the page to lazy.
srid added a commit that referenced this pull request Jul 17, 2026
…op dead export

Code-police pass (rules + fact-check) findings, actioned:
- fact-check: covers() stripped '/**' without keeping the slash, so a
  sibling path sharing the string prefix (docs/atlas/dist-staging) would
  false-match docs/atlas/dist/** — the drift pin could pass green on the
  exact silent-deploy-skip class it exists to catch. Slash-preserving
  prefix now.
- prefer-focused-library: pages.yml is parsed with the yaml package
  (astro's transitive dep, resolved through its require context) instead
  of a brittle regex over structured data.
- no-dead-code: astro-deps.mjs no longer exports requireFromAstro (no
  importer; internal only).
Skipped (re-litigates ratified decision #9): deduplicating the
createRequire dance + astroHighlight mirror across the two projects'
tests — the projects pin DIFFERENT astro/shiki versions in separate
lockfiles, so per-consumer copies resolving through each project's own
astro are correct; forcing them into one shared copy would couple
version-independent things and need another candidates/nix-copy dance
for test-only code.
srid added a commit that referenced this pull request Jul 28, 2026
…cet vocabulary

`OsfactsReading` stood for both `Snapshot` and `HostSnapshot`, so eleven of its
eighteen fields were structurally always-empty at every call site and the
parser accepted either grammar in either output. It splits along the split Rust
already has.

- lowy F3 ≡ hickey #6 — one type for two verbs; now `SnapshotReading` /
  `HostReading` with `parseSnapshotOutput` / `parseHostOutput`, each refusing
  the other's row tags loudly instead of returning a silently empty field.
  `HostReading.memory` can finally be named `memory`, matching the JSON face
- lowy F4 ≡ hickey #7 — `mem` meant process RSS and host RAM in one flat union;
  the verb split takes the facet unions with it
- lowy F5 ≡ hickey #9 — the flag→wire-name map is not mechanical (`procs` names
  `proc`; `ports` names three), so every consumer re-derived tool knowledge by
  hand; `snapshotFacetNames` exports it. It states fact, not policy: which
  named facet counts as blindness stays with the consumer
- lowy F8 — `processIdentity` put the daemon supervisor's identity-gate policy
  inside the explicitly policy-free client, with zero consumers (verified by
  grep) and shaped for the OSF8 consumer this PR deliberately parked. Deleted,
  with the sync spawn that existed only to serve it
- lowy F1 ≡ hickey #1 — `facets.test.ts` pins the three unions to
  `osfacts/facets.json`, out of `describeDaemon` so the fast local loop catches
  the drift too
- lowy F10 — the zero-value reading was written out twice with nothing
  requiring the copies to agree
- lowy F12 — `isTcpPort` is no longer exported; it is the parser's own guard

Raised by the lowy ∥ hickey lens review. Not pushed or merged.
srid added a commit that referenced this pull request Jul 28, 2026
`SCANNED_FACETS` was a third hand-kept facet list, typed `readonly string[]`,
restating in wire vocabulary what the same file already says in flag
vocabulary. A typo compiled, and silently converted a should-be-fatal blindness
into a tolerated one — the inverse of the sudo regression the file's own
docstring commemorates.

- lowy F5 ≡ hickey #9 — one `SCAN_ASK` is now both what is requested and, via
  the client's `snapshotFacetNames`, what the gates read. Typed, so a drifted
  facet name is a compile error, and the two vocabularies can no longer
  disagree
- lowy F5 — `scanned(facet: string)` was applied to both `U` and `E` rows,
  conflating two different closed vocabularies; they are separate typed checks
- lowy F12 — `classifyListeners` re-validated a port `parseSnapshotOutput` has
  already refused, so the second check was unreachable and the rule lived twice

`ports_uid` joins `ports_unclaimed` as tolerated: darwin now reports that it
cannot name a listener's owning uid, and treating that as blindness would black
out port detection on the whole platform.

Raised by the lowy ∥ hickey lens review. Not pushed or merged.
srid added a commit that referenced this pull request Aug 1, 2026
- hickey #3 — `openLazyDirs` carried three facts and two broke. A row that has
  no node right now (a search projection hid it) no longer retires the record,
  so a filter keystroke stops erasing the user's expansion; and a key the host
  no longer declares lazy is pruned, so an eye-toggle round trip reports afresh
  instead of showing an arbitrarily old cached level with no refetch path.
- lowy #2 — a `lazyEpoch` prop clears the record when the host's loaded levels
  stop describing this tree (a repo / host switch), the wrapper's half of the
  invalidation the host already performs on its children cache.
- lowy #6 — `onExpandLazyDirectory` may return a promise; on rejection the
  wrapper forgets the expansion, so a transient read failure no longer wedges
  the folder open-and-empty for the mount.
- hickey #7 — the `tree.subscribe` callback runs under `safeApply`, so a throw
  can't escape into Pierre's emit loop and take other subscribers with it.
- hickey #9 — "which directories should be open" is spelled once
  (`desiredExpandedPaths`) and used at both the constructor and `toOpen`.
- hickey #8 — `expandPaths`' JSDoc no longer asserts an invariant
  `openLazyDirs` has made false.

Raised by the lowy ∥ hickey lens review. Not pushed or merged.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add cargo watch workflow

1 participant