Skip to content

Releases: liustack/pptwise

v0.48.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 17:53

Minor Changes

  • c76d318: pptwise build no longer draws the deck in other themes on its first build. The theme is settled with the outline, so the other themes appear only when asked: --alternatives draws the deck's cover and a page or two in up to three other themes, and later builds under the same theme keep them current. --no-alternatives works as before. The DSH plugin's pptwise_build passes --alternatives for alternatives: true, and its result now tells the model to ask the user which theme they want.
  • 616c795: pptwise asset-brief now briefs every picture frame a deck holds, not only image components: each item of an image_grid, both sides of an image_compare, the screen of a device_mockup, and each page's background picture, its own or the theme's default. Each item names its kind, the field that names the picture, its slot in a grid or comparison, and the caption or label set beside it. A full-slide background is noted as having the page's words set over it, and a device screen as wanting a real screenshot. A picture named in two frames on one page now reports each frame against its own component, still marked shared.
  • b89a3be: pptwise brand scan [dir] [--json] finds what a project already says about its brand: logo files, pictures large enough for a slide, colors and fonts named in style sheets, Tailwind and design-token files and web manifests, and Office templates with their color scheme. It reports the brand color and second color the evidence points to, the --brand value for them, and ready theme try, theme fork and brand extract lines. The scan is local and bounded: it never follows a symlink, skips hidden, dependency and build folders, never opens a file named like a secret, and stops at fixed limits it reports.
  • e0b0860: pptwise build --sheet also draws every page small into one numbered picture, sheet.jpg, named in the report as preview.sheet, so an agent can look at the whole deck at once: whether the pictures fit their pages, where a page is empty, how the pages follow one another. It needs the optional sharp. The DSH plugin's pptwise_build takes sheet: true and hands the picture to the model where the host and the model take images, and names the file otherwise.
  • 2df6b78: The DSH plugin settles the theme together with the outline. pptwise_themes is called once the spec validates, before any page is written, and its result asks the user in the same message as the outline and the picture direction. It takes brand, the brand colors pptwise brand scan found, and then ends the wall with one more option: the first theme repainted in those colors, captioned in the card by its color swatches and the theme it repaints, with the theme fork line that binds it. The plugin's instructions now run the brand scan while gathering materials, build with sheet: true once a build passes, and take the user's and the project's own pictures, pinned with images add, before stock search.
  • 517c123: pptwise images add <url|file> --deck <dir> --as <asset_id> pins a picture the stock search did not supply: a file of the project or the user's, or a picture found on the web. A picture from the web needs the license its own page states (--license cc0|pdm|cc-by[-<version>]|press|own), that page (--source), and, for cc-by and press, its author (--author). Share-alike, non-commercial and no-derivatives pictures are refused. The sidecar records where the picture came from and its credit line, which the command prints. A PNG stays a PNG, an SVG is drawn into a PNG, and other formats become JPEG.
  • 53c88d2: The pptwise skill now runs clarify, gather materials, outline and theme, make, check, deliver. The user decides in two places only: one round of questions about the request, and the outline, theme and picture direction together in one message. Materials (facts with sources, the brand scan, and a picture plan per page) are written to deck-dir/materials.md, which every later step reads, described in the new references/materials.md. The theme wall is drawn with the deck's own title before any page is written, with a brand option when the scan found brand colors, and the theme stays fixed while the deck is made. Pictures come from the user and project first, then stock, then the web under the licenses images add takes, then an enabled generator, and references/images.md now says how to set up each source. After the build passes, the agent looks at the whole deck in one sheet for pictures, holes and rhythm, at most two rounds, and delivers with a live preview address.
  • 88d7e27: pptwise theme try --title <text> --brand <hex>[,<hex>] adds one more option to the theme wall: the first theme on it repainted in the brand's colors, the same repaint theme fork --brand writes. Its row is <theme>-brand and carries base and brand, everything theme fork <base> --brand needs to bind it. Nothing is bound.

Patch Changes

  • b280942: pptwise build --sheet now writes each page number in a strip above its row instead of on a badge over the page's top left corner. The badge used to hide the section label, the crumb and the first characters of the heading, which are what a look at the sheet is for. images search --sheet keeps its numbers on the photos.
  • b8c076e: The build's crowded-columns audit now also checks kpi_cards and numbered_cards on ruled themes (proposal, thesis, swiss, memo), where their words stand on the paper under a hairline with no card ground between neighbours. Nothing in the gallery or the showcase decks is reported.
  • 4307b18: terminal's log and span recipes now say what their figures must be: each value a length of time as a console prints it (2h52m, 22h 06m), with no unit, icon, delta, tag, source or note on an item. A page with figures such as 「16 个月」 used to be told it had the recipe and only its words ran long, and no shortening could get it the drawing. inspect and the build report now name what to change. Recipes can say a field must be left out (!items[].unit|note).
  • b6a1fac: A recipe that asks for a number in a figure now counts a figure written as a JSON number ("value": 16). inspect and the build report used to tell the author to write a number into a value that already held one.
  • 8c81269: Side-by-side steps and chevron bands keep their sentences a gutter apart. The sentences under steps used their whole slot 20px from the next one, and a brief page's sentences mixing Chinese with Latin names stood 26px apart at 16px and read across the page. Each sentence under a step, and each note under a chevron, now stops short of its neighbour by the gutter the two keep: a character and a quarter between Chinese, two characters where letters are in the line. The type keeps its size. The build's crowded-columns audit now checks both components.
  • ae60525: terminal draws a timeline beside plain figures as its incident log. A process page of a timeline and a kpi_cards whose values are not lengths of time (「16 个月」, 「4 位」) used to fall to the ordinary renderer, a horizontal timeline with its labels crowded into narrow cells. The log now sets those figures in the figure panels its board already uses beside the ranked bar chart: the label in mono, the figure in bold mono, the note under it, the marked figure on the mark's tint. Durations still draw to scale as before.
  • 0a9b989: A deck's theme name now resolves through the themes/ folders above the deck itself, wherever the command runs. Building, rendering or previewing a deck from another folder used to look up from that folder instead, so the same deck could pick up a different theme, or fail to find the one its own project holds. pptwise serve watches the same folders. Commands with no deck, such as theme new, still start from the working directory.

