@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,360 @@
|
|
|
1
|
+
# Landing Page Section Catalog
|
|
2
|
+
|
|
3
|
+
Defines the schemas created by the landing page content skill. The SKILL.md references this file for schema generation. Each section is either a singleton (one content item) or a collection (multiple items).
|
|
4
|
+
|
|
5
|
+
## Category 1: Above the Fold
|
|
6
|
+
|
|
7
|
+
### landing-hero (Singleton)
|
|
8
|
+
|
|
9
|
+
Main hero section with headline, subheadline, and call-to-action.
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"slug": "landing-hero",
|
|
14
|
+
"name": "Landing Hero",
|
|
15
|
+
"description": "Main hero section with headline, subheadline, and call-to-action",
|
|
16
|
+
"isSingleton": true,
|
|
17
|
+
"fields": [
|
|
18
|
+
{ "slug": "headline", "name": "Headline", "type": "text", "interface": "textInput", "order": 0 },
|
|
19
|
+
{ "slug": "subheadline", "name": "Subheadline", "type": "text", "interface": "textarea", "order": 1 },
|
|
20
|
+
{ "slug": "cta-text", "name": "CTA Text", "type": "text", "interface": "textInput", "order": 2 },
|
|
21
|
+
{ "slug": "cta-url", "name": "CTA URL", "type": "text", "interface": "textInput", "order": 3 },
|
|
22
|
+
{ "slug": "hero-image", "name": "Hero Image", "type": "image", "interface": "singleImage", "order": 4 }
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Image guidance: Hero image: 1920x1080px or 16:9 ratio. Required for visual impact.
|
|
28
|
+
|
|
29
|
+
### landing-announcement (Singleton)
|
|
30
|
+
|
|
31
|
+
Top banner bar for announcements or promotions.
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"slug": "landing-announcement",
|
|
36
|
+
"name": "Landing Announcement",
|
|
37
|
+
"description": "Top banner bar for announcements or promotions",
|
|
38
|
+
"isSingleton": true,
|
|
39
|
+
"fields": [
|
|
40
|
+
{ "slug": "text", "name": "Text", "type": "text", "interface": "textInput", "order": 0 },
|
|
41
|
+
{ "slug": "link-text", "name": "Link Text", "type": "text", "interface": "textInput", "order": 1 },
|
|
42
|
+
{ "slug": "link-url", "name": "Link URL", "type": "text", "interface": "textInput", "order": 2 }
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Image guidance: No images required.
|
|
48
|
+
|
|
49
|
+
## Category 2: Social Proof
|
|
50
|
+
|
|
51
|
+
### landing-logo (Collection)
|
|
52
|
+
|
|
53
|
+
Client or partner logos for trust building.
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"slug": "landing-logo",
|
|
58
|
+
"name": "Landing Logo",
|
|
59
|
+
"description": "Client or partner logos for trust building",
|
|
60
|
+
"isSingleton": false,
|
|
61
|
+
"fields": [
|
|
62
|
+
{ "slug": "name", "name": "Name", "type": "text", "interface": "textInput", "order": 0 },
|
|
63
|
+
{ "slug": "logo-image", "name": "Logo Image", "type": "image", "interface": "singleImage", "order": 1 }
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Default count: 5. Image guidance: Logo image: 200x80px or similar horizontal format. Required per logo.
|
|
69
|
+
|
|
70
|
+
### landing-testimonial (Collection)
|
|
71
|
+
|
|
72
|
+
Customer quotes and social proof.
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"slug": "landing-testimonial",
|
|
77
|
+
"name": "Landing Testimonial",
|
|
78
|
+
"description": "Customer quotes and social proof",
|
|
79
|
+
"isSingleton": false,
|
|
80
|
+
"fields": [
|
|
81
|
+
{ "slug": "quote", "name": "Quote", "type": "text", "interface": "textarea", "order": 0 },
|
|
82
|
+
{ "slug": "author-name", "name": "Author Name", "type": "text", "interface": "textInput", "order": 1 },
|
|
83
|
+
{ "slug": "author-title", "name": "Author Title", "type": "text", "interface": "textInput", "order": 2 },
|
|
84
|
+
{ "slug": "author-company", "name": "Author Company", "type": "text", "interface": "textInput", "order": 3 },
|
|
85
|
+
{ "slug": "author-image", "name": "Author Image", "type": "image", "interface": "singleImage", "order": 4 }
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Default count: 3. Image guidance: Author image: 100x100px square. Optional but recommended.
|
|
91
|
+
|
|
92
|
+
### landing-stat (Collection)
|
|
93
|
+
|
|
94
|
+
Key metrics and statistics.
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"slug": "landing-stat",
|
|
99
|
+
"name": "Landing Stat",
|
|
100
|
+
"description": "Key metrics and statistics",
|
|
101
|
+
"isSingleton": false,
|
|
102
|
+
"fields": [
|
|
103
|
+
{ "slug": "value", "name": "Value", "type": "text", "interface": "textInput", "order": 0 },
|
|
104
|
+
{ "slug": "label", "name": "Label", "type": "text", "interface": "textInput", "order": 1 },
|
|
105
|
+
{ "slug": "description", "name": "Description", "type": "text", "interface": "textInput", "order": 2 }
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Default count: 3. Image guidance: No images required.
|
|
111
|
+
|
|
112
|
+
## Category 3: Features and Info
|
|
113
|
+
|
|
114
|
+
### landing-feature (Collection)
|
|
115
|
+
|
|
116
|
+
Product features with title and description.
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"slug": "landing-feature",
|
|
121
|
+
"name": "Landing Feature",
|
|
122
|
+
"description": "Product features with title and description",
|
|
123
|
+
"isSingleton": false,
|
|
124
|
+
"fields": [
|
|
125
|
+
{ "slug": "title", "name": "Title", "type": "text", "interface": "textInput", "order": 0 },
|
|
126
|
+
{ "slug": "description", "name": "Description", "type": "text", "interface": "textarea", "order": 1 },
|
|
127
|
+
{ "slug": "icon-image", "name": "Icon Image", "type": "image", "interface": "singleImage", "order": 2 }
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Default count: 3. Image guidance: Icon image: 64x64px or SVG icon. Optional.
|
|
133
|
+
|
|
134
|
+
### landing-pricing-tier (Collection)
|
|
135
|
+
|
|
136
|
+
Pricing plans with features and CTA.
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"slug": "landing-pricing-tier",
|
|
141
|
+
"name": "Landing Pricing Tier",
|
|
142
|
+
"description": "Pricing plans with features and CTA",
|
|
143
|
+
"isSingleton": false,
|
|
144
|
+
"fields": [
|
|
145
|
+
{ "slug": "name", "name": "Name", "type": "text", "interface": "textInput", "order": 0 },
|
|
146
|
+
{ "slug": "price", "name": "Price", "type": "number", "interface": "numberInput", "order": 1 },
|
|
147
|
+
{ "slug": "price-period", "name": "Price Period", "type": "text", "interface": "textInput", "order": 2 },
|
|
148
|
+
{ "slug": "description", "name": "Description", "type": "text", "interface": "textarea", "order": 3 },
|
|
149
|
+
{ "slug": "features-list", "name": "Features List", "type": "markdown", "interface": "markdownEditor", "order": 4 },
|
|
150
|
+
{ "slug": "cta-text", "name": "CTA Text", "type": "text", "interface": "textInput", "order": 5 },
|
|
151
|
+
{ "slug": "cta-url", "name": "CTA URL", "type": "text", "interface": "textInput", "order": 6 },
|
|
152
|
+
{ "slug": "is-featured", "name": "Is Featured", "type": "text", "interface": "textInput", "order": 7 }
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Default count: 3. Notes: `features-list` uses markdown with bullet list format (one feature per bullet). `is-featured` uses "true" or "false" as string values (no boolean field type in Supatent). Image guidance: No images required.
|
|
158
|
+
|
|
159
|
+
### landing-team-member (Collection)
|
|
160
|
+
|
|
161
|
+
Team members with name, role, and bio.
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{
|
|
165
|
+
"slug": "landing-team-member",
|
|
166
|
+
"name": "Landing Team Member",
|
|
167
|
+
"description": "Team members with name, role, and bio",
|
|
168
|
+
"isSingleton": false,
|
|
169
|
+
"fields": [
|
|
170
|
+
{ "slug": "name", "name": "Name", "type": "text", "interface": "textInput", "order": 0 },
|
|
171
|
+
{ "slug": "role", "name": "Role", "type": "text", "interface": "textInput", "order": 1 },
|
|
172
|
+
{ "slug": "bio", "name": "Bio", "type": "markdown", "interface": "markdownEditor", "order": 2 },
|
|
173
|
+
{ "slug": "photo", "name": "Photo", "type": "image", "interface": "singleImage", "order": 3 }
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Default count: 3. Image guidance: Photo: 400x400px square. Required for team display.
|
|
179
|
+
|
|
180
|
+
### landing-faq-item (Collection)
|
|
181
|
+
|
|
182
|
+
Frequently asked questions and answers.
|
|
183
|
+
|
|
184
|
+
```json
|
|
185
|
+
{
|
|
186
|
+
"slug": "landing-faq-item",
|
|
187
|
+
"name": "Landing FAQ Item",
|
|
188
|
+
"description": "Frequently asked questions and answers",
|
|
189
|
+
"isSingleton": false,
|
|
190
|
+
"fields": [
|
|
191
|
+
{ "slug": "question", "name": "Question", "type": "text", "interface": "textInput", "order": 0 },
|
|
192
|
+
{ "slug": "answer", "name": "Answer", "type": "markdown", "interface": "markdownEditor", "order": 1 }
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Default count: 5. Image guidance: No images required. FAQ answers use markdown for rich formatting (links, lists, emphasis).
|
|
198
|
+
|
|
199
|
+
## Category 4: Conversion and Footer
|
|
200
|
+
|
|
201
|
+
### landing-cta (Singleton)
|
|
202
|
+
|
|
203
|
+
Primary call-to-action section.
|
|
204
|
+
|
|
205
|
+
```json
|
|
206
|
+
{
|
|
207
|
+
"slug": "landing-cta",
|
|
208
|
+
"name": "Landing CTA",
|
|
209
|
+
"description": "Primary call-to-action section",
|
|
210
|
+
"isSingleton": true,
|
|
211
|
+
"fields": [
|
|
212
|
+
{ "slug": "headline", "name": "Headline", "type": "text", "interface": "textInput", "order": 0 },
|
|
213
|
+
{ "slug": "description", "name": "Description", "type": "text", "interface": "textarea", "order": 1 },
|
|
214
|
+
{ "slug": "cta-text", "name": "CTA Text", "type": "text", "interface": "textInput", "order": 2 },
|
|
215
|
+
{ "slug": "cta-url", "name": "CTA URL", "type": "text", "interface": "textInput", "order": 3 },
|
|
216
|
+
{ "slug": "secondary-cta-text", "name": "Secondary CTA Text", "type": "text", "interface": "textInput", "order": 4 },
|
|
217
|
+
{ "slug": "secondary-cta-url", "name": "Secondary CTA URL", "type": "text", "interface": "textInput", "order": 5 }
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Image guidance: No images required.
|
|
223
|
+
|
|
224
|
+
### landing-footer (Singleton)
|
|
225
|
+
|
|
226
|
+
Page footer with company info.
|
|
227
|
+
|
|
228
|
+
```json
|
|
229
|
+
{
|
|
230
|
+
"slug": "landing-footer",
|
|
231
|
+
"name": "Landing Footer",
|
|
232
|
+
"description": "Page footer with company info",
|
|
233
|
+
"isSingleton": true,
|
|
234
|
+
"fields": [
|
|
235
|
+
{ "slug": "company-name", "name": "Company Name", "type": "text", "interface": "textInput", "order": 0 },
|
|
236
|
+
{ "slug": "tagline", "name": "Tagline", "type": "text", "interface": "textInput", "order": 1 },
|
|
237
|
+
{ "slug": "copyright-text", "name": "Copyright Text", "type": "text", "interface": "textInput", "order": 2 }
|
|
238
|
+
]
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Image guidance: No images required.
|
|
243
|
+
|
|
244
|
+
### landing-metadata (Singleton)
|
|
245
|
+
|
|
246
|
+
Page metadata and structured data for SEO.
|
|
247
|
+
|
|
248
|
+
```json
|
|
249
|
+
{
|
|
250
|
+
"slug": "landing-metadata",
|
|
251
|
+
"name": "Landing Metadata",
|
|
252
|
+
"description": "Page metadata and structured data for SEO",
|
|
253
|
+
"isSingleton": true,
|
|
254
|
+
"fields": [
|
|
255
|
+
{ "slug": "page-title", "name": "Page Title", "type": "text", "interface": "textInput", "order": 0 },
|
|
256
|
+
{ "slug": "page-description", "name": "Page Description", "type": "text", "interface": "textarea", "order": 1 },
|
|
257
|
+
{ "slug": "json-ld", "name": "Organization Data", "type": "jsonLd", "interface": "jsonLdEditor", "order": 2 }
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Conditional JSON-LD fields added based on section selection:
|
|
263
|
+
- If FAQ section is selected, add: `{ "slug": "json-ld-faq", "name": "FAQ Data", "type": "jsonLd", "interface": "jsonLdEditor", "order": 3 }`
|
|
264
|
+
- If pricing section is selected (SaaS product), add: `{ "slug": "json-ld-product", "name": "Product Data", "type": "jsonLd", "interface": "jsonLdEditor", "order": 4 }`
|
|
265
|
+
|
|
266
|
+
Image guidance: No images required.
|
|
267
|
+
|
|
268
|
+
## JSON-LD Guidance
|
|
269
|
+
|
|
270
|
+
The landing-metadata singleton uses JSON-LD structured data fields. Each field stores a complete JSON-LD object.
|
|
271
|
+
|
|
272
|
+
### Organization (always present)
|
|
273
|
+
|
|
274
|
+
Used on every landing page. Stored in the `json-ld` field.
|
|
275
|
+
|
|
276
|
+
- Required: `@context`, `@type`
|
|
277
|
+
- Recommended: `name`, `url`, `description`
|
|
278
|
+
- Optional: `sameAs` (social links array)
|
|
279
|
+
- Do NOT include `logo` unless user provides an actual URL (asset slugs fail URI validation)
|
|
280
|
+
|
|
281
|
+
```json
|
|
282
|
+
{
|
|
283
|
+
"@context": "https://schema.org",
|
|
284
|
+
"@type": "Organization",
|
|
285
|
+
"name": "Company Name",
|
|
286
|
+
"url": "https://example.com",
|
|
287
|
+
"description": "Brief company description.",
|
|
288
|
+
"sameAs": [
|
|
289
|
+
"https://twitter.com/example",
|
|
290
|
+
"https://linkedin.com/company/example"
|
|
291
|
+
]
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### FAQPage (conditional)
|
|
296
|
+
|
|
297
|
+
Only when `landing-faq-item` section is selected. Stored in the `json-ld-faq` field. Generate FAQ entries from landing-faq-item content items.
|
|
298
|
+
|
|
299
|
+
- Required: `@context`, `@type`, `mainEntity` (array of Question objects, min 1)
|
|
300
|
+
- Each Question: `@type: "Question"`, `name`, `acceptedAnswer`
|
|
301
|
+
- Each Answer: `@type: "Answer"`, `text`
|
|
302
|
+
|
|
303
|
+
```json
|
|
304
|
+
{
|
|
305
|
+
"@context": "https://schema.org",
|
|
306
|
+
"@type": "FAQPage",
|
|
307
|
+
"mainEntity": [
|
|
308
|
+
{
|
|
309
|
+
"@type": "Question",
|
|
310
|
+
"name": "What is your product?",
|
|
311
|
+
"acceptedAnswer": {
|
|
312
|
+
"@type": "Answer",
|
|
313
|
+
"text": "Our product helps you do X."
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
]
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### SoftwareApplication (conditional)
|
|
321
|
+
|
|
322
|
+
Only when `landing-pricing-tier` section is selected for a SaaS product. Stored in the `json-ld-product` field. Do NOT use `Product` type -- it requires `image` which conflicts with the no-image decision. If the product is physical (not SaaS), skip the product JSON-LD entirely.
|
|
323
|
+
|
|
324
|
+
- Required: `@context`, `@type`, `name`
|
|
325
|
+
- Recommended: `applicationCategory`, `description`, `offers` (array of Offer objects)
|
|
326
|
+
- Each Offer: `@type: "Offer"`, `price`, `priceCurrency`
|
|
327
|
+
|
|
328
|
+
```json
|
|
329
|
+
{
|
|
330
|
+
"@context": "https://schema.org",
|
|
331
|
+
"@type": "SoftwareApplication",
|
|
332
|
+
"name": "Product Name",
|
|
333
|
+
"applicationCategory": "BusinessApplication",
|
|
334
|
+
"description": "Brief product description.",
|
|
335
|
+
"offers": [
|
|
336
|
+
{
|
|
337
|
+
"@type": "Offer",
|
|
338
|
+
"price": "29",
|
|
339
|
+
"priceCurrency": "USD"
|
|
340
|
+
}
|
|
341
|
+
]
|
|
342
|
+
}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## Section Selection Summary
|
|
346
|
+
|
|
347
|
+
| Section | Type | Default Count | Required Images |
|
|
348
|
+
|---------|------|---------------|-----------------|
|
|
349
|
+
| landing-hero | singleton | 1 | hero-image (1920x1080) |
|
|
350
|
+
| landing-announcement | singleton | 1 | none |
|
|
351
|
+
| landing-logo | collection | 5 | logo-image (200x80) |
|
|
352
|
+
| landing-testimonial | collection | 3 | author-image (100x100, optional) |
|
|
353
|
+
| landing-stat | collection | 3 | none |
|
|
354
|
+
| landing-feature | collection | 3 | icon-image (64x64, optional) |
|
|
355
|
+
| landing-pricing-tier | collection | 3 | none |
|
|
356
|
+
| landing-team-member | collection | 3 | photo (400x400) |
|
|
357
|
+
| landing-faq-item | collection | 5 | none |
|
|
358
|
+
| landing-cta | singleton | 1 | none |
|
|
359
|
+
| landing-footer | singleton | 1 | none |
|
|
360
|
+
| landing-metadata | singleton | 1 | none |
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "supatent:core"
|
|
3
|
+
description: "Use when working with Supatent CMS -- creating schemas, writing content, running CLI commands (init, dev, pull, push, validate), or managing the .supatent/ directory."
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Supatent Core Skill
|
|
8
|
+
|
|
9
|
+
Supatent is an AI-first multi-tenant SaaS CMS. This skill provides the knowledge base for working with Supatent projects: creating and editing schemas, authoring content, running CLI operations, and troubleshooting validation errors.
|
|
10
|
+
|
|
11
|
+
When this skill is active, you have context for all schema field types, file conventions, CLI workflows, and common error patterns. For detailed reference material, load the supporting files listed in the Reference Files section below.
|
|
12
|
+
|
|
13
|
+
## Environment Setup
|
|
14
|
+
|
|
15
|
+
When this skill activates, perform these checks in order. Do not skip any.
|
|
16
|
+
|
|
17
|
+
### 1. Check for project initialization
|
|
18
|
+
|
|
19
|
+
Read `.supatent/config.json` in the current working directory.
|
|
20
|
+
|
|
21
|
+
- **If the file exists:** The project is initialized. Extract `projectSlug` and `convexUrl` for context.
|
|
22
|
+
- **If the file does not exist:** The project has not been initialized. Guide the user through setup:
|
|
23
|
+
```bash
|
|
24
|
+
npx @supatent/cli init
|
|
25
|
+
```
|
|
26
|
+
This creates the `.supatent/` directory with config, credentials, and initial schema/content directories.
|
|
27
|
+
|
|
28
|
+
### 2. Check if dev mode is running
|
|
29
|
+
|
|
30
|
+
Run:
|
|
31
|
+
```bash
|
|
32
|
+
pgrep -f "supatent dev"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- **If a process is found:** Dev mode is active. File changes will be validated and synced automatically.
|
|
36
|
+
- **If no process is found:** Dev mode is not running. Offer the user these options:
|
|
37
|
+
1. Start dev mode in the background: `npx @supatent/cli dev &`
|
|
38
|
+
2. The user starts it themselves in a separate terminal
|
|
39
|
+
3. Fall back to manual validation with `npx @supatent/cli validate` after making changes
|
|
40
|
+
|
|
41
|
+
Dev mode provides automatic validation on file save and real-time sync with the remote project.
|
|
42
|
+
|
|
43
|
+
### 3. Check installed skill version
|
|
44
|
+
|
|
45
|
+
Read the version from `.claude/skills/supatent/.manifest.json` (the `version` field).
|
|
46
|
+
|
|
47
|
+
Then check the latest published version:
|
|
48
|
+
```bash
|
|
49
|
+
npm view @supatent/skills version 2>/dev/null
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
- **If the npm check fails** (no network, package not found): Skip silently and proceed.
|
|
53
|
+
- **If the installed version matches the latest:** No action needed.
|
|
54
|
+
- **If the installed version is older than the latest:** Inform the user:
|
|
55
|
+
> A newer version of the Supatent skills is available (installed: {installed}, latest: {latest}).
|
|
56
|
+
> Update with: `npx @supatent/skills@latest`
|
|
57
|
+
> Note: Claude Code must be restarted after updating for the new skill files to take effect.
|
|
58
|
+
|
|
59
|
+
If the user wants to update, run the command for them.
|
|
60
|
+
|
|
61
|
+
## Quick Reference: Field Types
|
|
62
|
+
|
|
63
|
+
| Type | Interfaces | Value Format |
|
|
64
|
+
|------|-----------|--------------|
|
|
65
|
+
| `text` | `textInput`, `textarea` | Plain string |
|
|
66
|
+
| `number` | `numberInput` | Numeric value |
|
|
67
|
+
| `image` | `singleImage`, `multiImage` | Image reference object(s) |
|
|
68
|
+
| `markdown` | `markdownEditor` | Markdown string |
|
|
69
|
+
| `jsonLd` | `jsonLdEditor` | JSON-LD structured data object |
|
|
70
|
+
|
|
71
|
+
**Interface determines the UI editor**, not the storage format. For example, `text` with `textInput` gives a single-line input; `text` with `textarea` gives a multi-line editor.
|
|
72
|
+
|
|
73
|
+
For full details on field validation rules, constraints, and JSON-LD structured data types, read `../references/schema-reference.md`.
|
|
74
|
+
|
|
75
|
+
## Quick Reference: File Locations
|
|
76
|
+
|
|
77
|
+
All project files live under the `.supatent/` directory:
|
|
78
|
+
|
|
79
|
+
| Path | Purpose |
|
|
80
|
+
|------|---------|
|
|
81
|
+
| `.supatent/config.json` | Project configuration (project slug, URLs) |
|
|
82
|
+
| `.supatent/credentials.json` | API key (gitignored) |
|
|
83
|
+
| `.supatent/schema/{slug}.json` | Schema definitions |
|
|
84
|
+
| `.supatent/content/{schemaSlug}/{itemSlug}.{locale}.json` | Content items |
|
|
85
|
+
| `.supatent/.validation-status.json` | Last validation result |
|
|
86
|
+
| `.supatent/.supatent-lock.json` | Sync state (gitignored) |
|
|
87
|
+
|
|
88
|
+
**Slug rules:**
|
|
89
|
+
- Pattern: `/^[a-z0-9]+(?:-[a-z0-9]+)*$/`
|
|
90
|
+
- Lowercase alphanumeric with hyphens only
|
|
91
|
+
- No leading or trailing hyphens, no consecutive hyphens
|
|
92
|
+
|
|
93
|
+
**Singleton content** must always use the slug `default` (e.g., `content/settings/default.en.json`).
|
|
94
|
+
|
|
95
|
+
## Reference Files
|
|
96
|
+
|
|
97
|
+
Load these files when you need detailed information beyond the quick references above.
|
|
98
|
+
|
|
99
|
+
### Schema details
|
|
100
|
+
|
|
101
|
+
**File:** `../references/schema-reference.md`
|
|
102
|
+
|
|
103
|
+
**Read when:** Creating or modifying schemas, adding fields, choosing field types and interfaces, working with JSON-LD structured data, or checking naming conventions.
|
|
104
|
+
|
|
105
|
+
**Covers:** All field types with validation rules, interface options, field constraints, JSON-LD type catalog, schema naming best practices.
|
|
106
|
+
|
|
107
|
+
### Workflow details
|
|
108
|
+
|
|
109
|
+
**File:** `../references/workflow-reference.md`
|
|
110
|
+
|
|
111
|
+
**Read when:** Running CLI commands (init, dev, pull, push, validate, status, merge), troubleshooting validation errors, resolving sync conflicts, or understanding the content authoring flow.
|
|
112
|
+
|
|
113
|
+
**Covers:** Full CLI command reference, validation error catalog with fixes, sync conflict resolution, JSON-LD authoring guidance, content creation workflow.
|
|
114
|
+
|
|
115
|
+
## Content Creation Skills
|
|
116
|
+
|
|
117
|
+
For structured content creation workflows that include user interviews and multi-locale generation, use the dedicated content skills:
|
|
118
|
+
|
|
119
|
+
- **Blog content:** Invoke `/supatent:content-blog` for blog posts, articles, and editorial content
|
|
120
|
+
- **Landing page content:** Invoke `/supatent:content-landing` for landing pages, marketing pages, and promotional content
|
|
121
|
+
|
|
122
|
+
These skills handle the full content creation workflow: interviewing the user about their content needs, generating schemas with appropriate sections, creating content across all configured locales, and validating the output.
|
|
123
|
+
|
|
124
|
+
The core skill handles everything else -- schema management, CLI operations, general troubleshooting, and any task that does not require a structured content creation interview.
|
|
125
|
+
|
|
126
|
+
## Common Operations
|
|
127
|
+
|
|
128
|
+
### Creating a schema
|
|
129
|
+
|
|
130
|
+
Write a JSON file to `.supatent/schema/{slug}.json`:
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"slug": "blog-post",
|
|
135
|
+
"name": "Blog Post",
|
|
136
|
+
"description": "Blog articles with title, body, and metadata",
|
|
137
|
+
"isSingleton": false,
|
|
138
|
+
"fields": [
|
|
139
|
+
{
|
|
140
|
+
"slug": "title",
|
|
141
|
+
"name": "Title",
|
|
142
|
+
"type": "text",
|
|
143
|
+
"interface": "textInput",
|
|
144
|
+
"order": 0
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"slug": "body",
|
|
148
|
+
"name": "Body",
|
|
149
|
+
"type": "markdown",
|
|
150
|
+
"interface": "markdownEditor",
|
|
151
|
+
"order": 1
|
|
152
|
+
}
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
The filename must match the `slug` field (e.g., `blog-post.json` for slug `blog-post`).
|
|
158
|
+
|
|
159
|
+
### Adding content
|
|
160
|
+
|
|
161
|
+
Write a JSON file to `.supatent/content/{schemaSlug}/{itemSlug}.{locale}.json`:
|
|
162
|
+
|
|
163
|
+
```json
|
|
164
|
+
{
|
|
165
|
+
"title": "My First Post",
|
|
166
|
+
"body": "# Hello World\n\nThis is the body content."
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Field keys must match the field slugs defined in the schema. Each locale gets its own file (e.g., `my-post.en.json`, `my-post.fr.json`).
|
|
171
|
+
|
|
172
|
+
### Validating
|
|
173
|
+
|
|
174
|
+
If dev mode is running, validation happens automatically on file save. Otherwise:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
npx @supatent/cli validate
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Check `.supatent/.validation-status.json` for machine-readable results including error locations and fix suggestions.
|
|
181
|
+
|
|
182
|
+
### Syncing with remote
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# Check what has changed locally vs remotely
|
|
186
|
+
npx @supatent/cli status
|
|
187
|
+
|
|
188
|
+
# Download remote changes
|
|
189
|
+
npx @supatent/cli pull
|
|
190
|
+
|
|
191
|
+
# Upload local changes
|
|
192
|
+
npx @supatent/cli push
|
|
193
|
+
|
|
194
|
+
# Start continuous bidirectional sync
|
|
195
|
+
npx @supatent/cli dev
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Troubleshooting
|
|
199
|
+
|
|
200
|
+
### "Slug mismatch"
|
|
201
|
+
|
|
202
|
+
The filename does not match the `slug` field inside the JSON file. Rename the file or update the slug field so they match.
|
|
203
|
+
|
|
204
|
+
Example: File `my-post.json` must contain `"slug": "my-post"`.
|
|
205
|
+
|
|
206
|
+
### "Invalid interface for type"
|
|
207
|
+
|
|
208
|
+
The `interface` value is not valid for the given `type`. Each field type only supports specific interfaces:
|
|
209
|
+
|
|
210
|
+
- `text` accepts `textInput` or `textarea`
|
|
211
|
+
- `number` accepts `numberInput`
|
|
212
|
+
- `image` accepts `singleImage` or `multiImage`
|
|
213
|
+
- `markdown` accepts `markdownEditor`
|
|
214
|
+
- `jsonLd` accepts `jsonLdEditor`
|
|
215
|
+
|
|
216
|
+
### "Unknown field type"
|
|
217
|
+
|
|
218
|
+
Only five field types are supported: `text`, `number`, `image`, `markdown`, `jsonLd`. Check for typos or capitalization errors (`jsonLd` not `jsonld` or `JsonLd`).
|
|
219
|
+
|
|
220
|
+
### "Singleton must use default slug"
|
|
221
|
+
|
|
222
|
+
Content items for singleton schemas must use the slug `default`. Rename the file to `default.{locale}.json`.
|
|
223
|
+
|
|
224
|
+
### "Duplicate field slugs"
|
|
225
|
+
|
|
226
|
+
Each field within a schema must have a unique `slug`. Check for copy-paste errors in the fields array.
|
|
227
|
+
|
|
228
|
+
### "Validation status file not updating"
|
|
229
|
+
|
|
230
|
+
The file `.supatent/.validation-status.json` is written after each validation run. If it is not updating:
|
|
231
|
+
1. Check that dev mode is running (`pgrep -f "supatent dev"`)
|
|
232
|
+
2. Run validation manually: `npx @supatent/cli validate`
|
|
233
|
+
3. Check file permissions on the `.supatent/` directory
|
|
234
|
+
|
|
235
|
+
### "Connection refused" or "API key invalid"
|
|
236
|
+
|
|
237
|
+
Verify the API key in `.supatent/credentials.json` is correct. Re-run `npx @supatent/cli init` if the project configuration has changed.
|