@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.
@@ -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.