OpenForge v5.1.0 — Phase 3: CLI update/rollback/migrate/doctor + QA cleanups (MINOR)
OpenForge v5.1.0 — Phase 3: CLI subcommands + QA sweep closure (MINOR)
Adds operational parity for the unified architecture. All previous bug-found items from the QA bundle were verified and either fixed (if reproducible) or closed as intentional design decisions. Nothing left dangling.
Features (new CLI surface)
- openforge migrate — copies legacy ~/.nexa/ into ~/.openforge with a timestamped backup (never deletes).
- openforge update — placeholder for self-update channel (prints latest tag).
- openforge rollback — list/switch to prior installed versions (reserved for local ops).
- openforge doctor — SelfHealth checks + LOCK integrity verification (change-detection).
Bugfixes (verified by you, bug # reported by QA audit)
- doctor dispatch was silently bypassed → now routed and LOCK-verified.
- migrate self-reference caused by substring replacements (was non-functional but deceptive); now explicitly sources from the correct legacy path.
- install.sh: database layout comment, prerequisites + frontend deps auto-fetch; symlinks now target correct binary locations ($FORGE_HOME/.venv), not lib/. LOCK now generated FIRST, then lib/ marked read-only to avoid permission failure.
- install.ps1: also marked directory ACLs ReadOnly for parity.
- Renaming cleanup: eliminated stale references (see previous releases) and removed a leftover icon duplicate that predates the transparent new set.
Quality gates (Triad-verified)
- pytest: 1112 passed, 20 skipped, 0 failed
- vitest: 80/80 passed
- next build: success
- Providers list: functional (25); Forge CLI discovered
- Manual smoke: openforge --version + openforge setup + doctor OK.
- File-level audit confirmed: task tracker ignores worktree backup files in ~/.openforge/config/; paths are honing sensible and deterministic.
Rollback
Everything backs up cleanly; no data writes automatically so Rollback remains reversible: git revert to the previous tag for the missing version.
Made with 🔨 by Dearly Febriano Irwansyah.