@aexol/spectral 0.9.230 → 0.9.234

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 (265) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/agent/index.d.ts.map +1 -1
  3. package/dist/agent/index.js +89 -14
  4. package/dist/backend/generated-images.d.ts +1 -1
  5. package/dist/backend/generated-images.d.ts.map +1 -1
  6. package/dist/commands/serve.d.ts.map +1 -1
  7. package/dist/commands/serve.js +12 -1
  8. package/dist/designer/data/skills/blog-post.d.ts +3 -0
  9. package/dist/designer/data/skills/blog-post.d.ts.map +1 -0
  10. package/dist/designer/data/skills/blog-post.js +84 -0
  11. package/dist/designer/data/skills/blog-post.ts +87 -0
  12. package/dist/designer/data/skills/critique.d.ts +3 -0
  13. package/dist/designer/data/skills/critique.d.ts.map +1 -0
  14. package/dist/designer/data/skills/critique.js +109 -0
  15. package/dist/designer/data/skills/critique.ts +112 -0
  16. package/dist/designer/data/skills/dashboard.d.ts +3 -0
  17. package/dist/designer/data/skills/dashboard.d.ts.map +1 -0
  18. package/dist/designer/data/skills/dashboard.js +165 -0
  19. package/dist/designer/data/skills/dashboard.ts +168 -0
  20. package/dist/designer/data/skills/design-brief.d.ts +3 -0
  21. package/dist/designer/data/skills/design-brief.d.ts.map +1 -0
  22. package/dist/designer/data/skills/design-brief.js +141 -0
  23. package/dist/designer/data/skills/design-brief.ts +144 -0
  24. package/dist/designer/data/skills/design-skill.d.ts +10 -0
  25. package/dist/designer/data/skills/design-skill.d.ts.map +1 -0
  26. package/dist/designer/data/skills/design-skill.js +1 -0
  27. package/dist/designer/data/skills/design-skill.ts +9 -0
  28. package/dist/designer/data/skills/docs-page.d.ts +3 -0
  29. package/dist/designer/data/skills/docs-page.d.ts.map +1 -0
  30. package/dist/designer/data/skills/docs-page.js +68 -0
  31. package/dist/designer/data/skills/docs-page.ts +71 -0
  32. package/dist/designer/data/skills/index.d.ts +3 -0
  33. package/dist/designer/data/skills/index.d.ts.map +1 -0
  34. package/dist/designer/data/skills/index.js +28 -0
  35. package/dist/designer/data/skills/index.ts +30 -0
  36. package/dist/designer/data/skills/magazine-poster.d.ts +3 -0
  37. package/dist/designer/data/skills/magazine-poster.d.ts.map +1 -0
  38. package/dist/designer/data/skills/magazine-poster.js +70 -0
  39. package/dist/designer/data/skills/magazine-poster.ts +73 -0
  40. package/dist/designer/data/skills/mobile-app.d.ts +3 -0
  41. package/dist/designer/data/skills/mobile-app.d.ts.map +1 -0
  42. package/dist/designer/data/skills/mobile-app.js +229 -0
  43. package/dist/designer/data/skills/mobile-app.ts +232 -0
  44. package/dist/designer/data/skills/motion-frames.d.ts +3 -0
  45. package/dist/designer/data/skills/motion-frames.d.ts.map +1 -0
  46. package/dist/designer/data/skills/motion-frames.js +121 -0
  47. package/dist/designer/data/skills/motion-frames.ts +124 -0
  48. package/dist/designer/data/skills/pricing-page.d.ts +3 -0
  49. package/dist/designer/data/skills/pricing-page.d.ts.map +1 -0
  50. package/dist/designer/data/skills/pricing-page.js +76 -0
  51. package/dist/designer/data/skills/pricing-page.ts +79 -0
  52. package/dist/designer/data/skills/saas-landing.d.ts +3 -0
  53. package/dist/designer/data/skills/saas-landing.d.ts.map +1 -0
  54. package/dist/designer/data/skills/saas-landing.js +71 -0
  55. package/dist/designer/data/skills/saas-landing.ts +74 -0
  56. package/dist/designer/data/skills/slide-deck.d.ts +3 -0
  57. package/dist/designer/data/skills/slide-deck.d.ts.map +1 -0
  58. package/dist/designer/data/skills/slide-deck.js +213 -0
  59. package/dist/designer/data/skills/slide-deck.ts +216 -0
  60. package/dist/designer/data/skills/social-carousel.d.ts +3 -0
  61. package/dist/designer/data/skills/social-carousel.d.ts.map +1 -0
  62. package/dist/designer/data/skills/social-carousel.js +135 -0
  63. package/dist/designer/data/skills/social-carousel.ts +138 -0
  64. package/dist/designer/data/skills/web-prototype.d.ts +3 -0
  65. package/dist/designer/data/skills/web-prototype.d.ts.map +1 -0
  66. package/dist/designer/data/skills/web-prototype.js +159 -0
  67. package/dist/designer/data/skills/web-prototype.ts +162 -0
  68. package/dist/designer/skills.d.ts +4 -10
  69. package/dist/designer/skills.d.ts.map +1 -1
  70. package/dist/designer/skills.js +2 -1643
  71. package/dist/extensions/logic-trace.d.ts +1 -1
  72. package/dist/extensions/logic-trace.d.ts.map +1 -1
  73. package/dist/extensions/logic-trace.js +199 -70
  74. package/dist/extensions/video-generation/index.d.ts +3 -0
  75. package/dist/extensions/video-generation/index.d.ts.map +1 -0
  76. package/dist/extensions/video-generation/index.js +299 -0
  77. package/dist/extensions/wizard/index.js +9 -1
  78. package/dist/generated/parser/ast/nodes.d.ts +115 -0
  79. package/dist/generated/parser/ast/nodes.d.ts.map +1 -0
  80. package/dist/generated/parser/ast/nodes.js +8 -0
  81. package/dist/generated/parser/lexer/lexer.d.ts +28 -0
  82. package/dist/generated/parser/lexer/lexer.d.ts.map +1 -0
  83. package/dist/generated/parser/{lexer.js → lexer/lexer.js} +1 -180
  84. package/dist/generated/parser/{lexer.d.ts → lexer/tokens.d.ts} +5 -24
  85. package/dist/generated/parser/lexer/tokens.d.ts.map +1 -0
  86. package/dist/generated/parser/lexer/tokens.js +187 -0
  87. package/dist/generated/parser/mod.d.ts +5 -7
  88. package/dist/generated/parser/mod.d.ts.map +1 -1
  89. package/dist/generated/parser/mod.js +2 -1
  90. package/dist/generated/parser/parser/cursor.d.ts +47 -0
  91. package/dist/generated/parser/parser/cursor.d.ts.map +1 -0
  92. package/dist/generated/parser/parser/cursor.js +12 -0
  93. package/dist/generated/parser/parser/definitions.d.ts +16 -0
  94. package/dist/generated/parser/parser/definitions.d.ts.map +1 -0
  95. package/dist/generated/parser/parser/definitions.js +353 -0
  96. package/dist/generated/parser/parser/expressions.d.ts +17 -0
  97. package/dist/generated/parser/parser/expressions.d.ts.map +1 -0
  98. package/dist/generated/parser/parser/expressions.js +165 -0
  99. package/dist/generated/parser/parser.d.ts +18 -133
  100. package/dist/generated/parser/parser.d.ts.map +1 -1
  101. package/dist/generated/parser/parser.js +9 -505
  102. package/dist/generated/parser/tokenizer.d.ts +1 -2
  103. package/dist/generated/parser/tokenizer.d.ts.map +1 -1
  104. package/dist/generated/parser/tokenizer.js +2 -1
  105. package/dist/generated/parser/validator.d.ts +1 -1
  106. package/dist/generated/parser/validator.d.ts.map +1 -1
  107. package/dist/generated/zeus/const.d.ts.map +1 -1
  108. package/dist/generated/zeus/const.js +30 -0
  109. package/dist/generated/zeus/index.d.ts +140 -0
  110. package/dist/generated/zeus/index.d.ts.map +1 -1
  111. package/dist/generated/zeus/index.js +5 -0
  112. package/dist/mcp/glimpse-ui.js +9 -1
  113. package/dist/relay/dispatcher.d.ts +23 -104
  114. package/dist/relay/dispatcher.d.ts.map +1 -1
  115. package/dist/relay/dispatcher.js +21 -1130
  116. package/dist/relay/rest.d.ts +31 -0
  117. package/dist/relay/rest.d.ts.map +1 -0
  118. package/dist/relay/rest.js +85 -0
  119. package/dist/relay/routing.d.ts +109 -0
  120. package/dist/relay/routing.d.ts.map +1 -0
  121. package/dist/relay/routing.js +669 -0
  122. package/dist/relay/wizard-login.d.ts +17 -0
  123. package/dist/relay/wizard-login.d.ts.map +1 -0
  124. package/dist/relay/wizard-login.js +419 -0
  125. package/dist/sdk/agent-core/agent-loop.d.ts +2 -9
  126. package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
  127. package/dist/sdk/agent-core/agent-loop.js +17 -291
  128. package/dist/sdk/agent-core/agent.d.ts +11 -4
  129. package/dist/sdk/agent-core/agent.d.ts.map +1 -1
  130. package/dist/sdk/agent-core/agent.js +16 -4
  131. package/dist/sdk/agent-core/tool-call-registry.d.ts +75 -0
  132. package/dist/sdk/agent-core/tool-call-registry.d.ts.map +1 -0
  133. package/dist/sdk/agent-core/tool-call-registry.js +131 -0
  134. package/dist/sdk/agent-core/tool-execution.d.ts +33 -0
  135. package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -0
  136. package/dist/sdk/agent-core/tool-execution.js +399 -0
  137. package/dist/sdk/agent-core/types.d.ts +15 -4
  138. package/dist/sdk/agent-core/types.d.ts.map +1 -1
  139. package/dist/sdk/ai/env-api-keys.js +9 -1
  140. package/dist/sdk/ai/index.d.ts +3 -0
  141. package/dist/sdk/ai/index.d.ts.map +1 -1
  142. package/dist/sdk/ai/index.js +3 -0
  143. package/dist/sdk/ai/providers/faux.d.ts.map +1 -1
  144. package/dist/sdk/ai/providers/faux.js +3 -0
  145. package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts +39 -6
  146. package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts.map +1 -1
  147. package/dist/sdk/ai/providers/leaked-tool-call-parser.js +159 -18
  148. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts +48 -0
  149. package/dist/sdk/ai/providers/openai/reasoning-replay.d.ts.map +1 -0
  150. package/dist/sdk/ai/providers/openai/reasoning-replay.js +209 -0
  151. package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
  152. package/dist/sdk/ai/providers/openai-completions.js +23 -211
  153. package/dist/sdk/ai/providers/openrouter-videos.d.ts +3 -0
  154. package/dist/sdk/ai/providers/openrouter-videos.d.ts.map +1 -0
  155. package/dist/sdk/ai/providers/openrouter-videos.js +412 -0
  156. package/dist/sdk/ai/providers/register-builtins.d.ts.map +1 -1
  157. package/dist/sdk/ai/providers/register-builtins.js +6 -0
  158. package/dist/sdk/ai/providers/simple-options.d.ts +1 -6
  159. package/dist/sdk/ai/providers/simple-options.d.ts.map +1 -1
  160. package/dist/sdk/ai/providers/simple-options.js +0 -22
  161. package/dist/sdk/ai/providers/transform-messages.d.ts.map +1 -1
  162. package/dist/sdk/ai/providers/transform-messages.js +52 -1
  163. package/dist/sdk/ai/types.d.ts +91 -10
  164. package/dist/sdk/ai/types.d.ts.map +1 -1
  165. package/dist/sdk/ai/video-models.d.ts +10 -0
  166. package/dist/sdk/ai/video-models.d.ts.map +1 -0
  167. package/dist/sdk/ai/video-models.generated.d.ts +440 -0
  168. package/dist/sdk/ai/video-models.generated.d.ts.map +1 -0
  169. package/dist/sdk/ai/video-models.generated.js +441 -0
  170. package/dist/sdk/ai/video-models.js +22 -0
  171. package/dist/sdk/ai/videos-api-registry.d.ts +14 -0
  172. package/dist/sdk/ai/videos-api-registry.d.ts.map +1 -0
  173. package/dist/sdk/ai/videos-api-registry.js +21 -0
  174. package/dist/sdk/ai/videos.d.ts +4 -0
  175. package/dist/sdk/ai/videos.d.ts.map +1 -0
  176. package/dist/sdk/ai/videos.js +13 -0
  177. package/dist/sdk/coding-agent/core/agent-session.d.ts +8 -0
  178. package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
  179. package/dist/sdk/coding-agent/core/agent-session.js +11 -0
  180. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts +6 -118
  181. package/dist/sdk/coding-agent/core/compaction/compaction.d.ts.map +1 -1
  182. package/dist/sdk/coding-agent/core/compaction/compaction.js +11 -733
  183. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts +58 -0
  184. package/dist/sdk/coding-agent/core/compaction/cut-points.d.ts.map +1 -0
  185. package/dist/sdk/coding-agent/core/compaction/cut-points.js +191 -0
  186. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts +28 -0
  187. package/dist/sdk/coding-agent/core/compaction/dedupe.d.ts.map +1 -0
  188. package/dist/sdk/coding-agent/core/compaction/dedupe.js +156 -0
  189. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts +21 -0
  190. package/dist/sdk/coding-agent/core/compaction/summarize.d.ts.map +1 -0
  191. package/dist/sdk/coding-agent/core/compaction/summarize.js +181 -0
  192. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts +47 -0
  193. package/dist/sdk/coding-agent/core/compaction/tokens.d.ts.map +1 -0
  194. package/dist/sdk/coding-agent/core/compaction/tokens.js +224 -0
  195. package/dist/sdk/coding-agent/core/extensions/loader.d.ts.map +1 -1
  196. package/dist/sdk/coding-agent/core/extensions/loader.js +14 -0
  197. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts +26 -0
  198. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts.map +1 -1
  199. package/dist/sdk/coding-agent/core/extensions/native-extensions.js +23 -0
  200. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +157 -0
  201. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -0
  202. package/dist/sdk/coding-agent/core/extensions/session-events.js +13 -0
  203. package/dist/sdk/coding-agent/core/extensions/types.d.ts +10 -367
  204. package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
  205. package/dist/sdk/coding-agent/core/extensions/types.js +2 -10
  206. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts +219 -0
  207. package/dist/sdk/coding-agent/core/extensions/ui-types.d.ts.map +1 -0
  208. package/dist/sdk/coding-agent/core/extensions/ui-types.js +4 -0
  209. package/dist/sdk/coding-agent/core/messages.d.ts.map +1 -1
  210. package/dist/sdk/coding-agent/core/messages.js +42 -2
  211. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts +115 -0
  212. package/dist/sdk/coding-agent/core/package/default-package-manager.d.ts.map +1 -0
  213. package/dist/sdk/coding-agent/core/package/default-package-manager.js +1184 -0
  214. package/dist/sdk/coding-agent/core/package/discovery.d.ts +20 -0
  215. package/dist/sdk/coding-agent/core/package/discovery.d.ts.map +1 -0
  216. package/dist/sdk/coding-agent/core/package/discovery.js +283 -0
  217. package/dist/sdk/coding-agent/core/package/ignore.d.ts +29 -0
  218. package/dist/sdk/coding-agent/core/package/ignore.d.ts.map +1 -0
  219. package/dist/sdk/coding-agent/core/package/ignore.js +235 -0
  220. package/dist/sdk/coding-agent/core/package/types.d.ts +128 -0
  221. package/dist/sdk/coding-agent/core/package/types.d.ts.map +1 -0
  222. package/dist/sdk/coding-agent/core/package/types.js +18 -0
  223. package/dist/sdk/coding-agent/core/package/update-check.d.ts +43 -0
  224. package/dist/sdk/coding-agent/core/package/update-check.d.ts.map +1 -0
  225. package/dist/sdk/coding-agent/core/package/update-check.js +253 -0
  226. package/dist/sdk/coding-agent/core/package-manager.d.ts +2 -188
  227. package/dist/sdk/coding-agent/core/package-manager.d.ts.map +1 -1
  228. package/dist/sdk/coding-agent/core/package-manager.js +1 -1940
  229. package/dist/sdk/coding-agent/core/resource-loader.d.ts +11 -0
  230. package/dist/sdk/coding-agent/core/resource-loader.d.ts.map +1 -1
  231. package/dist/sdk/coding-agent/core/resource-loader.js +23 -6
  232. package/dist/sdk/coding-agent/core/sdk.d.ts +24 -2
  233. package/dist/sdk/coding-agent/core/sdk.d.ts.map +1 -1
  234. package/dist/sdk/coding-agent/core/sdk.js +15 -3
  235. package/dist/sdk/coding-agent/core/session/migrate.d.ts +18 -0
  236. package/dist/sdk/coding-agent/core/session/migrate.d.ts.map +1 -0
  237. package/dist/sdk/coding-agent/core/session/migrate.js +78 -0
  238. package/dist/sdk/coding-agent/core/session/types.d.ts +165 -0
  239. package/dist/sdk/coding-agent/core/session/types.d.ts.map +1 -0
  240. package/dist/sdk/coding-agent/core/session/types.js +4 -0
  241. package/dist/sdk/coding-agent/core/session-manager.d.ts +3 -161
  242. package/dist/sdk/coding-agent/core/session-manager.d.ts.map +1 -1
  243. package/dist/sdk/coding-agent/core/session-manager.js +4 -72
  244. package/dist/sdk/coding-agent/core/settings-manager.d.ts +0 -8
  245. package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
  246. package/dist/sdk/coding-agent/core/settings-manager.js +3 -3
  247. package/dist/sdk/coding-agent/index.d.ts +2 -2
  248. package/dist/sdk/coding-agent/index.d.ts.map +1 -1
  249. package/dist/sdk/coding-agent/index.js +1 -1
  250. package/dist/sdk-public.d.ts +96 -0
  251. package/dist/sdk-public.d.ts.map +1 -0
  252. package/dist/sdk-public.js +109 -0
  253. package/dist/server/agent-bridge/rehydrate.d.ts +2 -2
  254. package/dist/server/agent-bridge/rehydrate.d.ts.map +1 -1
  255. package/dist/server/agent-bridge/rehydrate.js +14 -0
  256. package/dist/server/agent-bridge.d.ts +8 -2
  257. package/dist/server/agent-bridge.d.ts.map +1 -1
  258. package/dist/server/agent-bridge.js +25 -2
  259. package/dist/server/session-stream.d.ts +19 -0
  260. package/dist/server/session-stream.d.ts.map +1 -1
  261. package/dist/server/session-stream.js +35 -0
  262. package/dist/server/wire.d.ts +13 -0
  263. package/dist/server/wire.d.ts.map +1 -1
  264. package/package.json +8 -2
  265. package/dist/generated/parser/lexer.d.ts.map +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,8 @@ All notable changes to `@aexol/spectral` are documented here. Format follows
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.9.231] - 2026-09-23
9
+
8
10
  ### Added
