@ngockhoale/ukit 1.6.7 → 1.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  All notable changes to UKit are documented here.
4
4
 
5
+ ## 1.6.8 - 2026-08-09
6
+
7
+ ### Fixed
8
+
9
+ - **`extract-image.mjs`** no longer re-arms `pending-<sha>.json` for an image that already has an `analyzed-<sha>.json` receipt. `selectImages()` always returns the most recent N images from the whole transcript, so a fully-analyzed image never fell out of that window on its own; since `vision-router.sh` calls `--mark-pending` on every prompt, this re-triggered the vision hint/gate on the same closed-out image forever, even on unrelated prompts. Both `--detect` and `--mark-pending` now skip any sha with an existing analyzed receipt.
10
+
5
11
  ## 1.6.7 - 2026-08-09
6
12
 
7
13
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngockhoale/ukit",
3
- "version": "1.6.7",
3
+ "version": "1.6.8",
4
4
  "description": "Install/update an index-first AI workspace for Claude Code, Antigravity, OpenAI Codex, and OpenCode.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -315,8 +315,16 @@ function main() {
315
315
 
316
316
  const lines = sessionPath ? readLines(sessionPath) : [];
317
317
  const blocks = extractImageBlocks(lines);
318
- const selected = selectImages(blocks, opts.limit);
319
- const refs = resolveRefs(opts.refs);
318
+ const markerDir = path.join(outDir, sessionId);
319
+ // selectImages() picks the most recent N images from the WHOLE transcript, so a resolved
320
+ // image never falls out of that window on its own — without this filter, --mark-pending
321
+ // (called on every prompt by vision-router.sh) would re-arm pending-<sha>.json for the same
322
+ // already-analyzed image forever, re-triggering the vision hint/gate on unrelated prompts.
323
+ // A sha with an existing analyzed-<sha>.json receipt is a closed, content-addressed case:
324
+ // identical bytes already produced that analysis, so skipping it loses no information.
325
+ const isAlreadyAnalyzed = (sha) => fs.existsSync(path.join(markerDir, `analyzed-${sha}.json`));
326
+ const selected = selectImages(blocks, opts.limit).filter((img) => !isAlreadyAnalyzed(img.sha));
327
+ const refs = resolveRefs(opts.refs).filter((ref) => !isAlreadyAnalyzed(ref.sha));
320
328
 
321
329
  // --detect is report-only, so it must not short-circuit --mark-pending when both are
322
330
  // passed together. vision-router.sh combines them; short-circuiting here would arm
@@ -327,7 +335,6 @@ function main() {
327
335
  }
328
336
 
329
337
  if (opts.markPending) {
330
- const markerDir = path.join(outDir, sessionId);
331
338
  if (selected.length > 0 || refs.length > 0) {
332
339
  try {
333
340
  fs.mkdirSync(markerDir, { recursive: true });