SebbaFlow

AI-augmented development workflow — grill, plan, build, reflect

github.com/SebasAren/SebbaFlow

10 stow packages 17 LSP servers 500+ tests 22 pi extensions

The Environment

Architecture & Conventions

The backbone of the entire setup — a unified set of conventions for Lua, Python, Shell, and TypeScript. GNU Stow manages symlinks so every tool config lives in the repo and reflects instantly.

Dig deeper

AGENTS.md

SebbaFlow — AI-augmented development environment, managed with GNU Stow. For human setup, see README.md.

How Stow Works

Files in tool-name/.config/tool/ symlink to ~/.config/tool/. Edit files in the repo — changes reflect immediately via symlinks.

stow nvim tmux bashrc    # install
stow -D nvim              # uninstall
stow -n nvim              # dry-run
stow */                    # install all

Structure

nvim/.config/nvim/         # Neovim            → nvim/README.md
bashrc/                    # Bash config        → bashrc/AGENTS.md
tmux/.config/tmux/         # Tmux (deprecated, kept for fallback)
ghostty/.config/ghostty/   # Ghostty (deprecated, kept for fallback)
kitty/.config/kitty/       # Kitty             → kitty/README.md
wt/.config/worktrunk/      # Worktrunk (deprecated, replaced by jj)
jj/.config/jj/             # jj (jujutsu) version control
pi/.pi/                    # Pi agent           → pi/.pi/README.md
homebrew/                  # brew-sync CLI      → homebrew/AGENTS.md
obsidian/                  # Wiki & issue tools  → obsidian/AGENTS.md
bluefin-bashrc/            # Bluefin base bashrc → bluefin-bashrc/AGENTS.md
usage-dashboard/           # Pi usage stats dashboard (pitchfork usage-dash)
mise.toml                  # Runtime versions
.mise/tasks/              # Mise tasks (lint, format, check, etc.)

Tool directories may have an AGENTS.md (path-scoped agent instructions) or a README.md (human-facing details with architecture context). Some have both.

Global Conventions

  • Edit in repo, never in symlink targets
  • Git: conventional commits (feat:, fix:, chore:), atomic changes
  • Secrets: never commit; use ~/.secrets.tpl with Proton Pass CLI
  • Code style (Lua, Python, Shell, TypeScript): see CONVENTIONS.md

Where to Look

TaskLocation
Neovim pluginnvim/.config/nvim/lua/plugins/
Neovim docsnvim/README.md
LSP server confignvim/.config/nvim/lsp/*.lua
Shell aliasesbashrc/.bashrc.d/alias
Shell secretsbashrc/.bashrc.d/secrets
Tmux configtmux/.config/tmux/tmux.conf (legacy)
Tmux docstmux/README.md (legacy)
Kitty configkitty/.config/kitty/kitty.conf
Kitty docskitty/README.md
Mise tasks.mise/tasks/
Ghostty configghostty/.config/ghostty/config.ghostty
Ghostty docsghostty/README.md
jj configjj/.config/jj/config.toml
Pre-commit checks.githooks/pre-commit runs mise run pre-commit (via core.hooksPath)
Usage dashboardusage-dashboard/pitchfork start usage-dashlocalhost:4813
Quality watcherspitchfork.toml — use /skill:pitchfork to check live status
Pi extensionspi/.pi/agent/extensions/ (see its AGENTS.md)
Pi extension docspi/.pi/README.md
explore tool (local codebase)Codebase reconnaissance — files, dependencies, architecture
librarian tool (external docs)Documentation research — web, library docs, personal wiki
Testspi/.pi/agent/extensions/**/*.test.ts, pi/.local/bin/tdd-plan.test.ts, pi/.local/bin/store-memory*.test.ts, obsidian/.local/lib/wiki-search/wiki-search.test.ts, obsidian/.local/lib/wiki-core/, obsidian/.local/lib/issue/
CI.github/workflows/test.yml
Homebrew packageshomebrew/Brewfile
brew-sync CLIhomebrew/.local/bin/brew-sync