v0.47.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 11:10

Minor Changes

  • 91bc9d5: The skill now plans at least one photo page in every deck unless the user said not to show pictures, more when the material has places, products, people or work to show. A deck no longer ends up with no picture because its theme draws none on the cover: every factory theme draws a photo page's picture, so the theme is still picked for the occasion, never for pictures.

Patch Changes

  • 622677e: asset-brief on a deck with no image component no longer prints no image components found for theme "<id>", which read as if the theme drew no pictures. It now says no page holds an image component yet, that the theme does not decide this, and that image_grid, image_compare, device_mockup and page backgrounds are not listed. Every factory theme draws a photo page's picture.

v0.46.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 09:24

Minor Changes

  • 441b150: The DSH plugin has a pptwise_images tool. It searches free stock photos and hands the model the hits numbered, with each one's description, plus the contact sheet of their thumbnails as an image it can look at, so the model picks a photo by sight before pinning it with images fetch. Where the session's model takes no images, the result names the sheet's file instead.
  • d8e92e1: images search --sheet draws the results' thumbnails as one numbered picture, .pptwise/image-search/<query>.jpg (or the file you name), and prints its path. Look at that one image to pick a photo, then fetch the id with the same number. Results are numbered in the text and in --json (n), and --json names the sheet as sheet. A thumbnail that will not download is drawn from the full-size picture when there is one, else crossed out with a note.
  • b6a9911: The skill now gives a deck pictures without being asked: the cover, where its theme draws over a photograph, and every photo page, other pages only where the picture is the point. The model reads the frame from asset-brief, searches the free stock libraries, looks at the numbered contact sheet and pins the one that fits. It needs no key: with none set, search uses Openverse, and a Pexels or Pixabay key only improves the results. Say you want no pictures and it adds none.

Patch Changes

  • fc8e940: audit and build now report icon cards whose words stand closer to the next card's than a gutter (a character and a quarter for Chinese, two characters for a line with Latin letters), as they already did for timeline milestones. People, product and quote cards and matrix cells are checked the same way on ruled themes, where they draw no card behind their words.
  • 3bbee96: audit, and so build, now report an overlap when the milestones of a timeline laid across the page stand less than two characters apart on one row. Their words then read as one line, and the area check could not see it, since the labels never touch. The build holds back the .pptx until it is fixed.
  • aeace06: A command run from inside a project's .pptwise/ folder, such as from a deck in .pptwise/decks/<name>/, now works for the project that holds that folder. Its output goes to the project's .pptwise/ rather than a new .pptwise/ nested under the deck, theme new writes to the project's themes/, and the DSH plugin keeps its previews in the same place.
  • 60e6690: .pptwise/ is now kept out of git on the first build or preview even when it already existed because a deck was started inside it. Before, a folder created by writing a deck there was taken as one pptwise had set up already, and the deck, its pages and its .pptx all showed up in git status.
  • 5825c93: A deck kept in .pptwise/decks/<name>/ now builds to .pptwise/<name>/ instead of .pptwise/pptwise-decks-<name>/. No deck output takes the names decks or themes any more, and a deck whose output folder would be another deck's sources is refused with a message that names the clash, instead of reading that deck's files and clearing its .pptx.
  • db856b7: The skill and the DSH plugin's tools now say where a new deck goes: .pptwise/decks/<name>/ in the project, with a short lowercase English name, unless the user names another place. A deck that already exists is edited where it is. Models no longer have to guess, and stop leaving new deck folders in the project's top level.
  • aa2f810: icon_cards keeps a clear gap between one column's words and the next. Columns used to set their titles and sentences a few pixels apart, so four cards across a page read as one line of text. Each line is now set in its column less a gutter of its own size: a character and a quarter for Chinese, two characters for a line with Latin letters in it. The type keeps the size it had and takes the gutter in an extra line where the row has the height, with a smaller icon if need be. A Chinese title that wraps breaks between words, and a title comes down only as far as its longest English word needs to stay whole. Type is set smaller only when the row is too short for those lines.
  • 9f10879: Picture downloads work behind a fake-ip proxy such as Clash or Surge. These proxies resolve every name into 198.18.0.0/15, which the download guard refused as reserved, so images fetch and every --sheet thumbnail failed. That benchmark range is now allowed. Private, loopback, link-local, and the other reserved ranges are still refused.
  • 2639dc5: images search now prints each photo's description from the stock library under its id: the Pexels alt text, the Pixabay tags, or the Openverse title. It tells what a picture shows before anyone opens the thumbnail.
  • f96bc8c: images search --json prints the results as JSON: the query, every hit with the id images fetch takes, its size, description, author, license and attribution, and the notes that go with them.
  • 1acc663: A timeline laid across the page keeps two characters between one milestone's words and the next. The gap used to be 12px, so five milestones with a sentence each ran their descriptions together into what read as one line. Labels that already stood apart are drawn as before.

v0.45.1

Choose a tag to compare

@github-actions github-actions released this 14 Oct 17:17

