Skip to content

Commit 4eab9e4

Browse files
committed
feat: release DeckOps 2.1.1 Markdown-first quality reports
1 parent d8a7a81 commit 4eab9e4

55 files changed

Lines changed: 3115 additions & 184 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.gitignore‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ tests/generated/
1313

1414
# Internal design documents stay local; only the README ships publicly.
1515
docs/
16+
17+
# Generated document artifacts are not release source.
18+
output/

‎CHANGELOG.md‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
11
# Changelog
22

3+
## 2.1.1 — 2026-09-09 — Lightweight quality and delivery fixes
4+
5+
- Summarize missing/failed pages, body text, OCR/visual risks and unsupported controls; expose
6+
paid cloud recommendations independently of local/auto/cloud execution policy.
7+
- Preserve best-effort Markdown and optional strict gating; provide the same assessment in
8+
read, parse and convert, including cached artifacts. Local OCR remains unsupported.
9+
- Fix command ampersands and code fencing, report control replacement without changing IR,
10+
respect disabled DOCX strike styles, and report actual output bytes on cache hits.
11+
- Share immutable identical assets across candidates and selected artifacts, using atomic
12+
replacement and copy fallback. Invalidate affected DOCX parser and Markdown renderer caches.
13+
- Update the bundled Agent skill to consume quality reports and keep upload choices explicit.
14+
- Depend on the published DeckProbe 2.6.0 package; remove the temporary vendor archive and bundled dependency override.
15+
16+
- Ship a DeckOps Agent Skill with format, artifact, output, recipe, and limit references for traceable document-to-knowledge workflows.
17+
- Add `deckops install --skills` with project/global/explicit targets, dry-run JSON receipts, managed-file hash protection, and preservation of local additions.
18+
- Validate skill resources during checks and prepack, and verify installation from the production npm tarball.
19+
20+
## 2.1.0 — 2026-09-09
21+
22+
- Default bare CLI calls now return Markdown; add `read()` SDK, `--format ir`, JSON content envelopes and independent run reports.
23+
- Introduce evidence-based assessments, a shared capability registry, policy provenance, negative overrides, candidate comparison and a final quality gate.
24+
- Detect sparse raster PDF pages individually; unknown/unverified remedies and visual-only warnings do not automatically upload.
25+
- Preserve local/cloud candidates, freeze local source bytes, propagate cancellation, journal uncertain submissions and disable mutation retries.
26+
- Integrate DeckProbe 2.6.0 bounded preflight and exact SmartArt inventory; bundle the tested upstream release snapshot for independent installs.
27+
- Keep stdout ownership in the CLI and preserve cache/export image lifetimes.
28+
329
## @deckflow/deckops 2.0.0 — 2026-09-07
430

531
- License DeckOps-owned code under AGPL-3.0-only from this license-change commit onward. Preserve third-party licenses and notices; already published releases through 1.1.1 remain under their original MIT license.

‎README.md‎

Lines changed: 93 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
> Parse any document into an agent-operable representation.
44
5-
DeckOps turns documents into **durable IR artifacts** and derives views from them. Parse once — then convert, again and again, without ever re-reading the source.
5+
DeckOps reads documents as **Markdown by default**, with quality evidence and policy-controlled upgrades. Explicit `parse` creates durable IR artifacts for repeated use.
66

77
```bash
8-
deckops doc.pdf # document → IR artifact (doc/)
8+
deckops doc.pdf # Markdown only on stdout
9+
deckops doc.pdf --json # content + assessment + routing decision
10+
deckops doc.pdf -o doc.md # portable Markdown and adjacent image assets
11+
deckops parse doc.pdf # explicit durable IR artifact (doc/)
912
deckops convert doc/ # artifact → local markdown view, no re-parse/network
1013
deckops convert doc.pdf -o doc.md # one-shot: portable markdown, images localized
1114
```
@@ -26,18 +29,76 @@ The CLI and Node.js entry require Node.js 22.18 or newer. Frontend applications
2629

