Repository navigation
Releases
v0.7.0
/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.pychecks that the three download URLs intemplates/setup-reveal.shexist 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.pywrites 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 tocontent/andslides/;.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--checkshows what it would add.tools/test_deckperms.pycovers it./uw-slides:new-deckruns it, so a new deck has the rules from the start. It prints how many it wrote.tools/test_skill_commands.pyreads every command out of theSKILL.mdfiles 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: $?"toprintenv 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 oflsortestin the shell, andgenerate-slidesno longer redirects the resolver's output (2>&1). /uw-slides:update-deckchecks 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..gitignorein new decks lists.claude/settings.local.json.
Fixed
setup-reveal.shdownloads the speaker-notes plugin fromdist/plugin/notes.js, where reveal.js 6.x ships it. It used the 5.x pathplugin/notes/notes.js, which returns 404 for 6.0.2, so the script stopped (set -e) afterreveal.min.jsandreveal.min.cssand leftassets/reveal/plugin/notes/notes.jsmissing. The file is still saved asassets/reveal/plugin/notes/notes.js, sofooter.html,publish.sh,export.shandnew-deck.pyare unchanged. Without it the footer'sRevealNotesreference throws,Reveal.initializenever 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-decknow managessetup-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-slidesstill asked about thedeckparse.pyand 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 fordeckparse.py.
v0.4.0
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.mdnotes 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 optionalleadparam 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 asuw-title(title,subtitle,presenter,affiliationdefaulting to "CloudBank",date). A CloudBank deck can now be assembled entirely from catalog slides, starting with a title (#42). tools/new-deck.pyscaffolds a deck in one command:python3 <PLUGIN>/tools/new-deck.py <name> [--brand=uw|cloudbank]. It does everything/uw-slides:new-deckused to do with about twenty separate commands (templates, brand header and footer, fonts foruw, the vendored tools,.github/files,.brand,.uw-slides.json,deck.ymland the starter briefs), validates the result and runssetup-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*.shexecutable (setup-reveal.shandexport.shwere 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 andCONTRIBUTING.mdnow 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-titlechanged (see Added and the line below). Nothing was removed, so decks pinned to 2.0.0 keep working. - Catalog slide
cb-title1.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'sassets/folder, the first catalog slide to use it; the resolver copies them into the deck andpublish.shembeds them. Theaffiliationdefault 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-deckruns 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 ruleBash(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.pyrewrites only the root<section>'saria-labelwhen it resolves a catalog slide. It used to rewrite everyaria-labelin the fragment, which would have replaced the labels inside a slide, such as the partner logo list oncb-title1.1.0, with the slide's own label.
v0.3.1
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.pycan find the catalog of a marketplace install without--catalog:/uw-slides:new-deckand/uw-slides:update-deckrecord the plugin location asplugin_dirin.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-slidesnow resolves catalog slides itself: before generating layout slides it runstools/resolve-catalog.py resolve . --catalog=<PLUGIN>/catalogand reports the resolver's output, including placeholder and brand warnings, with its own. Users no longer need the--catalogpath (#39, most of #34)./uw-slides:plan-deck's next steps, the README walkthrough (step 4, "Using a catalog slide", troubleshooting) andcatalog/README.mdshrink to a single/uw-slides:generate-slides.
v0.3.0
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.pychecks 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.--claudealso runsclaude plugin validate. Tests:tools/test_validate_plugin.py. -
Catalog slides
cb-what-is,cb-programs,cb-why-choose,cb-award-tiersandcb-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. Eachslide.mdlists 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
PLACEHOLDERwording, such as thefundingslide'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 theirSKILL.md), then~/.claude/plugins/local/uw-slides. Before, an install anywhere but that path neededUW_SLIDES_HOME. Every skill now names plugin files as<PLUGIN>/..., so they're not confused with files in the deck. The deckAGENTS.mdtemplate gives other agents the same order. -
Skills pass
--catalog=<PLUGIN>/catalogto the deck's vendoredresolve-catalog.py. The resolver also looks for acatalog/next to its owntools/directory. Theresolveandejectcommands incatalog/README.md,catalog/CURATION.mdand the catalog slides'slide.mdfiles 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.jsoninstead of.claude-plugin/plugin.json. -
The Claude Code marketplace is renamed from
uw-slides-localtouw-slide-deck, and the homepage and repository URLs now point ataaarendt/uw-slide-deck-plugin(the olduw-slides-pluginURL returns 404). -
catalog/CURATION.mdnow 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-deckchecks a program's catalog slides against planned content slides in decks of that program's brand, not only framing roles. -
Catalog
agenda1.1.0 groups slides into parts: slides that share asection:become one item (or, without sections, eachsection-dividerand the slides after it), with their minutes summed. New optionalslide.mdfieldin_agenda: falsekeeps framing catalog slides out of the agenda; the six seeded framing slides set it. -
Catalog slides without a
titlenow take theiraria-label, and their agenda label, from their own heading instead of the catalog description. -
/uw-slides:update-decknow also keepstools/resolve-catalog.pyin sync, and adds it (andtools/lint.py) to decks scaffolded before they were vendored (#33). When a deck has no vendoreddeckparse.pyorlint.py, the deck scripts now suggest running/uw-slides:update-deckinstead of only settingUW_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.shafter scaffolding (new-deck already runs it), and its "change the defaults" list names the-revealheader and footer that new decks actually use. -
README: new "Catalog Slides" section (what the catalog holds, what
ready/draft/reviewmean, 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 usesclaude --plugin-dir. The "Migrating from SLIDES.md" section is removed;references/migration-guide.mdand/uw-slides:extract-to-markdown --migrateare unchanged. -
tools/validate_plugin.pyalso checks the Codex marketplace entry's requiredpolicyandcategory, and that both marketplaces use the same category. The Claude Code marketplace category changes fromdevelopmenttoproductivityto match Codex (#36). -
Catalog slides no longer have a
statusfield (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, asreviewslides, they never were. Their "Status note" sections became "Sources". APLACEHOLDERvalue the planner can't fill becomes aVERIFY:line. Slide briefs in a deck keep their ownstatus:(draft/review/done), which is unrelated. -
The catalog version is now 2.0.0, because a slide was removed (see Removed).
-
The
SLIDES.mddeprecation warning inbuild.shandbuild-visuals.shno 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.mdsays how to add one once there is. A deck that used it fails to resolve that slide ("catalog slide metadata not found"); its existingcontent/<id>.htmlis kept, so to keep the slide, replaceuse: catalog/land-ackin its brief withlocked: trueand add a# Key messageline (as eject would have), or remove the slide fromdeck.yml.
Fixed
/uw-slides:update-deckcompared a deck'sshared/header.htmlandshared/footer.htmlwith the legacy (non-reveal.js) templates, although new-deck scaffolds them fromheader-reveal.htmlandfooter-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.mdsaid/uw-slides:generate-slidesresolves catalog slides. It skips them; the resolver runs separately.tools/validate_plugin.pycrashed when a marketplace'spluginswas not an array, read folded (>) and literal (|) skill descriptions as just>or|, and printed onlyUsage:on a usage error (#36).- Slide text was centered on every slide in reveal.js decks, because
reveal.csscenters slide text and neither brand header overrode it. Bothheader-reveal.htmlfiles now settext-align: leftonsection.slide. Layouts meant to be centered (title,closing,stat-calloutand the centered catalog slides) set it themselves and are unchanged. Existing decks pick this up with/uw-slides:update-deck. - The
agendacatalog 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
agendalisted framing catalog slides by their IDs ("title", "land-ack", "funding", "feedback"), ignoredsection: hidden, and used two color tokens no brand defines, so its heading was plain black. All fixed.