Merge upstream v1.0.7 and preserve fork integrations - #17
Merged
Merged
Conversation
Wait for investigation session creation, select the returned session, and then open its modal with the exact session and worktree context.
Ask the default global system prompt to label each discovered issue, pull request, and discussion as open or closed, and to show merged for pull requests when applicable. Cover the requirement in Rust and TypeScript prompt regressions.
Offer pstack in Opinionated preferences for Claude, Codex, OpenCode, Cursor, Pi, Command Code, and Grok. Install via sparse checkout of cursor/plugins, copy skills to native and Jean-global roots, and uninstall only directories recorded in the pstack manifest.
Jean now copies the 46 pstack workflow skills and omits the Cursor-only setup-pstack skill. Reinstall also removes a previously installed setup-pstack directory when it is listed in the pstack manifest. Preferences copy and tests match that behavior, and installed skill files are left unchanged.
Drop the smoke-test magic prompt, preferences, toolbar/modal entry, and handlers so the feature is no longer available.
Unix PATH detection now falls back to a login shell `command -v` lookup when `which` misses a tool, so CLIs available only in interactive PATH are found. Codex asset lookup continues past same-version tags that lack the native binary instead of failing on the first match.
Parse kitty keyboard protocol flags, update modes, and a bounded restore stack instead of a depth counter. Treat Shift+Enter as encodable only when disambiguate or report-all-keys is set.
fix(terminal): insert a newline on Shift+Enter
Move GitHub issue discovery out of the default Claude system prompt into an opt-in Check GitHub Issues magic command (Q) in Magic modal and mobile toolbar. Persist explicit CLI source choices so Settings PATH to Jean managed is not overwritten on load.
* fix: make project persistence crash-safe (coollabsio#679) * fix(projects): treat unreadable backups as corrupt, not missing Stop returning empty projects when the primary file is gone but a recovery candidate exists and cannot be read or parsed. Only treat the store as missing when every candidate is absent. Add a test covering a missing primary with a corrupt backup. --------- Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
…llabsio#697) * fix(sentry): route Sentry issue lookups to the org's region host * fix(sentry): validate region hosts and persist them safely Reject non-https or non-sentry.io region URLs before API use and cache only a canonical host. Reload project data after region discovery so a stale snapshot cannot overwrite concurrent settings. Surface project storage errors when a global Sentry token change clears inherited caches, and validate theme before that mutation. --------- Co-authored-by: Bernhard Millauer <bernhard.millauer@adventics.de> Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
…labsio#703) * fix(persistence): make session saves work on Windows * fix(persistence): preserve unix file modes on atomic writes Copy existing destination permissions onto the temp file before rename so preference and config files keep restrictive modes instead of inheriting the umask of the replacement file. --------- Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
* perf: reduce CPU and memory across projects * Delete tasks/todo.md * fix(chat): keep unread count on fetch errors and live worktrees Stop swallowing get_unread_session_count failures as zero so the title-bar badge keeps a valid cached count. After project bootstrap, observe the live worktrees query instead of a stale snapshot. Fill unread_summary in storage tests. --------- Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Prevent cancelled prompts and image attachments from being copied back into the composer after execution starts. Preserve restoration for runs cancelled before execution.
Move the combined sync setting from Experimental to General and preserve the enabled default when preferences are missing.
Expose terminal, browser, and package-script actions in narrower session modals while keeping inline actions for extra-wide layouts. Always show desktop GitHub menu entries, defer unread snapshots until sessions load, and allow shortcuts through the floating terminal host.
Install agent-browser, Chromium, and backend MCP configuration together, show Jean MCP installation status, and prefer Agent Browser as a testing fallback. Prevent duplicate web image pastes, preserve descriptive worktree names, support Ctrl-click background creation, and persist early feature-tour dismissal.
Prevent startup UI from reopening against stale preference data by applying client patches to the query cache synchronously. Use an explicit Ctrl label for macOS web shortcuts when the Control glyph is unavailable.
Add isolated server connections, command routing, capability discovery, remote project views, and sandboxed feature surfaces. Delay Codex completion until session state is persisted and prevent clearing context while a session is running.
Keep the native client on its local core while treating remote profiles as parallel dashboard sources. Track path ownership for Git and GitHub commands, show server context, and prevent duplicate project picker values.
Replace repeated project badges with server section headings and hide redundant ownership labels in Web Access. Resolve remote attachment URLs through their owning server and normalize app-data wildcard paths. Limit saved AI lessons to general, project-wide learnings.
* fix(pi): run PATH installation correctly through WSL * fix(antigravity): remove duplicate diagnostics field * fix(pi): avoid eval when checking WSL authentication Read allowlisted API key variables with printenv and add regression coverage. --------- Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Add min-w-0 to the FileContentModal header container so long file paths/titles can truncate instead of overflowing the dialog width.
Replace the Edit-only isEditTool guard with getClaudeFileEdits, which normalizes Claude file-changing tool calls into old/new string edits: - Edit: single replacement - MultiEdit: one Edit entry per inner edit - Write: full content shown as added - NotebookEdit: new cell source keyed by notebook_path The edited files list and the diff modal now both use the normalized edits. Add tests for the new tool types and MultiEdit diff input.
- Add is_error to ToolCall and tool result events across all backends and surface failed tool calls in the inline tool call UI - Detect "No conversation found" on --resume, clear the stale Claude session id, reset the run output and retry once without resume - Allow root YOLO runs to use bypassPermissions by setting IS_SANDBOX=1 instead of degrading to acceptEdits - Prefer the result event's structured_output and fall back to the last StructuredOutput tool call when extracting Claude JSON responses - Switch the default Claude model to claude-opus-5-5 - Extend edited files, message diff modal and streaming event handling with matching tests
Make the light theme monochrome: primary, ring, and sidebar-primary are now near-black or neutral instead of amber. Add warning, success, and info tokens with -foreground variants. They have light and dark values, and the light values use -700 shades so text stays readable on white. Across the components, replace hardcoded Tailwind hues such as text-green-500, text-amber-500, and bg-blue-500/10 with these tokens, neutral chrome, or muted colors. Categorical identity colors, such as file-type colors, now use -600 / dark:-400 pairs. Update the related tests to match. Update the default global system prompt: scale verification to risk, limit which new tests get written, and forbid AI attribution trailers in commits and PRs. Add a lessons entry on how to use theme color tokens.
- Render OpenInButton and ScriptsButton with a solid primary background in light mode, keeping the muted style in dark mode - Switch the running StatusIndicator spinner from warning to primary color - Show the UnreadBell running icon in foreground color in light mode - Change the light-mode warning token from amber-700 to orange-700 - Use amber-500 for the JSON file color in light mode - Update the tests to match
Add a useModifierHintsVisible hook that reports whether a modifier combination is currently held and hides again on keyup or window blur. The recent worktrees list opens rows 1-9 with Mod+Shift+1-9 in the native desktop app. Holding Mod+Shift shows each row's shortcut in place of its activity timestamp. The shortcut matches on event.code because Shift turns the digit keys into symbols. Session tab Mod+1-9 hints in SessionChatModal now appear only while Mod alone is held. They are formatted with formatShortcutDisplay instead of a hardcoded ⌘. Add tests for the hook and the shortcut helpers.
The sparkle action in the # picker now replaces the mention with the investigation prompt and submits it immediately instead of leaving it in the draft. ChatInput passes a beforeSend callback that loads the issue/PR context; handleSubmit awaits it before sending, keeps the send bound to the originating session, and restores the draft if the load fails. Update button labels to "start investigating" and docs.
After a cancel, hydrating from the backend only treats the last message as cancelled-turn output if it is an assistant reply that was not already known before the cancel. Before this change, a reply from an earlier turn could clear the restored input draft. Renaming a session manually now marks auto-naming as completed, so the first prompt no longer overwrites the chosen name.
Store recent-session pins on the server that owns the session so Web Access clients see the same pins. Add get_pinned_recent_session_ids and set_recent_session_pinned commands; save_ui_state now keeps the pins on disk so a full snapshot save cannot drop another client's pin. File read-modify-write cycles are serialized with a process-wide lock. Add a recent-session-pins service that merges remote server pins with local pins in native Jean, falling back to local UI state for older servers that answer "Unknown command" and moving those pins to the server after the server is updated. Remove the pin toggle from the projects store. Rework shortcuts: Mod+1-9 opens the first nine Recent sidebar rows while the list is visible (replacing Mod+Shift+1-9), otherwise switching session tabs or worktrees. Holding Mod alone shows the number hints. Session tab switching moves to Mod+Left/Right and only fires when the focused text field is empty.
Claude sets is_error on any non-zero shell exit, even when the command ran normally (e.g. grep finding no match, `which` for a missing binary). Bash tool calls whose output starts with "Exit code N" no longer show the "failed" marker.
Move sortModelOptionsByRawModel from toolbar-utils into lib/model-utils so services can share it, and apply it to Claude catalog model options. Reorder the bundled Claude modelOptions to match the version-descending order, and add a test covering catalog sorting.
Give the teardown success and delete-failure toasts a stable id based on the worktree id. This way, when the same event arrives over more than one server connection, the existing toast is reused and duplicates don't stack.
Claude CLI runs /goal natively, so the command text is sent through to the model as-is. Jean now keeps a copy of the objective so it can show the goal banner, and switches the session to the configured goal execution mode. - Offer the /goal builtin in the slash popover for Claude sessions - Store the objective on /goal <text> and drop it on clear aliases (clear, stop, off, reset, none, cancel) - Treat Claude as a goal backend in codex_thread_id_for_session - Clear the stored goal banner once a Claude run finishes without being cancelled, unless the message was a bare /goal status check - Clearing from the banner on Claude queues `/goal clear` and cancels any goal loop still running - Update the goal execution mode preference description - Add tests for the Claude /goal set and clear flows
Restructure Recent session rows into two flex lines: the session name and status on top, project/worktree with Git changes and the time or shortcut hint below. The pin toggle now sits as a small circular badge on the row's top-left corner. Git change counts are hidden when the list is narrower than 15rem (container query). Hide the Cmd/Ctrl+1-9 worktree shortcut hints on the project canvas while the sidebar's Recent tab is visible, because Recent sessions take over those shortcuts then.
Invalidate the GitHub and Linear queries in the background rather than awaiting them in beforeSend. Refetching every query could take several seconds and held up the investigate message the whole time. Add a test that confirms beforeSend resolves even when invalidateQueries never settles.
Write the Claude usage cache atomically via a unique temp file and rename, so concurrent readers never see a truncated/empty file while run streams update it on every rate_limit_event. In the Usage pane, only show the error line for Claude, Codex, and Grok when no data is available, so a failed background refetch no longer hides previously loaded usage. Add a test covering this case.
Move CodexGoalBanner out of the message list and into the top-right badge area next to the session label. The goal now shows as a compact "Goal" pill with a flag icon. Clicking it opens a popover that shows the full goal text and a "Clear goal" button. The popover closes once the goal is cleared. Export the Flag icon from reicon.
When the worktree folder was deleted or emptied outside Jean, the teardown script would fail and block cleanup. Check for the .git entry first and log a warning instead of running the script.
- Mark Running runs whose process is gone as Crashed when a new run starts, so orphaned runs no longer block every new prompt - On cancel of an idle session, finish stale Running/Resumable runs (Completed if a result line exists, otherwise Cancelled) and emit a cancelled event so the UI stops showing the session as busy - Skip sessions with unreadable or unwritable metadata during startup recovery instead of aborting recovery for all sessions - Expose emit_cancelled_event to the crate - Add test covering orphaned, pid-less, and live Running runs
Replace the top-right CodexGoalBanner with a GoalBadge that renders under the user message that set the session's active goal. The badge shows as active only while the stored goal still matches that message's objective. - Add goal-utils with getGoalObjective, which parses /goal messages and Jean's rewritten Codex goal turns, and share its CODEX_GOAL_TURN_PREFIX with useMessageSending - Move goal clearing into a ChatWindow handleClearGoal callback and pass onClearGoal through the message lists to MessageItem - Remove the border and background from the recent session pin button
Previously, Cmd/Ctrl+Arrow session switching only worked when the focused chat input was empty. Now the key moves the caret first, and once the caret already sits at the start/end of the text in that direction, the next press switches to the previous/next session. Active text selections still keep the key in the field, and inputs without selection support fall back to the old non-empty check.
Call recover_incomplete_runs during runtime initialization so runs left incomplete by a crash or reboot are finished before any client connects. Headless servers otherwise only recovered on a full page load, leaving reconnected web tabs showing dead runs as still running. Remove the running StatusIndicator from StreamingStatusBar.
Apply the md:opacity-0 hover/focus reveal classes to the pin button regardless of pinned state, so pinned sessions no longer show the pin icon permanently on desktop. Pinned icons keep the foreground color.
|
Important Review skippedToo many files! This PR contains 746 files, which is 646 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configuration
⛔ Files ignored due to path filters (61)
📒 Files selected for processing (746)
You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
figassis
marked this pull request as ready for review
October 3, 2026 16:37
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Merge upstream's published v1.0.7 tag (
8ce1712bbe310db61161110a6de813d882ea4e83) into the fork. No post-release upstream main commits. Resolves all 12 merge conflicts while retaining the fork's integrations, Claude output styles, skill manager, browser editor, Docker CLI pins, headless bind override, and container Codex sandbox configuration.Compatibility fixes
Verification
Passed
bun run check:all: typecheck, ESLint, Rust formatting, Clippy, 2,868 frontend tests across 410 files, 1,322 core Rust tests, and 14 native Rust tests. One core test remains ignored upstream. Passed all 32 Chromium E2E tests with two workers. Finalmake docker-buildpassed, producingjean:dev(833dfaf9af1f). Recreated the isolated smoke app from that image. Pinned Claude reports 2.1.186; the new mobile picker fits at 390px, disables incompatible styles, and retains selection after reload. Built-image smoke covers bootstrap/version, command dispatch, secret redaction, local Outline API requests, skills, output styles, editor launch, and terminal execution. Desktop/mobile screenshots visually inspected with agent-browser.A disposable deterministic Claude CLI fixture exercises the actual built backend: one private settings file, complete blocking-tool payloads, detached-process restart/resume, exactly-once completed history, and persisted output style. This is not a live Claude-service inference test.
Remaining live checks / deployment notes
Upstream release: https://github.com/coollabsio/jean/releases/tag/v1.0.7
Repeatable verification:
docs/developer/upstream-sync.md,scripts/verify-fork-upgrade.mjs.