diff options
| author | Craig Jennings <c@cjennings.net> | 2026-08-20 06:13:35 -0700 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-08-20 06:13:35 -0700 |
| commit | 23d1d998995a776b5c184c6719602b1aba2c1d41 (patch) | |
| tree | 848e5806f6eca0b826a84e4d20ebc1ddacf5d2d4 /.ai/workflows/triage-intake.cmail.org | |
| parent | ca1bb871417afafc319c115d6ae69fa8cd3fe53c (diff) | |
| download | rulesets-23d1d998995a776b5c184c6719602b1aba2c1d41.tar.gz rulesets-23d1d998995a776b5c184c6719602b1aba2c1d41.zip | |
fix(cmail): install cmail-action on PATH instead of per-project copies
protocols.org said cmail-action was symlinked into ~/.local/bin and on PATH from any project. It wasn't on any machine. The only copies were the per-project .ai/scripts/cmail-action.py the template sync delivers, so the documented invocation died with command not found.
The claim wasn't aspirational. A provisioning script used to create that symlink from ~/projects/claude-templates/, and that path went away when claude-templates became a subtree here. The doc outlived its mechanism.
The script has no project coupling (every path in it is under $HOME against a hardcoded bridge address). I moved it to claude-templates/bin/, which make install already links. The documented command is now true, and 17 copies collapse to one.
Its test moved to scripts/tests/ and needed an explicit SourceFileLoader, because dropping the .py suffix stops importlib inferring one from the extension. The test target gained a pytest pass over scripts/tests. Without it the move would have dropped 57 tests while still reporting green.
triage-intake's cmail gate now tests command -v cmail-action rather than a file path, so it checks what it runs. protocols.org names the repair when the command is missing, and names Proton Bridge as a precondition.
Diffstat (limited to '.ai/workflows/triage-intake.cmail.org')
| -rw-r--r-- | .ai/workflows/triage-intake.cmail.org | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/.ai/workflows/triage-intake.cmail.org b/.ai/workflows/triage-intake.cmail.org index 8d8abfb..66ecf80 100644 --- a/.ai/workflows/triage-intake.cmail.org +++ b/.ai/workflows/triage-intake.cmail.org @@ -8,7 +8,7 @@ * Source: cmail :PROPERTIES: :ORDER: 25 -:ENABLED: test -f .ai/scripts/cmail-action.py +:ENABLED: command -v cmail-action :ANCHOR: none :SUBAGENT_OVER: 50 :END: @@ -18,7 +18,7 @@ Proton (=c@cjennings.net=) via the bridge script. =ANCHOR: none= because this reports live IMAP unread *state*, not a since-window — the engine substitutes no cutoff. Phase B uses the anchor only to flag which of the current unread arrived since last check. #+begin_src bash -python3 .ai/scripts/cmail-action.py list-unread +cmail-action list-unread #+end_src JSON output, keyed by UID. The script ignores messages already flagged =\Deleted= (those are pending-flush on the next Proton sync), so the list is the genuinely-live unread set. @@ -47,7 +47,7 @@ Omit if zero unread. All take one or more UIDs (from the =list-unread= JSON): -- mark-read :: =python3 .ai/scripts/cmail-action.py mark-read <uid>= -- star :: =python3 .ai/scripts/cmail-action.py star <uid>= -- unstar :: =python3 .ai/scripts/cmail-action.py unstar <uid>= -- trash :: =python3 .ai/scripts/cmail-action.py trash <uid>= (flags =\Deleted=; flushed on next Proton sync) +- mark-read :: =cmail-action mark-read <uid>= +- star :: =cmail-action star <uid>= +- unstar :: =cmail-action unstar <uid>= +- trash :: =cmail-action trash <uid>= (flags =\Deleted=; flushed on next Proton sync) |