Tasks (mise run)

TaskWhatWhen
mise run setupBootstrap all dependenciesFirst run, after clone
mise run pre-commitFormat + lint + typecheck + testBefore committing
mise run formatAuto-format all codeStandalone formatting
mise run format-checkVerify formatting (no changes)CI / pre-merge
mise run lintLint all code (no changes)Standalone linting
mise run typecheckTypeScript type checkStandalone check
mise run testRun all testsStandalone test
mise run checkFull verification (format-check + lint + typecheck + test)Pre-merge gate

Fine-grained tasks are also available: format-lua, format-python, format-ts, format-check-lua, format-check-python, format-check-ts, lint-lua, lint-shell, lint-python, lint-ts.

AI Agent (Pi)

Custom AI agent extensions including an explore subagent for codebase reconnaissance, a librarian for documentation research, and semantic search with Cohere reranking.

Dig deeper

Pi Agent Extensions

Custom extensions for the Pi AI coding assistant, written in TypeScript/Bun. Each extension is a self-contained module that registers tools, commands, and TUI renderers into the Pi session.

Extension Catalog

Subagent Extensions

These spawn a separate (cheaper/faster) model to handle reconnaissance, research, or knowledge capture — keeping the parent agent focused on the actual task.

ExtensionPurposeConfig
exploreCodebase reconnaissance with pre-search, file indexing, and semantic rerankingCHEAP_MODEL env var
librarianDocumentation research via Exa web search + Context7 library docs + personal wikiEXA_API_KEY, CONTEXT7_API_KEY
wiki-stashPersist conversation knowledge to Obsidian wiki without interrupting the session~/Documents/wiki/
cheap-clarifyCheap-model clarification subagent for ambiguous promptsCHEAP_MODEL env var

Editing & Safety

ExtensionPurpose
fuzzy-editTab-aware fuzzy fallback for the edit tool — handles indentation and whitespace mismatches
plan-modeRead-only mode toggleable via /plan, with execution via /plan-execute

Research & Documentation

ExtensionPurposeConfig
context7Up-to-date library documentation search and retrievalCONTEXT7_API_KEY
exa-searchWeb search and page content fetching via Exa APIEXA_API_KEY

Knowledge Management

ExtensionPurpose
wiki-searchHybrid BM25 + vector search with Cohere reranking over ~/Documents/wiki/
wiki-readScope-safe wiki page reader
wiki-lintStructural health checks: broken links, orphans, missing titles, stale files

Workflow & Session

ExtensionPurpose
todoTodo management (list/add/toggle/clear) with state persisted in session entries
tdd-treeTDD kickoff point labeling in the session tree for structured plan execution
cache-controlLLM cache hint injection for cost optimization
claude-rules.claude/rules/ parser with picomatch glob matching and path-scoped rule loading

Shared Library

PackagePurpose
sharedrunSubagent() runner with retry logic, loop detection, budget management, usage tracking; rendering utilities; test mocks

Explore Subagent — Deep Dive

The explore extension is the most sophisticated subagent in the suite. It performs intelligent codebase reconnaissance before the parent agent even starts reading files.

How It Works

