@sanity/ailf 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (530) hide show
  1. package/README.md +89 -0
  2. package/bin/ailf.js +64 -0
  3. package/canonical/grader-references/README.md +88 -0
  4. package/canonical/grader-references/groq.yaml +234 -0
  5. package/canonical/grader-references/studio-setup.yaml +275 -0
  6. package/canonical/reference-solutions/.gitkeep +1 -0
  7. package/canonical/reference-solutions/frameworks/nuxt.ts +119 -0
  8. package/canonical/reference-solutions/frameworks/remix.tsx +100 -0
  9. package/canonical/reference-solutions/functions/publish-webhook.ts +60 -0
  10. package/canonical/reference-solutions/groq/advanced-filtering.ts +379 -0
  11. package/canonical/reference-solutions/groq/blog-queries.ts +137 -0
  12. package/canonical/reference-solutions/groq/joins-references.ts +300 -0
  13. package/canonical/reference-solutions/nextjs/app-router-integration.tsx +128 -0
  14. package/canonical/reference-solutions/studio-setup/blog-schema.ts +143 -0
  15. package/canonical/reference-solutions/studio-setup/custom-tool.tsx +78 -0
  16. package/canonical/reference-solutions/visual-editing/live-preview.tsx +137 -0
  17. package/canonical/reference-solutions/visual-editing/presentation-nextjs.tsx +130 -0
  18. package/config/airbyte/ai_literacy_framework.connector.yaml +639 -0
  19. package/config/bigquery/README.md +74 -0
  20. package/config/bigquery/views/area_scores.sql +87 -0
  21. package/config/bigquery/views/reports.sql +49 -0
  22. package/config/features.yaml +116 -0
  23. package/config/models.yaml +115 -0
  24. package/config/prompts.yaml +75 -0
  25. package/config/rubrics.yaml +62 -0
  26. package/config/schedules.yaml +43 -0
  27. package/config/sinks.yaml +54 -0
  28. package/config/sources.yaml +51 -0
  29. package/config/thresholds.yaml +49 -0
  30. package/dist/_vendor/ailf-core/examples/index.d.ts +190 -0
  31. package/dist/_vendor/ailf-core/examples/index.js +285 -0
  32. package/dist/_vendor/ailf-core/index.d.ts +17 -0
  33. package/dist/_vendor/ailf-core/index.js +17 -0
  34. package/dist/_vendor/ailf-core/ports/cache-store.d.ts +72 -0
  35. package/dist/_vendor/ailf-core/ports/cache-store.js +17 -0
  36. package/dist/_vendor/ailf-core/ports/config-source.d.ts +33 -0
  37. package/dist/_vendor/ailf-core/ports/config-source.js +15 -0
  38. package/dist/_vendor/ailf-core/ports/context.d.ts +172 -0
  39. package/dist/_vendor/ailf-core/ports/context.js +14 -0
  40. package/dist/_vendor/ailf-core/ports/doc-fetcher.d.ts +131 -0
  41. package/dist/_vendor/ailf-core/ports/doc-fetcher.js +12 -0
  42. package/dist/_vendor/ailf-core/ports/eval-runner.d.ts +24 -0
  43. package/dist/_vendor/ailf-core/ports/eval-runner.js +8 -0
  44. package/dist/_vendor/ailf-core/ports/index.d.ts +15 -0
  45. package/dist/_vendor/ailf-core/ports/index.js +7 -0
  46. package/dist/_vendor/ailf-core/ports/logger.d.ts +36 -0
  47. package/dist/_vendor/ailf-core/ports/logger.js +11 -0
  48. package/dist/_vendor/ailf-core/ports/pipeline-step.d.ts +46 -0
  49. package/dist/_vendor/ailf-core/ports/pipeline-step.js +8 -0
  50. package/dist/_vendor/ailf-core/ports/task-source.d.ts +159 -0
  51. package/dist/_vendor/ailf-core/ports/task-source.js +72 -0
  52. package/dist/_vendor/ailf-core/schemas/callback-payload.d.ts +24 -0
  53. package/dist/_vendor/ailf-core/schemas/callback-payload.js +29 -0
  54. package/dist/_vendor/ailf-core/schemas/eval-config.d.ts +55 -0
  55. package/dist/_vendor/ailf-core/schemas/eval-config.js +78 -0
  56. package/dist/_vendor/ailf-core/schemas/index.d.ts +16 -0
  57. package/dist/_vendor/ailf-core/schemas/index.js +16 -0
  58. package/dist/_vendor/ailf-core/schemas/pipeline-request.d.ts +125 -0
  59. package/dist/_vendor/ailf-core/schemas/pipeline-request.js +67 -0
  60. package/dist/_vendor/ailf-core/schemas/pipeline.d.ts +531 -0
  61. package/dist/_vendor/ailf-core/schemas/pipeline.js +318 -0
  62. package/dist/_vendor/ailf-core/schemas/schedules.d.ts +68 -0
  63. package/dist/_vendor/ailf-core/schemas/schedules.js +74 -0
  64. package/dist/_vendor/ailf-core/schemas/sinks.d.ts +207 -0
  65. package/dist/_vendor/ailf-core/schemas/sinks.js +108 -0
  66. package/dist/_vendor/ailf-core/services/comparison-formatters.d.ts +18 -0
  67. package/dist/_vendor/ailf-core/services/comparison-formatters.js +189 -0
  68. package/dist/_vendor/ailf-core/services/config-helpers.d.ts +41 -0
  69. package/dist/_vendor/ailf-core/services/config-helpers.js +86 -0
  70. package/dist/_vendor/ailf-core/services/index.d.ts +12 -0
  71. package/dist/_vendor/ailf-core/services/index.js +12 -0
  72. package/dist/_vendor/ailf-core/services/scoring.d.ts +49 -0
  73. package/dist/_vendor/ailf-core/services/scoring.js +222 -0
  74. package/dist/_vendor/ailf-core/types/index.d.ts +1082 -0
  75. package/dist/_vendor/ailf-core/types/index.js +21 -0
  76. package/dist/_vendor/ailf-core/types/scoring-input.d.ts +54 -0
  77. package/dist/_vendor/ailf-core/types/scoring-input.js +9 -0
  78. package/dist/_vendor/ailf-shared/dimension-names.d.ts +21 -0
  79. package/dist/_vendor/ailf-shared/dimension-names.js +27 -0
  80. package/dist/_vendor/ailf-shared/document-ref.d.ts +29 -0
  81. package/dist/_vendor/ailf-shared/document-ref.js +1 -0
  82. package/dist/_vendor/ailf-shared/eval-modes.d.ts +12 -0
  83. package/dist/_vendor/ailf-shared/eval-modes.js +8 -0
  84. package/dist/_vendor/ailf-shared/index.d.ts +16 -0
  85. package/dist/_vendor/ailf-shared/index.js +16 -0
  86. package/dist/_vendor/ailf-shared/noise-threshold.d.ts +9 -0
  87. package/dist/_vendor/ailf-shared/noise-threshold.js +9 -0
  88. package/dist/_vendor/ailf-shared/score-grades.d.ts +17 -0
  89. package/dist/_vendor/ailf-shared/score-grades.js +23 -0
  90. package/dist/adapters/cache/content-lake-cache.d.ts +24 -0
  91. package/dist/adapters/cache/content-lake-cache.js +59 -0
  92. package/dist/adapters/cache/filesystem-cache.d.ts +18 -0
  93. package/dist/adapters/cache/filesystem-cache.js +54 -0
  94. package/dist/adapters/cache/index.d.ts +2 -0
  95. package/dist/adapters/cache/index.js +2 -0
  96. package/dist/adapters/config-sources/cli-config-adapter.d.ts +17 -0
  97. package/dist/adapters/config-sources/cli-config-adapter.js +23 -0
  98. package/dist/adapters/config-sources/file-config-adapter.d.ts +26 -0
  99. package/dist/adapters/config-sources/file-config-adapter.js +96 -0
  100. package/dist/adapters/config-sources/index.d.ts +2 -0
  101. package/dist/adapters/config-sources/index.js +2 -0
  102. package/dist/adapters/doc-fetchers/index.d.ts +1 -0
  103. package/dist/adapters/doc-fetchers/index.js +1 -0
  104. package/dist/adapters/doc-fetchers/sanity-doc-fetcher.d.ts +76 -0
  105. package/dist/adapters/doc-fetchers/sanity-doc-fetcher.js +620 -0
  106. package/dist/adapters/eval-runners/index.d.ts +1 -0
  107. package/dist/adapters/eval-runners/index.js +1 -0
  108. package/dist/adapters/eval-runners/promptfoo-eval-adapter.d.ts +14 -0
  109. package/dist/adapters/eval-runners/promptfoo-eval-adapter.js +63 -0
  110. package/dist/adapters/index.d.ts +12 -0
  111. package/dist/adapters/index.js +12 -0
  112. package/dist/adapters/loggers/console-logger.d.ts +22 -0
  113. package/dist/adapters/loggers/console-logger.js +54 -0
  114. package/dist/adapters/loggers/index.d.ts +9 -0
  115. package/dist/adapters/loggers/index.js +9 -0
  116. package/dist/adapters/loggers/json-logger.d.ts +18 -0
  117. package/dist/adapters/loggers/json-logger.js +33 -0
  118. package/dist/adapters/loggers/quiet-logger.d.ts +16 -0
  119. package/dist/adapters/loggers/quiet-logger.js +30 -0
  120. package/dist/adapters/task-sources/composite-task-source.d.ts +20 -0
  121. package/dist/adapters/task-sources/composite-task-source.js +59 -0
  122. package/dist/adapters/task-sources/content-lake-task-source.d.ts +20 -0
  123. package/dist/adapters/task-sources/content-lake-task-source.js +219 -0
  124. package/dist/adapters/task-sources/index.d.ts +7 -0
  125. package/dist/adapters/task-sources/index.js +7 -0
  126. package/dist/adapters/task-sources/repo-schemas.d.ts +245 -0
  127. package/dist/adapters/task-sources/repo-schemas.js +234 -0
  128. package/dist/adapters/task-sources/repo-task-source.d.ts +22 -0
  129. package/dist/adapters/task-sources/repo-task-source.js +104 -0
  130. package/dist/adapters/task-sources/repo-trigger.d.ts +52 -0
  131. package/dist/adapters/task-sources/repo-trigger.js +153 -0
  132. package/dist/adapters/task-sources/repo-validation.d.ts +49 -0
  133. package/dist/adapters/task-sources/repo-validation.js +164 -0
  134. package/dist/adapters/task-sources/yaml-task-source.d.ts +18 -0
  135. package/dist/adapters/task-sources/yaml-task-source.js +136 -0
  136. package/dist/agent-observer/agentic-provider.d.ts +132 -0
  137. package/dist/agent-observer/agentic-provider.js +983 -0
  138. package/dist/agent-observer/classifier.d.ts +62 -0
  139. package/dist/agent-observer/classifier.js +269 -0
  140. package/dist/agent-observer/index.d.ts +7 -0
  141. package/dist/agent-observer/index.js +4 -0
  142. package/dist/agent-observer/pricing.d.ts +35 -0
  143. package/dist/agent-observer/pricing.js +82 -0
  144. package/dist/agent-observer/provider.d.ts +77 -0
  145. package/dist/agent-observer/provider.js +151 -0
  146. package/dist/agent-observer/proxy.d.ts +91 -0
  147. package/dist/agent-observer/proxy.js +321 -0
  148. package/dist/agent-observer/test-imports.d.ts +7 -0
  149. package/dist/agent-observer/test-imports.js +185 -0
  150. package/dist/agent-observer/types.d.ts +137 -0
  151. package/dist/agent-observer/types.js +16 -0
  152. package/dist/assertions/source-isolation.d.ts +72 -0
  153. package/dist/assertions/source-isolation.js +117 -0
  154. package/dist/cli.d.ts +24 -0
  155. package/dist/cli.js +199 -0
  156. package/dist/commands/agent-report.d.ts +5 -0
  157. package/dist/commands/agent-report.js +69 -0
  158. package/dist/commands/baseline.d.ts +9 -0
  159. package/dist/commands/baseline.js +141 -0
  160. package/dist/commands/cache.d.ts +13 -0
  161. package/dist/commands/cache.js +135 -0
  162. package/dist/commands/calculate-scores.d.ts +8 -0
  163. package/dist/commands/calculate-scores.js +48 -0
  164. package/dist/commands/compare.d.ts +8 -0
  165. package/dist/commands/compare.js +120 -0
  166. package/dist/commands/completion.d.ts +18 -0
  167. package/dist/commands/completion.js +260 -0
  168. package/dist/commands/coverage-audit.d.ts +7 -0
  169. package/dist/commands/coverage-audit.js +40 -0
  170. package/dist/commands/discovery-report.d.ts +10 -0
  171. package/dist/commands/discovery-report.js +44 -0
  172. package/dist/commands/eval.d.ts +9 -0
  173. package/dist/commands/eval.js +35 -0
  174. package/dist/commands/explain-handler.d.ts +34 -0
  175. package/dist/commands/explain-handler.js +719 -0
  176. package/dist/commands/fetch-docs.d.ts +8 -0
  177. package/dist/commands/fetch-docs.js +128 -0
  178. package/dist/commands/generate-configs.d.ts +8 -0
  179. package/dist/commands/generate-configs.js +46 -0
  180. package/dist/commands/grader/index.d.ts +11 -0
  181. package/dist/commands/grader/index.js +118 -0
  182. package/dist/commands/init.d.ts +19 -0
  183. package/dist/commands/init.js +150 -0
  184. package/dist/commands/interactive.d.ts +12 -0
  185. package/dist/commands/interactive.js +238 -0
  186. package/dist/commands/lookup-doc.d.ts +15 -0
  187. package/dist/commands/lookup-doc.js +84 -0
  188. package/dist/commands/measure-retrieval.d.ts +5 -0
  189. package/dist/commands/measure-retrieval.js +65 -0
  190. package/dist/commands/pipeline-action.d.ts +71 -0
  191. package/dist/commands/pipeline-action.js +305 -0
  192. package/dist/commands/pipeline.d.ts +62 -0
  193. package/dist/commands/pipeline.js +53 -0
  194. package/dist/commands/pr-comment.d.ts +8 -0
  195. package/dist/commands/pr-comment.js +47 -0
  196. package/dist/commands/publish.d.ts +26 -0
  197. package/dist/commands/publish.js +253 -0
  198. package/dist/commands/readiness-report.d.ts +10 -0
  199. package/dist/commands/readiness-report.js +104 -0
  200. package/dist/commands/shared/options.d.ts +29 -0
  201. package/dist/commands/shared/options.js +57 -0
  202. package/dist/commands/update-quality-scores.d.ts +5 -0
  203. package/dist/commands/update-quality-scores.js +20 -0
  204. package/dist/commands/validate-tasks.d.ts +16 -0
  205. package/dist/commands/validate-tasks.js +93 -0
  206. package/dist/commands/validate.d.ts +9 -0
  207. package/dist/commands/validate.js +73 -0
  208. package/dist/commands/webhook-server.d.ts +5 -0
  209. package/dist/commands/webhook-server.js +30 -0
  210. package/dist/commands/weekly-digest.d.ts +10 -0
  211. package/dist/commands/weekly-digest.js +104 -0
  212. package/dist/composition-root.d.ts +26 -0
  213. package/dist/composition-root.js +107 -0
  214. package/dist/interpolate.d.ts +26 -0
  215. package/dist/interpolate.js +70 -0
  216. package/dist/job-store.d.ts +104 -0
  217. package/dist/job-store.js +188 -0
  218. package/dist/lib/agent-behavior-report.d.ts +8 -0
  219. package/dist/lib/agent-behavior-report.js +185 -0
  220. package/dist/lib/baseline.d.ts +19 -0
  221. package/dist/lib/baseline.js +153 -0
  222. package/dist/lib/calculate-scores.d.ts +23 -0
  223. package/dist/lib/calculate-scores.js +42 -0
  224. package/dist/lib/compare.d.ts +18 -0
  225. package/dist/lib/compare.js +170 -0
  226. package/dist/lib/coverage-audit.d.ts +4 -0
  227. package/dist/lib/coverage-audit.js +42 -0
  228. package/dist/lib/discovery-report.d.ts +13 -0
  229. package/dist/lib/discovery-report.js +57 -0
  230. package/dist/lib/fetch-docs.d.ts +30 -0
  231. package/dist/lib/fetch-docs.js +171 -0
  232. package/dist/lib/generate-configs.d.ts +25 -0
  233. package/dist/lib/generate-configs.js +42 -0
  234. package/dist/lib/grader-api.d.ts +21 -0
  235. package/dist/lib/grader-api.js +34 -0
  236. package/dist/lib/grader-compare.d.ts +19 -0
  237. package/dist/lib/grader-compare.js +91 -0
  238. package/dist/lib/grader-consistency.d.ts +27 -0
  239. package/dist/lib/grader-consistency.js +79 -0
  240. package/dist/lib/grader-sensitivity.d.ts +19 -0
  241. package/dist/lib/grader-sensitivity.js +75 -0
  242. package/dist/lib/grader-validate.d.ts +19 -0
  243. package/dist/lib/grader-validate.js +78 -0
  244. package/dist/lib/measure-retrieval.d.ts +14 -0
  245. package/dist/lib/measure-retrieval.js +71 -0
  246. package/dist/lib/pr-comment.d.ts +16 -0
  247. package/dist/lib/pr-comment.js +28 -0
  248. package/dist/lib/readiness-report.d.ts +13 -0
  249. package/dist/lib/readiness-report.js +108 -0
  250. package/dist/lib/webhook-server.d.ts +11 -0
  251. package/dist/lib/webhook-server.js +24 -0
  252. package/dist/lib/weekly-digest.d.ts +24 -0
  253. package/dist/lib/weekly-digest.js +148 -0
  254. package/dist/orchestration/build-app-context.d.ts +27 -0
  255. package/dist/orchestration/build-app-context.js +81 -0
  256. package/dist/orchestration/build-step-sequence.d.ts +15 -0
  257. package/dist/orchestration/build-step-sequence.js +84 -0
  258. package/dist/orchestration/config-to-source-overrides.d.ts +9 -0
  259. package/dist/orchestration/config-to-source-overrides.js +28 -0
  260. package/dist/orchestration/env-bridge.d.ts +21 -0
  261. package/dist/orchestration/env-bridge.js +66 -0
  262. package/dist/orchestration/index.d.ts +11 -0
  263. package/dist/orchestration/index.js +11 -0
  264. package/dist/orchestration/pipeline-orchestrator.d.ts +24 -0
  265. package/dist/orchestration/pipeline-orchestrator.js +153 -0
  266. package/dist/orchestration/step-runner.d.ts +20 -0
  267. package/dist/orchestration/step-runner.js +88 -0
  268. package/dist/orchestration/steps/calculate-scores-step.d.ts +13 -0
  269. package/dist/orchestration/steps/calculate-scores-step.js +95 -0
  270. package/dist/orchestration/steps/callback-step.d.ts +24 -0
  271. package/dist/orchestration/steps/callback-step.js +76 -0
  272. package/dist/orchestration/steps/compare-step.d.ts +14 -0
  273. package/dist/orchestration/steps/compare-step.js +92 -0
  274. package/dist/orchestration/steps/discovery-report-step.d.ts +13 -0
  275. package/dist/orchestration/steps/discovery-report-step.js +55 -0
  276. package/dist/orchestration/steps/fetch-docs-shell.d.ts +17 -0
  277. package/dist/orchestration/steps/fetch-docs-shell.js +30 -0
  278. package/dist/orchestration/steps/fetch-docs-step.d.ts +14 -0
  279. package/dist/orchestration/steps/fetch-docs-step.js +135 -0
  280. package/dist/orchestration/steps/gap-analysis-step.d.ts +16 -0
  281. package/dist/orchestration/steps/gap-analysis-step.js +136 -0
  282. package/dist/orchestration/steps/generate-configs-step.d.ts +14 -0
  283. package/dist/orchestration/steps/generate-configs-step.js +85 -0
  284. package/dist/orchestration/steps/grader-consistency-step.d.ts +13 -0
  285. package/dist/orchestration/steps/grader-consistency-step.js +64 -0
  286. package/dist/orchestration/steps/index.d.ts +19 -0
  287. package/dist/orchestration/steps/index.js +19 -0
  288. package/dist/orchestration/steps/mirror-repo-tasks-step.d.ts +21 -0
  289. package/dist/orchestration/steps/mirror-repo-tasks-step.js +94 -0
  290. package/dist/orchestration/steps/publish-report-step.d.ts +26 -0
  291. package/dist/orchestration/steps/publish-report-step.js +216 -0
  292. package/dist/orchestration/steps/readiness-step.d.ts +13 -0
  293. package/dist/orchestration/steps/readiness-step.js +91 -0
  294. package/dist/orchestration/steps/report-step.d.ts +12 -0
  295. package/dist/orchestration/steps/report-step.js +49 -0
  296. package/dist/orchestration/steps/run-eval-step.d.ts +17 -0
  297. package/dist/orchestration/steps/run-eval-step.js +195 -0
  298. package/dist/orchestration/steps/validate-step.d.ts +12 -0
  299. package/dist/orchestration/steps/validate-step.js +41 -0
  300. package/dist/pipeline/agent-behavior-report.d.ts +53 -0
  301. package/dist/pipeline/agent-behavior-report.js +132 -0
  302. package/dist/pipeline/attribution.d.ts +47 -0
  303. package/dist/pipeline/attribution.js +226 -0
  304. package/dist/pipeline/baseline.d.ts +37 -0
  305. package/dist/pipeline/baseline.js +141 -0
  306. package/dist/pipeline/cache.d.ts +101 -0
  307. package/dist/pipeline/cache.js +283 -0
  308. package/dist/pipeline/calculate-scores.d.ts +102 -0
  309. package/dist/pipeline/calculate-scores.js +1128 -0
  310. package/dist/pipeline/callback-delivery.d.ts +50 -0
  311. package/dist/pipeline/callback-delivery.js +89 -0
  312. package/dist/pipeline/checks.d.ts +39 -0
  313. package/dist/pipeline/checks.js +280 -0
  314. package/dist/pipeline/classify-url.d.ts +61 -0
  315. package/dist/pipeline/classify-url.js +93 -0
  316. package/dist/pipeline/compare.d.ts +31 -0
  317. package/dist/pipeline/compare.js +208 -0
  318. package/dist/pipeline/coverage-audit.d.ts +39 -0
  319. package/dist/pipeline/coverage-audit.js +165 -0
  320. package/dist/pipeline/degradations.d.ts +85 -0
  321. package/dist/pipeline/degradations.js +242 -0
  322. package/dist/pipeline/discovery-report.d.ts +55 -0
  323. package/dist/pipeline/discovery-report.js +178 -0
  324. package/dist/pipeline/eval-constants.d.ts +68 -0
  325. package/dist/pipeline/eval-constants.js +111 -0
  326. package/dist/pipeline/eval-fingerprint.d.ts +66 -0
  327. package/dist/pipeline/eval-fingerprint.js +175 -0
  328. package/dist/pipeline/expand-tasks.d.ts +220 -0
  329. package/dist/pipeline/expand-tasks.js +421 -0
  330. package/dist/pipeline/failure-modes.d.ts +46 -0
  331. package/dist/pipeline/failure-modes.js +348 -0
  332. package/dist/pipeline/fetch-url-content.d.ts +44 -0
  333. package/dist/pipeline/fetch-url-content.js +93 -0
  334. package/dist/pipeline/gap-analysis.d.ts +48 -0
  335. package/dist/pipeline/gap-analysis.js +231 -0
  336. package/dist/pipeline/generate-configs.d.ts +72 -0
  337. package/dist/pipeline/generate-configs.js +395 -0
  338. package/dist/pipeline/grader-api.d.ts +49 -0
  339. package/dist/pipeline/grader-api.js +200 -0
  340. package/dist/pipeline/grader-compare-runner.d.ts +44 -0
  341. package/dist/pipeline/grader-compare-runner.js +301 -0
  342. package/dist/pipeline/grader-comparison.d.ts +111 -0
  343. package/dist/pipeline/grader-comparison.js +161 -0
  344. package/dist/pipeline/grader-consistency-runner.d.ts +60 -0
  345. package/dist/pipeline/grader-consistency-runner.js +270 -0
  346. package/dist/pipeline/grader-consistency.d.ts +103 -0
  347. package/dist/pipeline/grader-consistency.js +146 -0
  348. package/dist/pipeline/grader-sensitivity-runner.d.ts +40 -0
  349. package/dist/pipeline/grader-sensitivity-runner.js +282 -0
  350. package/dist/pipeline/grader-sensitivity.d.ts +94 -0
  351. package/dist/pipeline/grader-sensitivity.js +144 -0
  352. package/dist/pipeline/grader-validate-runner.d.ts +38 -0
  353. package/dist/pipeline/grader-validate-runner.js +229 -0
  354. package/dist/pipeline/grader-validation.d.ts +107 -0
  355. package/dist/pipeline/grader-validation.js +169 -0
  356. package/dist/pipeline/map-request-to-config.d.ts +19 -0
  357. package/dist/pipeline/map-request-to-config.js +80 -0
  358. package/dist/pipeline/measure-retrieval.d.ts +59 -0
  359. package/dist/pipeline/measure-retrieval.js +111 -0
  360. package/dist/pipeline/mirror-repo-tasks.d.ts +86 -0
  361. package/dist/pipeline/mirror-repo-tasks.js +350 -0
  362. package/dist/pipeline/plan-format.d.ts +33 -0
  363. package/dist/pipeline/plan-format.js +202 -0
  364. package/dist/pipeline/plan.d.ts +169 -0
  365. package/dist/pipeline/plan.js +708 -0
  366. package/dist/pipeline/pr-comment.d.ts +19 -0
  367. package/dist/pipeline/pr-comment.js +502 -0
  368. package/dist/pipeline/probe.d.ts +52 -0
  369. package/dist/pipeline/probe.js +390 -0
  370. package/dist/pipeline/provenance.d.ts +47 -0
  371. package/dist/pipeline/provenance.js +146 -0
  372. package/dist/pipeline/readiness-report.d.ts +87 -0
  373. package/dist/pipeline/readiness-report.js +205 -0
  374. package/dist/pipeline/release-classification.d.ts +54 -0
  375. package/dist/pipeline/release-classification.js +238 -0
  376. package/dist/pipeline/release-report.d.ts +37 -0
  377. package/dist/pipeline/release-report.js +222 -0
  378. package/dist/pipeline/repo-eval-comment.d.ts +37 -0
  379. package/dist/pipeline/repo-eval-comment.js +165 -0
  380. package/dist/pipeline/repo-threshold-evaluator.d.ts +89 -0
  381. package/dist/pipeline/repo-threshold-evaluator.js +162 -0
  382. package/dist/pipeline/resolve-mappings.d.ts +35 -0
  383. package/dist/pipeline/resolve-mappings.js +72 -0
  384. package/dist/pipeline/retrieval-metrics.d.ts +39 -0
  385. package/dist/pipeline/retrieval-metrics.js +136 -0
  386. package/dist/pipeline/reverse-mapping.d.ts +67 -0
  387. package/dist/pipeline/reverse-mapping.js +88 -0
  388. package/dist/pipeline/schemas.d.ts +9 -0
  389. package/dist/pipeline/schemas.js +9 -0
  390. package/dist/pipeline/steps/calculate-scores-step.d.ts +11 -0
  391. package/dist/pipeline/steps/calculate-scores-step.js +89 -0
  392. package/dist/pipeline/steps/compare-step.d.ts +18 -0
  393. package/dist/pipeline/steps/compare-step.js +90 -0
  394. package/dist/pipeline/steps/eval-step.d.ts +53 -0
  395. package/dist/pipeline/steps/eval-step.js +347 -0
  396. package/dist/pipeline/steps/fetch-docs-step.d.ts +11 -0
  397. package/dist/pipeline/steps/fetch-docs-step.js +84 -0
  398. package/dist/pipeline/steps/generate-configs-step.d.ts +11 -0
  399. package/dist/pipeline/steps/generate-configs-step.js +98 -0
  400. package/dist/pipeline/steps/grader-consistency-step.d.ts +21 -0
  401. package/dist/pipeline/steps/grader-consistency-step.js +74 -0
  402. package/dist/pipeline/steps/publish-report-step.d.ts +57 -0
  403. package/dist/pipeline/steps/publish-report-step.js +243 -0
  404. package/dist/pipeline/steps/report-step.d.ts +13 -0
  405. package/dist/pipeline/steps/report-step.js +56 -0
  406. package/dist/pipeline/steps/update-scores-step.d.ts +11 -0
  407. package/dist/pipeline/steps/update-scores-step.js +42 -0
  408. package/dist/pipeline/targeted-loo.d.ts +88 -0
  409. package/dist/pipeline/targeted-loo.js +203 -0
  410. package/dist/pipeline/thresholds.d.ts +27 -0
  411. package/dist/pipeline/thresholds.js +245 -0
  412. package/dist/pipeline/types.d.ts +10 -0
  413. package/dist/pipeline/types.js +10 -0
  414. package/dist/pipeline/validate.d.ts +67 -0
  415. package/dist/pipeline/validate.js +406 -0
  416. package/dist/pipeline/webhook-server.d.ts +37 -0
  417. package/dist/pipeline/webhook-server.js +133 -0
  418. package/dist/report-store.d.ts +84 -0
  419. package/dist/report-store.js +208 -0
  420. package/dist/sanity/client.d.ts +38 -0
  421. package/dist/sanity/client.js +86 -0
  422. package/dist/sanity/portable-text.d.ts +11 -0
  423. package/dist/sanity/portable-text.js +211 -0
  424. package/dist/sanity/queries.d.ts +133 -0
  425. package/dist/sanity/queries.js +300 -0
  426. package/dist/schedules/digest.d.ts +116 -0
  427. package/dist/schedules/digest.js +156 -0
  428. package/dist/schedules/index.d.ts +12 -0
  429. package/dist/schedules/index.js +10 -0
  430. package/dist/schedules/loader.d.ts +31 -0
  431. package/dist/schedules/loader.js +73 -0
  432. package/dist/schedules/schema.d.ts +9 -0
  433. package/dist/schedules/schema.js +9 -0
  434. package/dist/scripts/agent-behavior-report.d.ts +19 -0
  435. package/dist/scripts/agent-behavior-report.js +315 -0
  436. package/dist/scripts/baseline.d.ts +43 -0
  437. package/dist/scripts/baseline.js +267 -0
  438. package/dist/scripts/calculate-scores.d.ts +166 -0
  439. package/dist/scripts/calculate-scores.js +1296 -0
  440. package/dist/scripts/compare.d.ts +22 -0
  441. package/dist/scripts/compare.js +334 -0
  442. package/dist/scripts/coverage-audit.d.ts +44 -0
  443. package/dist/scripts/coverage-audit.js +209 -0
  444. package/dist/scripts/debug-eval.d.ts +19 -0
  445. package/dist/scripts/debug-eval.js +73 -0
  446. package/dist/scripts/discovery-report.d.ts +58 -0
  447. package/dist/scripts/discovery-report.js +250 -0
  448. package/dist/scripts/fetch-docs.d.ts +35 -0
  449. package/dist/scripts/fetch-docs.js +472 -0
  450. package/dist/scripts/generate-configs.d.ts +66 -0
  451. package/dist/scripts/generate-configs.js +459 -0
  452. package/dist/scripts/grader-api.d.ts +27 -0
  453. package/dist/scripts/grader-api.js +206 -0
  454. package/dist/scripts/grader-compare.d.ts +22 -0
  455. package/dist/scripts/grader-compare.js +368 -0
  456. package/dist/scripts/grader-consistency.d.ts +20 -0
  457. package/dist/scripts/grader-consistency.js +313 -0
  458. package/dist/scripts/grader-sensitivity.d.ts +22 -0
  459. package/dist/scripts/grader-sensitivity.js +354 -0
  460. package/dist/scripts/grader-validate.d.ts +19 -0
  461. package/dist/scripts/grader-validate.js +267 -0
  462. package/dist/scripts/measure-retrieval.d.ts +10 -0
  463. package/dist/scripts/measure-retrieval.js +145 -0
  464. package/dist/scripts/migrate-tasks-to-content-lake.d.ts +24 -0
  465. package/dist/scripts/migrate-tasks-to-content-lake.js +327 -0
  466. package/dist/scripts/pipeline.d.ts +76 -0
  467. package/dist/scripts/pipeline.js +1031 -0
  468. package/dist/scripts/pr-comment.d.ts +10 -0
  469. package/dist/scripts/pr-comment.js +510 -0
  470. package/dist/scripts/readiness-report.d.ts +88 -0
  471. package/dist/scripts/readiness-report.js +342 -0
  472. package/dist/scripts/update-quality-scores.d.ts +15 -0
  473. package/dist/scripts/update-quality-scores.js +184 -0
  474. package/dist/scripts/validate-task-sources.d.ts +21 -0
  475. package/dist/scripts/validate-task-sources.js +210 -0
  476. package/dist/scripts/validate.d.ts +13 -0
  477. package/dist/scripts/validate.js +79 -0
  478. package/dist/scripts/webhook-server.d.ts +26 -0
  479. package/dist/scripts/webhook-server.js +147 -0
  480. package/dist/scripts/weekly-digest.d.ts +24 -0
  481. package/dist/scripts/weekly-digest.js +144 -0
  482. package/dist/sinks/bigquery/index.d.ts +131 -0
  483. package/dist/sinks/bigquery/index.js +222 -0
  484. package/dist/sinks/format-slack.d.ts +64 -0
  485. package/dist/sinks/format-slack.js +306 -0
  486. package/dist/sinks/index.d.ts +23 -0
  487. package/dist/sinks/index.js +18 -0
  488. package/dist/sinks/loader.d.ts +18 -0
  489. package/dist/sinks/loader.js +82 -0
  490. package/dist/sinks/retry.d.ts +24 -0
  491. package/dist/sinks/retry.js +52 -0
  492. package/dist/sinks/schema.d.ts +9 -0
  493. package/dist/sinks/schema.js +9 -0
  494. package/dist/sinks/slack/format.d.ts +65 -0
  495. package/dist/sinks/slack/format.js +327 -0
  496. package/dist/sinks/slack/index.d.ts +27 -0
  497. package/dist/sinks/slack/index.js +78 -0
  498. package/dist/sinks/slack-sink.d.ts +27 -0
  499. package/dist/sinks/slack-sink.js +78 -0
  500. package/dist/sinks/types.d.ts +59 -0
  501. package/dist/sinks/types.js +44 -0
  502. package/dist/sinks/webhook/index.d.ts +19 -0
  503. package/dist/sinks/webhook/index.js +50 -0
  504. package/dist/sinks/webhook-sink.d.ts +19 -0
  505. package/dist/sinks/webhook-sink.js +50 -0
  506. package/dist/sources.d.ts +104 -0
  507. package/dist/sources.js +292 -0
  508. package/dist/webhook/budget.d.ts +42 -0
  509. package/dist/webhook/budget.js +60 -0
  510. package/dist/webhook/debounce.d.ts +67 -0
  511. package/dist/webhook/debounce.js +76 -0
  512. package/dist/webhook/dispatch.d.ts +45 -0
  513. package/dist/webhook/dispatch.js +84 -0
  514. package/dist/webhook/eval-request-handler.d.ts +87 -0
  515. package/dist/webhook/eval-request-handler.js +181 -0
  516. package/dist/webhook/handler.d.ts +88 -0
  517. package/dist/webhook/handler.js +203 -0
  518. package/dist/webhook/index.d.ts +17 -0
  519. package/dist/webhook/index.js +12 -0
  520. package/dist/webhook/types.d.ts +109 -0
  521. package/dist/webhook/types.js +10 -0
  522. package/package.json +72 -0
  523. package/tasks/.expanded.agentic.yaml +51 -0
  524. package/tasks/.expanded.yaml +66 -0
  525. package/tasks/frameworks.yaml +98 -0
  526. package/tasks/functions.yaml +51 -0
  527. package/tasks/groq.yaml +216 -0
  528. package/tasks/nextjs-live.yaml +62 -0
  529. package/tasks/studio-setup.yaml +111 -0
  530. package/tasks/visual-editing.yaml +120 -0