Patch Changes

  • 0317a2a: The other themes shown under a deck now look the way the deck would look after switching. A cover with something another theme has no place for, a footnote say, used to be left out of that theme's preview altogether, so some themes showed no cover at all. It is now drawn as switching draws it, with only that part left off.
  • 3091bf3: The other themes a build shows under the deck now always show the deck as it is. They used to be drawn once, on the first build, and kept showing an old cover or old pages after you rewrote them. Every later build under the same theme shows them again, redrawn as soon as a page they show has changed, and once you switch to another theme they are gone.
  • 93fb05c: A theme you named, or picked from a theme wall, is taken as your choice. The AI no longer explains why it chose it, and the deck no longer comes with other themes to switch to, on its first build or any later one. The same holds once you switch to one of the other themes it showed you.
  • 8090ec1: In DeepSeek Harness, "switch to the second one" now goes straight to the theme numbered 2 under the deck. The AI is told the same numbers the card shows, on every build, so it no longer searches the project folder to work out which theme you meant.

v0.45.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 07:20

Minor Changes

  • 2b7eece: The shared compositions gain an account setting, drawn on recap's 2026-10 board and read entirely from the theme's tokens. It draws the year in one line over three figures, target against actual by period beside a ledger with the period the gap closed in, a bridge from last year with the speaker's part subtotalled, a piece of work beside a photograph closing on its results, a year of the speaker's and the team's milestones on one axis, one figure moved with its before and after, the team's year in counts and people, a miss told as figures and four plain rows, a before and after table, next year's targets as dashed boxes beside this year's bars, the plan by quarter with what each must bring in, and the asks with an empty box for each choice of the page's ballot. Who did what is a small legend read from each row's highlight, tone and tag. A value with a currency in front of it (RMB 31m) now reads as a figure.

  • 78bd313: pptwise build now shows the deck in other themes. On the first build of a deck bound to a built-in theme, it draws the deck's own cover and one or two of its content pages in up to three other themes from the shortlist for the bound theme's occasions and the deck's narrative strategy, writes them to .pptwise/<deck>/alternatives/, and lists them under alternatives in the report (theme id, display name, page files, and the time taken). --alternatives draws them again and --no-alternatives skips them. The report also says where the bound theme came from, as themeSource: builtin, file or pack.

  • 53d207a: pptwise build now says how many pages the theme's signature layouts drew, in one line, and gives each page its face drew plain the nearest recipe and what to change for it. They are hints and never block the build. --json carries them under signature.

  • 9585438: Decks live in the project. A deck target is always a path, a deck project directory or an IR file, resolved against the current directory. The bare deck name that looked under ~/.pptwise/decks/ is gone, and so is the decksDir setting in pptwise.config.json and ~/.pptwise/config.json. A config that still sets decksDir is rejected with the key named. Move any deck you kept under ~/.pptwise/decks/ into the project you work in.

  • 91e8955: Delete the 99 faces no built-in theme's menu used. The registry now holds 107 faces: 22 covers, 22 chapters, 22 endings and 41 content faces (39 standard and the image-split and image-top takeovers). A page never named a face directly, so a deck on a built-in theme renders exactly as before.

    • Gone are the old shared pool (poster-center, two-column, bento-panel, rail-numbered, narrow-column, quiet-frame, stacked-poster, image-bottom, image-annotate, quote-stage and the rest) and every theme's earlier faces that its 2026-08 and 2026-10 redesigns replaced (verdict-index, crayonbox-*, show-*, tone-adaptive-*, fashion-* and the rest).
    • A theme file whose menu names a deleted face is refused like any other unknown face. Point that entry at a face pptwise layouts lists.
    • The engine-only shape.cover knobs that only the deleted covers read are gone from the built-in themes.
    • The SDK's extractBrandTheme no longer copies a fixed menu of these faces. It repaints a theme (bulletin by default, or the one passed as from) around the template's brand colors, the way pptwise brand extract does:
    const { file, placement, fontNotes } = await extractBrandTheme(bytes, {
      id: "acme",
      label: "Acme",
      from: "swiss",
    });
  • 11bea98: The DSH build card now shows the deck in other themes when the build drew them: a numbered column per theme under the deck's pages, on the build card and on the deck card that stays under the turn once its steps fold (still there after later builds in that turn), the same way the theme wall draws them. Clicking one starts the message that asks for that theme ("Switch to Memo", 「换成 Memo」) in the composer, for the user to send or change. pptwise_build tells the model which themes are shown, not to stop for them, and that switching is setting theme in deck.spec.json and building again.

  • fc2d4b3: On DSH, the build card and the deck card under the turn now show how many pages use the theme's signature layouts. pptwise_build passes on the nearest recipe for each page drawn plain, with the instruction to rewrite only where the content holds it.

  • 7def501: The DSH plugin keeps deck previews, theme walls and outlines in the session project's .pptwise/previews/<id>/ instead of ~/.pptwise/previews/, and writes nothing in the home folder. A card's id now carries its project, so the card finds its preview from any later session while the project stays where it was. A call without a working directory puts the preview beside an absolute deck path, and refuses with a clear message when it has neither. Cards rendered before this release point at ~/.pptwise/previews/, which the plugin no longer reads: they show the preview as not found, and the old folder stays untouched for you to keep or delete. The plugin no longer copies ~/.pptpress or ~/.pptfast into ~/.pptwise. A deck whose folder name would be previews or theme-try now lands in .pptwise/<name>-deck/.

  • 44e4dbe: A theme can name a figure font, fonts.figure, for the large numbers on its pages. A theme that names none sets them in its heading font, as before. Bahnschrift, the DIN face Windows ships, joins the fonts slides can be set in, measured at its real widths, and a stack that names DIN Alternate first previews in it on a Mac.

  • f2c62ae: pptwise images generate names a generator that a sandbox stopped from writing its own home folder (Operation not permitted, EPERM, EACCES, FS_PERMISSION_DENIED), and says to run the command outside the sandbox or allow that generator to write its home folder in the host, never to copy or move its login files. The skill says the same.

  • d285220: Finding ~/.pptwise no longer writes anything. The CLI used to copy a leftover ~/.pptpress or ~/.pptfast into ~/.pptwise the first time any command looked for it, which failed every command in a sandbox whose home directory is read-only. The copy is gone. Move an old home by hand if you still need it. PPTPRESS_HOME and PPTFAST_HOME still work as aliases.

  • c88b239: pptwise inspect <deck> --page <id> now lists the theme's signature layouts for the page: the drawings the theme's own samples are made of, the ones made for the page's kind first (or for the kind it lands on), each with how it looks and the recipe a page is written to for it, the components, item counts and fields it takes. A cover, chapter or ending whose face draws over a photograph lists that photograph. A written page is drawn and the layout that draws it now is marked, or the report says the face draws it plain. --json carries the same facts under signature.

  • 7e7e441: A deck now moves to another theme by changing spec.theme alone. A page whose kind the new theme does not offer is drawn by the nearest kind it does offer whose face takes the page's components (a fact page as data, then statement, a quote as statement, an evidence page as data or photo by its exhibit, a hierarchy as points), instead of failing validation. The page keeps its own kind, so a theme that offers it draws it there again. spec validate prints a note for each such page, build --json lists them under drawnAs, and inspect and schema --kind show the kind that draws the page. Theme furniture a face has no place for (kicker, stamp, tag, years, stage) is now left off with a warning and kept in the page file, while fields and ballot still fail. A deck that froze its theme in its own theme.json now says how to switch instead of asking for the spec to be rewritten.

  • 920bc5f: Artifacts always go to .pptwise/ under the project root, the directory holding pptwise.config.json or the current directory without one. The outDir setting is gone, and a leftover .pptpress/ or .pptfast/ is no longer reused. A pptwise.config.json that still sets outDir is rejected with the key named. pptwise doctor stops reporting a configured output folder.

  • 470c39b: The skill no longer runs pptwise packs sync at the start of every deck. Content packs are installed once at setup (license set, then packs sync), as the install guides now say, and again only when the license changes or the user asks for newer packs. Making a deck never writes the pptwise home folder, so the whole deck flow works in an agent sandbox whose home folder is read-only. The docs say which commands write ~/.pptwise: config set, license set, license clear and packs sync.

  • 70188ee: The shared compositions gain a portrait setting, drawn on profile's 2026-10 board and read entirely from the theme's tokens. It draws who the speaker is beside a photograph, the posts they held with one result each, what a role asks against what they have done with a verdict a row, a case from the problem through what changed to the result, figures beside a photograph, bars against a control group beside the result, a self-assessment as a radar beside a table of dots, the gaps and when each closes, the first days in phases on a ruler with the one the plan dwells on filled in the accent, and one sentence in the speaker's own words beside their portrait. A block filled with a brand colour too middling for white or dark words is moved just far enough that one of them reads.

  • eaafb74: .pptwise/ now keeps itself out of git from the inside. The first command that creates it writes .pptwise/.gitignore holding *, beside the local exclude line it already added. In a sandbox where .git cannot be written, the exclude line fails with a note and the folder still stays out of git status. --no-git-ignore skips both, and pptwise doctor counts the inner file as ignore...

