@pagesmith/core 0.2.0 → 0.3.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.
Files changed (57) hide show
  1. package/REFERENCE.md +281 -0
  2. package/dist/ai/index.d.mts +3 -2
  3. package/dist/ai/index.d.mts.map +1 -1
  4. package/dist/ai/index.mjs +454 -79
  5. package/dist/ai/index.mjs.map +1 -1
  6. package/dist/assets/index.mjs +1 -1
  7. package/dist/{assets-bX08zEJm.mjs → assets-DXiWF_KI.mjs} +1 -1
  8. package/dist/{assets-bX08zEJm.mjs.map → assets-DXiWF_KI.mjs.map} +1 -1
  9. package/dist/{content-config-wW-3r5gG.d.mts → content-config-Bfe4W9us.d.mts} +3 -3
  10. package/dist/{content-config-wW-3r5gG.d.mts.map → content-config-Bfe4W9us.d.mts.map} +1 -1
  11. package/dist/{content-layer-DWdgdBeI.mjs → content-layer-DPK1EmfY.mjs} +84 -47
  12. package/dist/content-layer-DPK1EmfY.mjs.map +1 -0
  13. package/dist/css/index.d.mts +1 -1
  14. package/dist/css/index.mjs +1 -1
  15. package/dist/{css-ekIt2Fdb.mjs → css-BneO430t.mjs} +5 -4
  16. package/dist/css-BneO430t.mjs.map +1 -0
  17. package/dist/{heading-Dhvzlay-.d.mts → heading-BpDXnl-7.d.mts} +1 -1
  18. package/dist/{heading-Dhvzlay-.d.mts.map → heading-BpDXnl-7.d.mts.map} +1 -1
  19. package/dist/{index-D79hUFbK.d.mts → index-BBYkDxwI.d.mts} +1 -1
  20. package/dist/{index-D79hUFbK.d.mts.map → index-BBYkDxwI.d.mts.map} +1 -1
  21. package/dist/index-Bg9srb5U.d.mts +13 -0
  22. package/dist/index-Bg9srb5U.d.mts.map +1 -0
  23. package/dist/{index-DpRBzO8Q.d.mts → index-CbOKbkjJ.d.mts} +3 -3
  24. package/dist/index-CbOKbkjJ.d.mts.map +1 -0
  25. package/dist/{index-Dbsw1QON.d.mts → index-YXQxMV6J.d.mts} +5 -3
  26. package/dist/{index-Dbsw1QON.d.mts.map → index-YXQxMV6J.d.mts.map} +1 -1
  27. package/dist/index.d.mts +18 -12
  28. package/dist/index.d.mts.map +1 -1
  29. package/dist/index.mjs +6 -7
  30. package/dist/index.mjs.map +1 -1
  31. package/dist/loaders/index.d.mts +3 -3
  32. package/dist/loaders/index.mjs +2 -2
  33. package/dist/{loaders-Bla48ZN9.mjs → loaders-Cf-BXf2L.mjs} +10 -2
  34. package/dist/{loaders-Bla48ZN9.mjs.map → loaders-Cf-BXf2L.mjs.map} +1 -1
  35. package/dist/markdown/index.d.mts +2 -2
  36. package/dist/markdown/index.mjs +1 -1
  37. package/dist/{markdown-Cj5X26FL.mjs → markdown-CyrHoDhP.mjs} +37 -9
  38. package/dist/markdown-CyrHoDhP.mjs.map +1 -0
  39. package/dist/schemas/index.d.mts +3 -3
  40. package/dist/schemas/index.mjs +1 -1
  41. package/dist/{schemas-BZEPTGWs.mjs → schemas-UL4ynWsA.mjs} +1 -1
  42. package/dist/{schemas-BZEPTGWs.mjs.map → schemas-UL4ynWsA.mjs.map} +1 -1
  43. package/dist/{types-B-V5qemH.d.mts → types-Cn52sdoq.d.mts} +1 -1
  44. package/dist/{types-B-V5qemH.d.mts.map → types-Cn52sdoq.d.mts.map} +1 -1
  45. package/dist/vite/index.d.mts +2 -2
  46. package/dist/vite/index.d.mts.map +1 -1
  47. package/dist/vite/index.mjs +15 -8
  48. package/dist/vite/index.mjs.map +1 -1
  49. package/package.json +3 -3
  50. package/dist/content-layer-DWdgdBeI.mjs.map +0 -1
  51. package/dist/convert-XdGgNqH0.mjs +0 -27
  52. package/dist/convert-XdGgNqH0.mjs.map +0 -1
  53. package/dist/css-ekIt2Fdb.mjs.map +0 -1
  54. package/dist/index-CeNDTM-y.d.mts +0 -7
  55. package/dist/index-CeNDTM-y.d.mts.map +0 -1
  56. package/dist/index-DpRBzO8Q.d.mts.map +0 -1
  57. package/dist/markdown-Cj5X26FL.mjs.map +0 -1
