@floh-solutions/pharos-cli 0.17.0 → 0.17.2

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/skill/SKILL.md +48 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floh-solutions/pharos-cli",
3
- "version": "0.17.0",
3
+ "version": "0.17.2",
4
4
  "description": "Azure DevOps from a headless shell, for an agent: the whole context of a task in one call, and the wiki/comment verbs Microsoft's MCP server does not ship.",
5
5
  "license": "UNLICENSED",
6
6
  "author": "FLOH Solutions",
package/skill/SKILL.md CHANGED
@@ -251,21 +251,59 @@ Two ways this fails **silently**, both measured on a real work item:
251
251
  deck and looks like it worked. For a slide deck, or a scanned PDF, the payload
252
252
  is usually the images — extract them and actually look at them.
253
253
 
254
- **Known-good on a Claude Code machine provisioned by us, measured 2026-08-08.**
255
- Conditional on purpose: this skill also runs under other agents on machines
256
- nobody here set up, so read a missing command as "find your own", not as a bug.
254
+ ### First ask whether you read PDFs natively. If you do, this is one command.
255
+
256
+ Many agents Claude Code among them — read a PDF **visually**, page by page,
257
+ the way a person looks at it. That covers a scan with no text in it at all, with
258
+ no OCR step. If that is you, the whole problem collapses to one conversion:
259
+
260
+ ```bash
261
+ soffice --headless --convert-to pdf f.docx --outdir ./out # .pptx, .xlsx too
262
+ # then read ./out/f.pdf with your own file-reading tool
263
+ ```
264
+
265
+ **This is the route that keeps the pictures**, which is the whole failure this
266
+ section is about. Measured on the deck described above — the one whose seven
267
+ text fragments lost the specification: converted to PDF and read, it gives up
268
+ the flow diagram, the screenshot of the configuration UI with its actual
269
+ threshold values, and every row and column of the target output table. One
270
+ command, one read, nothing dropped. The same is true of a `.docx` whose content
271
+ is in a chart or a screenshot.
272
+
273
+ Prefer it whenever layout or images might carry meaning — a deck always, a
274
+ report usually, a spreadsheet when the shape matters more than the numbers.
275
+
276
+ ### If you only read text, extract it per format
257
277
 
258
278
  | file | how |
259
279
  |---|---|
260
- | `.pdf` | `pdftotext -layout f.pdf -` — poppler; 40 KB of text with the table layout kept |
261
- | scanned `.pdf` | `pdftoppm -png -r 150 f.pdf page` → `page-01.png`, then look at the image |
262
- | `.docx` | `soffice --headless --convert-to "txt:Text (encoded):UTF8" f.docx --outdir ./out` — LibreOffice; tables come out tab-separated |
280
+ | `.pdf` | `pdftotext -layout f.pdf -` — poppler; keeps the table layout. **Empty output means a scan**, not an empty document |
281
+ | scanned `.pdf` | `pdftoppm -png -r 150 f.pdf page`, then look at the PNGs it wrote |
282
+ | `.docx` | `soffice --headless --convert-to "txt:Text (encoded):UTF8" f.docx --outdir ./out` — tables come out tab-separated |
283
+ | `.xlsx` | `soffice --headless --convert-to csv f.xlsx --outdir ./out` — **first sheet only**, so check whether the workbook has more |
263
284
  | `.pptx` | `~/.claude/skills/pptx/.venv/bin/python -m markitdown deck.pptx` — slide text, and it NAMES the embedded images without extracting them |
264
- | images in a `.pptx` | `unzip -o -q deck.pptx 'ppt/media/*' -d ./out` `out/ppt/media/*.png` |
285
+ | images inside any of them | `unzip -o -q f.pptx 'ppt/media/*' -d ./out` also `word/media/` in a `.docx`, `xl/media/` in an `.xlsx` |
286
+
287
+ Two traps in that table, both measured:
288
+
289
+ - **Do not predict what `pdftoppm` names its output.** The page number is padded
290
+ to the width of the page COUNT, so a one-page scan — what an attachment
291
+ usually is — gives `page-1.png` while a forty-page one gives `page-01.png`.
292
+ List the directory. A guessed name that is not there reads as "the render
293
+ failed" when it worked.
294
+ - **`--convert-to pdf` on a wide spreadsheet splits COLUMNS across pages.** A
295
+ 40-column sheet became four pages. Still readable, but read them all — and
296
+ for pure numbers `csv` is the better half of the pair.
265
297
 
266
- `pandoc` is **not** installed here, whatever another skill's instructions say,
267
- and `markitdown` in that venv does `.pptx` only it went in without the
268
- `[docx]` and `[pdf]` extras and raises `MissingDependencyException` for both.
298
+ `pandoc` is **not** installed here, whatever another skill's instructions say.
299
+ `markitdown` in that venv does `.pptx` and nothing else: it went in without the
300
+ `[docx]`, `[pdf]` and `[xlsx]` extras and raises `MissingDependencyException`
301
+ for all three. That is why LibreOffice, not markitdown, is the line above for
302
+ everything except a deck.
303
+
304
+ **Known-good on a Claude Code machine provisioned by us, measured 2026-08-08.**
305
+ Conditional on purpose: this skill also runs under other agents on machines
306
+ nobody here set up, so read a missing command as "find your own", not as a bug.
269
307
 
270
308
  ## Mentioning somebody
271
309