2730
Local PDF parsing uses `pdf-lite-parse@0.2.1` and exports embedded images without expensive composite-figure rasterization. Extractable overlay text is retained separately; visual fidelity losses are reported in `quality`. `--no-images` (SDK: `includeImages: false`) skips image export entirely.
2831

29-
Ordinary `npm install @deckflow/deckops` is now lightweight for PDF parsing: the parser embeds a pinned subset of PDF.js and its portable resources, with no separately installed `pdfjs-dist` or automatic canvas dependency. DeckProbe's independent optional platform CLI packages are unchanged. To omit those as well and use the strict no-native installation:
32+
Ordinary `npm install @deckflow/deckops` is now lightweight for PDF parsing: the parser embeds a pinned subset of PDF.js and its portable resources, with no separately installed `pdfjs-dist` or automatic canvas dependency. DeckProbe is pinned to the published 2.6.0 package; it uses its matching optional native CLI when available and falls back to WASM otherwise. To omit those as well and use the strict no-native installation:
3033

3134
```bash
3235
npm install --omit=optional @deckflow/deckops
3336
```
3437

3538
Embedded-image PDF parsing works in both installation modes without canvas. Use the cloud engine explicitly when full figure fidelity is needed. Applications calling `pdf-lite-parse` directly can explicitly install canvas for its opt-in composite mode; DeckOps does not enable it automatically.
3639

40+
## Content and upgrade policy
41+
42+
```bash
43+
deckops report.pdf > report.md
44+
deckops report.pdf --report report.run.json > report.md
45+
deckops report.pdf --format ir --json
46+
deckops report.pdf --engine auto --allow-upload
47+
deckops capabilities --json
48+
```
49+
50+
Plain stdout contains only the selected content; stderr carries actionable diagnostics.
51+
`--json` returns one `deckops.read.v1` object. File output returns `content: null` and file receipts.
52+
Use `-o report.md` for portable image links; redirected stdout refers to persistent local cache
53+
assets under `DECKOPS_CACHE_DIR` (default `~/.cache/deckops`). Cache files remain until explicitly
54+
removed. Independent exports use an adjacent `report.assets-<id>/` directory so failed rewrites
55+
cannot damage a previous export's links. `--format ir -o FILE` is rejected; use `parse -o DIR`
56+
for a portable IR bundle. `--quiet` on the default entry keeps content and actionable problems.
57+
58+
The Node SDK also exposes `read()`:
59+
60+
```ts
61+
import { read } from '@deckflow/deckops';
62+
const result = await read('report.pdf', { engine: 'local' });
63+
console.log(result.content);
64+
console.log(result.report.assessment, result.report.decision);
65+
const structured = await read('report.pdf', { format: 'ir' });
66+
```
67+
68+
SDK options do not inherit CLI product configuration. `cloudLimits` can bound source bytes/pages;
69+
unverifiable page limits or monetary `maxCost` prevent submission. A timeout/unknown preflight
70+
is never upload authorization. OCR/SmartArt/table repair capabilities are currently marked
71+
unverified and do not automatically trigger paid attempts. Known alternate document parsing and
72+
cloud-only formats use the declared API contract, followed by conservative candidate comparison.
73+
Cloud failures retain a usable local candidate; an unresolved submission journal prevents automatic
74+
resubmission. Existing artifact reads never upload the source. Source facts, heuristic quality
75+
issues and unassessed dimensions remain distinct; no accuracy score is invented.
76+
77+
## Use from a coding agent
78+
79+
DeckOps ships an Agent Skill that teaches coding agents when to parse a source, when to reuse an artifact, how to preserve provenance, and how to report quality limits. Install it at project scope with:
80+
81+
```bash
82+
deckops install --skills
83+
```
84+
85+
Auto mode installs into agent directories already present in the project and falls back to `.agents/skills/deckops/`. Select a host or inspect the plan explicitly when needed:
86+
87+
```bash
88+
deckops install --skills --agent codex
89+
deckops install --skills --agent claude -g
90+
deckops install --skills --dir /path/to/agent/skills
91+
deckops install --skills --dry-run --json
92+
```
93+
94+
The package and installer use the same files from [`skills/deckops/`](skills/deckops/). Upgrades protect managed files that were edited after installation and preserve other local files in the skill directory; `--force` explicitly replaces conflicting managed content. Installing the skill does not change DeckOps credentials, engine defaults, or document data.
95+
3796
## Two verbs, deliberately
3897

