@compilr-dev/sdk 0.18.9 → 0.18.11

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.
@@ -35,19 +35,41 @@ export const canvasSkill = defineSkill({
35
35
 
36
36
  ## STEPS
37
37
 
38
- 1. **Collect the essentials from the user FIRST — this is the standard approach.** A canvas is an expensive authoring pass; building it on guessed requirements wastes that pass and lands wide of what the user wanted. So before you author, use **\`ask_user\`** (batch several questions into ONE call) to gather what the canvas needs:
39
- - **Purpose & audience** — what is it for, who reads it?
40
- - **Canvas type** — infographic, carousel, or board? (Offer the choice unless obvious.)
41
- - **Key content / data** — the actual points, numbers, sections, or slides to include. Don't invent data.
42
- - **Style / brand** — theme-matched (default), a specific palette/brand, or a named **aesthetic**? For infographics & carousels you can offer a look from the \`canvas-styles\` skill (skeuomorphic, glass, brutalist, editorial, retro) as part of THIS same question — don't default every canvas to the flat theme look.
43
- For open design directions (which layout, which visual approach), present concrete options with **\`propose_alternatives\`** instead of guessing.
44
- **Skip questions the user already answered**, and if they gave full detail or explicitly said "just make it / surprise me / your call", go straight to authoring. Keep it to ONE focused round — a short question batch, never a long interview — then build.
38
+ ⚠️ **Two passes, not one.** Most weak canvases are weak because layout and decoration got
39
+ decided in the same breath, and the decoration ends up compensating for a structure that
40
+ never worked. Structure first, with the real content; skin it second, from a recipe.
45
41
 
46
- 2. **Build the canvas in small steps — never one giant tool call.** A canvas is HTML/SVG you emit as tool arguments; a single very large \`canvas_write\` can overrun the output limit, get cut off mid-arguments, and fail. So author it incrementally, and emit each tool call immediately with NO prose preamble (narration competes with the HTML for the same output budget):
42
+ 1. **Ask purpose, audience and content — never taste.** Use **\`ask_user\`** (batch into ONE
43
+ call):
44
+ - **Purpose & audience** — what is it for, who reads it?
45
+ - **Key content / data** — the actual points, numbers, sections or slides. Don't invent
46
+ data; if you need a figure you were not given, ask for it.
47
+
48
+ ⚠️ **Do NOT ask which style or aesthetic they want.** "Brutalist or editorial?" asks
49
+ someone to imagine two things they have never seen, in a vocabulary they did not choose,
50
+ before the canvas exists — and then commits you to whatever comes back. Purpose,
51
+ audience and content are answerable from what the user already knows. Style is
52
+ answerable from what they can SEE, which is step 8.
53
+
54
+ **Skip the round entirely** when they said "just make it / surprise me / your call" or
55
+ already gave full detail. This round asks LESS than it used to, not more.
56
+
57
+ 2. **Route the type and style from the content**, using the cheatsheet in
58
+ \`canvas_guide("styles")\`. One screen of an app → \`infographic\` + the app-screen style.
59
+ Several options compared → \`board\`. Slides → \`carousel\`. Data or a one-pager →
60
+ \`infographic\` + theme-flat.
61
+
62
+ 3. **Pass one — structure, with the FINAL content.** No colour decisions, no type scale yet:
63
+ get the real words and real numbers into the real layout. A structure that works with
64
+ placeholder text is not a structure.
65
+
66
+ Build it in small steps — never one giant tool call. A canvas is HTML/SVG you emit as
67
+ tool arguments; a single very large \`canvas_write\` can overrun the output limit, get cut
68
+ off mid-arguments, and fail. Emit each call immediately with NO prose preamble
69
+ (narration competes with the HTML for the same output budget):
47
70
  - **2a. First \`canvas_write\`** (type, title, html) = a COMPACT skeleton: the \`<style>\` block, the overall layout, and just the first section or heading. This is the ONLY way to create a canvas — describing it in chat does nothing.
48
71
  - **2b. Then \`canvas_edit\` (operation=append)** to add each remaining section, one call per section. The preview grows as you go, and every call stays small and reliable. (You can also leave \`<!-- placeholder -->\` markers in 2a and str_replace them.)
49
72
  - Put the whole thing in one \`canvas_write\` ONLY if it is genuinely small (a single stat card / short poster).
50
-
51
73
  HTML constraints for every write:
52
74
  - Do NOT include \`<html>\`, \`<head>\`, \`<meta>\`, \`<!doctype>\`, or your own CSP — the host injects the sandbox and CSP. Just the body content + a \`<style>\` and optional \`<script>\`.
53
75
  - The sandbox is \`allow-scripts\` with NO same-origin and CSP \`default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data: blob:\`. So: inline \`<style>\`/\`<script>\` only, no external fonts/CSS/JS/network, no remote images (use inline SVG or data: URIs).
@@ -56,7 +78,13 @@ export const canvasSkill = defineSkill({
56
78
  - Make it look intentional: a clear grid, strong type scale, generous spacing. Use \`var(--canvas-accent)\` sparingly for emphasis. Prefer inline SVG for shapes/charts/icons (fill/stroke with the theme vars).
57
79
  - For a **carousel**, wrap each slide in \`<section data-sheet>…</section>\` — a natural unit to add one per \`canvas_edit\` append.
58
80
 
59
- 3. **Add a Tweaks controls manifest when it helps** (the \`controls\` argument). Each control is \`{ type, param, label, default, …type config }\` where type ∈ slider | number | toggle | select | color | text.
81
+ 4. **Pass two — skin it.** Read \`canvas_guide\` for your style's recipe and its exemplar
82
+ (\`exemplar-infographic\` or \`exemplar-app-screen\`), then apply the values. This pass is
83
+ mechanical, because the recipe supplies every number — surfaces, type ladder, spacing
84
+ scale, accent budget. Edit in place with \`canvas_edit\`; pass one already put the content
85
+ where it belongs.
86
+
87
+ 5. **Add a Tweaks controls manifest when it helps** (the \`controls\` argument). Each control is \`{ type, param, label, default, …type config }\` where type ∈ slider | number | toggle | select | color | text.
60
88
  - **⚠️ EVERY control you declare MUST be bound in the HTML — a declared-but-unbound control is a dead knob that visibly does nothing when the user drags it. Declaring the control is only half the job; you MUST also reference its param.** Bind each param one of these ways:
61
89
  - CSS custom property (most common): use \`var(--param)\` directly in your styles — e.g. a \`headline\` slider means \`font-size: var(--headline)\` (NOT a literal \`48px\`), an \`accent\` color means \`color: var(--accent)\`. The host sets \`--param\` on the root and updates it live. Include a unit in the CSS if the raw value is a number: \`font-size: calc(var(--headline) * 1px)\`.
62
90
  - Text binding: \`<span data-bind="param"></span>\` — its text is replaced with the value.
@@ -65,13 +93,48 @@ export const canvasSkill = defineSkill({
65
93
  - Give every canvas at least 2–4 sensible controls (accent color, a headline size slider, a toggle to show/hide a section). Seed \`default\` values that MATCH what you authored (a slider default of 48 means the HTML's initial \`var(--headline)\` should read 48).
66
94
  - **Before finishing, re-check: is each control's \`param\` actually referenced in the HTML?** If not, either bind it or drop the control — never ship a dead knob.
67
95
 
68
- 4. **To EDIT an existing canvas, do NOT re-send the whole document.** First call \`canvas_get\` with \`outline=true\` (or a \`startLine\`/\`maxLines\` slice) to find the exact snippet, then \`canvas_edit\` with \`operation=str_replace\` (old_str must be unique — include surrounding context — or set replace_all=true), or append/prepend. Reserve \`canvas_write\` with \`canvas_id\` for a full intentional rewrite.
96
+ 6. **To EDIT an existing canvas, do NOT re-send the whole document.** First call \`canvas_get\` with \`outline=true\` (or a \`startLine\`/\`maxLines\` slice) to find the exact snippet, then \`canvas_edit\` with \`operation=str_replace\` (old_str must be unique — include surrounding context — or set replace_all=true), or append/prepend. Reserve \`canvas_write\` with \`canvas_id\` for a full intentional rewrite.
97
+
98
+ 7. **Validate.** Call \`canvas_validate\` (canvas_id) — a fast static check for content that
99
+ won't render (Mermaid/Markdown/CDN), a board missing its \`data-board\` bounds or with
100
+ nodes off-canvas, sparse output, hardcoded colours that ignore the theme, a card that
101
+ shares its ground's value, text under 4.5:1, too many hues, and dead Tweaks. Fix every
102
+ **error** and address applicable **warnings**.
103
+
104
+ 8. **The gate — screenshot, verdict, fix, screenshot AGAIN.** Call \`canvas_screenshot\`
105
+ (canvas_id), then give all six verdicts explicitly, in this form:
106
+
107
+ \`01 pass · 02 fail → fixed · 03 pass · 04 pass · 05 fail → fixed · 06 pass\`
108
+
109
+ | # | check | the question to ask |
110
+ |---|---|---|
111
+ | 01 | One dominant element | Squint: what do you see FIRST? If the answer is "the whole thing at once", nothing dominates. The largest element should be ≥2x the next and hold the FINDING, not merely the first metric. |
112
+ | 02 | Cards differ from their ground | Cover the borders with your thumb — can you still see the cards? If the layout only exists because of its lines, the ramp is missing. |
113
+ | 03 | Nothing under 4.5:1 | Check every label against the surface it ACTUALLY sits on, not against the page. |
114
+ | 04 | Every value is specific | Do the numbers add up? Could a reader challenge one? A total that does not reconcile with its rows is what makes a canvas feel machine-made. |
115
+ | 05 | Density varies | Blur it until the text goes — is there a composition left? A uniform grid of equal boxes is a form. |
116
+ | 06 | One accent, one family | Count the hues, then count the reasons. More hues than reasons means colour is decoration. |
69
117
 
70
- 5. **Validate before you hand it off.** Once the canvas is composed, call \`canvas_validate\` (canvas_id) — a fast static check that catches content that won't render (Mermaid/Markdown/CDN), a board missing its \`data-board\` bounds or with nodes off-canvas, sparse output, and hardcoded colors that ignore the theme tokens. Fix any **errors** (they render broken) and address applicable **warnings**, then move on.
118
+ ⚠️ **Naming each check is what forces looking at it.** Asked for a summary judgement, a
119
+ model writes "looks good" every time.
71
120
 
72
- 6. **See it before you trust it (if you can).** If you're vision-capable, call \`canvas_screenshot\` (canvas_id) — it renders the canvas and returns the image so you can catch what static checks can't: overflow / cut-off content, unreadable or low-contrast text, cramped or empty areas, broken layout. If something's off, fix it with \`canvas_edit\` and screenshot again. (No-op on text-only models / hosts that can't render.)
121
+ ⚠️ **FAILING IS NORMAL** — most first drafts fail two of these. A failed check is
122
+ something to EDIT, not something to argue with. Do not write a justification.
73
123
 
74
- 7. **After writing, tell the user what you made in one line** and point them at the Tweaks they can adjust. The canvas opens in its own tab.
124
+ ⚠️ **The second screenshot is the one that matters**, because it catches a fix that broke
125
+ something else. Cap at two rounds; if something still fails, hand off and say so in one
126
+ clause.
127
+
128
+ Checks 02, 03 and 06 are also computed by \`canvas_validate\`, so on a text-only model run
129
+ the gate on 01, 04 and 05 — they need judgement, not eyes.
130
+
131
+ ⚠️ **Do not report the gate to the user.** The verdicts are working notes.
132
+
133
+ 9. **One line, then offer two alternates as PICTURES.** Say what you made and point at the
134
+ Tweaks. Then use **\`propose_alternatives\`** with **two** further skins of the same
135
+ canvas — never a list of style names. The content is already fixed, so each variant
136
+ costs one \`canvas_write\` and the user picks by looking. This is the aesthetic menu,
137
+ moved to the only point where the choice is cheap for them and informative for you.
75
138
 
76
139
  ## Rules
77
140
  - CALL THE TOOL — don't describe the HTML you "would" write and stop. A canvas only exists once the tool succeeds.
@@ -177,6 +240,11 @@ export const boardSkill = defineSkill({
177
240
  ## SHOW, don't TELL (the #1 rule)
178
241
  A board is a VISUAL surface — its value is that it *depicts* things, not that it holds text. If your board is mostly paragraphs and bullet lists, you've built a text document on a grid and failed the medium. That is what the "propose alternatives" text tool is for — a board must EARN its place by being visual.
179
242
  - **Depict, don't describe.** Exploring website / UI options? DRAW each option as a **wireframe mock** — a browser/window frame with a nav bar, a hero block, and content sections as labeled BOXES — laid side by side so they can be compared at a glance. Do NOT write "Option A: terminal-first hero, CLI-style product list…" as prose; SKETCH it.
243
+ - ⚠️ **This is for COMPARING several options, at low fidelity.** For ONE screen at full
244
+ fidelity — "mock up the admissions dashboard" — use \`infographic\` with the
245
+ **app-screen** style instead (\`canvas_guide("styles")\`), and draw NO window chrome
246
+ there. The frame below earns its place only because several options sitting side by
247
+ side need something to separate them.
180
248
  - **Architecture / flow?** Draw boxes-and-arrows (nodes + inline-SVG connectors), not a written description of the components.
181
249
  - **Mind-map?** A central node with branches and sub-nodes, not an outline.
182
250
  - Text belongs INSIDE the visual as short labels (titles, captions, a few key words) — never as the primary content of a node.
@@ -187,7 +255,7 @@ Build each screen mock as nested boxes so it reads as a *picture of a page*:
187
255
  <div style="position:absolute;left:80px;top:120px;width:520px;background:var(--canvas-card);
188
256
  border:1px solid var(--canvas-border);border-radius:8px;overflow:hidden">
189
257
  <div style="height:28px;background:var(--canvas-bg);display:flex;align-items:center;gap:6px;padding:0 10px">
190
- <span style="width:8px;height:8px;border-radius:50%;background:var(--canvas-muted)"></span> …traffic lights…
258
+ <span style="width:8px;height:8px;border-radius:50%;background:var(--canvas-muted)"></span> …dots that say "this is a window"…
191
259
  </div>
192
260
  <div style="height:44px;border-bottom:1px solid var(--canvas-border);display:flex;align-items:center;
193
261
  justify-content:space-between;padding:0 16px"><b style="color:var(--canvas-fg)">logo</b><span style="color:var(--canvas-muted)">nav · nav · nav</span></div>
@@ -231,8 +299,8 @@ Give each mock a small title above it ("OPTION A — Terminal-first"). Two or th
231
299
  // =============================================================================
232
300
  export const canvasStylesSkill = defineSkill({
233
301
  name: 'canvas-styles',
234
- description: 'The visual STYLE CATALOGUE for canvases — six named aesthetics (theme-flat, skeuomorphic, ' +
235
- 'glassmorphism, brutalist, editorial/print, retro/synthwave) each with a concrete, sandbox-safe, ' +
302
+ description: 'The visual STYLE CATALOGUE for canvases — seven named aesthetics (theme-flat, skeuomorphic, ' +
303
+ 'glassmorphism, brutalist, editorial/print, retro/synthwave, app-screen) each with a concrete, sandbox-safe, ' +
236
304
  'export-safe CSS recipe. Consult when picking or offering a look beyond the default theme-matched flat style.',
237
305
  tags: ['visual', 'canvas', 'style', 'aesthetic', 'design'],
238
306
  prompt: `The STYLE CATALOGUE for canvases — pick a coherent visual aesthetic instead of defaulting to the flat theme look. Design guidance; author with the canvas tools (see the \`canvas\` skill for mechanics). Applies to **infographic** and **carousel** (a board is a diagram surface — keep it theme-flat unless asked).
@@ -252,8 +320,40 @@ export const canvasStylesSkill = defineSkill({
252
320
 
253
321
  ### 1. theme-flat — DEFAULT
254
322
  Clean, modern, theme-driven. Reach for it for data, dashboards, and anything "serious/neutral".
255
- - Font: \`system-ui, -apple-system, "Segoe UI", Roboto, sans-serif\`. Palette: the \`var(--canvas-*)\` tokens as-is.
256
- - Flat surfaces, thin \`1px var(--canvas-border)\` lines, subtle or no shadow, radius 0–8px, strong type scale, generous whitespace, \`var(--canvas-accent)\` used sparingly.
323
+
324
+ ⚠️ This recipe is LITERAL VALUES, not adjectives. "Generous whitespace" and "used
325
+ sparingly" are what the old entry said, and they produced a canvas that followed every
326
+ instruction and still looked machine-made. Read \`canvas_guide("exemplar-infographic")\`
327
+ for a worked example — it is worth more than everything below.
328
+
329
+ **Surfaces — three, never two.** Radius **0**, and **no shadows at all**: the ramp is the
330
+ depth.
331
+ - page ground \`var(--canvas-bg)\` · raised card \`var(--canvas-surface-1, var(--canvas-card))\` · inset (tables, code) \`var(--canvas-surface-2, var(--canvas-card))\`
332
+ - hairlines \`1px solid var(--canvas-hairline, var(--canvas-border))\`
333
+ - A card that shares its ground's value is a rectangle of text. If you ever find yourself
334
+ relying on the border to show where a card is, the ramp is missing.
335
+
336
+ **Type — one family, \`system-ui, -apple-system, "Segoe UI", Roboto, sans-serif\`.**
337
+ - hero figure **72–88px / 700 / -0.035em** · standfirst **20px / 600** · stat **34px / 700**
338
+ · body **14px / 1.65** · label **10–11px / 600 / 0.12em / uppercase**
339
+ - \`font-variant-numeric: tabular-nums\` on **every** figure, or columns of numbers jitter.
340
+
341
+ **Spacing — an 8px scale.** Gaps 16 · card padding 18–32 · outer padding 40.
342
+
343
+ **Grid — asymmetric tracks**, e.g. \`grid-template-columns: 1.35fr 1fr\`. Equal columns make
344
+ a canvas read as a form.
345
+
346
+ **Accent — three times maximum**, and they are: one kicker, one delta, one bar. Everything
347
+ else is greys.
348
+
349
+ **Dominance is geometric.** The hero figure is ~2.5x the next largest type, in a card ~1.35x
350
+ its neighbour. Bolder is not bigger.
351
+
352
+ **Two derived colours** the token set does not carry, and which get invented badly:
353
+ - body copy \`color-mix(in oklab, var(--canvas-fg) 78%, var(--canvas-bg))\`
354
+ - chart neutral \`color-mix(in oklab, var(--canvas-fg) 22%, var(--canvas-bg))\`
355
+
356
+ Both work in either polarity, so they need no host support.
257
357
 
258
358
  ### 2. skeuomorphic — tactile, physical
259
359
  Soft, real-material surfaces — great for device/app-UI mockups and "premium product" one-pagers.
@@ -287,9 +387,49 @@ Hype/launch/gaming/music. Dark base, neon glow, chrome.
287
387
  - Neon palette: hot pink \`#ff2bd6\`, cyan \`#22d3ee\`, violet \`#a855f7\`. Glow on headings/borders: \`text-shadow:0 0 8px currentColor,0 0 22px currentColor\` and \`box-shadow:0 0 12px #22d3ee,inset 0 0 12px rgba(34,211,238,.3)\`.
288
388
  - Optional perspective grid at the bottom via repeating linear-gradients or an inline SVG. Chrome/gradient text with \`background:linear-gradient(#fff,#8ab4ff);-webkit-background-clip:text;color:transparent\`. (Glow via \`text-shadow\` exports fine.)
289
389
 
390
+ ### 7. app-screen — a single UI screen
391
+ A mockup of one screen of an application. Read \`canvas_guide("exemplar-app-screen")\` before
392
+ drawing one.
393
+
394
+ ⚠️ **Route a mockup here, not to \`board\`.** A single screen is one composition, so the
395
+ container is \`infographic\`; \`board\` teaches low-fidelity wireframe boxes for comparing
396
+ options side by side, which is not what anyone means by "mock up the dashboard".
397
+
398
+ **Four surfaces, in this order** — this is what makes a screen read as an application
399
+ rather than a document:
400
+ - chrome (rail, header) at \`surface-1\` · **the work canvas INSET at \`surface-2\`** ·
401
+ cards back up to \`surface-1\` on top of it · table headers at \`surface-2\`
402
+
403
+ **Exactly one active state**, and no hover states drawn at all. A static mock showing three
404
+ highlighted rows reads as a bug. The active row gets a 10% accent tint plus a 2px inset
405
+ accent edge; one filter chip gets the \`--canvas-fg\` border and the rest carry hairlines.
406
+
407
+ **One primary action, and it is INK, not accent** (\`background: var(--canvas-fg)\`). The
408
+ accent is reserved for the thing that needs attention. Two filled buttons side by side is
409
+ the commonest mock tell; the secondary is a hairline outline.
410
+
411
+ **State a finding, not a page name.** A real dashboard says "Overview" and stops; a MOCK
412
+ has to argue why the screen is worth building, so the largest text is a claim and the
413
+ accent marks its evidence. "Interviews are keeping pace. Document review is not." — not
414
+ "Admissions Dashboard".
415
+
416
+ **Numbers must reconcile.** 248 applied → 193 documents in → 152 reviewed → 67 interviewed,
417
+ and the listed programmes account for the 41 waiting. Figures that contradict each other
418
+ are what make a mock feel machine-made, more than any styling choice. If you were not given
419
+ real data, ask for it rather than inventing it.
420
+
421
+ **Do not draw the OS.** No traffic lights, no browser tab bar, no URL field, no dock. Window
422
+ chrome costs vertical space and dates the mock; the app's own header is the frame. Add it
423
+ only when the point being made is about the window itself.
424
+
425
+ Icons: use the set in \`canvas_guide("icons")\` — never an emoji, never a guessed path.
426
+
290
427
  ## Pick-by-content cheatsheet
428
+ - **One screen of an app / a UI mockup** → \`infographic\` + **app-screen**. Several options
429
+ compared side by side → \`board\` + wireframe. (Asking for "a mockup" used to route to one
430
+ of three types, none of which was right.)
291
431
  - **Data / stats / dashboard / neutral** → theme-flat (or glass for a hero moment)
292
- - **App / device / product-UI showcase** → skeuomorphic or glass
432
+ - **A device or product SHOWCASE, not its screen** → skeuomorphic or glass
293
433
  - **Manifesto / dev-tool / bold statement** → brutalist
294
434
  - **Long-form / essay / report / "serious"** → editorial
295
435
  - **Launch / hype / gaming / music / 80s** → retro
@@ -12,6 +12,8 @@ export { brandSetupSkill, contentStrategySkill, contentCalendarSkill, createCont
12
12
  export { curriculumDesignSkill, lessonPlanSkill, assessmentDesignSkill, courseReviewSkill, } from './course-skills.js';
13
13
  export { bookOutlineSkill, characterDesignSkill, plotThreadsSkill, sceneBreakdownSkill, bookReviewSkill, } from './book-skills.js';
14
14
  export { canvasSkill, infographicSkill, carouselSkill, boardSkill, canvasStylesSkill, } from './canvas-skills.js';
15
+ export { canvasExemplarInfographicSkill, canvasExemplarAppScreenSkill, } from './canvas-exemplars.js';
16
+ export { canvasIconsSkill } from './canvas-icons.js';
15
17
  /**
16
18
  * All platform-specific skills (38 total).
17
19
  */
@@ -18,6 +18,9 @@ export { curriculumDesignSkill, lessonPlanSkill, assessmentDesignSkill, courseRe
18
18
  export { bookOutlineSkill, characterDesignSkill, plotThreadsSkill, sceneBreakdownSkill, bookReviewSkill, } from './book-skills.js';
19
19
  // Canvas (visual)
20
20
  export { canvasSkill, infographicSkill, carouselSkill, boardSkill, canvasStylesSkill, } from './canvas-skills.js';
21
+ // Canvas exemplars — generated from the design handoff; see canvas-exemplars.ts.
22
+ export { canvasExemplarInfographicSkill, canvasExemplarAppScreenSkill, } from './canvas-exemplars.js';
23
+ export { canvasIconsSkill } from './canvas-icons.js';
21
24
  // Import all for the aggregate array
22
25
  import { designSkill, sketchSkill, prdSkill, refineSkill, refineItemSkill, architectureSkill, sessionNotesSkill, buildSkill, scaffoldSkill, } from './software-skills.js';
23
26
  import { outlineSkill, literatureReviewSkill, draftSectionSkill, peerReviewSkill, researchScaffoldSkill, } from './research-skills.js';
@@ -26,6 +29,8 @@ import { brandSetupSkill, contentStrategySkill, contentCalendarSkill, createCont
26
29
  import { curriculumDesignSkill, lessonPlanSkill, assessmentDesignSkill, courseReviewSkill, } from './course-skills.js';
27
30
  import { bookOutlineSkill, characterDesignSkill, plotThreadsSkill, sceneBreakdownSkill, bookReviewSkill, } from './book-skills.js';
28
31
  import { canvasSkill, infographicSkill, carouselSkill, boardSkill, canvasStylesSkill, } from './canvas-skills.js';
32
+ import { canvasExemplarInfographicSkill, canvasExemplarAppScreenSkill, } from './canvas-exemplars.js';
33
+ import { canvasIconsSkill } from './canvas-icons.js';
29
34
  /**
30
35
  * All platform-specific skills (38 total).
31
36
  */
@@ -76,4 +81,7 @@ export const platformSkills = [
76
81
  carouselSkill,
77
82
  boardSkill,
78
83
  canvasStylesSkill,
84
+ canvasExemplarInfographicSkill,
85
+ canvasExemplarAppScreenSkill,
86
+ canvasIconsSkill,
79
87
  ];
@@ -296,6 +296,7 @@ export const TOOL_GROUPS = {
296
296
  'canvas_delete',
297
297
  'canvas_validate',
298
298
  'canvas_screenshot',
299
+ 'canvas_guide',
299
300
  ],
300
301
  readOnly: false,
301
302
  tier: 'meta',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@compilr-dev/sdk",
3
- "version": "0.18.9",
3
+ "version": "0.18.11",
4
4
  "description": "Universal agent runtime for building AI-powered applications",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",