build-template
Skill1 starsChanged 2 days agoMITView on GitHub
Plan and build a runtime presentation template in templates/ (palette, tones, font roles, footer, local imagery and design references), with colour and font visual reports and tests. Loaded by /opp-propose (Plan) and /opp-apply (Implement) for template changes.
In this repository23 other files it gives its agents.
- AGENTS.mdAGENTS.md
- core/AGENTS.mdAGENTS.md
- presentation/AGENTS.mdAGENTS.md
- showcase/AGENTS.mdAGENTS.md
- build-slideSkill
- openprezSkill
- openspec-apply-changeSkill
- openspec-archive-changeSkill
- openspec-bulk-archive-changeSkill
- openspec-continue-changeSkill
- openspec-exploreSkill
- openspec-ff-changeSkill
- openspec-new-changeSkill
- openspec-onboardSkill
- openspec-proposeSkill
- openspec-sync-specsSkill
- openspec-update-changeSkill
- openspec-verify-changeSkill
- opp-applySkill
- opp-archiveSkill
- opp-exploreSkill
- opp-proposeSkill
- promote-to-coreSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
18 rules. About 0 are common, 7 are distinctive, and 11 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈7
Distinctive · estimate
This author's own choices. Worth a look.
11
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 12
Read first: docs/templates.md, core/template/contract.ts and templates/default/ (the reference implementation).
- Distinctive: line 29
Leave the other templates in the repository.
- Distinctive: line 39
Every tone's text needs at least 4.5:1, and the template's contrast test enforces this.
- Distinctive: line 44
Keep tone surfaces out of the accent families you expect on them, or those accents will vanish.
- Distinctive: line 53
only the weights and styles the hierarchy uses, typically body regular and bold (plus italic if the deck uses it), one or two display …
- Very specific: line 59
Licence texts: keep the font files and their licence text (for example OFL.txt) together in templates/<name>/fonts/.
- Very specific: line 64
Local assets: keep every image, SVG and font file inside templates/<name>/.
- Distinctive: line 65
Licensing: prefer original artwork or CC0/public-domain imagery.
- Very specific: line 67
SVG direction and export safety: use clear silhouettes, intentional stroke weights and theme CSS variables for colors.
- Very specific: line 97
Add --engine chromium|firefox when a custom executable's name doesn't reveal its engine.
- Distinctive: line 116
Use the font report alongside the palette report, first on proposed roles and then on the implemented template:
- Very specific: line 133
Write only planning artifacts in openprez/changes/<change-name>/.
- Very specific: line 145
Template code: Create templates/<name>/ with index.ts (palette, tones and font roles from the approved plan.
- Very specific: line 147
Wire and check the fonts: When the template bundles fonts, declare them in templates/<name>/fonts.css and import that file from index.ts …
- Distinctive: line 167
Remove temporary test fonts and fixtures after validation.
- Very specific: line 168
Validate the colours: Run the palette report on templates/<name> and confirm it matches the approved palette.json findings.
- Very specific: line 169
Style guide: Create or update templates/<name>/STYLEGUIDE.md with the three font stacks and their hierarchy (with a stage-pixel example), …
- Very specific: line 178
Tests: Every template has its own tests in its folder.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Build a presentation template
A template is the presentation's visual skin: the palette, named tones, semantic font roles, local visual assets, and live and PDF footers. This skill is not a command: the OpenPrez workflow loads it for a change whose proposal records Type: template. /opp-propose follows Plan, which writes no template code; /opp-apply follows Implement. The shared rules apply at both stages. Before changing any colours, show the user the issues you found and the options for fixing them.
Read first: docs/templates.md, core/template/contract.ts and templates/default/ (the reference implementation).
Workflow at a glance
- Plan (
/opp-propose): confirm the template name and activation, define its visual system, create and reviewpalette.jsonandfonts.jsonwith both reports, then write the approved design and implementation tasks. Do not write template code in this phase. - Implement (
/opp-apply): build only the approved template, bundle licensed assets locally, record required third-party credits, add its footer/contrast/font tests, and run scoped checks and visual reports. Do not add slide content or change shared documentation.
The detailed Plan and Implement sections below are authoritative for each step.
Shared rules
Scope and boundaries
- A template lives in its own folder,
templates/<name>/, withindex.tsdefault-exporting aPresentationTemplate. Keep its assets, components and tests inside that folder. - A template may import only
@coreand its own sibling files. Biome enforces this, so a template can't import another template, even the default. To reuse something, copy it into the folder, or promote it to@coreas a separate workstream. - A template arranges the player's state and actions; it never changes navigation, keyboard handling, steps, the presenter window or export.
- A template can't decorate the slide area. Its imagery is limited to the footer and the tone colours; slide illustrations belong in the active deck's own assets folder.
- Leave the other templates in the repository.
Palette, tones and font
- Token roles: the token names are fixed slots in the contract, not colour names.
onPrimaryis the primary background andprimarythe primary foreground. Both are used by everybaseslide.accent1–accent5are the secondary accents,neutralis the neutral, anddata1,data2anddata3are the data colours.- Choose any values for these slots that suit the atmosphere.
- Tones:
baseandinverseare required. Extra tones (for example a section-break colour) are free names that slides select withtone. Each tone is asurface/onSurfacepair. - Contrast targets:
- Every tone's text needs at least 4.5:1, and the template's contrast test enforces this.
- Aim for 7:1 or more on
baseandinverse, because projectors wash out contrast.
- Hue design:
- Give a warm palette one cool counterpoint, or a cool palette one warm one, so charts have a clearly separate second series.
- Data accents should differ in lightness as well as hue, so they survive colour-vision deficiency and greyscale printing.
- Keep tone surfaces out of the accent families you expect on them, or those accents will vanish.
- Font roles: provide body, display and mono stacks through the
fontsobject for new or reworked templates.fontSansremains required for compatibility; keep it equal tofonts.body. A legacy template withoutfontsusesfontSansfor body only, while display and mono use system defaults. Never map the legacy stack to the other roles. - Pairing and hierarchy: choose families and fallback stacks that work together at presentation distance. Assign each role a clear job, then establish hierarchy with size, weight, line height, tracking and spacing rather than using extra unrelated typefaces. Use the
font-body,font-displayandfont-monoutilities; default text andfont-sansresolve to body.
Choosing and sourcing fonts
- Installed or bundled: a stack of widely installed faces (for example Arial, Georgia,
system-ui,ui-monospace) needs no files. Bundle a font only when the design needs a face that presenting machines may not have. Every bundled file adds to the build, andpnpm prezinlines it as base64, about a third larger. - Selection criteria (record the outcome in
design.md):- glyph coverage for every language the deck uses, including its punctuation and symbols; for example French needs
œ, which font services usually place in thelatin-extsubset, and most decks need curly quotes, en and em dashes and€; - only the weights and styles the hierarchy uses, typically body regular and bold (plus italic if the deck uses it), one or two display weights, and mono regular and bold; one variable font is better than many static files when it covers the range;
- legibility at projection distance: a generous x-height, open shapes, and distinct
I/l/1and0/O, especially in mono; tabular figures when the deck shows data; - a fallback stack of installed faces with similar proportions, ending in a generic family (
sans-serif,seriformonospace).
- glyph coverage for every language the deck uses, including its punctuation and symbols; for example French needs
- Licences: accept the SIL Open Font License 1.1, Apache 2.0, the Ubuntu Font Licence, or another licence that explicitly allows embedding and redistribution with software at no cost. Reject "free for personal use", desktop-only, per-domain or unclear terms. Read the licence at the font's official source (the foundry's repository, or the font's folder in
github.com/google/fonts), not a mirror. - Unmodified files: use font files exactly as distributed; no font-conversion tooling is assumed. Never subset, convert or rename a font whose licence reserves its name (an OFL Reserved Font Name is declared right after the copyright line), because that makes a modified version that may not carry the name. Prefer WOFF2; if a font ships only TTF or OTF, use that file as-is or choose another font.
- Getting WOFF2 files: take them from the foundry's release. For a Google Fonts family whose licence declares no Reserved Font Name, the CSS API serves WOFF2 files per subset to a browser user agent:
curl -A '<desktop browser user agent>' 'https://fonts.googleapis.com/css2?family=<Family>:wght@<weights>&display=swap'lists the file URL for each subset; download the subsets the deck needs and keep theirunicode-rangevalues. Fetch files only while authoring; never reference these URLs from the template. Do not add npm font packages: they add dependencies. - Licence texts: keep the font files and their licence text (for example
OFL.txt) together intemplates/<name>/fonts/.
Imagery and local assets
- Art direction: decide what visual language supports the template: image treatment and crop, recurring motifs, shape language, stroke weight and the amount of detail. Keep the choices coherent and legible at presentation scale; avoid unrelated stock decoration.
- Local assets: keep every image, SVG and font file inside
templates/<name>/. Never fetch at runtime, hotlink, or reference a remote font or image URL. - Licensing: prefer original artwork or CC0/public-domain imagery. For every other asset, verify from an authoritative source that its terms allow redistribution inside the built app, and follow all attribution requirements before adding it.
- Image preparation: crop and compress photos for their actual display size. Import photos as modules and render them with
<img>, not CSSbackground-image, so PDF capture embeds them reliably. - SVG direction and export safety: use clear silhouettes, intentional stroke weights and theme CSS variables for colors. Build export-critical diagrams from SVG-native shapes and text; avoid
<foreignObject>. Keep essential text out of raster artwork and provide accessible text for meaningful images.
Footer and export footer invariants
The Footer and ExportFooter components own the format and copy. The player owns the actions. Keep all of these:
- the logo (
Logofrom@core), the copyright line, the presentation date andn / totalat the right; - the six
NavigationButtonsfrom@core, then the Speaker notes and Export PDFActionButtons, in that order, with their labels and tooltips; - the
footer-actionsclass on the action group, so it auto-hides on hover and focus and stays visible on touch devices; - the Speaker notes
aria-pressedstate, the status and alert messages (role="status"for export progress,role="alert"for errors such as a blocked pop-up), and the auto-advance indicator placed before the date; keep each alert outside.footer-actionsso it remains visible when that group auto-hides; - an
ExportFooterwith thedata-pdf-footermarker, the same branding and date,page / total, and no buttons or auto-advance indicator.
The footer must stay readable on every declared tone: use the surface/on-surface tokens, never fixed colours. Any footer motion must respect reduced motion and useExportMode().
Palette report
The palette report takes either a proposed palette file (during planning) or a template folder (during implementation). The --screenshot flag also writes a PNG:
node .agents/skills/build-template/scripts/palette-report.mjs openprez/changes/<change-name>/palette.json --screenshot
node .agents/skills/build-template/scripts/palette-report.mjs templates/<name> --screenshot- Palette file: JSON
{ "name": "<name>", "palette": { ...all ten tokens }, "tones": { "base": { "surface", "onSurface" }, "inverse": { ... }, ... } }, with#RRGGBBvalues and a lowercase kebab-case name. The report lists every missing token or tone. - Output:
- The HTML goes to
dist/template-reports/<name>.html, with the PNG next to it (dist/is gitignored, andpnpm buildempties it, so rerun the report after a build). - The script also prints a text summary: the palette with HSL, each tone's text contrast, each accent's contrast on each tone, and near-identical swatch pairs (CIE76 ΔE < 20) for normal vision and each simulation. These lists are review inputs, not automatic palette failures: distinguish colours used together as data series from intentional tonal families. Keep all findings visible, including advisory tritanopia results, and explain any remaining accessibility limitations.
- The HTML goes to
- Browser options:
- The screenshot uses an installed Chrome, Chromium, Edge or Firefox, tried in that order, and never downloads a browser.
--browser chrome|chromium|edge|firefox|<path>picks one explicitly.- Add
--engine chromium|firefoxwhen a custom executable's name doesn't reveal its engine. --out <file.html>changes the report location.
- Reading the screenshot: open the PNG and look at it; the text summary can't judge harmony. If the image is too large for your context, downscale it first. If no browser was found, work from the summary, and tell the user a visual check of the HTML is still needed.
Review checklist. For each item, note the token and the evidence:
- Hue balance: the accents are not all one family. There is a cool or warm counterpoint for a second data series.
- Near-duplicates and colour-vision collapse: review every reported pair by its intended role, not against a blanket palette-wide threshold.
- Data series: name the recommended series tokens in
design.mdand the eventualSTYLEGUIDE.md(at minimum the data colours and the warm/cool counterpoint). These colours must reach pairwise CIE76 ΔE ≥ 20 in normal vision, protanopia and deuteranopia, or have an explicit documented fallback. Prefer changing or separating a confusable pair in lightness. If keeping it, define a recommended series order, state how many series can rely on colour alone, and require direct labels or patterns whenever confusable colours appear together. Ordering alone does not make a confusable pair distinguishable. - Other near-pairs: keep with a recorded role rationale (for example foreground/highlight or surface/panel), or change a colour. A pair with no deliberate role rationale is an accidental duplicate and must change. Record each kept pair and its rationale in
design.mdand carry the usage restrictions intoSTYLEGUIDE.md; a role rationale does not exempt a pair also used together as data series. - Tritanopia: review as advisory, not an automatic rejection. Explain confusable data-series pairs and address their use through colour changes, a restricted series order, or required labels/patterns. Keep the findings and limitations in the documentation; do not claim that clearing a simulation threshold certifies full accessibility.
- Data series: name the recommended series tokens in
- Vanishing accents: accents that are FILL (< 3:1) on the tone they would naturally appear on, especially a tone surface from the accent's own family.
- Dark-panel visibility: panels and borders against dark tone surfaces must reach at least 1.5:1 WCAG contrast against the adjacent surface for projector visibility. Use the report's accent-on-tone ratio when it covers the pair; otherwise calculate the pair with
contrastRatiofrom.agents/skills/build-template/scripts/colour.mjs(re-exported fromscripts/lib/colour.ts). - Accent use: on each tone, distinguish TEXT (≥ 4.5), LARGE (≥ 3) and FILL (< 3). Never use a FILL accent as text on that surface. This becomes the colour-usage guidance.
Before changing any colours: present each finding and the trade-offs of changing, replacing or deliberately keeping the affected colours (via ask_user). Explain which findings affect data-series distinguishability and which are intentional tonal families, together with any remaining accessibility limitations and required labels/patterns. Wait for the user's choice; do not edit the palette before they accept an option. After a colour change, rerun the report. Verify that data-series findings meet the distinctness target or have the documented fallback, and that every other kept near-pair has a role rationale; advisory tritanopia findings remain visible. Do not chase a palette-wide no-close-pairs result.
Font report
Use the font report alongside the palette report, first on proposed roles and then on the implemented template:
node .agents/skills/build-template/scripts/font-report.mjs openprez/changes/<change-name>/fonts.json --screenshot
node .agents/skills/build-template/scripts/font-report.mjs templates/<name> --screenshot- Fonts file: JSON
{ "name": "<lowercase-kebab-case>", "fonts": { "body": "<stack>", "display": "<stack>", "mono": "<stack>" } }. Each role needs a non-empty CSS family stack. The tool reports missing roles and malformed values together. Proposal reports use installed fonts only: a face not installed on this machine will fall back, so do not treat that rendering as a review of the missing face. Recheck bundled faces after implementation. - Template input: loads the roles and
fontSansfromindex.ts, warns if the compatibility alias differs from body, and embeds local WOFF2/WOFF/TTF/OTF files referenced byfonts.css. Keep that stylesheet font-only (@font-facerules); remote URLs and CSS imports are rejected, never fetched. Font descriptors (weight ranges, styles, Unicode subsets) are preserved;local()sources are removed so an installed copy cannot mask a broken bundled file. - Output:
dist/template-reports/<name>-fonts.html(detailed specimen sheet) and<name>-fonts-slide.html(separate 1920×1080 composition preview), each with a PNG when--screenshotis used. All are disposable build artifacts; rerun afterpnpm build. Both HTML files are self-contained and work offline. - Specimens: projection-oriented stage-pixel sizes — display 112/72px, body 48px, labels 36px and mono 40px — at regular 400 and bold 700, plus ambiguous characters (
I/l/1,O/0), numerals,œ, quotes, dashes and€. These are review defaults, not mandatory slide sizes. The 22–32px samples are explicitly labelled stress tests, not the recommended slide hierarchy. A combined display/body/mono composition exposes role harmony. Each role also has a side-by-side fallback view with its first family removed; a generic-only stack stays unchanged. Remaining installed families still depend on the viewing machine. - Browser options:
--screenshot,--browser chrome|chromium|edge|firefox|<path>,--engine chromium|firefoxand--out <file.html>work as in the palette report. No browser is downloaded; without one, HTML is still written and a visual review remains outstanding. - Visual review, not a score: open the separate 1920×1080 slide-preview PNG first to judge slide proportions, then zoom the detailed sheet to inspect individual specimens and fallbacks. Do not judge slide readability from a tall sheet shrunk to fit a viewer. Check character distinction, accents and punctuation, regular/bold readability, hierarchy and rhythm, and whether the fallback preserves the intended character and fit. Check that font loading has settled without an error. Samples do not prove every glyph or weight is present (browsers may synthesize bold or use glyph fallbacks), and are not an accessibility certification.
- Review outcome: record findings, limitations and keep/change decisions in
design.md; present actionable problems and options to the user before changing the proposed roles. If the agent cannot view images or a primary face is unavailable, say exactly which visual check is still needed rather than claiming it passed.
Plan (/opp-propose)
Write only planning artifacts in openprez/changes/<change-name>/; no template code, assets or configuration.
- Name and activation. Choose a distinctive kebab-case name not already used under
templates/(an upstream template with the same name would conflict later), and write it into the proposal's## Change typesection. Ask whether the template becomes the active one; record the answer indesign.md. - Visual direction. Using the shared rules, decide the art direction, palette, tones, three font roles and footer composition. For every font, decide whether it is installed or bundled and check it against "Choosing and sourcing fonts": glyph coverage for the deck's languages, the weights and styles needed, and its licence, including any Reserved Font Name. For every font or image to download, identify the exact source file and verify its licence now; record the source, licence and required attribution in the plan.
- Validate colours and fonts before code. Write the proposed palette and tones to
palette.jsonin the change folder, run the palette report on it with--screenshot, and work through the review checklist. Resolve every finding with the user before the plan is final. Write the three proposed font stacks tofonts.jsonbeside it, run the font report with--screenshot, and review legibility, role harmony and fallback behavior. Record findings, decisions and any unavailable primary-face or visual checks indesign.md; do not present an unrendered face as validated. - Design document. In
design.md, record the palette table with each tone's text contrast and the accent classes per tone, the font roles with their stacks, bundled files, weights, subsets, sources and licences, the imagery with sources and licences, the footer composition, the activation decision, and the outline ofSTYLEGUIDE.md(roles and hierarchy, motifs, asset paths, credits, colour-usage guidance). There is nocontent.md. - Tasks. In
tasks.md, list the Implement steps below for this template, each with how it is verified.
Implement (/opp-apply)
Build only the template named in the proposal, from the approved design.md, palette.json and fonts.json. If the approved plan turns out to be unworkable, stop and ask rather than deviating silently.
- Template code. Create
templates/<name>/withindex.ts(palette, tones and font roles from the approved plan;fontSansequal tofonts.body), theFooterandExportFooter, and any template-local components. - Assets and credits. Download and prepare the approved fonts and images into the template folder. When third-party assets require attribution, record each in
templates/<name>/CREDITS.md; omit that file when there are no such assets. For images and SVGs, include file, title, creator, source URL, license and license URL, modifications, and required attribution. For fonts, include family, style/weight, source file URL, version, license and required attribution, with the licence text kept as "Choosing and sourcing fonts" describes. Wire and check the fonts. When the template bundles fonts, declare them in
templates/<name>/fonts.cssand import that file fromindex.ts(import "./fonts.css";). Only the active template's entry is imported, so only its fonts are bundled.@font-face { font-family: "Family Name"; src: url("./fonts/family-name-latin.woff2") format("woff2"); font-weight: 400 700; /* the range of a variable font, or one rule per static weight */ font-style: normal; font-display: swap; unicode-range: U+0000-00FF, U+0131, U+0152-0153; /* only when the family is split into subset files */ }Name the family first in its role stack, followed by the installed fallbacks, for example
display: '"Family Name", Georgia, serif'.font-display: swapsuits files that are local and load quickly; PDF capture waits fordocument.fonts.ready. Then verify:- in
pnpm dev,document.fonts.check('700 32px "Family Name"')is true for every family and weight the style guide uses, and a heading's computedfont-familystarts with the display family; pnpm prezembeds the font files, anddist/prez.htmlrenders with them when opened without network access;- an exported PDF page shows the bundled faces.
For every template (including installed-only stacks), run the font report on
templates/<name>with--screenshotand review it against the approvedfonts.jsonand hierarchy indesign.md. For bundled faces this checks the embedded local files, not a system copy. Inspect legibility, role harmony, coverage-sensitive glyphs and fallback fit; record new findings and ask the user before changing roles. This complements, not replaces, the bundled-font checks above.Remove temporary test fonts and fixtures after validation.
- in
- Validate the colours. Run the palette report on
templates/<name>and confirm it matches the approvedpalette.jsonfindings. Any new finding goes back to the user before the palette changes. Style guide. Create or update
templates/<name>/STYLEGUIDE.mdwith the three font stacks and their hierarchy (with a stage-pixel example), visual motifs, reusable image/SVG references, exact local asset paths, applicable license/credit information, and the colour-usage guidance from the review checklist:- which accents are text-safe, large-text-only or fill-only on each tone;
- that fill-only accents are decorative fills, never text on that tone;
- the named data-series tokens and their pairwise distinctness results for normal vision, protanopia and deuteranopia, plus advisory tritanopia findings;
- kept near-pairs with their role rationales and remaining accessibility limitations;
- the recommended series order and colour-only series limit, with required direct labels or patterns wherever the documented fallback applies;
- dark panel or border contrast against its adjacent dark surface, with the projector-visibility rationale.
Name only assets, components and roles that actually exist. Keep template-specific choices in this file, not in shared documentation; keep this skill generic.
Tests. Every template has its own tests in its folder. Run them with
pnpm vitest run templates/<name>.Footer invariants (
templates/<name>/footer.test.tsx): templates can't import one another, so adapttemplates/default/footer.test.tsxinto the new folder. It checks:- the eight action labels in order: Previous slide, Previous key frame, Previous step, Next step, Next key frame, Next slide, Speaker notes, Export PDF;
- the disabled state on the first slide;
- Speaker notes
aria-pressedboth false and true; - a blocked pop-up shown as
role="alert"outside.footer-actions, and still visible when the action group is hidden; - the export footer containing
data-pdf-footer, the copyright andpage / total, and no<buttonand no auto-advance indicator; - the auto-advance indicator placed before the date, and absent when the step doesn't auto-advance.
Tone contrast (
templates/<name>/contrast.test.ts): required for every template you create or rework. Reuse the test-only assertion fromtests/support/contrast.ts; do not duplicate its colour math or promote test support into the runtime@coreAPI.import { describe, it } from "vitest"; import { assertTemplateToneContrast } from "../../tests/support/contrast"; import template from "./index"; describe("tone contrast", () => { it("keeps every declared tone at 4.5:1 for body text", () => { assertTemplateToneContrast(template.tones); }); });Font roles (
templates/<name>/fonts.test.ts): required for every template you create or rework. It guards the compatibility alias and the fallbacks of each role:import { describe, expect, it } from "vitest"; import template from "./index"; const GENERIC_FAMILIES = ["sans-serif", "serif", "monospace", "system-ui", "ui-monospace"]; describe("font roles", () => { it("keeps fontSans equal to the body role", () => { expect(template.fontSans).toBe(template.fonts?.body); }); it.each(["body", "display", "mono"] as const)("%s stack ends in a generic family", (role) => { const families = template.fonts?.[role].split(",").map((family) => family.trim()) ?? []; expect(GENERIC_FAMILIES).toContain(families.at(-1)); }); });- Activation.
@template/<name>resolves totemplates/<name>/index.tswith no alias or path configuration. If the plan makes the template active, change the template import in bothapp/main.tsxandapp/showcase.tsx, so the dev showcase and the production build match. Otherwise leave both unchanged. - Checks and report.
- Do not bump the version, propose a tag, or edit shared documentation such as
docs/templates.md, the README orAGENTS.md. Tell the user the change edits foundation areas (the template folder and, if activated, the composition entries), so it is outside the deck-only merge guarantee and later upstream pulls may need review. - Checks: run
pnpm check, thenpnpm vitest run templates/<name>, and fix every failure. Do not refresh dependencies for user-template authoring; runpnpm update --latestonly for actual application-foundation or explicit dependency work, as described incore/AGENTS.md. After the build, rerun the font report ontemplates/<name>with--screenshot(the build clearsdist/) and review the final typography. - Preview: preview each tone and the footer in
pnpm dev. Check the PDF export when the footer or imagery changed, since footer images must appear in the exported pages.
- Do not bump the version, propose a tag, or edit shared documentation such as
Shipping a template in the upstream foundation is not part of this workflow. A maintainer does it as a separate foundation change: bump package.json following "Release versioning" in core/AGENTS.md (a new template or tone is minor, a colour or footer fix is a patch), propose the matching tag, list the template in docs/templates.md, and update the README or AGENTS.md wherever they describe the active palette.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

