@friedbotstudio/create-baseline 0.1.0
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 +202 -0
- package/README.md +222 -0
- package/bin/cli.js +247 -0
- package/obj/template/.claude/agents/swarm-worker.md +52 -0
- package/obj/template/.claude/bin/LICENSE +201 -0
- package/obj/template/.claude/bin/NOTICE +48 -0
- package/obj/template/.claude/commands/approve-spec.md +29 -0
- package/obj/template/.claude/commands/approve-swarm.md +27 -0
- package/obj/template/.claude/commands/grant-commit.md +19 -0
- package/obj/template/.claude/commands/init-project.md +191 -0
- package/obj/template/.claude/hooks/artifact_template_guard.sh +141 -0
- package/obj/template/.claude/hooks/consent_gate_grant.sh +89 -0
- package/obj/template/.claude/hooks/destructive_cmd_guard.sh +42 -0
- package/obj/template/.claude/hooks/env_guard.sh +36 -0
- package/obj/template/.claude/hooks/git_commit_guard.sh +93 -0
- package/obj/template/.claude/hooks/harness_continuation.sh +121 -0
- package/obj/template/.claude/hooks/lib/__pycache__/resume_writer.cpython-314.pyc +0 -0
- package/obj/template/.claude/hooks/lib/common.sh +328 -0
- package/obj/template/.claude/hooks/lib/resume_writer.py +341 -0
- package/obj/template/.claude/hooks/lint_runner.sh +55 -0
- package/obj/template/.claude/hooks/memory_pre_compact.sh +36 -0
- package/obj/template/.claude/hooks/memory_session_start.sh +244 -0
- package/obj/template/.claude/hooks/memory_stop.sh +173 -0
- package/obj/template/.claude/hooks/plantuml_syntax_guard.sh +161 -0
- package/obj/template/.claude/hooks/process_lifecycle_guard.sh +89 -0
- package/obj/template/.claude/hooks/setup_guard.sh +50 -0
- package/obj/template/.claude/hooks/spec_approval_guard.sh +81 -0
- package/obj/template/.claude/hooks/spec_design_calls_guard.sh +183 -0
- package/obj/template/.claude/hooks/spec_diagram_presence_guard.sh +141 -0
- package/obj/template/.claude/hooks/swarm_approval_guard.sh +39 -0
- package/obj/template/.claude/hooks/swarm_boundary_guard.sh +136 -0
- package/obj/template/.claude/hooks/tdd_order_guard.sh +176 -0
- package/obj/template/.claude/hooks/test_runner.sh +75 -0
- package/obj/template/.claude/hooks/tests/fixtures/ac008_byte_equal_reference.txt +12 -0
- package/obj/template/.claude/hooks/tests/memory_session_start_test.sh +285 -0
- package/obj/template/.claude/hooks/track_guard.sh +127 -0
- package/obj/template/.claude/hooks/verify_pass_guard.sh +88 -0
- package/obj/template/.claude/memory/README.md +108 -0
- package/obj/template/.claude/memory/_pending.md +15 -0
- package/obj/template/.claude/memory/_resume.md +12 -0
- package/obj/template/.claude/memory/conventions.md +26 -0
- package/obj/template/.claude/memory/decisions.md +29 -0
- package/obj/template/.claude/memory/landmarks.md +26 -0
- package/obj/template/.claude/memory/landmines.md +27 -0
- package/obj/template/.claude/memory/libraries.md +27 -0
- package/obj/template/.claude/memory/pending-questions.md +28 -0
- package/obj/template/.claude/project.json +221 -0
- package/obj/template/.claude/settings.json +110 -0
- package/obj/template/.claude/skills/archive/SKILL.md +48 -0
- package/obj/template/.claude/skills/archive/archive.sh +145 -0
- package/obj/template/.claude/skills/audit-baseline/SKILL.md +80 -0
- package/obj/template/.claude/skills/audit-baseline/audit.sh +919 -0
- package/obj/template/.claude/skills/brd/SKILL.md +44 -0
- package/obj/template/.claude/skills/brd/template.md +83 -0
- package/obj/template/.claude/skills/chore/SKILL.md +99 -0
- package/obj/template/.claude/skills/claude-automation-recommender/LICENSE +202 -0
- package/obj/template/.claude/skills/claude-automation-recommender/NOTICE +69 -0
- package/obj/template/.claude/skills/claude-automation-recommender/SKILL.md +358 -0
- package/obj/template/.claude/skills/claude-automation-recommender/references/hooks-patterns.md +226 -0
- package/obj/template/.claude/skills/claude-automation-recommender/references/mcp-servers.md +263 -0
- package/obj/template/.claude/skills/claude-automation-recommender/references/plugins-reference.md +98 -0
- package/obj/template/.claude/skills/claude-automation-recommender/references/skills-reference.md +408 -0
- package/obj/template/.claude/skills/claude-automation-recommender/references/subagent-templates.md +181 -0
- package/obj/template/.claude/skills/code-structure/SKILL.md +204 -0
- package/obj/template/.claude/skills/commit/SKILL.md +21 -0
- package/obj/template/.claude/skills/copywriting/SKILL.md +252 -0
- package/obj/template/.claude/skills/copywriting/evals/evals.json +111 -0
- package/obj/template/.claude/skills/copywriting/references/ai-writing-detection.md +200 -0
- package/obj/template/.claude/skills/copywriting/references/copy-frameworks.md +344 -0
- package/obj/template/.claude/skills/copywriting/references/natural-transitions.md +272 -0
- package/obj/template/.claude/skills/design-ui/SKILL.md +175 -0
- package/obj/template/.claude/skills/design-ui/references/design-vs-development.md +89 -0
- package/obj/template/.claude/skills/design-ui/references/intent-table.md +64 -0
- package/obj/template/.claude/skills/design-ui/references/orchestration.md +121 -0
- package/obj/template/.claude/skills/design-ui/references/state-machine.md +125 -0
- package/obj/template/.claude/skills/document/SKILL.md +66 -0
- package/obj/template/.claude/skills/documentation/SKILL.md +50 -0
- package/obj/template/.claude/skills/harness/SKILL.md +169 -0
- package/obj/template/.claude/skills/humanizer/SKILL.md +489 -0
- package/obj/template/.claude/skills/humanizer/references/ai-writing-detection.md +208 -0
- package/obj/template/.claude/skills/impeccable/PROJECT_NOTES.md +22 -0
- package/obj/template/.claude/skills/impeccable/SKILL.md +153 -0
- package/obj/template/.claude/skills/impeccable/agents/openai.yaml +4 -0
- package/obj/template/.claude/skills/impeccable/reference/adapt.md +190 -0
- package/obj/template/.claude/skills/impeccable/reference/animate.md +173 -0
- package/obj/template/.claude/skills/impeccable/reference/audit.md +134 -0
- package/obj/template/.claude/skills/impeccable/reference/bolder.md +113 -0
- package/obj/template/.claude/skills/impeccable/reference/brand.md +104 -0
- package/obj/template/.claude/skills/impeccable/reference/clarify.md +174 -0
- package/obj/template/.claude/skills/impeccable/reference/cognitive-load.md +106 -0
- package/obj/template/.claude/skills/impeccable/reference/color-and-contrast.md +105 -0
- package/obj/template/.claude/skills/impeccable/reference/colorize.md +154 -0
- package/obj/template/.claude/skills/impeccable/reference/craft.md +138 -0
- package/obj/template/.claude/skills/impeccable/reference/critique.md +213 -0
- package/obj/template/.claude/skills/impeccable/reference/delight.md +302 -0
- package/obj/template/.claude/skills/impeccable/reference/distill.md +111 -0
- package/obj/template/.claude/skills/impeccable/reference/document.md +427 -0
- package/obj/template/.claude/skills/impeccable/reference/extract.md +70 -0
- package/obj/template/.claude/skills/impeccable/reference/harden.md +347 -0
- package/obj/template/.claude/skills/impeccable/reference/heuristics-scoring.md +234 -0
- package/obj/template/.claude/skills/impeccable/reference/interaction-design.md +195 -0
- package/obj/template/.claude/skills/impeccable/reference/layout.md +141 -0
- package/obj/template/.claude/skills/impeccable/reference/live.md +513 -0
- package/obj/template/.claude/skills/impeccable/reference/motion-design.md +99 -0
- package/obj/template/.claude/skills/impeccable/reference/onboard.md +234 -0
- package/obj/template/.claude/skills/impeccable/reference/optimize.md +258 -0
- package/obj/template/.claude/skills/impeccable/reference/overdrive.md +130 -0
- package/obj/template/.claude/skills/impeccable/reference/personas.md +178 -0
- package/obj/template/.claude/skills/impeccable/reference/polish.md +232 -0
- package/obj/template/.claude/skills/impeccable/reference/product.md +62 -0
- package/obj/template/.claude/skills/impeccable/reference/quieter.md +99 -0
- package/obj/template/.claude/skills/impeccable/reference/responsive-design.md +114 -0
- package/obj/template/.claude/skills/impeccable/reference/shape.md +136 -0
- package/obj/template/.claude/skills/impeccable/reference/spatial-design.md +100 -0
- package/obj/template/.claude/skills/impeccable/reference/teach.md +137 -0
- package/obj/template/.claude/skills/impeccable/reference/typeset.md +124 -0
- package/obj/template/.claude/skills/impeccable/reference/typography.md +159 -0
- package/obj/template/.claude/skills/impeccable/reference/ux-writing.md +107 -0
- package/obj/template/.claude/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
- package/obj/template/.claude/skills/impeccable/scripts/command-metadata.json +94 -0
- package/obj/template/.claude/skills/impeccable/scripts/design-parser.mjs +820 -0
- package/obj/template/.claude/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/obj/template/.claude/skills/impeccable/scripts/is-generated.mjs +69 -0
- package/obj/template/.claude/skills/impeccable/scripts/live-accept.mjs +465 -0
- package/obj/template/.claude/skills/impeccable/scripts/live-browser.js +4684 -0
- package/obj/template/.claude/skills/impeccable/scripts/live-inject.mjs +436 -0
- package/obj/template/.claude/skills/impeccable/scripts/live-poll.mjs +187 -0
- package/obj/template/.claude/skills/impeccable/scripts/live-server.mjs +679 -0
- package/obj/template/.claude/skills/impeccable/scripts/live-wrap.mjs +395 -0
- package/obj/template/.claude/skills/impeccable/scripts/live.mjs +247 -0
- package/obj/template/.claude/skills/impeccable/scripts/load-context.mjs +93 -0
- package/obj/template/.claude/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/obj/template/.claude/skills/impeccable/scripts/pin.mjs +214 -0
- package/obj/template/.claude/skills/implement/SKILL.md +83 -0
- package/obj/template/.claude/skills/intake/SKILL.md +46 -0
- package/obj/template/.claude/skills/intake/template.md +61 -0
- package/obj/template/.claude/skills/integrate/SKILL.md +62 -0
- package/obj/template/.claude/skills/memory-flush/SKILL.md +172 -0
- package/obj/template/.claude/skills/memory-flush/sweep.py +286 -0
- package/obj/template/.claude/skills/memory-flush/tests/run.sh +327 -0
- package/obj/template/.claude/skills/prose/SKILL.md +119 -0
- package/obj/template/.claude/skills/rca/SKILL.md +42 -0
- package/obj/template/.claude/skills/rca/template.md +83 -0
- package/obj/template/.claude/skills/research/SKILL.md +75 -0
- package/obj/template/.claude/skills/scenario/SKILL.md +64 -0
- package/obj/template/.claude/skills/scout/SKILL.md +72 -0
- package/obj/template/.claude/skills/security/SKILL.md +75 -0
- package/obj/template/.claude/skills/simplify/SKILL.md +67 -0
- package/obj/template/.claude/skills/spec/SKILL.md +69 -0
- package/obj/template/.claude/skills/spec/template.md +274 -0
- package/obj/template/.claude/skills/spec-diagram-review/SKILL.md +81 -0
- package/obj/template/.claude/skills/spec-lint/SKILL.md +55 -0
- package/obj/template/.claude/skills/spec-lint/lint.sh +218 -0
- package/obj/template/.claude/skills/spec-render/SKILL.md +45 -0
- package/obj/template/.claude/skills/spec-render/render.sh +109 -0
- package/obj/template/.claude/skills/spec-traceability-review/SKILL.md +72 -0
- package/obj/template/.claude/skills/swarm-dispatch/SKILL.md +212 -0
- package/obj/template/.claude/skills/swarm-dispatch/swarm_merge.sh +154 -0
- package/obj/template/.claude/skills/swarm-plan/SKILL.md +90 -0
- package/obj/template/.claude/skills/swarm-plan/validate.sh +181 -0
- package/obj/template/.claude/skills/tdd/SKILL.md +100 -0
- package/obj/template/.claude/skills/technical-tutorials/SKILL.md +569 -0
- package/obj/template/.claude/skills/technical-tutorials/references/audience-context-README.md +53 -0
- package/obj/template/.claude/skills/technical-tutorials/references/audience-context.md +246 -0
- package/obj/template/.claude/skills/technical-tutorials/references/audience-example.md +175 -0
- package/obj/template/.claude/skills/technical-tutorials/references/audience-template.md +152 -0
- package/obj/template/.claude/skills/triage/SKILL.md +55 -0
- package/obj/template/.claude/skills/verify/SKILL.md +74 -0
- package/obj/template/.mcp.json +24 -0
- package/obj/template/CLAUDE.md +327 -0
- package/obj/template/docs/init/seed.md +585 -0
- package/obj/template/manifest.json +214 -0
- package/package.json +48 -0
- package/src/.mcp.template.json +24 -0
- package/src/.npmrc.template +2 -0
- package/src/CLAUDE.template.md +327 -0
- package/src/agents/swarm-worker.template.md +51 -0
- package/src/cli/conflict.js +31 -0
- package/src/cli/doctor.js +152 -0
- package/src/cli/install.js +93 -0
- package/src/cli/io.js +27 -0
- package/src/cli/manifest.js +38 -0
- package/src/cli/mcp.js +54 -0
- package/src/cli/merge.js +107 -0
- package/src/cli/plantuml.js +121 -0
- package/src/cli/util.js +10 -0
- package/src/memory/_pending.template.md +15 -0
- package/src/memory/_resume.template.md +12 -0
- package/src/memory/conventions.template.md +26 -0
- package/src/memory/decisions.template.md +29 -0
- package/src/memory/landmarks.template.md +26 -0
- package/src/memory/landmines.template.md +27 -0
- package/src/memory/libraries.template.md +27 -0
- package/src/memory/pending-questions.template.md +28 -0
- package/src/project.template.json +221 -0
- package/src/seed.template.md +585 -0
- package/src/settings.template.json +110 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-structure
|
|
3
|
+
owner: baseline
|
|
4
|
+
description: MANDATORY skill for ALL code generation. Enforces top-down composition, consistent abstraction layers, and proper module hierarchy. Apply every time you write or modify code — in any language — no exceptions.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Code Structure Rules
|
|
8
|
+
|
|
9
|
+
Apply these rules every time you write or modify code, in any language. This is not optional.
|
|
10
|
+
|
|
11
|
+
## Abstraction Layer Model
|
|
12
|
+
|
|
13
|
+
All modules belong to one of three layers. Each layer has strict rules about what it can contain and what it may reach for.
|
|
14
|
+
|
|
15
|
+
| Layer | Purpose | Composes From | Must Not Contain |
|
|
16
|
+
|-------|---------|---------------|------------------|
|
|
17
|
+
| **Orchestration** | Assembles the top-level flow. The entry point a reader hits first. | Domain modules, Foundation modules (rarely, and only for obviously-cross-cutting utilities) | Raw primitives (inline HTTP calls, SQL strings, regex, file I/O, math); implementation details of any domain module |
|
|
18
|
+
| **Domain** | Business logic for one responsibility. Named after the capability, not the technology. | Foundation modules; other Domain modules when a genuine dependency exists | Raw primitives that would make the module bound to infrastructure (wrap them in Foundation instead) |
|
|
19
|
+
| **Foundation** | Primitives, adapters, utilities. The bedrock everything else is made of. | Language stdlib, third-party libs, other Foundation modules | Nothing restricted here — this is where the raw stuff lives |
|
|
20
|
+
|
|
21
|
+
### Layer mappings per language family
|
|
22
|
+
|
|
23
|
+
The layer names are universal; the concrete file types differ per stack:
|
|
24
|
+
|
|
25
|
+
| Stack | Orchestration | Domain | Foundation |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| React/TSX | `pages/` / `app/` routes | `features/<domain>/` | `components/ui/`, `components/layout/`, `lib/` |
|
|
28
|
+
| Node/Express | `routes/`, `server.ts` entry | `services/<domain>/` | `lib/`, `utils/`, `db/` |
|
|
29
|
+
| Python/FastAPI | `main.py`, `api/routes/` | `<domain>/service.py` | `<domain>/repo.py`, `common/`, `adapters/` |
|
|
30
|
+
| Python CLI | `cli.py` command entry | `<command>/logic.py` | `<command>/io.py`, `common/` |
|
|
31
|
+
| Go service | `cmd/<app>/main.go`, handlers | `internal/<domain>/` | `pkg/` utilities, `internal/store/` |
|
|
32
|
+
| Rust CLI | `main.rs`, subcommand entry | `src/<domain>/` | `src/util/`, `src/io/` |
|
|
33
|
+
|
|
34
|
+
Not in this table? Map by the same principle: **Orchestration files are the table-of-contents; Domain files carry the business logic; Foundation files provide primitives and adapters**.
|
|
35
|
+
|
|
36
|
+
### Layer Rules
|
|
37
|
+
|
|
38
|
+
1. **Orchestration** — pure composition. Reads like a table of contents. If a section needs logic beyond assembly, extract it to Domain. No inline business logic, no raw primitives, no fixed strings that belong elsewhere.
|
|
39
|
+
2. **Domain** — composed from Foundation. Express business rules in names. Do not reach for raw infrastructure (HTTP, SQL, filesystem, time, randomness) directly — wrap through Foundation.
|
|
40
|
+
3. **Foundation** — the layer where the stack shows through. SQL, HTTP clients, Tailwind classes, regex, datetime handling — all legitimately here.
|
|
41
|
+
|
|
42
|
+
## Core Principles
|
|
43
|
+
|
|
44
|
+
1. **Write top-down, but reuse first.** Start with how you want the entry point to read. Before creating a new module, check the registry (see below). If a similar one exists, open it and extend it with backward-compatible changes rather than creating a duplicate. Only create new modules when nothing fits.
|
|
45
|
+
2. **One abstraction level per composition site.** Every sibling at a given call site (siblings in a JSX tree, statements in a function, items in a pipeline, methods chained together) should be at the same abstraction level. If a named call sits next to a raw primitive, the abstraction is broken — extract the primitive.
|
|
46
|
+
3. **Step-over / step-into.** Reading a file should work like a debugger. At the current level, you "step over" each named call (understand what it does from its name). To see how it works, you "step into" its definition. Each step-into reveals exactly one level deeper.
|
|
47
|
+
4. **Compose, don't inline.** Instead of writing code directly, identify patterns first, build them as units, then assemble. For pattern identification, refer to https://refactoring.guru/design-patterns for established solutions. This is composition — not premature abstraction.
|
|
48
|
+
5. **DRY emerges from structure.** Do not force DRY. If you follow the layer model and compose correctly, reuse happens naturally.
|
|
49
|
+
6. **Comments become unnecessary.** If the code needs a comment to explain *what* it does, the abstraction is wrong. Names and composition should convey meaning. Comments for *why* — non-obvious constraints, workarounds, hidden invariants — are still valid.
|
|
50
|
+
7. **Refactoring is a separate concern.** If a module grows too large or complex, apply design patterns (see https://refactoring.guru/design-patterns) to restructure it during the `/simplify` review stage — not during initial composition.
|
|
51
|
+
|
|
52
|
+
## Module Registry
|
|
53
|
+
|
|
54
|
+
Before creating any new module, scan the codebase for reusable matches:
|
|
55
|
+
|
|
56
|
+
1. **Search** — Glob for existing modules in the correct layer (e.g., `src/**/*.tsx`, `internal/**/*.go`, `<pkg>/**/*.py`). The filesystem is the registry.
|
|
57
|
+
2. **Match** — Check if any existing module serves a similar purpose (same layer, similar inputs/outputs, overlapping responsibility).
|
|
58
|
+
3. **Extend or create**:
|
|
59
|
+
- **Match found** — Open it. Add backward-compatible options/variants to support the new use case. Do not fork or duplicate.
|
|
60
|
+
- **No match** — Create a new module in the correct layer directory.
|
|
61
|
+
4. **Register** — After creating a new module, it is automatically part of the registry (the filesystem is the registry). No separate manifest needed.
|
|
62
|
+
|
|
63
|
+
## Detection Rules
|
|
64
|
+
|
|
65
|
+
Apply these checks when writing or reviewing code — regardless of language:
|
|
66
|
+
|
|
67
|
+
| Signal | Problem | Fix |
|
|
68
|
+
|--------|---------|-----|
|
|
69
|
+
| Orchestration file contains raw primitives (inline HTML attributes, SQL strings, HTTP requests, formatting logic) | Orchestration layer is leaking into Foundation | Extract the primitive into a Foundation module; the orchestration should call a name, not a raw primitive |
|
|
70
|
+
| Orchestration file defines local inner functions/classes | Domain logic hiding in the orchestration file | Move to a Domain module |
|
|
71
|
+
| A loop/map/pipeline body contains more than one level of JSX / logic / formatting | Mixed abstraction — the per-item shape is inline | Extract the body into a named Domain/Foundation call |
|
|
72
|
+
| Siblings in a call site mix named calls with raw primitives | Broken abstraction level | Wrap the primitives into a named call at the same layer as the others |
|
|
73
|
+
| A module file is longer than ~80 lines of substantive code | Too many concerns in one module | Split into composed sub-modules following the layer model |
|
|
74
|
+
| Domain module directly uses `<section>`, `<div>`, raw SQL, raw HTTP, `os.path`, `time.now()`, etc. | Domain should compose from Foundation, not raw infrastructure | Introduce or use a Foundation module that wraps it |
|
|
75
|
+
| A name describes *how* (`formatWithRegex`, `httpClient`, `SQLBuilder`) at the Orchestration layer | Implementation leaked into the name | Rename to describe *what* (`format<Thing>`, `<domain>Client`, `<domain>Query`) — the Foundation wrapper owns the how |
|
|
76
|
+
|
|
77
|
+
## Examples
|
|
78
|
+
|
|
79
|
+
### Example A — TSX: inline list details (BAD)
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
<Section>
|
|
83
|
+
{items.map((entry) => (
|
|
84
|
+
<div key={entry.id}>
|
|
85
|
+
<div>
|
|
86
|
+
<h1>{entry.title}</h1>
|
|
87
|
+
<p>{entry.subtitle}</p>
|
|
88
|
+
</div>
|
|
89
|
+
<div>
|
|
90
|
+
{entry.tags.map((tag) => (
|
|
91
|
+
<span key={tag.id}>{tag.label}</span>
|
|
92
|
+
))}
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
))}
|
|
96
|
+
</Section>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Problem:** the `.map()` body contains two abstraction levels — iteration *and* item rendering.
|
|
100
|
+
|
|
101
|
+
### Example A — Extracted (GOOD)
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
<Section>
|
|
105
|
+
{items.map((entry) => (
|
|
106
|
+
<ProductCard key={entry.id} item={entry} />
|
|
107
|
+
))}
|
|
108
|
+
</Section>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
`ProductCard` is a Domain module; its internals use Foundation (UI/layout) modules. The Orchestration site reads as a blueprint.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### Example B — Python service: inline raw primitives (BAD)
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
# orders/service.py — Domain module, but reaching for raw primitives
|
|
119
|
+
def create_order(user_id: str, sku: str, qty: int) -> str:
|
|
120
|
+
conn = psycopg2.connect(os.environ["DB_URL"])
|
|
121
|
+
cur = conn.cursor()
|
|
122
|
+
cur.execute(
|
|
123
|
+
"INSERT INTO orders (user_id, sku, qty, created_at) "
|
|
124
|
+
"VALUES (%s, %s, %s, now()) RETURNING id",
|
|
125
|
+
(user_id, sku, qty),
|
|
126
|
+
)
|
|
127
|
+
order_id = cur.fetchone()[0]
|
|
128
|
+
conn.commit()
|
|
129
|
+
requests.post(os.environ["WEBHOOK_URL"], json={"order_id": order_id})
|
|
130
|
+
return order_id
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Problem:** a Domain function directly handles a DB connection, SQL, and HTTP — three Foundation concerns inlined. Siblings in the function body are at wildly different abstraction levels.
|
|
134
|
+
|
|
135
|
+
### Example B — Extracted (GOOD)
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
# orders/service.py — Domain module
|
|
139
|
+
def create_order(user_id: str, sku: str, qty: int) -> str:
|
|
140
|
+
order_id = orders_repo.insert(user_id=user_id, sku=sku, qty=qty)
|
|
141
|
+
webhooks.notify_order_created(order_id)
|
|
142
|
+
return order_id
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
`orders_repo` and `webhooks` are Foundation modules. The Domain reads as three intent-level statements; the raw primitives live one layer down and are tested there.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
### Example C — Go HTTP handler: broken abstraction in Orchestration (BAD)
|
|
150
|
+
|
|
151
|
+
```go
|
|
152
|
+
// cmd/api/main.go — Orchestration
|
|
153
|
+
func createOrder(w http.ResponseWriter, r *http.Request) {
|
|
154
|
+
var body struct { SKU string; Qty int }
|
|
155
|
+
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
|
|
156
|
+
http.Error(w, "bad json", 400); return
|
|
157
|
+
}
|
|
158
|
+
rows, _ := db.Query("INSERT INTO orders (sku, qty) VALUES ($1, $2) RETURNING id",
|
|
159
|
+
body.SKU, body.Qty)
|
|
160
|
+
// ... more raw SQL, HTTP, JSON wiring ...
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Problem:** the Orchestration handler mixes JSON decoding, SQL, error formatting — every layer is inlined at the top.
|
|
165
|
+
|
|
166
|
+
### Example C — Extracted (GOOD)
|
|
167
|
+
|
|
168
|
+
```go
|
|
169
|
+
func createOrder(w http.ResponseWriter, r *http.Request) {
|
|
170
|
+
cmd, err := orders.DecodeCreate(r)
|
|
171
|
+
if err != nil { http.Error(w, err.Error(), 400); return }
|
|
172
|
+
id, err := orders.Create(cmd)
|
|
173
|
+
if err != nil { http.Error(w, err.Error(), 500); return }
|
|
174
|
+
json.NewEncoder(w).Encode(map[string]string{"id": id})
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
The handler is a 4-line table-of-contents: decode, create, respond. `orders` is the Domain module; its internals use Foundation (DB adapter, JSON codec) modules.
|
|
179
|
+
|
|
180
|
+
## Directory Structure
|
|
181
|
+
|
|
182
|
+
Place modules according to their layer. The names of directories depend on your stack's conventions, but the three layers are universal:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
<project>/
|
|
186
|
+
├── <orchestration>/ # pages, routes, main entries, CLI commands
|
|
187
|
+
├── <domain>/ # features / services / use-cases — business logic
|
|
188
|
+
│ └── <capability>/ # one directory per domain capability
|
|
189
|
+
└── <foundation>/ # primitives, adapters, utilities
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Create directories as needed — do not create empty directories in advance. When a module is created, place it in the layer it belongs to. If a directory doesn't exist yet, create it at that point.
|
|
193
|
+
|
|
194
|
+
### Placement Rules
|
|
195
|
+
|
|
196
|
+
- Uses only primitives (HTML+CSS, stdlib, raw SQL, raw HTTP clients, math) → **Foundation**
|
|
197
|
+
- Composes Foundation modules to express one domain capability → **Domain**
|
|
198
|
+
- Composes Domain modules to express an end-to-end flow or entry point → **Orchestration**
|
|
199
|
+
- Shared across domains without domain logic of its own → **Foundation**
|
|
200
|
+
- **Domain and Foundation modules do not live inside Orchestration files.** Every module gets its own file in the correct directory.
|
|
201
|
+
|
|
202
|
+
## Applies to
|
|
203
|
+
|
|
204
|
+
Every language, every stack, every file type you may write or modify. The detection rules are phrased for JSX because of the original UI context, but the signals translate: a Python function with inline SQL, a Go handler with inline JSON decoding, a Rust `main` with inline regex — all the same category of violation. Use the principles; adapt the vocabulary.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: commit
|
|
3
|
+
owner: baseline
|
|
4
|
+
description: Workflow Phase 11 — Commit Preparation and Execution. Stages and commits the work. Requires `/grant-commit` first (Git Commit Guard enforces a 5-min consent window).
|
|
5
|
+
argument-hint: "[optional commit message; otherwise drafted from the spec/intake]"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Prereq: `archive` in `completed` (i.e., Phase 10.5 has moved all slug artifacts to `docs/archive/<date>/<slug>/`) AND a valid consent token at `.claude/state/commit_consent` (the Git Commit Guard hook enforces this independently).
|
|
9
|
+
|
|
10
|
+
**Applicability.** This skill applies only when the project is a git repository. Non-git projects auto-except `commit` at `/triage` time (CLAUDE.md Article IV); the workflow ends after `/archive`.
|
|
11
|
+
|
|
12
|
+
Steps:
|
|
13
|
+
|
|
14
|
+
0. **Git-repo precheck.** Run `git rev-parse --is-inside-work-tree 2>/dev/null`. If exit non-zero, exit cleanly with: "Not a git repository — `/commit` is inapplicable. Per CLAUDE.md Article IV, `commit` is auto-excepted on non-git projects; the workflow ended at `/archive`. Persistence outside git is your responsibility." Do not run any subsequent step.
|
|
15
|
+
1. **Archive `workflow.json` itself.** This is the final piece of the archival bundle, held back until now so phase-ordering checks worked up through this point. Read `.claude/state/workflow.json` to get the slug, then move the file into the already-existing archive bundle: `docs/archive/<date>/<slug>/workflow.json`. Use the bundle's `<date>` directory (the one `/archive` created — inspect `docs/archive/` to find the most recent bundle matching the slug).
|
|
16
|
+
2. Verify workflow prereq: `archive` is the final non-commit entry in `completed`; no open consent gates remain.
|
|
17
|
+
3. `git status` + `git diff --stat` to confirm the change set. The diff now includes: production code changes + archive bundle additions + the workflow.json move. Stage named paths explicitly (never `git add -A` / `git add .` — seed.md forbids it).
|
|
18
|
+
4. Draft the commit message from the spec + diff. Conventional-style prefix (`feat:` / `fix:` / `refactor:` / `docs:` / `test:`) followed by a 1-line summary and a short body explaining the WHY. The subject line is a fixed-register one-liner — leave it alone. The body is reviewer-facing prose — pass it through `Skill(humanizer)` before step 5 so AI-writing tells (em-dash overuse, rule of three, inflated verbs, vague attributions) get scrubbed. Keep the brief tight: tell humanizer the register is "factual reviewer-facing commit body — describe the diff faithfully, do not invent rationale, preserve any spec quotes verbatim".
|
|
19
|
+
5. Run `git commit` with the message via HEREDOC. The Git Commit Guard hook will verify consent. If consent is missing/expired, stop and ask the user to run `/grant-commit`.
|
|
20
|
+
6. Do NOT run `git push`, `git commit --amend`, or pass `--no-verify`/`--no-gpg-sign` unless the user explicitly named the operation in their current request.
|
|
21
|
+
7. Append `"commit"` to `completed` — but note this only matters for logs; the workflow.json is now in the archive and the live `.claude/state/workflow.json` no longer exists. Report the commit SHA to the user.
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: copywriting
|
|
3
|
+
owner: baseline
|
|
4
|
+
description: When the user wants to write, rewrite, or improve marketing copy for any page — including homepage, landing pages, pricing pages, feature pages, about pages, or product pages. Also use when the user says "write copy for," "improve this copy," "rewrite this page," "marketing copy," "headline help," "CTA copy," "value proposition," "tagline," "subheadline," "hero section copy," "above the fold," "this copy is weak," "make this more compelling," or "help me describe my product." Use this whenever someone is working on website text that needs to persuade or convert. For email copy, see email-sequence. For popup copy, see popup-cro. For editing existing copy, see copy-editing.
|
|
5
|
+
metadata:
|
|
6
|
+
version: 1.1.0
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Copywriting
|
|
10
|
+
|
|
11
|
+
You are an expert conversion copywriter. Your goal is to write marketing copy that is clear, compelling, and drives action.
|
|
12
|
+
|
|
13
|
+
## Before Writing
|
|
14
|
+
|
|
15
|
+
Gather this context (ask if not provided):
|
|
16
|
+
|
|
17
|
+
### 1. Page Purpose
|
|
18
|
+
- What type of page? (homepage, landing page, pricing, feature, about)
|
|
19
|
+
- What is the ONE primary action you want visitors to take?
|
|
20
|
+
|
|
21
|
+
### 2. Audience
|
|
22
|
+
- Who is the ideal customer?
|
|
23
|
+
- What problem are they trying to solve?
|
|
24
|
+
- What objections or hesitations do they have?
|
|
25
|
+
- What language do they use to describe their problem?
|
|
26
|
+
|
|
27
|
+
### 3. Product/Offer
|
|
28
|
+
- What are you selling or offering?
|
|
29
|
+
- What makes it different from alternatives?
|
|
30
|
+
- What's the key transformation or outcome?
|
|
31
|
+
- Any proof points (numbers, testimonials, case studies)?
|
|
32
|
+
|
|
33
|
+
### 4. Context
|
|
34
|
+
- Where is traffic coming from? (ads, organic, email)
|
|
35
|
+
- What do visitors already know before arriving?
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Copywriting Principles
|
|
40
|
+
|
|
41
|
+
### Clarity Over Cleverness
|
|
42
|
+
If you have to choose between clear and creative, choose clear.
|
|
43
|
+
|
|
44
|
+
### Benefits Over Features
|
|
45
|
+
Features: What it does. Benefits: What that means for the customer.
|
|
46
|
+
|
|
47
|
+
### Specificity Over Vagueness
|
|
48
|
+
- Vague: "Save time on your workflow"
|
|
49
|
+
- Specific: "Cut your weekly reporting from 4 hours to 15 minutes"
|
|
50
|
+
|
|
51
|
+
### Customer Language Over Company Language
|
|
52
|
+
Use words your customers use. Mirror voice-of-customer from reviews, interviews, support tickets.
|
|
53
|
+
|
|
54
|
+
### One Idea Per Section
|
|
55
|
+
Each section should advance one argument. Build a logical flow down the page.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Writing Style Rules
|
|
60
|
+
|
|
61
|
+
### Core Principles
|
|
62
|
+
|
|
63
|
+
1. **Simple over complex** — "Use" not "utilize," "help" not "facilitate"
|
|
64
|
+
2. **Specific over vague** — Avoid "streamline," "optimize," "innovative"
|
|
65
|
+
3. **Active over passive** — "We generate reports" not "Reports are generated"
|
|
66
|
+
4. **Confident over qualified** — Remove "almost," "very," "really"
|
|
67
|
+
5. **Show over tell** — Describe the outcome instead of using adverbs
|
|
68
|
+
6. **Honest over sensational** — Fabricated statistics or testimonials erode trust and create legal liability
|
|
69
|
+
|
|
70
|
+
### Quick Quality Check
|
|
71
|
+
|
|
72
|
+
- Jargon that could confuse outsiders?
|
|
73
|
+
- Sentences trying to do too much?
|
|
74
|
+
- Passive voice constructions?
|
|
75
|
+
- Exclamation points? (remove them)
|
|
76
|
+
- Marketing buzzwords without substance?
|
|
77
|
+
|
|
78
|
+
For thorough line-by-line review, use the **copy-editing** skill after your draft (upstream — not in this baseline; do the line-by-line review inline if needed).
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Best Practices
|
|
83
|
+
|
|
84
|
+
### Be Direct
|
|
85
|
+
Get to the point. Don't bury the value in qualifications.
|
|
86
|
+
|
|
87
|
+
❌ Slack lets you share files instantly, from documents to images, directly in your conversations
|
|
88
|
+
|
|
89
|
+
✅ Need to share a screenshot? Send as many documents, images, and audio files as your heart desires.
|
|
90
|
+
|
|
91
|
+
### Use Rhetorical Questions
|
|
92
|
+
Questions engage readers and make them think about their own situation.
|
|
93
|
+
- "Hate returning stuff to Amazon?"
|
|
94
|
+
- "Tired of chasing approvals?"
|
|
95
|
+
|
|
96
|
+
### Use Analogies When Helpful
|
|
97
|
+
Analogies make abstract concepts concrete and memorable.
|
|
98
|
+
|
|
99
|
+
### Pepper in Humor (When Appropriate)
|
|
100
|
+
Puns and wit make copy memorable—but only if it fits the brand and doesn't undermine clarity.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Page Structure Framework
|
|
105
|
+
|
|
106
|
+
### Above the Fold
|
|
107
|
+
|
|
108
|
+
**Headline**
|
|
109
|
+
- Your single most important message
|
|
110
|
+
- Communicate core value proposition
|
|
111
|
+
- Specific > generic
|
|
112
|
+
|
|
113
|
+
**Example formulas:**
|
|
114
|
+
- "{Achieve outcome} without {pain point}"
|
|
115
|
+
- "The {category} for {audience}"
|
|
116
|
+
- "Never {unpleasant event} again"
|
|
117
|
+
- "{Question highlighting main pain point}"
|
|
118
|
+
|
|
119
|
+
**For comprehensive headline formulas**: See [references/copy-frameworks.md](references/copy-frameworks.md)
|
|
120
|
+
|
|
121
|
+
**For natural transition phrases**: See [references/natural-transitions.md](references/natural-transitions.md)
|
|
122
|
+
|
|
123
|
+
**Subheadline**
|
|
124
|
+
- Expands on headline
|
|
125
|
+
- Adds specificity
|
|
126
|
+
- 1-2 sentences max
|
|
127
|
+
|
|
128
|
+
**Primary CTA**
|
|
129
|
+
- Action-oriented button text
|
|
130
|
+
- Communicate what they get: "Start Free Trial" > "Sign Up"
|
|
131
|
+
|
|
132
|
+
### Core Sections
|
|
133
|
+
|
|
134
|
+
| Section | Purpose |
|
|
135
|
+
|---------|---------|
|
|
136
|
+
| Social Proof | Build credibility (logos, stats, testimonials) |
|
|
137
|
+
| Problem/Pain | Show you understand their situation |
|
|
138
|
+
| Solution/Benefits | Connect to outcomes (3-5 key benefits) |
|
|
139
|
+
| How It Works | Reduce perceived complexity (3-4 steps) |
|
|
140
|
+
| Objection Handling | FAQ, comparisons, guarantees |
|
|
141
|
+
| Final CTA | Recap value, repeat CTA, risk reversal |
|
|
142
|
+
|
|
143
|
+
**For detailed section types and page templates**: See [references/copy-frameworks.md](references/copy-frameworks.md)
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## CTA Copy Guidelines
|
|
148
|
+
|
|
149
|
+
**Weak CTAs (avoid):**
|
|
150
|
+
- Submit, Sign Up, Learn More, Click Here, Get Started
|
|
151
|
+
|
|
152
|
+
**Strong CTAs (use):**
|
|
153
|
+
- Start Free Trial
|
|
154
|
+
- Get [Specific Thing]
|
|
155
|
+
- See [Product] in Action
|
|
156
|
+
- Create Your First [Thing]
|
|
157
|
+
- Download the Guide
|
|
158
|
+
|
|
159
|
+
**Formula:** [Action Verb] + [What They Get] + [Qualifier if needed]
|
|
160
|
+
|
|
161
|
+
Examples:
|
|
162
|
+
- "Start My Free Trial"
|
|
163
|
+
- "Get the Complete Checklist"
|
|
164
|
+
- "See Pricing for My Team"
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Page-Specific Guidance
|
|
169
|
+
|
|
170
|
+
### Homepage
|
|
171
|
+
- Serve multiple audiences without being generic
|
|
172
|
+
- Lead with broadest value proposition
|
|
173
|
+
- Provide clear paths for different visitor intents
|
|
174
|
+
|
|
175
|
+
### Landing Page
|
|
176
|
+
- Single message, single CTA
|
|
177
|
+
- Match headline to ad/traffic source
|
|
178
|
+
- Complete argument on one page
|
|
179
|
+
|
|
180
|
+
### Pricing Page
|
|
181
|
+
- Help visitors choose the right plan
|
|
182
|
+
- Address "which is right for me?" anxiety
|
|
183
|
+
- Make recommended plan obvious
|
|
184
|
+
|
|
185
|
+
### Feature Page
|
|
186
|
+
- Connect feature → benefit → outcome
|
|
187
|
+
- Show use cases and examples
|
|
188
|
+
- Clear path to try or buy
|
|
189
|
+
|
|
190
|
+
### About Page
|
|
191
|
+
- Tell the story of why you exist
|
|
192
|
+
- Connect mission to customer benefit
|
|
193
|
+
- Still include a CTA
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Voice and Tone
|
|
198
|
+
|
|
199
|
+
Before writing, establish:
|
|
200
|
+
|
|
201
|
+
**Formality level:**
|
|
202
|
+
- Casual/conversational
|
|
203
|
+
- Professional but friendly
|
|
204
|
+
- Formal/enterprise
|
|
205
|
+
|
|
206
|
+
**Brand personality:**
|
|
207
|
+
- Playful or serious?
|
|
208
|
+
- Bold or understated?
|
|
209
|
+
- Technical or accessible?
|
|
210
|
+
|
|
211
|
+
Maintain consistency, but adjust intensity:
|
|
212
|
+
- Headlines can be bolder
|
|
213
|
+
- Body copy should be clearer
|
|
214
|
+
- CTAs should be action-oriented
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Output Format
|
|
219
|
+
|
|
220
|
+
When writing copy, provide:
|
|
221
|
+
|
|
222
|
+
### Page Copy
|
|
223
|
+
Organized by section:
|
|
224
|
+
- Headline, Subheadline, CTA
|
|
225
|
+
- Section headers and body copy
|
|
226
|
+
- Secondary CTAs
|
|
227
|
+
|
|
228
|
+
### Annotations
|
|
229
|
+
For key elements, explain:
|
|
230
|
+
- Why you made this choice
|
|
231
|
+
- What principle it applies
|
|
232
|
+
|
|
233
|
+
### Alternatives
|
|
234
|
+
For headlines and CTAs, provide 2-3 options:
|
|
235
|
+
- Option A: [copy] — [rationale]
|
|
236
|
+
- Option B: [copy] — [rationale]
|
|
237
|
+
|
|
238
|
+
### Meta Content (if relevant)
|
|
239
|
+
- Page title (for SEO)
|
|
240
|
+
- Meta description
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Related Skills
|
|
245
|
+
|
|
246
|
+
These five are upstream companion skills (from the `claude-code-setup` plugin family) and **do not ship with this baseline**. Listed for reference only — for the capabilities they describe, ask the user inline or install the plugin separately.
|
|
247
|
+
|
|
248
|
+
- **copy-editing**: For polishing existing copy (use after your draft)
|
|
249
|
+
- **page-cro**: If page structure/strategy needs work, not just copy
|
|
250
|
+
- **email-sequence**: For email copywriting
|
|
251
|
+
- **popup-cro**: For popup and modal copy
|
|
252
|
+
- **ab-test-setup**: To test copy variations
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "copywriting",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Write homepage copy for a SaaS tool that automates employee onboarding. Target audience is HR directors at mid-size companies (200-2000 employees). Main differentiator is that it integrates with all major HRIS systems and cuts onboarding time from 2 weeks to 2 days.",
|
|
7
|
+
"expected_output": "Should check for product-marketing-context.md first. Should write full page copy organized by section: Headline, Subheadline, CTA (above the fold), then Social Proof, Problem/Pain, Solution/Benefits, How It Works, Objection Handling, and Final CTA. Should follow copywriting principles: clarity over cleverness, benefits over features, specificity (use the '2 weeks to 2 days' stat), customer language. Headline should communicate core value proposition. CTAs should be action-oriented ('Start Free Trial' not 'Submit'). Should provide 2-3 headline alternatives with rationale. Should include annotations explaining key copy choices. Should include meta content (SEO page title and meta description).",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Checks for product-marketing-context.md",
|
|
10
|
+
"Writes full page copy organized by section",
|
|
11
|
+
"Includes Headline, Subheadline, and CTA above the fold",
|
|
12
|
+
"Includes Social Proof, Problem/Pain, Solution/Benefits, How It Works sections",
|
|
13
|
+
"Uses the '2 weeks to 2 days' specificity in copy",
|
|
14
|
+
"CTAs are action-oriented, not generic",
|
|
15
|
+
"Provides 2-3 headline alternatives with rationale",
|
|
16
|
+
"Includes annotations explaining copy choices",
|
|
17
|
+
"Includes meta content (SEO title and meta description)"
|
|
18
|
+
],
|
|
19
|
+
"files": []
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": 2,
|
|
23
|
+
"prompt": "Rewrite this headline: 'An Innovative AI-Powered Platform for Streamlined Business Operations' — it's for a B2B SaaS tool that helps small businesses manage invoicing and payments.",
|
|
24
|
+
"expected_output": "Should identify problems: jargon ('innovative,' 'AI-powered,' 'streamlined,' 'business operations'), too vague, company language not customer language. Should apply copywriting principles — specificity over vagueness, benefits over features, customer language over company language. Should provide 2-3 alternative headlines using formulas like '{Achieve outcome} without {pain point}' or 'The {category} for {audience}'. Each alternative should include rationale. Should also suggest a subheadline that adds specificity.",
|
|
25
|
+
"assertions": [
|
|
26
|
+
"Identifies jargon in original headline",
|
|
27
|
+
"Identifies vagueness as a problem",
|
|
28
|
+
"Identifies company language vs customer language issue",
|
|
29
|
+
"Provides 2-3 alternative headlines",
|
|
30
|
+
"Alternatives use headline formulas from the skill",
|
|
31
|
+
"Each alternative includes rationale",
|
|
32
|
+
"Suggests a subheadline"
|
|
33
|
+
],
|
|
34
|
+
"files": []
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": 3,
|
|
38
|
+
"prompt": "i need copy for my pricing page. we have three plans: starter ($29/mo), pro ($79/mo), business ($199/mo). it's a social media scheduling tool for marketers",
|
|
39
|
+
"expected_output": "Should trigger on the casual phrasing. Should ask or infer audience context. Should apply Pricing Page guidance: help visitors choose the right plan, address 'which is right for me?' anxiety, make recommended plan obvious. Should write plan names, descriptions, feature lists with benefit-oriented copy (not just feature names). Should include a page headline that addresses the pricing decision. CTAs should be specific per plan. Should handle objection handling (FAQ copy). Should provide alternatives for key elements.",
|
|
40
|
+
"assertions": [
|
|
41
|
+
"Triggers on casual phrasing",
|
|
42
|
+
"Applies Pricing Page guidance",
|
|
43
|
+
"Addresses 'which plan is right for me' anxiety",
|
|
44
|
+
"Makes recommended plan obvious",
|
|
45
|
+
"Writes benefit-oriented feature copy, not just feature names",
|
|
46
|
+
"Includes page headline",
|
|
47
|
+
"CTAs are specific per plan",
|
|
48
|
+
"Includes FAQ or objection handling copy",
|
|
49
|
+
"Provides alternatives for key elements"
|
|
50
|
+
],
|
|
51
|
+
"files": []
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": 4,
|
|
55
|
+
"prompt": "Write copy for our About page. We're a 3-person startup that built a developer tool for database migrations. Founded because we kept losing data during migrations at our last jobs. Tone should be professional but human.",
|
|
56
|
+
"expected_output": "Should apply About Page guidance: tell the story of why you exist, connect mission to customer benefit, still include a CTA. Should adapt voice and tone to 'professional but human' as specified. Should tell the founder origin story authentically. Should connect the personal pain to the customer's pain. Should include a CTA even on the About page. Copy should follow style rules: active voice, confident, specific. Should NOT be overly corporate or generic.",
|
|
57
|
+
"assertions": [
|
|
58
|
+
"Applies About Page guidance",
|
|
59
|
+
"Tells the story of why the company exists",
|
|
60
|
+
"Connects mission to customer benefit",
|
|
61
|
+
"Includes a CTA",
|
|
62
|
+
"Adapts tone to professional but human",
|
|
63
|
+
"Uses the founder origin story",
|
|
64
|
+
"Connects personal pain to customer pain",
|
|
65
|
+
"Uses active voice",
|
|
66
|
+
"Avoids corporate jargon"
|
|
67
|
+
],
|
|
68
|
+
"files": []
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": 5,
|
|
72
|
+
"prompt": "Can you improve this CTA? We currently have 'Learn More' on our feature page for our analytics dashboard product.",
|
|
73
|
+
"expected_output": "Should immediately identify 'Learn More' as a weak CTA per the guidelines. Should apply the CTA formula: [Action Verb] + [What They Get] + [Qualifier]. Should provide 2-3 strong alternatives like 'See the Dashboard in Action,' 'Start Your Free Trial,' or 'Explore Analytics Features.' Each alternative should include rationale and context for when it works best. Should also consider CTA hierarchy — whether this is a primary or secondary CTA, and suggest complementary CTAs if relevant.",
|
|
74
|
+
"assertions": [
|
|
75
|
+
"Identifies 'Learn More' as a weak CTA",
|
|
76
|
+
"Applies the CTA formula from the skill",
|
|
77
|
+
"Provides 2-3 strong alternatives",
|
|
78
|
+
"Each alternative includes rationale",
|
|
79
|
+
"Considers CTA hierarchy (primary vs secondary)",
|
|
80
|
+
"Suggests complementary CTAs"
|
|
81
|
+
],
|
|
82
|
+
"files": []
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": 6,
|
|
86
|
+
"prompt": "Write me a 5-email welcome sequence for new trial users of our project management tool.",
|
|
87
|
+
"expected_output": "Should recognize this is an email copywriting task, not page copywriting. Should defer to or cross-reference the email-sequence skill, which specifically handles email sequences, drip campaigns, and lifecycle emails. May provide brief general guidance but should make clear that email-sequence is the right skill for this task.",
|
|
88
|
+
"assertions": [
|
|
89
|
+
"Recognizes this as email sequence work",
|
|
90
|
+
"References or defers to email-sequence skill",
|
|
91
|
+
"Does not attempt to write a full email sequence using page copywriting patterns"
|
|
92
|
+
],
|
|
93
|
+
"files": []
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": 7,
|
|
97
|
+
"prompt": "Review this copy and tell me what's wrong: 'We are extremely excited to announce our revolutionary, cutting-edge platform that will totally transform how businesses optimize their workflows! Sign up now!!'",
|
|
98
|
+
"expected_output": "Should apply the Quick Quality Check. Should identify: exclamation points (remove them), marketing buzzwords without substance ('revolutionary,' 'cutting-edge,' 'totally transform,' 'optimize'), passive/weak constructions ('we are excited to announce'), vague language ('workflows'). Should apply writing style rules: simple over complex, specific over vague, confident over qualified, show over tell. Should rewrite the copy following these principles. Should provide 2-3 alternatives.",
|
|
99
|
+
"assertions": [
|
|
100
|
+
"Identifies exclamation point overuse",
|
|
101
|
+
"Identifies marketing buzzwords without substance",
|
|
102
|
+
"Identifies vague language",
|
|
103
|
+
"Applies writing style rules",
|
|
104
|
+
"Rewrites the copy following principles",
|
|
105
|
+
"Provides alternatives",
|
|
106
|
+
"Result is specific, clear, and jargon-free"
|
|
107
|
+
],
|
|
108
|
+
"files": []
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
}
|