Read more

v0.44.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 10:17

Minor Changes

  • adba7ad: pptwise brand extract keeps the theme's own fonts. --brand-fonts puts the template's Latin heading and body fonts ahead of them, keeps the theme's Chinese faces, and warns when a template font is off the safe font list (the slides then use the next safe face) or has no exact width table (long lines may overflow).
  • ee02e5e: pptwise theme fork --brand <hex> repaints a theme around a brand color, and --brand '<hex>,<hex>' adds the company's second color. The brand goes into the color the theme shows most as it is. A page-filling field takes it unchanged and the words on it switch to an ink that reads. A slot that writes the deck's headings keeps the theme's own color when the brand would not read there, and the brand goes to the rules and marks instead. A mark or chart series that does not stand off the ground moves its lightness just far enough, never gaining chroma, so dark themes get no neon. The other colors are drawn from the brand's own hue (a neighbour within 30 degrees when more shades are needed), the chart leads with the brand, and single-color charts stay single-colored. The theme keeps its own ground, text, surface and contrast floor. pptwise brand extract does the same with the template's accent1 and accent2. --primary and the other anchor flags keep their literal meaning and cannot be combined with --brand.

Patch Changes

  • ae002fa: theme fork --brand and brand extract no longer derive a shade that reads as another color: a light red that looks pink, a pale orange that looks peach, a dark orange that looks brown. Where no shade of the brand keeps its name, the theme's own grey or ink stands in, and marked words keep the theme's own emphasis ink.
  • 2ab8ee0: brand extract without --from now repaints bulletin instead of brief. Across the brand colors we tested, bulletin is the business theme that keeps a brand color as given and on its face, while brief cannot set a bright brand color in its headings and leaves it to a short rule. Pass --from brief to keep the old choice.
  • 72e1637: A repainted theme fills bars, blocks, and chart series with the brand color exactly as given, and the words and values set on them take an ink that reads there. Only a slot that mostly draws rules, short lines, and small marks is still darkened or lightened to stand 3:1 off the page.
  • f404114: A theme whose charts are one color among inks (swiss, ink, journal, memo, ledger, luxe, runway, stage) keeps them that way when a company names a second color: the second color goes only to the theme's marks outside the chart. The command now says where the second color actually went, or that it is not used.
  • 37832d9: When a theme's pages work its main color into something else before painting it, such as homeroom darkening its primary into a blackboard, a brand that would no longer look like itself there goes to the theme's other colored slot instead, and the reworked field keeps the theme's own color. The command says so and names the color the field would have come out.
  • 3fc14c0: The DSH cards' "Full screen" and "Open" buttons now read "Preview" (预览) with DSH's browse icon, since they open the deck in DSH's right sidebar, the same place DSH previews a presented file.
  • 1ee9ddd: lecture's blackboard frame and chalk ledge take their wood from the theme's warning color instead of its accent, so a fork that repaints the accent changes the chalk and keeps the wood. lecture itself looks the same.
  • 58405ac: Charts on the seal, panel and console faces now show a brand that leads a repainted palette. These faces draw their first series in the theme's mark and used to skip the palette's lead for the rest, so a fork that kept its own mark (vermilion with an orange brand) never drew the brand at all.

