@floh-solutions/pharos-cli 0.17.1 → 0.17.3
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/package.json +3 -3
- package/skill/SKILL.md +76 -13
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@floh-solutions/pharos-cli",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.3",
|
|
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",
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"node": ">=22"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@floh-solutions/
|
|
28
|
-
"@floh-solutions/
|
|
27
|
+
"@floh-solutions/ado-core": "0.8.0",
|
|
28
|
+
"@floh-solutions/plan-to-board": "0.1.1"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/node": "^22.10.2",
|
package/skill/SKILL.md
CHANGED
|
@@ -251,24 +251,83 @@ 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
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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; keeps the table layout |
|
|
280
|
+
| `.pdf` | `pdftotext -layout f.pdf -` — poppler; keeps the table layout. **Empty output means a scan**, not an empty document |
|
|
261
281
|
| scanned `.pdf` | `pdftoppm -png -r 150 f.pdf page`, then look at the PNGs it wrote |
|
|
262
|
-
| `.docx` | `soffice --headless --convert-to "txt:Text (encoded):UTF8" f.docx --outdir ./out` —
|
|
263
|
-
| `.xlsx` | `soffice --headless --convert-to csv f.xlsx --outdir ./out` — **first sheet only
|
|
264
|
-
| `.pptx` | `~/.claude/skills/pptx/.venv/bin/python -m markitdown deck.pptx` — slide text
|
|
265
|
-
| images
|
|
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**. Count them first: `unzip -p f.xlsx xl/workbook.xml \| grep -o '<sheet [^>]*name="[^"]*"'` |
|
|
284
|
+
| `.pptx` | `~/.claude/skills/pptx/.venv/bin/python -m markitdown deck.pptx` — slide text. Its `` lines are SHAPE names, not files: see below |
|
|
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` paginates a spreadsheet twice over, and only one of them
|
|
295
|
+
is obvious.** Long splits by ROW, which is ordinary. **Wide splits by
|
|
296
|
+
COLUMN** — a 40-column sheet became four pages, each carrying a different
|
|
297
|
+
slice of the columns for the same rows. So a page count above one does not
|
|
298
|
+
tell you which kind you have: read every page, and if a row looks like it is
|
|
299
|
+
missing fields, look for them on the next one. For pure numbers `csv` is the
|
|
300
|
+
better half of the pair.
|
|
301
|
+
|
|
302
|
+
**Count the parts before you trust a conversion.** Every one of these formats is
|
|
303
|
+
a ZIP, so the file itself will tell you what it holds — and each of these has
|
|
304
|
+
been the thing that was quietly missing:
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
unzip -p f.xlsx xl/workbook.xml | grep -o '<sheet [^>]*name="[^"]*"' # sheets
|
|
308
|
+
unzip -l f.pptx | grep -c 'ppt/slides/slide[0-9]*\.xml' # slides
|
|
309
|
+
unzip -l f.docx | grep 'word/media/' # images
|
|
310
|
+
```
|
|
266
311
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
312
|
+
If the images list is empty, text extraction loses nothing and the cheap route
|
|
313
|
+
is safe. If it is not, that is your warning that the payload may not be text.
|
|
314
|
+
|
|
315
|
+
**`markitdown`'s image lines name SHAPES, not files.** A deck that emits
|
|
316
|
+
``, `` and `` for one slide
|
|
317
|
+
turned out to contain exactly two media files in the whole archive — named
|
|
318
|
+
`image1.png` and `image2.svg`, matching none of them. Those are PowerPoint's
|
|
319
|
+
shape names. Do not go looking for a file by one, and do not read three of them
|
|
320
|
+
as three pictures. To map media to the slide that uses it, read the
|
|
321
|
+
relationships: `unzip -p f.pptx ppt/slides/_rels/slide6.xml.rels`.
|
|
322
|
+
|
|
323
|
+
**Text extraction tells you WHICH strings are on a slide and never WHERE.** That
|
|
324
|
+
is not a nuance — measured on a real deck, one slide carried both `IDENTITEIT`
|
|
325
|
+
and a leftover `Wat is ChatGPT?` from a different presentation, in the same
|
|
326
|
+
place, printing on top of each other. Extracted, they are two tidy lines and
|
|
327
|
+
read as a title with a subtitle. Rendered, the slide is visibly broken. So a
|
|
328
|
+
duplicated, stale or overlapping shape is invisible to every text route by
|
|
329
|
+
construction — if you are reviewing a deck rather than mining it for facts, look
|
|
330
|
+
at it.
|
|
272
331
|
|
|
273
332
|
`pandoc` is **not** installed here, whatever another skill's instructions say.
|
|
274
333
|
`markitdown` in that venv does `.pptx` and nothing else: it went in without the
|
|
@@ -276,6 +335,10 @@ reads as "the render failed" when it worked.
|
|
|
276
335
|
for all three. That is why LibreOffice, not markitdown, is the line above for
|
|
277
336
|
everything except a deck.
|
|
278
337
|
|
|
338
|
+
**Known-good on a Claude Code machine provisioned by us, measured 2026-08-08.**
|
|
339
|
+
Conditional on purpose: this skill also runs under other agents on machines
|
|
340
|
+
nobody here set up, so read a missing command as "find your own", not as a bug.
|
|
341
|
+
|
|
279
342
|
## Mentioning somebody
|
|
280
343
|
|
|
281
344
|
**A mention is `@<guid>` and nothing else notifies.** `@Ada Lovelace` written
|