feat(win32): taskbar jump lists with recent directories and profiles (#126) - #182
Conversation
|
Warning Review limit reachedNext included review available in 29 minutes. View limit detailsLimit details: You’ve used all 2 included reviews currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Team Run ID: 📒 Files selected for processing (6)
📝 WalkthroughWalkthroughAdds native Windows taskbar jump lists for recent working directories and detected shell profiles. The implementation persists bounded state, builds shell links, integrates with Win32 startup and profile events, and documents the behavior. It also adds timeout-safe WSL distribution enumeration. ChangesWindows taskbar jump lists
WSL distribution enumeration
Estimated code review effort: 5 (Critical) | ~90 minutes Merge Risk: 🔵 Low · up to This PR adds Windows taskbar launches for recent directories and shell profiles. A profile-discovery failure could leave a small number of process-related handles open, while the accompanying documentation needs minor navigation and metadata updates; the PR remains mergeable with owner awareness of these bounded follow-ups. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Full details: Linked Issues checkExplanation The implementation satisfies issue Full details: Out of Scope Changes checkExplanation The changes are within scope for issue Full details: Docstring CoverageExplanation No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0 files. (7 skipped: 7 unsupported.) Full details: Description checkExplanation The description clearly explains the feature, implementation, validation, risks, follow-ups, scope, and review outcomes. It includes the required Summary and Validation content, while Residuals / user steps covers the Risks / Follow-ups section. Some stale text says live desktop validation was not completed, but the objectives report that live Windows 11 verification passed. ✨ 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 |
Reviewer's GuideAdds a Windows-native taskbar jump list with persisted recent directories and detected shell profiles, integrating raw COM shell-link construction and removed-destination handling into debounced Win32 lifecycle updates. Sequence diagram for taskbar jump list updates and launchessequenceDiagram
participant App as Win32 App
participant JumpList
participant Persistence
participant Shell as Windows Shell
participant User
participant Noctty
App->>JumpList: startup()
JumpList->>Persistence: readFileBoundedAlloc()
JumpList->>JumpList: schedule()
JumpList->>App: takeStartupProfileDiscovery()
App->>App: ensureProfiles()
App->>JumpList: updateProfiles()
JumpList->>JumpList: schedule()
App->>JumpList: noteRecent(path)
JumpList->>JumpList: schedule()
JumpList->>JumpList: handleTimer(timer_id)
JumpList->>Shell: BeginList()
Shell-->>JumpList: removed destinations and slot budget
JumpList->>Shell: AppendCategory(Recent)
JumpList->>Shell: AppendCategory(Profiles)
JumpList->>Shell: CommitList()
JumpList->>Persistence: writeFileAtomic()
User->>Shell: Select jump-list entry
Shell->>Noctty: Launch exe with working-directory or profile arguments
File-Level Changes
Assessment against linked issues
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
| if (self.primarySurface()) |surface| { | ||
| if (surface.host) |host| { | ||
| if (jump_list.takeStartupProfileDiscovery() and host.profiles == null) { | ||
| _ = host.ensureProfiles() catch |err| { | ||
| log.warn("jump list deferred profile discovery failed err={}", .{err}); | ||
| }; | ||
| } |
There was a problem hiding this comment.
Headless startup drops profile discovery
When initial-window=false, the startup timer can fire before any primary surface exists. handleTimer stops the one-shot timer, but profile discovery is consumed only inside the primary-surface/host guard, so ensureProfiles() never runs. Creating the first window does not reschedule or consume the pending work, leaving the Profiles jump-list category absent until an unrelated profile UI action loads profiles. Consume pending discovery when the first host is created, or retain bounded retry work until a host is available and rebuild the jump list afterward.
Artifacts
Executable validation source for the headless profile-discovery timer path
- Python validation source reads and asserts the exact production control flow, then executes headless and initial-window state simulations; it provides a repeatable direct check of the affected path.
Initial-window control shows profile discovery publishes Profiles
- Executed control run with `initial-window=true` shows the timer consumes discovery, loads a detected profile, and publishes it to the jump list; the normal window-present condition works.
Headless startup shows timer stops without profile publication
- Executed headless run with `initial-window=false` shows no primary surface, stopped timer, retained pending discovery, no host profiles, no jump-list profile publication, and no creation reschedule; the reported failure is reproduced.
Zig build attempt blocked before Win32 path compilation
- After downloading Zig 0.15.2, the attempted filtered build exited 1 because `fontconfig` is not declared in build.zig.zon; no native Windows executable path could be run.
Ran code and verified through T-Rex
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/apprt/win32.zig
Line: 3010-3016
Comment:
**Headless startup drops profile discovery**
When `initial-window=false`, the startup timer can fire before any primary surface exists. `handleTimer` stops the one-shot timer, but profile discovery is consumed only inside the primary-surface/host guard, so `ensureProfiles()` never runs. Creating the first window does not reschedule or consume the pending work, leaving the Profiles jump-list category absent until an unrelated profile UI action loads profiles. Consume pending discovery when the first host is created, or retain bounded retry work until a host is available and rebuild the jump list afterward.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.fd09b0f to
267ede5
Compare
e465408 to
f654189
Compare
|
@coderabbitai review Re-requesting a full pass now that this branch has settled. Context so you can spend your budget where it matters: What this does: a native Windows taskbar jump list ( Already found and settled by a prior adversarial round (please don't re-litigate unless you have new evidence): the argument-injection path was traced end to end — Where I want scrutiny:
|
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== Changed files ==='
git diff --name-status origin/main...HEAD
echo '=== Diff statistics ==='
git diff --stat origin/main...HEAD
echo '=== Jump-list diff ==='
git diff --find-renames --unified=80 origin/main...HEAD -- src/apprt/win32_jump_list.zig
echo '=== Integration and persistence diffs ==='
git diff --find-renames --unified=50 origin/main...HEAD -- \
src/apprt/win32.zig \
src/apprt/win32_session_persistence.zig \
src/apprt/win32/sys.zigLength of output: 111987 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== Target module outline ==='
ast-grep outline src/apprt/win32_jump_list.zig --items all --view expanded
echo '=== Session-persistence outline ==='
ast-grep outline src/apprt/win32_session_persistence.zig --items all --view expanded
echo '=== Windows profile types and key construction ==='
profile_file=$(fd -a '^windows_shell\.zig$' src | head -n 1)
printf '%s\n' "file=$profile_file"
ast-grep outline "$profile_file" --items all --view expanded
rg -n -C 5 '\b(Profile|key|listProfiles|deinitProfiles)\b' "$profile_file"
echo '=== Profile launch and jump-list notification call sites ==='
rg -n -C 8 '\b(noteProfileUsed|createProfileSurface|openSelectedProfile|quickOpenProfileIndex|reloadProfiles|ensureProfiles)\b' src/apprt/win32.zig
echo '=== Atomic persistence helper and its tests ==='
rg -n -C 12 '\b(writeFileAtomic|replaceFileAtomic|readFileBoundedAlloc)\b' src/apprt/win32_session_persistence.zigLength of output: 35215 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== Profile construction ==='
sed -n '420,525p' src/config/windows_shell.zig
echo '=== Jump-list state and rebuild transaction ==='
sed -n '250,455p' src/apprt/win32_jump_list.zig
sed -n '585,830p' src/apprt/win32_jump_list.zig
echo '=== Existing raw COM implementation for declaration comparison ==='
taskbar_file=$(fd -a '^win32_taskbar_progress\.zig$' src | head -n 1)
printf '%s\n' "file=$taskbar_file"
sed -n '1,310p' "$taskbar_file"
echo '=== All direct application profile-surface construction call sites ==='
rg -n -C 6 '\bcreateProfileSurface\s*\(' src/apprt/win32.zig
echo '=== Jump-list tests for tombstones, persistence, COM layout, and retries ==='
rg -n -C 8 'test "jump_list (JSON|removed profile|rebuild retry|raw COM|property keys)' src/apprt/win32_jump_list.zigLength of output: 38260
The reviewed changes are ready from these areas. You are interacting with an AI system. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f654189bbb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Round 1 closed on this PR, plus live-desktop verification is now in. Bot round summary at
No code change was needed in this round, so the head is unchanged at Live verification (performed by the desktop lane, not by me — artifacts under |
|
@coderabbitai review @codex review Final pre-merge review pass. This PR has already been through adversarial review and at least one bot round; findings were triaged as fix / decline-with-evidence / follow-up rather than applied blindly, so some flagged items are deliberate design with reasoning recorded in-thread. Please focus on anything that would be wrong at merge time: stale claims in the description versus the current head, cross-PR interactions, and correctness of security-relevant paths. If you flag something previously declined, please engage with the recorded reasoning rather than restating the original finding. |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== PR metadata ==='
gh pr view 182 --repo amanthanvi/noctty --json number,title,state,isDraft,baseRefName,headRefName,headRefOid,mergeStateStatus,url,body,commits
echo '=== Current checkout ==='
git status --short
git rev-parse HEAD
git branch --show-current
echo '=== Changed files against merge base ==='
git diff --name-status origin/main...HEAD
git diff --stat origin/main...HEAD
echo '=== Commit subjects on PR ==='
git log --format='%H %s' origin/main..HEAD
echo '=== Relevant module outlines ==='
ast-grep outline src/apprt/win32_jump_list.zig --items all --view expanded
ast-grep outline src/apprt/win32.zig --items all --view expanded
ast-grep outline src/apprt/win32_session_persistence.zig --items all --view expanded
echo '=== Relevant full diff ==='
git diff --find-renames --unified=60 origin/main...HEAD -- \
src/apprt/win32_jump_list.zig \
src/apprt/win32.zig \
src/apprt/win32_session_persistence.zig \
src/apprt/win32/sys.zig \
docs/status.md \
docs/windows.md \
docs/windows-capability-matrix.md
echo '=== Current PR comments and reviews ==='
gh pr view 182 --repo amanthanvi/noctty --commentsLength of output: 176352 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== Jump-list implementation, remaining sections ==='
sed -n '430,760p' src/apprt/win32_jump_list.zig
sed -n '760,1120p' src/apprt/win32_jump_list.zig
sed -n '1120,1450p' src/apprt/win32_jump_list.zig
echo '=== Profile model and launch contract ==='
sed -n '380,560p' src/config/windows_shell.zig
rg -n -C 8 --glob '*.zig' \
'(parseCLI|initial-command|working-directory|createProfileSurface\s*\(|noteProfileUsed\s*\()' \
src
echo '=== Jump-list call sites and timer declarations ==='
rg -n -C 6 --glob '*.zig' \
'(initializeJumpList|scheduleIfStartupPending|handleTimer|updateProfiles|noteRecent|jump_list|WM_TIMER)' \
src/apprt/win32.zig src/apprt/win32_jump_list.zig
rg -n -C 4 --glob '*.zig' \
'(extern.*SetTimer|pub extern.*SetTimer|SetTimer|KillTimer|type MSG|pub const MSG)' \
src/apprt/win32/sys.zig
echo '=== Persistence helper behavior ==='
sed -n '1,180p' src/apprt/win32_session_persistence.zig
echo '=== Live verification evidence ==='
if [ -d evidence/182 ]; then
fd -t f . evidence/182 -x sh -c 'echo "--- $1"; file "$1"; sed -n "1,160p" "$1" 2>/dev/null || true' sh {}
else
echo 'evidence/182 is absent from the current PR checkout'
fi
echo '=== Referenced PR state and current merge bases ==='
for pr in 177 186; do
echo "--- PR #$pr"
gh pr view "$pr" --repo amanthanvi/noctty --json number,state,isDraft,headRefName,headRefOid,baseRefName,title,url 2>&1 || true
done
echo '=== Documentation dates and live-validation claims ==='
rg -n -C 3 --glob '*.md' \
'(Last updated|Last reviewed|Not validated on a live desktop|live.desktop|jump list)' \
docs README.md 2>/dev/null || trueLength of output: 157206
I found no new actionable code issue. I rechecked the security-relevant argument path, the thread-timer dispatch guard, the COM transaction cleanup path, persistence bounds, and the One merge-time documentation item remains:
The concurrent-writer behavior remains documented last-writer-wins. I did not restate it as a defect because the recorded rationale explicitly accepts the MRU-state tradeoff.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f654189bbb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@coderabbitai full review |
|
|
|
Codex Review: Didn't find any major issues. Bravo. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
#182 Reload and merge the latest state under a process-shared file lock so concurrent noctty instances preserve each other's model events. Persist explicit recent removals and keep profile-use overrides live across failed COM rebuilds. Keep deferred profile discovery pending until it succeeds, and accept removed destinations from older executable paths because BeginList already scopes them to noctty's AUMID.
|
Addressed all seven current review threads in c333091. Cross-process persistence now locks, reloads, and applies event deltas; recent removals persist as bounded tombstones; profile-use overrides survive failed COM retries; startup profile discovery remains pending and re-arms after failure; and removed destinations are trusted by the AUMID-scoped BeginList transaction rather than the current executable path. Validation: focused jump_list suite PASS, executable build PASS, emitted full suite PASS, git diff --check PASS. |
|
@coderabbitai review |
|
@codex review |
|
@coderabbitai review |
|
@codex review |
|
|
Codex Review: Didn't find any major issues. Bravo. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
|
@coderabbitai review |
|
@codex review |
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 97810a7bf6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@coderabbitai review |
|
@codex review |
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: cb1dfc9c15
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@greptileai review |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: cb1dfc9c15
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
|
@coderabbitai review |
|
@greptileai review |
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Summary Adds a native Windows taskbar jump list. Right-clicking the noctty taskbar button (pinned or running) offers a Recent category of recently used working directories and a Profiles category of the detected shell profiles; clicking an entry launches noctty into that directory or profile. Recents survive restarts. This is roadmap entry C12 and the first half of PRODUCT.md design principle 6 ("compete on every path into a terminal"). Fixes #126 ## Changes - New
src/apprt/win32_jump_list.zig:ICustomDestinationList+IObjectCollection/IObjectArray/IShellLinkW/IPropertyStoreover hand-written COM vtables, in the same raw style aswin32_taskbar_progress.zig. No COM framework was introduced. - Every link carriesSystem.AppUserModel.ID=io.github.amanthanvi.noctty(matchingwin32_aumid.zig) so the list attaches to the pinned taskbar button, plusPKEY_Title, the current exe as target, and the exe as icon. - Recent: drive-absolute local paths observed from the pwd stream that OSC 7 / OSC 9;9 already feed into surfaces, Unicode case-insensitively deduped viaCompareStringOrdinal, newest first, capped at 10, persisted atomically at%LOCALAPPDATA%\noctty\jump-list-recents.jsonthrough the existingwin32_session_persistencehelpers (no new store; that module only gains apubon its existing bounded reader). - Profiles: the samewindows_shell.Profilelist the in-app picker uses; links pass--command=/--initial-command=with the profile's argv, so no new CLI flag or config key was added. - Rebuilds run at startup and after real model changes, behind a 500 ms debounce on the existingWM_TIMERpath. Profile discovery is deliberately deferred until after the message loop is pumping so a slowwsl.exeenumeration cannot stall startup. - The shell's removed-destination list is honored each cycle; transient COM failures keep the model dirty and retry under a bounded budget,CO_E_NOTINITIALIZEDdisables rebuilds for the process, and an incomplete removed-list read aborts the transaction rather than publishing an empty list. Every HRESULT failure degrades silently to a debug/warn log. -src/apprt/win32.ziggains only additive hooks: one field, init/deinit, aWM_TIMERbranch, and pwd / profile-refresh notifications. - Docs:docs/status.mdrow, a "Launch topology" section indocs/windows.md(categories, storage path, how to clear),docs/windows-capability-matrix.mdrow. - A comment marks where named layouts (C17, #133) will add a third category and points atwin32_layouts.listNamesAlloc/launchArgvAllocfrom #186 so the follow-up consumes that hook instead of enumerating layouts here. No code for it in this PR. ## Validation Run in the team worktree at this commit: -zig fmt --check src→ onlysrc/build/uucode_tables.zig, a generated file that is unformatted at baseline onmain; every touched file is clean. -zig build -Demit-exe=true→ pass. -zig build test -Dtest-filter=jump_list→ 41/41 build steps, 76/77 tests passed, 1 skipped (the pre-existing baseline skip). -zig build test -Dtest-filter=session→ 41/41 build steps, 108/109 tests passed, 1 skipped. - Rebased ontomain@ 5220df4 and squashed to one commit. Re-validated there:zig build -Demit-exe=truepass,zig build test -Dtest-filter=jump_list77/78 passed,zig build test -Dtest-filter=session109/110 passed. - The one conflict with #177 was theWM_TIMER→c.WM_TIMERrename. While resolving it I also converted this module's duplicatedCoCreateInstance/GetCurrentProcessId/SetTimer/KillTimerexterns intoconst X = sys.X;aliases againstsrc/apprt/win32/sys.zig, so it follows the post-#177 convention and cannot drift.CompareStringOrdinalis not insys.zigand stays local. -pwsh -NoProfile -File scripts/check-source-format.ps1→ pass. - Full suitezig build test -Demit-test-exe=trueon theissues/127-explorer-context-menutip (which contains both PRs) → 41/41 build steps, 3790/3860 tests passed, 70 skipped, 0 failed. -pwsh -NoProfile -File test/windows/flagship/Test-VerificationContracts.ps1→Windows x64 baseline checker probes: PASS,flagship verification contracts: PASS (2 scenarios). Unit tests cover recent ordering/dedupe/cap and non-local rejection, JSON round-trip plus corrupt and oversized state, encoded-size limit and tombstone eviction, argument construction and Windows argv boundaries, slot budgeting, the retry cap, and vtable/PROPERTYKEY/PROPVARIANTfield offsets. An independent read-only review of this diff found no double-release, use-after-release, leak, ABI mismatch, or CLI-injection path, and confirmed the argument quoting round-trips through a liveCommandLineToArgvWprobe. Its four material findings (pre-message-loop WSL stall, a dropped rebuild after transient COM failure, an unbounded 2 Hz retry loop, and a writer that could exceed its own reader's size limit) are fixed in the first commit. Greptile then flagged that the deferred startup tick looked for a host throughprimarySurface(), which is null underinitial-window=false. It now readshostsdirectly, and host creation re-arms the debounce (scheduleIfStartupPending) so a windowless launch is not stranded without a Profiles category. This PR deliberately does not consume #186'swin32_layoutsseam or stack on it — named layouts are C17/#133, out of scope here. The comment hook names the exact API so the follow-up plugs in without reimplementing anything. ### Adversarial review dispositions (R-126/127, verdict APPROVE) - LOW, OSC-forged recents — fixed as far as it can be. A program inside a session can emit OSC 7 for any path that passesisRecentLocalPathand seed a Recent entry; that is inherent to the data source and activating an entry only sets a cwd.buildTitleAllocnow strips Unicode bidi/isolate controls (U+061C, U+200E/F, U+202A–E, U+2066–9) so a seeded entry cannot render as a path it does not point at, with a test covering a U+202E spoof, ordinary CJK/emoji, and invalid UTF-8. The provenance caveat is now a module-doc paragraph. - LOW,WM_TIMERswallow — fixed. The debounce is a thread timer (SetTimer(null, ...)), so the swallow now requires@intFromPtr(msg.hwnd) == 0and cannot eat a window timer whose numeric id collides. (msg.hwndis non-optionalHWNDinsys.MSG, hence the@intFromPtrform rather than== null.) - TRIM — taken. The two purealloc.dupetitle wrappers are gone, replaced by the singlebuildTitleAllocabove;writeWindowsArgis gone and the four call sites useCommand.writeDirectArgdirectly. - INFO, UI-thread fsync — unchanged, documented atpersist(). Cross-process recent and profile mutations are serialized under a nonblocking file lock and reconciled by per-key nanosecond event order. ## Residuals / user steps - Not validated on a live desktop. The agent session had no interactive desktop (GetForegroundWindow() == 0, noShell_TrayWnd), soCommitListwas rejected and no screenshots could be produced. Someone should, in a normal interactive session: pin the builtnoctty.exe,cdaround a couple of directories, restart it, right-click the taskbar button, and confirm both categories render and both kinds of entry launch correctly. - The debounced fsync and the COM commit run on the UI thread. This is deliberate — it matches how session state is already written, and moving it to a worker is more machinery than this feature warrants — but pathological storage or antivirus latency would be felt as UI stall. - Concurrent noctty processes serialize jump-list state updates throughjump-list-recents.json.lock. Each writer reloads the latest snapshot under the lock and applies only its pending recent/profile events; explicit recent removals are persisted as bounded tombstones so another stale process cannot immediately resurrect them. - A jump list needs an AUMID-matching taskbar button; dev builds without the Start Menu shortcut rely on the explicit process AUMID, which is the same constraint the toast pipeline already has. ## Summary by Sourcery Add native Windows taskbar jump lists for launching noctty into recent working directories or detected shell profiles. New Features: - Add native Windows taskbar jump lists with Recent working directories and Profiles detected from the terminal's shell profiles, launching noctty with the selected destination. Bug Fixes: - Preserve explicit working-directory launches instead of replacing them with restored session state. - Handle jump-list persistence and COM update failures without publishing incomplete or stale destination lists. Enhancements: - Persist recent directories and profile visibility across restarts and concurrent noctty processes with bounded, atomic state management. - Update jump lists from terminal directory and profile activity using debounced refreshes and deferred profile discovery. - Honor Windows taskbar removal actions and protect displayed paths from Unicode bidi spoofing. Documentation: - Document jump-list behavior, persistence, clearing instructions, and Windows capability support. Tests: - Add coverage for recent ordering, deduplication, validation, persistence, argument construction, removal handling, concurrency ordering, slot budgets, retry limits, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading. ## Summary by Sourcery Add native Windows taskbar jump lists for launching noctty through recent directories and detected shell profiles. New Features: - Add native Windows taskbar jump lists that launch noctty into recent working directories or detected shell profiles. Bug Fixes: - Preserve explicitly requested startup working directories instead of replacing them with restored session state. - Handle taskbar removal updates, transient COM failures, incomplete destination data, and concurrent persistence without publishing stale or incomplete lists. Enhancements: - Persist bounded recent-directory and profile visibility state across restarts and concurrent processes. - Refresh jump-list contents from shell activity with debounced updates and deferred, bounded profile discovery. - Protect displayed recent paths from Unicode bidirectional spoofing and enforce Windows jump-list slot budgets. Documentation: - Document jump-list categories, persistence and clearing behavior, and Windows capability support. Tests: - Add coverage for recent-directory validation, ordering, deduplication, persistence, argument construction, removal handling, concurrency ordering, retry limits, slot budgets, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading. ## Summary by Sourcery Add native Windows taskbar jump lists for launching noctty through recent directories and detected shell profiles. New Features: - Add native Windows taskbar jump lists with Recent working directories and Profiles categories that launch noctty with the selected destination. Bug Fixes: - Preserve explicitly requested working directories instead of replacing them with restored session state. - Handle taskbar removals, transient failures, invalid persisted events, and incomplete destination data without publishing stale or incomplete lists. - Prevent slow WSL profile enumeration from stalling startup. Enhancements: - Persist bounded recent-directory and profile visibility state across restarts and concurrent processes. - Refresh jump lists from shell activity with debounced updates and deferred profile discovery. - Validate and normalize recent paths, protect displayed titles from Unicode bidirectional spoofing, and respect taskbar slot budgets. Documentation: - Document taskbar jump-list categories, persistence and clearing behavior, and Windows capability support. Tests: - Add coverage for recent-directory validation, ordering, deduplication, persistence, argument construction, removal handling, concurrency ordering, retry limits, slot budgets, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading. ## Summary by Sourcery Add Windows taskbar jump lists that provide launch paths for recent working directories and detected shell profiles. New Features: - Add native Windows taskbar jump lists with Recent working directories and Profiles categories that launch noctty with the selected destination. Bug Fixes: - Preserve explicitly requested working directories during startup instead of replacing them with restored session state. - Handle taskbar removals, transient failures, invalid persisted state, and incomplete destination data without publishing stale or incomplete lists. - Prevent slow WSL profile enumeration from blocking startup. Enhancements: - Persist bounded recent directories and profile visibility across restarts and concurrent processes with debounced, atomic state updates. - Refresh jump-list contents from shell activity and profile changes while respecting removal actions, slot budgets, and Unicode bidirectional-text safety. Documentation: - Document taskbar jump-list categories, persistence and clearing behavior, and Windows capability support. Tests: - Add coverage for recent-directory validation, ordering, deduplication, persistence, argument construction, removal handling, concurrency ordering, retry limits, slot budgets, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading. ## Summary by Sourcery Add Windows taskbar jump lists that provide launch paths for recent working directories and detected shell profiles. New Features: - Add native Windows taskbar jump lists with Recent working directories and Profiles categories that launch noctty with the selected destination. Bug Fixes: - Ensure explicit working-directory launches bypass session restoration and preserve their requested destination. - Handle taskbar removals, transient failures, invalid persisted state, and incomplete destination data without publishing stale or incomplete lists. - Prevent slow WSL profile enumeration from blocking startup. Enhancements: - Persist bounded recent directories and profile visibility across restarts and concurrent processes with debounced, atomic state updates. - Refresh jump-list contents from shell activity and profile changes while respecting removal actions, slot budgets, and Unicode bidirectional-text safety. Documentation: - Document taskbar jump-list categories, persistence and clearing behavior, and Windows capability support. Tests: - Add coverage for recent-directory validation, ordering, deduplication, persistence, argument construction, removal handling, concurrency ordering, retry limits, slot budgets, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading. ## Summary by Sourcery Add Windows taskbar jump lists that provide launch paths for recent working directories and detected shell profiles. New Features: - Add native Windows taskbar jump lists with Recent working directories and Profiles categories that launch noctty with the selected destination. Bug Fixes: - Preserve explicitly requested working directories during startup instead of replacing them with restored session state. - Handle taskbar removals, transient failures, invalid persisted state, and incomplete destination data without publishing stale or incomplete lists. - Prevent slow WSL profile enumeration from blocking startup. Enhancements: - Persist bounded recent directories and profile visibility across restarts and concurrent processes with debounced, atomic state updates. - Refresh jump-list contents from shell activity and profile changes while respecting removal actions, slot budgets, and Unicode bidirectional-text safety. Documentation: - Document taskbar jump-list categories, persistence and clearing behavior, and Windows capability support. Tests: - Add coverage for recent-directory validation, ordering, deduplication, persistence, argument construction, removal handling, concurrency ordering, retry limits, slot budgets, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading. ## Summary by Sourcery Add Windows taskbar jump lists that provide launch paths for recent working directories and detected shell profiles. New Features: - Add native Windows taskbar jump lists with Recent working directories and Profiles categories that launch noctty with the selected destination. Bug Fixes: - Preserve explicitly requested working directories during startup instead of allowing session restoration to replace them. - Handle taskbar removals, transient failures, invalid persisted state, and incomplete destination data without publishing stale or incomplete lists. - Prevent slow WSL profile enumeration from blocking startup. Enhancements: - Persist bounded recent directories and profile visibility across restarts and concurrent processes with debounced, atomic state updates. - Refresh jump-list contents from shell activity and profile changes while respecting removal actions, slot budgets, and Unicode bidirectional-text safety. Documentation: - Document taskbar jump-list categories, persistence and clearing behavior, and Windows capability support. Tests: - Add coverage for recent-directory validation, ordering, deduplication, persistence, argument construction, removal handling, concurrency ordering, retry limits, slot budgets, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading. ## Summary by Sourcery Add Windows taskbar jump lists that provide launch paths for recent working directories and detected shell profiles. New Features: - Add native Windows taskbar jump lists with Recent working directories and Profiles categories that launch noctty with the selected destination. Bug Fixes: - Preserve explicitly requested working directories during startup without disabling subsequent session saves. - Handle taskbar removals, transient failures, invalid persisted state, and incomplete destination data without publishing stale or incomplete lists. - Prevent slow WSL profile enumeration from blocking startup. Enhancements: - Persist bounded recent directories and profile visibility across restarts and concurrent processes with debounced, atomic state updates. - Refresh jump-list contents from shell activity and profile changes while respecting removal actions, slot budgets, and Unicode bidirectional-text safety. Documentation: - Document taskbar jump-list categories, persistence and clearing behavior, and Windows capability support. Tests: - Add coverage for recent-directory validation, ordering, deduplication, persistence, argument construction, removal handling, concurrency ordering, retry limits, slot budgets, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading. ## Summary by Sourcery Add Windows taskbar jump lists that provide launch paths for recent working directories and detected shell profiles. New Features: - Add native Windows taskbar jump lists with Recent working directories and Profiles categories that launch noctty with the selected destination. Bug Fixes: - Preserve explicitly requested working directories during startup without allowing session restoration to replace them. - Handle taskbar removals, transient failures, invalid persisted state, and incomplete destination data without publishing stale or incomplete lists. - Prevent WSL profile enumeration failures or slow output from blocking startup and ensure retries remain bounded. Enhancements: - Persist bounded recent directories and profile visibility across restarts and concurrent processes with debounced, atomic state updates. - Refresh jump-list contents from shell activity and profile changes while respecting removal actions, slot budgets, and Unicode bidirectional-text safety. Documentation: - Document taskbar jump-list categories, persistence and clearing behavior, and Windows capability support. Tests: - Add coverage for recent-directory validation, ordering, deduplication, persistence, argument construction, removal handling, concurrency ordering, retry limits, slot budgets, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading. ## Summary by Sourcery Add Windows taskbar jump lists that provide reliable launch paths for recent working directories and detected shell profiles. New Features: - Add native Windows taskbar jump-list categories for recently used local working directories and detected shell profiles. - Launch noctty with the selected directory or profile from pinned or running taskbar buttons. Bug Fixes: - Preserve explicitly requested startup working directories without allowing session restoration to replace them. - Handle taskbar removals, invalid or incomplete persisted state, transient COM failures, and slow or failing WSL discovery without publishing stale lists or blocking startup. - Preserve session saving behavior after startup-only restore bypasses. Enhancements: - Persist bounded recent-directory and profile visibility state across restarts and concurrent processes with debounced, atomic updates. - Refresh destinations from shell directory and profile activity while enforcing slot budgets and protecting displayed paths from Unicode bidirectional spoofing. - Bound and safely drain WSL profile enumeration. Documentation: - Document taskbar jump-list categories, persistence and clearing behavior, and Windows capability support. Tests: - Add coverage for recent-directory validation, ordering, deduplication, persistence, argument construction, removal handling, concurrency ordering, retry limits, slot budgets, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading. ## Summary by Sourcery Add reliable Windows taskbar jump lists for launching noctty through recent working directories and detected shell profiles. New Features: - Add native Windows taskbar jump-list categories for recently used local working directories and detected shell profiles, with entries that launch noctty into the selected destination. Bug Fixes: - Preserve explicitly requested startup working directories without allowing session restoration to replace them. - Handle taskbar removals, invalid or incomplete persisted state, transient COM failures, and WSL discovery failures without publishing stale lists or blocking startup. - Preserve session saving behavior when startup-only session restoration is bypassed. Enhancements: - Persist bounded recent-directory and profile visibility state across restarts and concurrent processes with debounced, atomic updates. - Refresh jump-list contents from shell activity and profile changes while respecting removal actions, slot budgets, and Unicode bidirectional-text safety. - Bound WSL profile discovery and allow deferred startup discovery to recover after transient failures. Documentation: - Document jump-list categories, persistence and clearing behavior, and Windows capability support. Tests: - Add coverage for recent-directory validation, ordering, deduplication, persistence, argument construction, removal handling, concurrent event ordering, retry limits, slot budgets, profile discovery, and Win32 ABI contracts. Chores: - Expose bounded file reading from the existing Windows session persistence module for jump-list state loading.Summary by Sourcery
Add reliable Windows taskbar jump lists for launching noctty through recent working directories and detected shell profiles.
New Features:
Bug Fixes:
Enhancements:
Documentation:
Tests:
Chores:
- Expose bounded file reading from the existing Windows session persistence module for jump-list state loading.
## Summary by CodeRabbit ## New Features - Added native Windows taskbar jump lists for quickly launching recent working directories and detected shell profiles. - Jump-list entries are available from pinned or running taskbar buttons and persist across sessions. - Removed destinations are tracked and can be cleared when no longer available. ## Bug Fixes - Improved Windows Subsystem for Linux distribution detection to avoid hangs and handle timeouts safely. - Explicit working-directory launches no longer restore previous sessions unexpectedly. ## Documentation - Documented jump-list availability, behavior, persistence, and clearing instructions.Final review-cycle validation
7b152d1deff45cc42f7d0eaaf680796701d5e5b1on currentmainbasedae792245e77b3aa45e5248a4dba5fd91971b39d.zig fmt --check src/apprt/win32.zig src/config/windows_shell.zigandgit diff --checkpass.zig build test -Dtest-filter=WSL,zig build test -Dtest-filter=jump_list, and the fullzig build test -Demit-test-exe=truesuite pass; emitted access-denied and file-lock traces are expected negative-test diagnostics.