flow-next v1.9.1
·
53 commits
to main
since this release
Fixed
/flow-next:setupnow detects Cursor and writes Cursor-correct project instructions, instead of mis-detecting it as Codex. Setup's platform detection keyed only on plugin-root env vars (DROID_PLUGIN_ROOT→ Droid,CLAUDE_PLUGIN_ROOT→ Claude Code, else → Codex). Cursor exposes neither, so a Cursor local install fell into the Codex branch —/flow-next:setupwrote the$flow-next-planCodex command syntax into AGENTS.md and ran.codex/agent + hook setup, while the installer advertises Cursor usage as/flow-next:*. Setup now adds aCURSOR_AGENT+.cursor-plugin/plugin.jsonmanifest branch (ordered before theelse → codexfallback) →PLATFORM=cursor, applied at every platform-branch point in the workflow (detection, the 6b docs-status template, the Step 6 Docs question, and the Step 7 write mapping), which: writes the/flow-next:planslash-command snippet (Cursor runs the same commands; lands in AGENTS.md, which Cursor reads), resolvesflowctlvia.flow/bin/flowctl, reads the version from.cursor-plugin/plugin.json, and skips the Codex-only.codex/agent/hook copy. The detection requires both the env var and the Cursor manifest becauseCURSOR_AGENTis inherited by child processes — so Codex launched from a Cursor shell inherits it; the manifest (present only in a real~/.cursor/plugins/local/flow-nextinstall) plus a! -d ${PLUGIN_ROOT}/codexguard (a real Cursor install excludes thecodex/mirror, so its absence rejects the shared repo source tree where all manifests coexist) keep a Codex-hosted-in-Cursor run — whether installed or run from source — correctly classified ascodex. For thatcodex/-absence proof to hold on re-install, the installers now produce a true mirror:install-cursor.shaddsrsync --delete-excludedandinstall-cursor.ps1explicitlyRemove-Items the excluded dirs afterrobocopy /MIR(plain--delete//MIR+/XDleave a pre-existingcodex/in place);test_install_cursor_parity.pylocks both. Surfaced + hardened across five rounds of PR #162/#163 review. Codex mirror regenerated.- Tracker-sync create-if-unlinked now snapshots the merge base at issue-create time, even when the triggering op is
comment. When the first lifecycle touchpoint for an unlinked spec was acommentop (e.g.work.done/makePrwith earlier events disabled), the auto-create path created the issue and attached the tracker id but did not callsync set-merge-base/set-last-synced— and thecommentpath itself leaves body/status untouched, so the linked issue had no merge base. A later body sync would then hit the no-base bootstrap, treat the sync as a fast-forward projection, and could silently overwrite tracker-side edits made after the issue was created. The flow-first auto-link now snapshots the just-rendered pair (set-merge-baseBOTH halves +set-last-synced) at create time — the issue body we just wrote is therenderFlowToTrackeroutput, so the base is exact. (push-first auto-link was already covered by thepushskeleton's post-write snapshot; this makes thecomment/reconcile-first paths match.) Surfaced in PR #162 review. Codex mirror regenerated.