For developers new to submodules (notes/usability-plan.md, D32):
- x and X read "restore to pin" and "restore committed pins"
- problems only, filter and fetch are shown in the footer
- ? shows every key in titled columns, then a legend of the status
words, symbols and spine roles; esc closes it
- u reads "pull (fast-forward)" on the superproject
- the detail pane suggests f when the last fetch is old
- a hint above the footer until the first key
- the header says "staged", like the tree
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
X restores the selection to the committed pins without the staged or
committed question, and resets every restored repository's index to
HEAD, so staged pins below are dropped too. Dropped staged pins alone
don't make it ask; they are listed if something else is lost.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`u` moves the pin of the selection to the tip of its ref when the pin is
only behind it: a switch to that branch with exactly the tip the row
shows, nothing fetched; if the ref moved meanwhile, nothing happens. On
the superproject it fast-forwards the branch to its upstream and restores
the submodules (git pull --ff-only from the last fetch).
Switch now fast-forwards a local branch that is only behind the chosen
remote branch, unless another worktree has it checked out, and keeps a
checked-out branch that tracks it under another name. A branch with
commits of its own is still never moved.
Stage pin is dropped: switching to the branch already stages it. The
detail pane's palette wraps instead of cutting off keys. Add D29 and F59.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
b opens a centered popup with a search line and the local and remote
branches of the selection. Enter stages the branch tip as the pin of a
submodule, restores it (and everything below) to it, and puts HEAD on the
branch; a remote branch gets a local tracking branch unless one exists
elsewhere. Works on the superproject too. Losses are asked like restore.
The backdrop behind the popup is dimmed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restores the selection and all submodules below it recursively, asking
only if work would be lost. May clone/fetch missing objects (D23).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nothing is fetched on startup any more; the header and detail pane show
the last fetch and f fetches everything. Records the change as D22.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
`!` reduces the tree to submodules with issues (or unknown state) plus
their ancestors, reusing the filter's reduction. Adds docs/actions.md as
a draft spec for restore and stage pin.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The header stands for the root repository: it is selected on startup,
shows the root's own state word, and the detail pane shows its state
like a submodule's (HEAD vs. upstream, changes, unpushed, leftover
submodule clones as untracked repositories). Submodules are ignored in
the root's changes; their rows show them.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A text input above the footer filters submodules by path (case-insensitive).
Matches keep their ancestors. A filtered-out selection moves to the next
visible submodule; esc closes the input and removes the filter.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Releases are built locally (no runner) and uploaded to the Gitea generic
package registry. install.sh installs submarine plus a sub symlink;
`submarine update` replaces the binary after verifying its checksum.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- On startup, after the local state is shown, fetch the superproject and
every initialized submodule (all remotes, prune, at most 8 at once).
Fetches never prompt; failures show git's message. --no-fetch skips it,
f fetches again.
- The header shows "fetching n/m", then the fetch age and failures; the
detail pane shows each submodule's last fetch and fetch errors.
- The git provider polls each repository's metadata (refs, HEAD, index,
.gitmodules) every 2 s and reports changes. The app reloads only what
changed, keeping old values, expansion and cursor; loads are
single-flight with coalesced reruns. Refresh is driven by the
repositories, so a fetch in another shell updates the view like ours.
- r reloads everything (worktree edits are not watched).
- Docs: F50-F53, N1/N8 rewritten, D18-D20 (D12 superseded).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Implement submodule.Provider with the git CLI so submarine reads real
repositories: `submarine [dir]`, with `--mock` for the built-in data.
- Tree reads .gitmodules recursively; Status derives presence, checkout,
worktree, staged pin, pushed state and pin -> ref resolution from local
git commands only (no network).
- Concurrent Status calls are bounded by runtime.NumCPU().
- scripts/make-fixture.sh builds a superproject covering every state; the
integration tests run against it.
- theme.Ago shows "never" for a zero time.
- Docs updated; decisions D14-D16 added.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bubble Tea prototype for browsing repositories with many nested git
submodules: collapsible tree, pins shown as ref + distance, summarized
issue words with severity levels, detail pane, async loading via a
Provider interface backed by mock data. Includes docs/ with
requirements, state model, UX guide, architecture and decision log,
plus AGENTS.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>