9
11
 
10
12
  - Added built-in `web_fetch` tool for fetching public web pages as text,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAIX,SAAS,EAET,MAAM,4BAA4B,CAAC;AAqBpC,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAKrB,MAAM,8BAA8B,CAAC;AAItC,OAAO,EACN,KAAK,WAAW,EAKhB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQrD,OAAO,KAAK,EAAE,sBAAsB,EAAgB,MAAM,6CAA6C,CAAC;AAuGxG;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACxC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC,GACpF,MAAM,CAYR;AA4JD;;;GAGG;AACH,wBAAgB,oCAAoC,CACnD,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAChD,IAAI,CAAC,sBAAsB,EAAE,WAAW,GAAG,cAAc,CAAC,CAe5D;AA6BD,wBAAgB,oBAAoB,CACnC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,gBAAgB,GACnB,SAAS,EAAE,CAwCb;AAqHD,2FAA2F;AAC3F,wBAAgB,+BAA+B,CAC9C,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GACtD,IAAI,CAEN;AAmBD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACzC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,QAAQ,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAC9D,MAAM,CAiBR;AA8eD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CACxC,GAAG,EAAE,YAAY,EACjB,IAAI,CAAC,EAAE;IACN,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,GACC,IAAI,CA2aN"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAIX,SAAS,EAET,MAAM,4BAA4B,CAAC;AAqBpC,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAKrB,MAAM,8BAA8B,CAAC;AAItC,OAAO,EACN,KAAK,WAAW,EAKhB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQrD,OAAO,KAAK,EAAE,sBAAsB,EAAgB,MAAM,6CAA6C,CAAC;AAyGxG;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACxC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAAC,GACpF,MAAM,CAYR;AAiMD;;;GAGG;AACH,wBAAgB,oCAAoC,CACnD,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAChD,IAAI,CAAC,sBAAsB,EAAE,WAAW,GAAG,cAAc,CAAC,CAe5D;AA6BD,wBAAgB,oBAAoB,CACnC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,gBAAgB,GACnB,SAAS,EAAE,CAwCb;AAqHD,2FAA2F;AAC3F,wBAAgB,+BAA+B,CAC9C,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GACtD,IAAI,CAEN;AAmBD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACzC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,QAAQ,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAC9D,MAAM,CAiBR;AAogBD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CACxC,GAAG,EAAE,YAAY,EACjB,IAAI,CAAC,EAAE;IACN,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,GACC,IAAI,CAqcN"}
