From b4c4e8d57289cc7333a5f48ac41cd6e7530c8120 Mon Sep 17 00:00:00 2001 From: Redstone Zhao <13740080@qq.com> Date: Fri, 13 Nov 2026 02:20:04 +0000 Subject: [PATCH 1/2] fix: clarify public capabilities and make preview dependencies optional --- CHANGELOG.md | 48 +++++++ README.es.md | 6 +- README.fr.md | 6 +- README.ja.md | 6 +- README.ko.md | 6 +- README.md | 89 ++++++------ README.pt-BR.md | 6 +- README.ru.md | 6 +- README.zh-CN.md | 4 +- docs/edition.md | 26 +--- package.json | 16 ++- pnpm-lock.yaml | 187 +++++++++++++++++--------- scripts/release.sh | 20 ++- skills/deckuse/SKILL.md | 2 - skills/deckuse/modules/cli-context.md | 2 + src/agent-context.ts | 6 + src/bin.ts | 2 +- src/deck2html-exec.ts | 30 +++-- src/help.ts | 4 +- src/monitor.ts | 2 +- src/pptx/edition.ts | 8 +- src/render-browser.ts | 44 +++++- src/render-cache.ts | 4 +- src/render.ts | 8 +- test/pptx/edition-gates.test.ts | 4 +- 25 files changed, 352 insertions(+), 190 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7949406..c614fcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,54 @@ - Add blank canvas dimensions, opt-in embedded chart workbooks, and read-only chart-data dependency preflight with safe independent-formula preservation. - Detect chart initialization failures and number-format degradation during single/batch rendering. Companion deck2html fixes trimmed number-format/color serialization and renders limited bar/line combos in Community. Use `DECKUSE_DECK2HTML_BINARY` to test the companion build before its upstream release. +## 1.9.8 + +- Improve converter startup and report blocked preview as a structured handoff to the validated PPTX. + +## 1.9.7 + +- Streamline agent verification and reproducible generation, and retire owned workspace cleanup artifacts by default. + +## 1.9.6 + +- Add version-matched Skill discovery and prioritize browser-measured preview findings. + +## 1.9.5 + +- Improve compact validation reports and make PPTX generation resumable. + +## 1.9.4 + +- Expose compact first-draft discovery and preserve validated fallback snapshots. + +## 1.9.3 + +- Harden managed PPTX writes and verify the generated package before handoff. + +## 1.9.2 + +- Improve managed-agent authoring, review, recovery, and write replay. + +## 1.9.1 + +- Improve native PPTX editing and chart data workflows. + +## 1.9.0 + +- Add native grouping, connector and geometry operations, bounded workbook synchronization, and chart data preflight. + +## 1.8.0 + +- Add native comments and tracked revision workflows for Office review. + +## 1.7.0 + +- Add snapshot batch rendering, improve agent reliability, and update deck2html. + +## 1.6.0 + +- Add safer Office data editing and visual verification workflows. + ## 1.5.0 ### Minor Changes diff --git a/README.es.md b/README.es.md index 05fa967..46f6ca0 100644 --- a/README.es.md +++ b/README.es.md @@ -11,12 +11,12 @@ +> Partial translation. See the [English README](https://github.com/deckflow/deckuse/blob/main/README.md) for current capabilities and installation. + Deckuse es un motor local-first, basado en esquemas, para automatizar documentos Office mediante agentes de programación. Abre un documento en un espacio de trabajo versionado, permite al agente inspeccionar y seleccionar su estructura, aplica comandos JSON explícitos, valida el resultado y exporta un documento nuevo. PPTX y DOCX son los formatos implementados. Los adaptadores de XLSX, Keynote y Numbers devuelven deliberadamente `FORMAT_NOT_IMPLEMENTED`; aún no son destinos de edición compatibles. -Este repositorio es la **edición community** (`edition=community`). Véase [docs/edition.md](docs/edition.md). La edición comercial está en el repositorio separado `deckuse-commercial`. - ## Agent Skill (instalar primero) Deckuse está pensado para agentes. **Instala el skill de Deckuse antes de usar la CLI**: codifica el bucle workspace-first, el `apply` por lotes, las direcciones semánticas, las unidades y las recetas de alto valor. @@ -317,7 +317,7 @@ Deckuse proporciona al agente referencias estables, selectores, transacciones, v - `replacePicture` replaces a picture’s embedded media in place while retaining its element reference and layer order. - Table-cell addressing by table ID, row, and column; table row/column insert and delete via `setProperties`; cell `fill`; speaker-note reading and text editing (notes parts are created automatically when writing `slide:N/notes` if missing). - Create charts (`bar` / `column` / `line` / `pie`) and edit chart title, series-name, and cached values. When an embedded workbook exists, Deckuse emits `EMBEDDED_WORKBOOK_NOT_SYNCHRONIZED` rather than claiming that workbook data was updated. Advanced charts (other families, combo, ChartEx) are preserve-only in the community edition. -- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). Master/layout editing is available in the commercial edition repository. +- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). - `monitor` for live HTML preview and `render` for single-slide PNG screenshots (deck2html + Playwright). - Preservation of unknown parts and untouched nodes. ZIP files are recompressed, so fidelity is defined by uncompressed data for untouched entries rather than ZIP byte identity. diff --git a/README.fr.md b/README.fr.md index 431e24f..e93d5c7 100644 --- a/README.fr.md +++ b/README.fr.md @@ -11,12 +11,12 @@ +> Partial translation. See the [English README](https://github.com/deckflow/deckuse/blob/main/README.md) for current capabilities and installation. + Deckuse est un moteur local-first et piloté par schéma pour automatiser les documents Office avec des agents de code. Il ouvre un document dans un espace de travail versionné, permet à un agent d’inspecter et de cibler sa structure, applique des commandes JSON explicites, valide le résultat, puis exporte un nouveau document. PPTX et DOCX sont implémentés. Les adaptateurs XLSX, Keynote et Numbers renvoient volontairement `FORMAT_NOT_IMPLEMENTED` : ils ne sont pas encore des cibles d’édition prises en charge. -Ce dépôt est l’**édition community** (`edition=community`). Voir [docs/edition.md](docs/edition.md). L’édition commerciale vit dans le dépôt séparé `deckuse-commercial`. - ## Agent Skill (à installer en premier) Deckuse est conçu pour les agents. **Installez le skill Deckuse avant d’utiliser le CLI** — il encode la boucle workspace-first, le `apply` par lot, les adresses sémantiques, les unités et les recettes à haute valeur. @@ -317,7 +317,7 @@ Deckuse fournit à l’agent des références stables, des sélecteurs, des tran - `replacePicture` replaces a picture’s embedded media in place while retaining its element reference and layer order. - Table-cell addressing by table ID, row, and column; table row/column insert and delete via `setProperties`; cell `fill`; speaker-note reading and text editing (notes parts are created automatically when writing `slide:N/notes` if missing). - Create charts (`bar` / `column` / `line` / `pie`) and edit chart title, series-name, and cached values. When an embedded workbook exists, Deckuse emits `EMBEDDED_WORKBOOK_NOT_SYNCHRONIZED` rather than claiming that workbook data was updated. Advanced charts (other families, combo, ChartEx) are preserve-only in the community edition. -- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). Master/layout editing is available in the commercial edition repository. +- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). - `monitor` for live HTML preview and `render` for single-slide PNG screenshots (deck2html + Playwright). - Preservation of unknown parts and untouched nodes. ZIP files are recompressed, so fidelity is defined by uncompressed data for untouched entries rather than ZIP byte identity. diff --git a/README.ja.md b/README.ja.md index 7e540f5..cdb6ae7 100644 --- a/README.ja.md +++ b/README.ja.md @@ -11,12 +11,12 @@ +> Partial translation. See the [English README](https://github.com/deckflow/deckuse/blob/main/README.md) for current capabilities and installation. + Deckuse は、コーディングエージェント向けのローカルファーストかつスキーマ駆動の Office 文書自動化エンジンです。文書をバージョン管理されたワークスペースとして開き、エージェントが構造を検査・対象指定し、明示的な JSON コマンドを適用、検証して新しい文書を出力できます。 現在実装されている形式は PPTX と DOCX です。XLSX、Keynote、Numbers のアダプターは意図的に `FORMAT_NOT_IMPLEMENTED` を返します。これらはまだ編集対象としてサポートされていません。 -本リポジトリは**コミュニティ版**(`edition=community`)です。詳細は [docs/edition.md](docs/edition.md)。商用版は別リポジトリ `deckuse-commercial` にあります。 - ## Agent Skill(まずインストール) Deckuse はエージェント優先です。**CLI を使う前に Deckuse skill をインストールしてください**。workspace 優先のループ、バッチ `apply`、セマンティックアドレス、単位系、よく使うレシピが含まれており、README だけでは誤りやすいです。 @@ -317,7 +317,7 @@ Deckuse は、エージェントに安定した参照、セレクター、トラ - `replacePicture` replaces a picture’s embedded media in place while retaining its element reference and layer order. - Table-cell addressing by table ID, row, and column; table row/column insert and delete via `setProperties`; cell `fill`; speaker-note reading and text editing (notes parts are created automatically when writing `slide:N/notes` if missing). - Create charts (`bar` / `column` / `line` / `pie`) and edit chart title, series-name, and cached values. When an embedded workbook exists, Deckuse emits `EMBEDDED_WORKBOOK_NOT_SYNCHRONIZED` rather than claiming that workbook data was updated. Advanced charts (other families, combo, ChartEx) are preserve-only in the community edition. -- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). Master/layout editing is available in the commercial edition repository. +- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). - `monitor` for live HTML preview and `render` for single-slide PNG screenshots (deck2html + Playwright). - Preservation of unknown parts and untouched nodes. ZIP files are recompressed, so fidelity is defined by uncompressed data for untouched entries rather than ZIP byte identity. diff --git a/README.ko.md b/README.ko.md index ff920ef..8f7f506 100644 --- a/README.ko.md +++ b/README.ko.md @@ -11,12 +11,12 @@ +> Partial translation. See the [English README](https://github.com/deckflow/deckuse/blob/main/README.md) for current capabilities and installation. + Deckuse는 코딩 에이전트를 위한 로컬 우선, 스키마 기반 Office 문서 자동화 엔진입니다. 문서를 버전 관리되는 작업 공간으로 열고, 에이전트가 구조를 검사하고 대상 요소를 지정하여 명시적인 JSON 명령을 적용·검증한 뒤 새 문서로 내보낼 수 있게 합니다. 현재 구현된 형식은 PPTX와 DOCX입니다. XLSX, Keynote 및 Numbers 어댑터는 의도적으로 `FORMAT_NOT_IMPLEMENTED`를 반환하며, 아직 지원되는 편집 대상이 아닙니다. -이 저장소는 **커뮤니티 에디션**(`edition=community`)입니다. 자세한 내용은 [docs/edition.md](docs/edition.md)를 참고하세요. 상용 에디션은 별도 저장소 `deckuse-commercial`에 있습니다. - ## Agent Skill (먼저 설치) Deckuse는 에이전트 우선입니다. **CLI를 쓰기 전에 Deckuse skill을 설치하세요.** workspace 우선 루프, 배치 `apply`, 시맨틱 주소, 단위계, 자주 쓰는 레시피가 담겨 있어 README만으로는 틀리기 쉽습니다. @@ -317,7 +317,7 @@ Deckuse는 에이전트에 안정적인 참조, 선택자, 트랜잭션, 검증 - `replacePicture` replaces a picture’s embedded media in place while retaining its element reference and layer order. - Table-cell addressing by table ID, row, and column; table row/column insert and delete via `setProperties`; cell `fill`; speaker-note reading and text editing (notes parts are created automatically when writing `slide:N/notes` if missing). - Create charts (`bar` / `column` / `line` / `pie`) and edit chart title, series-name, and cached values. When an embedded workbook exists, Deckuse emits `EMBEDDED_WORKBOOK_NOT_SYNCHRONIZED` rather than claiming that workbook data was updated. Advanced charts (other families, combo, ChartEx) are preserve-only in the community edition. -- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). Master/layout editing is available in the commercial edition repository. +- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). - `monitor` for live HTML preview and `render` for single-slide PNG screenshots (deck2html + Playwright). - Preservation of unknown parts and untouched nodes. ZIP files are recompressed, so fidelity is defined by uncompressed data for untouched entries rather than ZIP byte identity. diff --git a/README.md b/README.md index 17ae487..5ac7815 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![Node.js 20.19.0+](https://img.shields.io/badge/Node.js-20.19.0%2B-339933?logo=node.js&logoColor=white)](https://nodejs.org/) [![pnpm 10](https://img.shields.io/badge/pnpm-10-F69220?logo=pnpm&logoColor=white)](https://pnpm.io/) [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) -[![PPTX](https://img.shields.io/badge/Format-PPTX-B7472A?logo=microsoftpowerpoint&logoColor=white)](#pptx-capabilities) +[![PPTX and DOCX](https://img.shields.io/badge/Formats-PPTX%20%2F%20DOCX-B7472A?logo=microsoftpowerpoint&logoColor=white)](#pptx-capabilities) [English](https://github.com/deckflow/deckuse/blob/main/README.md) · [简体中文](https://github.com/deckflow/deckuse/blob/main/README.zh-CN.md) · [Français](https://github.com/deckflow/deckuse/blob/main/README.fr.md) · [日本語](https://github.com/deckflow/deckuse/blob/main/README.ja.md) · [한국어](https://github.com/deckflow/deckuse/blob/main/README.ko.md) · [Русский](https://github.com/deckflow/deckuse/blob/main/README.ru.md) · [Español](https://github.com/deckflow/deckuse/blob/main/README.es.md) · [Português](https://github.com/deckflow/deckuse/blob/main/README.pt-BR.md) @@ -13,12 +13,37 @@ Deckuse is a local-first, schema-driven Office document automation engine for coding agents. It turns document editing into an explicit, reviewable workflow: open a versioned workspace, inspect and target its structure, apply JSON commands, validate the result, and export a new document. -The engine is built around format adapters. PPTX and DOCX are implemented. XLSX, Keynote, and Numbers adapters return `FORMAT_NOT_IMPLEMENTED` today, so agents fail clearly instead of silently producing unsafe edits. -Deckuse is a local-first, schema-driven Office document automation engine for coding agents. It opens a document into a versioned workspace, lets an agent inspect and target its structure with semantic addresses (`slide:1/shape:2`), applies explicit mutations, validates the result, and exports a new document. +PPTX and DOCX are implemented (**protocol 2.0**). See the [community capabilities](https://github.com/deckflow/deckuse/blob/main/docs/edition.md). XLSX, Keynote, and Numbers adapters deliberately return `FORMAT_NOT_IMPLEMENTED`; they are not supported editing targets yet. -This repository is the **community edition** (`edition=community`). See [docs/edition.md](https://github.com/deckflow/deckuse/blob/main/docs/edition.md). Shared source here is the source of truth, published as `@deckflow/deckuse`; the commercial edition is a private thin overlay (`deckuse-commercial`) that registers a `PptxEditionExtension` for gated writes and may add proprietary packages. +## Why Deckuse + +Deckuse lets an agent modify an existing presentation without recreating it from scratch. When you have no source file, `deckuse new` bootstraps a workspace from the bundled blank template. Its workflow is deliberately structural rather than visual: + +```text +existing.pptx → init ─┐ + ├→ list / get → set / add → validate → export +blank template → new ─┘ +``` + +Every successful write automatically commits a Git revision, updates `operations.jsonl`, rebuilds `package.pptx`, and refreshes `.deckuse/index.json`. Use `undo` to revert writes and `history` to inspect the operation log. -PPTX and DOCX are implemented (**protocol 2.0**). XLSX, Keynote, and Numbers adapters deliberately return `FORMAT_NOT_IMPLEMENTED`; they are not supported editing targets yet. +It preserves untouched XML and unknown package parts where possible. It is not a full PowerPoint rendering or layout engine and cannot reliably judge whether a slide is visually attractive or whether a layout is visually correct. Use `monitor` for live HTML preview and `render` to screenshot one or more slides to PNG for agent visual review. + +## Where it creates value + +Deckuse is designed for document changes that need to be precise, repeatable, +and auditable: + +- **Recurring content updates** — refresh dates, metrics, names, pricing, and + disclaimers without rebuilding a presentation. +- **Customer and market variants** — create controlled versions with explicit + selectors and reviewable operations. +- **Content governance** — query sensitive or outdated content, inspect every + match, and validate before export. +- **Agent-driven automation** — use structured JSON, revision checks, dry runs, + atomic batches, and operation logs in larger workflows. + +![Example PowerPoint slide from the Deckuse chart verification fixture](https://raw.githubusercontent.com/deckflow/deckuse/main/test/fixtures/visual/native/powerpoint-1.png) ## Agent quick start @@ -37,11 +62,11 @@ bootstrap below with `--handoff-json`. The unscoped package is deprecated. ## Install in a managed agent job From a reviewed checkout, run the [managed bootstrap](https://github.com/deckflow/deckuse/blob/main/scripts/managed-bootstrap.sh) -with an exact published version, an unused job directory, and an existing cache +with `latest` or an exact published version, an unused job directory, and an existing cache root approved by the host. The script prints the verified local CLI path. ```sh -sh scripts/managed-bootstrap.sh 1.9.3 ./deckuse-job /path/to/approved-cache +sh scripts/managed-bootstrap.sh latest ./deckuse-job /path/to/approved-cache ``` The script allocates an empty cache per job and stops with npm's failure code if @@ -64,7 +89,7 @@ deckuse_cli=./node_modules/.bin/deckuse "$deckuse_cli" export ./example.pptx --workspace ./example-workspace --json ``` -The example contains CLI apply operations. For first drafts, `data.applyContract` gives units, common enum values and directly usable operations. Request `--include-schema` when you need the protocol contract. Export and structural validation work without a browser. For optional preview, use `render --preflight --json` to check converter and browser setup. +The example contains CLI apply operations. For first drafts, `data.applyContract` gives units, common enum values and directly usable operations. Request `--include-schema` when you need the protocol contract. Export and structural validation work without a browser. For structural-only installs, use `npm install --omit=optional @deckflow/deckuse`. Install with optional dependencies enabled to add preview support. For optional preview, use `render --preflight --json` to check converter and browser setup. ## Use Deckuse with a coding agent @@ -78,38 +103,10 @@ npx skills add deckflow/deckuse Select your agent and installation scope when prompted. Use project scope for the current project or user scope to make the skill available across projects. For manual installation, copy the full `skills/deckuse/` directory into your agent's skills directory. See the [agent directory reference](https://github.com/vercel-labs/skills/blob/main/docs/agents.md). -If you installed the skill first, run `deckuse --version` to check whether the CLI is available. If it is missing, follow [Installation](#installation). If you already installed the CLI, use the command above when you want your agent to use Deckuse. For a version-pinned setup, install the skill from the release tag that matches your npm package version. +If you installed the skill first, run `deckuse --version` to check whether the CLI is available. If it is missing, follow [Installation](#installation). If you already installed the CLI, use the command above when you want your agent to use Deckuse. For a version-pinned setup, locate the Skill bundled with the installed CLI using `deckuse skill-path --json`. Once both are available, ask your agent for a concrete task, such as “Use Deckuse to update the figures in `report.pptx` and export a revised copy.” -## Why Deckuse - -Deckuse lets an agent modify an existing presentation without recreating it from scratch. When you have no source file, `deckuse new` bootstraps a workspace from the bundled blank template. Its workflow is deliberately structural rather than visual: - -```text -existing.pptx → init ─┐ - ├→ list / get → set / add → validate → export -blank template → new ─┘ -``` - -Every successful write automatically commits a Git revision, updates `operations.jsonl`, rebuilds `package.pptx`, and refreshes `.deckuse/index.json`. Use `undo` to revert writes and `history` to inspect the operation log. - -It preserves untouched XML and unknown package parts where possible. It is not a full PowerPoint rendering or layout engine and cannot reliably judge whether a slide is visually attractive or whether a layout is visually correct. Use `monitor` for live HTML preview and `render` to screenshot one slide to PNG for agent visual review. Semantic `diff` / `branch` remain deferred past Phase 1a. - -## Where it creates value - -Deckuse is designed for document changes that need to be precise, repeatable, -and auditable: - -- **Recurring content updates** — refresh dates, metrics, names, pricing, and - disclaimers without rebuilding a presentation. -- **Customer and market variants** — create controlled versions with explicit - selectors and reviewable operations. -- **Content governance** — query sensitive or outdated content, inspect every - match, and validate before export. -- **Agent-driven automation** — use structured JSON, revision checks, dry runs, - atomic batches, and operation logs in larger workflows. - ## Installation Requires Node.js 20.19.0 or later. @@ -177,6 +174,8 @@ Command results use a JSON envelope (`ok`, `command`, `revision`, `data` / `erro ### Selectors +The optional `deckuse find` command uses `TYPESAFE_API_KEY` to call TypeSafe at `api.typesafe.ai`. It sends the query and candidate names, visible text excerpts, and layout context for ranking. Use `search` and `list` for offline inspection. + Prefer `search text` / `search shape` and `list` for Phase 1a inventory. `query` remains available for back-compat and accepts either a selector string or a structured selector in a command. Space-separated terms are combined with AND. | Syntax | Meaning | @@ -388,17 +387,17 @@ Deckuse gives the agent stable references, selectors, transactions, validation, - `setTransform` for explicit object position, size, rotation, and flip changes. - `setProperties` for common shape and text properties, including `paragraph.align` (aliases `center`/`left`/…), `paragraph.level`, `bullet`, `fill` transparency, `hyperlink`, `wrap`, `anchor`/`valign`, and `cornerRadius`. - Add, duplicate, remove, and rebind slides to another layout (`setSlideLayout` / `deckuse set slide-layout`); layout refs accept index, `layout:N`, `slide:N`, display name, or basename. Rebind updates the relationship only (does not edit layout parts). Duplicated slides clone mutable notes and chart parts while layouts and media can be shared safely. -- Add shapes/text boxes (optional `role` writes a `p:ph` placeholder), straight connectors (`line`/`connector`), elbow/curved connectors, arrow presets, groups, pictures (from a file path or base64), tables, charts (cache-only), and embedded video/audio; duplicate or remove elements. +- Add shapes/text boxes (optional `role` writes a `p:ph` placeholder), straight connectors (`line`/`connector`), elbow/curved connectors, arrow presets, groups, pictures (from a file path or base64), tables, basic charts, and embedded video/audio; duplicate or remove elements. - `role` must be an OOXML placeholder type (`title`, `body`, `subTitle`, `ctrTitle`, …). Common aliases like `subtitle`→`subTitle` are normalized; non-OOXML labels (for example `card`) are rejected so PowerPoint does not prompt to repair. - Address placeholders with `slide:N/placeholder:` (for example `title`, `body`, `subTitle`, `ctrTitle`). Target `slide:N/shape:X/run:K` to style a single run. - `replacePicture` replaces a picture’s embedded media in place while retaining its element reference and layer order. - Table-cell addressing by table ID, row, and column; table row/column insert and delete via `setProperties`; cell `fill`; speaker-note reading and text editing (notes parts are created automatically when writing `slide:N/notes` if missing). Tables support `height: "auto"`, themes `minimal`/`zebra`, and `alignColumns`. -- Create charts (`bar` / `column` / `line` / `pie` / limited `combo` dual-axis) and edit chart title, series-name, cached values, data labels, series colors, and value format codes. When an embedded workbook exists, Deckuse emits `EMBEDDED_WORKBOOK_NOT_SYNCHRONIZED` rather than claiming that workbook data was updated. Advanced charts (other families, ChartEx) are preserve-only in the community edition. Community `render` may not show custom series colors faithfully — verify chart XML or PowerPoint. -- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). Master/layout editing is available in the commercial edition repository. +- Create charts (`bar` / `column` / `line` / `pie` / limited `combo` dual-axis) and edit chart title, series-name, cached values, data labels, series colors, and value format codes. Supported embedded workbooks can be synchronized with chart values. Validation reports whether workbook data was synchronized or needs review. Advanced charts (other families, ChartEx) are preserve-only in the community edition. Community `render` may not show custom series colors faithfully — verify chart XML or PowerPoint. +- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). - `monitor` for live HTML preview (`monitor start|status|stop`; use `--port 0` for an ephemeral port) and `render` for single-slide PNG screenshots (`--scale` supported; deck2html + Playwright). `deckuse schema` prints command JSON Schema; `deckuse measure` estimates text box size heuristically. - Preservation of unknown parts and untouched nodes. ZIP files are recompressed, so fidelity is defined by uncompressed data for untouched entries rather than ZIP byte identity. -Agent quick reference: [docs/agent-cookbook.md](https://github.com/deckflow/deckuse/blob/main/docs/agent-cookbook.md). Requires **CLI >= 1.2.0**. +Agent quick reference: [docs/agent-cookbook.md](https://github.com/deckflow/deckuse/blob/main/docs/agent-cookbook.md). ## DOCX capabilities @@ -408,7 +407,7 @@ Word uses the same workspace loop as PPTX (`new` / `init`, `list`, `apply`, `val - `setText`, `replaceText` (matches across runs inside one paragraph, including text split by `w:proofErr`), `setProperties` (`fontSize`, `bold`, `italic`, `underline`, `textColor`, `fontFamily`, `paragraph.align`, `paragraph.style`). - `addParagraph` (`name` writes a bookmark for same-batch `bookmark:` refs), `addTable`, `insertBreak` (`page`). CLI: `deckuse add paragraph|table|break`. - Slide commands (`addShape`, `xfrmSet`, `alignElements`, …) return `UNSUPPORTED_CAPABILITY`. -- Tracked changes, fields, comments, content controls, and equations are preserved. A command that would have to rewrite them fails instead of stripping them. +- Native comment threads and tracked-change proposals support review with atomic accept/reject. Ordinary edits preserve protected content such as fields, content controls, and equations. - Community edition does not write style definitions, numbering definitions, theme, or settings parts. - `render` supports PPTX and DOCX through deck2html → HTML → Playwright screenshots. DOCX page numbers follow HTML pagination and may differ from Word. @@ -436,11 +435,11 @@ The complete command schema is at `schema/command.schema.json`. The TypeScript p ## Limitations - Deckuse does not implement the full PowerPoint DrawingML surface, animation editing, SmartArt editing, OLE editing, or macro editing. -- It is not a full PowerPoint rendering or layout engine. `monitor` and `render` provide HTML/PNG review aids only; do not rely on them to assess visual quality, detect overlap, or automatically improve slide design. -- Chart creation and edits update OOXML chart caches only; embedded Excel workbooks are not rewritten. +- It is not a full PowerPoint rendering or layout engine. `monitor` and `render` provide HTML/PNG review aids only; browser-measured warnings describe the HTML preview and can differ from native Office layout. +- Embedded chart workbook synchronization is limited to supported workbook and chart structures. Check validation diagnostics before treating cached chart data and workbook cells as consistent. - Embedded video/audio use a generated poster frame; playback timing and advanced media options are not edited. - Duplicated slides clone notes and chart parts and reuse layouts, themes, and media. Complex custom XML extensions are retained but not edited semantically. -- `setText` and `replaceText` collapse multi-run text within each paragraph into one run while retaining the first run’s style; newlines in `setText` create separate paragraphs. +- Text replacement can preserve formatting across runs. Unsupported protected ranges are rejected. Use rich-text blocks when explicitly setting multiple styles. ## Development checks diff --git a/README.pt-BR.md b/README.pt-BR.md index 46531b8..78caaca 100644 --- a/README.pt-BR.md +++ b/README.pt-BR.md @@ -11,12 +11,12 @@ +> Partial translation. See the [English README](https://github.com/deckflow/deckuse/blob/main/README.md) for current capabilities and installation. + Deckuse é um mecanismo local-first e orientado por esquema para automatização de documentos Office por agentes de código. Ele abre um documento em um espaço de trabalho versionado, permite que um agente inspecione e selecione sua estrutura, aplica comandos JSON explícitos, valida o resultado e exporta um novo documento. PPTX e DOCX estão implementados. Os adaptadores XLSX, Keynote e Numbers retornam deliberadamente `FORMAT_NOT_IMPLEMENTED`; eles ainda não são destinos de edição suportados. -Este repositório é a **edição community** (`edition=community`). Veja [docs/edition.md](docs/edition.md). A edição comercial fica no repositório separado `deckuse-commercial`. - ## Agent Skill (instale primeiro) O Deckuse é feito para agentes. **Instale o skill do Deckuse antes de usar a CLI** — ele codifica o loop workspace-first, o `apply` em lote, endereços semânticos, unidades e receitas de alto valor. @@ -317,7 +317,7 @@ O Deckuse fornece ao agente referências estáveis, seletores, transações, val - `replacePicture` replaces a picture’s embedded media in place while retaining its element reference and layer order. - Table-cell addressing by table ID, row, and column; table row/column insert and delete via `setProperties`; cell `fill`; speaker-note reading and text editing (notes parts are created automatically when writing `slide:N/notes` if missing). - Create charts (`bar` / `column` / `line` / `pie`) and edit chart title, series-name, and cached values. When an embedded workbook exists, Deckuse emits `EMBEDDED_WORKBOOK_NOT_SYNCHRONIZED` rather than claiming that workbook data was updated. Advanced charts (other families, combo, ChartEx) are preserve-only in the community edition. -- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). Master/layout editing is available in the commercial edition repository. +- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). - `monitor` for live HTML preview and `render` for single-slide PNG screenshots (deck2html + Playwright). - Preservation of unknown parts and untouched nodes. ZIP files are recompressed, so fidelity is defined by uncompressed data for untouched entries rather than ZIP byte identity. diff --git a/README.ru.md b/README.ru.md index c8b63cc..5e89d51 100644 --- a/README.ru.md +++ b/README.ru.md @@ -11,12 +11,12 @@ +> Partial translation. See the [English README](https://github.com/deckflow/deckuse/blob/main/README.md) for current capabilities and installation. + Deckuse — локальный, управляемый схемами движок автоматизации документов Office для кодовых агентов. Он открывает документ в версионированном рабочем пространстве, позволяет агенту исследовать и точно выбирать структуру, применять явные JSON-команды, проверять результат и экспортировать новый документ. Сейчас реализованы форматы PPTX и DOCX. Адаптеры XLSX, Keynote и Numbers намеренно возвращают `FORMAT_NOT_IMPLEMENTED`; пока они не поддерживаются как цели редактирования. -Этот репозиторий — **community-редакция** (`edition=community`). См. [docs/edition.md](docs/edition.md). Коммерческая редакция живёт в отдельном репозитории `deckuse-commercial`. - ## Agent Skill (установите сначала) Deckuse рассчитан на агентов. **Перед использованием CLI установите skill Deckuse** — в нём зафиксированы workspace-first цикл, пакетный `apply`, семантические адреса, единицы измерения и полезные рецепты. @@ -317,7 +317,7 @@ Deckuse даёт агенту стабильные ссылки, селекто - `replacePicture` replaces a picture’s embedded media in place while retaining its element reference and layer order. - Table-cell addressing by table ID, row, and column; table row/column insert and delete via `setProperties`; cell `fill`; speaker-note reading and text editing (notes parts are created automatically when writing `slide:N/notes` if missing). - Create charts (`bar` / `column` / `line` / `pie`) and edit chart title, series-name, and cached values. When an embedded workbook exists, Deckuse emits `EMBEDDED_WORKBOOK_NOT_SYNCHRONIZED` rather than claiming that workbook data was updated. Advanced charts (other families, combo, ChartEx) are preserve-only in the community edition. -- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). Master/layout editing is available in the commercial edition repository. +- List and resolve master, layout, and theme parts; community edition rejects writes to those parts (`UNSUPPORTED_CAPABILITY`). - `monitor` for live HTML preview and `render` for single-slide PNG screenshots (deck2html + Playwright). - Preservation of unknown parts and untouched nodes. ZIP files are recompressed, so fidelity is defined by uncompressed data for untouched entries rather than ZIP byte identity. diff --git a/README.zh-CN.md b/README.zh-CN.md index b6fce49..b3bfedf 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -11,9 +11,9 @@ -Deckuse 是一款面向编程智能体的本地优先、模式驱动的 Office 文档自动化引擎。它将文档打开为带版本的工作区,让智能体用语义地址(如 `slide:1/shape:2`)检查并精确定位结构,执行显式变更、验证结果,再导出新文档。 +> Partial translation. See the [English README](https://github.com/deckflow/deckuse/blob/main/README.md) for current capabilities and installation. -本仓库为**社区版**(`edition=community`),说明见 [docs/edition.md](docs/edition.md)。共享源码以此仓为唯一源,发布为 `@deckflow/deckuse`;商业版是私有薄覆盖层仓库 `deckuse-commercial`(注册 `PptxEditionExtension`,并可增加专有包)。 +Deckuse 是一款面向编程智能体的本地优先、模式驱动的 Office 文档自动化引擎。它将文档打开为带版本的工作区,让智能体用语义地址(如 `slide:1/shape:2`)检查并精确定位结构,执行显式变更、验证结果,再导出新文档。 目前已实现 PPTX 与 DOCX(**协议 2.0**)。XLSX、Keynote 和 Numbers 适配器会明确返回 `FORMAT_NOT_IMPLEMENTED`;它们尚不是受支持的编辑目标。Word 与 PPTX 共用工作区循环(`new --format docx`、`init`、`apply`、`validate`、`export`),寻址用 `body/p:N`、`bookmark:名称`、`para:`,而不是幻灯片形状。`render --page` 仍只支持 PPTX。完整说明见 [README.md](README.md) 的 DOCX capabilities。 diff --git a/docs/edition.md b/docs/edition.md index 4468761..64a4211 100644 --- a/docs/edition.md +++ b/docs/edition.md @@ -2,18 +2,6 @@ This repository is the **community** product line (`edition=community`). It is the **sole source of truth** for shared Deckuse source (`src/core`, `src/opc`, `src/pptx`, `src/workspace`, …), published as the single npm package `@deckflow/deckuse`. -The commercial product lives in the private `deckuse-commercial` repository as a **thin overlay**: it registers a `PptxEditionExtension`, supplies its own edition metadata / licensing, and may add proprietary packages. It must not maintain a second copy of shared source, and must not rewrite community `src/edition-config` in this tree. - -## Capability classes - -| Class | Meaning | Where code lives | -| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | -| **Shared primitives** | OOXML helpers used by community slide / basic-chart edits (`setNodeText`, `applyChartProperties`, …) | Public `src/pptx` in `@deckflow/deckuse` | -| **Edition-gated writes** | Master / Layout / Theme / Advanced Chart writes are **hard-denied** in shared mutation code. `assertWritable` cannot unlock them. | Commercial overlay must implement `applyGatedMutation` / `writeGatedText` in a private package | -| **B — proprietary** | Editors and mappings that must not appear in this public tree (master/layout apply path, `p:cSld/p:bg` writer, office2html plus, …) | Only `deckuse-commercial` private packages, injected through the same extension hooks | - -Runtime edition gates (`UNSUPPORTED_CAPABILITY`) are **not** a secrecy mechanism for shared primitives. Anything committed here is visible under AGPL. Commercial overlays own the _product write implementations_ for gated targets (`applyGatedMutation` / `writeGatedText`); they must not rely on flipping `editionCapabilities` or on `assertWritable` alone. - ## Boundaries (community) Authorization rules come from the edition scope matrix (Master/Layout/Theme/Advanced Chart, etc.). @@ -27,21 +15,13 @@ Community edition: - **Rejects** edits to **advanced** charts (other non-basic families, ChartEx, unclassifiable charts, combos other than bar+line). - Embeds the closed-source `deck2html` engine for PPTX and DOCX conversion. `deckuse render` captures the resulting HTML with Playwright; DOCX page numbers follow HTML pagination. -DOCX community writes cover body paragraphs, runs, tables, bookmarks, and page breaks, including applying a style id that already exists in the document. Writes to `word/styles.xml`, `word/numbering.xml` definitions, `word/theme/`, and `word/settings.xml` are rejected. Tracked changes, fields, comments, content controls, and equations stay untouched; a command that would have to rewrite them fails. +DOCX community writes cover body paragraphs, runs, tables, bookmarks, and page breaks, including applying a style id that already exists in the document. Writes to `word/styles.xml`, `word/numbering.xml` definitions, `word/theme/`, and `word/settings.xml` are rejected. Native comments and tracked changes use dedicated review commands. Ordinary writes preserve protected content such as fields, content controls, and equations. `editionCapabilities` is **status metadata** only. Proprietary write authorization lives in commercial packages via `registerPptxEditionExtension`. -## License / certificate verification - -Runtime commercial license checks (issue, verify, activate, `--license` / `DECKUSE_LICENSE` / `deckuse.lic`, and any `licensing/` gate) **must live only** in the private `deckuse-commercial` repository. This community repo’s `src/edition-config` is constants-only: it must not contain licensing source, stubs, or conditional activation logic. `pnpm check:no-commercial-leak` enforces that boundary. - -### Commercial overlay migration note - -Previously, commercial builds swapped the separate npm package `@deckflow/deckuse-edition-config`. That package no longer exists: edition constants live in `src/edition-config` inside `@deckflow/deckuse`. Commercial overlays should: +## Distribution boundary -1. Keep shared source synced from this community repo (do not fork `src/pptx` / `src/core` / …). -2. Register a `PptxEditionExtension` (and any proprietary adapters) from commercial-only packages. -3. Supply commercial edition metadata / licensing from commercial entrypoints — never by patching community `src/edition-config` for publish of this AGPL package. +The public package includes shared editing primitives and capability metadata. The extension hook is an integration boundary for separate builds. The public CI and release checks use `pnpm check:no-commercial-leak` to prevent proprietary licensing or overlay code from entering the community artifact. ## Observability diff --git a/package.json b/package.json index ca4a825..5e267f1 100644 --- a/package.json +++ b/package.json @@ -68,15 +68,11 @@ }, "dependencies": { "@deckflow/deck2html": "^0.7.0", - "@fortawesome/fontawesome-free": "6.5.2", "@typesafe-ai/sdk": "^0.6.0", "@xmldom/xmldom": "^0.9.10", "@zip.js/zip.js": "^2.8.34", - "isomorphic-git": "latest", - "playwright-core": "^1.62.1", - "echarts": "5.5.1", - "tailwindcss": "3.4.17", - "zod": "latest" + "isomorphic-git": "^1.42.2", + "zod": "^4.6.5" }, "devDependencies": { "@changesets/cli": "latest", @@ -93,5 +89,11 @@ "type": "git", "url": "git+https://github.com/deckflow/deckuse.git" }, - "homepage": "https://github.com/deckflow/deckuse#readme" + "homepage": "https://github.com/deckflow/deckuse#readme", + "optionalDependencies": { + "@fortawesome/fontawesome-free": "6.5.2", + "echarts": "5.5.1", + "playwright-core": "^1.62.1", + "tailwindcss": "3.4.17" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2770afe..7297552 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,11 +9,8 @@ importers: .: dependencies: '@deckflow/deck2html': - specifier: ^0.6.2 - version: 0.6.2 - '@fortawesome/fontawesome-free': - specifier: 6.5.2 - version: 6.5.2 + specifier: ^0.7.0 + version: 0.7.0 '@typesafe-ai/sdk': specifier: ^0.6.0 version: 0.6.0 @@ -23,20 +20,11 @@ importers: '@zip.js/zip.js': specifier: ^2.8.34 version: 2.8.34 - echarts: - specifier: 5.5.1 - version: 5.5.1 isomorphic-git: - specifier: latest + specifier: ^1.42.2 version: 1.42.2 - playwright-core: - specifier: ^1.62.1 - version: 1.62.1 - tailwindcss: - specifier: 3.4.17 - version: 3.4.17 zod: - specifier: latest + specifier: ^4.6.5 version: 4.6.5 devDependencies: '@changesets/cli': @@ -66,6 +54,19 @@ importers: vitest: specifier: latest version: 5.0.0(@types/node@26.4.1)(vite@8.2.0(@types/node@26.4.1)(yaml@2.9.0)) + optionalDependencies: + '@fortawesome/fontawesome-free': + specifier: 6.5.2 + version: 6.5.2 + echarts: + specifier: 5.5.1 + version: 5.5.1 + playwright-core: + specifier: ^1.62.1 + version: 1.62.1 + tailwindcss: + specifier: 3.4.17 + version: 3.4.17 packages/core: dependencies: @@ -256,28 +257,28 @@ packages: resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} engines: {node: '>= 20.12.0'} - '@deckflow/deck2html-darwin-arm64@0.6.2': - resolution: {integrity: sha512-oWxIzz+LOEhXk+BvVhgR25GNuHZUBPuObYsNDLRaRQTM/F9aNJetjyluibmUFa2Xr8yk0EJBvC6Ipp8hiJxc9w==} + '@deckflow/deck2html-darwin-arm64@0.7.0': + resolution: {integrity: sha512-7Bd47rGNzikLr7XOHez4pfinB0HfkWp48221fIyZECux/pjrtovWP8NaR4EFSMyKrBuWA+T0U/QtRYLrygV7gg==} cpu: [arm64] os: [darwin] - '@deckflow/deck2html-darwin-x64@0.6.2': - resolution: {integrity: sha512-SBzqaZ83i7ppw413YiN/wUcLsvhQ0cMMFZiSSaz+4fRRwv2yRYbrbOx0k3VVKBq63uEU1V9Y4W2aupq4I/BTRQ==} + '@deckflow/deck2html-darwin-x64@0.7.0': + resolution: {integrity: sha512-Wvr+QV2qs+aWIsxEifnUhlP7TDrhOnll0ap2pucs9mno6CFQeHwz229h9axFkV1dYEbTK0zhTSc6rHD2CPc8cA==} cpu: [x64] os: [darwin] - '@deckflow/deck2html-linux-x64@0.6.2': - resolution: {integrity: sha512-iADG8sbGWtuG7PobN5Og8y15ezm5vR9Bxi/9AVmRFlSLcdQ+Q0jYt4V6aYaioLlkfPPl4i7RJ15FxqV0l+iHKw==} + '@deckflow/deck2html-linux-x64@0.7.0': + resolution: {integrity: sha512-CHKBnNLsRlV5gUBnFZDarp47zjP+BIsLUplGZK+qCEYozCiawzMX6VYuh5FnHuLsYfKOwbAUVZ8jD+pE+VLvFw==} cpu: [x64] os: [linux] - '@deckflow/deck2html-win32-x64@0.6.2': - resolution: {integrity: sha512-iPJJrCoz8XYL7clfy7D4cqh8y16SO7O+ywB5FA6ZDdyCa9JI9NHvIAk+fI9RYXYIKlItpQ4M1/jfjx49+QIoTA==} + '@deckflow/deck2html-win32-x64@0.7.0': + resolution: {integrity: sha512-ATE7/tumEogCH09twef/tISxpx2ogoC2qH9o7Msjl8dUT4x3t02iIiSc8lxFUyxi/mbk7eGwB/YtrNIDFrhYzw==} cpu: [x64] os: [win32] - '@deckflow/deck2html@0.6.2': - resolution: {integrity: sha512-xJiOPYDxhRStaoSmYem5VvMMbmqQN1r1OXUJos1TUivvPBdJpXvTJ4vfpVTtO+i2eo4g/Nd2nBF+d2OeAZZecQ==} + '@deckflow/deck2html@0.7.0': + resolution: {integrity: sha512-xQ89WfGU9Dnvz8T4Rhv2LPnDk8fjZFn3EisYCsObX9MPuzIYguYW763gzkMmUZpJ3jqTzAhWl24+qZzUFsp4qg==} hasBin: true '@deckflow/decktools-sdk@1.0.0': @@ -1701,7 +1702,8 @@ packages: snapshots: - '@alloc/quick-lru@5.3.0': {} + '@alloc/quick-lru@5.3.0': + optional: true '@changesets/apply-release-plan@8.1.0': dependencies: @@ -1819,27 +1821,27 @@ snapshots: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@deckflow/deck2html-darwin-arm64@0.6.2': + '@deckflow/deck2html-darwin-arm64@0.7.0': optional: true - '@deckflow/deck2html-darwin-x64@0.6.2': + '@deckflow/deck2html-darwin-x64@0.7.0': optional: true - '@deckflow/deck2html-linux-x64@0.6.2': + '@deckflow/deck2html-linux-x64@0.7.0': optional: true - '@deckflow/deck2html-win32-x64@0.6.2': + '@deckflow/deck2html-win32-x64@0.7.0': optional: true - '@deckflow/deck2html@0.6.2': + '@deckflow/deck2html@0.7.0': dependencies: '@deckflow/decktools-sdk': 1.0.0 jszip: 3.10.2 optionalDependencies: - '@deckflow/deck2html-darwin-arm64': 0.6.2 - '@deckflow/deck2html-darwin-x64': 0.6.2 - '@deckflow/deck2html-linux-x64': 0.6.2 - '@deckflow/deck2html-win32-x64': 0.6.2 + '@deckflow/deck2html-darwin-arm64': 0.7.0 + '@deckflow/deck2html-darwin-x64': 0.7.0 + '@deckflow/deck2html-linux-x64': 0.7.0 + '@deckflow/deck2html-win32-x64': 0.7.0 transitivePeerDependencies: - debug - supports-color @@ -1920,7 +1922,8 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@fortawesome/fontawesome-free@6.5.2': {} + '@fortawesome/fontawesome-free@6.5.2': + optional: true '@humanfs/core@0.19.2': dependencies: @@ -1942,6 +1945,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + optional: true '@jridgewell/resolve-uri@3.1.2': {} @@ -1971,13 +1975,16 @@ snapshots: dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 + optional: true - '@nodelib/fs.stat@2.0.5': {} + '@nodelib/fs.stat@2.0.5': + optional: true '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.3 + optional: true '@oxc-project/types@0.143.0': {} @@ -2177,14 +2184,17 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - any-promise@1.3.0: {} + any-promise@1.3.0: + optional: true anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.2 + optional: true - arg@5.0.2: {} + arg@5.0.2: + optional: true assertion-error@2.0.1: {} @@ -2210,7 +2220,8 @@ snapshots: base64-js@1.5.1: {} - binary-extensions@2.3.0: {} + binary-extensions@2.3.0: + optional: true brace-expansion@5.0.9: dependencies: @@ -2219,6 +2230,7 @@ snapshots: braces@3.0.3: dependencies: fill-range: 7.1.1 + optional: true buffer@6.0.3: dependencies: @@ -2244,7 +2256,8 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - camelcase-css@2.0.1: {} + camelcase-css@2.0.1: + optional: true chai@6.2.2: {} @@ -2259,6 +2272,7 @@ snapshots: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 + optional: true clean-git-ref@2.0.1: {} @@ -2266,7 +2280,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@4.1.1: {} + commander@4.1.1: + optional: true core-util-is@1.0.3: {} @@ -2278,7 +2293,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cssesc@3.0.0: {} + cssesc@3.0.0: + optional: true debug@4.4.3: dependencies: @@ -2300,11 +2316,13 @@ snapshots: detect-libc@2.1.2: {} - didyoumean@1.2.2: {} + didyoumean@1.2.2: + optional: true diff3@0.0.3: {} - dlv@1.1.3: {} + dlv@1.1.3: + optional: true dunder-proto@1.0.1: dependencies: @@ -2316,6 +2334,7 @@ snapshots: dependencies: tslib: 2.3.0 zrender: 5.6.0 + optional: true es-define-property@1.0.1: {} @@ -2425,6 +2444,7 @@ snapshots: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 + optional: true fast-json-stable-stringify@2.1.0: {} @@ -2443,6 +2463,7 @@ snapshots: fastq@1.20.3: dependencies: reusify: 1.1.0 + optional: true fdir@6.5.0(picomatch@4.0.7): optionalDependencies: @@ -2455,6 +2476,7 @@ snapshots: fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 + optional: true find-up@5.0.0: dependencies: @@ -2508,6 +2530,7 @@ snapshots: glob-parent@5.1.2: dependencies: is-glob: 4.0.3 + optional: true glob-parent@6.0.2: dependencies: @@ -2555,12 +2578,14 @@ snapshots: is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 + optional: true is-callable@1.2.7: {} is-core-module@2.18.0: dependencies: hasown: 2.0.4 + optional: true is-extglob@2.1.1: {} @@ -2568,7 +2593,8 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-number@7.0.0: {} + is-number@7.0.0: + optional: true is-typed-array@1.1.15: dependencies: @@ -2608,7 +2634,8 @@ snapshots: sha.js: 2.4.12 simple-get: 4.0.1 - jiti@1.21.7: {} + jiti@1.21.7: + optional: true jju@1.4.0: {} @@ -2694,9 +2721,11 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 - lilconfig@3.1.4: {} + lilconfig@3.1.4: + optional: true - lines-and-columns@1.2.4: {} + lines-and-columns@1.2.4: + optional: true locate-path@6.0.0: dependencies: @@ -2708,12 +2737,14 @@ snapshots: math-intrinsics@1.1.0: {} - merge2@1.4.1: {} + merge2@1.4.1: + optional: true micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.2 + optional: true mime-db@1.52.0: {} @@ -2740,16 +2771,20 @@ snapshots: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 + optional: true nanoid@3.3.17: {} natural-compare@1.4.0: {} - normalize-path@3.0.0: {} + normalize-path@3.0.0: + optional: true - object-assign@4.1.1: {} + object-assign@4.1.1: + optional: true - object-hash@3.0.0: {} + object-hash@3.0.0: + optional: true obug@2.1.4: {} @@ -2786,11 +2821,13 @@ snapshots: path-key@3.1.1: {} - path-parse@1.0.7: {} + path-parse@1.0.7: + optional: true picocolors@1.1.1: {} - picomatch@2.3.2: {} + picomatch@2.3.2: + optional: true picomatch@4.0.5: {} @@ -2798,7 +2835,8 @@ snapshots: pify@4.0.1: {} - pirates@4.0.7: {} + pirates@4.0.7: + optional: true playwright-core@1.62.1: {} @@ -2810,11 +2848,13 @@ snapshots: postcss-value-parser: 4.2.0 read-cache: 1.0.2 resolve: 1.22.14 + optional: true postcss-js@4.1.0(postcss@8.5.25): dependencies: camelcase-css: 2.0.1 postcss: 8.5.25 + optional: true postcss-load-config@4.0.2(postcss@8.5.25): dependencies: @@ -2822,18 +2862,22 @@ snapshots: yaml: 2.9.0 optionalDependencies: postcss: 8.5.25 + optional: true postcss-nested@6.2.0(postcss@8.5.25): dependencies: postcss: 8.5.25 postcss-selector-parser: 6.1.5 + optional: true postcss-selector-parser@6.1.5: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + optional: true - postcss-value-parser@4.2.0: {} + postcss-value-parser@4.2.0: + optional: true postcss@8.5.25: dependencies: @@ -2853,9 +2897,11 @@ snapshots: punycode@2.3.1: {} - queue-microtask@1.2.3: {} + queue-microtask@1.2.3: + optional: true - read-cache@1.0.2: {} + read-cache@1.0.2: + optional: true readable-stream@2.3.8: dependencies: @@ -2878,6 +2924,7 @@ snapshots: readdirp@3.6.0: dependencies: picomatch: 2.3.2 + optional: true resolve@1.22.14: dependencies: @@ -2885,8 +2932,10 @@ snapshots: is-core-module: 2.18.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + optional: true - reusify@1.1.0: {} + reusify@1.1.0: + optional: true rolldown@1.2.3: dependencies: @@ -2911,6 +2960,7 @@ snapshots: run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + optional: true safe-buffer@5.1.2: {} @@ -2978,8 +3028,10 @@ snapshots: pirates: 4.0.7 tinyglobby: 0.2.17 ts-interface-checker: 0.1.13 + optional: true - supports-preserve-symlinks-flag@1.0.0: {} + supports-preserve-symlinks-flag@1.0.0: + optional: true tailwindcss@3.4.17: dependencies: @@ -3007,14 +3059,17 @@ snapshots: sucrase: 3.35.1 transitivePeerDependencies: - ts-node + optional: true thenify-all@1.6.0: dependencies: thenify: 3.3.1 + optional: true thenify@3.3.1: dependencies: any-promise: 1.3.0 + optional: true tinybench@6.1.4: {} @@ -3034,14 +3089,17 @@ snapshots: to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + optional: true ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 - ts-interface-checker@0.1.13: {} + ts-interface-checker@0.1.13: + optional: true - tslib@2.3.0: {} + tslib@2.3.0: + optional: true type-check@0.4.0: dependencies: @@ -3145,3 +3203,4 @@ snapshots: zrender@5.6.0: dependencies: tslib: 2.3.0 + optional: true diff --git a/scripts/release.sh b/scripts/release.sh index 99ff52c..cc255ef 100755 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -13,7 +13,10 @@ usage() { cat <&2 + exit 1 +fi +if [[ "$(git rev-parse --verify --quiet "refs/tags/${tag}^{commit}")" != "$(git rev-parse HEAD)" ]]; then + echo "The release tag ${tag} must point at HEAD before publishing." >&2 + exit 1 +fi +if ! git diff HEAD --quiet -- package.json CHANGELOG.md .changeset; then + echo "Commit the release version, changelog and changesets before publishing." >&2 + exit 1 +fi + echo "==> Building" pnpm build diff --git a/skills/deckuse/SKILL.md b/skills/deckuse/SKILL.md index 48b90c9..dc752f2 100644 --- a/skills/deckuse/SKILL.md +++ b/skills/deckuse/SKILL.md @@ -2,8 +2,6 @@ name: deckuse description: Create, recreate, edit, populate, inspect, render, or export PowerPoint presentations and Word documents with the Deckuse CLI. Use for new PPTX/DOCX files, editable slides from PDF/image references, changes to existing Office files, template-driven documents, and document QA. Routes to one task workflow and loads only the relevant instructions. compatibility: Requires an installed Deckuse CLI; use the installed package version and capability fingerprint. Optional capability helper requires Python 3. HTML previews require a host-approved Playwright browser. PDF/image extraction and native Office review use available host tools. -metadata: - version: '1.5.0' --- # Deckuse diff --git a/skills/deckuse/modules/cli-context.md b/skills/deckuse/modules/cli-context.md index 4d1ece9..4e5ed1b 100644 --- a/skills/deckuse/modules/cli-context.md +++ b/skills/deckuse/modules/cli-context.md @@ -12,6 +12,8 @@ deckuse agent-context --format pptx --scenario create --json Use `--workspace ./ws` for an existing workspace and select the matching scenario. For Word use `--format docx` with `create`, `edit`, `audit` or `preview-export`. Cache static contracts by executable and capability fingerprint. Read live revision and targets before each write. For PPTX creation, start with `data.applyContract` for copyable CLI operations, geometry units, text and style examples. Use v2 `operationFields` to find additional top-level fields by name. Query `schema --type addShape --field blocks --json` for one dereferenced field, or `schema --type --json` for the complete operation, or request `--include-schema` for the complete scenario contract. Run an explicit render preflight to check the environment. For older releases, use the fallback below. +Use `search` or `list` for offline inspection. `find` requires `TYPESAFE_API_KEY` and sends the query and candidate names, visible text excerpts, and layout context to `api.typesafe.ai`. Use it when the task permits sending this content to the service. + Use an existing task snapshot if it matches the selected executable, release/edition and format. Otherwise collect `deckuse --version` and `deckuse schema --json`, saving full stdout/stderr/exit code separately. The schema envelope contains `cliVersion`, `protocolVersion`, `edition`, and `schema`. It lists protocol operations, not proof of every edition/format capability. Keep the complete schema on disk and extract only task-relevant definitions into context. Optional helper (replace SKILL_ROOT and TASK_CONTEXT with absolute paths already known to the host; do not literally execute placeholders): diff --git a/src/agent-context.ts b/src/agent-context.ts index e2bd89e..eb60c76 100644 --- a/src/agent-context.ts +++ b/src/agent-context.ts @@ -205,6 +205,12 @@ export async function agentContext(options: { 'Validate after writes; HTML preview is approximate; native Office stays unverified', }, dependencies: { + find: { + service: 'api.typesafe.ai', + credential: 'TYPESAFE_API_KEY', + sends: ['query', 'candidate names', 'visible text excerpts', 'layout context'], + offlineAlternatives: ['search', 'list'], + }, browser, converter: 'bundled dependency; executable availability is checked during render; not actively probed here', diff --git a/src/bin.ts b/src/bin.ts index 31462d6..636e250 100644 --- a/src/bin.ts +++ b/src/bin.ts @@ -1852,8 +1852,8 @@ const main = async (): Promise => { let converter: Awaited> | undefined; let state: Awaited> | undefined; try { - converter = await converterPreflight(); state = await browserPreflight(); + converter = await converterPreflight(); if (probe) await probeRenderBrowser(); outputEnvelope({ ok: true, diff --git a/src/deck2html-exec.ts b/src/deck2html-exec.ts index cc8e4a6..da2f9d1 100644 --- a/src/deck2html-exec.ts +++ b/src/deck2html-exec.ts @@ -2,13 +2,29 @@ import { RenderFailure } from './render-browser.js'; import { access, chmod, constants } from 'node:fs/promises'; import { join, resolve } from 'node:path'; import { execFile } from 'node:child_process'; -import deck2html from '@deckflow/deck2html'; +import type deck2html from '@deckflow/deck2html'; + +async function selectedBinary(): Promise { + const configured = process.env['DECKUSE_DECK2HTML_BINARY']; + if (configured) return configured; + try { + return (await import('@deckflow/deck2html')).default.getBinaryPath(); + } catch (cause) { + throw new RenderFailure( + 'RENDER_CONVERTER_MISSING', + 'Install the platform converter to enable preview.', + { + stage: 'converter-discovery', + retryable: false, + cause: String(cause), + }, + ); + } +} /** npm may install platform binaries without +x; restore before convert. */ export const ensureDeck2HtmlExecutable = async (): Promise => { - const mod = deck2html as { getBinaryPath?: () => string }; - if (typeof mod.getBinaryPath !== 'function') return; - const binary = process.env['DECKUSE_DECK2HTML_BINARY'] ?? mod.getBinaryPath(); + const binary = await selectedBinary(); try { await access(binary, constants.X_OK); } catch { @@ -24,8 +40,6 @@ export const ensureDeck2HtmlExecutable = async (): Promise => { } }; -const selectedBinary = () => process.env['DECKUSE_DECK2HTML_BINARY'] ?? deck2html.getBinaryPath(); - function extractionConfiguration() { const base = process.env['DOTNET_BUNDLE_EXTRACT_BASE_DIR']; return { @@ -36,7 +50,7 @@ function extractionConfiguration() { /** Inherit host policy and runtime defaults; never relocate or warm extraction caches. */ async function runConverter(args: string[], preflight = false) { - const binary = resolve(selectedBinary()); + const binary = resolve(await selectedBinary()); await ensureDeck2HtmlExecutable(); const env = { ...process.env }; return new Promise<{ stdout: string; stderr: string }>((done, reject) => { @@ -143,7 +157,7 @@ export function converterFailure( export async function converterPreflight() { const { stdout } = await runConverter(['--version'], true); return { - binary: resolve(selectedBinary()), + binary: resolve(await selectedBinary()), version: stdout.trim(), ...extractionConfiguration(), }; diff --git a/src/help.ts b/src/help.ts index b351b51..d4ace42 100644 --- a/src/help.ts +++ b/src/help.ts @@ -272,7 +272,9 @@ Options: --json Machine-readable envelope Notes: - Requires TYPESAFE_API_KEY. Names and visible text are sent to api.typesafe.ai. + Requires TYPESAFE_API_KEY and network access to api.typesafe.ai. + Sends the query plus candidate names, excerpts of visible text, and layout context. + Use search or list for offline inspection. data.matches uses the same element records as search (target, uid, kind, name, text, context). An empty matches list means nothing fit — do not edit a guessed target. Jev is stronger in English than in Chinese. Use search for a literal substring. diff --git a/src/monitor.ts b/src/monitor.ts index 22eeb50..a86f2b2 100644 --- a/src/monitor.ts +++ b/src/monitor.ts @@ -7,7 +7,7 @@ import { mkdir, readFile, realpath, rename, rm, stat, writeFile } from 'node:fs/ import { watch } from 'node:fs'; import { createServer, type Server, type ServerResponse } from 'node:http'; import { basename, dirname, extname, relative, resolve, sep } from 'node:path'; -import deck2html from '@deckflow/deck2html'; +import type deck2html from '@deckflow/deck2html'; import { ensureGitignore, indexPath, diff --git a/src/pptx/edition.ts b/src/pptx/edition.ts index 95c9a46..00757d7 100644 --- a/src/pptx/edition.ts +++ b/src/pptx/edition.ts @@ -57,11 +57,11 @@ const hardDenyMessage = (kind: EditionGatedWriteKind): string => { case 'theme': return `Theme editing is not available (edition=${EDITION}); theme parts are preserve-only`; case 'master': - return `Master slide editing requires the commercial edition (edition=${EDITION})`; + return `Master slide editing is not supported by this build (edition=${EDITION})`; case 'layout': - return `Layout slide editing requires the commercial edition (edition=${EDITION})`; + return `Layout slide editing is not supported by this build (edition=${EDITION})`; case 'advanced-chart': - return `Advanced chart editing requires the commercial edition (edition=${EDITION})`; + return `Advanced chart editing is not supported by this build (edition=${EDITION})`; } }; @@ -101,6 +101,6 @@ export const gatedWriteHardDeny = (item: IndexedElement, archive: OpcArchive): R const kind = editionGatedWriteKind(item, archive); const message = kind ? hardDenyMessage(kind) - : `This write requires the commercial edition (edition=${EDITION})`; + : `This write is not supported by this build (edition=${EDITION})`; return err('UNSUPPORTED_CAPABILITY', message); }; diff --git a/src/render-browser.ts b/src/render-browser.ts index 3edceec..c43d7d8 100644 --- a/src/render-browser.ts +++ b/src/render-browser.ts @@ -3,7 +3,8 @@ import { access, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises'; import { constants } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; -import { chromium, type Browser } from 'playwright-core'; +import type { Browser, BrowserType } from 'playwright-core'; +import { createRequire } from 'node:module'; export class RenderFailure extends Error { constructor( @@ -15,6 +16,37 @@ export class RenderFailure extends Error { this.name = 'RenderFailure'; } } +const require = createRequire(import.meta.url); +const previewModules = { + 'playwright-core': 'playwright-core', + echarts: 'echarts/dist/echarts.min.js', + tailwindcss: 'tailwindcss', + '@fortawesome/fontawesome-free': '@fortawesome/fontawesome-free/css/all.min.css', +}; + +export async function loadPreviewBrowser(): Promise { + const missing = Object.entries(previewModules) + .filter(([, path]) => { + try { + require.resolve(path); + return false; + } catch { + return true; + } + }) + .map(([name]) => name); + if (missing.length) + throw new RenderFailure( + 'RENDER_DEPENDENCIES_MISSING', + 'Install the Deckuse optional dependencies to enable preview.', + { + stage: 'preview-dependencies', + retryable: false, + missing, + }, + ); + return (await import('playwright-core')).chromium; +} const failed = new Map(); export function browserConfiguration() { const executablePath = @@ -45,6 +77,7 @@ async function checkBrowserPreflight() { 'Host declares browser execution unavailable. Use a host-approved worker or execution context; Deckuse will not bypass this restriction.', { provider: config.provider, stage: 'preflight', retryable: false }, ); + const chromium = await loadPreviewBrowser(); const executable = config.provider === 'executable' ? config.executablePath @@ -130,7 +163,7 @@ async function checkBrowserPreflight() { }; } export async function launchRenderBrowser( - launch: typeof chromium.launch = chromium.launch.bind(chromium), + launch?: BrowserType['launch'], timeout?: number, ): Promise { const config = await browserPreflight(); @@ -142,7 +175,8 @@ export async function launchRenderBrowser( const previous = failed.get(key); if (previous && process.env['DECKUSE_BROWSER_RETRY'] !== '1') throw previous; try { - return await launch({ + const chromium = await loadPreviewBrowser(); + return await (launch ?? chromium.launch.bind(chromium))({ headless: true, ...(timeout === undefined ? {} : { timeout }), ...(config.provider === 'executable' @@ -200,9 +234,7 @@ export function renderFailurePayload(cause: unknown) { } /** Playwright owns the temporary profile and cancels launch on timeout. */ -export async function probeRenderBrowser( - launch: typeof chromium.launch = chromium.launch.bind(chromium), -) { +export async function probeRenderBrowser(launch?: BrowserType['launch']) { const browser = await launchRenderBrowser(launch, 5000); let timer: ReturnType | undefined; try { diff --git a/src/render-cache.ts b/src/render-cache.ts index 7ad3ec8..b560219 100644 --- a/src/render-cache.ts +++ b/src/render-cache.ts @@ -3,8 +3,7 @@ import { readFile, readdir, stat, writeFile } from 'node:fs/promises'; import { homedir, platform, release } from 'node:os'; import { join } from 'node:path'; import { createRequire } from 'node:module'; -import { chromium } from 'playwright-core'; -import { browserConfiguration } from './render-browser.js'; +import { browserConfiguration, loadPreviewBrowser } from './render-browser.js'; import { version } from './version.js'; import type { RenderResult } from './render.js'; @@ -17,6 +16,7 @@ async function fileStamp(path: string) { export async function renderEnvironmentKey(binary?: string) { const config = browserConfiguration(); + const chromium = await loadPreviewBrowser(); const roots = [ ...(platform() === 'darwin' ? ['/System/Library/Fonts', '/Library/Fonts', join(homedir(), 'Library', 'Fonts')] diff --git a/src/render.ts b/src/render.ts index 95d6139..7326911 100644 --- a/src/render.ts +++ b/src/render.ts @@ -17,9 +17,9 @@ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'; import { dirname, join, relative, resolve, sep } from 'node:path'; import { pathToFileURL } from 'node:url'; import { tmpdir } from 'node:os'; -import deck2html from '@deckflow/deck2html'; -import { type Browser, type Page } from 'playwright-core'; -import { launchRenderBrowser, RenderFailure } from './render-browser.js'; +import type deck2html from '@deckflow/deck2html'; +import type { Browser, Page } from 'playwright-core'; +import { launchRenderBrowser, loadPreviewBrowser, RenderFailure } from './render-browser.js'; import type { Diagnostic } from './core/index.js'; import { OpcArchive } from './opc/index.js'; import { ensureGitignore, renderDir, sourceDir } from './workspace/index.js'; @@ -480,6 +480,7 @@ export const renderPage = async ( ): Promise => { if (!Number.isInteger(options.page) || options.page < 1) throw new Error('--page must be a positive integer (one page per render call)'); + if (!options.dependencies?.screenshot) await loadPreviewBrowser(); const root = resolve(workspace); const staging = await mkdtemp(join(tmpdir(), 'deckuse-single-snapshot-')); try { @@ -647,6 +648,7 @@ export async function renderPages( throw new Error('Choose pages or all'); if (options.scale !== undefined && (!Number.isFinite(options.scale) || options.scale <= 0)) throw new Error('Invalid render scale'); + if (!options.dependencies?.screenshot || options.contactSheet) await loadPreviewBrowser(); const preflight = !options.dependencies?.convert ? await converterPreflight() : undefined; const root = resolve(workspace); const staging = await mkdtemp(join(tmpdir(), 'deckuse-render-batch-')); diff --git a/test/pptx/edition-gates.test.ts b/test/pptx/edition-gates.test.ts index cd481e0..a3ca6dd 100644 --- a/test/pptx/edition-gates.test.ts +++ b/test/pptx/edition-gates.test.ts @@ -404,13 +404,13 @@ describe('community edition write gates', () => { kind: 'master' as const, partUri: '/ppt/slideMasters/slideMaster1.xml', }; - expect(writeDenialReason(master, archive)).toMatch(/commercial edition/); + expect(writeDenialReason(master, archive)).toMatch(/not supported by this build/); registerPptxEditionExtension({ assertWritable: () => ok(undefined), }); try { - expect(writeDenialReason(master, archive)).toMatch(/commercial edition/); + expect(writeDenialReason(master, archive)).toMatch(/not supported by this build/); } finally { clearPptxEditionExtension(); } From 26afcdb739d251fdf920d943ccf97e09138d535e Mon Sep 17 00:00:00 2001 From: Redstone Zhao <13740080@qq.com> Date: Fri, 13 Nov 2026 02:20:40 +0000 Subject: [PATCH 2/2] chore: reconcile changesets with backfilled releases --- .changeset/agent-reliability-and-batch-render.md | 7 ------- .changeset/converter-sandbox-runtime.md | 5 ----- .changeset/native-office-review.md | 10 ---------- .changeset/optional-preview-and-public-capabilities.md | 5 +++++ .changeset/safe-office-data-and-review.md | 5 ----- 5 files changed, 5 insertions(+), 27 deletions(-) delete mode 100644 .changeset/agent-reliability-and-batch-render.md delete mode 100644 .changeset/converter-sandbox-runtime.md delete mode 100644 .changeset/native-office-review.md create mode 100644 .changeset/optional-preview-and-public-capabilities.md delete mode 100644 .changeset/safe-office-data-and-review.md diff --git a/.changeset/agent-reliability-and-batch-render.md b/.changeset/agent-reliability-and-batch-render.md deleted file mode 100644 index 808982b..0000000 --- a/.changeset/agent-reliability-and-batch-render.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@deckflow/deckuse': minor ---- - -Protect nonempty initialization destinations, recover interrupted PPTX/DOCX persistence, and roll back failed Git writes without discarding manual edits. Ordinary JSON CLI input errors now return an error envelope. Add command-type discovery, save slide names and report final slide identities, and support snapshot-consistent batch rendering with a shared browser or one LibreOffice conversion. Add benchmark telemetry and agent workflow documentation. - -Behavior change: new/init refuse nonempty directories. Use a new empty destination instead of overwriting an existing workspace. Protocol remains 2.0. diff --git a/.changeset/converter-sandbox-runtime.md b/.changeset/converter-sandbox-runtime.md deleted file mode 100644 index bcb951b..0000000 --- a/.changeset/converter-sandbox-runtime.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@deckflow/deckuse': patch ---- - -Inherit host .NET extraction settings instead of forcing a fresh temporary cache. Share converter execution across render and monitor, preserve license arguments and native failure details, and report browser probe cleanup failures independently from write/launch availability. diff --git a/.changeset/native-office-review.md b/.changeset/native-office-review.md deleted file mode 100644 index 1e0373b..0000000 --- a/.changeset/native-office-review.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@deckflow/deckuse': minor ---- - -Add native PowerPoint/Word comment threads, review projections, and tracked-change -proposals with atomic acceptance/rejection. Support regular table and paragraph -structure revisions, including reversible vertical cell merging with content -preservation. Extend protected-edit checks, explicit compatibility upgrades, -comment lifecycle policies, CLI/schema discovery, and Office interoperability -regression fixtures. Improve speaker-notes selection and modern Word defaults. diff --git a/.changeset/optional-preview-and-public-capabilities.md b/.changeset/optional-preview-and-public-capabilities.md new file mode 100644 index 0000000..a4a0268 --- /dev/null +++ b/.changeset/optional-preview-and-public-capabilities.md @@ -0,0 +1,5 @@ +--- +'@deckflow/deckuse': patch +--- + +Allow structural editing without preview dependencies, and report missing preview packages during preflight. Describe public edition capabilities and TypeSafe ranking data in the CLI and documentation. diff --git a/.changeset/safe-office-data-and-review.md b/.changeset/safe-office-data-and-review.md deleted file mode 100644 index 1836d88..0000000 --- a/.changeset/safe-office-data-and-review.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@deckflow/deckuse': minor ---- - -Preserve DOCX replacement formatting and protected ranges; synchronize bounded embedded chart workbooks with shared-dependency isolation; add strict staged delivery, visual diagnostics, stale-aware monitor UI, optional LibreOffice pagination and seven agent workflows. Chart line strokes and series color variation now match controlled native PowerPoint specimens. Unsafe data edits fail explicitly; see the safety migration guide.