Skip to content

Releases: kw78/dsh-office-tools

v1.0.6

Choose a tag to compare

@github-actions github-actions released this 13 Oct 07:08

Full Changelog: v1.0.5...v1.0.6

v1.0.5

Choose a tag to compare

@github-actions github-actions released this 01 Oct 14:38
88e5e44

Fixed

  • Long PPT generation now plans byte-safe sizes and contiguous offsets independently of CRC. Valid XML whitespace changes CRC at fixed length. Packages above 127 entries use legal unreferenced XML padding parts with actual safe entry counts.
  • DSH 0.2.0-rc.1 now satisfies the five peer ranges and the exact compatibility records. The plugin manifest is synchronized with version 1.0.5.
  • Generated files have a 50 MiB budget; the 200-slide budget includes an optional cover.
  • CI checks both supported DSH lines and runs visible nightly next-line checks. The source-policy test also handles Windows paths correctly.

Validation

82 tests, types and builds passed against DSH 0.1.2-rc.1 and 0.2.0-rc.1. Real sandbox/filesystem/tool composition passed on both. Real Microsoft Office opened Word documents including padded entry counts, recalculated the Excel formula, and opened 5/29/200-slide PowerPoint decks with notes. Independent ZIP CRC and contiguity checks passed.

Image embedding and architecture

PPT images remain linked, not embedded. DSH 0.2.0-rc.1 still exposes text-only writes; genuine embedding needs an authorized binary-write backend. See the architecture analysis and migration plan.

Fixes #6 and #7 through PR #8.

v1.0.4

Choose a tag to compare

@github-actions github-actions released this 22 Sep 16:04

