page-foundry 2.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +110 -0
- package/bin/page-foundry.js +169 -0
- package/package.json +45 -0
- package/skills/page-foundry/README.md +13 -0
- package/skills/page-foundry/SKILL.md +233 -0
- package/skills/page-foundry/TESTS.md +22 -0
- package/skills/page-foundry/assets/brief-template.md +50 -0
- package/skills/page-foundry/references/archetypes.md +197 -0
- package/skills/page-foundry/references/conversion-rules.md +70 -0
- package/skills/page-foundry/references/design-direction.md +48 -0
- package/skills/page-foundry/references/handoff.md +82 -0
- package/skills/page-foundry/references/ship-gates.md +224 -0
- package/skills/page-foundry/references/voice.md +204 -0
- package/skills/page-foundry/scripts/voice_scan.py +255 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Taylor Banks
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# page-foundry
|
|
4
|
+
|
|
5
|
+
### A whole marketing team on every page you ship.
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/page-foundry)
|
|
8
|
+
[](https://github.com/taylorbanks/page-foundry/releases)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](package.json)
|
|
11
|
+
[](https://github.com/taylorbanks/page-foundry)
|
|
12
|
+
[](skills/page-foundry/references/ship-gates.md)
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx page-foundry install
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
<a href="https://taylorbanks.github.io/page-foundry/"><img src="docs/assets/readme-hero.jpg" alt="page-foundry homepage" width="820"></a>
|
|
19
|
+
|
|
20
|
+
<sub>The homepage above was built by page-foundry. That is the demo. · <a href="https://taylorbanks.github.io/page-foundry/">Live site</a></sub>
|
|
21
|
+
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
page-foundry is a Claude Code skill. One command runs your brief through the best marketing and design skills, in order. It gates what comes out. You get back a page in your voice that does not read or look AI-made. Keep the static HTML, or take the design package to any tool.
|
|
27
|
+
|
|
28
|
+
## The problem it solves
|
|
29
|
+
|
|
30
|
+
You ship a lot of pages. New product, new landing page, new launch, new course. An agent will write each one, and each comes out a little different: a different voice, a different structure, conversion by guesswork, and the same generic look every other AI is producing right now. Some of those pages quietly talk a qualified buyer out of buying. None of them will stop themselves from inventing a testimonial you never got.
|
|
31
|
+
|
|
32
|
+
page-foundry fixes the process, not the sentence. The same voice across fifty pages. Conversion decisions from published research instead of taste. Copy a real buyer would believe. And a hard line against fabricated proof.
|
|
33
|
+
|
|
34
|
+
## What you get
|
|
35
|
+
|
|
36
|
+
| | |
|
|
37
|
+
|---|---|
|
|
38
|
+
| **Converts by method, not luck** | Structure and copy follow conversion research: one clear action, message matched to the traffic, proof beside every claim. Scored against the MECLABS Conversion Sequence before it ships. |
|
|
39
|
+
| **One voice across everything** | Your writing rules live in a file a scanner enforces, so page forty sounds like page one. |
|
|
40
|
+
| **Does not read or look AI-made** | A voice scan rejects the vocabulary *and* the language patterns that mark machine-written copy, including the negative parallelism and three-verb runs a word list cannot catch. The design phase rejects the visual defaults that give an AI page away. |
|
|
41
|
+
| **Nothing is faked** | It will not invent a testimonial, a number, a command, or a staged screenshot of something that did not happen. If your proof is thin, it builds around what is real and tells you what to collect. |
|
|
42
|
+
| **Accessible and fast** | Contrast, keyboard access, semantic markup, a weight budget, and a load target are gates the page has to clear, not good intentions. |
|
|
43
|
+
| **A page you own** | Static HTML you host anywhere, or a copy-and-design package for a design tool. You are not tied to a platform. |
|
|
44
|
+
|
|
45
|
+
## Whatever page you need
|
|
46
|
+
|
|
47
|
+
Eight page types, each with a structure that fits how that page actually gets bought: open source project, SaaS homepage, campaign landing page, mobile app, course or workshop sales page, membership or community, newsletter signup, personal site. A page that straddles two gets composed from both.
|
|
48
|
+
|
|
49
|
+
Three ways to run it:
|
|
50
|
+
|
|
51
|
+
- **`build`**: one brief in, a finished page out.
|
|
52
|
+
- **`explore`**: contrasting design directions first; you pick, then it builds the winner.
|
|
53
|
+
- **`handoff`**: a complete copy-and-design package for Claude Design, Open Design, Codex, Gemini, or any tool you build with.
|
|
54
|
+
|
|
55
|
+
## Install
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
# npm (recommended)
|
|
59
|
+
npx page-foundry install
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Prefer another channel:
|
|
63
|
+
|
|
64
|
+
- **skills CLI:** `npx skills add taylorbanks/page-foundry`
|
|
65
|
+
- **Claude Code plugin:** `claude plugin marketplace add taylorbanks/page-foundry` then `claude plugin install page-foundry@page-foundry`
|
|
66
|
+
- **claude.ai:** upload the `.skill` file from the [latest release](https://github.com/taylorbanks/page-foundry/releases)
|
|
67
|
+
|
|
68
|
+
<details>
|
|
69
|
+
<summary>Install flags for <code>npx page-foundry install</code></summary>
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
--project install to ./.claude/skills instead of ~/.claude/skills
|
|
73
|
+
--agents install to ~/.agents/skills
|
|
74
|
+
--dir <path> install under <path>/page-foundry
|
|
75
|
+
--with-commands also write a /page-foundry command stub
|
|
76
|
+
--dry-run print actions without writing
|
|
77
|
+
--force overwrite an existing install
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The installer, `bin/page-foundry.js`, is one dependency-free Node file with no network calls and no telemetry, built on Node standard modules only. It preserves a customized `voice.md` across updates. Read it before you run it.
|
|
81
|
+
</details>
|
|
82
|
+
|
|
83
|
+
## First run
|
|
84
|
+
|
|
85
|
+
Run `/page-foundry` with no arguments for orientation. Then say "set up my voice": a short wizard writes your voice rules, which also drive the scanner, so your writing guidance and the enforcement can never drift apart. Until then a neutral default applies.
|
|
86
|
+
|
|
87
|
+
## How it gets that quality
|
|
88
|
+
|
|
89
|
+
page-foundry is an orchestrator. It does not reinvent marketing; it invokes the best skills that already exist, in the right order, and refuses to ship what does not pass. Positioning, copy, conversion, and psychology come from a proven marketing skill set. Design direction comes from real design guidelines, not a model's guess at "modern." When a skill it relies on is not installed, it uses a weaker built-in fallback and tells you the run is partial, rather than pretending. Every page then runs checks that a page failing on voice, conversion, accessibility, honesty, or performance cannot get past, so "an AI wrote it" never shows.
|
|
90
|
+
|
|
91
|
+
## Built on
|
|
92
|
+
|
|
93
|
+
These projects do the heavy lifting. page-foundry does the sequencing and the checking, and it is a lesser tool without any of them. All optional at runtime; the skill degrades to built-in condensed rules when they are absent. Install them anyway.
|
|
94
|
+
|
|
95
|
+
- [marketingskills](https://github.com/coreyhaines31/marketingskills) by [Corey Haines](https://www.corey.co): product-marketing, copywriting, CRO, customer-research, pricing, and psychology.
|
|
96
|
+
- [Anthropic's skills](https://github.com/anthropics/skills): frontend-design, theme-factory, web-artifacts-builder, and skill-creator.
|
|
97
|
+
- [web-design-guidelines](https://github.com/vercel-labs/agent-skills) by Vercel Labs: accessibility, typography, and UX rules.
|
|
98
|
+
- [humanizer](https://github.com/blader/humanizer) by blader: the "Signs of AI writing" pattern set behind the copy pattern pass.
|
|
99
|
+
- [gstack](https://github.com/garrytan/gstack) by Garry Tan: design consultation, the variant shotgun, and visual review.
|
|
100
|
+
- [Remotion](https://www.remotion.dev): hero demo clips and motion, when a page earns them.
|
|
101
|
+
- The [MECLABS Institute](https://meclabs.com) Conversion Sequence heuristic.
|
|
102
|
+
- The [skills CLI and skills.sh](https://skills.sh) by Vercel.
|
|
103
|
+
|
|
104
|
+
## Security
|
|
105
|
+
|
|
106
|
+
Skills run with your agent's permissions. page-foundry ships one program: `scripts/voice_scan.py`, standard-library Python, no network, no subprocess, no dependencies. The npm installer, `bin/page-foundry.js`, is the same story: zero dependencies, Node built-ins, no network. Read both before you install. The skill installs companions only from the pinned sources in its table, only with your approval, never from search results. See [SECURITY.md](SECURITY.md) for reporting. page-foundry is built by a security practitioner who assumes you will not take any of that on faith.
|
|
107
|
+
|
|
108
|
+
## License
|
|
109
|
+
|
|
110
|
+
MIT. See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/*
|
|
4
|
+
* page-foundry installer.
|
|
5
|
+
*
|
|
6
|
+
* A read-before-you-trust-it CLI, on purpose: no dependencies, no network, no
|
|
7
|
+
* telemetry, Node built-ins only (fs, path, os). It copies the bundled skill
|
|
8
|
+
* from this package into your Claude skills directory. Nothing runs on `npm
|
|
9
|
+
* install`; only the explicit `install` subcommand writes anything.
|
|
10
|
+
*
|
|
11
|
+
* npx page-foundry install -> ~/.claude/skills/page-foundry
|
|
12
|
+
* npx page-foundry install --project -> ./.claude/skills/page-foundry
|
|
13
|
+
* npx page-foundry install --agents -> ~/.agents/skills/page-foundry
|
|
14
|
+
* npx page-foundry install --dir <path> -> <path>/page-foundry
|
|
15
|
+
* npx page-foundry install --with-commands -> also writes commands/page-foundry.md
|
|
16
|
+
* npx page-foundry install --dry-run -> print what would happen, write nothing
|
|
17
|
+
* npx page-foundry update -> reinstall, preserving a customized voice.md
|
|
18
|
+
* npx page-foundry uninstall -> remove the installed skill
|
|
19
|
+
* npx page-foundry where -> print the resolved target
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
const fs = require("fs");
|
|
23
|
+
const path = require("path");
|
|
24
|
+
const os = require("os");
|
|
25
|
+
|
|
26
|
+
const SKILL = "page-foundry";
|
|
27
|
+
const SRC = path.join(__dirname, "..", "skills", SKILL);
|
|
28
|
+
const PKG = require(path.join(__dirname, "..", "package.json"));
|
|
29
|
+
|
|
30
|
+
function log(msg) { process.stdout.write(msg + "\n"); }
|
|
31
|
+
function die(msg) { process.stderr.write("error: " + msg + "\n"); process.exit(1); }
|
|
32
|
+
|
|
33
|
+
function parseArgs(argv) {
|
|
34
|
+
const flags = { _: [] };
|
|
35
|
+
for (let i = 0; i < argv.length; i++) {
|
|
36
|
+
const a = argv[i];
|
|
37
|
+
if (a === "--dir") { flags.dir = argv[++i]; }
|
|
38
|
+
else if (a.startsWith("--")) { flags[a.slice(2)] = true; }
|
|
39
|
+
else { flags._.push(a); }
|
|
40
|
+
}
|
|
41
|
+
return flags;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Resolve the base skills directory from flags; the skill lands at <base>/page-foundry.
|
|
45
|
+
function resolveBase(flags) {
|
|
46
|
+
if (flags.dir) return path.resolve(flags.dir);
|
|
47
|
+
if (flags.project) return path.resolve(".claude", "skills");
|
|
48
|
+
if (flags.agents) return path.join(os.homedir(), ".agents", "skills");
|
|
49
|
+
return path.join(os.homedir(), ".claude", "skills"); // default: global Claude Code
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function target(flags) { return path.join(resolveBase(flags), SKILL); }
|
|
53
|
+
|
|
54
|
+
function commandsFile(flags) {
|
|
55
|
+
const base = flags.project ? path.resolve(".claude") : path.join(os.homedir(), ".claude");
|
|
56
|
+
return path.join(base, "commands", SKILL + ".md");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// A customized voice overlay (owner is not "default") must survive an update.
|
|
60
|
+
function voicePath(dir) { return path.join(dir, "references", "voice.md"); }
|
|
61
|
+
function isCustomVoice(dir) {
|
|
62
|
+
try {
|
|
63
|
+
const t = fs.readFileSync(voicePath(dir), "utf8");
|
|
64
|
+
const m = t.match(/^owner:\s*(.+)$/m);
|
|
65
|
+
return !!(m && m[1].trim().toLowerCase() !== "default");
|
|
66
|
+
} catch { return false; }
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function copySkill(dest, flags) {
|
|
70
|
+
if (flags["dry-run"]) { log(" would copy skill -> " + dest); return; }
|
|
71
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
72
|
+
fs.cpSync(SRC, dest, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function writeCommandStub(flags) {
|
|
76
|
+
const file = commandsFile(flags);
|
|
77
|
+
const body = [
|
|
78
|
+
"---",
|
|
79
|
+
"description: Build or review a homepage, landing page, or sales page with the page-foundry pipeline.",
|
|
80
|
+
"---",
|
|
81
|
+
"",
|
|
82
|
+
"Invoke the page-foundry skill and follow its pipeline. Run with no arguments for orientation.",
|
|
83
|
+
""
|
|
84
|
+
].join("\n");
|
|
85
|
+
if (flags["dry-run"]) { log(" would write command stub -> " + file); return; }
|
|
86
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
87
|
+
fs.writeFileSync(file, body);
|
|
88
|
+
log(" command stub -> " + file);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function install(flags, { force }) {
|
|
92
|
+
if (!fs.existsSync(path.join(SRC, "SKILL.md"))) die("bundled skill not found at " + SRC);
|
|
93
|
+
const dest = target(flags);
|
|
94
|
+
const exists = fs.existsSync(dest);
|
|
95
|
+
|
|
96
|
+
if (exists && !force && !flags["dry-run"]) {
|
|
97
|
+
die("already installed at " + dest + "\n run `page-foundry update` to overwrite, or `page-foundry uninstall` first.");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Preserve a customized voice overlay across updates.
|
|
101
|
+
let savedVoice = null;
|
|
102
|
+
if (exists && isCustomVoice(dest)) {
|
|
103
|
+
savedVoice = fs.readFileSync(voicePath(dest), "utf8");
|
|
104
|
+
log(" note: preserving your customized references/voice.md (owner is not default)");
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
log((flags["dry-run"] ? "[dry run] " : "") + (exists ? "Updating " : "Installing ") + SKILL + " v" + PKG.version);
|
|
108
|
+
copySkill(dest, flags);
|
|
109
|
+
if (savedVoice !== null && !flags["dry-run"]) fs.writeFileSync(voicePath(dest), savedVoice);
|
|
110
|
+
if (!flags["dry-run"]) log(" skill -> " + dest);
|
|
111
|
+
if (flags["with-commands"]) writeCommandStub(flags);
|
|
112
|
+
|
|
113
|
+
if (!flags["dry-run"]) {
|
|
114
|
+
log("");
|
|
115
|
+
log("Done. Next:");
|
|
116
|
+
log(" - open your agent and run `/page-foundry` for orientation");
|
|
117
|
+
log(" - say \"set up my voice\" to configure the voice rules the scanner enforces");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function uninstall(flags) {
|
|
122
|
+
const dest = target(flags);
|
|
123
|
+
if (!fs.existsSync(dest)) die("not installed at " + dest);
|
|
124
|
+
// Guard: only remove a directory that is actually this skill.
|
|
125
|
+
if (!fs.existsSync(path.join(dest, "SKILL.md"))) die("refusing to remove " + dest + " (no SKILL.md; not a page-foundry install)");
|
|
126
|
+
if (flags["dry-run"]) { log(" would remove -> " + dest); return; }
|
|
127
|
+
fs.rmSync(dest, { recursive: true, force: true });
|
|
128
|
+
log("Removed " + dest);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function help() {
|
|
132
|
+
log("page-foundry v" + PKG.version + " - installer for the page-foundry Claude Code skill");
|
|
133
|
+
log("");
|
|
134
|
+
log("Usage: npx page-foundry <command> [flags]");
|
|
135
|
+
log("");
|
|
136
|
+
log("Commands:");
|
|
137
|
+
log(" install copy the skill into your Claude skills directory");
|
|
138
|
+
log(" update reinstall, overwriting (keeps a customized voice.md)");
|
|
139
|
+
log(" uninstall remove the installed skill");
|
|
140
|
+
log(" where print the target directory");
|
|
141
|
+
log("");
|
|
142
|
+
log("Flags:");
|
|
143
|
+
log(" --project install to ./.claude/skills instead of ~/.claude/skills");
|
|
144
|
+
log(" --agents install to ~/.agents/skills");
|
|
145
|
+
log(" --dir <path> install under <path>/page-foundry");
|
|
146
|
+
log(" --with-commands also write a /page-foundry command stub");
|
|
147
|
+
log(" --dry-run print actions without writing");
|
|
148
|
+
log(" --force overwrite an existing install (install only)");
|
|
149
|
+
log("");
|
|
150
|
+
log("Other install channels: `npx skills add taylorbanks/page-foundry`,");
|
|
151
|
+
log("the Claude Code plugin, or a .skill upload on claude.ai. See the README.");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function main() {
|
|
155
|
+
const flags = parseArgs(process.argv.slice(2));
|
|
156
|
+
const cmd = flags._[0];
|
|
157
|
+
if (flags.version || flags.v || cmd === "version") return log(PKG.version);
|
|
158
|
+
if (flags.help || flags.h || !cmd || cmd === "help") return help();
|
|
159
|
+
switch (cmd) {
|
|
160
|
+
case "install": return install(flags, { force: !!flags.force });
|
|
161
|
+
case "update": return install(flags, { force: true });
|
|
162
|
+
case "uninstall":
|
|
163
|
+
case "remove": return uninstall(flags);
|
|
164
|
+
case "where": return log(target(flags));
|
|
165
|
+
default: die("unknown command: " + cmd + "\n run `page-foundry --help`");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
main();
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "page-foundry",
|
|
3
|
+
"version": "2.9.1",
|
|
4
|
+
"description": "A gated pipeline for product homepages, landing pages, and sales pages. An orchestrator Claude Code skill. Install it with: npx page-foundry install",
|
|
5
|
+
"bin": {
|
|
6
|
+
"page-foundry": "bin/page-foundry.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"skills/page-foundry/",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
14
|
+
"type": "commonjs",
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"author": "Taylor Banks",
|
|
20
|
+
"homepage": "https://taylorbanks.github.io/page-foundry/",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/taylorbanks/page-foundry.git"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/taylorbanks/page-foundry/issues"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"claude-code",
|
|
30
|
+
"claude",
|
|
31
|
+
"skill",
|
|
32
|
+
"agent-skill",
|
|
33
|
+
"landing-page",
|
|
34
|
+
"homepage",
|
|
35
|
+
"sales-page",
|
|
36
|
+
"conversion",
|
|
37
|
+
"copywriting",
|
|
38
|
+
"cro",
|
|
39
|
+
"marketing",
|
|
40
|
+
"page-builder"
|
|
41
|
+
],
|
|
42
|
+
"scripts": {
|
|
43
|
+
"test": "node bin/page-foundry.js --version && node bin/page-foundry.js where"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# page-foundry
|
|
2
|
+
|
|
3
|
+
**One brief in, a finished page out.** page-foundry produces homepages, landing pages, and sales pages that convert, hold one voice across every product you ship, stay accessible and fast, and never fabricate proof. It runs the best marketing and design skills available behind one command, then checks the output so an AI page never ships looking like one.
|
|
4
|
+
|
|
5
|
+
**Install:** unzip the `.skill` into `~/.claude/skills/page-foundry/` (Claude Code) or upload the `.skill` file (claude.ai). Run `/page-foundry` with no arguments for orientation: three modes (build, explore, handoff), eight page types, and example invocations.
|
|
6
|
+
|
|
7
|
+
**First run:** set the voice. Say "set up my voice" and the wizard writes `references/voice.md`, which also drives the scanner (`scripts/voice_scan.py`), so your writing guidance and the enforcement stay in sync. Until then a neutral default applies.
|
|
8
|
+
|
|
9
|
+
**What it makes:** open source project, SaaS homepage, campaign landing page, mobile app, course or workshop sales page, membership or community, newsletter signup, or personal site. Build mode ships static HTML you own; explore mode gives you design directions to pick from; handoff mode packages copy and design for a design tool.
|
|
10
|
+
|
|
11
|
+
**Companions (all optional, all improve results):** coreyhaines31/marketingskills (product-marketing, copywriting, cro, and more), Anthropic's frontend-design / theme-factory / web-artifacts-builder, and garrytan/gstack for design variants and visual review. The skill detects what is installed and degrades to built-in condensed rules for anything missing.
|
|
12
|
+
|
|
13
|
+
Methodology credits: conversion structure informed by published landing-page research and the MECLABS Conversion Sequence heuristic, with Corey Haines' marketing skills doing the marketing work. License: MIT.
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: page-foundry
|
|
3
|
+
description: Produces high-converting homepages, landing pages, and sales pages written in your own voice, one brief in and one shipped page or design-handoff package out, with checks that keep the output from reading or looking AI-made. Use when someone wants to build, create, rewrite, review, or ship a page for a product, SaaS, web app, mobile app, open source project, course, community, or newsletter; asks to make a homepage, landing page, sales page, pricing page, or personal site; says their landing page is not converting or reads like AI wrote it; or mentions page-foundry, conversion copy, page CRO, or hero sections.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Page Foundry
|
|
7
|
+
|
|
8
|
+
A foundry takes raw material through a fixed sequence of stations and rejects anything that fails inspection. This skill does the same for marketing pages: one product brief in, one deployable page (or one handoff package) out, with hard gates between stations. The point is repeatability across many products without the output converging on generic AI-page sludge or drifting from the owner's voice.
|
|
9
|
+
|
|
10
|
+
Run the pipeline in order. Each phase has an output the next phase consumes. Do not skip the gates; a page that fails a gate does not ship.
|
|
11
|
+
|
|
12
|
+
## When to use this skill
|
|
13
|
+
|
|
14
|
+
Reach for page-foundry when someone wants a real, high-performing web page, not just a block of HTML. Typical asks:
|
|
15
|
+
|
|
16
|
+
- "Build a landing page for my SaaS, app, or product."
|
|
17
|
+
- "Make a homepage for my open source project, startup, or course."
|
|
18
|
+
- "Write a sales page for my course, workshop, or membership."
|
|
19
|
+
- "I need a pricing page, a newsletter signup page, or a personal site."
|
|
20
|
+
- "My landing page is not converting," or "this page reads like AI wrote it."
|
|
21
|
+
- "Rewrite this page so it actually converts," or "review my homepage."
|
|
22
|
+
- "Give me a copy-and-design package I can hand to Claude Design or a designer."
|
|
23
|
+
- They mention conversion copy, CRO, hero sections, message match, or holding one voice across many product pages.
|
|
24
|
+
|
|
25
|
+
Not this skill: a throwaway HTML mockup with no conversion or voice requirement (a one-shot prompt is faster), or multi-page site architecture and content planning (page-foundry ships one page and flags the rest as separate work).
|
|
26
|
+
|
|
27
|
+
## Phase -1: Preflight
|
|
28
|
+
|
|
29
|
+
Run once at the start of every engagement.
|
|
30
|
+
|
|
31
|
+
Nothing installs, updates, or gets skipped silently.
|
|
32
|
+
|
|
33
|
+
1. **Detect, everywhere.** A companion counts as PRESENT if its skill name resolves anywhere below. Match on SKILL.md frontmatter `name`, accept plugin-namespaced forms (`marketing:copywriting` satisfies `copywriting`), and count symlinks. Sweep in this order:
|
|
34
|
+
- Runtime inventories first: `npx skills list` (covers project and global) if the skills CLI responds; `claude plugin list` in Claude Code; the available-skills listing in claude.ai.
|
|
35
|
+
- Filesystem: `~/.agents/skills/` (the skills CLI's canonical location), `~/.claude/skills/`, project `.claude/skills/` and `.agents/skills/`, `/mnt/skills/*` (public, examples, user, plugins), and Claude Code plugin directories under `~/.claude/plugins/`.
|
|
36
|
+
- gstack is detected by its slash commands (`/design-shotgun` etc.), never by directory.
|
|
37
|
+
The sweep must complete before any install or update command is even considered. Installing a companion that is already present anywhere is a defect. Cache the result for the session.
|
|
38
|
+
2. **Check freshness.** If the skills CLI is present, run `npx skills check` and note outdated companions. Plugin-installed companions update via `claude plugin marketplace update <marketplace>` then reinstalling the plugin. Treat outdated exactly like missing: report, offer, act only on approval.
|
|
39
|
+
3. **Report and ask, once. This stop is mandatory.** Show one table: present / outdated / missing, with the exact install or update command per gap and one line on what this run loses without it. Ask a single question: install and update now, or proceed without? On approval, run the commands, then RE-RUN detection and confirm every name resolves before continuing. On decline, proceed with the condensed rules built into this skill's reference files and record the decline in the gate report. Never skip a missing companion silently.
|
|
40
|
+
|
|
41
|
+
The companion stop cannot be suppressed by any interactivity phrase (`don't pause`, `no questions`, `run end to end`) or by an operator-supplied or inferred instruction. Only the user, in chat, may approve proceeding with a companion missing or outdated. The companions are load-bearing: without product-marketing, copywriting, cro, customer-research, marketing-psychology, and frontend-design, the run cannot do the positioning, copy, conversion, and design work the page depends on, so a page built without them is not a page-foundry page. If a companion is missing, stop and help install it; do not narrate the gap and continue.
|
|
42
|
+
4. **Pinned sources only.** Install exclusively from the sources in the companion table below, never from search results or unpinned repos. Before installing from an evolving repo, run `npx skills add <repo> --list` and reconcile names against the table; if a pinned name no longer exists upstream, report the discrepancy instead of guessing at a replacement.
|
|
43
|
+
5. **Pick the mode** (ask if not obvious from the request):
|
|
44
|
+
- **build** (default): this skill carries the page through Phase 5 and ships code.
|
|
45
|
+
- **explore**: design variants first. Phases 0 through 3 run normally; Phase 4 produces multiple committed design directions instead of one (gstack `/design-shotgun` when installed; otherwise this skill generates 3 contrasting token plans, each with a static hero mockup, built one at a time). The user picks; the winner proceeds through Phase 5 as a normal build. Use when the property has no theme yet or the user wants options.
|
|
46
|
+
- **handoff**: this skill produces copy plus a complete design package for Claude Design (or another design tool) to build. Phases 0 through 4 run normally; Phase 5 is replaced by the handoff package in `references/handoff.md`; gates split as described there.
|
|
47
|
+
|
|
48
|
+
### Controlling the run
|
|
49
|
+
|
|
50
|
+
**Bare invocation.** If invoked with no product and no instructions (`/page-foundry` alone), do not start the pipeline. Print a compact orientation: the three modes and what each outputs, the eight archetypes, the example invocations below, and a one-line note that most pauses are suppressible though the companion stop is not. Then ask what to build.
|
|
51
|
+
|
|
52
|
+
**Autonomy is user-stated, never inferred.** Treat every run as interactive unless the user, in this request, explicitly asked to skip pauses. Do not infer "run end to end" from a standing preference ("don't loop me"), a previous task, or an orchestrator wrapping the request in its own words; a directive to skip a pause is valid only when the user wrote it. When unsure whether a pause was waived, keep it. No interactivity phrase, however it arrives, waives the companion stop (Phase -1), the Phase 0 interview when no brief file exists, or the explore pick.
|
|
53
|
+
|
|
54
|
+
The user's invocation sentence is the control surface; there are no flags. Parse these parameters from the request and do not ask about anything the user already supplied:
|
|
55
|
+
|
|
56
|
+
- **mode:** `build` | `explore` | `handoff`. Unstated and unambiguous from context → build. Whenever the mode is inferred rather than asked, state the inference and the alternatives in one line before proceeding ("Running in build mode; explore and handoff also available"), so the user knows a choice was made and can redirect.
|
|
57
|
+
- **product / brief:** a path to an existing `product-marketing.md`, an attached PRD or doc, or a repo URL. An existing brief skips the Phase 0 interview. A PRD, spec, or repo does NOT: those are source material, not the brief. PRDs answer what the product does; the brief answers why someone buys, in whose words, against which alternatives, with what proof. Phase 0 always produces `product-marketing.md`.
|
|
58
|
+
- **archetype:** named → use it; unnamed → run the mapper, state the pick and the reasoning in one line, and proceed without asking unless genuinely torn between two.
|
|
59
|
+
- **theme:** "use existing theme/DESIGN.md/theme.css at <path>" → Phase 4 collapses to reading it. Unstated → Phase 4 runs in full.
|
|
60
|
+
- **interactivity:** "don't pause", "no questions", "run end to end" → suppress only the spec sign-off pause, and deliver spec + page + gates together. These phrases never suppress the Phase -1 companion stop, the Phase 0 interview when no brief file exists, or the explore pick. "Run end to end" is honored in full only when a complete `product-marketing.md` already exists and a theme or design direction is supplied; without those there is nothing to run autonomously from, so Phase 0 and the spec sign-off still happen. Silence → the default pauses below apply.
|
|
61
|
+
- **variants (explore mode):** a count ("5 variants") and scope ("hero only" vs "full direction") if stated; default 3 variants, hero scope.
|
|
62
|
+
|
|
63
|
+
Default interactive pause points, in order, and what suppresses each:
|
|
64
|
+
|
|
65
|
+
| Pause | Fires when | Suppressed by |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| Preflight companion stop | any companion missing or outdated | Not suppressible; only the user, in chat, may approve proceeding without it |
|
|
68
|
+
| Mode question | mode ambiguous | naming the mode |
|
|
69
|
+
| Phase 0 interview | no complete brief exists | an existing `product-marketing.md` only (a PRD, repo, or spec does not) |
|
|
70
|
+
| Spec sign-off | always by default | "don't pause for sign-off" |
|
|
71
|
+
| Explore pick | always in explore mode (it is the point) | cannot be suppressed |
|
|
72
|
+
| Shotgun offer | gstack present + no theme + direction undecided | naming a theme or direction |
|
|
73
|
+
| Voice wizard | `owner: default` or user asks | configured voice.md |
|
|
74
|
+
|
|
75
|
+
Example invocations:
|
|
76
|
+
|
|
77
|
+
- Full page, no questions: "page-foundry, build mode, saas-homepage for Acme; brief at .agents/product-marketing.md, use theme.css in repo root, don't pause, show spec + page + gate report together."
|
|
78
|
+
- Designs to choose from: "page-foundry, explore mode for Acme, 4 variants, full direction; brief attached; stop at the comparison."
|
|
79
|
+
- Claude Design package: "page-foundry, handoff mode for Acme; brief attached; campaign-landing; package only, I'll build in Claude Design."
|
|
80
|
+
|
|
81
|
+
### Companion skills
|
|
82
|
+
|
|
83
|
+
| Skill / command | Source | Install | Used in phase |
|
|
84
|
+
|---|---|---|---|
|
|
85
|
+
| product-marketing | coreyhaines31/marketingskills | `npx skills add coreyhaines31/marketingskills --skill product-marketing` | 0 |
|
|
86
|
+
| customer-research, marketing-psychology | coreyhaines31/marketingskills | same pattern, `--skill <name>` | 1 |
|
|
87
|
+
| copywriting, copy-editing | coreyhaines31/marketingskills | same pattern | 3 |
|
|
88
|
+
| humanizer | blader/humanizer (GitHub) | `git clone https://github.com/blader/humanizer.git ~/.claude/skills/humanizer` | 3 (AI pattern pass) |
|
|
89
|
+
| cro | coreyhaines31/marketingskills | same pattern | 2, 6 |
|
|
90
|
+
| pricing, competitors, aso | coreyhaines31/marketingskills | same pattern | 2 (archetype-dependent) |
|
|
91
|
+
| launch, lead-magnets, popups, signup | coreyhaines31/marketingskills | same pattern, `--skill <name>` | 2, 3 (archetype-dependent: launch and campaign pages, newsletter and gated offers, exit/scroll popups when in scope, signup-flow copy) |
|
|
92
|
+
| analytics | coreyhaines31/marketingskills | same pattern | 6 (measurement gate) |
|
|
93
|
+
| frontend-design | Anthropic (anthropics/skills) | `npx skills add anthropics/skills --skill frontend-design` | 4 |
|
|
94
|
+
| theme-factory, web-artifacts-builder | Anthropic (anthropics/skills) | same pattern | 4, 5 |
|
|
95
|
+
| ai-seo, schema | coreyhaines31/marketingskills | same pattern | 6 |
|
|
96
|
+
| web-design-guidelines | vercel-labs/agent-skills | `npx skills add vercel-labs/agent-skills --skill web-design-guidelines` | 4, 6 (render gate) |
|
|
97
|
+
| remotion (official Remotion skill) | remotion-dev (confirm exact repo via `npx skills find remotion --owner remotion-dev`) | per find result | 2, 5 (motion assets) |
|
|
98
|
+
| gstack (`/design-consultation`, `/design-shotgun`, `/design-html`, `/plan-design-review`, `/design-review`, `/qa`) | garrytan/gstack | per gstack README (installs to `~/.claude/skills/gstack/`) | 2, 4, 5, 6 |
|
|
99
|
+
|
|
100
|
+
### Orchestration doctrine (how companions are used)
|
|
101
|
+
|
|
102
|
+
page-foundry is an orchestrator. Its reference files are a fallback, not the plan. In every phase that names a companion skill, follow this without exception:
|
|
103
|
+
|
|
104
|
+
1. **Invoke the companion as the primary path.** Actually call the skill, hand it the phase's inputs (the brief, the spec, the copy draft, the tokens, whatever that phase works on), and use its output as the phase's work product. When a companion is available you do not read its reference file and do the work yourself; the companion is more capable than the condensed rules, and skipping it is the main reason two runs of this skill differ in quality.
|
|
105
|
+
2. **Fall back only when the companion cannot be invoked** (declined at the Phase -1 stop, not installed, or it errors). Then, and only then, use the condensed rules in the phase's named reference file.
|
|
106
|
+
3. **Flag every fallback.** Any phase that runs on a reference file because its companion was missing or declined is a DEGRADED phase. Say so in that phase ("running Phase N without <companion>; using the built-in condensed rules, which are weaker"), and record it on the gate report's `degraded` line. A run missing load-bearing companions is a partial execution, and the user is told which skill would have made it better.
|
|
107
|
+
|
|
108
|
+
The reference files are the floor, so the skill still produces something when a companion is absent. The companion, when present, is the standard.
|
|
109
|
+
|
|
110
|
+
### gstack integration notes
|
|
111
|
+
|
|
112
|
+
When gstack is installed, use it at these seams; otherwise skip without substituting anything:
|
|
113
|
+
|
|
114
|
+
- **Phase 2:** offer `/plan-design-review` on the approved page spec; its inline mockups catch structural problems before copy is written.
|
|
115
|
+
- **Phase 4:** if `DESIGN.md` exists for the project (output of `/design-consultation`), read it and treat it as the property's token source; do not invent a competing theme. If no theme exists yet and the user is undecided on direction, offer `/design-shotgun` to generate variants; the approved variant becomes the token set. Shotgun approvals also feed gstack's per-project taste profile, which improves future variants; mention this once.
|
|
116
|
+
- **Phase 5:** `/design-html` is an accepted build path (it produces fluid, resize-safe HTML). Page-foundry's build requirements (semantic HTML, mobile-first, performance budget) still apply to its output.
|
|
117
|
+
- **Phase 6:** offer `/design-review` and `/qa` as additions to the gates, not replacements.
|
|
118
|
+
|
|
119
|
+
Division of authority: gstack owns visual exploration and engineering review; page-foundry's conversion, voice, and integrity gates remain authoritative for marketing pages and are never waived by a passing gstack review.
|
|
120
|
+
|
|
121
|
+
## Phase 0: Intake
|
|
122
|
+
|
|
123
|
+
Goal: one durable context file per product. Everything downstream reads it.
|
|
124
|
+
|
|
125
|
+
1. Look for an existing context file at `.agents/product-marketing.md` or `.claude/product-marketing.md` (per product, or in the product's repo), and for `foundry-log.md` from prior runs. Read both if found. The log's `open items` and `learnings` are binding inputs (see the log format in Phase 6), not background reading: restate them at the top of this run's plan so the user sees they carried forward.
|
|
126
|
+
2. If absent, build the brief. **Invoke the product-marketing skill as the primary path**: hand it the product, the repo README, any PRD or spec, the existing site, and the conversation, and let it produce the structured `.agents/product-marketing.md` (positioning, ICP, differentiation, competitive frame, proof inventory). Then interview the user for only what it cannot infer: the buyer's verbatim language, entry states per segment, traffic source, the real proof inventory, and claims that cannot be made. One round of questions; a PRD feeds the brief, it never replaces it. If product-marketing is not available, draft the brief yourself from `assets/brief-template.md`, tell the user Phase 0 ran without it, and mark the phase degraded.
|
|
127
|
+
3. Write the completed brief to `.agents/product-marketing.md` in the product's project directory (or alongside the page output if there is no repo).
|
|
128
|
+
|
|
129
|
+
Do not proceed on a guessed brief. A page built on an assumed audience or an assumed offer is rework, not progress.
|
|
130
|
+
|
|
131
|
+
## Phase 1: Message architecture
|
|
132
|
+
|
|
133
|
+
Goal: positioning and message hierarchy, before any page structure exists.
|
|
134
|
+
|
|
135
|
+
From the brief, produce a short message architecture document (under a page):
|
|
136
|
+
|
|
137
|
+
- One-sentence positioning: for WHO, PRODUCT is the WHAT that delivers OUTCOME, unlike ALTERNATIVE.
|
|
138
|
+
- Message hierarchy: the single most important claim, then 3 to 5 supporting claims in priority order. Each claim must be specific and checkable: concrete enough that a reader could prove it wrong. "Manage everything in one place" is neither.
|
|
139
|
+
- Objection map: the top 3 to 5 reasons this exact buyer says no, each paired with the proof or copy move that answers it. Include, per segment, the "this doesn't apply to me" objection: the reason a qualified buyer in a GOOD starting position concludes the product isn't for them.
|
|
140
|
+
- Proof inventory: every real testimonial, metric, named user, star count, certification, or credential available. Mark anything missing as `[TK: description]`. Never fabricate proof; see Integrity rules.
|
|
141
|
+
|
|
142
|
+
**Invoke customer-research** on every input the brief points to (reviews, interview transcripts, support tickets, competitor reviews, Reddit or forum sources, any voice-of-customer material) to surface the buyer's verbatim language and the real objections; write the message hierarchy and objection map in the words it returns, not the builder's. **Invoke marketing-psychology** to choose the persuasion levers that fit this buyer and offer (anchoring, loss aversion, social proof placement, commitment and consistency) and apply them to the claim order and the objection answers. If either is missing, derive the message architecture from the brief alone, mark Phase 1 degraded, and tell the user the objection map and buyer language are weaker without customer-research and the persuasion sequencing is weaker without marketing-psychology.
|
|
143
|
+
|
|
144
|
+
## Phase 2: Page spec
|
|
145
|
+
|
|
146
|
+
Goal: a section-by-section blueprint, with conversion rules applied before a word of final copy is written.
|
|
147
|
+
|
|
148
|
+
1. **Pick the archetype.** Read the archetype mapper at the top of `references/archetypes.md`. Current archetypes: `oss-project`, `saas-homepage`, `campaign-landing`, `mobile-app`, `course-sales`, `membership-community`, `newsletter-capture`, `personal-home`. If the page maps cleanly, follow that spec exactly. If it straddles two, use the mapper's composition rules. If nothing fits, build a custom spec from the shared rules, and tell the user that is what is happening.
|
|
149
|
+
2. **Invoke the cro skill as the primary path**: hand it the archetype, the message architecture, and the draft section list, and use its output to structure the spec for conversion (5-second hero, single primary CTA, headline budget, proof adjacency, message match, mobile-first ordering, objection handling). `references/conversion-rules.md` is the fallback when cro is absent; using it marks Phase 2 degraded. Also invoke the archetype-specific companions on the sections that call for them: **pricing** for a pricing block, **competitors** for a comparison or alternative page, **aso** for a mobile-app page's store alignment, **launch** for a launch or campaign page, and **lead-magnets / popups / signup** where the spec includes those. Any that is needed but missing is noted as degraded.
|
|
150
|
+
3. Output the spec as a numbered section list, each with: purpose, the claim it carries (from Phase 1), the proof element placed beside it, the CTA treatment if any, and any motion asset (hero demo clip, animation) with its justification. Motion is a cost in weight and attention; it must earn its slot, either by user request or because showing the product moving is the claim.
|
|
151
|
+
|
|
152
|
+
Get user sign-off on the spec before writing copy. When gstack is present, invoke `/plan-design-review` on the spec here; its inline mockups catch structural problems before copy is written.
|
|
153
|
+
|
|
154
|
+
## Phase 3: Copy
|
|
155
|
+
|
|
156
|
+
Goal: full page copy, in the owner's voice, passing the voice scan.
|
|
157
|
+
|
|
158
|
+
1. Read `references/voice.md` first. If its config block still says `owner: default`, or the user asks to set up or change the voice, run the Voice wizard (below) before writing.
|
|
159
|
+
2. Headline first: draft at least 6 candidates, score each against the budget, message match, and specificity, then present the top 3 with one line of reasoning each and pick (ask only in interactive runs). **Invoke the copywriting skill to write the body**, section by section against the spec and the message architecture; it does the writing. Then **invoke copy-editing** to tighten what it produced. For archetype-specific copy, invoke the matching companion on that section (**signup** for a registration flow, **popups** for an exit or scroll offer, **launch** for a launch page, **lead-magnets** for a gated offer). If copywriting is absent, write the copy yourself against the spec and `references/voice.md`, and mark Phase 3 degraded.
|
|
160
|
+
3. Run `python3 scripts/voice_scan.py <draft files>`. The script reads its rules from `references/voice.md`, so wizard changes take effect immediately. Fix every FAIL; zero FAILs is the bar.
|
|
161
|
+
Then the **pattern pass** (do not skip it): the word scan catches vocabulary, not grammar, and the most common reason a page passes the word scan yet still reads as AI is a language pattern. Resolve every `AI language pattern` WARN the scanner flags (negative parallelism "not X, it's Y"; copula avoidance "serves as"; tailing negation "no X, no Y"; authority tropes; significance inflation; three-verb-clause runs "runs X, gates Y, and hands Z"; parallel-list uniformity in prose). Then **invoke the humanizer skill on the final copy. This is required, not optional.** The scanner catches lexical and single-sentence tells, but structural uniformity spread across separate elements (a roster where every item opens the same way, "Finds... / Pulls... / Structures...") is beyond regex; only a semantic read catches it. Apply the humanizer's rewrites, and record on the gate report's `humanizer` line that it ran. A scanner PASS without the humanizer pass is an incomplete Gate 2. A page is not voice-clean until both the words and the patterns are clean, by the scanner and by the humanizer.
|
|
162
|
+
4. One editing pass that only cuts. Every sentence survives the question: what does the reader lose if this dies? If nothing, it dies.
|
|
163
|
+
5. Red-team read: adopt one skeptical reader per segment x entry state from the brief and walk the draft as each of them. Every reader must reach the CTA; a qualified reader concluding "not for me" is a defect (conversion rule 10). Fix bounce points now; the same check re-runs at the gates.
|
|
164
|
+
|
|
165
|
+
### Voice wizard
|
|
166
|
+
|
|
167
|
+
Run when: the user says anything like "set up my voice", "update the voice", "this is going to someone else"; or on first use while `owner: default`. The wizard edits `references/voice.md` in place so the whole skill, including the scanner, follows the new register. (If the installed skill directory is read-only, copy the skill to a writable location first and tell the user.)
|
|
168
|
+
|
|
169
|
+
1. Show the current config in one screen: owner, register summary, punctuation rules, top of the banned list.
|
|
170
|
+
2. Interview, briefly: Who is the owner and audience? Three adjectives for how it should sound, three for how it must never sound? Punctuation positions (em dashes, exclamation points, sentence case)? Words or phrases they personally ban? Words on the current banned list they actually use and want removed? Two or three sentences of their real writing to calibrate against.
|
|
171
|
+
3. Rewrite the Register and Punctuation sections in their terms, and edit the machine-readable blocks (`scan:banned-phrases`, `scan:judgment-words`, `voice-config`) to match. Keep the AI-flagged vocabulary list intact unless they explicitly remove entries; that list protects everyone.
|
|
172
|
+
4. Verify: run `voice_scan.py` against a sample paragraph of their writing; it should pass. Show them the diff of voice.md and confirm.
|
|
173
|
+
|
|
174
|
+
## Phase 4: Design direction
|
|
175
|
+
|
|
176
|
+
Goal: a committed aesthetic and a token set, chosen for this property, before any markup.
|
|
177
|
+
|
|
178
|
+
1. **Invoke web-design-guidelines** and treat it as authoritative on accessibility, typography, imagery, and interaction mechanics. `references/design-direction.md` carries the marketing-page and anti-slop layer (this skill wins on structure, conversion, and anti-slop calls) and is the fallback for the mechanics when web-design-guidelines is absent, which marks the design degraded.
|
|
179
|
+
2. **Invoke the frontend-design skill to produce the token plan** (palette as named hex values, display plus body pairing, layout concept, one signature element, and a critique against the generic default before building); use its output as the design direction. Token source priority when they exist: brand assets from the brief, then gstack `DESIGN.md` (from `/design-consultation`), then a **theme-factory** theme, then frontend-design's plan. If frontend-design is absent, build the token plan yourself from `references/design-direction.md` and mark Phase 4 degraded. When direction is genuinely undecided and gstack is present, invoke `/design-shotgun`.
|
|
180
|
+
3. **Explore mode:** produce the stated number of variants (default 3), each a complete committed direction (token plan + static hero mockup), deliberately contrasting along real axes (light/dark, editorial/brutalist, type-led/visual-led), never three flavors of the same idea. Present them, wait for the pick, then proceed as build mode with the winner. With gstack, `/design-shotgun` replaces this step and its comparison board handles the pick.
|
|
181
|
+
4. Persist the winning tokens (theme-factory, or `theme.css` with custom properties). One property, one theme, many pages.
|
|
182
|
+
|
|
183
|
+
## Phase 5: Build (build mode) or Handoff (handoff mode)
|
|
184
|
+
|
|
185
|
+
**Build mode.** Default to static HTML and CSS in a single file plus `theme.css`, hand-built to the requirements below. Vanilla JS only for small interactions. When the page needs more than a single static file (state, routing, components), **invoke web-artifacts-builder** or gstack **/design-html** to build it rather than hand-rolling it. Requirements regardless of stack:
|
|
186
|
+
|
|
187
|
+
- Semantic HTML: one `h1`, ordered headings, `nav`/`main`/`section`/`footer` landmarks, real `button` and `a` elements.
|
|
188
|
+
- Mobile-first CSS; fully usable at 390px before desktop styling.
|
|
189
|
+
- System fonts or at most two self-hosted files, `font-display: swap`, preloaded.
|
|
190
|
+
- Images sized, compressed, lazy-loaded below the fold, real alt text.
|
|
191
|
+
- No render-blocking third-party scripts; analytics deferred.
|
|
192
|
+
- If the archetype's spec includes a post-conversion page (newsletter-capture's thank-you page does), build it in the same pass; the conversion is not done at the form.
|
|
193
|
+
- Motion assets: when the spec includes one and the Remotion skill is installed, produce the clip through it (product loop demos, hero animations, explainer clips). Without Remotion, mark the slot `[TK: motion asset]` and list it in open items rather than substituting a low-grade animation. Any motion ships muted, respects `prefers-reduced-motion`, and has a static fallback frame.
|
|
194
|
+
- Output: `pages/<product>/index.html`, `theme.css`, `assets/`, plus `llms.txt` and schema from Phase 6.
|
|
195
|
+
|
|
196
|
+
**Handoff mode.** Read `references/handoff.md` and produce the package exactly as specified there: a paste-ready master prompt, final copy marked verbatim, the page spec, the design direction with tokens and asset list, and the acceptance criteria derived from the gates. Run the pre-handoff gates listed there before delivering the package.
|
|
197
|
+
|
|
198
|
+
## Phase 6: Ship gates
|
|
199
|
+
|
|
200
|
+
Read `references/ship-gates.md` and run the full checklist (in handoff mode, run the pre-handoff subset now and the rest when the built asset comes back). Summary: conversion audit with MECLABS score, voice scan at zero FAILs plus the pattern pass, WCAG 2.2 AA spot checks, performance budget, schema + llms.txt + robots + meta, measurement, integrity. **Invoke the companion that owns each gate as the primary path**: **cro** for the conversion audit and MECLABS score, **web-design-guidelines** for the accessibility and render review, **ai-seo** for the AI-discovery gate (robots.txt crawler allowlist, content extractability, llms.txt), **schema** for the JSON-LD, and **analytics** for the measurement gate. Add gstack **/design-review** and **/qa** as extra checks. Any gate run on the `references/ship-gates.md` fallback because its companion was missing is marked degraded in the report. The voice scan (Gate 2) and integrity (Gate 8) are always page-foundry's own and are never waived by a companion.
|
|
201
|
+
|
|
202
|
+
Report results as a pass/fail table with the MECLABS score. A failed gate means fix and re-run, not ship with a caveat.
|
|
203
|
+
|
|
204
|
+
Close every run by appending a record to `foundry-log.md` beside the page output, in exactly this format so future runs can parse it:
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
### {YYYY-MM-DD} · {mode} · {archetype}
|
|
208
|
+
- headline: {shipped H1}
|
|
209
|
+
- meclabs: C={n} (M{n} V{n} I{n} F{n} A{n})
|
|
210
|
+
- gates: {pass/fail/N-A summary}
|
|
211
|
+
- companions: {active this run, with versions where known}
|
|
212
|
+
- degraded: {phases that ran on a reference-file fallback because a companion was missing or declined, each with the companion it lacked; "none" if every phase used its companion}
|
|
213
|
+
- open items: {unresolved, one per line}
|
|
214
|
+
- conversion data: {added later by the user; visits, signups, rate, source}
|
|
215
|
+
- learnings: {one line per lesson worth carrying forward}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
The log is memory, not a receipt. Phase 0 reads it and treats two fields as binding inputs: unresolved `open items` become spec and gate checks for this run, and `learnings` adjust defaults (a headline pattern that converted poorly is not re-shipped; a section that produced signups is not cut without saying so). When `conversion data` exists, Phases 1 through 3 must state explicitly how it changed at least one decision, or state that it changed nothing and why. The `companions` field makes quality attributable: when two runs differ, check what was installed before blaming the pipeline.
|
|
219
|
+
|
|
220
|
+
## Integrity rules
|
|
221
|
+
|
|
222
|
+
These override everything else in this skill:
|
|
223
|
+
|
|
224
|
+
- Never invent testimonials, customer names, logos, star counts, download numbers, or statistics. If the proof inventory is thin, build the page around the proof that exists and tell the user what proof to go collect.
|
|
225
|
+
- Never fabricate technical artifacts or usage scenarios. Two rules, and the second is the one that is easy to miss. First: every command, terminal output, code snippet, config, API response, or file path shown must be real and runnable exactly as shown, or it does not go on the page. Second: never stage a terminal, screenshot, console, or UI that depicts an action the user does not take or output they never see, even when the underlying command or data is real. An internal component the user never runs (a build script, a linter, a scanner the pipeline calls) does not get shown as the user running it. To show the product working, show a real artifact of real use, the actual page it built, a real screenshot, the output the user actually receives, not a reconstruction of one. Real data presented in a styled card (the page's own gate report) is fine; a terminal of a script the user never runs is a staged scenario and fails this rule. A demo of the product itself is held to all of this, and a staged demo is the same class of failure as a fake testimonial.
|
|
226
|
+
- Never make claims about security, privacy, or compliance that the brief does not substantiate.
|
|
227
|
+
- Honest urgency only. Deadlines, caps, and limited seats appear only when they are real.
|
|
228
|
+
|
|
229
|
+
## Scope notes
|
|
230
|
+
|
|
231
|
+
- A "homepage" for a product with an existing multi-page site is still one page; flag site-architecture work separately rather than silently expanding scope.
|
|
232
|
+
- Rewrites of existing pages enter at Phase 1 (re-derive the message architecture, diff against what the current page says). Do not polish sentences on top of a broken structure.
|
|
233
|
+
- New archetypes follow the format in `references/archetypes.md`; add them there.
|