<feed xmlns='http://www.w3.org/2005/Atom'>
<title>duet/tests/test-duet-smoke.el, branch main</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>https://git.cjennings.net/duet/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/duet/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/duet/'/>
<updated>2026-06-06T18:51:28+00:00</updated>
<entry>
<title>feat: add the commander mode, F-key map, and two-pane entry</title>
<updated>2026-06-06T18:51:28+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-06T18:51:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/duet/commit/?id=a4b332929099ad42c893b6940dcf43f1d48914a6'/>
<id>urn:sha1:a4b332929099ad42c893b6940dcf43f1d48914a6</id>
<content type='text'>
The duet command lays out two side-by-side dired panes, each in the buffer-local duet-mode, which carries the mc/Norton F-key map (F3 view, F4 edit, F5 copy, F6 move, F7 mkdir, F8 delete, F10 quit). The map is a minor-mode keymap, so the single-key actions fire only inside a pane and leave the global F-keys untouched elsewhere. duet-quit restores the window layout from before launch (Phase 4 in the design spec).

duet--other-pane is the explicit other-pane resolution that replaces dired-dwim-target, the dirvish#36 fix. Its logic lives in a pure helper, duet--sibling-pane, that takes the active window and the list of commander panes and returns the sibling, erroring clearly when there are not exactly two. Keeping the decision pure makes the dangerous part testable without a live frame.

DUET does not depend on dirvish. A pane is a plain dired buffer, and when the user has dirvish rendering dired buffers it renders as dirvish with no extra work. That keeps dirvish recommended but never required, and avoids binding the package to a specific dirvish entry point.

The transfer and file actions are stubs that announce themselves until their phases land, so the keys are bound and their precedence is tested now. The pure selector, the keymap, and minor-mode precedence are unit-tested; the live two-pane launch and the F-key feel in a running Emacs are a manual check.
</content>
</entry>
<entry>
<title>test: cover the remaining failure, contract, and safety branches</title>
<updated>2026-06-06T16:37:39+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-06T16:37:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/duet/commit/?id=0930ec3c259d93a68fc59854677cdc7fef634e71'/>
<id>urn:sha1:0930ec3c259d93a68fc59854677cdc7fef634e71</id>
<content type='text'>
The bug fixes raised line coverage on duet.el to 92.3%. This closes the rest. The new tests exercise the branches a review would want locked down before execution and UI build on this core: each arm of the minimal failure normalizer (missing executable, stall, signal cancellation, unknown-without-exit), a :match predicate rather than a regexp, the rsync normalizer mapping known stderr to permission/space/protocol classes, the capability-tier contract check, an explicit :async override, the case-collision path through the safety composite's injected predicates, and redaction of a pattern with no capture group.

Line coverage on duet.el is now 100%. The one deliberately trivial case left is the entry command, a not-yet-implemented stub that errors. Its test asserts that and will change when the pane layout lands.
</content>
</entry>
<entry>
<title>build: add Eask, test harness, and dev tooling</title>
<updated>2026-06-06T15:31:30+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-06T15:31:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/duet/commit/?id=95dbb5abdbb746cf5da9f7926740d17205ac8d55'/>
<id>urn:sha1:95dbb5abdbb746cf5da9f7926740d17205ac8d55</id>
<content type='text'>
I brought the skeleton up to a working package baseline (Phase 0 in the design spec). Eask defines the package and its dev deps. A root Makefile delegates test targets to tests/Makefile and adds compile, coverage, lint, doctor, and clean, matching the layout the other packages use.

deps installs both halves DUET needs: the Emacs Lisp deps via eask, and the transport CLIs (rsync, rclone, lftp, unison) via the system package manager, so a contributor's environment is ready before the code that shells out to them.

make complexity runs a small homegrown McCabe branch counter (scripts/duet-complexity.el). No off-the-shelf tool measures Emacs Lisp: lizard doesn't support it and codemetrics is an interactive overlay, so DUET owns one. The counting is pure and covered by Normal/Boundary/Error tests. The budget is soft and the target is advisory.

The ERT harness (bootstrap, check-deps, per-file undercover coverage) and a smoke test prove the loop works end to end.
</content>
</entry>
</feed>