@@ -53,6 +53,8 @@ import { compressSubagentToolResult } from "../memory/tool-output-compressor.js"
53
53
  // ---------------------------------------------------------------------------
54
54
  const MAX_PARALLEL_TASKS = 8;
55
55
  const MAX_CONCURRENCY = 4;
56
+ /** Max steps in a chain call, mirroring the parallel batch cap. */
57
+ const MAX_CHAIN_STEPS = 8;
56
58
  /**
57
59
  * Per-subagent timeout. Each subagent invocation (single, parallel, chain)
58
60
  * gets its own independent deadline so that no single subagent can
@@ -197,6 +199,40 @@ function truncateOutput(text, limit) {
197
199
  }
198
200
  return text;
199
201
  }
202
+ /** Levenshtein edit distance between two strings (dependency-free). */
203
+ function levenshtein(a, b) {
204
+ const dp = [];
205
+ for (let i = 0; i <= a.length; i++)
206
+ dp[i] = [i];
207
+ for (let j = 0; j <= b.length; j++)
208
+ dp[0][j] = j;
209
+ for (let i = 1; i <= a.length; i++) {
210
+ for (let j = 1; j <= b.length; j++) {
211
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
212
+ dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
213
+ }
214
+ }
215
+ return dp[a.length][b.length];
216
+ }
217
+ /**
218
+ * Suggests the closest known agent name for an unknown one.
219
+ * Case-insensitive prefix/substring match first, then Levenshtein ≤ 2.
220
+ */
221
+ function suggestAgentName(unknownName, agents) {
222
+ const target = unknownName.toLowerCase();
223
+ let best;
224
+ for (const agent of agents) {
225
+ const name = agent.name.toLowerCase();
226
+ if (name.startsWith(target) || name.includes(target) || target.includes(name)) {
227
+ return agent.name;
228
+ }
229
+ const distance = levenshtein(target, name);
230
+ if (distance <= 2 && (!best || distance < best.distance)) {
231
+ best = { name: agent.name, distance };
232
+ }
233
+ }
234
+ return best?.name;
235
+ }
200
236
  // ---------------------------------------------------------------------------