User query  (e.g. "how does the worktree scope extension detect worktree boundaries?")

  ├─► Query Planner
  │     Decomposes natural language into structured intent:
  │     intent: arch | entities: [worktree, scope, extension] | scope hints | file patterns

  ├─► File Index  (LRU-cached per repo, max 5 repos)
  │     ├─ Enumerates files via `git ls-files` (fallback: `find`)
  │     ├─ Extracts symbols, imports, exports, JSDoc descriptions via Tree-sitter AST parsing
  │     ├─ Builds reverse import graph (importedBy)
  │     └─ Multi-signal heuristic scoring:
  │          path match (+2), symbol match (+4-8), entity match (+6-12),
  │          description-entity boost (+4), intent boost (+3-4),
  │          import proximity (+1-4), second-order proximity (+1)

  ├─► Semantic Reranker  (Cohere rerank-v4-fast via OpenRouter)
  │     ├─ Builds synthetic documents: path | description | exports | symbols
  │     │  (no raw file content → avoids import-noise contamination)
  │     └─ Tiers: Highly Relevant (≥60%) / Probably Relevant (≥30%) / Mentioned (≥10%)

  └─► Subagent  (read-only tools: read, grep, find, ls, bash)
        Runs on a cheaper model (configurable via CHEAP_MODEL).
        Structured output: Files Retrieved / Key Code / Summary.

Key Design Decisions

DecisionRationale
Synthetic documents for rerankingFirst 500 chars of source files are mostly imports. Building documents from path + description + exports + symbols gives the reranker clean semantic signal.
No snippet injectionFirst 50 lines of TS/JS files are almost always import blocks, biasing the subagent toward wrong initial guesses. The reranker-ordered tier list is sufficient signal.
5-second build cap with truncation warningLarge repos shouldn’t block the pipeline. The cap is surfaced in results so the subagent knows the index may be incomplete.
Real-time invalidation on editsWhen the parent agent edits a file, it’s dropped from the index so subsequent explores see fresh data.
LRU cache bounded at 5 reposLong sessions across many repos don’t leak memory.
Intent precedence: change > use > arch > define”How is X used?” queries get caller weighting (use), not entry-point boosting (arch).
Second-order proximityFiles two hops from top matches in the importedBy graph get a small boost, surfacing consumer-of-consumer files.
spawnSync with array args everywhereEliminates shell metacharacter bugs — no shell escaping needed.

Usage Patterns

# Parallel exploration (4 simultaneous queries)
explore(query="Neovim LSP configuration", directory="nvim/.config/nvim/lsp/")
explore(query="Shell secret resolution", directory="bashrc/.bashrc.d/")
explore(query="Shell secret resolution", directory="bashrc/.bashrc.d/")
explore(query="Git hook pipeline", directory="scripts/hooks/")

# Scout-then-deepen for large codebases
explore(query="authentication flow", thoroughness="quick")
# → discovers relevant files, then:
explore(query="authentication flow", thoroughness="thorough", files=["auth/handler.ts", "auth/middleware.ts"])

Librarian Subagent — Deep Dive

The librarian extension provides external documentation research by spawning a subagent with access to three distinct sources. It keeps raw search results out of the main agent’s context window — the subagent consumes them internally and returns only a synthesized answer.

How It Works

User query  (e.g. "how do I use TanStack Query's optimistic updates?")

  ├─► Web Search (Exa)
  │     Searches the web for relevant pages, documentation, and tutorials.
  │     Returns: search results with titles, URLs, and snippets.

  ├─► Library Docs (Context7)
  │     Queries curated library documentation for API references, examples,
  │     changelogs, and migration guides. Can target a specific library.
  │     Returns: structured documentation chunks.

  ├─► Personal Wiki (Obsidian)
  │     Searches and reads from ~/Documents/wiki/ for curated notes,
  │     past research, and personal knowledge artifacts.
  │     Returns: wiki page content.

  └─► Subagent  (tools: web_search, web_fetch, context7_search, context7_docs, wiki_search, wiki_read)
        Synthesizes findings from all three sources into a coherent answer.
        Configured with context-appropriate budgets (60 calls / 240s timeout).
        Structured output: Sources / Findings / Summary.

Source Selection

SourceWhen it’s usedExample queries
Web SearchGeneral web research, tutorials, blog posts”react server components best practices”
Library DocsSpecific API lookups, migration guides”next.js 14 config options”
Personal WikiKnown topics previously ingested”our team’s coding conventions”

Key Design Decisions