v0.43.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 06:34

Minor Changes

  • 860ac1a: On DeepSeek Harness each finished turn that made a deck now ends with a draft card that stays open below the turn, Code Mode included: every page as a thumbnail, the page count and which version of the deck this is (one version per turn, however many times the turn rebuilt it), the pages changed since the last version marked, and buttons to view it full screen, download the .pptx, compare it with the last version side by side, or start a message about one page ("Page 3: " goes into the input box, ready to type). A turn that only drew an outline or a theme wall keeps that card below the turn instead. While pages are still being written, the build card says how many are done.
  • 7e5ac0d: On DeepSeek Harness the pptwise cards now look like DeepSeek Harness's own cards and follow its light and dark themes, in the user's language. Full screen opens in the harness's right sidebar, which can widen to the whole window with its own button, and the keyboard is in the deck from the moment it opens: ←/→, PageUp/PageDown and Space turn pages, Home and End jump, Esc closes, the left and right edges of the page and the strip of pages below it are clickable, a sideways trackpad swipe turns a page, and "Page N of M" shows where you are. Clicking a page in the chat opens it on that page. The draft card marks a changed page with a small tag under it, and "Edit this page" appears when you point at a page. Comparing with the last version opens in the sidebar too.
  • 0577494: On DeepSeek Harness a new pptwise_outline tool checks the deck's spec and shows its outline as a card in the conversation: one row per page with its number, page type, heading and what the page says. The skill calls it once the spec validates, before any page is written, and asks the user to confirm through the harness's own question panel unless they said to go ahead. Card words follow the language DSH is set to.
  • d4707c9: pptwise spec validate --json prints the result as JSON: for a valid spec, the pages in order with their number, id, type, kind, heading and summary, plus the theme, narrative and warnings. For an invalid one, every error with its path, and exit code 1. An agent can now show the user the outline page by page straight from the checked spec.
  • d181907: theme try --title with no theme ids now draws a shortlist of four to six themes: the ones whose occasions match --occasion (occasion words such as business, or a narrative preset such as weekly-brief), filled from a spread of quiet to bold general themes. Before, the DSH theme wall drew all 22 themes when the model named none. A page that fails in every theme is now reported once instead of once per theme, and --json carries these lines as notes. On DSH, pptwise_themes takes occasion, numbers the themes in its card in the order its result lists them so the question that follows can use the same numbers, and its description tells the model to leave page out unless it is a page it already validated.

Patch Changes

  • 2167c21: On DeepSeek Harness the skill's runtime note now names the plugin's own tools: the theme wall goes through pptwise_themes, each build through pptwise_build, and neither runs in the terminal, with the call shape for Code Mode spelled out. A model that ran build in bash left the user reading logs instead of seeing pages. When the plugin was upgraded while DSH kept running, the note now also tells the model to ask the user to restart DSH, since until then the old plugin code stays loaded and the new tools are not there.
  • 4c29a36: The skill now picks from the factory themes by default and creates a theme only when the user names brand colors or hands over a company template or deck. Asked for a "cool" deck, a model used to fork a factory theme into a new color set of its own, which skips the per-page tuning the factory themes carry. A wish for a look now puts fitting themes on the theme wall instead.
  • 4cb2be8: The skill now makes listing the outline a step that is never skipped: before writing any page, the agent lists every page with its number, page type or kind, heading and what it says, even for a short deck and even when the user said to go ahead, in which case it lists the outline and carries on in the same reply.
  • b03b585: The skill now tells the agent to write every message to the user in the language the user wrote in, progress notes and questions included, not only the deck copy. In a Chinese DSH conversation the model used to narrate its work in English and switch to Chinese only for the final answer.
  • 9922e9c: The theme wall card on DeepSeek Harness numbers its columns 1, 2, 3 in the order the tool lists the themes, the same numbers the question panel's options start with, so "2" in the question is the second column in the card.
  • be23b02: A deck can have the number of pages the user asked for. spec validate used to reject a spec whose page count fell outside the range its pacing usually spans (dense 8 to 30, balanced 6 to 24, spacious 4 to 16), so a four-page weekly brief failed and agents added pages to get past it. The range is now a warning that says to keep a count the user gave. A one-page spec, which cannot hold both a cover and an ending, now says the shortest decks are two or three pages and to ask the user instead of adding pages. The skill says the spec has exactly the page count the user named.

v0.42.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 19:26

