Skip to content

ToolsEnabled Slides 0.1.5 (beta)

Pre-release
Pre-release

Choose a tag to compare

@ToolsEnabled-Inc ToolsEnabled-Inc released this 13 Oct 18:17

ToolsEnabled Slides 0.1.5 (beta)

Published 2026-10-13. Source commit 402bf1c736c5c59dec729b5470f9187af0aafb14. It adds eight commits to 0.1.4 (tag v0.1.4, commit e36f4ae918192c5e8f6073b5d27c5757dd030b24): fixes for three defects that a code review of 0.1.4 confirmed, with their tests and docs, and the version change.

This release provides Linux presentation editing over MCP, a local live studio, read-only Claude panes and Codex CLI views, slide locks, human dashboard controls, and PPTX/PDF/PNG export. Linux is the supported release scope. Native Windows shutdown, macOS, trusted production signing and native Desktop installation remain unqualified.

The MCP host supplies the agent. Slides does not make model calls or require a built-in online account or API key. The source ZIP contains no wheels, copied runtimes, workspace data, signing keys or packaging evidence. Prepare the Python runtime explicitly; Linux PDF/PNG also require LibreOffice.

Changes since 0.1.4 (see CHANGELOG.md):

  • ppt_import respects protections on single objects. In 0.1.4 it checked only slide protections, so an agent holding every slide lock could replace a deck in which a human had protected an object. The object was lost, the studio could not remove its protection ("no such element"), and the next start refused the workspace with "Cannot start with invalid state.json: protections[0] names missing element …" until state.json was edited by hand. Import is now refused while any slide or object of the deck is protected, and the refusal names it, for example "Protected content must be unlocked by the human before replacing the deck (element e1 on slide s1 is protected)".
  • A workspace that an earlier release left in that state starts again. At startup, a protection that names an object the deck no longer has is removed, the previous state.json is kept as .slides-state/state-before-protection-repair-<time>-<id>.json, and the log says, for example, "Removed 1 protection for objects no longer in the deck (element e1 on slide s1); the previous state.json is kept as …". Any other mismatch between state.json and the deck still stops the start.
  • An MCP edit or import refused because content is protected now answers "PROTECTED." with the reason. It used to answer "PAUSED. The human has paused all editing …", which told the agent to wait for a Resume that would never come. A real pause still answers "PAUSED.".
  • presentation.pptx in the workspace is the deck as Slides renders it. A presentation.pptx that Slides did not write (your own deck with that name, or changes saved over the render in PowerPoint) is now copied to presentation.user-<time>.pptx before a render replaces it, and the log names the copy. In 0.1.4 it was overwritten without a copy, on the first start or at the next render. If the copy cannot be made, the render is not published. Renders that Slides wrote itself are replaced as before. README now says to give imported decks another name.
  • ppt_lint right after an edit reports font lint as pending ("Font lint waits for the render of rev N …; run lint again after it") until presentation.pptx has been rendered for that revision, and caches nothing meanwhile. It used to check the fonts of the previous render and report them against the new slide order and revision, so after a slide move it named the wrong slide. The studio now refreshes its lint panel when a render is published.

Files in this release

File SHA-256
toolsenabled-slides-0.1.5.zip (671835 bytes, the source distribution) c3d73a0e25a4ff35c029d0d20d9103cf024f9fde39899c4f6c1044baf054a51c
toolsenabled-slides-0.1.5.zip.sha256 the line above, sha256sum -c format

Verify before extracting:

sha256sum -c toolsenabled-slides-0.1.5.zip.sha256

The offline Python wheel bundle that README and docs/CLAUDE-INSTALL.md use is unchanged since 0.1.0 and is not re-attached here. Use the 0.1.0 asset, which works with 0.1.5 (same six pins): toolsenabled-slides-0.1.0-cp312-linux-x86_64-wheels.zip, SHA-256 a29454931420b8d9547eeb8d17c389a005cf0343a927d7a275f15eb3cab25fec.

No Claude Desktop bundle (.mcpb) is distributed with 0.1.5. An MCPB manifest is included in the source for future Desktop qualification; registry metadata and directory publication remain held until production-signed bytes and the required qualification are verified.

Plugin installation: claude plugin marketplace add ToolsEnabled/toolsenabled-slides, then claude plugin install -s local toolsenabled-slides@toolsenabled-slides --config python_executable="/absolute/private/Slides Runtime/bin/python" --config node_executable=/absolute/node --config workspace_directory="/absolute/decks/Project Update" --config port=4599 (Claude Code, with Node.js 22 or newer on its PATH; without the Python and workspace settings the plugin installs but starts no server); codex plugin marketplace add ToolsEnabled/toolsenabled-slides then codex plugin add toolsenabled-slides@toolsenabled-slides (Codex). Both need the external runtime prepared as docs/CLAUDE-INSTALL.md describes.

What was tested

Full Linux suite on the release commit: FILES 110; FAILED 0; DISPLAY=unset, exit 0 (109 direct test files plus fixture generation), with SUITE_PYTHON pointing at a runtime prepared by tools/setup-runtime.py from the 0.1.0 wheel bundle: 149 node:test tests, 127 Python tests (6 Windows-only skips) and 692 scripted checks, all passing. On 0.1.4 the same suite ran FILES 107; FAILED 0 with 144 node:test tests. The five new tests are in three new files: test/js/import-protections.test.js (import refused for a protected object, a workspace with a protection on a missing object starts, protected-content refusals say PROTECTED), test/js/managed-presentation.test.js and test/js/lint-render-pending.test.js. Each failed on the 0.1.4 code for the reason described above. The protections suite's case for a protection on a missing object now expects the set-aside instead of a failed start, and the shared-lint unit test also covers the pending path. The /slides mod's hook tests (claude plugin test): 33/33.

The same suite from the extracted ZIP (unzip, then node test/run.js inside slides/ with the same prepared runtime): FILES 110; FAILED 0; DISPLAY=unset, exit 0, with the same counts.

Strict real-LibreOffice lifecycle on the extracted ZIP: exit 0, ok: true, 9 named checks (initialize, golden tools/list, locks required, 3-slide MCP editing, attach and detach, real exports, import, EOF shutdown, lease released), 37 discovered tools, 3 PPTX slides, 3 PDF pages and 3 PNG images (1600 × 901 each). This is one strict lifecycle run with its retained exports and stderr, not coverage of every tool.

Marketplace: claude plugin validate --strict passes on the release tree, its plugin.json, its marketplace.json and the extracted ZIP (Claude Code 2.1.296). In a scratch CLAUDE_CONFIG_DIR, claude plugin marketplace add from the clone followed by claude plugin install -s local toolsenabled-slides@toolsenabled-slides with the four settings listed the plugin at 0.1.5 and printed the expected "2 userConfig options not yet set". claude mcp list showed its server connected. The Codex marketplace file follows the published repo-marketplace format; Codex installation from it and the packaged-ZIP Codex host gate (tools/prove-codex-plugin.py) were not run for 0.1.5. No native Windows/macOS/Desktop or production certificate trust is inferred.

Support and security contact: support@toolsenabled.ai (security policy: https://toolsenabled.ai/security/).