Skip to content

v0.45.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 07:20
· 60 commits to main since this release

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 ignored.

  • c29be62: The final .pptx that build and render write to .pptwise/<deck>/ is named after the deck's own filename, the spec's or the IR file's, with or without the .pptx extension. A deck that sets none keeps the deck directory's or IR file's name, as before. Characters a file name cannot hold become -, and letters of any script are kept. Each deck folder holds one final .pptx: a build that does not pass, or a renamed filename, leaves no older export beside it.

  • 70188ee: A new built-in theme, profile, sets a candidacy, a self-introduction or a career plan as a magazine profile of the speaker: white paper, claims, names and figures in a serif, open columns under hairlines, a photograph bled off one side, and one accent a page on what the page is about. Each content page opens on a short line naming the part of the talk, numbered from the deck's course.stages and the page's stage. Its cover sets the speaker's name large beside their portrait, with the occasion, the date, the post held and the post wanted, and three figures. Its chapter sets the part's title in the serif on white paper. Its ending sets the closing promise, a line inviting questions, and the speaker's card with a round avatar drawn as a native ellipse crop. Every content page's footer carries the deck's label, the speaker's name and the page number. pptwise themes now lists 23 presets, and career joins the occasions a theme can serve.

  • 6947794: proposal now reads as a printed proposal rather than a web page.

    • No index tabs down the right edge. Content pages and the close wear a running head: the deck's label at the left, the page's section at the right, its label in course.stages with no number (「算账」, "Numbers"), a hairline under both. The source sits at the foot's left beside the page number.
    • A section page is petrol on its left half beside its photograph on the right, with the photograph's caption from the page's footnote. Its stage names the part under the number when the kicker has no 「 · 」.
    • Cards, chips and buttons gave way to hairlines and ruled tables. A row's kind of source is a column of its own, the figure a page lands on is set in the brick red, never on a block of it.
    • The cards of the shared components (kpi_cards, numbered_cards, row_cards and the like) are no longer warm sand: white like the paper, framed by a hairline, square cornered.
    • The close sets each decision on a ruled row with square boxes to tick. Its paragraph is a line to fill in, each run of 「_」 a line to write on (「约踏勘时间 ___ 年 __ 月 __ 日」).
  • 2b7eece: A new built-in theme, recap, sets a year-end review, a probation review or a promotion defence as the ledger one person keeps on their own year: white paper, heavy claims, figures in DIN, columns opened by a black rule, the accent on what the speaker led and the one figure a page is about, and red beside a cross for what went wrong. Each content page opens on a numbered line naming the part of the review, from the deck's course.stages and the page's stage. Its cover sets a photograph across the top, the occasion and the date, the year's conclusion, the speaker's particulars as fields and three figures. Its chapter sets the part's number large with its name beside it, the title, and what the part covers with a figure or a state each. Its ending sets the commitment on a block of the accent beside the asks, each with an empty box, and the speaker's signature. Every content page's footer carries the deck's label, the speaker and the occasion, and the page number. pptwise themes now lists 24 presets, and review joins the occasions a theme can serve.

  • 44d3aa9: A theme can set its shared components as print with shape.surfaces: "ruled". Cards lose their ground and rounded corners and are held by hairlines and white space, a number is set as the figure itself rather than in a disc, a solid block becomes an outline or a rule, a table runs on rules with no tinted row, and what a page leads with is set in weight and ink under one 2px accent rule. Charts keep their marks. A theme that leaves the token out renders exactly as before.

  • ad2b718: The SDK's extractBrandTheme now does what pptwise brand extract does: it repaints a theme around the template's brand color and second color, by the same rules as theme fork --brand, instead of mapping the template's palette onto tokens under a fixed menu. The CLI calls it.

    const { file, placement, fontNotes } = await extractBrandTheme(bytes, {
      id: "acme",
      label: "Acme",
      from: "bulletin", // a built-in theme id or a complete theme file, bulletin by default
      brandFonts: false, // true puts the template's Latin fonts first
    });
    • New options: from and brandFonts.
    • It returns { file, placement, fontNotes } instead of the theme file: file is the repainted theme, placement says where each color went, and fontNotes holds the font warnings --brand-fonts prints. The types BrandThemeResult, BrandPlacement, PlacedColor, Refusal and BrandSlot are exported.
    • It renders the theme's sample deck to find the slot the theme shows most, so install a platform (installPlatform) before calling it.
    • The template's dk1, lt1 and lt2 are no longer read or checked, since the repainted theme keeps its own ground and text. A template with a grey palette, or with no dk1/lt1, no longer fails extraction. When the brand color itself has no color in it (a grey, a black or a white), placement.brand.neutral is true and pptwise brand extract and theme fork --brand say the theme is repainted in grey.
  • d11b728: The skill now stops once, at the outline. It picks the theme by occasion and says why in one line with the outline, draws a theme wall only when the user asks to see looks first, mentions the other themes the first build draws without stopping, switches theme by changing theme in deck.spec.json and building again, and offers two or three color forks before a color change the user did not name. The English and Chinese playbooks and references say the same, and the DSH tool descriptions no longer ask for a theme wall on every deck.

  • 6613a96: A deck switched to another theme now builds in one go. A build that draws every page whole records its theme in .pptwise/<deck>/written-for.json. A later build under another theme draws the deck instead of refusing pages written for the first theme: what the new faces cannot take (a cover's list or source line, a block beside a full-body one, fields, ballot, the last items of a list too long for the new box) is left off, and text too long for the new box is cut. Each page that lost something gets a warning naming what and how to keep it, and the report's writtenFor names the theme that draws it whole. The page files keep everything, so switching back draws them whole again. Without a record, every page is checked as strictly as before.

Patch Changes

  • d5b1c55: The audit reads the ground under quarter-turned text (a vertical running head) where the text actually sits, instead of at its unturned box.
  • af00e23: A marked run in an image grid caption is placed by the width of the font it is painted in, so its highlight sits on its words.
  • 99be1e7: An unknown command or option now prints the command's own help after the error. pptwise schema --help also points at pptwise inspect <deck> --page <id> for one page's keys and components.
  • 83b20c5: Crayon's chapter page moves its small star aside when a subheading line runs under it.
  • 980a85e: Crayon's content heading steps down in size when two lines would reach the kicker capsule above it.
  • 4646bdc: A cropped picture counts as background only when its crop covers the whole page, so a cropped photo inside the content no longer reads as overlapping the text on it.
  • 9337c4c: On DSH, a pptwise_build that passes with warnings no longer says every check is clean. It says how many warnings follow.
  • 53162df: When the DSH plugin is the first to create a project's .pptwise/, it now keeps the folder out of git the same two ways the CLI does: a .pptwise/ line in the repository's local exclude file, then a .gitignore holding * inside the folder. Outside a repository, without git, or with a .git it cannot write, it skips the exclude line and the preview goes ahead.
  • 54f25d1: A marked from_to row picks the ink of its starting value against the tinted band it sits on.
  • b9b88e6: A gantt with more rows than its box holds draws the rows that fit and declares the rest left off, instead of drawing rows below the page.
  • 0024145: pptwise inspect <deck> --page <id> lists only the page file keys this page's face places, and says what the easily misread ones hold: fields is a form's header lines, not a list of fields. The line now reads page file keys (the top-level keys of pages/<id>.json).
  • 7cd0c12: schema --kind and inspect list what a kind's own face takes again whenever the bound theme offers the kind, instead of every component a stand-in's face takes. A page holding something its kind's face does not take is still drawn, as the nearest kind whose face does, and validate now warns about it, naming what the kind's own face takes. A kind the theme does not offer still lists its stand-ins' components with drawnAs.
  • 7cc11cd: Homeroom's ending stamp picks its ink against the paper it is pressed on when there is no sticky note.
  • 4336fe9: A line chart's value note moves to the other side of its point when another series passes through where it would sit.
  • c334890: A marked run in bullets, a paragraph, a callout or a comparison table is lifted until it reads on the ground under it, while its highlight keeps the theme's emphasis color.
  • 4f23653: memo sets its shared components as a typed memo. A page drawn by the component renderer, such as a matrix, a SWOT or numbered cards, now has hairlines in place of cards, figures in place of discs, ink outlines in place of solid blocks, and one seal red rule on what the page leads with.
  • 79b2e5b: A paragraph now wraps so no line runs wider than its column in the font it is painted in. Figures and dashes in Microsoft YaHei could push a line past the column before.
  • f706467: proposal sets its shared components as print. A page drawn by the component renderer, such as a SWOT, a matrix or numbered cards, now matches the proposal board: hairlines in place of cards, figures in place of discs, one brick red rule on what the page leads with. Its card colour goes back to the board's warm sand, which only shows where a photograph is missing.
  • f6d130f: On a theme set as print, the ring that stands for a person with no photograph, in people cards and on a quote wall, is drawn in the muted ink rather than a hairline, so the roster no longer reads as blank space.
  • b1e8f90: On a theme set as print, the rings of a layered model and the wedges of a segmented wheel are outlined in the muted ink rather than a hairline, so the figure stays visible when nothing is drawn inside it.
  • 397e02d: A gantt on a theme that sets its shared components as print keeps its bars in the colours it has everywhere else. The bars are the plan's data, so only their corners are squared, and a calendar on proposal, thesis, memo or swiss no longer turns into a stack of heavy dark blocks.
  • 51a9379: The pptwise skill reads a page's signature layouts in inspect before writing it, and after the first full build rewrites the pages drawn plain to their recipe where the content holds it, never adding content to fit.
  • 4d59f30: swiss sets its shared components as a printed annual report. A page drawn by the component renderer, such as a matrix, a SWOT or numbered cards, now has hairlines in place of cards, figures in place of discs, ink outlines in place of solid black blocks, and one Swiss red rule on what the page leads with.
  • 6e71014: thesis sets its shared components as print, as a paper sets its tables and figures. A page drawn by the component renderer, such as a matrix, a SWOT or numbered cards, now has hairlines in place of cards, figures in place of discs, and one scholar's gold rule on what the page leads with.
  • 962ce55: A title set over two lines on the full measure no longer leaves one word or one Chinese character alone on its second line when no clause break fits: it breaks a word earlier ("Our customers" + "have changed"). A break at a comma still stands.