Minor Changes

  • 4127e73: New pptwise build <deck> [--json] runs assemble, validate, audit, preview and render in one pass. It reports every problem in one list, each with its page, the file and field to edit, and the check's own advice, and exits 1 while the deck needs revision. The pages are drawn whenever validate passes. The .pptx is written only when every check passes, at the same .pptwise/<deck>/<deck>.pptx path render uses, and a build that does not pass removes the one an earlier build left there, so a deck has one final file and it always matches its sources.
  • 8f8268b: The DSH plugin adds two tools. pptwise_themes draws the user's own title as a cover, plus one content page, in every theme and shows them side by side in the conversation, so a theme is picked by looking rather than by reading names. pptwise_build runs pptwise build in the conversation's workspace, shows the drawn pages in the same card as pptwise_preview, and hands the model either the deck's one .pptx or each problem with its page, file and field. Both return small facts to the model and serve the pages to the card by id, so they work the same in Code Mode and in direct calls. A build that needs revision shows its pages without a download button.
  • e6c5d13: The skill now shows the user the theme and the outline before going on: a theme wall drawn with their own cover title (pptwise_themes, or theme try --title outside DSH) and the validated spec as a page list, previewed as soon as it exists. A user who says to go ahead is not asked, but still sees both. The agent checks its work through pptwise build --json (or pptwise_build) after each batch instead of converting pages to images, and delivers only the one .pptx that build wrote, through present on DSH.
  • 0cbf0d8: pptwise theme try can draw your own deck instead of the fixed English sample. Pass --title (and optionally --subtitle, --lang zh|en, or --page <file> with one content page) and each named theme, or all of them, draws that cover and one content page. Every page is written as its own SVG next to manifest.json and the contact sheet, so an agent or a chat host can show the pages directly. A page a theme cannot draw, such as a title its cover would cut, is left out of that theme with validate's reason. Without --title the command works as before.
  • 7d25a42: pptwise themes --json now lists each theme's menu: the face its cover, chapter and ending use, and the face of every content kind it offers under content. A kind a theme does not offer is absent, so an agent can tell whether a theme serves a page before it writes the spec.

v0.41.0

Choose a tag to compare

@liustack liustack released this 10 Oct 18:13