3998
```
40-
parse document → IR artifact the only parsing action; produces IR, never markdown
99+
SOURCE document → Markdown default content entry
100+
parse document → IR artifact persistent IR workflow
101+
capabilities local/cloud registry machine-readable upgrade capabilities
41102
convert IR artifact → view --to markdown (v1); never re-parses the source
42103
```
43104

@@ -55,7 +116,7 @@ doc/
55116
- **Local and private by default.** `--engine local` is the default, requires no login, and never constructs a cloud client. URL source mode only fetches the URL the user supplied and bounded redirects.
56117
- **Parse twice, pay once.** Same bytes + engine + compatible parser version + options = instant artifact reuse. Compatibility uses the parser major, plus the minor for pre-1.0 PDF releases. `--json` reports `"engine": "artifact-cache"`.
57118
- **Convert never re-parses.** Manifest v2 stores public `deckir.v1`; local artifacts remain convertible indefinitely. The 7-day lifetime only applies to an optional cloud `irKey`.
58-
- **No silent fallback.** `--engine auto` stays local unless `--allow-upload` is explicitly present. `--fail-on-degraded` turns a quality warning into a failure.
119+
- **No silent fallback.** `--engine auto` upgrades only with upload authorization and a matching supported remedy. Authorization may come from flags, environment or user config; `--no-allow-upload` overrides it. `--fail-on-degraded` rejects the final result after candidate selection and output checks.
59120

60121
Local parsers enforce source, ZIP expansion/ratio, asset, XML depth/event, URL response, timeout and worker-heap limits. The main budgets can be raised explicitly with `--max-source-bytes`, `--max-expanded-bytes`, `--max-part-bytes`, `--max-asset-bytes`, `--max-total-asset-bytes`, `--max-zip-entries`, `--max-url-bytes` and `--worker-heap-mb`; overrides are recorded in the artifact cache identity.
61122

@@ -268,3 +329,30 @@ Source and build instructions are available in this repository; use the tag or
268329
commit corresponding to the version you distribute. When distributing or
269330
operating a modified network-accessible version, follow the applicable
270331
corresponding-source requirements in AGPL-3.0, including section 13.
332+
333+
## Lightweight quality and paid cloud parsing
334+
335+
Local parsing extracts available content quickly. It does not run OCR or reconstruct
336+
complex visual semantics. Default Markdown remains best-effort: quality limitations are
337+
reported on stderr without turning them into execution failures. Agent integrations should
338+
use `deckops SOURCE --json` (content plus report) or retain `--report RUN.json` and stderr.
339+
340+
`report.assessment.summary` includes known source/parsed pages, missing and failed pages,
341+
searchable body text, suspected OCR pages, visual-risk pages and control-character counts.
342+
Unknown source counts remain absent. Missing-page lists are capped at 1,000; the full count
343+
and truncation flag remain available. `no_issue_detected` does not certify completeness.
344+
345+
`assessment.recommendation` may suggest paid cloud high-quality parsing even in local mode;
346+
`decision` independently records whether policy permits execution. Local never uploads.
347+
Automatic cloud submission still requires upload authorization, compatible parameters,
348+
verified capabilities and configured limits. OCR, layout and other specialized remedies
349+
without a verified service contract remain in the capability catalog as unverified;
350+
a user may explicitly select cloud parsing without a promise that it repairs every defect.
351+
Cloud output retains its own quality assessment. `--fail-on-degraded` remains opt-in.
352+
353+
Markdown preserves ordinary `&&` and literal code contents, and replaces unsupported C0/DEL
354+
controls with U+FFFD plus diagnostics; original IR is retained. Output byte counts describe
355+
actual files, including cache hits. Identical assets within an artifact's candidates and
356+
selected result share immutable files through hard links where supported, with normal-file
357+
fallback. Updates replace files atomically; do not edit artifact assets in place. Portable
358+
exports remain independent copies. Global deduplication and old export cleanup are deferred.