package/REFERENCE.md ADDED
@@ -0,0 +1,281 @@
1
+ # @pagesmith/core — AI Reference
2
+
3
+ Link this file from your project's CLAUDE.md or AGENTS.md to give AI assistants a comprehensive reference for `@pagesmith/core`.
4
+
5
+ ```markdown
6
+ <!-- In your CLAUDE.md or AGENTS.md -->
7
+ For the full @pagesmith/core API reference, see: node_modules/@pagesmith/core/REFERENCE.md
8
+ ```
9
+
10
+ ---
11
+
12
+ ## Overview
13
+
14
+ `@pagesmith/core` is a file-based content toolkit for Vite. It provides schema-validated content collections, lazy markdown rendering with Expressive Code syntax highlighting, a server-side JSX runtime, CSS bundles, and Vite plugins for framework integrations.
15
+
16
+ ESM only (`"type": "module"`). Node 18+.
17
+
18
+ ## Content Layer API
19
+
20
+ ```ts
21
+ import { createContentLayer, defineCollection, defineConfig, z } from '@pagesmith/core'
22
+
23
+ const posts = defineCollection({
24
+ loader: 'markdown',
25
+ directory: 'content/posts',
26
+ schema: z.object({
27
+ title: z.string(),
28
+ description: z.string(),
29
+ date: z.coerce.date(),
30
+ tags: z.array(z.string()).default([]),
31
+ draft: z.boolean().optional().default(false),
32
+ }),
33
+ })
34
+
35
+ const layer = createContentLayer(defineConfig({ collections: { posts } }))
36
+ const entries = await layer.getCollection('posts')
37
+ const rendered = await entries[0]?.render()
38
+ // rendered.html, rendered.headings, rendered.readTime
39
+ ```
40
+
41
+ ### ContentLayer methods
42
+
43
+ | Method | Description |
44
+ |---|---|
45
+ | `createContentLayer(config)` | Create a content layer from a config object |
46
+ | `layer.getCollection(name)` | Load all entries in a collection (cached) |
47
+ | `layer.getEntry(collection, slug)` | Get a single entry by slug |
48
+ | `layer.convert(markdown, options?)` | Convert raw markdown to HTML outside collections |
49
+ | `layer.validate(collection?)` | Run all validators and return results |
50
+ | `layer.invalidate(collection, slug)` | Cache-bust a single entry |
51
+ | `layer.invalidateCollection(name)` | Cache-bust an entire collection |
52
+ | `layer.invalidateAll()` | Cache-bust all collections |
53
+
54
+ ### ContentEntry properties
55
+
56
+ | Property | Type | Description |
57
+ |---|---|---|
58
+ | `slug` | `string` | URL-friendly identifier |
59
+ | `collection` | `string` | Collection name |
60
+ | `filePath` | `string` | Absolute source path |
61
+ | `data` | `T` | Validated data (typed by your Zod schema) |
62
+ | `rawContent` | `string` | Raw markdown body (markdown loader only) |
63
+ | `render(options?)` | `Promise<RenderedContent>` | Lazy markdown-to-HTML (cached) |
64
+ | `clearRenderCache()` | `void` | Force re-render on next call |
65
+
66
+ ### RenderedContent
67
+
68
+ | Property | Type | Description |
69
+ |---|---|---|
70
+ | `html` | `string` | Rendered HTML |
71
+ | `headings` | `Heading[]` | `{ depth, text, slug }` |
72
+ | `readTime` | `number` | Estimated minutes |
73
+
74
+ ## Collection Options
75
+
76
+ | Option | Type | Description |
77
+ |---|---|---|
78
+ | `loader` | `string \| Loader` | `'markdown'`, `'json'`, `'json5'`, `'jsonc'`, `'yaml'`, `'toml'`, or custom |
79
+ | `directory` | `string` | Directory containing collection files |
80
+ | `schema` | `z.ZodType` | Zod schema for validating entry data |
81
+ | `include` | `string[]` | Glob include patterns |
82
+ | `exclude` | `string[]` | Glob exclude patterns |
83
+ | `computed` | `Record<string, fn>` | Computed fields derived from entry data |
84
+ | `validate` | `fn` | Custom validation hook (return string for error) |
85
+ | `filter` | `fn` | Filter entries (return false to exclude) |
86
+ | `slugify` | `fn` | Custom slug generation |
87
+ | `transform` | `fn` | Pre-validation transform |
88
+ | `validators` | `ContentValidator[]` | Custom content validators |
89
+ | `disableBuiltinValidators` | `boolean` | Disable built-in markdown validators |
90
+
91
+ ## Loaders
92
+
93
+ | Type | Extensions | Description |
94
+ |---|---|---|
95
+ | `markdown` | `.md` | gray-matter frontmatter + markdown body |
96
+ | `json` | `.json` | JSON.parse |
97
+ | `json5` | `.json` | Relaxed JSON with comments, trailing commas |
98
+ | `jsonc` | `.json`, `.jsonc` | JSON with comments |
99
+ | `yaml` | `.yml`, `.yaml` | YAML |
100
+ | `toml` | `.toml` | TOML |
101
+
102
+ Custom loaders: implement `Loader { name, kind, extensions, load(filePath) }`.
103
+
104
+ ## Vite Plugins
105
+
106
+ ### pagesmithContent
107
+
108
+ Virtual module plugin that exposes collections as importable modules:
109
+
110
+ ```ts
111
+ import { pagesmithContent, pagesmithSsg, sharedAssetsPlugin } from '@pagesmith/core/vite'
112
+ import collections from './content.config'
113
+
114
+ export default defineConfig({
115
+ plugins: [
116
+ sharedAssetsPlugin(),
117
+ pagesmithContent({ collections }),
118
+ ...pagesmithSsg({ entry: './src/entry-server.tsx', contentDirs: ['./content'] }),
119
+ ],
120
+ })
121
+ ```
122
+
123
+ Options:
124
+
125
+ | Option | Type | Default | Description |
126
+ |---|---|---|---|
127
+ | `collections` | `Collections` | — | Collection definitions |
128
+ | `moduleId` | `string` | `'virtual:content'` | Virtual module prefix |
129
+ | `configPath` | `string` | `'./content.config.ts'` | Config file path |
130
+ | `dts` | `boolean \| string` | `true` | Generate .d.ts |
131
+ | `contentRoot` | `string` | `'content'` | Shared root for contentSlug |
132
+ | `markdown` | `MarkdownConfig` | — | Markdown pipeline config |
133
+
134
+ Import in your code:
135
+
136
+ ```ts
137
+ import posts from 'virtual:content/posts'
138
+ // Each markdown entry: { id, contentSlug, html, headings, frontmatter }
139
+ ```
140
+
141
+ ### pagesmithSsg
142
+
143
+ Static site generation plugin. Your SSR entry must export:
144
+
145
+ ```ts
146
+ export function getRoutes(config: SsgRenderConfig): string[]
147
+ export function render(url: string, config: SsgRenderConfig): string | Promise<string>
148
+ ```
149
+
150
+ `SsgRenderConfig` provides: `base`, `root`, `cssPath`, `jsPath`, `searchEnabled`, `isDev`.
151
+
152
+ ### sharedAssetsPlugin
153
+
154
+ Serves shared font assets (Open Sans, JetBrains Mono) bundled with `@pagesmith/core`.
155
+
156
+ ## Markdown Pipeline
157
+
158
+ ```
159
+ remark-parse → remark-gfm → remark-math → remark-frontmatter
160
+ → remark-github-alerts → remark-smartypants → [user remark plugins]
161
+ → remark-rehype
162
+ → rehype-expressive-code (dual themes, line numbers, titles, copy, collapse, mark/ins/del)
163
+ → rehype-mathjax → rehype-slug → rehype-autolink-headings
164
+ → rehype-external-links → rehype-accessible-emojis
165
+ → heading extraction → [user rehype plugins] → rehype-stringify
166
+ ```
167
+
168
+ ### Markdown Configuration
169
+
170
+ ```ts
171
+ type MarkdownConfig = {
172
+ remarkPlugins?: any[]
173
+ rehypePlugins?: any[]
174
+ shiki?: {
175
+ themes: { light: string; dark: string }
176
+ langAlias?: Record<string, string>
177
+ defaultShowLineNumbers?: boolean
178
+ }
179
+ }
180
+ ```
181
+
182
+ ### Code Block Meta Syntax (Expressive Code)
183
+
184
+ | Meta | Example | Description |
185
+ |---|---|---|
186
+ | `title="..."` | `` ```js title="app.js" `` | File title |
187
+ | `showLineNumbers` | `` ```js showLineNumbers `` | Line numbers |
188
+ | `mark={lines}` | `` ```js mark={3,5-7} `` | Highlight lines |
189
+ | `ins={lines}` | `` ```js ins={4} `` | Inserted lines (green) |
190
+ | `del={lines}` | `` ```js del={5} `` | Deleted lines (red) |
191
+ | `collapse={lines}` | `` ```js collapse={1-5} `` | Collapsible section |
192
+ | `wrap` | `` ```js wrap `` | Text wrapping |
193
+ | `frame="..."` | `` ```js frame="terminal" `` | Frame style |
194
+
195
+ ### Built-in Validators
196
+
197
+ - **linkValidator** — warns on bare URLs, empty link text, suspicious protocols
198
+ - **headingValidator** — enforces single h1, sequential heading depth
199
+ - **codeBlockValidator** — warns on missing language, unknown meta properties
200
+
201
+ ## JSX Runtime
202
+
203
+ Configure tsconfig: `{ "jsx": "react-jsx", "jsxImportSource": "@pagesmith/core" }`
204
+
205
+ ```tsx
206
+ import { h, Fragment, HtmlString } from '@pagesmith/core/jsx-runtime'
207
+
208
+ function Page({ title, content }: { title: string; content: string }) {
209
+ return (
210
+ <html lang="en">
211
+ <head><title>{title}</title></head>
212
+ <body>
213
+ <main innerHTML={new HtmlString(content)} />
214
+ </body>
215
+ </html>
216
+ )
217
+ }
218
+ ```
219
+
220
+ - `h()` returns `HtmlString` — use `String(result)` or `.value` for raw HTML
221
+ - Use `innerHTML` prop to inject pre-rendered HTML without escaping
222
+ - `Fragment` renders children or raw `innerHTML` without a wrapper element
223
+
224
+ ## CSS Exports
225
+
226
+ | Import Path | Contents |
227
+ |---|---|
228
+ | `@pagesmith/core/css/content` | Prose typography + inline code |
229
+ | `@pagesmith/core/css/standalone` | Full layout + prose + TOC |
230
+ | `@pagesmith/core/css/viewport` | Responsive viewport base |
231
+ | `@pagesmith/core/css/fonts` | Bundled Open Sans + JetBrains Mono |
232
+
233
+ Code block styling is handled by Expressive Code (inline styles).
234
+
235
+ ## Runtime Exports
236
+
237
+ ```ts
238
+ import { getRuntimeCSS, getRuntimeJS, getContentCSS, getContentJS } from '@pagesmith/core/runtime'
239
+ ```
240
+
241
+ Two tiers:
242
+ - **Standalone** (`getRuntimeCSS/JS`) — full site with TOC highlight
243
+ - **Content** (`getContentCSS/JS`) — markdown rendering only
244
+
245
+ ## Frontmatter Schemas
246
+
247
+ | Schema | Fields |
248
+ |---|---|
249
+ | `BaseFrontmatterSchema` | title, description, publishedDate, lastUpdatedOn, tags, draft |
250
+ | `BlogFrontmatterSchema` | extends base + category, featured, coverImage |
251
+ | `ProjectFrontmatterSchema` | extends base + gitRepo, links |
252
+
253
+ ## Export Map
254
+
255
+ | Import Path | Purpose |
256
+ |---|---|
257
+ | `@pagesmith/core` | Main API (defineCollection, createContentLayer, z, etc.) |
258
+ | `@pagesmith/core/jsx-runtime` | h, Fragment, HtmlString |
259
+ | `@pagesmith/core/markdown` | processMarkdown |
260
+ | `@pagesmith/core/css` | buildCss (LightningCSS) |
261
+ | `@pagesmith/core/css/content` | Content CSS file |
262
+ | `@pagesmith/core/css/standalone` | Standalone CSS file |
263
+ | `@pagesmith/core/css/viewport` | Viewport CSS file |
264
+ | `@pagesmith/core/css/fonts` | Bundled font faces |
265
+ | `@pagesmith/core/schemas` | Zod schemas and types |
266
+ | `@pagesmith/core/loaders` | Loader classes and registry |
267
+ | `@pagesmith/core/assets` | Asset copying and hashing |
268
+ | `@pagesmith/core/runtime` | Pre-built CSS/JS accessors |
269
+ | `@pagesmith/core/vite` | Vite plugins |
270
+ | `@pagesmith/core/ai` | AI assistant artifact generator |
271
+ | `@pagesmith/core/create` | Project scaffolding |
272
+
273
+ ## Key Rules
274
+
275
+ - Always use `z` re-exported from `@pagesmith/core`, not from `zod` directly
276
+ - Prefer folder-based entries (`guide/getting-started/README.md`) when content references sibling assets
277
+ - The `render()` result is cached — call `clearRenderCache()` to force re-render
278
+ - `getCollection()` results are cached — use `invalidate*()` methods for cache busting
279
+ - Runtime JS provides only TOC highlighting (standalone) — copy buttons are Expressive Code
280
+ - All exports are named (no default exports from core)
281
+ - Code block styling is inline via Expressive Code — do NOT import separate code block CSS
@@ -2,7 +2,7 @@
2
2
  type AiAssistant = 'claude' | 'codex' | 'gemini';
