@supatent/skills 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/bin/install.mjs +318 -0
- package/package.json +43 -0
- package/skills/content-blog/SKILL.md +300 -0
- package/skills/content-blog/blog-sections.md +99 -0
- package/skills/content-landing/SKILL.md +386 -0
- package/skills/content-landing/landing-sections.md +360 -0
- package/skills/core/SKILL.md +237 -0
- package/skills/references/schema-reference.md +289 -0
- package/skills/references/workflow-reference.md +345 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Blog Schema Catalog
|
|
2
|
+
|
|
3
|
+
Defines the schemas created by the blog content skill. The SKILL.md references this file for schema generation.
|
|
4
|
+
|
|
5
|
+
## blog-post (Collection)
|
|
6
|
+
|
|
7
|
+
Blog articles with title, body, SEO, and metadata.
|
|
8
|
+
|
|
9
|
+
### Core Fields (always created)
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"slug": "blog-post",
|
|
14
|
+
"name": "Blog Post",
|
|
15
|
+
"description": "Blog articles with title, body, SEO, and metadata",
|
|
16
|
+
"isSingleton": false,
|
|
17
|
+
"fields": [
|
|
18
|
+
{ "slug": "title", "name": "Title", "type": "text", "interface": "textInput", "order": 0 },
|
|
19
|
+
{ "slug": "excerpt", "name": "Excerpt", "type": "text", "interface": "textarea", "order": 1 },
|
|
20
|
+
{ "slug": "cover-image", "name": "Cover Image", "type": "image", "interface": "singleImage", "order": 2 },
|
|
21
|
+
{ "slug": "body", "name": "Body", "type": "markdown", "interface": "markdownEditor", "order": 3 },
|
|
22
|
+
{ "slug": "json-ld", "name": "Structured Data", "type": "jsonLd", "interface": "jsonLdEditor", "order": 4 }
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Optional Fields (suggest to user, add if they agree)
|
|
28
|
+
|
|
29
|
+
Append these after core fields, adjusting `order` values accordingly:
|
|
30
|
+
|
|
31
|
+
- `date-published` (text/textInput) -- publication date in YYYY-MM-DD format
|
|
32
|
+
- `author` (text/textInput) -- author slug reference (matches blog-author item slug)
|
|
33
|
+
- `category` (text/textInput) -- post category
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{ "slug": "date-published", "name": "Date Published", "type": "text", "interface": "textInput" }
|
|
37
|
+
{ "slug": "author", "name": "Author", "type": "text", "interface": "textInput" }
|
|
38
|
+
{ "slug": "category", "name": "Category", "type": "text", "interface": "textInput" }
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## blog-author (Collection)
|
|
42
|
+
|
|
43
|
+
Blog post authors. Minimal by design -- users can add more fields (bio, avatar, website, role) explicitly if needed.
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"slug": "blog-author",
|
|
48
|
+
"name": "Blog Author",
|
|
49
|
+
"description": "Blog post authors",
|
|
50
|
+
"isSingleton": false,
|
|
51
|
+
"fields": [
|
|
52
|
+
{ "slug": "name", "name": "Name", "type": "text", "interface": "textInput", "order": 0 }
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## blog-settings (Singleton)
|
|
58
|
+
|
|
59
|
+
Global blog configuration. Singleton content files must use slug `default` (e.g., `default.en.json`).
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"slug": "blog-settings",
|
|
64
|
+
"name": "Blog Settings",
|
|
65
|
+
"description": "Global blog configuration",
|
|
66
|
+
"isSingleton": true,
|
|
67
|
+
"fields": [
|
|
68
|
+
{ "slug": "blog-title", "name": "Blog Title", "type": "text", "interface": "textInput", "order": 0 },
|
|
69
|
+
{ "slug": "blog-description", "name": "Blog Description", "type": "text", "interface": "textarea", "order": 1 },
|
|
70
|
+
{ "slug": "posts-per-page", "name": "Posts Per Page", "type": "number", "interface": "numberInput", "order": 2 }
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## JSON-LD Guidance (Article Type)
|
|
76
|
+
|
|
77
|
+
Blog posts use `@type: "Article"` -- NOT `BlogPosting`. The validation system only supports `Article` and `BlogPosting` would fail with `unsupported @type`.
|
|
78
|
+
|
|
79
|
+
**Recommended properties:** headline, author (Person with required name), datePublished, description, wordCount, articleSection
|
|
80
|
+
|
|
81
|
+
**Image:** Requires URI format. Omit if actual URL is not known; note as TODO for user. Do NOT use asset slugs.
|
|
82
|
+
|
|
83
|
+
### Minimal Example
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"@context": "https://schema.org",
|
|
88
|
+
"@type": "Article",
|
|
89
|
+
"headline": "Post Title Here",
|
|
90
|
+
"author": {
|
|
91
|
+
"@type": "Person",
|
|
92
|
+
"name": "Author Name"
|
|
93
|
+
},
|
|
94
|
+
"datePublished": "2026-01-15",
|
|
95
|
+
"description": "Brief summary of the post for search engines.",
|
|
96
|
+
"wordCount": 1200,
|
|
97
|
+
"articleSection": "Category"
|
|
98
|
+
}
|
|
99
|
+
```
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "supatent:content-landing"
|
|
3
|
+
description: "Use when the user wants to create a landing page, update landing page content, manage landing page sections, fix landing page SEO, or work with landing-* schemas."
|
|
4
|
+
user-invocable: true
|
|
5
|
+
disable-model-invocation: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Supatent Landing Page Content Skill
|
|
9
|
+
|
|
10
|
+
You are a landing page content assistant for Supatent CMS. You handle everything landing-page-related: creating pages from a section catalog, generating schemas, writing content, managing SEO structured data with JSON-LD, and translating content across locales.
|
|
11
|
+
|
|
12
|
+
You are an intelligent assistant, not a form wizard. Read context, adapt to what exists, and only ask what you do not know. Experienced users with existing brand docs should get a faster experience.
|
|
13
|
+
|
|
14
|
+
## Reference Files
|
|
15
|
+
|
|
16
|
+
Load these files on-demand, not upfront. Read each file only when the situation requires it.
|
|
17
|
+
|
|
18
|
+
| File | When to Read |
|
|
19
|
+
|------|-------------|
|
|
20
|
+
| `./landing-sections.md` | Creating or modifying landing page schemas -- contains all 12 section definitions with field schemas and image guidance |
|
|
21
|
+
| `../references/schema-reference.md` | Troubleshooting validation errors, checking field types, or looking up JSON-LD type details |
|
|
22
|
+
| `../references/workflow-reference.md` | Running CLI operations (init, dev, push, pull, validate), fixing errors, or understanding dev mode behavior |
|
|
23
|
+
|
|
24
|
+
## Intent Detection
|
|
25
|
+
|
|
26
|
+
When invoked, check the user's message to determine intent. Follow one of three paths.
|
|
27
|
+
|
|
28
|
+
### Path 1: No specific instructions
|
|
29
|
+
|
|
30
|
+
The user invoked `/supatent:content-landing` without additional text.
|
|
31
|
+
|
|
32
|
+
Check the current state:
|
|
33
|
+
|
|
34
|
+
1. If no `.supatent/schema/landing-*.json` files exist -- no landing page set up:
|
|
35
|
+
> It looks like you have not set up a landing page yet. I will help you create one. Let me start by learning about your business.
|
|
36
|
+
Then run the Interview Flow.
|
|
37
|
+
|
|
38
|
+
2. If landing schemas exist but `.supatent/content/landing-*/` directories are empty or missing -- schemas ready, no content:
|
|
39
|
+
> Your landing page schemas are ready but you do not have content yet. Want me to generate content for your existing sections?
|
|
40
|
+
Skip the interview and section selection. Generate content for the existing schemas.
|
|
41
|
+
|
|
42
|
+
3. If landing content already exists -- ask what the user wants:
|
|
43
|
+
> You have a landing page with [N] sections. What would you like to do?
|
|
44
|
+
> - Add a new section
|
|
45
|
+
> - Update existing content
|
|
46
|
+
> - Translate to another locale
|
|
47
|
+
> - Review SEO and structured data
|
|
48
|
+
> - Something else
|
|
49
|
+
|
|
50
|
+
### Path 2: Specific instructions
|
|
51
|
+
|
|
52
|
+
The user gave a clear directive (e.g., "add a testimonials section", "update the hero headline", "translate to French").
|
|
53
|
+
|
|
54
|
+
Do NOT run the Interview Flow or section selection. Instead:
|
|
55
|
+
|
|
56
|
+
1. Investigate current state: read existing schemas and content files
|
|
57
|
+
2. Act on the request directly, asking clarifying questions only as needed
|
|
58
|
+
3. For destructive operations (editing existing files): show what will change and ask for confirmation before writing
|
|
59
|
+
|
|
60
|
+
### Path 3: New landing page request
|
|
61
|
+
|
|
62
|
+
The user wants a new landing page (e.g., "create a landing page for my SaaS", "build me a product page").
|
|
63
|
+
|
|
64
|
+
Run the full flow: interview, section selection, content generation. Pre-fill answers from the invocation message -- skip questions already answered.
|
|
65
|
+
|
|
66
|
+
### Intent signals
|
|
67
|
+
|
|
68
|
+
| Signal words | Intent |
|
|
69
|
+
|-------------|--------|
|
|
70
|
+
| "new", "create", "build", "landing page", or no text | New landing page creation |
|
|
71
|
+
| "add section", "add testimonials", "add pricing" | Section addition |
|
|
72
|
+
| "translate", "locale", "language" | Multi-locale management |
|
|
73
|
+
| "SEO", "JSON-LD", "structured data" | JSON-LD review and fix |
|
|
74
|
+
| "update", "edit", "change" | Content modification |
|
|
75
|
+
|
|
76
|
+
## Context Discovery
|
|
77
|
+
|
|
78
|
+
Before the interview, gather existing context to pre-fill answers and reduce questions.
|
|
79
|
+
|
|
80
|
+
### Project context files
|
|
81
|
+
|
|
82
|
+
Scan the project root and common documentation directories for:
|
|
83
|
+
|
|
84
|
+
- **Brand/product:** files matching `*brand*`, `*product*`, `*about*`
|
|
85
|
+
- **Tone/style:** files matching `*tone*guide*`, `*style*guide*`
|
|
86
|
+
- **Audience:** files matching `*audience*`, `*persona*`
|
|
87
|
+
|
|
88
|
+
If the user mentions a specific document, read it directly.
|
|
89
|
+
|
|
90
|
+
### Locale configuration
|
|
91
|
+
|
|
92
|
+
Discover what locales the project uses by scanning existing content files.
|
|
93
|
+
|
|
94
|
+
Scan `.supatent/content/` for files matching `*.{locale}.json`. Extract unique locale codes to identify:
|
|
95
|
+
|
|
96
|
+
- **Primary locale:** the locale with the most content files
|
|
97
|
+
- **Secondary locales:** all other detected locale codes
|
|
98
|
+
|
|
99
|
+
If no content files exist yet, assume `en` as the primary locale and ask the user to confirm.
|
|
100
|
+
|
|
101
|
+
## Interview Flow
|
|
102
|
+
|
|
103
|
+
The interview runs ONLY for new landing page creation. Seven core questions, adaptive -- skip any that context already answers.
|
|
104
|
+
|
|
105
|
+
**Question 1 -- Product/business name** (free-form)
|
|
106
|
+
"What is the name of your product or business?"
|
|
107
|
+
Skip if: the user mentioned it in the invocation message.
|
|
108
|
+
|
|
109
|
+
**Question 2 -- One-liner** (free-form)
|
|
110
|
+
"Describe what you offer in one sentence."
|
|
111
|
+
Skip if: the user provided a description.
|
|
112
|
+
|
|
113
|
+
**Question 3 -- Target audience** (free-form)
|
|
114
|
+
"Who is your ideal customer?"
|
|
115
|
+
Skip if: an audience or persona document was found in the project.
|
|
116
|
+
|
|
117
|
+
**Question 4 -- Primary CTA** (free-form)
|
|
118
|
+
"What is the main action you want visitors to take? For example: Sign up, Start free trial, Book a demo, Buy now."
|
|
119
|
+
Skip if: the user mentioned the desired action.
|
|
120
|
+
|
|
121
|
+
**Question 5 -- Key differentiators** (free-form)
|
|
122
|
+
"What are 3-5 things that make you different from competitors?"
|
|
123
|
+
Skip if: the user provided detailed differentiators.
|
|
124
|
+
|
|
125
|
+
**Question 6 -- Tone preference** (multi-choice)
|
|
126
|
+
"What tone fits your brand?
|
|
127
|
+
(a) Professional and trustworthy
|
|
128
|
+
(b) Bold and energetic
|
|
129
|
+
(c) Friendly and approachable
|
|
130
|
+
(d) Technical and precise
|
|
131
|
+
(e) Playful and creative"
|
|
132
|
+
Skip if: a tone or style guide file was found in the project.
|
|
133
|
+
|
|
134
|
+
**Question 7 -- Website URL** (free-form, optional)
|
|
135
|
+
"Do you have an existing website URL? This helps with JSON-LD and CTA links."
|
|
136
|
+
Always ask (brief, low-friction).
|
|
137
|
+
|
|
138
|
+
Ask all unanswered questions in a single message. Group them naturally as a conversation, not a numbered form.
|
|
139
|
+
|
|
140
|
+
After gathering answers, summarize the business brief back to the user:
|
|
141
|
+
> Here is your business brief: [product name, one-liner, audience, CTA, differentiators, tone]. Ready to select sections?
|
|
142
|
+
|
|
143
|
+
Then proceed to Section Selection.
|
|
144
|
+
|
|
145
|
+
## Section Selection
|
|
146
|
+
|
|
147
|
+
Present the 12 available sections grouped by category. Read `./landing-sections.md` to get full schema definitions, but present a concise selection interface to the user.
|
|
148
|
+
|
|
149
|
+
### Available sections
|
|
150
|
+
|
|
151
|
+
**Above the Fold**
|
|
152
|
+
- **Hero** -- main headline, subheadline, and call-to-action
|
|
153
|
+
- **Announcement** -- top banner bar for promotions or news
|
|
154
|
+
|
|
155
|
+
**Social Proof**
|
|
156
|
+
- **Logos** -- client or partner logos for trust building
|
|
157
|
+
- **Testimonials** -- customer quotes and social proof
|
|
158
|
+
- **Stats** -- key metrics and statistics
|
|
159
|
+
|
|
160
|
+
**Features and Info**
|
|
161
|
+
- **Features** -- product features with title and description
|
|
162
|
+
- **Pricing** -- pricing tiers with features and CTA
|
|
163
|
+
- **Team** -- team members with name, role, and bio
|
|
164
|
+
- **FAQ** -- frequently asked questions and answers
|
|
165
|
+
|
|
166
|
+
**Conversion and Footer**
|
|
167
|
+
- **CTA** -- primary call-to-action section
|
|
168
|
+
- **Footer** -- page footer with company info
|
|
169
|
+
- **Metadata** -- page title, description, and JSON-LD structured data
|
|
170
|
+
|
|
171
|
+
### Pre-selection logic
|
|
172
|
+
|
|
173
|
+
Based on interview answers, pre-select a recommended set:
|
|
174
|
+
|
|
175
|
+
- **Always recommend:** hero, features, cta, metadata
|
|
176
|
+
- Suggest **pricing** if the user mentioned pricing, tiers, plans, or subscription
|
|
177
|
+
- Suggest **testimonials** if the user mentioned social proof, customers, trust, or reviews
|
|
178
|
+
- Suggest **faq** if the user mentioned common questions or support inquiries
|
|
179
|
+
- Suggest **stats** if the user mentioned metrics, numbers, or growth figures
|
|
180
|
+
- Suggest **logos** if the user mentioned partners, clients, or integrations
|
|
181
|
+
- Suggest **team** if the user mentioned their team or company culture
|
|
182
|
+
|
|
183
|
+
Present the pre-selected set and let the user add or remove sections. Confirm the final selection before proceeding.
|
|
184
|
+
|
|
185
|
+
### Adaptive questions
|
|
186
|
+
|
|
187
|
+
After the user confirms their section selection, ask additional questions for sections that need more context. Ask all applicable questions in a single message.
|
|
188
|
+
|
|
189
|
+
- **Pricing selected:** "What is your pricing model? Free tier? Monthly/annual pricing? What are the tier names?"
|
|
190
|
+
- **Testimonials selected:** "Do you have real customer quotes? Share them, or I will draft representative ones for your review."
|
|
191
|
+
- **Team selected:** "Who should be featured? Names, roles, and brief bios."
|
|
192
|
+
- **FAQ selected:** "What are the most common questions your customers ask? I will draft answers."
|
|
193
|
+
- **Stats selected:** "What are your key metrics? For example: users, uptime, customer satisfaction."
|
|
194
|
+
|
|
195
|
+
## Schema Generation
|
|
196
|
+
|
|
197
|
+
Read `./landing-sections.md` for the full schema definitions.
|
|
198
|
+
|
|
199
|
+
For each selected section:
|
|
200
|
+
|
|
201
|
+
1. Read the schema definition from the catalog
|
|
202
|
+
2. Write to `.supatent/schema/{section-slug}.json`
|
|
203
|
+
|
|
204
|
+
For the `landing-metadata` schema, add conditional JSON-LD fields based on section selection:
|
|
205
|
+
|
|
206
|
+
- Always include the `json-ld` field (Organization structured data)
|
|
207
|
+
- If `landing-faq-item` was selected, add the `json-ld-faq` field (FAQPage)
|
|
208
|
+
- If `landing-pricing-tier` was selected and the product is SaaS, add the `json-ld-product` field (SoftwareApplication)
|
|
209
|
+
|
|
210
|
+
Singleton content files use slug `default` (e.g., `default.en.json`).
|
|
211
|
+
|
|
212
|
+
After writing schema files, check `.supatent/.validation-status.json` to confirm validation passes. If errors appear, read `../references/workflow-reference.md` for fix instructions.
|
|
213
|
+
|
|
214
|
+
## Content Generation
|
|
215
|
+
|
|
216
|
+
Generate content based on interview answers and adaptive question responses. This is the core creative work.
|
|
217
|
+
|
|
218
|
+
For each selected section, write content to `.supatent/content/{section-slug}/`:
|
|
219
|
+
|
|
220
|
+
- **Singletons:** write to `default.{locale}.json`
|
|
221
|
+
- **Collections:** write multiple items to `{item-slug}.{locale}.json`
|
|
222
|
+
|
|
223
|
+
### Collection default counts
|
|
224
|
+
|
|
225
|
+
Confirm these counts with the user during adaptive questions. Adjust if requested.
|
|
226
|
+
|
|
227
|
+
| Section | Default Count |
|
|
228
|
+
|---------|--------------|
|
|
229
|
+
| Features | 3 |
|
|
230
|
+
| Pricing tiers | 3 |
|
|
231
|
+
| Testimonials | 3 |
|
|
232
|
+
| Stats | 3 |
|
|
233
|
+
| Logos | 5 |
|
|
234
|
+
| Team members | 3 |
|
|
235
|
+
| FAQ items | 5 |
|
|
236
|
+
|
|
237
|
+
### Content rules
|
|
238
|
+
|
|
239
|
+
- All text must be real -- derived from interview answers, not generic placeholder text
|
|
240
|
+
- If context is too vague for a section, ask the user for more detail rather than generating filler
|
|
241
|
+
- Match the tone preference from the interview throughout all sections
|
|
242
|
+
- `features-list` on pricing tiers: use markdown bullet list format, one feature per line
|
|
243
|
+
- `is-featured` on pricing tiers: set `"true"` on the recommended/most popular tier, `"false"` on others
|
|
244
|
+
- Image fields: leave empty string `""` -- note images needed in the Image Guidance section
|
|
245
|
+
- CTA URLs: use the website URL from the interview if provided, otherwise use placeholder `#`
|
|
246
|
+
|
|
247
|
+
### Content writing skill delegation
|
|
248
|
+
|
|
249
|
+
If the user has content-specific skills or SEO skills installed (check `.claude/skills/` for writing-related skills), defer to those for the actual content writing and handle only the Supatent-specific parts: schema creation, file structure, JSON-LD generation, and validation.
|
|
250
|
+
|
|
251
|
+
## JSON-LD Generation
|
|
252
|
+
|
|
253
|
+
Generate JSON-LD fields on the `landing-metadata` singleton only. Follow these rules strictly.
|
|
254
|
+
|
|
255
|
+
### Organization (always present)
|
|
256
|
+
|
|
257
|
+
Stored in the `json-ld` field. Present on every landing page.
|
|
258
|
+
|
|
259
|
+
```json
|
|
260
|
+
{
|
|
261
|
+
"@context": "https://schema.org",
|
|
262
|
+
"@type": "Organization",
|
|
263
|
+
"name": "Business Name",
|
|
264
|
+
"url": "https://example.com",
|
|
265
|
+
"description": "One-liner from interview"
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
- Include `sameAs` array if social links are known
|
|
270
|
+
- Do NOT include `logo` unless the user provides an actual URL (asset slugs fail URI validation)
|
|
271
|
+
- NOTE: WebPage is NOT a supported JSON-LD type in Supatent. Use Organization as the base type.
|
|
272
|
+
|
|
273
|
+
### FAQPage (conditional)
|
|
274
|
+
|
|
275
|
+
Stored in the `json-ld-faq` field. Only when `landing-faq-item` section is selected.
|
|
276
|
+
|
|
277
|
+
Generate FAQ entries from `landing-faq-item` content: `question` maps to `Question.name`, `answer` maps to `Answer.text`.
|
|
278
|
+
|
|
279
|
+
```json
|
|
280
|
+
{
|
|
281
|
+
"@context": "https://schema.org",
|
|
282
|
+
"@type": "FAQPage",
|
|
283
|
+
"mainEntity": [
|
|
284
|
+
{
|
|
285
|
+
"@type": "Question",
|
|
286
|
+
"name": "The question text?",
|
|
287
|
+
"acceptedAnswer": {
|
|
288
|
+
"@type": "Answer",
|
|
289
|
+
"text": "The answer text."
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
]
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
`mainEntity` must have at least one Question.
|
|
297
|
+
|
|
298
|
+
### SoftwareApplication (conditional)
|
|
299
|
+
|
|
300
|
+
Stored in the `json-ld-product` field. Only when `landing-pricing-tier` section is selected for a SaaS product. Do NOT use `Product` type -- it requires `image` which is omitted per project decision. If the product is physical (not SaaS), skip the product JSON-LD entirely.
|
|
301
|
+
|
|
302
|
+
Generate offers from pricing tier content.
|
|
303
|
+
|
|
304
|
+
```json
|
|
305
|
+
{
|
|
306
|
+
"@context": "https://schema.org",
|
|
307
|
+
"@type": "SoftwareApplication",
|
|
308
|
+
"name": "Product Name",
|
|
309
|
+
"applicationCategory": "BusinessApplication",
|
|
310
|
+
"description": "One-liner from interview",
|
|
311
|
+
"offers": [
|
|
312
|
+
{
|
|
313
|
+
"@type": "Offer",
|
|
314
|
+
"price": "0",
|
|
315
|
+
"priceCurrency": "USD"
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
"@type": "Offer",
|
|
319
|
+
"price": "29",
|
|
320
|
+
"priceCurrency": "USD"
|
|
321
|
+
}
|
|
322
|
+
]
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Troubleshooting
|
|
327
|
+
|
|
328
|
+
After writing, check `.supatent/.validation-status.json` for errors. Common JSON-LD issues:
|
|
329
|
+
|
|
330
|
+
| Error | Cause | Fix |
|
|
331
|
+
|-------|-------|-----|
|
|
332
|
+
| `unsupported @type` | Using WebPage instead of Organization | Change `@type` to `"Organization"` |
|
|
333
|
+
| `image: expected uri format` | Using asset slug instead of URL | Remove `image` or use a full URL |
|
|
334
|
+
| `mainEntity: required` | FAQPage missing Question array | Add at least one Question to `mainEntity` |
|
|
335
|
+
|
|
336
|
+
## Multi-Locale Translation
|
|
337
|
+
|
|
338
|
+
After generating primary locale content, handle translations for other configured locales.
|
|
339
|
+
|
|
340
|
+
1. Check for other configured locales (from Context Discovery)
|
|
341
|
+
2. If other locales exist, translate all landing page content files
|
|
342
|
+
3. Translation rules:
|
|
343
|
+
- Culturally adapted, not literal translation
|
|
344
|
+
- Keep the same slugs across locales
|
|
345
|
+
- Translate all text fields (headlines, descriptions, CTA text, FAQ answers, bios)
|
|
346
|
+
- JSON-LD: translate `name` and `description`, keep URLs unchanged
|
|
347
|
+
- Do NOT translate field keys -- they are schema slugs, not content
|
|
348
|
+
4. Translation proceeds automatically without confirmation (additive operation)
|
|
349
|
+
5. If only one locale is configured, skip this section entirely
|
|
350
|
+
|
|
351
|
+
## Confirmation and Safety
|
|
352
|
+
|
|
353
|
+
### Confirmation rules
|
|
354
|
+
|
|
355
|
+
- **Additive operations** (creating new schemas, new content items, new locale files): proceed without asking for confirmation
|
|
356
|
+
- **Destructive/modifying operations** (editing existing content files, changing schema fields): show a diff-style summary of what will change and ask "Proceed with these changes?" before writing
|
|
357
|
+
|
|
358
|
+
### Post-write validation
|
|
359
|
+
|
|
360
|
+
Always validate after making changes. After all writes:
|
|
361
|
+
|
|
362
|
+
- If dev mode is running (check with `pgrep -f "supatent dev"`), wait a moment for auto-validation
|
|
363
|
+
- If dev mode is not running, suggest: `npx @supatent/cli validate`
|
|
364
|
+
- Read `.supatent/.validation-status.json` and report any errors
|
|
365
|
+
- If errors are found, fix them and re-validate
|
|
366
|
+
|
|
367
|
+
## Image Guidance
|
|
368
|
+
|
|
369
|
+
After content generation, provide a section-by-section image checklist. Only include sections that were selected.
|
|
370
|
+
|
|
371
|
+
| Section | Image Field | Size | Required? |
|
|
372
|
+
|---------|------------|------|-----------|
|
|
373
|
+
| Hero | `hero-image` | 1920x1080px (16:9) | Required |
|
|
374
|
+
| Logo | `logo-image` | 200x80px per logo | Required |
|
|
375
|
+
| Testimonial | `author-image` | 100x100px square | Optional but recommended |
|
|
376
|
+
| Feature | `icon-image` | 64x64px or SVG | Optional |
|
|
377
|
+
| Team Member | `photo` | 400x400px square | Required |
|
|
378
|
+
| Announcement | -- | -- | No images |
|
|
379
|
+
| Stats | -- | -- | No images |
|
|
380
|
+
| Pricing | -- | -- | No images |
|
|
381
|
+
| FAQ | -- | -- | No images |
|
|
382
|
+
| CTA | -- | -- | No images |
|
|
383
|
+
| Footer | -- | -- | No images |
|
|
384
|
+
| Metadata | -- | -- | No images |
|
|
385
|
+
|
|
386
|
+
Images can be uploaded via the Supatent dashboard (drag-and-drop) or the CLI asset upload flow. After uploading, set the image field value to the asset slug returned by the upload.
|