@@ -0,0 +1,275 @@
1
+ # studio-setup.yaml — Human-graded reference samples for Studio Setup tasks
2
+ #
3
+ # Real LLM responses from eval runs, graded by a human expert.
4
+ # Used by `pnpm grader-validate` to measure grader accuracy.
5
+
6
+ - taskId: studio-blog-schema
7
+ area: studio-setup
8
+ response: |
9
+ To set up a Sanity Studio with a blog schema, here's a complete implementation:
10
+
11
+ ```typescript
12
+ // sanity.config.ts
13
+ import { defineConfig } from 'sanity'
14
+ import { structureTool } from 'sanity/structure'
15
+ import { schemaTypes } from './schemas'
16
+
17
+ export default defineConfig({
18
+ name: 'default',
19
+ title: 'My Blog',
20
+ projectId: '<your-project-id>',
21
+ dataset: 'production',
22
+ plugins: [structureTool()],
23
+ schema: {
24
+ types: schemaTypes,
25
+ },
26
+ })
27
+
28
+ // schemas/index.ts
29
+ import { post } from './post'
30
+ import { author } from './author'
31
+ import { category } from './category'
32
+
33
+ export const schemaTypes = [post, author, category]
34
+
35
+ // schemas/post.ts
36
+ import { defineType, defineField } from 'sanity'
37
+
38
+ export const post = defineType({
39
+ name: 'post',
40
+ title: 'Post',
41
+ type: 'document',
42
+ fields: [
43
+ defineField({
44
+ name: 'title',
45
+ title: 'Title',
46
+ type: 'string',
47
+ validation: (rule) => rule.required(),
48
+ }),
49
+ defineField({
50
+ name: 'slug',
51
+ title: 'Slug',
52
+ type: 'slug',
53
+ options: { source: 'title', maxLength: 96 },
54
+ }),
55
+ defineField({
56
+ name: 'author',
57
+ title: 'Author',
58
+ type: 'reference',
59
+ to: [{ type: 'author' }],
60
+ }),
61
+ defineField({
62
+ name: 'categories',
63
+ title: 'Categories',
64
+ type: 'array',
65
+ of: [{ type: 'reference', to: [{ type: 'category' }] }],
66
+ }),
67
+ defineField({
68
+ name: 'publishedAt',
69
+ title: 'Published at',
70
+ type: 'datetime',
71
+ }),
72
+ defineField({
73
+ name: 'body',
74
+ title: 'Body',
75
+ type: 'array',
76
+ of: [{ type: 'block' }],
77
+ }),
78
+ ],
79
+ })
80
+
81
+ // schemas/author.ts
82
+ import { defineType, defineField } from 'sanity'
83
+
84
+ export const author = defineType({
85
+ name: 'author',
86
+ title: 'Author',
87
+ type: 'document',
88
+ fields: [
89
+ defineField({
90
+ name: 'name',
91
+ title: 'Name',
92
+ type: 'string',
93
+ validation: (rule) => rule.required(),
94
+ }),
95
+ defineField({
96
+ name: 'bio',
97
+ title: 'Bio',
98
+ type: 'text',
99
+ }),
100
+ defineField({
101
+ name: 'image',
102
+ title: 'Image',
103
+ type: 'image',
104
+ options: { hotspot: true },
105
+ }),
106
+ ],
107
+ })
108
+
109
+ // schemas/category.ts
110
+ import { defineType, defineField } from 'sanity'
111
+
112
+ export const category = defineType({
113
+ name: 'category',
114
+ title: 'Category',
115
+ type: 'document',
116
+ fields: [
117
+ defineField({
118
+ name: 'title',
119
+ title: 'Title',
120
+ type: 'string',
121
+ }),
122
+ defineField({
123
+ name: 'description',
124
+ title: 'Description',
125
+ type: 'text',
126
+ }),
127
+ ],
128
+ })
129
+ ```
130
+ rubrics:
131
+ - dimension: task-completion
132
+ rubricText: |
133
+ Score task completion from 0 to 100:
134
+ - 0: Couldn't attempt — missing critical information
135
+ - 20: Attempted but fundamentally wrong approach
136
+ - 50: Partial implementation — major functional gaps
137
+ - 80: Mostly complete — minor issues or missing edge cases
138
+ - 100: Fully functional code — works as expected
139
+
140
+ Must demonstrate:
141
+ - Three document types: post, author, category
142
+ - Post includes Portable Text body (array of blocks)
143
+ - Post has reference to author
144
+ - Post has array of references to categories
145
+ - sanity.config.ts with defineConfig and schema registration
146
+
147
+ Return ONLY a JSON object: {"score": <number>, "reason": "<explanation>"}
148
+ humanScore: 95
149
+ notes:
150
+ "All criteria met. Clean separation of schema files, proper use of
151
+ defineType/defineField, correct reference patterns, Portable Text body."
152
+ - dimension: code-correctness
153
+ rubricText: |
154
+ Score code correctness from 0 to 100:
155
+ - 0: Broken code, syntax errors, or deprecated APIs
156
+ - 30: Works but uses anti-patterns or inefficient approaches
157
+ - 50: Works but not idiomatic
158
+ - 80: Follows most best practices
159
+ - 100: Follows all best practices, idiomatic implementation
160
+
161
+ Check for:
162
+ - Uses defineConfig, defineType, defineField (not deprecated createSchema)
163
+ - Correct reference syntax: type: 'reference', to: [{type: 'author'}]
164
+ - Portable Text as array of blocks: type: 'array', of: [{type: 'block'}]
165
+ - Proper validation rules
166
+ - Schema registered via schema.types in config
167
+
168
+ Return ONLY a JSON object: {"score": <number>, "reason": "<explanation>"}
169
+ humanScore: 90
170
+ notes:
171
+ "All modern APIs used correctly. defineConfig, defineType, defineField
172
+ all proper. Reference syntax correct. Validation on required fields.
173
+ Only minor: could add preview configuration."
174
+ - dimension: doc-coverage
175
+ rubricText: |
176
+ Score documentation coverage from 0 to 100:
177
+ - 0: Had to hallucinate/guess most implementation details
178
+ - 30: Significant gaps — filled with assumptions
179
+ - 50: Some gaps — inferred from partial information
180
+ - 80: Minor gaps — almost everything was documented
181
+ - 100: Complete coverage — all necessary info was in docs
182
+
183
+ Return ONLY a JSON object: {"score": <number>, "reason": "<explanation>"}
184
+ humanScore: 85
185
+ notes:
186
+ "All patterns match documented APIs. structureTool import, schema
187
+ registration, field types — all from docs. The slug options.source
188
+ pattern is documented."
189
+ gradedBy: "senior-engineer"
190
+ gradedAt: "2026-03-10"
191
+
192
+ - taskId: studio-blog-schema
193
+ area: studio-setup
194
+ response: |
195
+ Here's a basic blog schema for Sanity:
196
+
197
+ ```javascript
198
+ // schema.js
199
+ export default createSchema({
200
+ name: 'default',
201
+ types: [
202
+ {
203
+ name: 'post',
204
+ type: 'document',
205
+ fields: [
206
+ { name: 'title', type: 'string' },
207
+ { name: 'body', type: 'text' },
208
+ { name: 'author', type: 'string' },
209
+ ]
210
+ }
211
+ ]
212
+ })
213
+ ```
214
+ rubrics:
215
+ - dimension: task-completion
216
+ rubricText: |
217
+ Score task completion from 0 to 100:
218
+ - 0: Couldn't attempt — missing critical information
219
+ - 20: Attempted but fundamentally wrong approach
220
+ - 50: Partial implementation — major functional gaps
221
+ - 80: Mostly complete — minor issues or missing edge cases
222
+ - 100: Fully functional code — works as expected
223
+
224
+ Must demonstrate:
225
+ - Three document types: post, author, category
226
+ - Post includes Portable Text body (array of blocks)
227
+ - Post has reference to author
228
+ - Post has array of references to categories
229
+ - sanity.config.ts with defineConfig and schema registration
230
+
231
+ Return ONLY a JSON object: {"score": <number>, "reason": "<explanation>"}
232
+ humanScore: 15
233
+ notes:
234
+ "Only post type defined (missing author, category). Body is plain text
235
+ not Portable Text. Author is a string not a reference. No categories.
236
+ Uses deprecated createSchema."
237
+ - dimension: code-correctness
238
+ rubricText: |
239
+ Score code correctness from 0 to 100:
240
+ - 0: Broken code, syntax errors, or deprecated APIs
241
+ - 30: Works but uses anti-patterns or inefficient approaches
242
+ - 50: Works but not idiomatic
243
+ - 80: Follows most best practices
244
+ - 100: Follows all best practices, idiomatic implementation
245
+
246
+ Check for:
247
+ - Uses defineConfig, defineType, defineField (not deprecated createSchema)
248
+ - Correct reference syntax: type: 'reference', to: [{type: 'author'}]
249
+ - Portable Text as array of blocks: type: 'array', of: [{type: 'block'}]
250
+ - Proper validation rules
251
+ - Schema registered via schema.types in config
252
+
253
+ Return ONLY a JSON object: {"score": <number>, "reason": "<explanation>"}
254
+ humanScore: 5
255
+ notes:
256
+ "Uses deprecated createSchema (removed in Sanity v3). No
257
+ defineType/defineField. Plain JavaScript instead of TypeScript. No
258
+ references, no Portable Text, no validation."
259
+ - dimension: doc-coverage
260
+ rubricText: |
261
+ Score documentation coverage from 0 to 100:
262
+ - 0: Had to hallucinate/guess most implementation details
263
+ - 30: Significant gaps — filled with assumptions
264
+ - 50: Some gaps — inferred from partial information
265
+ - 80: Minor gaps — almost everything was documented
266
+ - 100: Complete coverage — all necessary info was in docs
267
+
268
+ Return ONLY a JSON object: {"score": <number>, "reason": "<explanation>"}
269
+ humanScore: 5
270
+ notes:
271
+ "Entirely based on outdated v2 patterns. createSchema is deprecated.
272
+ None of the documented v3 APIs (defineConfig, defineType, structureTool)
273
+ are used."
274
+ gradedBy: "senior-engineer"
275
+ gradedAt: "2026-03-10"
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Reference Solution: Sanity Integration with Nuxt
3
+ *
4
+ * Demonstrates:
5
+ * - Installing and configuring @sanity/nuxt module
6
+ * - Setting up the Sanity module in nuxt.config.ts
7
+ * - Using useSanityQuery composable for data fetching
8
+ * - Rendering portable text content in Vue components
9
+ *
10
+ * Note: Vue template syntax is shown in comments since this is a .ts file.
11
+ */
12
+
13
+ // === Part 1: Nuxt Configuration (nuxt.config.ts) ===
14
+
15
+ export default defineNuxtConfig({
16
+ modules: ["@sanity/nuxt"],
17
+ sanity: {
18
+ projectId: "your-project-id",
19
+ dataset: "production",
20
+ apiVersion: "2024-01-01",
21
+ // useCdn: true is the default for production
22
+ },
23
+ })
24
+
25
+ // === Part 2: Posts List Page (pages/posts/index.vue) ===
26
+ //
27
+ // <template>
28
+ // <main>
29
+ // <h1>Blog Posts</h1>
30
+ // <ul v-if="data">
31
+ // <li v-for="post in data" :key="post._id">
32
+ // <NuxtLink :to="`/posts/${post.slug}`">
33
+ // <h2>{{ post.title }}</h2>
34
+ // <p>{{ post.excerpt }}</p>
35
+ // </NuxtLink>
36
+ // </li>
37
+ // </ul>
38
+ // </main>
39
+ // </template>
40
+ //
41
+ // <script setup lang="ts">
42
+ // import { groq } from "groq"
43
+ //
44
+ // const query = groq`*[_type == "post"] | order(publishedAt desc) {
45
+ // _id,
46
+ // title,
47
+ // "slug": slug.current,
48
+ // excerpt,
49
+ // }`
50
+ //
51
+ // const { data } = useSanityQuery(query)
52
+ // </script>
53
+
54
+ // === Part 3: Individual Post Page (pages/posts/[slug].vue) ===
55
+ //
56
+ // <template>
57
+ // <article v-if="data">
58
+ // <h1>{{ data.title }}</h1>
59
+ // <time :datetime="data.publishedAt">
60
+ // {{ new Date(data.publishedAt).toLocaleDateString() }}
61
+ // </time>
62
+ // <SanityContent :blocks="data.body" />
63
+ // </article>
64
+ // </template>
65
+ //
66
+ // <script setup lang="ts">
67
+ // import { groq } from "groq"
68
+ //
69
+ // const route = useRoute()
70
+ // const query = groq`*[_type == "post" && slug.current == $slug][0] {
71
+ // _id,
72
+ // title,
73
+ // body,
74
+ // publishedAt,
75
+ // }`
76
+ //
77
+ // const { data } = useSanityQuery(query, { slug: route.params.slug })
78
+ // </script>
79
+
80
+ // === Part 4: Sanity Studio Embedded (nuxt.config.ts addition) ===
81
+
82
+ // To embed Sanity Studio directly in the Nuxt app:
83
+ export const studioConfig = defineNuxtConfig({
84
+ modules: ["@sanity/nuxt"],
85
+ sanity: {
86
+ projectId: "your-project-id",
87
+ dataset: "production",
88
+ apiVersion: "2024-01-01",
89
+ // Enable the embedded studio at /studio route
90
+ studio: {
91
+ studioHost: "your-studio-host",
92
+ },
93
+ },
94
+ })
95
+
96
+ // === Part 5: Server API Route (server/api/posts.ts) ===
97
+ //
98
+ // For server-side data fetching with full control:
99
+
100
+ import { createClient } from "@sanity/client"
101
+
102
+ const client = createClient({
103
+ projectId: "your-project-id",
104
+ dataset: "production",
105
+ apiVersion: "2024-01-01",
106
+ useCdn: true,
107
+ })
108
+
109
+ const POSTS_QUERY = `*[_type == "post"] | order(publishedAt desc) {
110
+ _id,
111
+ title,
112
+ "slug": slug.current,
113
+ }`
114
+
115
+ // In Nuxt server routes, export defineEventHandler
116
+ export default defineEventHandler(async () => {
117
+ const posts = await client.fetch(POSTS_QUERY)
118
+ return posts
119
+ })
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Reference Solution: Sanity Integration with Remix
3
+ *
4
+ * Demonstrates:
5
+ * - Creating a Sanity client configured for Remix
6
+ * - Using GROQ queries in Remix loader functions
7
+ * - Fetching content with client.fetch() in loaders
8
+ * - Rendering content with useLoaderData
9
+ * - Portable text rendering with @portabletext/react
10
+ */
11
+
12
+ // === Part 1: Sanity Client (app/sanity/client.ts) ===
13
+
14
+ import { createClient } from "@sanity/client"
15
+
16
+ export const client = createClient({
17
+ projectId: "your-project-id",
18
+ dataset: "production",
19
+ apiVersion: "2024-01-01",
20
+ // Use CDN for published content in production
21
+ useCdn: process.env.NODE_ENV === "production",
22
+ })
23
+
24
+ // === Part 2: Posts List Route (app/routes/posts._index.tsx) ===
25
+
26
+ import type { LoaderFunctionArgs } from "@remix-run/node"
27
+ import { useLoaderData, Link } from "@remix-run/react"
28
+
29
+ const POSTS_QUERY = `*[_type == "post"] | order(publishedAt desc) {
30
+ _id,
31
+ title,
32
+ "slug": slug.current,
33
+ publishedAt,
34
+ excerpt,
35
+ }`
36
+
37
+ export async function loader({ request }: LoaderFunctionArgs) {
38
+ const posts = await client.fetch(POSTS_QUERY)
39
+ return { posts }
40
+ }
41
+
42
+ export default function PostsIndex() {
43
+ const { posts } = useLoaderData<typeof loader>()
44
+
45
+ return (
46
+ <main>
47
+ <h1>Blog Posts</h1>
48
+ <ul>
49
+ {posts.map((post) => (
50
+ <li key={post._id}>
51
+ <Link to={`/posts/${post.slug}`}>
52
+ <h2>{post.title}</h2>
53
+ <p>{post.excerpt}</p>
54
+ <time dateTime={post.publishedAt}>
55
+ {new Date(post.publishedAt).toLocaleDateString()}
56
+ </time>
57
+ </Link>
58
+ </li>
59
+ ))}
60
+ </ul>
61
+ </main>
62
+ )
63
+ }
64
+
65
+ // === Part 3: Individual Post Route (app/routes/posts.$slug.tsx) ===
66
+
67
+ import { PortableText } from "@portabletext/react"
68
+
69
+ const POST_QUERY = `*[_type == "post" && slug.current == $slug][0] {
70
+ _id,
71
+ title,
72
+ body,
73
+ publishedAt,
74
+ "author": author->name,
75
+ }`
76
+
77
+ export async function loader({ params }: LoaderFunctionArgs) {
78
+ const post = await client.fetch(POST_QUERY, { slug: params.slug })
79
+ if (!post) {
80
+ throw new Response("Post not found", { status: 404 })
81
+ }
82
+ return { post }
83
+ }
84
+
85
+ export default function PostDetail() {
86
+ const { post } = useLoaderData<typeof loader>()
87
+
88
+ return (
89
+ <article>
90
+ <h1>{post.title}</h1>
91
+ {post.author && <p>By {post.author}</p>}
92
+ <time dateTime={post.publishedAt}>
93
+ {new Date(post.publishedAt).toLocaleDateString()}
94
+ </time>
95
+ <div>
96
+ <PortableText value={post.body} />
97
+ </div>
98
+ </article>
99
+ )
100
+ }
@@ -0,0 +1,60 @@
1
+ // Sanity Function: Publish webhook handler
2
+ // Demonstrates: defineFunction, document publish trigger, event handling, external API calls
3
+
4
+ import { defineFunction } from "sanity/functions"
5
+
6
+ // Define a function that triggers when a document is published
7
+ export const onPublishWebhook = defineFunction({
8
+ name: "on-publish-webhook",
9
+ title: "Publish Webhook",
10
+ description: "Sends a webhook notification when a document is published",
11
+
12
+ // Trigger on document publish events
13
+ trigger: {
14
+ type: "document.publish",
15
+ // Optionally filter by document type
16
+ filter: {
17
+ types: ["post", "article"],
18
+ },
19
+ },
20
+
21
+ // The handler function receives the event context
22
+ async handler(event, context) {
23
+ const { document, previousDocument } = event
24
+ const { projectId, dataset } = context
25
+
26
+ // Build the webhook payload
27
+ const payload = {
28
+ event: "document.published",
29
+ projectId,
30
+ dataset,
31
+ documentId: document._id,
32
+ documentType: document._type,
33
+ title: document.title ?? document._id,
34
+ publishedAt: new Date().toISOString(),
35
+ isUpdate: !!previousDocument,
36
+ }
37
+
38
+ // Send to an external webhook URL (configured via environment/secrets)
39
+ const webhookUrl = process.env.WEBHOOK_URL
40
+ if (!webhookUrl) {
41
+ console.warn("WEBHOOK_URL not configured, skipping notification")
42
+ return { success: false, reason: "no webhook URL configured" }
43
+ }
44
+
45
+ const response = await fetch(webhookUrl, {
46
+ method: "POST",
47
+ headers: {
48
+ "Content-Type": "application/json",
49
+ },
50
+ body: JSON.stringify(payload),
51
+ })
52
+
53
+ if (!response.ok) {
54
+ console.error(`Webhook failed: ${response.status} ${response.statusText}`)
55
+ return { success: false, status: response.status }
56
+ }
57
+
58
+ return { success: true, documentId: document._id }
59
+ },
60
+ })