201
237
  // Helpers — model resolution
202
238
  // ---------------------------------------------------------------------------
@@ -441,14 +477,15 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, si
441
477
  const normalizedAgentName = agentName.replace(/^@/, "");
442
478
  const agent = agents.find((a) => a.name === normalizedAgentName);
443
479
  if (!agent) {
444
- const available = agents.map((a) => `"${a.name}"`).join(", ") || "none";
480
+ const available = agents.map((a) => `${a.name} (${a.source})`).join(", ") || "none";
481
+ const suggestion = suggestAgentName(normalizedAgentName, agents);
445
482
  return {
446
483
  agent: agentName,
447
484
  agentSource: "unknown",
448
485
  task,
449
486
  exitCode: 1,
450
487
  messages: [],
451
- stderr: `Unknown agent: "${agentName}". Available agents: ${available}.`,
488
+ stderr: `Unknown agent: "${agentName}". Available agents: ${available}.${suggestion ? ` Did you mean "${suggestion}"?` : ""}`,
452
489
  usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
453
490
  step,
454
491
  };
@@ -788,14 +825,20 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, si
788
825
  // Tool parameter schemas
789
826
  // ---------------------------------------------------------------------------
790
827
  const TaskItem = Type.Object({
791
- agent: Type.String({ description: "Name of the agent to invoke" }),
792
- task: Type.String({ description: "Task to delegate to the agent" }),
828
+ agent: Type.String({
829
+ description: "Known agent name to invoke (use names from the available agents list)",
830
+ }),
831
+ task: Type.String({
832
+ description: "Full self-contained prompt text for the agent (plain string; subagents share no context with the caller)",
833
+ }),
793
834
  cwd: Type.Optional(Type.String({ description: "Working directory for the agent process" })),
794
835
  });
795
836
  const ChainItem = Type.Object({
796
- agent: Type.String({ description: "Name of the agent to invoke" }),
837
+ agent: Type.String({
838
+ description: "Known agent name to invoke (use names from the available agents list)",
839
+ }),
797
840
  task: Type.String({
798
- description: "Task with optional {previous} placeholder for prior output",
841
+ description: "Full self-contained prompt text with an optional {previous} placeholder, substituted with the previous step's output",
799
842
  }),
800
843
  cwd: Type.Optional(Type.String({ description: "Working directory for the agent process" })),
801
844
  });
@@ -804,13 +847,19 @@ const AgentScopeSchema = StringEnum(["user", "project", "both"], {
804
847
  default: "both",
805
848
  });
806
849
  const SubagentParams = Type.Object({
807
- agent: Type.Optional(Type.String({ description: "Name of the agent to invoke (for single mode)" })),
808
- task: Type.Optional(Type.String({ description: "Task to delegate (for single mode)" })),
850
+ agent: Type.Optional(Type.String({
851
+ description: "Known agent name to invoke (single mode; use names from the available agents list)",
852
+ })),
853
+ task: Type.Optional(Type.String({
854
+ description: "Full self-contained prompt text to delegate (single mode; plain string, subagents share no context with the caller)",
855
+ })),
809
856
  tasks: Type.Optional(Type.Array(TaskItem, {
810
- description: "Array of {agent, task} for parallel execution",
857
+ description: "Parallel batch of {agent, task} items for independent tasks (max 8, 4 run concurrently)",
858
+ minItems: 1,
811
859
  })),
812
860
  chain: Type.Optional(Type.Array(ChainItem, {
813
- description: "Array of {agent, task} for sequential execution",
861
+ description: "Sequential steps of {agent, task}; {previous} substitutes the previous step's output (max 8 steps)",
862
+ minItems: 1,
814
863
  })),
815
864
  agentScope: Type.Optional(AgentScopeSchema),
816
865
  confirmProjectAgents: Type.Optional(Type.Boolean({
@@ -837,11 +886,19 @@ export default function subagentExtension(ext, opts) {
837
886
  "Delegate tasks to specialized subagents with isolated context.",
838
887
  "Modes: single (agent + task), parallel (tasks array), chain (sequential with {previous} placeholder).",
839
888
  'Default agent scope is "both" (user agents from ~/.spectral/agent/agents + project agents from .spectral/agents).',
840
- 'Set agentScope: "user" or "project" to limit scope.'
889
+ 'Set agentScope: "user" or "project" to limit scope.',
890
+ "Exactly one mode per call.",
891
+ 'Single (one task): {"agent":"researcher","task":"<full self-contained task text>"}',
892
+ 'Parallel (independent tasks; max 8, 4 run concurrently): {"tasks":[{"agent":"researcher","task":"..."},{"agent":"executor","task":"..."}]}',
893
+ 'Chain (dependent tasks; sequential): {"chain":[{"agent":"researcher","task":"..."},{"agent":"executor","task":"Implement {previous}"}]}',
894
+ "NEVER mix agent/task with tasks or chain in one call; never pass a single task via tasks (use single mode); task must be a plain string; use known agent names only.",
895
+ "Task texts must be fully self-contained prompts (subagents share no context with the caller).",
841
896
  ].join(" "),
842
897
  promptSnippet: "Run a subagent to investigate, plan, review, or implement code changes",
843
898
  promptGuidelines: [
844
899
  "When the subagent tool is available, use it for non-trivial work where specialized delegation improves quality or speed, including bounded implementation, research, planning, review, and verification slices. Each subagent runs in an isolated context window.",
900
+ "Pick exactly one mode per call: one task → single {agent, task}; independent tasks → parallel {tasks: [...]} (max 8, 4 concurrent); dependent tasks → chain {chain: [...]} with {previous} substituting the prior step's output.",
901
+ "Task texts must be fully self-contained prompts (subagents share no context with the caller); never mix modes' fields (agent/task vs tasks/chain) in one call.",
845
902
  ],
846
903
  parameters: SubagentParams,
847
904
  async execute(_toolCallId, params, signal, onUpdate, ctx) {
@@ -951,7 +1008,7 @@ export default function subagentExtension(ext, opts) {
951
1008
  content: [
952
1009
  {
953
1010
  type: "text",
954
- text: `Invalid parameters. Provide exactly one mode.\nAvailable agents: ${available}`,
1011
+ text: `Invalid parameters. Provide exactly one mode.\nAvailable agents: ${available}\n\nExamples:\nSingle: {"agent":"researcher","task":"<full self-contained task text>"}\nParallel: {"tasks":[{"agent":"researcher","task":"..."},{"agent":"executor","task":"..."}]}\nChain: {"chain":[{"agent":"researcher","task":"..."},{"agent":"executor","task":"Implement {previous}"}]}\nRetry with exactly one of: agent+task | tasks | chain`,
955
1012
  },
956
1013
  ],
957
1014
  details: makeDetails("single")([]),
@@ -990,6 +1047,16 @@ export default function subagentExtension(ext, opts) {
990
1047
  }
991
1048
  // ── Chain mode ──────────────────────────────────────────────
992
1049
  if (params.chain && params.chain.length > 0) {
1050
+ if (params.chain.length > MAX_CHAIN_STEPS)
1051
+ return {
1052
+ content: [
1053
+ {
1054
+ type: "text",
1055
+ text: `Too many chain steps (${params.chain.length}). Max is ${MAX_CHAIN_STEPS}.`,
1056
+ },
1057
+ ],
1058
+ details: makeDetails("chain")([]),
1059
+ };
993
1060
  const results = [];
994
1061
  let previousOutput = "";
995
1062
  for (let i = 0; i < params.chain.length; i++) {
@@ -1101,8 +1168,15 @@ export default function subagentExtension(ext, opts) {
1101
1168
  });
1102
1169
  const successCount = results.filter((r) => r.exitCode === 0).length;
1103
1170
  const summaries = results.map((r) => {
1104
- const output = truncateOutput(getFinalOutput(r.messages), SUBAGENT_OUTPUT_LIMIT);
1105
- const status = r.exitCode === 0
1171
+ const completed = r.exitCode === 0;
1172
+ const finalOutput = getFinalOutput(r.messages);
1173
+ // Failed tasks with no transcript surface their error message /
1174
+ // stderr instead of a bare "(no output)" so the caller can see
1175
+ // why the task failed (e.g. unknown agent names).
1176
+ const output = truncateOutput(completed || finalOutput.trim()
1177
+ ? finalOutput
1178
+ : r.errorMessage || r.stderr, SUBAGENT_OUTPUT_LIMIT);
1179
+ const status = completed
1106
1180
  ? "completed"
1107
1181
  : r.attempts && r.attempts > 1
1108
1182
  ? `failed (after ${r.attempts} attempts)`
@@ -1117,6 +1191,7 @@ export default function subagentExtension(ext, opts) {
1117
1191
  },
1118
1192
  ],
1119
1193
  details: persistDetails(makeDetails("parallel")(results)),
1194
+ ...(results.length > 0 && successCount === 0 ? { isError: true } : {}),
1120
1195
  };
1121
1196
  }
1122
1197
  // ── Single mode ─────────────────────────────────────────────
@@ -34,7 +34,7 @@
34
34
  *
35
35
  * @module @spectral/backend/generated-images
36
36
  */
37
- export type GeneratedImageKind = "generated" | "attachment";
37
+ export type GeneratedImageKind = "generated" | "attachment" | "video";
38
38
  export type UploadStep = "upload-url" | "put" | "confirm";
39
39
  export interface UploadImageOptions {
40
40
  /** Backend base url, e.g. `https://api.aexol.ai` (no trailing slash needed). */
@@ -1 +1 @@
1
- {"version":3,"file":"generated-images.d.ts","sourceRoot":"","sources":["../../src/backend/generated-images.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generated-images.d.ts","sourceRoot":"","sources":["../../src/backend/generated-images.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAwBH,OAAO,EAAE,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AAYlE,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAarE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAazD;AAED,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA6B9D;AAED,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,EAAE,WAAW,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CA+kBlF;AAmFD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAc5E"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAwBH,OAAO,EAAE,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AAclE,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAarE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAazD;AAED,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA6B9D;AAED,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,EAAE,WAAW,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8lBlF;AAmFD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAc5E"}
@@ -40,7 +40,7 @@ import { refreshCloudAgents as refreshCloudAgentsImpl } from "../agent/agents.js
40
40
  import { requireLogin } from "../preflight.js";
41
41
  import { RelayClient } from "../relay/client.js";
42
42
  import { getFanoutManager } from "../server/fanout/fanout-manager.js";
43
- import { detachAllSubscribers, handleAutoOptimizeFrame, handleAutoResearchFrame, handleCancelTurn, handleClientMessage, handleRestRequest, handleSubscribe, } from "../relay/dispatcher.js";
43
+ import { detachAllSubscribers, handleAutoOptimizeFrame, handleAutoResearchFrame, handleCancelTurn, handleClientMessage, handleRestRequest, handleStopToolCall, handleSubscribe, } from "../relay/dispatcher.js";
44
44
  import { ensureMachineRegistered } from "../relay/registration.js";
45
45
  import { saveMachine } from "../relay/machine-store.js";
46
46
  import { SessionStreamManager } from "../server/session-stream.js";
@@ -350,6 +350,17 @@ export async function runServe(opts = {}) {
350
350
  handleCancelTurn(frame, { manager });
351
351
  return;
352
352
  }
353
+ if (frame.kind === "stop_tool_call") {
354
+ // Per-tool-call stop: abort ONE hung tool call, keep the turn alive.
355
+ // Fire-and-forget with an internal catch — an unresolved settle must
356
+ // never hang the relay loop (the manager isolates per-call failures).
357
+ void handleStopToolCall(frame, {
358
+ manager,
359
+ }).catch((err) => {
360
+ process.stderr.write(`[serve] stop_tool_call failed: ${err instanceof Error ? err.message : String(err)}\n`);
361
+ });
362
+ return;
363
+ }
353
364
  if (frame.kind === "auto_research") {
354
365
  handleAutoResearchFrame(frame, {
355
366
  store,
@@ -0,0 +1,3 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+ export declare const blogPost: DesignSkill;
3
+ //# sourceMappingURL=blog-post.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog-post.d.ts","sourceRoot":"","sources":["../../../../src/designer/data/skills/blog-post.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,QAAQ,EAAE,WAoFpB,CAAC"}
@@ -0,0 +1,84 @@
1
+ export const blogPost = {
2
+ name: "blog-post",
3
+ scenario: "content",
4
+ description: "Blog article layout — title, author metadata, featured image, prose body with headings/images/quotes, related posts. Single-page, reading-optimized typography with comfortable measure.",
5
+ outputKind: "html",
6
+ workflow: `# Blog Post Skill
7
+
8
+ Produce a single blog article page with reading-optimized typography.
9
+
10
+ ## Phase 1 — Structure
11
+
12
+ \`\`\`html
13
+ <article class="blog-post">
14
+ <header class="post-header">
15
+ <div class="post-category">Category</div>
16
+ <h1>Article Title That Is Specific and Engaging</h1>
17
+ <div class="post-meta">
18
+ <span class="post-author">Author Name</span>
19
+ <span class="post-date">Month DD, YYYY</span>
20
+ <span class="post-read-time">N min read</span>
21
+ </div>
22
+ </header>
23
+ <figure class="post-hero">
24
+ <img src="..." alt="...">
25
+ <figcaption>Image caption (optional)</figcaption>
26
+ </figure>
27
+ <div class="post-content">
28
+ <!-- prose -->
29
+ </div>
30
+ <footer class="post-footer">
31
+ <div class="post-tags"><!-- tag pills --></div>
32
+ <section class="related-posts"><!-- 3 related cards --></section>
33
+ </footer>
34
+ </article>
35
+ \`\`\`
36
+
37
+ ## Phase 2 — Typography
38
+
39
+ \`\`\`css
40
+ .blog-post { max-width: 680px; margin: 0 auto; padding: 64px 24px; }
41
+
42
+ .post-header { margin-bottom: 32px; }
43
+ .post-category { font-size: 13px; font-weight: 600; color: var(--accent); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 12px; }
44
+ .post-header h1 { font-size: 40px; font-weight: 700; line-height: 1.2; letter-spacing: -0.02em; margin-bottom: 16px; }
45
+ .post-meta { display: flex; gap: 16px; font-size: 14px; color: var(--muted); }
46
+
47
+ .post-hero { margin: 0 -24px 40px; }
48
+ .post-hero img { width: 100%; height: 400px; object-fit: cover; border-radius: 12px; }
49
+ .post-hero figcaption { font-size: 13px; color: var(--muted); text-align: center; margin-top: 8px; }
50
+
51
+ /* Prose — comfortable reading measure */
52
+ .post-content { font-size: 18px; line-height: 1.8; color: var(--fg); }
53
+ .post-content p { margin: 24px 0; }
54
+ .post-content h2 { font-size: 28px; font-weight: 600; margin: 48px 0 16px; }
55
+ .post-content h3 { font-size: 22px; font-weight: 600; margin: 36px 0 12px; }
56
+ .post-content blockquote { border-left: 3px solid var(--accent); padding: 8px 20px; margin: 32px 0; font-style: italic; color: var(--muted); }
57
+ .post-content ul, .post-content ol { padding-left: 24px; margin: 16px 0; }
58
+ .post-content li { margin: 8px 0; }
59
+ .post-content img { max-width: 100%; border-radius: 8px; margin: 24px 0; }
60
+ .post-content code { font-family: var(--font-mono); font-size: 0.9em; background: var(--surface); padding: 2px 6px; border-radius: 4px; }
61
+ .post-content pre { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 20px 24px; overflow-x: auto; font-family: var(--font-mono); font-size: 15px; line-height: 1.6; margin: 24px 0; }
62
+
63
+ /* Tags */
64
+ .post-tags { display: flex; flex-wrap: wrap; gap: 8px; margin: 48px 0; padding-top: 32px; border-top: 1px solid var(--border); }
65
+ .post-tag { padding: 4px 12px; background: var(--surface); border-radius: 999px; font-size: 13px; color: var(--muted); }
66
+
67
+ /* Related posts */
68
+ .related-posts { margin-top: 48px; }
69
+ .related-posts h3 { font-size: 20px; font-weight: 600; margin-bottom: 16px; }
70
+ .related-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; }
71
+ .related-card { border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
72
+ .related-card img { width: 100%; height: 140px; object-fit: cover; }
73
+ .related-card-content { padding: 16px; }
74
+ .related-card-content h4 { font-size: 15px; font-weight: 600; margin-bottom: 4px; }
75
+ .related-card-content time { font-size: 12px; color: var(--muted); }
76
+ \`\`\`
77
+
78
+ ## Phase 3 — Content Rules
79
+ - Article body: 800-2000 words of meaningful content (no lorem ipsum)
80
+ - Every heading is specific and informative
81
+ - Include at least one blockquote and one code block
82
+ - Feature image is a gradient shape if no real image
83
+ - Author bio is not generic — use a plausible name and role`,
84
+ };
@@ -0,0 +1,87 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+
3
+ export const blogPost: DesignSkill = {
4
+ name: "blog-post",
5
+ scenario: "content",
6
+ description:
7
+ "Blog article layout — title, author metadata, featured image, prose body with headings/images/quotes, related posts. Single-page, reading-optimized typography with comfortable measure.",
8
+ outputKind: "html",
9
+ workflow: `# Blog Post Skill
10
+
11
+ Produce a single blog article page with reading-optimized typography.
12
+
13
+ ## Phase 1 — Structure
14
+
15
+ \`\`\`html
16
+ <article class="blog-post">
17
+ <header class="post-header">
18
+ <div class="post-category">Category</div>
19
+ <h1>Article Title That Is Specific and Engaging</h1>
20
+ <div class="post-meta">
21
+ <span class="post-author">Author Name</span>
22
+ <span class="post-date">Month DD, YYYY</span>
23
+ <span class="post-read-time">N min read</span>
24
+ </div>
25
+ </header>
26
+ <figure class="post-hero">
27
+ <img src="..." alt="...">
28
+ <figcaption>Image caption (optional)</figcaption>
29
+ </figure>
30
+ <div class="post-content">
31
+ <!-- prose -->
32
+ </div>
33
+ <footer class="post-footer">
34
+ <div class="post-tags"><!-- tag pills --></div>
35
+ <section class="related-posts"><!-- 3 related cards --></section>
36
+ </footer>
37
+ </article>
38
+ \`\`\`
39
+
40
+ ## Phase 2 — Typography
41
+
42
+ \`\`\`css
43
+ .blog-post { max-width: 680px; margin: 0 auto; padding: 64px 24px; }
44
+
45
+ .post-header { margin-bottom: 32px; }
46
+ .post-category { font-size: 13px; font-weight: 600; color: var(--accent); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 12px; }
47
+ .post-header h1 { font-size: 40px; font-weight: 700; line-height: 1.2; letter-spacing: -0.02em; margin-bottom: 16px; }
48
+ .post-meta { display: flex; gap: 16px; font-size: 14px; color: var(--muted); }
49
+
50
+ .post-hero { margin: 0 -24px 40px; }
51
+ .post-hero img { width: 100%; height: 400px; object-fit: cover; border-radius: 12px; }
52
+ .post-hero figcaption { font-size: 13px; color: var(--muted); text-align: center; margin-top: 8px; }
53
+
54
+ /* Prose — comfortable reading measure */
55
+ .post-content { font-size: 18px; line-height: 1.8; color: var(--fg); }
56
+ .post-content p { margin: 24px 0; }
57
+ .post-content h2 { font-size: 28px; font-weight: 600; margin: 48px 0 16px; }
58
+ .post-content h3 { font-size: 22px; font-weight: 600; margin: 36px 0 12px; }
59
+ .post-content blockquote { border-left: 3px solid var(--accent); padding: 8px 20px; margin: 32px 0; font-style: italic; color: var(--muted); }
60
+ .post-content ul, .post-content ol { padding-left: 24px; margin: 16px 0; }
61
+ .post-content li { margin: 8px 0; }
62
+ .post-content img { max-width: 100%; border-radius: 8px; margin: 24px 0; }
63
+ .post-content code { font-family: var(--font-mono); font-size: 0.9em; background: var(--surface); padding: 2px 6px; border-radius: 4px; }
64
+ .post-content pre { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 20px 24px; overflow-x: auto; font-family: var(--font-mono); font-size: 15px; line-height: 1.6; margin: 24px 0; }
65
+
66
+ /* Tags */
67
+ .post-tags { display: flex; flex-wrap: wrap; gap: 8px; margin: 48px 0; padding-top: 32px; border-top: 1px solid var(--border); }
68
+ .post-tag { padding: 4px 12px; background: var(--surface); border-radius: 999px; font-size: 13px; color: var(--muted); }
69
+
70
+ /* Related posts */
71
+ .related-posts { margin-top: 48px; }
72
+ .related-posts h3 { font-size: 20px; font-weight: 600; margin-bottom: 16px; }
73
+ .related-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; }
74
+ .related-card { border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }
75
+ .related-card img { width: 100%; height: 140px; object-fit: cover; }
76
+ .related-card-content { padding: 16px; }
77
+ .related-card-content h4 { font-size: 15px; font-weight: 600; margin-bottom: 4px; }
78
+ .related-card-content time { font-size: 12px; color: var(--muted); }
79
+ \`\`\`
80
+
81
+ ## Phase 3 — Content Rules
82
+ - Article body: 800-2000 words of meaningful content (no lorem ipsum)
83
+ - Every heading is specific and informative
84
+ - Include at least one blockquote and one code block
85
+ - Feature image is a gradient shape if no real image
86
+ - Author bio is not generic — use a plausible name and role`,
87
+ };
@@ -0,0 +1,3 @@
1
+ import type { DesignSkill } from "./design-skill.js";
2
+ export declare const critique: DesignSkill;
3
+ //# sourceMappingURL=critique.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"critique.d.ts","sourceRoot":"","sources":["../../../../src/designer/data/skills/critique.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,QAAQ,EAAE,WA6GpB,CAAC"}
@@ -0,0 +1,109 @@
1
+ export const critique = {
2
+ name: "critique",
3
+ scenario: "design",
4
+ description: "5-dimension expert design review. Scores any HTML artifact on Philosophy Consistency, Visual Hierarchy, Detail Execution, Functionality, and Innovation (each 0-10). Outputs an HTML report with a radar chart, evidence-backed scores, and three action lists: Keep / Fix / Quick-wins.",
5
+ outputKind: "html",
6
+ workflow: `# Critique Skill · 5-Dimension Expert Review
7
+
8
+ Produce a single-file HTML design review report that scores any artifact across 5 dimensions and proposes actionable fixes.
9
+
10
+ ## When to use
11
+ - After generating an artifact (deck, prototype, landing page) and the user asks "what's wrong with this?" or "review this"
12
+ - As a self-check loop before emitting output
13
+ - For comparing two variants of the same design
14
+
15
+ ## The 5 Dimensions
16
+
17
+ ### 1. Philosophy Consistency
18
+ > Does the artifact pick a clear direction and stick to it through every micro-decision?
19
+
20
+ Look for: one declared design direction vs three styles fighting; chrome/kicker vocabulary in one register; accent/serif/mono used by the same rule throughout.
21
+ 0-4: Three styles fighting. 5-6: One direction but elements drift. 7-8: Coherent, occasional drift. 9-10: Every element argues for the same thesis.
22
+
23
+ ### 2. Visual Hierarchy
24
+ > Can a stranger figure out what to read first, second, third — without being told?
25
+
26
+ Look for: largest type = most important thing; mono/serif/sans roles match information roles; clear primary/secondary/tertiary tiers.
27
+ 0-4: Everything shouts. 5-6: Works on hero pages but breaks on body. 7-8: Clear tiers, occasional collision. 9-10: Eye moves with zero friction.
28
+
29
+ ### 3. Detail Execution
30
+ > Alignment, leading, kerning at large sizes, image framing, edge-case spacing.
31
+
32
+ Look for: big numbers on baseline or floating; left/right column tops aligned; proportions consistent across pages; orphaned <br> causing single-character lines.
33
+ 0-4: Visible tape and string. 5-6: Most pages clean, 1-2 ragged. 7-8: Polished, expert eye finds 2-3 misses. 9-10: Magazine-grade polish.
34
+
35
+ ### 4. Functionality
36
+ > Does the artifact work for its intended use?
37
+
38
+ Look for: keyboard/wheel/touch nav working in decks; CTAs above the fold; phone numbers tappable on mobile; code blocks copyable; critical info readable from 4m away.
39
+ 0-4: Visually fine but doesn't accomplish its job. 5-6: Core flow works, edge cases broken. 7-8: Robust through normal use. 9-10: Defensively engineered — handles iframe / fullscreen / paste / print.
40
+
41
+ ### 5. Innovation
42
+ > Does this push past the median? Is there one element that makes people lean in?
43
+
44
+ Look for: one unexpected layout/motion/typographic move not required; or 100% safe generic output; innovation earned (matches direction) or grafted on.
45
+ 0-4: Generic AI-slop median. 5-6: Competent and unmemorable. 7-8: One memorable moment, the rest solid. 9-10: Multiple moves you'd steal — each serving the thesis.
46
+
47
+ ## Scoring Discipline
48
+ - **Always cite evidence** — "scored 4 because hero page mixes Playfair display with Inter sans on the same line" beats "feels inconsistent"
49
+ - **Don't average up** — if Hierarchy is 5 because page 3 is broken, don't bump to 7 because pages 1-2 are fine. The score is the worst sustained band.
50
+ - **Don't grade-inflate** — a 7 means strong, not acceptable. If every score is 7+, you're not reviewing critically.
51
+ - **Innovation is allowed to be low** — 5/10 is fine for production deliverables.
52
+
53
+ ## Workflow
54
+
55
+ ### Step 1 — Acquire the artifact
56
+ 1. **Project file** — user said "review the index.html I just made": read it from the project folder.
57
+ 2. **Pasted HTML** — user pasted code in chat: read it from the message.
58
+ 3. **Self-critique** — you just emitted an artifact and want to self-critique: re-read your own output.
59
+
60
+ ### Step 2 — Read enough to score
61
+ Skim the entire <style>, then read 6-8 representative content blocks. Do not score from intent alone — the score depends on executed design, not declared intent.
62
+
63
+ ### Step 3 — Score with evidence
64
+ For each of the 5 dimensions, write the score and a 30-80 word evidence paragraph naming specific elements. Example:
65
+ \`\`\`
66
+ Dimension: Detail execution
67
+ Score: 6 / 10
68
+ Evidence: Stat-cards on page 3 align cleanly, but on page 8 the right column sits 2vh higher than the left because .callout has 3vh top margin while the figure doesn't. Image captions use mono on page 5 but sans on page 7 — pick one.
69
+ \`\`\`
70
+
71
+ ### Step 4 — Build action lists
72
+ - **Keep** (3-5 bullets) — concrete things working that the user must not break. Cite by class/page/element.
73
+ - **Fix** (3-6 bullets) — must-do, ordered by visual cost saved per minute. Each bullet ≤ 1 sentence.
74
+ - **Quick wins** (3-5 bullets) — 5-15 minutes each, high signal-to-noise.
75
+
76
+ ### Step 5 — Emit the report HTML
77
+ Build a single file with:
78
+ - Header: artifact name + date + reviewer + 1-line verdict
79
+ - Big radar chart (inline SVG, no library)
80
+ - 5 dimension cards in a 1-column or 2-column grid
81
+ - Three action lists at the bottom with checkbox affordance
82
+
83
+ Use the active design system tokens if one exists; otherwise default to a neutral light theme (white background, near-black text, one accent for radar fill).
84
+
85
+ ## Radar Chart SVG Template
86
+ \`\`\`svg
87
+ <svg viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
88
+ <!-- Pentagon grid lines -->
89
+ <polygon points="200,40 352,152 294,340 106,340 48,152" fill="none" stroke="#e0e0e0" stroke-width="1"/>
90
+ <polygon points="200,80 314,166 267,306 133,306 86,166" fill="none" stroke="#e0e0e0" stroke-width="1"/>
91
+ <polygon points="200,120 276,180 240,272 160,272 124,180" fill="none" stroke="#e0e0e0" stroke-width="1"/>
92
+ <!-- Score polygon (fill with accent at 20% opacity) -->
93
+ <polygon points="..." fill="var(--accent, #3B82F6)" fill-opacity="0.2" stroke="var(--accent, #3B82F6)" stroke-width="2"/>
94
+ <!-- Labels at each vertex -->
95
+ <text x="200" y="30" text-anchor="middle" font-size="11">Philosophy</text>
96
+ <text x="360" y="155" text-anchor="start" font-size="11">Hierarchy</text>
97
+ <text x="300" y="355" text-anchor="middle" font-size="11">Detail</text>
98
+ <text x="100" y="355" text-anchor="middle" font-size="11">Function</text>
99
+ <text x="40" y="155" text-anchor="end" font-size="11">Innovation</text>
100
+ </svg>
101
+ \`\`\`
102
+
103
+ ## Hard Rules
104
+ - **5 scores, every time** — partial reports are not allowed.
105
+ - **Evidence per score** — no "feels off" / "needs work". If you can't cite an element, the score is not justified.
106
+ - **Don't grade-inflate** — overall mean above 8 is suspicious.
107
+ - **Single-file HTML only** — no external CSS/JS. Inline everything.
108
+ - **Radar chart is mandatory** — gives the report a recognizable silhouette.`,
109
+ };