← Commit history

Publish 0.6.2

John Lauer ·db36b5c338 ·3mo ago ·parent b74922a
7 files changed +37−9
Cargo.toml+1−1
@@ -1,6 +1,6 @@ [package] name = "adom-shotlog"-version = "0.6.1"+version = "0.6.2" edition = "2021" description = "Screenshot log viewer and CLI for Adom" license = "MIT"
SKILL.md+21
@@ -12,6 +12,27 @@ description, source, and **both** the stored and original resolution.  Binary: `/usr/local/bin/adom-shotlog` (the `shotlog` command is a back-compat alias). +## ⚠ WHY THIS EXISTS: you can't show the human images in a text thread++When you run as **Claude Code (VSCode / any text-only thread)** you **CANNOT+display an image to the human.** Calling `Read` on a PNG, or taking a+`desktop_screenshot` / pup screenshot, loads the image into **your** context —+the human sees **nothing** in the thread. (Maybe someday Claude Code renders+images inline; until then, assume it can't.)++So, as an ironclad rule:++- **NEVER** write "see the screenshot above", "look at this image", "as shown+  below", or any phrase that assumes the human can see a picture in the thread.+  To them it's a blank reference — this exact failure is the whole reason shotlog+  exists.+- The **only** way the human sees an image is on a surface they actually have+  open: the **shotlog viewer** (webview / pup / phone), or a **URL you hand them**.+  So `inject` it into a channel they're viewing, **verify** they're watching+  (`shotlog viewers -c <ch>` — see below), and refer them to *that surface*+  ("in the shotlog viewer" / "the pup window on your screen" / a link), never to+  an inline image.+ ## Inject — one command  ```bash
VERSION+1−1
@@ -1 +1 @@-0.6.1+0.6.2
bin/adom-shotlog
⋯ 1 unchanged line ⋯
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-shotlog",-  "version": "0.6.1",+  "version": "0.6.2",   "type": "app",   "title": "Adom Shotlog",   "description": "See the shots your AI never showed you \u2014 and know it actually SAW them. adom-shotlog streams every screenshot the AI gathers into a live gallery (webview/pup/browser/phone), reports whether a human is really watching + on which surface, and ingests Adom Desktop owned-popup arrays via --meta.",
page.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "adom-shotlog",-  "version": "0.6.1",+  "version": "0.6.2",   "type": "app",   "title": "Adom Shotlog",   "description": "See the shots your AI never showed you — and know it actually SAW them. adom-shotlog streams every screenshot the AI gathers into a live gallery (webview/pup/browser/phone), reports whether a human is really watching + on which surface, and ingests Adom Desktop owned-popup arrays via --meta.",
src/main.rs+12−5
@@ -452,20 +452,27 @@ fn run_inject(                     let surfaces = getvec("surfaces");                     let visible = val.get("visible_viewers").and_then(|v| v.as_u64()).unwrap_or(0);                     let vis_surf = getvec("visible_surfaces");-                    // The hint the human asked to ride on EVERY inject.+                    // Two reminders ride on EVERY inject:                     let verify = "Are you sure the human is seeing the shotlog? Is it open in a webview or pup? Have you verified it's truly showing?";+                    // The core reason shotlog exists — image-blindness in text threads.+                    let cant_show = "You're in Claude Code / a text thread: you CANNOT display images to the human. Reading or capturing a screenshot loads it into YOUR context, not their view — so NEVER write \"see the screenshot above\" / \"look at this image\". This viewer is the ONLY way they see it: point them to the viewer or a URL.";+                    // Status line (state-specific), then the two universal reminders,+                    // then any state-specific follow-up.                     if visible > 0 {                         let s = if vis_surf.is_empty() { String::new() } else { format!(" [{}]", surface_label(&vis_surf)) };                         ok(&format!("{visible} of {viewers} viewer(s) ON-SCREEN{s} — a human can see this shot."));-                        hint(verify);                     } else if viewers > 0 {                         let s = if surfaces.is_empty() { String::new() } else { format!(" [{}]", surface_label(&surfaces)) };                         warn(&format!("{viewers} viewer(s) connected to '{channel}'{s} but ALL are BACKGROUNDED / minimized — the human is NOT looking right now."));-                        hint(verify);-                        hint(&format!("Bring the viewer to the FOREGROUND (the pup window / webview tab / phone), then re-check: `shotlog viewers -c {channel}`."));                     } else {                         warn(&format!("NO live viewer is connected to '{channel}' — the human is NOT seeing this shot."));-                        hint(verify);+                    }+                    hint(cant_show);+                    hint(verify);+                    if visible == 0 && viewers > 0 {+                        hint(&format!("Bring the viewer to the FOREGROUND (the pup window / webview tab / phone), then re-check: `shotlog viewers -c {channel}`."));+                    }+                    if viewers == 0 {                         hint(&format!("Open it, then RE-CHECK before continuing: `shotlog open -c {channel}` (Hydrogen webview) — or load the viewer in pup / on the phone — then `shotlog viewers -c {channel}`."));                         hint("A viewer was force-opened as a fallback, but do NOT assume the human sees it — verify their actual surface.");                     }