worktree dirigent backup - #2
Conversation
… all t... Commit All should include in the additional git commit text all the Cue texts ... maybe we need also a better "main" commit message than <number> Cues committed
…ed in ... Highlight or add a dot at the git commits which aren't pushed in the Git Log view also load all commits which aren't pushed e.g. 16 aren't pushed but only (default) 10 are shown
- Fix: clamp-like pattern without using clamp function - Fix: this `if` statement can be collapsed - Fix: this `if` statement can be collapsed - Fix: this `if` statement can be collapsed - Fix: this `map_or` can be simplified
…mpleme... take a look at the @analyze_worktree_dirigent.md file and implement it, therefore, analyze the file and the project strucktur - plan the implementation, adjust the document if necessary, and then take your time to do it step by step
…mpleme... take a look at the @analyze_worktree_dirigent.md file and implement it, therefore, analyze the file and the project strucktur - plan the implementation, adjust the document if necessary, and then take your time to do it step by step
|
Warning Rate limit exceeded
⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📝 WalkthroughWalkthroughAdded tab-level right-click context menu and tab-management helpers; introduced archived worktree DB listing, archive/delete/reveal flows, and force-remove dialogs; extended git utilities for main-worktree discovery, DB archiving, and archived-DB listing; minor UI tweaks in diff rendering and log styling. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant UI as Dirigent UI
participant App as DirigentApp
participant Git as git module
participant FS as Filesystem/OS
User->>UI: Right-click tab / Click "Close Others" / "Close All" / "Close to Right"
UI->>App: send context-menu selection (close_* action)
App->>App: update CodeViewerState (close_*_tabs)
App->>UI: re-render tabs (active_tab updated)
User->>UI: Open Repo dialog -> Click "Remove" on worktree
UI->>App: request remove_worktree(path, force=false)
App->>Git: call git::get_dirty_files(path) (preflight)
alt dirty files found
Git->>App: returns dirty list
App->>UI: set pending_force_remove + pending_archive_msg -> show force dialog
User->>UI: click "Force Remove"
UI->>App: request do_remove_worktree(path, force=true)
end
App->>Git: call git::main_worktree_path(repo)
Git->>FS: read worktree list
Git->>App: return main_worktree_path
App->>Git: call git::archive_worktree_db(main_path, wt_path, name)
Git->>FS: copy .Dirigent/Dirigent.db -> archives/, possibly add timestamp
Git->>App: return archived path (Option)
App->>Git: call git::remove_worktree(repo, wt_path, force)
Git->>FS: run `git worktree remove` (with --force if requested)
Git->>App: return result
alt success
App->>App: reload_worktrees(), update archived_dbs
App->>UI: show status (with archive info if present)
else failure
App->>UI: set error status
end
User->>UI: Click "Reveal" archived DB
UI->>App: spawn OS-specific reveal command via FS (open/explorer/xdg-open)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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 |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (2)
src/app/cue_pool/mod.rs (1)
593-612: Inconsistent trimming between single and multi-cue subject construction.Line 595 uses
.trim()(removes leading and trailing whitespace) for the single-cue case, but line 605 uses.trim_end()(removes only trailing whitespace) for the multi-cue case. This could result in unexpected leading whitespace in multi-cue commit subjects.Additionally, consider the edge case where a cue's text begins with blank lines —
lines().next()would return an empty string, leading to subjects like"Dirigent: "or malformed combined subjects with empty entries.Suggested fix for consistent trimming
let short_names: Vec<&str> = review_cues .iter() - .map(|c| c.text.lines().next().unwrap_or(&c.text).trim_end()) + .map(|c| c.text.lines().next().unwrap_or(&c.text).trim()) + .filter(|s| !s.is_empty()) .collect();🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/app/cue_pool/mod.rs` around lines 593 - 612, The multi-cue subject builder is using trim_end() while the single-cue path uses trim(), causing inconsistent leading-whitespace handling and allowing empty-first-line entries; update the multi-cue construction that builds short_names to mirror the single-cue logic by selecting the first non-empty line (e.g., lines().find(|l| !l.trim().is_empty()).unwrap_or_else(|| lines().next().unwrap_or(&c.text))) and then applying .trim(), and skip any entries whose trimmed first line is empty so combined (joined) subjects don't include blank tokens; keep the existing fallback to the "Dirigent: {} cues" branch and reuse crate::app::truncate_str where appropriate.src/app/dialog/repo.rs (1)
254-262: Consider cross-platform support for the Reveal action.The
open -Rcommand is macOS-specific. The#[cfg(target_os = "macos")]block handles this, but on other platforms the button will do nothing silently.Consider either hiding the button on non-macOS or adding handlers for Windows (
explorer /select,) and Linux (xdg-openon parent directory).💡 Optional: Add Windows support
if let Some(path) = reveal_path { #[cfg(target_os = "macos")] { let _ = std::process::Command::new("open") .arg("-R") .arg(&path) .spawn(); } + #[cfg(target_os = "windows")] + { + let _ = std::process::Command::new("explorer") + .arg("/select,") + .arg(&path) + .spawn(); + } }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/app/dialog/repo.rs` around lines 254 - 262, The Reveal action currently only runs macOS "open -R" inside the reveal_path block, so on non-macOS platforms the button is a no-op; update the handler where reveal_path is used (the std::process::Command spawn inside the reveal_path if-block in repo.rs) to be cross-platform: on Windows run "explorer" with the "/select," argument and the full path, on Linux detect the parent directory and run "xdg-open" (or the distro-appropriate opener) against that directory, and keep the existing macOS "open -R" branch; alternatively, if platform detection fails, hide/disable the Reveal button on unsupported platforms. Ensure you use cfg(target_os = "...") conditional branches around the respective Command invocations and preserve error handling for spawn results.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/app/dialog/repo.rs`:
- Around line 265-327: When force==true and this is a confirmation retry, avoid
re-archiving by reusing any previously stored archive message: in
do_remove_worktree check if force && self.git.pending_archive_msg.is_some() and
if so set archive_msg = self.git.pending_archive_msg.clone() instead of calling
git::archive_worktree_db again; otherwise perform the existing archival logic.
Keep the rest of the flow (storing pending_force_remove/pending_archive_msg on
failure and clearing them on success) unchanged so archive_msg is preserved
between the initial failure and the force-confirmation path.
In `@src/app/markdown_parser.rs`:
- Line 295: The code uses Option::is_none_or in the is_block_content computation
(see is_block_content and item_events), which requires Rust 1.82.0+; either
declare the MSRV by adding a rust-version entry in Cargo.toml (e.g.,
"rust-version = \"1.82\"") or replace the usage of Option::is_none_or with an
equivalent that works on older compilers (e.g., use match, map_or, or is_none()
|| item_events.first().map_or(false, |ev| ...)) so the crate builds for your
supported Rust version.
---
Nitpick comments:
In `@src/app/cue_pool/mod.rs`:
- Around line 593-612: The multi-cue subject builder is using trim_end() while
the single-cue path uses trim(), causing inconsistent leading-whitespace
handling and allowing empty-first-line entries; update the multi-cue
construction that builds short_names to mirror the single-cue logic by selecting
the first non-empty line (e.g., lines().find(|l|
!l.trim().is_empty()).unwrap_or_else(|| lines().next().unwrap_or(&c.text))) and
then applying .trim(), and skip any entries whose trimmed first line is empty so
combined (joined) subjects don't include blank tokens; keep the existing
fallback to the "Dirigent: {} cues" branch and reuse crate::app::truncate_str
where appropriate.
In `@src/app/dialog/repo.rs`:
- Around line 254-262: The Reveal action currently only runs macOS "open -R"
inside the reveal_path block, so on non-macOS platforms the button is a no-op;
update the handler where reveal_path is used (the std::process::Command spawn
inside the reveal_path if-block in repo.rs) to be cross-platform: on Windows run
"explorer" with the "/select," argument and the full path, on Linux detect the
parent directory and run "xdg-open" (or the distro-appropriate opener) against
that directory, and keep the existing macOS "open -R" branch; alternatively, if
platform detection fails, hide/disable the Reveal button on unsupported
platforms. Ensure you use cfg(target_os = "...") conditional branches around the
respective Command invocations and preserve error handling for spawn results.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: fd353e83-3b35-4c86-8c70-8ca550901914
📒 Files selected for processing (8)
src/app/code_viewer.rssrc/app/cue_pool/mod.rssrc/app/dialog/repo.rssrc/app/dialog/running_log.rssrc/app/markdown_parser.rssrc/app/mod.rssrc/app/panels.rssrc/git.rs
…veal a... In `@src/app/dialog/repo.rs` around lines 254 - 262, The Reveal action currently only runs macOS "open -R" inside the reveal_path block, so on non-macOS platforms the button is a no-op; update the handler where reveal_path is used (the std::process::Command spawn inside the reveal_path if-block in repo.rs) to be cross-platform: on Windows run "explorer" with the "/select," argument and the full path, on Linux detect the parent directory and run "xdg-open" (or the distro-appropriate opener) against that directory, and keep the existing macOS "open -R" branch; alternatively, if platform detection fails, hide/disable the Reveal button on unsupported platforms. Ensure you use cfg(target_os = "...") conditional branches around the respective Command invocations and preserve error handling for spawn results.
…ulti-c...
In `@src/app/cue_pool/mod.rs` around lines 593 - 612, The multi-cue subject
builder is using trim_end() while the single-cue path uses trim(), causing
inconsistent leading-whitespace handling and allowing empty-first-line entries;
update the multi-cue construction that builds short_names to mirror the
single-cue logic by selecting the first non-empty line (e.g., lines().find(|l|
!l.trim().is_empty()).unwrap_or_else(|| lines().next().unwrap_or(&c.text))) and
then applying .trim(), and skip any entries whose trimmed first line is empty so
combined (joined) subjects don't include blank tokens; keep the existing
fallback to the "Dirigent: {} cues" branch and reuse crate::app::truncate_str
where appropriate.
… Optio... In `@src/app/markdown_parser.rs` at line 295, The code uses Option::is_none_or in the is_block_content computation (see is_block_content and item_events), which requires Rust 1.82.0+; either declare the MSRV by adding a rust-version entry in Cargo.toml (e.g., "rust-version = \"1.82\"") or replace the usage of Option::is_none_or with an equivalent that works on older compilers (e.g., use match, map_or, or is_none() || item_events.first().map_or(false, |ev| ...)) so the crate builds for your supported Rust version.
…orce==... In `@src/app/dialog/repo.rs` around lines 265 - 327, When force==true and this is a confirmation retry, avoid re-archiving by reusing any previously stored archive message: in do_remove_worktree check if force && self.git.pending_archive_msg.is_some() and if so set archive_msg = self.git.pending_archive_msg.clone() instead of calling git::archive_worktree_db again; otherwise perform the existing archival logic. Keep the rest of the flow (storing pending_force_remove/pending_archive_msg on failure and clearing them on success) unchanged so archive_msg is preserved between the initial failure and the force-confirmation path.
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/app/cue_pool/mod.rs`:
- Around line 593-603: Normalize the single-cue subject branch: after you pick
first_line from review_cues[0] compute let trimmed = first_line.trim(); if
trimmed.is_empty() fall back to review_cues[0].text.trim() and if that is still
empty use a short neutral subject (e.g. "Dirigent" without a trailing colon)
instead of emitting "Dirigent: " with empty content; also change the length
logic so the 72-character target includes the "Dirigent: " prefix by doing let
prefix = "Dirigent: "; let allowed = 72 - prefix.len(); if trimmed.len() >
allowed then truncate trimmed to allowed - 3 (for the ellipsis) via
crate::app::truncate_str and append "..." before formatting with format!("{}{}",
prefix, truncated) otherwise format!("{}{}", prefix, trimmed).
In `@src/app/dialog/repo.rs`:
- Around line 291-327: The archive step currently swallows IO errors from
git::main_worktree_path and git::archive_worktree_db and proceeds to call
git::remove_worktree, which can delete a worktree before its DB is preserved;
update the logic in the surrounding method in repo.rs so that when
git::main_worktree_path or git::archive_worktree_db returns Err(_) you do not
continue to git::remove_worktree—either propagate the error or return early
(with a user-visible error/Result) so removal is aborted on archive failures;
keep the Ok(None) path (no DB to archive) unchanged, but ensure Err branches for
archive/main path stop execution before git::remove_worktree is invoked.
- Around line 338-345: Instead of parsing Git stderr for localized messages,
perform a preflight dirty-file check (using the existing get_dirty_files()
helper or running git status --porcelain) before attempting removal; if the
target path is present in the dirty list and force is false, set
self.git.pending_force_remove = Some((path, /* appropriate message */)) and
self.git.pending_archive_msg = archive_msg and skip the removal attempt,
otherwise proceed with normal removal; update the logic in the method containing
the current stderr-parsing block so it queries get_dirty_files() (or equivalent)
and uses that result to decide when to prompt for force-remove.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 2101243d-e5dc-4403-ae07-b21ac19dd3db
📒 Files selected for processing (2)
src/app/cue_pool/mod.rssrc/app/dialog/repo.rs
… again... In `src/app/dialog/repo.rs` (line 345): Verify each finding against the current code and only fix it if needed. In `@src/app/dialog/repo.rs` around lines 338 - 345, Instead of parsing Git stderr for localized messages, perform a preflight dirty-file check (using the existing get_dirty_files() helper or running git status --porcelain) before attempting removal; if the target path is present in the dirty list and force is false, set self.git.pending_force_remove = Some((path, /* appropriate message */)) and self.git.pending_archive_msg = archive_msg and skip the removal attempt, otherwise proceed with normal removal; update the logic in the method containing the current stderr-parsing block so it queries get_dirty_files() (or equivalent) and uses that result to decide when to prompt for force-remove.
…g agai...
In `src/app/cue_pool/mod.rs` (line 603): Verify each finding against the current code and only fix it if needed.
In `@src/app/cue_pool/mod.rs` around lines 593 - 603, Normalize the single-cue
subject branch: after you pick first_line from review_cues[0] compute let
trimmed = first_line.trim(); if trimmed.is_empty() fall back to
review_cues[0].text.trim() and if that is still empty use a short neutral
subject (e.g. "Dirigent" without a trailing colon) instead of emitting
"Dirigent: " with empty content; also change the length logic so the
72-character target includes the "Dirigent: " prefix by doing let prefix =
"Dirigent: "; let allowed = 72 - prefix.len(); if trimmed.len() > allowed then
truncate trimmed to allowed - 3 (for the ellipsis) via crate::app::truncate_str
and append "..." before formatting with format!("{}{}", prefix, truncated)
otherwise format!("{}{}", prefix, trimmed).
… again... In `src/app/dialog/repo.rs` (line 327): Verify each finding against the current code and only fix it if needed. In `@src/app/dialog/repo.rs` around lines 291 - 327, The archive step currently swallows IO errors from git::main_worktree_path and git::archive_worktree_db and proceeds to call git::remove_worktree, which can delete a worktree before its DB is preserved; update the logic in the surrounding method in repo.rs so that when git::main_worktree_path or git::archive_worktree_db returns Err(_) you do not continue to git::remove_worktree—either propagate the error or return early (with a user-visible error/Result) so removal is aborted on archive failures; keep the Ok(None) path (no DB to archive) unchanged, but ensure Err branches for archive/main path stop execution before git::remove_worktree is invoked.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/app/dialog/repo.rs`:
- Around line 205-206: The "Delete" button currently sets delete_archive =
Some(db.path.clone()) and then immediately calls std::fs::remove_file (also used
around the other block at lines 246-251); change this flow to present a
confirmation modal/dialog when ui.small_button("Delete").clicked() instead of
immediately deleting: set a pending deletion state (e.g., delete_archive =
Some(path)), render a modal that shows the path and asks the user to confirm or
cancel, and only call std::fs::remove_file when the user explicitly confirms;
canceling the modal should clear delete_archive and not touch the file.
Optionally implement a "Move to trash" or an undo buffer rather than hard-delete
if available.
- Around line 288-354: The preflight branch (the dirty-files path) is creating
an archive via git::archive_worktree_db before the user confirms, which leads to
duplicate timestamped archives when the dialog is reopened; move the call to
git::archive_worktree_db out of the preflight check and into the confirmed
remove path (the code that handles pending_force_remove confirmation), or
alternatively, if you must create an archive here, ensure you reload/surface the
created archive immediately and store its canonical path in
self.git.pending_archive_msg so Cancel/return does not leave a hidden archive;
update uses of git::archive_worktree_db, self.git.pending_force_remove,
self.git.pending_archive_msg, git::get_dirty_files and any set_status_message
early returns accordingly so no archive is created on the "dirty files"
preflight branch.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 352b3a6e-da6a-4a9f-a629-8541b2202305
📒 Files selected for processing (2)
src/app/cue_pool/mod.rssrc/app/dialog/repo.rs
✅ Files skipped from review due to trivial changes (1)
- src/app/cue_pool/mod.rs
… again... In `src/app/dialog/repo.rs` (line 354): Verify each finding against the current code and only fix it if needed. In `@src/app/dialog/repo.rs` around lines 288 - 354, The preflight branch (the dirty-files path) is creating an archive via git::archive_worktree_db before the user confirms, which leads to duplicate timestamped archives when the dialog is reopened; move the call to git::archive_worktree_db out of the preflight check and into the confirmed remove path (the code that handles pending_force_remove confirmation), or alternatively, if you must create an archive here, ensure you reload/surface the created archive immediately and store its canonical path in self.git.pending_archive_msg so Cancel/return does not leave a hidden archive; update uses of git::archive_worktree_db, self.git.pending_force_remove, self.git.pending_archive_msg, git::get_dirty_files and any set_status_message early returns accordingly so no archive is created on the "dirty files" preflight branch.
… again...
In `src/app/dialog/repo.rs` (line 206): Verify each finding against the current code and only fix it if needed.
In `@src/app/dialog/repo.rs` around lines 205 - 206, The "Delete" button currently
sets delete_archive = Some(db.path.clone()) and then immediately calls
std::fs::remove_file (also used around the other block at lines 246-251); change
this flow to present a confirmation modal/dialog when
ui.small_button("Delete").clicked() instead of immediately deleting: set a
pending deletion state (e.g., delete_archive = Some(path)), render a modal that
shows the path and asks the user to confirm or cancel, and only call
std::fs::remove_file when the user explicitly confirms; canceling the modal
should clear delete_archive and not touch the file. Optionally implement a "Move
to trash" or an undo buffer rather than hard-delete if available.
There was a problem hiding this comment.
🧹 Nitpick comments (2)
src/app/dialog/repo.rs (2)
419-426: Unnecessary clone ofpathat line 423.
pathis already an ownedPathBuf(cloned at line 375), so the second.clone()at line 423 is redundant.Suggested fix
if cancel { self.git.pending_force_remove = None; self.git.pending_archive_msg = None; } else if force { - let path = path.clone(); self.git.pending_force_remove = None; self.do_remove_worktree(path, true); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/app/dialog/repo.rs` around lines 419 - 426, The extra .clone() on path is redundant because path is already an owned PathBuf (cloned earlier), so remove the second clone and pass path directly to self.do_remove_worktree; update the branch where force is true to call self.do_remove_worktree(path, true) instead of cloning, keeping the existing assignments to self.git.pending_force_remove and self.git.pending_archive_msg unchanged.
475-479: Include the error details in the failure message.The actual I/O error is discarded, making debugging harder. Consider capturing and displaying the error.
Suggested fix
- if std::fs::remove_file(&path).is_ok() { - self.reload_worktrees(); - } else { - self.set_status_message("Failed to delete archived DB".to_string()); + match std::fs::remove_file(&path) { + Ok(()) => self.reload_worktrees(), + Err(e) => self.set_status_message(format!("Failed to delete archived DB: {}", e)), }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/app/dialog/repo.rs` around lines 475 - 479, The failure branch currently discards the I/O error when remove_file fails; change the std::fs::remove_file(&path) call to capture the Result error (e.g., via match or if let Err(e) = ...) and include the error details in the status message instead of the generic text; update the branch that now calls self.set_status_message("Failed to delete archived DB".to_string()) to use something like self.set_status_message(format!("Failed to delete archived DB: {}", e)) and keep the existing success path that calls self.reload_worktrees().
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@src/app/dialog/repo.rs`:
- Around line 419-426: The extra .clone() on path is redundant because path is
already an owned PathBuf (cloned earlier), so remove the second clone and pass
path directly to self.do_remove_worktree; update the branch where force is true
to call self.do_remove_worktree(path, true) instead of cloning, keeping the
existing assignments to self.git.pending_force_remove and
self.git.pending_archive_msg unchanged.
- Around line 475-479: The failure branch currently discards the I/O error when
remove_file fails; change the std::fs::remove_file(&path) call to capture the
Result error (e.g., via match or if let Err(e) = ...) and include the error
details in the status message instead of the generic text; update the branch
that now calls self.set_status_message("Failed to delete archived
DB".to_string()) to use something like self.set_status_message(format!("Failed
to delete archived DB: {}", e)) and keep the existing success path that calls
self.reload_worktrees().
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: de2d325a-e89f-4bae-a79c-4a15d3c0ffdb
📒 Files selected for processing (2)
src/app/dialog/repo.rssrc/app/mod.rs
🚧 Files skipped from review as they are similar to previous changes (1)
- src/app/mod.rs
…t if n...
Verify each finding against the current code and only fix it if needed.
In `@src/app/dialog/repo.rs` around lines 475 - 479, The failure branch currently
discards the I/O error when remove_file fails; change the
std::fs::remove_file(&path) call to capture the Result error (e.g., via match or
if let Err(e) = ...) and include the error details in the status message instead
of the generic text; update the branch that now calls
self.set_status_message("Failed to delete archived DB".to_string()) to use
something like self.set_status_message(format!("Failed to delete archived DB:
{}", e)) and keep the existing success path that calls self.reload_worktrees().
…t if n... Verify each finding against the current code and only fix it if needed. In `@src/app/dialog/repo.rs` around lines 419 - 426, The extra .clone() on path is redundant because path is already an owned PathBuf (cloned earlier), so remove the second clone and pass path directly to self.do_remove_worktree; update the branch where force is true to call self.do_remove_worktree(path, true) instead of cloning, keeping the existing assignments to self.git.pending_force_remove and self.git.pending_archive_msg unchanged.
|
Fixed in commit latest commit. Automated reply from Dirigent |
[PR Import] Fetched 5 fin... terminal logs these ... not necessary: [PR Import] Fetched 5 findings from PR #2 [PR Filter] Import triggered (5 included) [PR Filter] import_filtered_pr_findings: 5 pending, 0 excluded [PR Filter] After filtering: 5 findings to import [PR Import] handle_pr_findings called with 5 findings, pr_number='2' [PR Import] upsert results: new=5, updated=0, errors=0 [PR Import] reload_cues done, total cues=5 [PR Import] Fetched 5 findings from PR #2 [PR Import] Fetched 5 findings from PR #2
Changes
Summary by CodeRabbit
New Features
Improvements