<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>stafford williams</title>
    <description>software by Stafford Williams</description>
    <link>https://staffordwilliams.com/</link>
    <atom:link href="https://staffordwilliams.com/devlog/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 06 Apr 2026 02:05:07 GMT</pubDate>
    <lastBuildDate>Mon, 06 Apr 2026 02:05:07 GMT</lastBuildDate>
    <generator>Astro</generator>
      <item>
        <title>Error logging and argument handling fixes</title>
        <description>I added error logging to a file and a GUI error dialog so that when something goes wrong in the launcher, there&apos;s both a persistent log and a visible notification rather than a silent failure.

I also fixed two command execution bugs: commands were being launched through `wt.exe` (Windows Terminal) when they should have gone through `cmd`, and the GUI launcher was dropping user-supplied arguments when opening URL commands. Both are now working correctly.</description>
        <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
        <link>https://staffordwilliams.com/devlog/project-switch/v0.15.2/</link>
        <guid isPermaLink="true">https://staffordwilliams.com/devlog/project-switch/v0.15.2/</guid>
        <category>project-switch</category>
        <category>rust</category>
        <category>logging</category>
      </item>
      <item>
        <title>Monitor positioning and selection fix</title>
        <description>I fixed the launcher window appearing on the wrong monitor — it now reads monitor configuration and positions itself on the correct display. The hotkey config gained a monitor selection option so multi-monitor setups work predictably.

I also fixed a frustrating bug where pressing Enter always opened the first item in the list regardless of arrow-key selection. The selected item now correctly responds to keyboard navigation.</description>
        <pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate>
        <link>https://staffordwilliams.com/devlog/project-switch/v0.15.1/</link>
        <guid isPermaLink="true">https://staffordwilliams.com/devlog/project-switch/v0.15.1/</guid>
        <category>project-switch</category>
        <category>rust</category>
        <category>egui</category>
      </item>
      <item>
        <title>History tracking and recent actions</title>
        <description>I added a history system to `project-switch` that records executed actions, calculator expressions, and file path navigations. When opening the launcher, recently used items now appear at the top of the list so frequently accessed projects and commands are just a keystroke away.

I also fixed the half-second delay between pressing the hotkey and the GUI list appearing — the hotkey listener now communicates with the GUI process more directly. Calculator mode got an improvement too: incomplete expressions like `=5+` no longer show an error, they just display nothing until the expression is valid.</description>
        <pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate>
        <link>https://staffordwilliams.com/devlog/project-switch/v0.15/</link>
        <guid isPermaLink="true">https://staffordwilliams.com/devlog/project-switch/v0.15/</guid>
        <category>project-switch</category>
        <category>rust</category>
        <category>egui</category>
      </item>
      <item>
        <title>Permission system overhaul and backlog item linking</title>
        <description>I overhauled the permission system today. The old monolithic `cli-reads` permission group got split into separate `reads` and `writes` categories, and I added deny rules via `cli-hook deny` commands so specific patterns can be blocked. Allow and deny rules now merge across tools (Claude Code and any other configured tool), and I fixed a couple of edge cases — normalizing the `./` prefix in allow matchers and supporting entries without the `:*` suffix.

Backlog items can now be linked to each other, which is useful for tracking related work and dependencies. I also added `--dir` to backlog commands for operating on backlogs in other directories, and backlog comments now get inlined directly into phase prompts so Claude Code has full context when executing a phase. The `draft` and `bug` modes gained edit mode support, and I added a global config option for `sync` auto-confirm so it stops prompting on every sync.

On the `seq` command, I added a `--from` option for filtering by time range and switched historical queries to use `/api/data` instead of the events endpoint. I also replaced the `--json` stdin approach with a `--file` flag for passing structured input, which is cleaner and avoids control character issues.</description>
        <pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate>
        <link>https://staffordwilliams.com/devlog/assist/v0.169/</link>
        <guid isPermaLink="true">https://staffordwilliams.com/devlog/assist/v0.169/</guid>
        <category>assist</category>
        <category>claude-code</category>
        <category>cli</category>
      </item>
      <item>
        <title>Backlog workflow polish and CLI aliases</title>
        <description>I spent today polishing the backlog workflow to make it smoother for continuous use. The headline feature is `backlog next` now loops automatically when items remain, so I can kick off a session and let it chew through multiple backlog items without manual re-invocation. I also added `draft` and `bug` launch modes with `/next` chaining, so after filing a bug or drafting an item the session chains straight into the next piece of work.

Backlog items now support comments and summaries — comments can be added during execution and summaries are saved when an item is marked done, giving better traceability on what was decided and why. Items also auto-commit after `backlog add`, removing the manual step.

I added a `backlog show` command for viewing item details, and a few convenience aliases: `ls` for `backlog list` and `a` as a top-level CLI alias for `assist`. A couple of fixes improved reliability — graceful exit on Ctrl-C during prompts instead of crashing, and fixing summary persistence so it saves on done rather than phase-done.</description>
        <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
        <link>https://staffordwilliams.com/devlog/assist/v0.158/</link>
        <guid isPermaLink="true">https://staffordwilliams.com/devlog/assist/v0.158/</guid>
        <category>assist</category>
        <category>cli</category>
        <category>agent-orchestration</category>
      </item>
      <item>
        <title>Reliable focus stealing on hotkey</title>
        <description>I fixed the launcher window not reliably getting focus when activated via the hotkey on Windows. The window state machine now handles focus requests more aggressively to ensure the input field is ready for typing immediately after the hotkey press.

