Repository navigation
Conversation
T45–T49: TUI slash handler fixes, test fixes, cleanup
- Remove unused imports (PawanConfig, ToolDefinition) in execute.rs - Remove dead duplicate functions from construction.rs (already in mod.rs) - Gate test-only re-exports behind #[cfg(test)] in agent/mod.rs, config/mod.rs - Remove unused QUEUE_DONE_TTL_MS constant from tools/task.rs - Add #[allow(dead_code)] on future-API items in pawan-cli (theme, layout, etc.) - Add v0.5.7 changelog entry with refactoring, features, and test summary - Update test counts from 988+ to 1627+ across README, crate READMEs, and docs
- pawan-core: remove unused imports, fix mut variables - pawan-cli: fix clamp, sort_by_key, checked_div, needless borrows - rename ExportFormat::from_str to parse to avoid std trait confusion - fix unused variables in tests with .. rest patterns
fix: resolve all clippy -D warnings across workspace
- README.md, crate READMEs, guide.md, triage.md, CHANGELOG.md
docs: update test count and version refs for v0.5.7
…#27) * fix: remove maki refs, fix NVIDIA model catalog auth, trim fallback list - Remove 'inspired by maki-ui' from theme.rs and layout.rs comments - Send Authorization Bearer header when NVIDIA_API_KEY is set - Replace 500+ hardcoded models with 13 curated fallback models - Fix clippy sort_by_key and redundant import warnings * fix: update model catalog tests and snapshot for curated fallback list - Lower test_default_models_not_empty threshold from 50 to 10 - Accept new model selector snapshot with 13 curated models * refactor: decompose high-CRAP functions into focused helpers CRAP Reduction (execute.rs): - execute_with_all_callbacks: 730 lines → 179 lines (75% reduction) - Extracted 9 helpers: inject_eruka_context, build_user_prompt, apply_iteration_budgets, call_llm_with_retry, accumulate_token_usage, strip_thinking_blocks, handle_no_tool_response, check_tool_permissions, execute_pending_tools, collect_tool_results CRAP Reduction (session_ops.rs): - export_as_html: CC 46 → ~3 (4 helpers: build_html_header, build_html_footer, render_message_html, render_tool_calls_html) - generate_handoff_prompt: CC 49 → ~4 (5 helpers: extract_recent_context, extract_mentioned_files, extract_task_items, extract_constraints, build_prompt_header) All 1643 tests pass. Clippy clean. * refactor: decompose main.rs run(), parse_compaction_summary, quality_score_for CRAP Reduction: - main.rs run(): CC 60 → ~30 via setup_config, resolve_session_resume extraction - parse_compaction_summary: CC 35 → 1 via 6 helper functions (extract_section_content, parse_summary_field, parse_token_counts, parse_compressed_sections, parse_preserved_sections, parse_numbered_items) - quality_score_for: CC 37 → 1 via 3 helpers (score_by_vendor, score_by_capability, score_by_size) Coverage baseline captured: 77.28% lines / 79.08% functions / 76.83% branches All 1643 tests pass. Clippy clean. * chore(pawan): sync 3 file(s) * test: add unit tests for pure TUI functions - scrollbar.rs: 9 tests (construction, render edge cases, color handling) - fuzzy_search.rs: 12 tests (filter, navigation, command_prefix) - status_bar.rs: 11 tests (abbrev_model, format_tokens, context_bar) All 1655 tests pass. Clippy clean. * refactor(tui): convert render.rs to render/ directory module * chore(pawan): sync 3 file(s) * refactor(cli): decompose high-complexity main.rs run functions Break down run_headless (CC=51), run_commit (CC=40), run_doctor (CC=31), and run_tasks (CC=31) into focused helper functions to reduce cyclomatic complexity and CRAP scores. Behavior preserved verbatim. * test(tui): relocate render snapshots and make CWD redaction width-stable Move render snapshots into render/snapshots/ after the render module split and regenerate them against current TUI output. Pad the [CWD] redaction to preserve line width so the welcome box border stays aligned regardless of working-directory length, making the snapshot portable across environments. * refactor: decompose high-complexity functions across cli and core Decompose App::main_loop, MiseTool::execute, OpenAiCompatBackend streaming/generate, App::slash_route, and handle_input_panel_key into focused helper functions. Behavior preserved verbatim.
- LspTool::execute: 10 tests (error paths, arg validation, schema) - InjectionDetector: 22 tests (scan_file, scan_file_streaming, helpers) - main.rs helpers: 20 tests (parse_git_status, commit prompt, headless) - TUI model picker: 8 tests (navigation, input, selection) Total workspace tests: 1715+
- Workspace version 0.5.8, workspace deps pawan-core/pawan-mcp 0.5.8 - CHANGELOG: add v0.5.8 entry (CRAP reduction, render decomposition, 60 tests) - Fix CHANGELOG corruption (embedded line numbers, snapshot tags) - Update test counts 1643→1779 across README, guide, triage, crate READMEs - Regenerate insta welcome snapshots for v0.5.8 - Update pawan-api health endpoint version in README
TUI redesign + animate-core value tweens (v0.5.9)
chore: v0.5.9 version bump + docs update
Replaces the unmaintained `atty 0.2.14` crate with the stdlib `std::io::IsTerminal` trait (stable since Rust 1.70). Resolves RUSTSEC-2024-0375 (unmaintained) and RUSTSEC-2021-0145 (Windows unaligned read) for pawan-cli's direct dependency on `atty`.
**Changes**
- `crates/pawan-cli/src/main.rs`: 3 call sites switched from `atty::is(Stream::*)` to `std::io::{stdin,stderr}().is_terminal()` (one new `use std::io::IsTerminal;` import)
- `crates/pawan-cli/Cargo.toml`: drop `atty = "0.2.14"`
- `Cargo.lock`: atty and its transitive `hermit-abi` are no longer resolved
- `.cargo/audit.toml`: document accepted-risk suppressions for the 11 advisories (5 vulnerabilities + 6 unmaintained warnings) that remain in the lockfile but are out of reach or already patched
- `cargo fmt --all`: bring workspace into compliance with the current rustfmt (35 files, 446+/396-, no semantic changes)
- Refresh stale welcome-screen snapshot (v0.5.8 → v0.5.9) for the lib and bin targets
**Verification**
- `cargo check -p pawan`: clean
- `cargo test -p pawan`: 269/269 pass locally
- `cargo audit`: clean (0 advisories with the new `.cargo/audit.toml` suppressions)
- `cargo fmt --all -- --check`: clean
**Note on CI**
The 4 `test_render_welcome_snapshot` / `test_session_tags_persist_on_save` failures in CI are pre-existing on `main` (the welcome snapshot still has v0.5.8 but the code is v0.5.9, and `test_session_tags_persist_on_save` is environment-flaky on the session-dir path). The atty fix is unrelated to those failures. They should be addressed in a separate PR.
Closes #4 (RUSTSEC-2024-0375) and #13 (RUSTSEC-2021-0145) via auto-close on merge.
Adds RMUX-backed terminal workflow support, /rmux typed slash command, /model key-release fix, and PTY-backed TUI QA.
Bump workspace crates to v0.5.10 and finalize release notes after RMUX terminal workflow integration.
Adds RMUX live roundtrip testing, kill_session support, /rmux kill routing, and stricter RMUX validation/diagnostics.
Bump workspace crates to v0.5.11 and finalize release notes for RMUX hardening.
Render RMUX snapshot tool results as terminal-focused TUI cards and switch fixed TUI statics to LazyLock.
Bump workspace crates to v0.5.12 and finalize release notes for RMUX snapshot cards.
Adds rmux list_sessions support, /rmux list routing, live roundtrip list assertions, and docs.
Bump workspace crates to v0.5.13 and finalize release notes for RMUX session discovery.
Adds rmux list_panes support, /rmux panes routing, live pane inventory assertions, and docs.
Bump workspace crates to v0.5.14 and finalize release notes for RMUX pane discovery.
Renders rmux list_panes tool results as active-pane inventory cards while preserving generic tool rendering.
Bump workspace crates to v0.5.15 and finalize release notes for RMUX pane-list cards.
Renders rmux list_sessions tool results as active-session inventory cards while preserving other tool rendering.
Bump workspace crates to v0.5.16 and finalize release notes for RMUX session-list cards.
Renders rmux send, key, wait, and kill tool results as action-focused TUI cards.
Bump workspace crates to v0.5.17 and finalize release notes for RMUX status cards.
Track and render model picker catalog source metadata for fallback vs live NVIDIA catalogs.
clippy::double_must_use denies #[must_use] with no message on a function returning a type already #[must_use]. The four firing sites (agent/backend/mod.rs:18, agent/pool.rs:44, coordinator/mod.rs:444, tools/mod.rs:42) hold no #[must_use] themselves: #[async_trait] generates it. async-trait 0.1.89/src/expand.rs:69 pushed method.attrs.push(#[must_use]) unconditionally, and the expansion returns a Future, which is already #[must_use]. 0.1.92 removes that line, so the attribute is never emitted and the diagnostic cannot arise. Lockfile-only; the workspace pin is already async-trait = "0.1". The transitive syn 2.0.117 -> 3.0.6 is forced by async-trait 0.1.92's own manifest (syn = "3"), not collateral. Verified with cargo clippy -p pawan-core -- -D warnings under 1.99.0 (EXIT=0, 0 errors). 1.95.0 does not fire this lint, so green on the default toolchain is not evidence -- CI's floating @stable is what catches it. Refs #86
CI note:
|
| advisory | package |
|---|---|
| RUSTSEC-2026-0204 | crossbeam-epoch |
| RUSTSEC-2026-0258 (x2) | h2 |
| RUSTSEC-2026-0195 / -0194 | quick-xml |
| RUSTSEC-2026-0185 | quinn-proto |
| RUSTSEC-2026-0285 | rustls |
| RUSTSEC-2026-0249 | smartstring |
| RUSTSEC-2026-0190 | anyhow |
| RUSTSEC-2026-0306 | faster-hex |
| RUSTSEC-2026-0253 | lru |
| RUSTSEC-2026-0186 | memmap2 |
| RUSTSEC-2026-0205 | scc |
async-trait and syn are not among them. This bump adds only async-trait
0.1.89 -> 0.1.92 and syn 3.0.6; neither package appears in the audit output.
Why "main is green" does not contradict this
main's most recent ci.yml runs report success, but they ran on 2026-06-14
(de893a97, created 10:05Z), while the advisory database this run used was last
updated 2026-10-03. Those runs are green against a June advisory snapshot and say
nothing about the current one. This is the pre-existing condition tracked in #83 —
audit fails on main independent of any PR.
So the red gate here is a known-red baseline, not a regression from this branch. It
should not be read as evidence that this fix is broken; likewise, its red state should
not be used to conclude anything about this change in either direction. The
authoritative signal for this PR is Check & Lint, which is what this change targets.
Refs #86
Retraction: my previous CI note was wrong on two countsMy note above said Error 1 — the advisory table was wrongI published a table of 13 advisory/package rows. The actual
The extra packages I listed — Error 2 — my "main is green" reasoning was structurally invalidI compared against The correct baseline, and the actual conclusion
Identical to this PR's audit output — same count, same IDs, same packages, same And the lockfile diff against Nothing else moved. Conclusion stands, but now on the right evidence: the audit failure is the Refs #86 |
Follow-up: why the audit shows
|
| run | event | conclusion |
|---|---|---|
main de893a97 (37313858210) |
schedule |
success |
PR b8a35b6 (37344072173) |
pull_request |
failure |
| 2026-10-04 14:53Z | pull_request |
failure |
| 2026-10-04 12:37Z | pull_request |
failure |
| 2026-09-28 / 09-21 | schedule |
success |
Seven runs, split perfectly by event and never by data: every schedule run is
success, every pull_request run is failure, all reporting identical findings.
On the pull_request path the action posts a failing check status onto the PR, which
is a different surface from the run conclusion — that, not a change in vulnerability
data, is why this PR is red.
Consequence
main is not gated by this workflow in practice: its scheduled runs pass while 7
advisories are open, and code-only commits do not run it. The advisory surface is real
(it has issues: write and checks: write, so it should be filing), but the run-level
gate is not enforcing. Tracking that on #83; this PR remains unaffected either way,
since its own audit output is identical to main's and its lockfile diff is only
async-trait 0.1.89 -> 0.1.92 plus syn 3.0.6, neither of which is flagged.
Refs #86
Audit-gate mechanism, hardened (and one alternative falsified)This supersedes my previous note on the mechanism. Two corrections to how I supported it. Correction 1 — "identical findings" is not an accident of the eventIt was reasonable to suspect main's
Identical database, identical commit, identical 7 findings — and opposite conclusions. Correction 2 — my earlier "no push run exists" was wrong; here is the real historyI claimed
So main's tip has never been audited by a push. The last time a push-triggered audit The resulting statement about enforcementThe Unchanged and separately verified: this PR's audit output is identical to main's, and Refs #86 |
b8a35b6 to
98da6c4
Compare
|
Closing as duplicate — the async-trait 0.1.92 bump landed via #94 (merged, cleared the clippy wall). Thanks for the equivalent work. |
Bump
async-trait0.1.89 -> 0.1.92 to fixclippy::double_must_useon CI.The problem
clippy::double_must_usedenies a#[must_use]attribute that carries no messageon a function returning a type that is already
#[must_use]. Under-D warningsthat is a hard error, and
ci.ymlruns:Four sites fail, all in
pawan-core:Why a source grep finds nothing
None of those four items carries
#[must_use].#[async_trait]generates it:In
async-trait0.1.89,src/expand.rs:69:The expansion returns a
Future, which is already#[must_use]— hence "a typealready considered as
#[must_use]".async-trait0.1.92 removes that line.must_useoccurrences acrosssrc/:0.1.89 = 1, 0.1.92 = 0, and the
expand.rsdiff is exactly that deletion. Theattribute is never emitted, so the diagnostic cannot arise.
Why not
#[allow]An
#[allow(clippy::double_must_use)]on the four traits would mute a symptom whosecause is a single line in a dependency, and would need re-litigating at every new
#[async_trait]use. This removes the cause.Change scope
Lockfile-only. The workspace pin is already
async-trait = "0.1"(caret), so nomanifest edit is needed or wanted — pinning to
0.1.92would narrow the acceptedrange.
The
syn3.x addition is forced byasync-trait0.1.92's own manifest(
syn = "3"), not collateral: 0.1.89 requiredsyn = "2.0.46". The lockfile holdsall three (
syn1.0.109, 2.0.117, 3.0.6) for different dependents; no duplicates.Diff: 14 insertions, 3 deletions,
Cargo.lockonly.Verification
Under 1.99.0, which is what CI's floating
@stableresolves to:cargo clippy -p pawan-core -- -D warningsEXIT=0, 0 errorscargo test -p pawan-coreEXIT=0— 1037 passed, 0 failedThe
syn2.x -> 3.x major bump is covered by the test run, not just the lint gate.Before this change, the same toolchain on the same crate produced 4 errors at exactly
the four sites above.
Limits worth stating
lint. Green on the local default toolchain is not evidence this is fixed — only a
1.99.0 run is. CI's floating
@stableis what actually catches it.pawan-core, the crate that failed. I have not run a cleanfull-workspace
-D warningspass on this exact lockfile.@stablefloats, a still-newer stable may surface unrelated lints. Thisaddresses this lint only.
Refs #86