3
3
  type AiInstallScope = 'project' | 'user';
4
4
  type AiInstallProfile = 'default' | 'docs';
5
- type AiArtifactKind = 'memory' | 'skill' | 'llms' | 'llms-full';
5
+ type AiArtifactKind = 'memory' | 'skill' | 'llms' | 'llms-full' | 'markdown-guidelines' | 'update-docs';
6
6
  type AiWriteMode = 'merge' | 'replace';
7
7
  type AiInstallStatus = 'written' | 'merged' | 'replaced' | 'unchanged';
8
8
  type AiArtifact = {
@@ -28,7 +28,8 @@ type AiInstallOptions = {
28
28
  homeDir?: string;
29
29
  includeLlms?: boolean;
30
30
  force?: boolean;
31
- skillName?: string;
31
+ skillName?: string; /** When true, return planned writes without actually writing files. */
32
+ dryRun?: boolean;
32
33
  };
33
34
  declare function getAiArtifactContent(assistant: AiAssistant | 'shared', kind: AiArtifactKind, options?: {
34
35
  profile?: AiInstallProfile;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/ai/index.ts"],"mappings":";KAIY,WAAA;AAAA,KACA,cAAA;AAAA,KACA,gBAAA;AAAA,KACA,cAAA;AAAA,KACA,WAAA;AAAA,KACA,eAAA;AAAA,KAEA,UAAA;EACV,SAAA,GAAY,WAAA;EACZ,IAAA,EAAM,cAAA;EACN,IAAA;EACA,OAAA;EACA,IAAA,EAAM,WAAA;EACN,KAAA;AAAA;AAAA,KAGU,eAAA;EACV,SAAA,GAAY,WAAA;EACZ,IAAA,EAAM,cAAA;EACN,IAAA;EACA,MAAA,EAAQ,eAAA;EACR,KAAA;AAAA;AAAA,KAGU,gBAAA;EACV,UAAA,GAAa,WAAA;EACb,KAAA,GAAQ,cAAA;EACR,OAAA,GAAU,gBAAA;EACV,GAAA;EACA,OAAA;EACA,WAAA;EACA,KAAA;EACA,SAAA;AAAA;AAAA,iBAqUc,oBAAA,CACd,SAAA,EAAW,WAAA,aACX,IAAA,EAAM,cAAA,EACN,OAAA;EAAW,OAAA,GAAU,gBAAA;EAAkB,SAAA;AAAA;AAAA,iBA6BzB,cAAA,CAAe,OAAA,GAAS,gBAAA,GAAwB,UAAA;AAAA,iBA0GhD,kBAAA,CAAmB,OAAA,GAAS,gBAAA,GAAwB,eAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/ai/index.ts"],"mappings":";KAIY,WAAA;AAAA,KACA,cAAA;AAAA,KACA,gBAAA;AAAA,KACA,cAAA;AAAA,KAOA,WAAA;AAAA,KACA,eAAA;AAAA,KAEA,UAAA;EACV,SAAA,GAAY,WAAA;EACZ,IAAA,EAAM,cAAA;EACN,IAAA;EACA,OAAA;EACA,IAAA,EAAM,WAAA;EACN,KAAA;AAAA;AAAA,KAGU,eAAA;EACV,SAAA,GAAY,WAAA;EACZ,IAAA,EAAM,cAAA;EACN,IAAA;EACA,MAAA,EAAQ,eAAA;EACR,KAAA;AAAA;AAAA,KAGU,gBAAA;EACV,UAAA,GAAa,WAAA;EACb,KAAA,GAAQ,cAAA;EACR,OAAA,GAAU,gBAAA;EACV,GAAA;EACA,OAAA;EACA,WAAA;EACA,KAAA;EACA,SAAA,WA3ByB;EA6BzB,MAAA;AAAA;AAAA,iBA8sBc,oBAAA,CACd,SAAA,EAAW,WAAA,aACX,IAAA,EAAM,cAAA,EACN,OAAA;EAAW,OAAA,GAAU,gBAAA;EAAkB,SAAA;AAAA;AAAA,iBAuCzB,cAAA,CAAe,OAAA,GAAS,gBAAA,GAAwB,UAAA;AAAA,iBAiIhD,kBAAA,CAAmB,OAAA,GAAS,gBAAA,GAAwB,eAAA"}