Fixes

  • Generated .docx/.xlsx/.pptx files now open in real Microsoft Office (#5): the ASCII-safe STORE planner separated entries with ~1 KiB alignment gaps, which Office's OPC reader rejects (Word: "the file may be corrupted"; Excel: cannot open; PowerPoint: HRESULT E_FAIL). Entries are laid out contiguously now, with payload padding plus a small valid local extra field keeping every zip field ASCII-safe.
  • ppt_create output is accepted by real PowerPoint: the theme's style-matrix gradients now carry the schema-required two stops, [Content_Types].xml names notesSlideN.xml after the slide that carries the notes, and linked-image relationship targets are portable forward-slash relative paths.
  • Linked images larger than 4 KiB are no longer refused (#4).
  • tests/real-composition.mjs (pnpm run test:e2e) now runs on Windows as well as POSIX.

Verified against Microsoft Office 16.0 COM (Word.Application / Excel.Application / PowerPoint.Application). Note: PPT images remain linked, not embedded — the ctx.fs write channel is UTF-8 text only, so binary parts cannot be carried; PowerPoint blocks external content by default until the user enables it or adds the folder to Trusted Locations.

Closes #4, #5.

v1.0.3

Choose a tag to compare

@github-actions github-actions released this 17 Sep 13:56

Full Changelog: v1.0.2...v1.0.3

v1.0.2

Choose a tag to compare

@github-actions github-actions released this 14 Sep 02:21

Full Changelog: v1.0.1...v1.0.2

v1.0.1

Choose a tag to compare

@github-actions github-actions released this 04 Sep 17:26

Full Changelog: v1.0.0...v1.0.1

v1.0.0

Choose a tag to compare

@kw78 kw78 released this 04 Sep 15:27

[1.0.0] - 2026-09-04

Dependency-free, official-fs-channel release: the whole tool suite was rewritten on a self-contained OOXML engine and every byte now crosses the official ctx.fs service, which clears the remaining DSH Store automatic-policy blockers (AI-Scarlett/DSH-Store#334) without giving up real Office files.

Added

  • dsh.compatibility.dshReleases exact per-release declarations in package.json (0.1.1-rc.2, 0.1.2-alpha.4, 0.1.2-alpha.5, 0.1.2-rc.1: compatible) — every declared release is backed by the full test suite run against that line's @deepseek-ai/* packages. This is the exact-record evidence the latest-three compatibility window requires; the store automation restores the listing from the new fixed commit (verified by running the store's own catalog-update-review / catalog-compatibility-policy modules against this manifest locally).
  • ppt_create result now echoes the full layout: slideWidthInches/slideHeightInches, per-slide elements with every text/bullet/image box in inches, plus a text wireframe sketch per slide in the rendered output — the model can SEE the composition it authored.
  • ppt_read now returns an elements array per slide (type, x/y/w/h inches, short text, alt) and the deck canvas size, for any deck including foreign ones; the rendered output includes the same wireframe sketch.
  • Linked-image placement on ppt_create: x/y/w/h inches, sizing: contain|cover (cover crops via srcRect), alt text, and intrinsic-size defaulting by sniffing PNG/JPG/GIF headers (src/imgsize.ts) — a single given dimension scales by aspect.
  • tests/store-gate-replica.mjs: a local replica of the store's analyzeFixedSource gate (same regexes, same bounds) so compliance is checked in-repo before every push, not discovered by the eight-hour automation.

Changed

  • All file I/O moved to the official ctx.fs service (inject = ['tools', 'fs']; new peer @deepseek-ai/dsh-fs): reads via readBytes, writes via the backend's atomic writeText, containment/symlink resolution owned by the backend with a lexical pre-check on top. src/ contains zero node:fs imports — the plugin never touches the file system directly.
  • Zero runtime dependencies (was docx/jszip/pptxgenjs/CDN-pinned xlsx): Word/Excel/PowerPoint packages are generated and parsed by this plugin's own OOXML engine (src/asciizip.ts, src/tools/*.ts) over node:zlib. Reads accept any real-world package (STORE and DEFLATE). No install-time fetch of any kind.
  • Generated packages are pure-ASCII STORE zips: a slot-aligned planner (1 KiB alignment, unsafe offset bands skipped, per-part newline padding, comment/extra steering for the directory size) keeps every CRC/size/offset field byte-safe, so real Office files travel the UTF-8 text channel byte-identically; non-ASCII text encodes as XML character references. Validated independently: Python zipfile.testzip() reports zero CRC errors and every emitted byte is <= 0x7F.
  • Excel formulas, scalar formatting (TRUE/FALSE, empty-string vs gap), SheetJS-compatible read semantics, and the mammoth-pinned word_read goldens are all preserved — 51/51 tests green (ported suite; fixtures generated by the real libraries where read-fidelity matters).
  • build.mjs no longer needs node:fs/node:child_process: esbuild writes the artifact itself and type emission moved to the types script; @deepseek-ai/schemastery is external like every other @deepseek-ai/* (dsh-tools imports it at runtime, so profiles provide it). Bundle: 116 kB of this plugin's own code only.
  • Peer ranges widened to ^0.1.0-rc.6 || ^0.1.1-rc.0 || ^0.1.2-alpha.0 (covers the 0.1.2 line the compatibility records declare); devDependencies pinned to the 0.1.2-rc.1 line.

Removed / breaking

  • Embedded (binary) image embedding in ppt_create — images are LINKED (a:blip r:link): the deck references the workspace image file instead of carrying its bytes. Keep image files alongside the deck when moving it. This is the price of a binary-free package under the text channel; alt text defaults to the image path.
  • word_update/excel_update no longer rewrite packages that carry binary parts (embedded media/fonts): refused with a clear error instead of a corrupted file. Files these tools write, and any all-text OOXML package, still update fine.
  • The npm-only install caveat is gone: 1.0.0 has nothing to fetch.

v0.6.0

Choose a tag to compare

@kw78 kw78 released this 01 Sep 14:16

[0.6.0] - 2026-09-01
Engineering-and-ecosystem release (spec: docs/spec-0.6.0.md). No tool behavior changes.

Added
npm publish workflow with provenance (.github/workflows/publish.yml): publishing a GitHub Release triggers a full pnpm run check and then npm publish --provenance under OIDC (id-token: write). A guard refuses non-v* tags and any tag that does not match package.json's version. One-time setup (repo NPM_TOKEN secret, npm-side provenance) is documented in docs/DEVELOPMENT.md §10.2. Releases 0.3.0–0.5.0 never reached npm (registry still at 0.2.0) because publishing was manual; this closes that gap.
CI matrix: ci.yml now tests node 20 and 22 (fail-fast: false) — engines claims >=20 but only 22 was tested.
README demo (both languages): the "one prompt, quarterly-report trio" example prompt with a terminal-style session image (docs/demo/session.svg, numbers from a real run), and tests/demo-trio.spec.ts — an in-repo, path-independent integration test that creates report.docx + budget.xlsx (formulas) + deck.pptx (notes) in one session and reads all three back, pinning the README claim. The tracked suite grows 46 → 47 tests (the maintainer's machine additionally runs an untracked local demo spec; 55 pass there).
Changed
Office libraries moved from build-time inlining to regular runtime dependencies (docx / jszip / pptxgenjs from npm, xlsx pinned to the SheetJS CDN 0.20.3 tarball URL). lib/index.js now bundles only this plugin's own code plus schemastery: 2,479,019 B → 90,592 B, and the npm tarball shrinks 550 kB → 31.8 kB. Reason: the third-party DSH Store review (AI-Scarlett/DSH-Store#334) caps committed runtime files at 256 KiB per file / 2 MiB total, and no inlined layout can satisfy the per-file bound — the xlsx module alone exceeds 256 KiB even minified (whole minified bundle measured 1,319,961 B). This reverses the 0.2.0 "self-contained tarball" property: installs now fetch ~15–20 MB of dependencies (including cdn.sheetjs.com for SheetJS), exactly the 0.1.0-era install model. Risk is low because the entire test suite already ran against unbundled resolution — the bundle was only the published artifact — and a plain-Node ESM import smoke test of lib/index.js passes. Version pins are unchanged (SheetJS stays the CVE-fixed CDN 0.20.3; jszip stays ^3.10.1, whose _data field the zip guard reads — if a future jszip drops it, the guard degrades to the compressed-size cap rather than breaking).
Peer dependency ranges for @deepseek-ai/dsh-agent/-llm/-session/-tools widened from ^0.1.0-rc.6 to ^0.1.0-rc.6 || ^0.1.1-rc.0. Verified empirically with node-semver: the old range does not satisfy the shipping DSH runtime 0.1.1-rc.2 (prerelease versions only satisfy comparators sharing their [major.minor.patch] tuple), so the declared peers excluded the host actually running the plugin. The union covers every 0.1.x stable and rc on npm (0.1.0-rc.6/7/8, 0.1.0, 0.1.1-rc.*, 0.1.1) and still excludes 0.1.2-alpha/0.2.0. cordis stays ^4.0.1 (already covers the runtime's 4.0.2). devDependencies resolve to 0.1.1-rc.2, so typecheck/tests now run against the same versions as the runtime — all 55 tests green against it.
Docs
docs/hub-registration.md: catalog entry bumped to 0.6.0 with provenance and ciMatrix risk facts; maintainer steps now start from the automated npm release.
README.zh: stale tool count (7 → 8) fixed.
ROADMAP marks 0.6.0 implemented, with deviations recorded (session image is an SVG rendered from real output, not a recorded GIF; the dsh-hub/Atlas submission itself remains an external maintainer action; per-family config switches stay deferred until users ask).

v0.4.0

Choose a tag to compare

@kw78 kw78 released this 30 Aug 15:36

Security (0.3.0) — zip-bomb guard on every read path: declared uncompressed budgets (256 MiB/entry, 512 MiB/archive, 100k entries) checked against the central directory before anything is inflated; pseudo-zip files refused with a friendly error; XML parts carrying DOCTYPE/ENTITY declarations refused.

Changed (0.3.0) — word_read no longer uses mammoth: an in-house jszip extractor with byte-exact parity to mammoth 1.11.0 (pinned by golden tests); mammoth and bluebird removed. Bundle 3.2 MB → 2.4 MB, bluebird refs 0, npm tarball 2.0 MB → 552 kB (source map dropped from the package, kept in git).

Added (0.4.0) — word_update: append paragraphs, bullets, and one table to an existing .docx (fragments generated by the same docx-package path as word_create, spliced before the trailing sectPr, atomic rewrite). Excel formula writing: =... string cells become real formula cells across all write paths.

Eight tools, 40 tests green.

v0.2.0

Choose a tag to compare

@kw78 kw78 released this 30 Aug 13:20

[0.2.0] - 2026-08-30

Security

  • SheetJS dependency moved from npm xlsx@0.18.5 to the official CDN tarball xlsx@0.20.3 (https://cdn.sheetjs.com). npm's 0.18.5 carries CVE-2023-30533 (prototype pollution via crafted workbooks, fixed upstream in 0.19.3) and CVE-2024-22363 (ReDoS, fixed upstream in 0.20.2); fixed releases are only distributed through the official CDN. All Excel tool tests pass against 0.20.3.
  • The five Office libraries (docx, jszip, mammoth, pptxgenjs, xlsx) are build-time-only and moved to devDependencies: they are inlined into lib/index.js by esbuild and never resolved at runtime, so installs of the published plugin fetch nothing beyond the plugin tarball (no cdn.sheetjs.com access required downstream). The host bundle shrinks from 4.0 MB to ~3.2 MB.

Added

  • enablePptTools config switch (default true) so this plugin can coexist with dedicated presentation plugins such as dsh-ppt, which register a colliding ppt_create that DSH rejects at startup. With enablePptTools: false only the five Word/Excel tools are registered. Declared through a schemastery Config validated by the Loader.