v3.1.2 is a statusline release, plus the documentation sweep it forced.
Highlights
The slash pair now answers the question you were asking it
The pair after the repository name used to be git ahead/behind. It now carries open issues over open change requests, and ahead/behind no longer renders at all.
The counts had moved three times in four days before landing here, and each move was an attempt to stop the same misreading: 59/0 on the repo segment reads as issues-over-PRs even when it is ahead/behind. Tagging the counts with glyphs elsewhere on the bar did not stop it. The slash pair is where a reader looks for issue and PR counts, so that is what it holds now. If you have been reading ↑2 or a slash pair as sync state, that data is still collected — it simply has no slot on the bar.
An absent answer no longer looks like a pending one
The pair distinguishes four states, and the distinction is the point: 1/1 fetched, 0/0 fetched with nothing open, -/- unknown but still coming, and no pair at all when no answer was ever going to arrive.
That last state has five causes — the segment is off, statusline.forge is set to none, the forge value is unrecognised, no forge CLI is installed, or the remote is on a host nothing auto-detects (a self-hosted GitLab or GitHub Enterprise checkout). Previously all of these showed -/-, which promised a number that was never coming and sent people looking for a broken fetch. A typo in statusline.forge now surfaces as an absent pair rather than as a marker suggesting something failed.
Suppression does not latch. The refresh child re-derives it every run, so installing gh or correcting the forge value restores the pair within one TTL — no config edit, no session restart.
moai glm tools enable --force does what it says
Enabling Z.AI MCP tools against a ~/.claude.json that already holds a different token refuses, and the error names --force as the way through. Following that advice reproduced the same error, and the only way to change the token was to edit ~/.claude.json by hand.
The flag parsed and the command branched on it — but both branches reached the same code, whose token check is deliberate and has a test pinning it. The force path is now its own entry point. The checking path still refuses, and a forced overwrite still leaves every other mcpServers entry untouched.
Documentation caught up with the bar it describes
README and the documentation site described a statusline several layouts out of date — in all four locales at once. Corrected: the ASCII separator, the removed branch arrows, the unified 💾 git-status glyph in place of the retired mailbox quartet, the version display without its old prefix, the TODO: n/m spacing, and the forge counts documented on a line where they had not rendered for days.
Two claims were not merely stale but self-contradicting, and are now fixed: the docs said a missing forge CLI leaves cached counts visible (the pair is dropped whenever suppression is set — the cache survives on disk for the restore, not on the bar), and a config example labelled the worktree segment opt-in when an omitted key resolves to enabled.
Four display presets and a preset: compact key were also advertised on the docs site after both had been retired.
Upgrade notes
- Git ahead/behind is gone from the statusline. Nothing replaces it in that slot; the slash pair belongs to issue and change-request counts now.
statusline.forge: noneremoves the pair entirely instead of leaving a permanent-/-. Same for an unrecognised value — check your spelling if a pair you expected disappears.preset: compactand the four display presets do not exist. They were retired earlier and only the documentation still carried them; every mode collapses to one layout.
Install
macOS / Linux / WSL:
curl -fsSL https://adk.mo.ai.kr/install.sh | bashWindows (PowerShell 7.x+):
irm https://adk.mo.ai.kr/install.ps1 | iexAlready installed? moai update --binary, then confirm with moai version.
Full detail: CHANGELOG.md · all commits