DecisionRationale
Subagent synthesizes, not parentRaw search results are verbose and context-heavy. The subagent consumes them and returns only the relevant synthesized answer.
noExtensions: true + explicit pathsExtensions like herdr-agent-state could leak idle-detection hooks into the subagent session. Librarian loads only its six required extensions explicitly.
Internal-only extensionsexa-search and context7 register their tools only when loaded by the librarian subagent, using PI_LIBRARIAN_LOAD env var gating. See Internal-Only Extensions docs.
Budget tailored to source mix60 max tool calls / 240s timeout — conservatively sized for chaining searches across multiple sources.

Usage Patterns

# Parallel research across different libraries
librarian(query="Lucide icon sizing and customization")
librarian(query="Tailwind CSS v4 container queries")
librarian(query="Framer Motion page transitions")

# Targeted library lookup
librarian(query="useCallback vs useMemo", library="react")

# Focused search
librarian(query="TanStack Query optimistic updates", focus="examples")
librarian(query="Next.js 15 upgrade guide", focus="changelog")

# Wiki-backed research (library: known, from wiki)
librarian(query="deployment pipeline", library="our-monorepo")

When to Use Which: explore vs librarian

ScenarioToolWhy
Find files, trace dependencies, understand local architectureexploreHas file index, syntax-aware reranking, reads local source.
Look up an API, library docs, or best practiceslibrarianHas web search, library docs, and wiki access.
Check if an existing implementation exists in the repoexploreSearches actual source files and symbols.
Research how to use a package or frameworklibrarianSearches docs, examples, and tutorials online.
Scout a large codebase before editingexploreScout-then-deepen pattern with thoroughness="quick".
Consult personal / previously ingested knowledgelibrarianHas wiki_search/wiki_read under the hood.
Need both local context and external docsbothCall explore + librarian in parallel for independent concerns.

Architecture

Shared Subagent Runner

All subagent-based extensions (explore, librarian, wiki-stash) use runSubagent() from @pi-ext/shared, which provides:

  • Retry logic: Same-model retries with exponential backoff, then fallback to a secondary model
  • Loop detection: Detects when the subagent repeats the same tool calls
  • Budget management: Configurable max tool calls and timeout
  • Usage tracking: Aggregates input/output tokens, cost, context tokens, and turns

Extension Lifecycle

Extension loads
  ├─ pi.registerTool()       → adds tool to agent's available tools
  ├─ pi.registerCommand()    → adds /command to TUI
  └─ pi.on("tool_call")      → subscribes to tool events (e.g. explore invalidation)

Development

cd pi/.pi/agent/extensions

# Typecheck all extensions
for dir in */; do [ -f "$dir/tsconfig.json" ] && npx tsc --noEmit -p "$dir/tsconfig.json"; done

# Run all tests
bun test --parallel

# Run specific extension tests
bun test --parallel explore/

Adding a New Extension

  1. Create directory with index.ts, package.json, tsconfig.json
  2. Write tests first (index.test.ts or integration.test.ts)
  3. Implement the extension
  4. Add to workspace package.json workspaces array
  5. Verify tests pass and types check

Personal Wiki

A persistent, compounding knowledge base with its own search engine. Raw sources go in immutable; an LLM incrementally builds, cross-references, and revises structured pages on every ingest. Under the hood: BM25 for keyword matching, 4096-dim vector embeddings for semantic queries, and Cohere reranking to surface the best results — all cached locally and rebuilt incrementally as the wiki changes.

Dig deeper

Obsidian

Stowed scripts for the personal wiki at ~/Documents/wiki/, based on Andrej Karpathy’s LLM wiki pattern.

What’s Here

