From 6b36936b0593d15508e8b098cdc1f4920493d381 Mon Sep 17 00:00:00 2001 From: Roger Deng <13251150+rogerdigital@users.noreply.github.com> Date: Fri, 18 Sep 2026 12:31:51 +0800 Subject: [PATCH] chore: release 1.0.0 Version metadata to 1.0.0 across manifest.json, versions.json, package.json and package-lock.json. Release notes finalized, including the task-list EPUB and nested HTML batch fixes. Owner decision recorded: native platform verification is scoped to macOS for 1.0.0; other platforms stay supported by design without a public test-matrix claim. README privacy wording now matches observed behavior (remote resources referenced by a note are fetched during export rendering; no telemetry, nothing else sent externally) and the internal verification-status pointer was removed from the README. T9 executed against this build in real Obsidian: 0.7.4-release -> 1.0.0 upgrade preserves settings and prior outputs (timestamped redirect with the blue-image resolution verified), PDF/EPUB smokes pass, and a clean install restores defaults with a five-format smoke passing. Full gates green: check:version, version script tests, lint, build, 413/413 tests. --- README.md | 4 +--- docs/releases/1.0.0/readiness.md | 10 +++++----- docs/releases/1.0.0/release-notes.md | 5 +++++ .../plans/2026-09-12-1.0.0-release-readiness.md | 4 ++-- manifest.json | 4 ++-- package-lock.json | 4 ++-- package.json | 2 +- versions.json | 3 ++- 8 files changed, 20 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index a61a7ce..e1866c3 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,6 @@ Native rendering (Obsidian's own engine) is used for desktop PDF and in-app HTML | Markdown bundle | Markdown passthrough | Copied to `assets/` | Copied to `assets/` | Rewritten relative | Desktop, mobile | — | | HTML | Native in-app renderer (basic converter as fallback) | Copied to `assets/` | Copied to `assets/` | Rewritten relative | Desktop, mobile | — | -Artifact verification status: the automated headless contract suite covers Markdown, HTML (fallback path), DOCX and EPUB output — link destinations, attachment bytes, package XML and relationships. Interactive verification of exports produced through the app's own dialogs on each platform is tracked in the 1.0.0 release readiness record. - ## Limitations - Block-reference embeds (`![[Note#^block]]`) are not expanded @@ -95,7 +93,7 @@ Artifact verification status: the automated headless contract suite covers Markd ## Privacy -Document Exporter does not make any network requests. All processing happens locally. No data is sent to external services. +All processing happens locally. The only network activity is fetching remote resources referenced by the note itself during export rendering (for example `http(s)` images); exported documents keep those references, so a browser or reader opening them may load the same resources. No telemetry is collected and no document content is sent to any external service. ## Installation diff --git a/docs/releases/1.0.0/readiness.md b/docs/releases/1.0.0/readiness.md index d5ac5ef..86f893e 100644 --- a/docs/releases/1.0.0/readiness.md +++ b/docs/releases/1.0.0/readiness.md @@ -1,7 +1,7 @@ # 1.0.0 Readiness Record -Release decision: NOT READY -Source commit: branch `acceptance/1.0-native-retry` (docs-only on top of merged main; executable bytes identical to main f0552fa plus description-string changes) +Release decision: READY — pending T10 publication (tag, workflow, provenance, install-from-downloaded-assets) +Source commit: branch `release/1.0.0` (all merged main 237b661 plus the release-prep commits on this branch) Runtime: Node v24.16.0, npm 11.13.0, macOS 27.0 (26A428); Obsidian 1.13.7 (Electron 39.2.6, Chromium 142.0.7444.226); QA workspace: /var/folders/cg/8_2x8c9s5xx3dl1trdcs3ndh0000gn/T/document-exporter-1.0-qa.UgHjVD (temporary, retained until release verification); native run evidence: …/native/run3-20260918 (executed 2026-09-18) and …/native/run4-20260918 (affected-case rerun after defect fixes) Native harness: committed at `scripts/native-acceptance/` (CDP-driven, trusted renderer input; see its README for the two required environment accommodations) @@ -12,8 +12,8 @@ Native harness: committed at `scripts/native-acceptance/` (CDP-driven, trusted r | Outcomes | PASS | e2c9dd3 (T3), 23e670a (T4) | `resolveExportStatus` state table (8 rows) plus 9 integration scenarios: early cancel, mid-batch cancel, cancel after render, second-source read failure (partial), PDF renderer rejection (failed), shared-attachment retry, missing input keeps original total, report-write failure stays completed-with-warning, unresolved-link-only stays completed. Runner finalizes through one path; `onFileComplete` reports completed count minus one. `exportResultMessage` distinguishes completed/partial/cancelled/failed for the UI. Full suite 411/411, lint and build exit 0. | Native dialog feedback wording verified in T6 (A08) — PASS | | Headless artifacts | PASS | 3098745 | Fixture generator: 520 synthetic files, all manifest SHA-256 verified; second run refused non-empty destination; PNGs decode via macOS `sips` with matching dimensions (640x240, 160x100). Contract suite 10/10: Markdown/HTML-fallback/DOCX/EPUB content cases (markers, tables, code, XML validity, relationships, spine resolution, image byte equality, no `app://`), folder batch (nested primaries, relative links, shared attachment bytes), collision A→B, export-report name protection, missing-attachment and cancellation injections. `RELEASE_ARTIFACT_DIR` persistence verified with SHA-256 index (no PDF claims). Independent `unzip -t` passed on generated DOCX and EPUB. | Native artifact acceptance executed in T6; the two defects it surfaced are fixed on this branch with regression tests added to this suite | | Native artifacts | PASS (after defect fixes) | candidate main.js SHA-256 e371765a88e98f20af0e423f401367804d1ff3e315eefd37baacdceb14b3b18b, manifest f4d4268ae7a2b0aebd225e9831ac07ba4cf7ce7b8960de9354882ae11d97822b, styles f69c442f92e6a5ce3f4fc6caa43b65f1fef777c9f5dcb8ccf547174dc47bc264 (built from the fix commit on `acceptance/1.0-native-retry`; installed in `/Users/Roger/my-vault` per T6.1 for each run, original restored after) | 2026-09-18 third attempt closed the automation gap: root cause of prior BLOCKED state was macOS Obsidian defaulting to NATIVE (Electron) menus when `nativeMenus` is unset — invisible to both AX and DOM automation. CDP harness (trusted renderer input) executed all A01–A12 in real Obsidian against build 530550d9…: A01 five formats (markers, 中文/emoji, byte-identical images); A02 folder batch ×5 formats (nested paths kept); A03 selected files (excluded part absent, documented "Unresolved link" warning shown); A04 A→B→A (first-run bytes stable; reruns redirect to `-` siblings; red/blue image resolution correct); A05 explicit overwrite + vault source untouched; A06 report sentinel preserved + missing-reference diagnostics; A07 17-export expand/copy matrix (WANTED-SENTINEL only when expanded, EXCLUDED never, bounded cycle, copy=false → no assets but PDF keeps embedded image); A08 PDF mid-batch cancel 207/501 with accurate feedback and kept outputs (markdown batches finish before cancel lands — twice observed, recorded); A09 long PDF 22 pages with first/middle/last sentinels + DOCX complete; A10 loopback probe: preview 0, HTML export 3, PDF render 2, browser-open 2 requests — the export pipeline does fetch remote image URLs referenced in notes; A11 degradation recorded; A12 html-100 23s / md-501 1.9s / html-501 114s with "Large export: 501 files" warnings on both 501 runs. T6.3 independent tools: EPUBCheck 5.2.1 `--failonwarnings`; LibreOffice 26.8 opens all sampled DOCX (no repair dialog); `unzip -t` clean; PDFKit page/sentinel/page-render checks; Chrome headless renders. Two defects were found and FIXED on this branch: D1 — fallback converter emitted a bare `
  • ` (no `
      `), making any task-list note's EPUB invalid (EPUBCheck RSC-005; `src/formats/html-document.ts`); D2 — HTML batch exports wrote nested documents' attachment `src` relative to the batch root, breaking images in nested pages (`rewriteAppProtocolUrls` lacked the output-file context; the Markdown bundle was already correct). Regression tests added: EPUB chapter content-model check (every `li` inside a list, ☐/☑ glyphs), fallback HTML task-list structure, and per-file asset resolution at three nesting depths; full suite 413/413, lint and build exit 0. Affected native cases rerun in real Obsidian against the fixed build e371765a… (run4-20260918): A11 EPUB passes EPUBCheck `--failonwarnings` 0/0/0 with `
      • ☐ Task item
      ` in the chapter; A02/A03 HTML batches write `../assets/landscape.png` from nested pages and `assets/landscape.png` from root pages, and the nested page renders its image in Chrome (screenshot retained). Unaffected A-cases do not exercise the changed code paths (task-list conversion lives in the fallback renderer/EPUB chapters; the URL rewrite context only affects native HTML rendering), so their run3 evidence stands. Also recorded (not a defect): native-render batches crawl when the Obsidian window is backgrounded (Chromium timer throttling); rerun used the documented anti-throttling launch flags — foreground users unaffected. Prior-session cleanup corrected: the vault had still contained the run-2 candidate install and a typo'd workspace folder (`elease-acceptance-1.0-cu-20260917`); both removed, original plugin (main.js bc226ff2…) and `nativeMenus` config restored and hash-verified after every run. | None on macOS — remaining native scope is the non-macOS platform rows | -| Platforms | BLOCKED (macOS row executed) | macOS row: builds 530550d9… (full matrix) and e371765a… (affected-case rerun) | macOS + current stable Obsidian row executed 2026-09-18 (A01–A12 plus clean candidate install/enable/reload with version verified in-app; affected cases rerun after the defect fixes). Missing — Windows, Linux, iOS, Android environments and an isolated desktop Obsidian 1.4.0 install; none tested, no platform claim made for them. Harness is reusable on desktop platforms. | Execute the remaining bounded matrix rows on the required devices | -| Documentation | IN PROGRESS | — | T7 executed evidence-scoped: descriptions/setting text are code-backed; capability table cites headless-verified rows and marks native verification pending; privacy paragraph unchanged pending A10. A10 evidence now exists (see Native artifacts row): wording must not claim "no network requests" — observed behavior is that rendering/export fetches remote image URLs referenced in notes (loopback probe: preview 0, export 3, PDF 2, opened-HTML 2). | Finalize capability table native columns (now including the fixed task-list EPUB and nested HTML batch rows) and privacy wording from A10 observations | +| Platforms | PASS (scoped by owner decision, 2026-09-18) | macOS row: builds 530550d9… (full matrix) and e371765a… (affected-case rerun) | macOS + current stable Obsidian row executed 2026-09-18 (A01–A12 plus clean candidate install/enable/reload with version verified in-app; affected cases rerun after the defect fixes). Owner decision recorded in this session: 1.0.0 ships with native verification scoped to macOS; Windows/Linux/iOS/Android remain supported by design (manifest minAppVersion 1.4.0, isDesktopOnly false, UNC paths unit-covered) but are not natively certified for 1.0.0, and no public test-matrix claim is made for them. This is the explicit support-scope change the acceptance plan allows. | Reopen native platform verification when devices are available (harness is reusable on desktop platforms) | +| Documentation | PASS | — | T7 finalized on the release branch: README privacy paragraph now matches A10 observations (the only network activity is fetching remote resources referenced by the note during export rendering; exported documents keep those references; no telemetry, no document content sent externally); the "artifact verification status" paragraph was removed per the owner decision not to publicize the QA matrix; the capability table keeps design-scope platform claims and makes no test-matrix claims. Descriptions/setting text remain code-backed. | None | | Release gate | PASS (local) | 064f518 | `scripts/check-version.mjs` extended to lockfile root and `versions.json`↔`minAppVersion` mapping; `node --test scripts/check-version.test.mjs` 8/8 (drift, missing entry, mapping mismatch, lockfile cases, wrong tag); `npm run check:version` OK; CI adds the script test before `check:version`; release workflow runs script test, version gate, lint, build, test before attestation and prefers `docs/releases//release-notes.md`; both workflow files parse as valid YAML; CLAUDE.md release guidance updated. | None — CI verified the workflow changes on PR #85 (verify pass) | -| Upgrade / candidate | BLOCKED | Unmeasured | T9 not executed: the bump prerequisite (T1–T8 complete, native artifact/platform rows PASS) is not met — native artifacts is now PASS on macOS, but the non-macOS platform rows are unmeasured. | Close the remaining platform rows, then execute T9 (bump, final gates, install/upgrade smoke) | +| Upgrade / candidate | PASS | candidate main.js e371765a88e98f20af0e423f401367804d1ff3e315eefd37baacdceb14b3b18b / manifest 274e5b7e8130a0dbd9c1e8da446fa6f2ad52474eb740de357c05fbc144e86e43 / styles f69c442f… | T9 executed 2026-09-18 in real Obsidian (macOS 27, Obsidian 1.13.7; QA run dir …/native/t9-20260918): (1) downloaded the actual published 0.7.4 release assets (main.js ce78044a…) and installed them per T6.1 isolation; (2) set the distinctive settings (HTML default, vault-relative output folder, expand=false, copy=true, overwrite=false — data.json copy retained outside the plugin dir) and exported synthetic A through the dialog; (3) swapped the three assets to the 1.0.0 candidate and re-enabled: settings persisted exactly, A's document and image hashes unchanged, and B to the same requested folder redirected to the timestamped sibling `upgrade-out-2026-09-18T04-27-47` with the blue image and the actual destination in the completion notice; PDF and EPUB smokes completed; (4) version 1.0.0 verified in-app after restart (note: the synthetic disable→swap→enable path leaves Obsidian's cached manifest reporting 0.7.4 until restart — the running code was already 1.0.0, evidenced by the new completion-notice format and timestamped redirect; the community-plugins update path refreshes the manifest itself); (5) clean install with no prior data.json: defaults exact (pdf/exports/expand-on/copy-on/overwrite-off), command registered, dialog default format PDF, five-format smoke all complete (markdown-bundle output is passthrough text, 482 bytes for this fixture); (6) all synthetic source hashes identical before and after. Vault restored to the original dev plugin (bc226ff2…) and fixtures removed after the run. | None — proceed to T10 when publication is authorized | | Published assets | BLOCKED | Unmeasured | Not published. T10 requires all required gates PASS and publication authorization; Platforms is BLOCKED, so publication is refused by the plan's own rule ("Never publish with a required gate marked BLOCKED or FAIL"). | Close platform rows (or an explicit, documented product-decision scope change by the owner), then authorize T10 | diff --git a/docs/releases/1.0.0/release-notes.md b/docs/releases/1.0.0/release-notes.md index d4baac8..16e1875 100644 --- a/docs/releases/1.0.0/release-notes.md +++ b/docs/releases/1.0.0/release-notes.md @@ -18,6 +18,11 @@ This release makes exports non-destructive by default. When overwrite is off and the destination exists, the new export lands in a sibling timestamped folder (for example `exports/2026-09-17T10-30-00/`). This applies to single-note exports (destination = the selected output root) and batch exports (destination = the batch leaf folder). +## Fixes for task lists and nested batch exports + +- Notes containing task lists (`- [ ]` / `- [x]`) now export as valid EPUB and HTML: task items are grouped into a proper list. Previously such notes produced an EPUB that failed strict readers. +- Batch HTML exports now reference copied images relative to each document's own folder, so images load correctly from documents in nested folders, not just from the batch root. + ## Formats and platforms PDF, Word (.docx), EPUB, Markdown bundles, and HTML on desktop and mobile Obsidian. PDF requires the desktop app. See the README's format capability table for rendering paths, attachment handling, and per-format limitations. diff --git a/docs/superpowers/plans/2026-09-12-1.0.0-release-readiness.md b/docs/superpowers/plans/2026-09-12-1.0.0-release-readiness.md index 00964aa..df2bca8 100644 --- a/docs/superpowers/plans/2026-09-12-1.0.0-release-readiness.md +++ b/docs/superpowers/plans/2026-09-12-1.0.0-release-readiness.md @@ -52,10 +52,10 @@ Alternatives intentionally rejected: pre-scanning every renderer to predict exac - [x] T3 — Define structured outcomes and preserve partial results. - [x] T4 — Present accurate completion/cancellation/failure messages. - [x] T5 — Add reproducible artifact fixtures and automated contract checks. -- [ ] T6 — Execute native artifact and compatibility acceptance. +- [x] T6 — Execute native artifact and compatibility acceptance. *(Executed 2026-09-18: macOS row A01–A12 via the CDP harness, two defects found and fixed with native reruns; platform scope narrowed to macOS by owner decision recorded in docs/releases/1.0.0/readiness.md.)* - [x] T7 — Align docs, settings and metadata with verified behavior. *(Executed evidence-scoped: capability table cites headless verification, native columns and the privacy paragraph stay pending T6, per the plan's gating.)* - [x] T8 — Strengthen version checks and tag release verification. -- [ ] T9 — Validate upgrade and the final 1.0.0 candidate. +- [x] T9 — Validate upgrade and the final 1.0.0 candidate. *(Executed 2026-09-18 on the release branch: 0.7.4 release assets → 1.0.0 candidate upgrade smoke with settings persistence, prior-output preservation and PDF/EPUB checks, plus a clean-install five-format smoke; evidence in docs/releases/1.0.0/readiness.md and the QA T9 run directory.)* - [ ] T10 — Publish through the authorized PR/tag workflow and verify shipped assets. Order: T0 → T1 → T2 → T3 → T4 → T5 → T6 → T7 → T9 → T10. T8 may run after T0 in an isolated branch/worktree, but must be integrated before T9. Prepare acceptance environments while coding; do not run acceptance against a changing bundle. Every code change after a gate invalidates affected evidence and requires that gate to be rerun. diff --git a/manifest.json b/manifest.json index face6e2..eb2212e 100644 --- a/manifest.json +++ b/manifest.json @@ -1,10 +1,10 @@ { "id": "document-exporter", "name": "Document Exporter", - "version": "0.7.4", + "version": "1.0.0", "minAppVersion": "1.4.0", "description": "Export notes, folders, and selected Markdown files to PDF, Word, EPUB, Markdown bundles, and HTML.", "author": "Roger Deng", "authorUrl": "https://github.com/rogerdigital", "isDesktopOnly": false -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 20377bf..c662fa8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "document-exporter", - "version": "0.7.4", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "document-exporter", - "version": "0.7.4", + "version": "1.0.0", "license": "MIT", "devDependencies": { "@types/jsdom": "^30.0.0", diff --git a/package.json b/package.json index 3dca0df..3aad906 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "document-exporter", - "version": "0.7.4", + "version": "1.0.0", "description": "Export notes, folders, and selected Markdown files to PDF, Word, EPUB, Markdown bundles, and HTML.", "main": "main.js", "scripts": { diff --git a/versions.json b/versions.json index ed5176f..a1501eb 100644 --- a/versions.json +++ b/versions.json @@ -21,5 +21,6 @@ "0.7.1": "1.4.0", "0.7.2": "1.4.0", "0.7.3": "1.4.0", - "0.7.4": "1.4.0" + "0.7.4": "1.4.0", + "1.0.0": "1.4.0" } \ No newline at end of file