Also tidied up the build script to clean individual binary files rather than entire directories, avoiding accidental deletion of other build artefacts.</description>
        <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
        <link>https://staffordwilliams.com/devlog/project-switch/v0.14.2/</link>
        <guid isPermaLink="true">https://staffordwilliams.com/devlog/project-switch/v0.14.2/</guid>
        <category>project-switch</category>
        <category>rust</category>
        <category>windows</category>
      </item>
      <item>
        <title>Backlog orchestration and test coverage push</title>
        <description>I built out the backlog orchestration system today — the big addition is phased execution, where backlog items now progress through tracked phases with automatic advancement. Each phase can include manual checks, and sessions auto-kill on phase completion so Claude Code doesn&apos;t wander off-task. A review phase is auto-generated for each item, and items are automatically marked done when their plan completes. I also added a `/draft` command for creating new backlog items with LLM-assisted questioning.

On the refactoring side, I added `assist refactor extract` for pulling functions and their private dependencies into new files. Getting the import rewriting right took a few iterations — fixing stale import cleanup, rewriting paths in the destination file, and skipping barrel exports for non-public functions.

I pushed test coverage from roughly nothing to 17.31%, converting existing tests to BDD style (`describe`/`it` blocks) and adding new coverage for `splitCompound`, `collectDependencies`, `resolveImports`, and the backlog run completion logic. I also added `test-cover` and `test-review` slash commands so Claude Code can incrementally improve coverage during sessions.

The backlog web view got plan progress display, and the CLI picked up several UX improvements: a `show` command, numbered acceptance criteria, type display in the `next` list, comments and summaries on items, a `-w`/`--write` flag for `backlog run`/`next`, and aliases like `next` for `backlog next -w` and `remove` for `backlog delete`. I also added a `/bug` command for filing bugs with structured reproduction steps and a `coverage` command for reporting test coverage metrics.</description>
        <pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate>
        <link>https://staffordwilliams.com/devlog/assist/v0.150/</link>
        <guid isPermaLink="true">https://staffordwilliams.com/devlog/assist/v0.150/</guid>
        <category>assist</category>
        <category>agent-orchestration</category>
        <category>testing</category>
        <category>cli</category>
      </item>
      <item>
        <title>macOS support and focus handling</title>
        <description>I spent the day getting the new native UI working on macOS. The hotkey service now launches the GUI directly on macOS instead of going through a terminal intermediary, and I configured both the hotkey and GUI processes to hide their Dock icons so they run as background-only apps.

I also fixed the window hiding on focus loss — it was crashing in certain edge cases, so I added a safer approach. On the Windows side, I fixed URL opening from the UI when there&apos;s no exact match in the project list, so typed-in URLs now open correctly in the browser.</description>
        <pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate>
        <link>https://staffordwilliams.com/devlog/project-switch/v0.14.1/</link>
        <guid isPermaLink="true">https://staffordwilliams.com/devlog/project-switch/v0.14.1/</guid>
        <category>project-switch</category>
        <category>rust</category>
        <category>macos</category>
      </item>
      <item>
        <title>Native UI launcher with egui</title>
        <description>Big day — I built out the native GUI launcher for `project-switch` using `egui`/`eframe`. The work was orchestrated through Conductor across three phases.

Phase 1 evaluated UI frameworks (settling on `egui` over `iced`), defined the merged binary crate structure, and extracted a shared data model from the existing `list` command into a reusable launcher module. I also wrote state machine tests for the window lifecycle.

Phase 2 implemented the actual launcher window — a filterable list of project commands that pops up on hotkey press. I added a calculator mode (prefix input with `=`), file path browsing with directory navigation, and action execution for opening URLs, running commands, and launching apps.

Phase 3 polished the rough edges: fixing path entry behaviour, showing both &quot;open&quot; and &quot;browse&quot; options for directories, deduplicating path input, launching terminal commands through `wt.exe`, and tweaking the app colour scheme. Finally, I merged the hotkey daemon into the main binary so there&apos;s now a single `project-switch` executable that handles both the CLI and the background hotkey service with system tray icon.</description>
        <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
        <link>https://staffordwilliams.com/devlog/project-switch/v0.14/</link>
        <guid isPermaLink="true">https://staffordwilliams.com/devlog/project-switch/v0.14/</guid>
        <category>project-switch</category>
        <category>rust</category>
        <category>windows</category>
        <category>egui</category>
      </item>
      <item>
        <title>Window screenshot capture command</title>
        <description>Added an `assist screenshot` command that captures a screenshot of a running application window. You pass it a process name like `assist screenshot notepad` and it grabs the visible window bounds using the DWM extended frame bounds API (which excludes the invisible shadow padding Windows adds), then BitBlts the region from the screen DC into a PNG.

The heavy lifting is in a PowerShell script that gets written to a temp file and executed with `-NoProfile -ExecutionPolicy Bypass`. It handles DPI awareness, restoring minimised windows, and all the GDI cleanup. The output directory defaults to `./screenshots` but is configurable via `screenshot.outputDir` in the assist config.

I also added a `/screenshot` slash command so Claude Code can capture windows during debugging sessions — useful for visual verification of UI changes without leaving the conversation.</description>
        <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
        <link>https://staffordwilliams.com/devlog/assist/v0.134/</link>
        <guid isPermaLink="true">https://staffordwilliams.com/devlog/assist/v0.134/</guid>
        <category>assist</category>
        <category>claude-code</category>
        <category>powershell</category>
      </item>
  </channel>
</rss>