‎package.json‎

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@deckflow/deckops",
3-
"version": "2.0.0",
3+
"version": "2.1.1",
44
"description": "Parse any document into an agent-operable representation. Parse once, convert repeatedly: PDF, PPTX, DOCX, Keynote and URLs into durable IR artifacts and Markdown.",
55
"type": "module",
66
"main": "./dist/index.js",
@@ -24,6 +24,7 @@
2424
"files": [
2525
"dist",
2626
"schemas",
27+
"skills",
2728
"README.md",
2829
"CHANGELOG.md",
2930
"THIRD_PARTY_NOTICES",
@@ -42,13 +43,15 @@
4243
"typecheck": "tsc --noEmit",
4344
"typecheck:browser": "tsc -p tsconfig.browser.json --noEmit",
4445
"typecheck:browser-consumer": "tsc -p tsconfig.browser-consumer.json --noEmit",
46+
"check:skill": "node scripts/check-skill.mjs",
4547
"check:browser": "pnpm typecheck:browser && pnpm test:browser && pnpm build:browser && pnpm typecheck:browser-consumer && node scripts/check-browser.mjs",
46-
"check": "pnpm typecheck && pnpm typecheck:browser && pnpm test && pnpm build && pnpm typecheck:browser-consumer && node scripts/check-browser.mjs && node scripts/check-independence.mjs",
48+
"check": "pnpm check:skill && pnpm typecheck && pnpm typecheck:browser && pnpm test && pnpm build && pnpm typecheck:browser-consumer && node scripts/check-browser.mjs && node scripts/check-independence.mjs && pnpm check:read",
4749
"check:independence": "node scripts/check-independence.mjs",
4850
"check:package": "pnpm build && node scripts/check-package-size.mjs",
4951
"browser:smoke": "node scripts/browser-smoke.mjs",
50-
"prepack": "pnpm build && pnpm typecheck:browser-consumer && node scripts/check-browser.mjs",
51-
"conformance": "node scripts/conformance.mjs"
52+
"prepack": "pnpm check:skill && pnpm build && pnpm typecheck:browser-consumer && node scripts/check-browser.mjs",
53+
"conformance": "node scripts/conformance.mjs",
54+
"check:read": "node scripts/check-read.mjs"
5255
},
5356
"keywords": [
5457
"cli",
@@ -72,25 +75,25 @@
7275
"url": "https://github.com/deckflow/deckops/issues"
7376
},
7477
"dependencies": {
75-
"@deckflow/deckprobe": "2.4.0",
78+
"@deckflow/deckprobe": "2.6.0",
79+
"axios": "1.19.0",
7680
"chalk": "^5.3.0",
7781
"commander": "^11.1.0",
82+
"eventsource-parser": "1.1.2",
7883
"fflate": "^0.8.2",
7984
"open": "^10.1.0",
8085
"p-limit": "^5.0.0",
8186
"parse5": "^7.3.0",
8287
"pdf-lite-parse": "0.2.1",
83-
"saxes": "^6.0.0",
84-
"axios": "1.19.0",
85-
"eventsource-parser": "1.1.2"
88+
"saxes": "^6.0.0"
8689
},
8790
"devDependencies": {
8891
"@types/node": "^20.10.0",
92+
"axios-mock-adapter": "^1.22.0",
8993
"esbuild": "^0.27.7",
9094
"tsup": "^8.0.0",
9195
"typescript": "^5.6.0",
92-
"vitest": "^2.1.0",
93-
"axios-mock-adapter": "^1.22.0"
96+
"vitest": "^2.1.0"
9497
},
9598
"engines": {
9699
"node": ">=22.18.0"

0 commit comments

Comments
 (0)