Repository navigation
1.2.0
Submodules can now stay current with a teammate's branch automatically, and individual submodules are now editable from Settings instead of requiring a .github-sync.json edit.
Features
Auto-merge from an upstream branch (upstreamBranch)
Each submodule can declare an optional Upstream branch. Every sync of that submodule will then fetch origin/<upstreamBranch> and merge it into the working branch before pushing. Built for the workflow where each teammate works on their own personal branch but wants to keep absorbing the team's main automatically.
- Set it in the Add submodule dialog (new field), or via the new Edit action on an existing submodule.
- Travels with the repo — recorded in
.github-sync.json, so other machines pick it up on next clone.
Manual "Pull from…" action per submodule
Each submodule card in the dashboard now has a pull-request icon button.
- Click it → modal lists the submodule's remote branches via the GitHub API (default branch first, working branch excluded).
- Pick a branch → plugin fetches it, merges into the submodule's current branch, pushes the result.
Edit and delete submodules from Settings
Settings → Submodules now shows a pencil + trash button per row.
- Pencil opens an Edit submodule modal — change Remote URL / Branch / Upstream branch / Auto-sync. Saving rewrites
.gitmodules, runsgit submodule sync, updates the submodule's ownremote.origin.url, seeds the new branch on the remote via the GitHub API if missing, then triggers a sync. - Trash opens a confirm dialog that explains what will happen (deinit + working tree removal; the remote repo is not touched), then runs the existing remove flow.
Conflicts route through the existing ConflictModal
Whether the conflict originates from a normal sync pull, an upstreamBranch auto-merge, or a manual "Pull from…" action, it lands in the same dashboard "Resolve" UI — including AI-assisted resolution when smart-sync is on.
UX
- Settings page redesigned around card-grouped sections. Each section ("Connected repository", "Submodules", "GitHub Account", "AI", "General") now renders as a single rounded, bordered card with subtle 1px dividers between its items. Inter-section separation is just spacing — no horizontal rules. Matches the look of Obsidian's own community-plugin settings page.
- Section titles show a muted inline count where useful (e.g.,
Submodules (2)) instead of a separate description row. - PullFromBranchModal and EditSubmoduleModal use the same header/body/footer pattern as the existing LocalChanges modal for visual consistency.
Internal
GitManager.mergeFromBranch()+mergeAndPushFromBranch()are the new merge primitives, shared by theupstreamBranchsync path and the manual Pull-from-branch action.SubmoduleManager.setRemoteUrl()repoints a submodule on both sides (parent.gitmodulesand the submodule's ownremote.origin.url) and invalidates the cached per-submodule GitManager.Plugin.updateSubmodule()applies metadata edits with the necessary git-level migration.Plugin.surfaceConflict()exposes the dashboard's Resolve flow to ad-hoc merge entry points that don't go through the scheduler.
🤖 Generated with Claude Code