PathDescription
.local/bin/wiki-searchHybrid BM25 + vector search CLI with Cohere reranking
.local/lib/wiki-search/Search engine implementation (BM25, embeddings, cache)
.local/bin/issueIssue tracker CLI (create, list, move, block, close)
.local/lib/issue/Issue tracker implementation
.local/lib/wiki-core/Shared frontmatter, I/O, and constants for wiki tools
Documents/wiki/templates/issue.mdTemplater template for creating issues from Obsidian
Documents/wiki/issues-dashboard.mdDataview dashboard for issue tracking

Three search modes:

  1. Hybrid (default) — BM25 keyword scoring + 4096-dim vector embeddings with configurable alpha blend
  2. BM25-only — Cached keyword search, no API key needed
  3. Semantic — Vector-only search for conceptual queries

All modes use cached indexes rebuilt incrementally when the wiki changes. Reranking via cohere/rerank-4-fast through OpenRouter.

Library

FilePurpose
cli.tsArgument parsing, cache management, mode routing
search.tshybridSearch(), ripgrep helpers, rerank()
bm25.tsBM25 ranking implementation
vector.tsCosine similarity, embedding API client
cache.tsIncremental index builds, staleness detection, manifest
text.tsMarkdown stripping, tokenization
constants.tsModel names, API URLs, tuning parameters

Issue Tracker

File-based issue tracker stored in ~/Documents/wiki/wiki/issues/. Issues are markdown files with YAML frontmatter (type, status, project, tags, created, blocked-by).

Entry Points

  • CLI: issue new <slug> --project <name>, issue list, issue move, issue block, issue close
  • Obsidian: Templater template creates issues via hotkey, Dataview dashboard renders status views

Views (Dataview)

The issues-dashboard.md provides: Backlog, In Progress, Done, Blocked, and By Project tables.

Stow

stow obsidian    # install
stow -D obsidian # uninstall

Neovim

A full-featured Neovim config with Lazy.nvim, 17 LSP servers, AI-assisted completion via Codestral, and integrated formatting/linting. The primary editor for all development work.

Dig deeper

Neovim Configuration

Lazy.nvim-based Neovim config with 15 LSP servers, AI-assisted completion, and extensive plugin suite.

Setup

stow nvim
nvim --headless "+Lazy! sync" +qa   # install plugins

LSP servers are managed by Mason (:Mason in Neovim). The config auto-installs servers on first use.

Plugin Ecosystem

Completion

blink.cmp with AI providers:

  • Codestral (Mistral) for code completion
  • Minuet-AI for extended context suggestions

LSP

