Skip to content

Releases

v0.7.0

Choose a tag to compare

@aaarendt aaarendt released this 06 Nov 23:23
5b01387

/uw-slides:generate-slides no longer asks permission for every command, read and write. New decks come with Claude Code permission rules, and /uw-slides:update-deck adds them to existing decks. In existing decks, run /uw-slides:update-deck. It shows the rules it will add and keeps everything already in your settings. The corrected setup-reveal.sh comes with it, so run /uw-slides:update-deck there once for both (see Fixed).

Added

  • tools/test_setup_reveal_urls.py checks that the three download URLs in templates/setup-reveal.sh exist on jsDelivr (HEAD requests). It is skipped when the CDN cannot be reached, and checks the local path the deck expects either way (#56).
  • tools/deckperms.py writes the permission rules into a deck: .claude/settings.json (commit it) allows the deck's own commands (python3 tools/deckparse.py, python3 tools/resolve-catalog.py resolve, python3 tools/lint.py, ./build.sh, ./build-visuals.sh, ./outline.sh, ./lint.sh, ./status.sh, printenv UW_SLIDES_HOME) and edits to content/ and slides/; .claude/settings.local.json (this computer only, added to .gitignore) allows reading the plugin's folder, where the skills read layouts, brand rules and schemas. It adds only missing rules, keeps everything else, leaves a settings file that is not valid JSON untouched, and --check shows what it would add. tools/test_deckperms.py covers it.
  • /uw-slides:new-deck runs it, so a new deck has the rules from the start. It prints how many it wrote.
  • tools/test_skill_commands.py reads every command out of the SKILL.md files and fails unless each one is covered by a permission rule or is on a short list of commands that are meant to ask (resolve-catalog.py eject, ./publish.sh, ./export.sh, ./setup-reveal.sh, git rm). It also fails on a compound command (&&, ;, pipes, $VAR, redirects), because Claude Code checks each part and one unmatched part makes the whole command ask. A command added to a skill without a rule now fails CI instead of bringing the prompts back.
  • README "Permission prompts" explains the rules, which commands still ask (./publish.sh, ./export.sh, git, resolve-catalog.py eject), and the two user-level rules for the plugin's own scripts (new-deck.py, deckperms.py).

Changed

  • Every skill now says to run each command exactly as written, as one command with nothing appended. In a live run Claude added 2>/dev/null; echo "exit: $?" to printenv UW_SLIDES_HOME, and the $? made an otherwise allowed command ask. The skills also say to check for a file with the Glob or Read tool instead of ls or test in the shell, and generate-slides no longer redirects the resolver's output (2>&1).
  • /uw-slides:update-deck checks the permission rules and offers to add them, in the same confirmation as the managed files. It treats them as add-only: they are not managed files and are never overwritten.
  • .gitignore in new decks lists .claude/settings.local.json.

Fixed

  • setup-reveal.sh downloads the speaker-notes plugin from dist/plugin/notes.js, where reveal.js 6.x ships it. It used the 5.x path plugin/notes/notes.js, which returns 404 for 6.0.2, so the script stopped (set -e) after reveal.min.js and reveal.min.css and left assets/reveal/plugin/notes/notes.js missing. The file is still saved as assets/reveal/plugin/notes/notes.js, so footer.html, publish.sh, export.sh and new-deck.py are unchanged. Without it the footer's RevealNotes reference throws, Reveal.initialize never runs and the deck is a black screen. In existing decks, run /uw-slides:update-deck, then ./setup-reveal.sh.
  • The README's manual-download instructions for the notes plugin use the correct URL.
  • /uw-slides:update-deck now manages setup-reveal.sh (#41), so existing decks receive changes to it.

Why

  • The earlier fix for permission prompts (#51) covered only /uw-slides:new-deck, by replacing about 20 commands with one script. /uw-slides:generate-slides still asked about the deckparse.py and resolver commands (which no rule was shipped for), about reading the plugin's files from outside the deck, and about writing each slide, so a 15-slide deck could mean 30 or more prompts. The skills also named an allow rule only in prose, and only for deckparse.py.

v0.4.0

Choose a tag to compare

@aaarendt aaarendt released this 04 Nov 00:20
8c8ab74

The CloudBank catalog grows to 13 slides, enough to build a standard CloudBank talk from catalog slides alone: a title slide, the case for cloud, what CloudBank offers and how to apply through ACCESS or the NAIRR Pilot, usage figures and rule-of-thumb costs. /uw-slides:new-deck now scaffolds a deck with one command. The catalog version is now 2.1.0. In existing decks, run /uw-slides:update-deck once to get the fixed resolver.

Added

  • Catalog slide cb-rule-of-thumb-costs (CloudBank brand, verbatim): "Rule-of-thumb cloud costs", round-number AWS on-demand prices (US East, October 2026) for a laptop-class VM (10¢/hour), a workstation ($1/hour), an A10G GPU machine ($1/hour, spot about half), hot storage (2.3¢/GB/month), cold archive (0.1¢/GB/month) and data egress (9¢/GB), each with an example, plus a callout that a $1/hour machine left on for a month costs about $730.
  • Catalog slide cb-by-the-numbers (CloudBank brand, parameterized): "CloudBank by the numbers" for October 2025 to October 2026. Three headline stats (292 research projects, $2.24M allocated to research, 78 CloudBank Classroom courses), research awards by tier with average award (Explore 234 at $4,423, Discover 56 at $19,689, Accelerate 2 at $52,094), and the top three research fields plus 40 more. Every figure is a param defaulting to the current value, so decks can show newer figures without ejecting.
  • Catalog slide cb-nairr (CloudBank brand, verbatim): "CloudBank through the NAIRR Pilot", the second route to a CloudBank account. Four labelled differences from ACCESS (AI focus, everyone on the project U.S.-based, cash awards, longer monthly review) and three numbered steps to request CloudBank through NAIRR (prepare: cost estimate, grant number, CVs, ACCESS account; request: three-page proposal at nairrpilot.org; onboard within 1–2 weeks), with a pointer to NAIRR Classroom projects for educators. The NSF portal screenshot from the source slide is not included. slide.md notes which claims come from the NAIRR Pilot pages and which from the slide owner.
  • Catalog slide cb-research-and-classroom (CloudBank brand, verbatim): "Two ways to use CloudBank", a table comparing CloudBank Research (cloud accounts for research projects, through an ACCESS or NAIRR Pilot allocation) and CloudBank Classroom (a JupyterHub for teaching, through an Explore ACCESS allocation), with the two logos as column headers.
  • Catalog slide cb-why-cloud (CloudBank brand, parameterized): a general "Why cloud?" motivation slide with six headed items and original line icons: bring compute to the data, scale up on demand, run in parallel, use and deploy LLMs, share reproducible environments, host research services. Example services are named in the speaker notes only. An optional lead param adds a talk-specific line under the heading.
  • Catalog slide cb-what-weve-heard (CloudBank brand, verbatim): a dark "The friction" slide with four paraphrased researcher quotes (no account without a credit card, no time to learn it all, setup different on every platform, an opaque $12K bill), labelled as paraphrased. Each quote is answered by a later CloudBank slide.
  • Catalog slide cb-title (CloudBank brand, parameterized): the CloudBank title slide, with the same params as uw-title (title, subtitle, presenter, affiliation defaulting to "CloudBank", date). A CloudBank deck can now be assembled entirely from catalog slides, starting with a title (#42).
  • tools/new-deck.py scaffolds a deck in one command: python3 <PLUGIN>/tools/new-deck.py <name> [--brand=uw|cloudbank]. It does everything /uw-slides:new-deck used to do with about twenty separate commands (templates, brand header and footer, fonts for uw, the vendored tools, .github/ files, .brand, .uw-slides.json, deck.yml and the starter briefs), validates the result and runs setup-reveal.sh. A failed reveal.js download is a warning, not a failure. It refuses to touch an existing folder, rejects names that are not safe as a folder name, removes the folder it created if a step fails, and makes every *.sh executable (setup-reveal.sh and export.sh were not executable in the plugin). Tests: tools/test_new_deck.py, including a check that its managed-files list matches /uw-slides:update-deck.
  • README section "Update to a new version": how to update the plugin in Claude Code (claude plugin update, /plugin, turning on auto-update, /reload-plugins), Codex, GitHub Copilot CLI and linked-skill installs, then how to update each deck with /uw-slides:update-deck. The release process in this file and CONTRIBUTING.md now say that users receive changes only when the version changes, and add publishing a GitHub release.

Changed

  • The catalog version is now 2.1.0: seven CloudBank slides were added and cb-title changed (see Added and the line below). Nothing was removed, so decks pinned to 2.0.0 keep working.
  • Catalog slide cb-title 1.1.0 carries the logos and award credit NSF requires: the CloudBank and NSF logos with "NSF Awards: 1925001 & 2505560", and a Deep Navy band of white partner logos (San Diego Supercomputer Center, UC San Diego, University of Washington, UC Berkeley, Strategic Blue). The background changes from Deep Navy to white so the full-colour logos read. The logos ship in the slide's assets/ folder, the first catalog slide to use it; the resolver copies them into the deck and publish.sh embeds them. The affiliation default changes from "CloudBank" to empty, since the logo is on the slide. Params are otherwise unchanged, so decks pick this up on their next resolve.
  • /uw-slides:new-deck runs that script instead of copying files one by one, so Claude Code asks for permission once instead of about twenty times, and the result is the same every run, in seconds and with few tokens. The README documents the allow rule Bash(python3 */tools/new-deck.py *); the * stands in for the version-numbered plugin folder (#50).
  • Every skill's "Plugin directory" section now says to write paths literally and never use shell variables (PLUGIN=... $PLUGIN/...), which Claude Code cannot match against an allow rule (#50).

Fixed

  • The deck's tools/resolve-catalog.py rewrites only the root <section>'s aria-label when it resolves a catalog slide. It used to rewrite every aria-label in the fragment, which would have replaced the labels inside a slide, such as the partner logo list on cb-title 1.1.0, with the slide's own label.

v0.3.1

Choose a tag to compare

@aaarendt aaarendt released this 02 Nov 19:17
73ea037

Catalog slides no longer need a separate step: /uw-slides:generate-slides resolves them, and the deck's resolver finds the catalog of a marketplace install on its own. In existing decks, run /uw-slides:update-deck once to get the updated resolver and record where the plugin is installed.

Changed

  • The deck's tools/resolve-catalog.py can find the catalog of a marketplace install without --catalog: /uw-slides:new-deck and /uw-slides:update-deck record the plugin location as plugin_dir in .uw-slides.json, and the resolver reads it after $UW_SLIDES_HOME. A missing or stale path is ignored, and the "Catalog not found" message then points to /uw-slides:update-deck. The resolver's docstring now documents that a vendored copy also looks in <deck>/catalog (#34).
  • /uw-slides:generate-slides now resolves catalog slides itself: before generating layout slides it runs tools/resolve-catalog.py resolve . --catalog=<PLUGIN>/catalog and reports the resolver's output, including placeholder and brand warnings, with its own. Users no longer need the --catalog path (#39, most of #34). /uw-slides:plan-deck's next steps, the README walkthrough (step 4, "Using a catalog slide", troubleshooting) and catalog/README.md shrink to a single /uw-slides:generate-slides.

v0.3.0

Choose a tag to compare

@aaarendt aaarendt released this 02 Nov 17:54
2c861e3

This release makes the plugin installable from a marketplace in Claude Code, Codex and GitHub Copilot CLI, simplifies the slide catalog and fixes /uw-slides:update-deck. Breaking changes: the Claude Code marketplace is renamed from uw-slides-local to uw-slide-deck (README, "Upgrading from the symlink install"), and the catalog's land-ack slide is removed (catalog 2.0.0). Run /uw-slides:update-deck in existing decks to pick up the new scripts and tools. The SLIDES.md fallback, planned for removal in this release, stays deprecated; its removal moves to a later release (#22).

Added

  • The plugin is now an Agent Plugins v1.0.0 package, installable in Claude Code, Codex and GitHub Copilot CLI, with linked-skill instructions for OpenCode (README, Installation). New root plugin.json (portable manifest) next to .claude-plugin/plugin.json, and a Codex marketplace in .agents/plugins/marketplace.json.

  • tools/validate_plugin.py checks the manifest rules, that both manifests match, skill front matter, that every skill using <PLUGIN>/ paths says how to find the plugin, and both marketplaces. --claude also runs claude plugin validate. Tests: tools/test_validate_plugin.py.

  • Catalog slides cb-what-is, cb-programs, cb-why-choose, cb-award-tiers and cb-process (CloudBank brand, verbatim): the standard CloudBank introduction (what it is, services, reasons to choose it, award tiers, application process). On-slide text is condensed; the full wording is in the speaker notes. Each slide.md lists its source pages.

  • Catalog slide cb-eligibility (CloudBank brand, verbatim): who can lead a CloudBank project and recommended uses. Full source wording is kept in the speaker notes.

  • The catalog resolver warns when a resolved slide still shows PLACEHOLDER wording, such as the funding slide's default agency, grant ID and grant title, and names the values left to set.

Changed

  • Skills find the plugin through $UW_SLIDES_HOME, then the plugin they were loaded from (two directories above their SKILL.md), then ~/.claude/plugins/local/uw-slides. Before, an install anywhere but that path needed UW_SLIDES_HOME. Every skill now names plugin files as <PLUGIN>/..., so they're not confused with files in the deck. The deck AGENTS.md template gives other agents the same order.

  • Skills pass --catalog=<PLUGIN>/catalog to the deck's vendored resolve-catalog.py. The resolver also looks for a catalog/ next to its own tools/ directory. The resolve and eject commands in catalog/README.md, catalog/CURATION.md and the catalog slides' slide.md files pass the flag too, because a deck's copy of the resolver can't find the catalog of a marketplace install on its own.

  • Skills read the plugin version from plugin.json instead of .claude-plugin/plugin.json.

  • The Claude Code marketplace is renamed from uw-slides-local to uw-slide-deck, and the homepage and repository URLs now point at aaarendt/uw-slide-deck-plugin (the old uw-slides-plugin URL returns 404).

  • catalog/CURATION.md now admits program slides (standard slides for a program such as CloudBank) alongside framing slides, with a brand and ID prefix per program, a size guideline per program, and rules for policy wording that changes.

  • plan-deck checks a program's catalog slides against planned content slides in decks of that program's brand, not only framing roles.

  • Catalog agenda 1.1.0 groups slides into parts: slides that share a section: become one item (or, without sections, each section-divider and the slides after it), with their minutes summed. New optional slide.md field in_agenda: false keeps framing catalog slides out of the agenda; the six seeded framing slides set it.

  • Catalog slides without a title now take their aria-label, and their agenda label, from their own heading instead of the catalog description.

  • /uw-slides:update-deck now also keeps tools/resolve-catalog.py in sync, and adds it (and tools/lint.py) to decks scaffolded before they were vendored (#33). When a deck has no vendored deckparse.py or lint.py, the deck scripts now suggest running /uw-slides:update-deck instead of only setting UW_SLIDES_HOME.

  • README reorganised for new users: a plain description and a screenshot of a built slide at the top, install for Claude Code first with other agents after, a step-by-step "Make your first deck" written around what each skill does (generate-slides already builds and runs both checks; apply-visuals builds pass 2), with two ways to fill a deck: plan it with plan-deck, or assemble it from catalog slides without planning, which uses few or no tokens. Covers revising, visuals and publishing, and lists the deck scripts separately for running without an agent (replaces Quick Start and the two-pass workflow), "What's in your deck folder", and two new troubleshooting entries. Maintainer material (packaging, how skills find the plugin, changing defaults, adding a brand) moved to "For plugin developers" at the end. The README no longer tells you to run ./setup-reveal.sh after scaffolding (new-deck already runs it), and its "change the defaults" list names the -reveal header and footer that new decks actually use.

  • README: new "Catalog Slides" section (what the catalog holds, what ready/draft/review mean, how to use, resolve and eject a catalog slide), and the resolve step added to Quick Start and the two-pass workflow. New "Switching from the symlink install" and "Working on the plugin" sections replace "Local checkout (development)" (#35); CONTRIBUTING's test step now uses claude --plugin-dir. The "Migrating from SLIDES.md" section is removed; references/migration-guide.md and /uw-slides:extract-to-markdown --migrate are unchanged.

  • tools/validate_plugin.py also checks the Codex marketplace entry's required policy and category, and that both marketplaces use the same category. The Claude Code marketplace category changes from development to productivity to match Codex (#36).

  • Catalog slides no longer have a status field (draft / review / ready): a slide in the catalog is ready to use, and slides whose wording isn't approved stay out of it. plan-deck now uses any catalog slide whose description fits, so the CloudBank introduction slides (accepted by their owner on 2026-11-02) are picked for CloudBank decks; before, as review slides, they never were. Their "Status note" sections became "Sources". A PLACEHOLDER value the planner can't fill becomes a VERIFY: line. Slide briefs in a deck keep their own status: (draft / review / done), which is unrelated.

  • The catalog version is now 2.0.0, because a slide was removed (see Removed).

  • The SLIDES.md deprecation warning in build.sh and build-visuals.sh no longer names v0.3.0 as the removal release; removal moves to a later release (#22).

Removed

  • Catalog slide land-ack. Its text was a placeholder and there is no approved wording to replace it; catalog/CURATION.md says how to add one once there is. A deck that used it fails to resolve that slide ("catalog slide metadata not found"); its existing content/<id>.html is kept, so to keep the slide, replace use: catalog/land-ack in its brief with locked: true and add a # Key message line (as eject would have), or remove the slide from deck.yml.

Fixed

  • /uw-slides:update-deck compared a deck's shared/header.html and shared/footer.html with the legacy (non-reveal.js) templates, although new-deck scaffolds them from header-reveal.html and footer-reveal.html. On current decks it reported both as changed and, if confirmed, replaced them with versions that don't start reveal.js; fixes to the reveal headers never reached existing decks. It now detects the deck's runtime and compares against the matching templates.
  • catalog/README.md said /uw-slides:generate-slides resolves catalog slides. It skips them; the resolver runs separately.
  • tools/validate_plugin.py crashed when a marketplace's plugins was not an array, read folded (>) and literal (|) skill descriptions as just > or |, and printed only Usage: on a usage error (#36).
  • Slide text was centered on every slide in reveal.js decks, because reveal.css centers slide text and neither brand header overrode it. Both header-reveal.html files now set text-align: left on section.slide. Layouts meant to be centered (title, closing, stat-callout and the centered catalog slides) set it themselves and are unchanged. Existing decks pick this up with /uw-slides:update-deck.
  • The agenda catalog slide ran off the bottom of the screen in decks with more than about 9 content slides. It now uses two balanced columns past 7 items and caps the list at 12, which fits at 1280×720 even when labels wrap; past 12 the resolver shows 11 plus "and N more" and warns.
  • The agenda listed framing catalog slides by their IDs ("title", "land-ack", "funding", "feedback"), ignored section: hidden, and used two color tokens no brand defines, so its heading was plain black. All fixed.