new-project: bootstrapping a visuals project
Goal: lay down the two references of a new project in brands/<project>/:
brand.md (visual identity, blocking: no visual without it) and project.md
(substance and voice, for writing the text). A CLAUDE.md rule.
1. Determine the <project> slug
Take it from the arguments. Otherwise ask. It is a kebab-case slug (e.g.
calame, my-app). Check that it does not already exist: brands/<project>/ or
templates/<project>/. If it does -> stop, say so.
2. Collect the guidelines (invent nothing)
Interview the user. Never invent colors, type or logo: that is the heart of the project rule. Collect at least:
- Concept / meaning of the logo and the name.
- Typography: typeface, weight, source. Note: the available families and
weights are those present in
fonts/, discovered automatically by the engine. If the guidelines require another font absent fromfonts/, follow the Missing font procedure below: offer to pre-install it now, or let/new-templatefetch it for the first visual that needs it. - Palette: for each role, the hex (+ Tailwind landmark if known) and the usage.
- Logo / favicon variants available and when to use them.
- Usage rules and don'ts.
Collect the substance too (for project.md): a one-sentence pitch, what the
product does, audience and language, value proposition, editorial voice
(register, how it addresses the reader), vocabulary (exact name, URL) and
forbidden claims (don't invent figures).
If the user does not have everything yet, write down what is known and mark the
gaps with _(to be defined)_ rather than filling them at random.
3. Write brands/<project>/brand.md
Mirror the structure of brands/calame/brand.md (that is the reference):
- Title
# Brand guidelines: <Project>+ a short intro. ## 1. Concept and meaning(with Typography and Colors subsections).## 2. Variants(logotype, favicon/icons) if applicable.## 3. Usage rules(clear space, minimum size, backgrounds, Don't).## 4. Regenerationonly if some assets are generated by a script.
The logo and favicon files live next to it, in brands/<project>/logo/ and
brands/<project>/favicon/. Don't create fake assets: if the user has files,
tell them where to drop them. If the assets are to be generated by a script
(like Calame's), that is the brand-assets skill's job.
3b. Write brands/<project>/project.md
Mirror the structure of brands/calame/project.md (that is the reference):
# Project: <Project>+ a short intro (what the file is for).## 1. In one sentence(the pitch).## 2. The product(what it does, the differentiator).## 3. Audience(personas, market, language).## 4. Value proposition(benefits, by priority).## 5. Editorial voice(register, how it addresses the reader, format, do/don't).## 6. Vocabulary & claims(exact name, URL, approved lines, forbidden claims: no invented figures).
Same rules as for brand.md: invent nothing, mark the gaps with
_(to be defined)_ or _(to be confirmed)_.
4. Create the templates tree
Create the templates/<project>/ folder (it will hold the .tsx files).
5. Wrap up
Recap what was created and what is still _(to be defined)_ in the guidelines.
Point to what comes next: /new-template <project> <name> for the first visual.
Success criterion: brands/<project>/brand.md and
brands/<project>/project.md exist, follow the reference structure, and contain
no invented color, type or claim (gaps marked _(to be defined)_).
Missing font (procedure)
If the guidelines require a font that is not in fonts/:
- Ask for permission to fetch it: this is an outbound network action, never silent. Name the source and the license before downloading.
- Trustworthy source, ttf/otf format (Satori does not read woff2): the raw
.ttffrom the official repo (github.com/google/fonts) or an@fontsource/<font>package. Most Google Fonts are OFL/Apache -> fine. A proprietary font or an ambiguous license -> refuse and ask the user to provide the file themselves. - Download to
fonts/<Family>-<weight>.ttf, usingcurl -L <url> -o ...orInvoke-WebRequest -OutFile. WebFetch is not suitable (binary). The file name is authoritative: it determines the family the templates cite, in PascalCase (GeistMono-600.ttf->Geist Mono, 600). - Check the file: non-zero size and a real font header (
.ttfstarts with00 01 00 00, OpenType withOTTO), not an HTML error page in disguise. - Document the license: drop its text into
fonts/and add the matching row to the table infonts/NOTICE.md. No code declaration: the engine discovers the file at startup, provided its name follows the<Family>-<weight>.ttfconvention from step 3. - Confirm before committing the
.ttf(a binary) with the user.
If the user refuses -> do not pre-install; note in the guidelines that the font
is _(to be provided)_ and let /new-template ask the question again.