15 servers managed via nvim-lspconfig + Mason. Per-server configs in lsp/*.lua. Key servers:

ServerLanguage
basedpyrightPython
lua_lsLua
eslintJavaScript / TypeScript
svelteSvelte
vue_lsVue

TypeScript/Vue is primarily handled by typescript-tools.nvim (configured in lua/plugins/lsp.lua), not a standalone lsp/*.lua server.

Formatting & Linting

  • conform.nvim — StyLua, prettierd, black+isort. Format on save.
  • nvim-lint — ruff, luacheck, hadolint.

Debugging

nvim-dap + nvim-dap-ui for JavaScript/TypeScript and Python.

AI Coding

CodeCompanion.nvim with Venice AI adapter.

Customization

Create nvim/.config/nvim/lua/custom-settings.lua (gitignored) for machine-specific settings. Loaded via pcall so it’s optional.

Directory Layout

nvim/.config/nvim/
├── lua/config/      # Core config (LSP, keymaps, diagnostics)
├── lua/plugins/     # Plugin specs (Lazy.nvim)
└── lsp/             # Per-server LSP configs

Kitty Terminal

GPU-accelerated terminal replacing tmux + Ghostty. Native multiplexing with tabs and splits, and first-class support for the Kitty Graphics Protocol — enabling pi inline images without passthrough hacks.

Dig deeper

Kitty Terminal

GPU-accelerated terminal emulator replacing tmux + Ghostty. Kitty provides native multiplexing (tabs/windows) and natively supports the Kitty Graphics Protocol, enabling pi inline images without tmux passthrough hacks.

Stow

cd ~/dotfiles
stow kitty

This symlinks:

  • kitty/.config/kitty/kitty.conf~/.config/kitty/kitty.conf
  • kitty/.config/xdg-terminals.list~/.config/xdg-terminals.list

Default terminal

Kitty is set as the GNOME default terminal (Ctrl+Alt+T). This is configured via:

  1. xdg-terminals.list — tells xdg-terminal-exec (freedesktop spec) which terminal to launch when apps request one
  2. gsettings — tells GNOME Shell which terminal to open on Ctrl+Alt+T

These are applied automatically by stowing and running:

gsettings set org.gnome.desktop.default-applications.terminal exec kitty
gsettings set org.gnome.desktop.default-applications.terminal exec-arg -

Architecture

Kitty replaces both terminal emulator and multiplexer:

tmux conceptkitty equivalent
Sessionkitty OS window
Window (tab)kitty tab
Pane (split)kitty window
tmux display-popupno native popup — use inline fzf or separate tab

Active pane indicator

When splits are open, the shared border is colored to show focus:

  • Active window border → #7aa2f7 (blue, matches url_color)
  • Inactive window border → #292e42 (dark, matches selection_background)

This replaces tmux’s status-line highlighting.

Keybindings

All tmux Alt+ bindings are migrated to kitty directly (no prefix key needed):

BindingAction
Alt+vSplit horizontally
Alt+sSplit vertically
Alt+nNew tab (with cwd)
Alt+h/j/k/lNavigate splits
Alt+1..9Switch tabs
Alt+zToggle zoom / stack layout
Alt+Shift+h/j/k/lResize split
Alt+rReload kitty.conf
Alt+Shift+qClose window
Alt+Shift+wClose tab
Alt+[Vi selection mode (kitty_grab kitten)
Ctrl+Shift+hScrollback in less
Alt+Shift+fHints kitten (quick keyboard text selection)

Pi Images

Kitty is natively detected by pi via KITTY_WINDOW_ID. Inline images via the read tool work without PI_TMUX_IMAGES or any passthrough configuration.

Remote Control

Enabled for scripting (kitty @ commands):

kitty @ new-tab --cwd /path --tab-title "branch-name"
kitty @ focus-window --match title:"branch-name"

The listen socket is at unix:/tmp/kitty-${USER}.

Theme

Tokyo Night (Storm), matching the previous tmux-tokyo-night + Ghostty Catppuccin Mocha setup.

Known Differences vs tmux

  • No session persistence: Closing the kitty window kills all tabs. Use nohup, systemd --user, or screen for long-running background processes.
  • No popup overlays: display-popup is tmux-only. Interactive pickers run inline or in a new tab.
  • Vi selection via kitten: Kitty has no built-in vi copy mode, but the third-party kitty_grab kitten provides lightweight vim-like keyboard selection (Alt+[). For browsing full scrollback, Ctrl+Shift+h opens less.
  • No tab swap: Kitty doesn’t have swap-window. Drag mouse or use remote-control script.

References

Installation

One command to link every tool into your home directory.


$ _
✔ nvim
✔ kitty
✔ bashrc
✔ wt
✔ pi
✔ obsidian
✔ homebrew
✔ bluefin-bashrc

The Agent Loop

Every feature starts the same way — not with code, but with questions. The pi agent runs a structured four-step loop that keeps the human in the driver's seat.

1

Grill

Adversarial interview — edge cases, trade-offs, dependencies. Questions surface unknowns before a line is written. Research happens here: wiki queries, documentation lookup, codebase reconnaissance via the explore subagent.

2

Plan

Design discussion crystallizes into a numbered plan with explicit acceptance criteria. Routed to tdd-plan for test-first implementation or plan-mode for exploratory work. The plan is an artifact, not a feeling.

3

Build

Implementation follows the plan step by step, red-green-refactor. The explore subagent maps unfamiliar code, traces dependencies, and validates assumptions throughout. Every build step is tracked against the plan.

4

Reflect

When implementation is done, a reflection pass captures gotchas and non-obvious findings as persistent rules. Every commit leaves the codebase smarter than it found it. Rules are machine-enforced, not wiki-lost.


$ _
Interviewing relentlessly...

  ✓ 23 questions resolved
  ✓ 4 open questions surfaced
  ✓ Routed to: tdd-plan

→ Alignment achieved. Planning begins.

The Git Loop

Underneath the agent loop runs a worktree-based git workflow that isolates every task in its own branch — safe, parallel, and merge-ready.

1

Branch

One worktree per feature. wt step create spins up an isolated directory with its own branch. No stash, no context-switch — just a clean slate for the agent.

2

Implement

The pi agent works inside the worktree, following the plan from the agent loop. Multiple worktrees can run parallel agent sessions — like a CI pipeline for AI tasks.

3

Review

The human reviews the worktree diff. The wt-review Neovim plugin provides a dedicated side-by-side diff view with a sidebar for quick file navigation — no context-switching required. If the diff passes, wt step merge brings it home. If not, the worktree is discarded — no cleanup, no stray branches.


$ _
┌─ Worktree Review ──────────────────────────┐
│  changes from feat/wt-review                │
│                                            │
│  Files:                                    │
│  ● lua/wt_review/init.lua        +186   -0 │
│  ○ lua/wt_review/render.lua      +142   -0 │
│  ○ lua/wt_review/navigation.lua  + 98   -0 │
│  ● tests/wt_review.test.lua      +210   -0 │
│                                            │
│  [Enter] open diff   [d] mark done         │
└────────────────────────────────────────────┘

Philosophy

Automation over repetition

Every tool in this setup earns its place. If something is done more than twice, it gets automated — from editor completion to AI-assisted code exploration. The development environment is treated as a product, not a config dump.

Conventions as code

Formatting rules, linting configs, and commit conventions are codified — not documented in a wiki nobody reads. StyLua, ruff, shellcheck, and prettier run on every save. Conventional commits run on every commit. The machine enforces consistency so humans can focus on decisions.

AI-augmented, human-directed

The Pi agent handles reconnaissance, documentation lookup, and test scaffolding — but the human designs the system. AI extends reach without diluting intent. The explore subagent can map an unfamiliar codebase in seconds; the librarian can synthesize API docs from multiple sources. The developer decides what to build with that information.

One repo, one mental model

GNU Stow turns a single Git repository into a complete, portable development environment. stow */ and everything is linked. stow -D and it's cleanly removed. No install scripts, no dotfile managers, no hidden state. The repo is the source of truth.

Recent Activity


$ _
bfd36f6 refactor(explore): simplify tool span result lookup
8e4eda4 fix(explore): end tool spans in tracing
e526629 feat(tracing): integrate OpenTelemetry tracing for explore subagent
9957608 chore(ci): add Lua linter and update lint-lua task
5988fa4 test(wt-review): update tests and fix diff rendering in wt_review plugin
840ce51 feat(wt-review): implement worktree diff review with sidebar and side-by-side diff
f5c9f87 feat(pi-image): add multimodal image editing with validation and OpenAI SDK
ebcea40 feat(kitty): add line selection mode to kitty_grab
e67ca4d chore(test): update test commands to use --parallel flag
98795d7 feat(pi-image): add image editing support with optional image_path parameter
3da4dfd docs(pi): add wt-review plan for worktree diff review plugin
db88eb2 Merge pull request #20: renovate/actions-cache-5.x

// p.s.

This environment evolves with every feature. Conventions are codified, tests are enforced on every push, and each commit leaves the codebase a little smarter than it found it. It’s designed to be forked, borrowed from, or improved upon.

Thanks for scrolling this far. The repo is open — pull requests welcome.