Minor Changes

  • 6bab867: Almanac has a new look, a long-run yearbook. Every content page except statement uses yearbook-sheet: the page's kicker beside a sprout at the top left, a strip of years at the top right that lights the page's years, the point in bold over a hairline, the source small at the foot, and the body drawn in the yearbook setting. A page's tag (what the whole page rests on) is set where its composition places it, or over the body. The cover uses yearbook-cover: the page's photograph squared on the right, contour lines under the office and occasion, the title, a short rule in the accent and a scale of years from the page's timeline. The ending uses yearbook-ending: the photograph under a scrim from the left and each decision on its own card, the marked one in the accent. When the deck asks for a footer, the motif prints the office at the left and 「N / M」 at the right. If you copied almanac into your own theme file, its menu still names the old faces and keeps working as before.

  • 1907b12: pptwise audit now reports any text on a page that still prints an emphasis mark as asterisks, as content-dropped with kind emphasis, and exits with code 1. Before, a component that did not read **…** printed the asterisks and nothing said so.

  • 307ed98: pptwise audit has a new stepped-aside finding. It names every page the theme's layout could not hold, which a plainer layout drew whole but with a heading that does not match the rest of the deck, and it makes the audit exit with code 1. pptwise inspect --fit already said so for one page at a time.

  • 89573fd: A page's ballot can give one item boxes of its own (item_choices), such as a pick among three ways to pay beside items voted for or against. A face that sets every item's boxes in shared columns (clinic's ballot ending) declares such a ballot dropped, and the quiz and request compositions leave it to the face, so validate says where it is drawn.

  • 1226512: The shared compositions gain a binder setting, drawn on proposal's 2026-10 board and read entirely from the theme's tokens. It draws what the client gets as a verdict over its figures, a day's tariff hours in named steps with the hours that matter framed, places side by side as cards, a sum worked line by line down to its answer, a run of bars against a reference with the levers beside it, a formula over two charge cycles a day, what changed from before to now, the parts of a plan with an unsettled basis dashed, ways to pay side by side, public precedents in a table, safety lessons beside who answers for what, a risk register with each remedy, the steps to delivery as a chain, a priced quote with its blanks left to fill, and the papers the client hands over as a checklist.

  • aec759d: A data_table, a comparison and a timeline take an optional title, the name a report gives a table ("Free cash flow"). It prints over the block in bold, and a theme that sets the block in a panel prints it in the panel's title bar. A hand-set table or timeline with no place for a title leaves the page to the ordinary block, which prints it.

  • 243c90c: validate now refuses a cover, chapter or ending heading the bound face would cut or drop, and says how long a heading that face holds on the page, in Chinese characters or in words. Such a heading used to export with its end cut off, or stop the export with no word of the limit. Two luxe faces, the invitation cover and chapter, also cut an over-long title with no mark at all, and now refuse the page instead.

  • aca1276: validate now refuses a cover, chapter or ending subheading the bound face would cut or leave off, and quotes how much of it the face holds on that page. Such a subheading used to pass validate and only show up later as a cut line in the audit or a refused export. The check draws the page with its face, so the room it reports moves with whatever else the page carries.

  • 22d9b66: Brief has a new look. The corner mark in the top left is gone. Content pages now open with a navy heading over a fine rule, and with branding: "full" they close with a footer that names the organization and the confidentiality. The cover, statement, chapter and ending pages are redrawn. Points, list, comparison, process, data and hierarchy pages use the new gauge-sheet face, which chooses a layout from the page's content. Evidence pages use gauge-exhibit and fact pages use gauge-figure. If you copied brief into your own theme file, its menu still names the old faces and keeps working as before.

    Authors can now mark the one thing a page is about:

    • emphasis on a run of waterfall bars, with an optional emphasis_label drawn as a bracket over them
    • emphasis on one chart series
    • recommended on a comparison column
    • emphasis on one roadmap item

    The marked item takes the theme's highlight and the rest steps back. Comparison cells now read **…** as emphasis instead of printing the asterisks.

    When every level of a waterfall sits well above zero, the axis now starts from a round floor below the lowest level, and break marks on the total bars show that the axis is cut. The small steps between the totals are now readable.

  • 479019d: Pages that sit a chart, a row of figures, a timeline or a table next to a takeaway now lay out as designed in brief instead of falling back to a grey note box:

    • A chart followed by kpi_cards puts the figures in a column beside the chart, with an optional callout as the conclusion or a blockquote as a quote. A chart on its own still derives its column from the data.
    • kpi_cards items take a note line under the value.
    • Two to four figures followed by a blockquote set the figures in a row and the quote below, with its attribution.
    • A timeline, comparison (now up to four columns) or rows page followed by a callout closes with a full-width block in the theme's primary colour.
    • A fact page's kpi_cards can carry one or two supporting figures beside the hero figure.

    Every face now draws the page's footnote. Photo pages and several statement, pull-quote and two-column faces used to drop it without a word, and audit now reports a source line that a page leaves out. Headings no longer count ** marks toward their length, and **…** in a blockquote is drawn as emphasis instead of printing the asterisks.

  • a9efcc5: Bulletin now offers statement, fact and evidence pages, which it used to refuse. A statement uses notice-statement: no claim header, the sentence itself set large and bold where the header would be, over a short IKB bar, with the paragraph that backs it under a hairline. A fact uses notice-figure: the usual claim header, then one figure as large as the page allows in IKB with its unit small after it, the line that says what it counts above it, and the two or three figures it is read against under a hairline. Evidence uses notice-exhibit: the usual claim header, then one chart or table on a white card numbered across the deck (「图 1」, 「表 1」, "Exhibit 1"), an IKB ring round the bar group you marked with data[].emphasis or the row you marked highlight, and your reading beside it, numbered to the ring, with up to three notes. A page these faces cannot set whole goes to the ordinary notice sheet. The shared compositions behind them, sentence, billboard and proof, work in the notice setting, so any face that sets its pages that way can offer them.

  • 0ddb07f: Bulletin has a new look. The cover and ending are a full IKB page with a large white title and white steps. Every content page now opens with one quiet header, a black bold claim over a grey hairline with a short IKB bar, in place of the IKB title band and the ruler, and IKB is kept for the one thing each page marks. Points, list, comparison, process, data and hierarchy pages use the new notice-sheet face, which sets the page from its content: numbered rows with the answer reversed out, a chart or bridge beside its figures, a horizontal bar chart, an open records table with a warning, figures beside a titled list, a calendar window over facts, a two-lane timeline, or an options table. Photo pages use the notice column of image-split. On bulletin, a waterfall or a gantt may share its page with a kpi_cards. If you copied bulletin into your own theme file, its menu still names the old faces and they keep working, while bulletin-motif now draws only the steps.

  • 3153104: A callout can carry a title, a short bold line over its text naming what the note is about (such as 谁付 or Who pays), and a tag, a few words under its text that say what the note rests on (such as 企业口径 · 据报道, with a basis or an evidence kind). The ordinary callout draws both inside its panel and declares a tag wider than its text dropped. The shared hand-set compositions leave such a page to the ordinary callout.

  • 3fa3b01: The shared compositions gain a chalkboard setting: a night class at a green board, words in chalk white, what is quieter in a wiped chalk grey, and one stroke of yellow chalk drawn by hand under the thing to remember. Sixteen compositions come with it: agenda (what tonight covers in boxes of chalk), confluence (two paths meeting in one result beside a photograph, from a concept_equation), braces (a formula with a brace under each term its "term:note" bullets explain), boughs (a decision tree in chalk with the recommended answer ringed), factors (things beside their factors, written after a multiplication sign in sub), subtractions (what is taken off as a row of minus signs), flashcards (two rows of cards, the tagged ones ringed), risers (a rate table as a staircase), givens (an example's givens beside its photographs), derivation (a sum worked line by line with its equals signs in a column), cascade (a waterfall as chalk bars, the marked step dashed in yellow), exercises (questions lettered in rings with a line to answer on), `solu...

Read more

v0.40.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 07:08

Minor Changes

  • 7de5a42: Chart value axes now always hold what they draw. A bar chart whose values are all the same, or all below zero, keeps zero on its axis, so a single bar no longer hangs below the x-axis. Values that differ only in their last few digits get distinct ticks that reach every value, and tick labels print the digits each tick has, so two neighbouring ticks never read the same (a step of 0.000001 used to print every tick as 1). A value past 1e300 on any chart's value axis, which used to stop the page with an error or draw points at NaN, is refused by validate with the same advice stacked and combo charts already gave: divide every series on that axis by one power of ten and name the unit.

    Bar values are printed together or not at all, the rule stacked totals already follow. When every value fits beside its bar, clear of the bars and inside the chart, all are printed as before. When they do not, none is printed and the export stops on that page until the numbers are shorter or the chart has fewer bars, where a crowded chart used to print its values on top of its bars and past its edges.

    Long names are shown whole where there is room. A horizontal bar chart's name column grows with its longest category name, up to about a third of the chart, and the chart grows taller with its category count, so each category keeps a row. A donut's centre caption and a waterfall's category names wrap onto a second line instead of being cut. Charts whose names and numbers already fit render exactly as before.

Patch Changes

  • 7266230: Chinese text no longer ends a paragraph on a single character. Where a card note, a bullet or a node label used to wrap as 植物染批次色差需沟通成 over 本, one more character now comes down with it, and a four-character label splits two and two. Line counts and line widths stay within what the box allowed before. A cycle node whose three-character label cannot be split that way widens into a capsule and keeps the label on one line.

    Georgia body text is measured by the font's own letter widths instead of averages that ran about 20% wide, so a note that fits one line stays on one line (the timeline's and chevron band's last notes in the brief theme). Two chevron notes that share a baseline now keep at least 24px between them, and a decision tree steps its connector back when a condition such as 100% needs more room than half the gap gives. The chevron_process schema now says a note may take two lines, which is what the drawing has always given it.

    A row of icon cards now tops every column at one line, so icons and titles align when the bodies differ in length. Numbered cards keep at least 8px between a card's edge and its words, and a staircase's lowest step keeps the same room under its number as beside it.

  • 5a3fcb5: Sixteen components and one face now keep ordinary-length English and mixed-language text whole in narrow columns instead of cutting it at the end of a line. Chevron process notes, five forces items, hub and spoke descriptions, KPI card and progress donut sources, matrix cell titles, sankey node labels, swimlane lane names and step descriptions wrap onto further lines, and the drawing grows to hold them. A comparison table whose proportional column split would cut a header or a cell sizes its columns from what each one needs and wraps the widest column. A cycle node whose label will not fit its circle, such as a single long English word, stretches sideways into a capsule of the same height. Decision tree branch cards grow to the height of the outcomes they lead to, conditions may run back across the column they come from, and outcome names share one size that shrinks as far as the 16px floor when one of them needs it. Icon cards shrink their icon node, numbered cards close the gaps between pills, and a staircase unit takes the room its number leaves before any text is cut. Icon cards also size their type against the number of lines their titles really take, so a tall card row, like the one the split band face draws, no longer cuts each description a line short. Timeline end labels wrap short of their neighbour instead of running under it. The Runway spotlight face wraps a long heading onto two lines, and its fallback heading is fitted to the full line it is set on. Pages whose text already fit render exactly as before.

  • 313e8da: A hub and spoke drawing, sankey diagram, five forces cross or set of numbered cards given less height than its smallest complete form now declines the box, marking the whole component as dropped, instead of setting words that stop at their minimum size below the box. A hub and spoke drawing still scales down into a short box as long as its capsules and hub stay tall enough for their words. A sankey node label left off for want of room beside its node is now declared dropped rather than left out silently. Components given the height they ask for render exactly as before.

  • f2d2cd3: A comparison table, matrix, timeline, KPI card row, chevron process, progress donut row, icon card row, set of steps or cycle that is given less height than its smallest form now declines the box, marking the whole component as dropped so the layout can find it more room or the export stops, instead of drawing its last row, card or line below the box. Before declining, each still gives back what it can: a side-by-side timeline gives back description lines and then a title's second line, and a cycle gives back description lines, each cut marked. A comparison table no longer keeps a row it has no room for, and a stacked timeline no longer keeps a milestone it has no room for. Components given the height they ask for render exactly as before.

  • ca12477: A single-number page now sizes the number together with its unit, so a long figure such as "1142.6 万元" stays inside the page margin instead of running its unit toward the edge. Figures whose unit already fit render exactly as before. pptwise audit and the preview overlay measure a unit set in a smaller size at that size, so these pages are no longer reported as falling off the page. The photo page with the picture on top gives its title more room above and below when a theme sets the title larger, so the title no longer sits on its rule or against the picture. The covers and ending that print the organization in the top-left corner, and the cover with a colored top band, no longer draw the theme's corner mark over or under it. The single-evidence page no longer marks a complete source line as cut. On the page that tiles four to six tall images, a caption longer than its frame wraps onto a second line instead of being cut after about eleven characters.

  • 054343c: The bento panel page sets its footnote the same distance above the footer line as every other page, where it used to sit 8px from the rule. A line of text asked for at a size below the 16px floor now starts at the floor and is only shortened when it really does not fit there, where before it was always reported as cut even when it was drawn whole.

  • 462ca4e: A single-number page no longer shortens the number to make room for its unit. When the number and its unit do not fit on one line, the unit is set smaller first, and a number too long to fit even then moves to a plain page that shows it in full as an ordinary metric card. Pages whose number and unit already fit render exactly as before.

  • d37c99a: The homeroom theme's two faint notebook rules on content pages now sit at the bottom of the page, below the footer line, instead of across the middle of the content area. Before, they ran through chart axis labels, card text, table rows and other words that landed at those heights, and read like a strikethrough. Cover and chapter pages keep their rules where they were. When a deck turns on the content-page footer or logo (branding set to full or minimal), the footer area belongs to that, and content pages draw no rules.

  • 8a54bcd: An iceberg's tip line now sits a few pixels above the waterline instead of resting on it. A roadmap no longer marks a short period such as "Q1" as cut, sets each row value on the same baseline as its label, and gives a long row label the room its short values leave, or a second line, instead of cutting its end off. Rings in a narrow box, such as the side panel of a three-part page, now keep a label column wide enough for their labels and print every description in full, with the core growing a little when it needs to hold its own name. When the box is still too short, the page moves to a layout with more room instead of cutting text or leaving a line off the bottom. Rings that already fit render exactly as before.

  • 199355b: On the page with a wide lead column and two framed panels, the lead column now goes to the first block that is not running text, and a paragraph, bullet list, callout or quote moves to the panel beside it. A page that opened with a one-sentence introduction used to give that sentence the wide column and squeeze the drawing it introduced into the narrow panel, where English rings could not fit and the page moved to a plainer layout. Pages whose blocks are all running text keep their order.

    A business model canvas measures each block title in the typeface it draws it in, so a block no longer carries an empty title line, or drops its last item, where an English title wraps differently in the heading typeface than in the width estimate. A positioning map places an English name by its real width instead of half again, so a crowded map no longer leaves off a name that fits. A waterfall with a value or running total past 1e300, which used to draw every bar at NaN, is refused by validate with the same advice charts give: divide every item by one power of ten and name the unit in unit.

  • 23415cf: A Chinese clause now breaks between any two characters even when the sentence has spaces elsewhere, as in 镜像构建从 Jenkins 迁到 GitHub Actions,平均构建时长…. It used to move to the next line whole, which could leave ...

Read more