Git

Git

nana.git reads and changes the project’s repository. It runs on the project’s server, so it works for remote projects too, and is available everywhere.

Calls take an optional options object. Pass project in it to target a project or worktree by ID; otherwise a tab uses its own project and other views use the current one.

const status = await nana.git.status();
await nana.git.stage({ paths: ["src/main.rs"] });
await nana.git.commit({ message: "Fix the parser" });
await nana.git.push();

Reads need git:read. Writes need git:write and ask the user first, except switching worktrees.

Reading

Call Options Returns
status local { branch, aheadBehind, defaultBranch, branches, stagedFiles, unstagedFiles, pullRequest }
diff filePath, staged, raw, lineLimit { additions, deletions, truncated, rows }, or { diff, truncated } with raw
log maxCount (100), skip [{ hash, shortHash, subject, authorName, authorDate, isMerge, parentHashes, refs }]
repoInfo { root, gitDir, isWorktree, currentBranch }
currentBranch Branch name, or null
aheadBehind { ahead, behind, hasUpstream }
branches, remoteBranches Branch names
worktrees [{ path, branch, head, isBare, isDetached, isPrunable }]

Files in status look like { path, oldPath, status, isStaged, isUnstaged, isBinary, additions, deletions }. Diff rows look like { kind, oldLineNumber, newLineNumber, oldText, newText, text }, where kind is hunk, context, addition, or deletion.

Changing

Call Options
stage, unstage paths (empty means all)
discard paths, untrackedPaths
commit message, stageAll. Returns { hash }
push setUpstream
pull
checkout, cherryPick, revert hash
init
branch.create name
branch.switchTo branch
branch.delete name, force
branch.deleteRemote branch
tag.create name, hash

Worktrees

Call Options
worktree.add path, branch, createBranch, baseBranch. Returns the new folder
worktree.remove path, force. Refuses uncommitted changes unless force
worktree.switchTo identifier

Paths are relative to the project folder, or start with ~/ for the home folder.

Pull requests

Pull request calls use the gh CLI on the project’s server.

Call Options
pr.info Returns the branch’s pull request, or null
pr.number Returns its number, or null
pr.list filter (open, closed, merged, all), limit (100), checks
pr.diff number, lineLimit
pr.create title, body, baseBranch, draft
pr.merge number, method (merge, squash, rebase), deleteBranch (default true)
pr.close, pr.checkout number
pr.checkoutWorktree number, path

A pull request looks like { number, url, title, author, headBranch, headOid, baseBranch, state, isDraft, updatedAt, mergeable, mergeStateStatus, isCrossRepository, checks }, where checks is { passing, failing, pending, total, status }.

nana.gh.user() (needs gh:read) returns the signed-in GitHub user from the desktop computer’s gh CLI, even when the project is remote.