@askrjs/cli 0.0.3 → 0.0.4

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 (287) hide show
  1. package/README.md +37 -0
  2. package/dist/add.d.ts +16 -0
  3. package/dist/add.js +33 -29
  4. package/dist/cli.d.ts +5 -0
  5. package/dist/cli.js +0 -2
  6. package/dist/create.d.ts +5 -0
  7. package/dist/create.js +104 -26
  8. package/dist/directory-swap-DWoHtx7C.js +35 -0
  9. package/dist/discovery-Difb7Y4G.js +0 -2
  10. package/dist/generate.d.ts +5 -0
  11. package/dist/generate.js +77 -12
  12. package/dist/is-direct-execution-Cdlr-ZUl.js +0 -2
  13. package/dist/openapi.d.ts +25 -0
  14. package/dist/openapi.js +44 -12
  15. package/dist/planner-VAj7qlxr.js +0 -2
  16. package/dist/range-YUs9eimn.js +0 -2
  17. package/dist/registry-CyrRHRG5.js +0 -2
  18. package/dist/skills/askr-ssr-ssg/SKILL.md +3 -1
  19. package/dist/{skills-Bh0mEhIx.js → skills-B7CbWur9.js} +89 -26
  20. package/dist/skills.d.ts +18 -0
  21. package/dist/skills.js +1 -1
  22. package/dist/specification-DXnDOC-0.js +0 -2
  23. package/dist/ssg-config.d.ts +41 -0
  24. package/dist/ssg-config.js +1 -0
  25. package/dist/ssg.d.ts +61 -0
  26. package/dist/ssg.js +360 -24
  27. package/dist/templates/full-stack/package.json +1 -1
  28. package/dist/templates/full-stack/src/server/action-registry.ts +0 -1
  29. package/dist/templates/full-stack/tsconfig.json +1 -1
  30. package/dist/templates/spa/package.json +2 -3
  31. package/dist/templates/spa/src/pages/app/_routes.tsx +2 -0
  32. package/dist/templates/spa/src/pages/public/_routes.tsx +2 -0
  33. package/dist/templates/spa/tsconfig.json +2 -1
  34. package/dist/templates/spa/vitest.config.ts +0 -4
  35. package/dist/templates/ssg/README.md +1 -1
  36. package/dist/templates/ssg/package.json +1 -1
  37. package/dist/templates/ssg/ssg.config.ts +7 -0
  38. package/dist/templates/ssg/tests/ssg-config.test.ts +2 -0
  39. package/dist/templates/ssg/tsconfig.json +2 -1
  40. package/dist/templates/ssg/vitest.config.ts +0 -4
  41. package/dist/templates/ssr/package.json +2 -2
  42. package/dist/templates/startkit/package.json +2 -2
  43. package/dist/templates/startkit/src/lib/mock-data.ts +17 -39
  44. package/dist/templates/startkit/tsconfig.json +2 -1
  45. package/dist/update.d.ts +41 -0
  46. package/dist/update.js +0 -2
  47. package/dist/writer-D8qe_7ud.js +0 -2
  48. package/package.json +13 -8
  49. package/dist/add.js.map +0 -1
  50. package/dist/cli.js.map +0 -1
  51. package/dist/create.js.map +0 -1
  52. package/dist/discovery-Difb7Y4G.js.map +0 -1
  53. package/dist/generate.js.map +0 -1
  54. package/dist/is-direct-execution-Cdlr-ZUl.js.map +0 -1
  55. package/dist/openapi.js.map +0 -1
  56. package/dist/planner-VAj7qlxr.js.map +0 -1
  57. package/dist/range-YUs9eimn.js.map +0 -1
  58. package/dist/registry-CyrRHRG5.js.map +0 -1
  59. package/dist/skills-Bh0mEhIx.js.map +0 -1
  60. package/dist/specification-DXnDOC-0.js.map +0 -1
  61. package/dist/ssg.js.map +0 -1
  62. package/dist/templates/full-stack/src/vite-server.d.ts +0 -5
  63. package/dist/templates/spa/src/styles.d.ts +0 -1
  64. package/dist/templates/ssg/src/vite-env.d.ts +0 -5
  65. package/dist/templates/ssr/src/vite-server.d.ts +0 -7
  66. package/dist/templates/startkit/src/vite-env.d.ts +0 -5
  67. package/dist/update.js.map +0 -1
  68. package/dist/writer-D8qe_7ud.js.map +0 -1
  69. package/skills/askr-accessibility/SKILL.md +0 -68
  70. package/skills/askr-accessibility/agents/openai.yaml +0 -4
  71. package/skills/askr-agent-execution/SKILL.md +0 -85
  72. package/skills/askr-agent-execution/agents/openai.yaml +0 -4
  73. package/skills/askr-agent-workflows/SKILL.md +0 -57
  74. package/skills/askr-agent-workflows/agents/openai.yaml +0 -4
  75. package/skills/askr-api-integration/SKILL.md +0 -79
  76. package/skills/askr-api-integration/agents/openai.yaml +0 -4
  77. package/skills/askr-app-builder/SKILL.md +0 -99
  78. package/skills/askr-app-builder/agents/openai.yaml +0 -4
  79. package/skills/askr-auth-access/SKILL.md +0 -74
  80. package/skills/askr-auth-access/agents/openai.yaml +0 -4
  81. package/skills/askr-cli-vite/SKILL.md +0 -76
  82. package/skills/askr-cli-vite/agents/openai.yaml +0 -4
  83. package/skills/askr-dashboard-charts/SKILL.md +0 -99
  84. package/skills/askr-dashboard-charts/agents/openai.yaml +0 -4
  85. package/skills/askr-design-system/SKILL.md +0 -86
  86. package/skills/askr-design-system/agents/openai.yaml +0 -4
  87. package/skills/askr-env-config/SKILL.md +0 -74
  88. package/skills/askr-env-config/agents/openai.yaml +0 -4
  89. package/skills/askr-error-loading-empty/SKILL.md +0 -89
  90. package/skills/askr-error-loading-empty/agents/openai.yaml +0 -4
  91. package/skills/askr-file-upload-artifacts/SKILL.md +0 -77
  92. package/skills/askr-file-upload-artifacts/agents/openai.yaml +0 -4
  93. package/skills/askr-forms-tables-crud/SKILL.md +0 -98
  94. package/skills/askr-forms-tables-crud/agents/openai.yaml +0 -4
  95. package/skills/askr-mental-model/SKILL.md +0 -109
  96. package/skills/askr-mental-model/agents/openai.yaml +0 -4
  97. package/skills/askr-migration-react/SKILL.md +0 -81
  98. package/skills/askr-migration-react/agents/openai.yaml +0 -4
  99. package/skills/askr-observability-debugging/SKILL.md +0 -83
  100. package/skills/askr-observability-debugging/agents/openai.yaml +0 -4
  101. package/skills/askr-project-structure/SKILL.md +0 -79
  102. package/skills/askr-project-structure/agents/openai.yaml +0 -4
  103. package/skills/askr-query-mutation/SKILL.md +0 -115
  104. package/skills/askr-query-mutation/agents/openai.yaml +0 -4
  105. package/skills/askr-realtime-streaming/SKILL.md +0 -76
  106. package/skills/askr-realtime-streaming/agents/openai.yaml +0 -4
  107. package/skills/askr-resources-data/SKILL.md +0 -100
  108. package/skills/askr-resources-data/agents/openai.yaml +0 -4
  109. package/skills/askr-routing-layouts/SKILL.md +0 -107
  110. package/skills/askr-routing-layouts/agents/openai.yaml +0 -4
  111. package/skills/askr-runtime-reactivity/SKILL.md +0 -92
  112. package/skills/askr-runtime-reactivity/agents/openai.yaml +0 -4
  113. package/skills/askr-ssr-ssg/SKILL.md +0 -76
  114. package/skills/askr-ssr-ssg/agents/openai.yaml +0 -4
  115. package/skills/askr-testing-determinism/SKILL.md +0 -75
  116. package/skills/askr-testing-determinism/agents/openai.yaml +0 -4
  117. package/skills/askr-theming/SKILL.md +0 -86
  118. package/skills/askr-theming/agents/openai.yaml +0 -4
  119. package/skills/askr-ui-composition/SKILL.md +0 -92
  120. package/skills/askr-ui-composition/agents/openai.yaml +0 -4
  121. package/templates/full-stack/AGENTS.md +0 -11
  122. package/templates/full-stack/README.md +0 -17
  123. package/templates/full-stack/gitignore.template +0 -4
  124. package/templates/full-stack/index.html +0 -13
  125. package/templates/full-stack/package.json +0 -39
  126. package/templates/full-stack/server.ts +0 -9
  127. package/templates/full-stack/src/action-authorizations.ts +0 -10
  128. package/templates/full-stack/src/actions/create-message.ts +0 -10
  129. package/templates/full-stack/src/i18n.ts +0 -8
  130. package/templates/full-stack/src/main.tsx +0 -11
  131. package/templates/full-stack/src/pages/home.tsx +0 -25
  132. package/templates/full-stack/src/pages/layout.tsx +0 -43
  133. package/templates/full-stack/src/pages/not-found.tsx +0 -7
  134. package/templates/full-stack/src/routes.tsx +0 -19
  135. package/templates/full-stack/src/schemas.ts +0 -10
  136. package/templates/full-stack/src/server/action-registry.ts +0 -8
  137. package/templates/full-stack/src/server/actions/create-message.ts +0 -14
  138. package/templates/full-stack/src/server/app.ts +0 -76
  139. package/templates/full-stack/src/server/dependencies.ts +0 -55
  140. package/templates/full-stack/src/server/entry-server.ts +0 -8
  141. package/templates/full-stack/src/telemetry.ts +0 -3
  142. package/templates/full-stack/src/vite-server.d.ts +0 -5
  143. package/templates/full-stack/tests/actions/create-message.test.ts +0 -12
  144. package/templates/full-stack/tsconfig.json +0 -15
  145. package/templates/full-stack/vite.config.ts +0 -10
  146. package/templates/spa/AGENTS.md +0 -60
  147. package/templates/spa/README.md +0 -96
  148. package/templates/spa/gitignore.template +0 -16
  149. package/templates/spa/index.html +0 -13
  150. package/templates/spa/package.json +0 -35
  151. package/templates/spa/src/adapters/operations-client.ts +0 -95
  152. package/templates/spa/src/components/shared/metric-card.tsx +0 -27
  153. package/templates/spa/src/components/shared/status-badge.tsx +0 -24
  154. package/templates/spa/src/features/operations/operations.query.ts +0 -9
  155. package/templates/spa/src/main.tsx +0 -10
  156. package/templates/spa/src/pages/_layout.tsx +0 -9
  157. package/templates/spa/src/pages/_routes.tsx +0 -27
  158. package/templates/spa/src/pages/app/_layout.tsx +0 -94
  159. package/templates/spa/src/pages/app/_routes.tsx +0 -10
  160. package/templates/spa/src/pages/app/admin-home.tsx +0 -170
  161. package/templates/spa/src/pages/app/agent-runs.tsx +0 -93
  162. package/templates/spa/src/pages/app/settings.tsx +0 -91
  163. package/templates/spa/src/pages/auth/_layout.tsx +0 -38
  164. package/templates/spa/src/pages/auth/_routes.tsx +0 -6
  165. package/templates/spa/src/pages/auth/login.tsx +0 -63
  166. package/templates/spa/src/pages/not-found.tsx +0 -22
  167. package/templates/spa/src/pages/public/_layout.tsx +0 -47
  168. package/templates/spa/src/pages/public/_routes.tsx +0 -6
  169. package/templates/spa/src/pages/public/home.tsx +0 -143
  170. package/templates/spa/src/shared/format.ts +0 -12
  171. package/templates/spa/src/shared/navigation.ts +0 -15
  172. package/templates/spa/src/styles/components.css +0 -49
  173. package/templates/spa/src/styles/layout.css +0 -192
  174. package/templates/spa/src/styles/reset.css +0 -44
  175. package/templates/spa/src/styles/theme.css +0 -57
  176. package/templates/spa/src/styles/tokens.css +0 -20
  177. package/templates/spa/src/styles.css +0 -7
  178. package/templates/spa/src/styles.d.ts +0 -1
  179. package/templates/spa/tests/app.test.tsx +0 -37
  180. package/templates/spa/tests/components/shared.test.tsx +0 -12
  181. package/templates/spa/tests/resources.test.ts +0 -22
  182. package/templates/spa/tsconfig.json +0 -20
  183. package/templates/spa/tsconfig.node.json +0 -10
  184. package/templates/spa/vite.config.ts +0 -24
  185. package/templates/spa/vitest.config.ts +0 -17
  186. package/templates/ssg/AGENTS.md +0 -55
  187. package/templates/ssg/README.md +0 -39
  188. package/templates/ssg/gitignore.template +0 -17
  189. package/templates/ssg/index.html +0 -13
  190. package/templates/ssg/package.json +0 -35
  191. package/templates/ssg/src/app.tsx +0 -14
  192. package/templates/ssg/src/components/badge.tsx +0 -3
  193. package/templates/ssg/src/components/counter.tsx +0 -30
  194. package/templates/ssg/src/components/site-shell.tsx +0 -111
  195. package/templates/ssg/src/jsx.d.ts +0 -23
  196. package/templates/ssg/src/main.tsx +0 -8
  197. package/templates/ssg/src/pages/about.tsx +0 -82
  198. package/templates/ssg/src/pages/content.tsx +0 -63
  199. package/templates/ssg/src/pages/example.tsx +0 -97
  200. package/templates/ssg/src/pages/home.tsx +0 -51
  201. package/templates/ssg/src/resources/user.ts +0 -15
  202. package/templates/ssg/src/routes.tsx +0 -15
  203. package/templates/ssg/src/styles.css +0 -89
  204. package/templates/ssg/src/vite-env.d.ts +0 -5
  205. package/templates/ssg/ssg.config.ts +0 -34
  206. package/templates/ssg/tests/app.test.tsx +0 -19
  207. package/templates/ssg/tests/components/counter.test.tsx +0 -18
  208. package/templates/ssg/tests/resources.test.ts +0 -11
  209. package/templates/ssg/tests/ssg-config.test.ts +0 -11
  210. package/templates/ssg/tsconfig.json +0 -20
  211. package/templates/ssg/tsconfig.node.json +0 -10
  212. package/templates/ssg/vite.config.ts +0 -24
  213. package/templates/ssg/vitest.config.ts +0 -17
  214. package/templates/ssr/AGENTS.md +0 -28
  215. package/templates/ssr/README.md +0 -38
  216. package/templates/ssr/gitignore.template +0 -16
  217. package/templates/ssr/index.html +0 -13
  218. package/templates/ssr/package.json +0 -34
  219. package/templates/ssr/server.ts +0 -10
  220. package/templates/ssr/src/app.tsx +0 -21
  221. package/templates/ssr/src/components/counter.tsx +0 -26
  222. package/templates/ssr/src/entry-server.tsx +0 -12
  223. package/templates/ssr/src/main.tsx +0 -11
  224. package/templates/ssr/src/pages/about.tsx +0 -75
  225. package/templates/ssr/src/pages/example.tsx +0 -113
  226. package/templates/ssr/src/pages/home.tsx +0 -56
  227. package/templates/ssr/src/resources/user.ts +0 -15
  228. package/templates/ssr/src/routes.tsx +0 -13
  229. package/templates/ssr/src/styles.css +0 -148
  230. package/templates/ssr/src/vite-server.d.ts +0 -7
  231. package/templates/ssr/tests/app.test.tsx +0 -24
  232. package/templates/ssr/tests/components/counter.test.tsx +0 -13
  233. package/templates/ssr/tests/resources.test.ts +0 -11
  234. package/templates/ssr/tsconfig.json +0 -22
  235. package/templates/ssr/tsconfig.node.json +0 -10
  236. package/templates/ssr/tsconfig.server.json +0 -15
  237. package/templates/ssr/vite.config.ts +0 -25
  238. package/templates/ssr/vitest.config.ts +0 -13
  239. package/templates/startkit/AGENTS.md +0 -77
  240. package/templates/startkit/README.md +0 -192
  241. package/templates/startkit/gitignore.template +0 -16
  242. package/templates/startkit/index.html +0 -13
  243. package/templates/startkit/package.json +0 -35
  244. package/templates/startkit/src/components/app-header.tsx +0 -93
  245. package/templates/startkit/src/components/app-sidebar.tsx +0 -95
  246. package/templates/startkit/src/components/data-table.tsx +0 -80
  247. package/templates/startkit/src/components/empty-state.tsx +0 -13
  248. package/templates/startkit/src/components/page-header.tsx +0 -23
  249. package/templates/startkit/src/components/stat-card.tsx +0 -24
  250. package/templates/startkit/src/features/accounts/account-filters.tsx +0 -61
  251. package/templates/startkit/src/features/accounts/account-table.tsx +0 -79
  252. package/templates/startkit/src/lib/format.ts +0 -31
  253. package/templates/startkit/src/lib/mock-data.ts +0 -441
  254. package/templates/startkit/src/lib/routes.ts +0 -116
  255. package/templates/startkit/src/main.tsx +0 -12
  256. package/templates/startkit/src/pages/_layout.tsx +0 -56
  257. package/templates/startkit/src/pages/auth/_layout.tsx +0 -7
  258. package/templates/startkit/src/pages/auth/login.tsx +0 -129
  259. package/templates/startkit/src/pages/home.tsx +0 -83
  260. package/templates/startkit/src/pages/not-found.tsx +0 -24
  261. package/templates/startkit/src/pages/workspace/_layout.tsx +0 -17
  262. package/templates/startkit/src/pages/workspace/accounts/index.tsx +0 -217
  263. package/templates/startkit/src/pages/workspace/dashboard.tsx +0 -118
  264. package/templates/startkit/src/pages/workspace/settings.tsx +0 -218
  265. package/templates/startkit/src/router.tsx +0 -7
  266. package/templates/startkit/src/routes/auth-config.ts +0 -38
  267. package/templates/startkit/src/routes/auth.ts +0 -8
  268. package/templates/startkit/src/routes/index.ts +0 -28
  269. package/templates/startkit/src/routes/public.ts +0 -8
  270. package/templates/startkit/src/routes/workspace/accounts.ts +0 -8
  271. package/templates/startkit/src/routes/workspace/index.ts +0 -14
  272. package/templates/startkit/src/styles/components.css +0 -396
  273. package/templates/startkit/src/styles/layout.css +0 -192
  274. package/templates/startkit/src/styles/reset.css +0 -38
  275. package/templates/startkit/src/styles/theme.css +0 -76
  276. package/templates/startkit/src/styles/tokens.css +0 -67
  277. package/templates/startkit/src/styles.css +0 -7
  278. package/templates/startkit/src/toast.ts +0 -55
  279. package/templates/startkit/src/utils/join-classes.ts +0 -4
  280. package/templates/startkit/src/vite-env.d.ts +0 -5
  281. package/templates/startkit/tests/app.test.tsx +0 -32
  282. package/templates/startkit/tests/preferences.test.ts +0 -43
  283. package/templates/startkit/tests/resources.test.ts +0 -82
  284. package/templates/startkit/tsconfig.json +0 -20
  285. package/templates/startkit/tsconfig.node.json +0 -10
  286. package/templates/startkit/vite.config.ts +0 -32
  287. package/templates/startkit/vitest.config.ts +0 -13
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate.js","names":[],"sources":["../src/generate/generator.ts","../src/bin/generate.ts"],"sourcesContent":["import { mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { load } from \"js-yaml\";\n\ntype Json = Record<string, any>;\nconst OWNED = [\n \".askr-generated.json\",\n \"schemas.ts\",\n \"operations.ts\",\n \"api.ts\",\n \"index.ts\",\n] as const;\nconst METHODS = [\"get\", \"post\", \"put\", \"patch\", \"delete\", \"head\", \"options\"] as const;\nconst identifier = /^[A-Za-z_$][\\w$]*$/;\nconst pointer = (...parts: (string | number)[]) =>\n `#/${parts.map((p) => String(p).replace(/~/g, \"~0\").replace(/\\//g, \"~1\")).join(\"/\")}`;\nexport class GenerationError extends Error {}\nconst fail = (message: string, at: string, operationId?: string): never => {\n throw new GenerationError(`${operationId ? `${operationId}: ` : \"\"}${message} at ${at}`);\n};\nconst pascal = (name: string) => {\n const result = name\n .replace(/(^|[^A-Za-z0-9]+)([A-Za-z0-9])/g, (_, _s, c) => c.toUpperCase())\n .replace(/[^A-Za-z0-9_$]/g, \"\");\n return /^\\d/.test(result) ? `_${result}` : result;\n};\n\nfunction schemaType(\n schema: Json,\n at: string,\n direction: \"request\" | \"response\" = \"response\",\n): string {\n if (schema.$ref) {\n const name = decodeURIComponent(String(schema.$ref).split(\"/\").at(-1)!);\n return pascal(name);\n }\n if (schema.const !== undefined) return JSON.stringify(schema.const);\n if (schema.enum)\n return schema.enum.map((value: unknown) => JSON.stringify(value)).join(\" | \") || \"never\";\n if (schema.oneOf || schema.anyOf)\n return (schema.oneOf ?? schema.anyOf)\n .map((item: Json, i: number) =>\n schemaType(item, `${at}/${schema.oneOf ? \"oneOf\" : \"anyOf\"}/${i}`, direction),\n )\n .join(\" | \");\n if (schema.allOf)\n return schema.allOf\n .map((item: Json, i: number) => schemaType(item, `${at}/allOf/${i}`, direction))\n .join(\" & \");\n let type = \"never\";\n if (schema.type === \"string\") type = \"string\";\n else if (schema.type === \"number\" || schema.type === \"integer\") type = \"number\";\n else if (schema.type === \"boolean\") type = \"boolean\";\n else if (schema.type === \"null\") type = \"null\";\n else if (schema.type === \"array\" || schema.items)\n type = `Array<${schemaType(schema.items ?? {}, `${at}/items`, direction)}>`;\n else if (\n schema.type === \"object\" ||\n schema.properties ||\n schema.additionalProperties !== undefined\n ) {\n const required = new Set(schema.required ?? []);\n const properties = Object.entries(schema.properties ?? {})\n .filter(([, value]: any) => !(direction === \"request\" ? value.readOnly : value.writeOnly))\n .map(\n ([key, value]: [string, any]) =>\n ` ${JSON.stringify(key)}${required.has(key) ? \"\" : \"?\"}: ${schemaType(value, `${at}/properties/${key}`, direction)};`,\n );\n if (schema.additionalProperties && typeof schema.additionalProperties === \"object\")\n properties.push(\n ` [key: string]: ${schemaType(schema.additionalProperties, `${at}/additionalProperties`, direction)};`,\n );\n type = `{\\n${properties.join(\"\\n\")}\\n}`;\n } else if (!schema.type) fail(\"Unsupported schema without a type\", at);\n else fail(`Unsupported schema type ${schema.type}`, at);\n return schema.nullable || (Array.isArray(schema.type) && schema.type.includes(\"null\"))\n ? `${type} | null`\n : type;\n}\nfunction responseSchema(operation: Json, at: string, success: boolean) {\n const entries = Object.entries<Json>(operation.responses ?? {})\n .filter(([status]) => (status === \"default\" ? !success : success === /^2\\d\\d$/.test(status)))\n .sort(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }));\n return entries;\n}\nfunction pickContent(content: Json | undefined, at: string, direction: \"request\" | \"response\") {\n const entries = Object.entries<Json>(content ?? {}).sort(([a], [b]) => a.localeCompare(b));\n if (!entries.length) return { type: \"undefined\", codec: \"empty()\", media: [] as string[] };\n const types = entries.map(([mediaType, value]) => ({\n mediaType,\n type: schemaType(\n value.schema ?? {},\n `${at}/content/${mediaType.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}/schema`,\n direction,\n ),\n }));\n const union = [...new Set(types.map((v) => v.type))].join(\" | \");\n const codec =\n types.length === 1\n ? codecFor(types[0]!.mediaType, union)\n : `content({ ${types.map((v) => `${JSON.stringify(v.mediaType)}: ${codecFor(v.mediaType, v.type)}`).join(\", \")} })`;\n return { type: union, codec, media: types.map((v) => v.mediaType) };\n}\nfunction codecFor(mediaType: string, type: string) {\n if (mediaType === \"application/json\" || mediaType.endsWith(\"+json\")) return `json<${type}>()`;\n if (mediaType.startsWith(\"text/\")) return \"text()\";\n if (mediaType === \"application/x-www-form-urlencoded\") return \"urlEncoded()\";\n if (mediaType === \"multipart/form-data\") return \"multipart()\";\n if (mediaType === \"application/octet-stream\") return \"arrayBuffer()\";\n fail(`Unsupported media type ${mediaType}`, \"#/content\");\n}\n\ntype SourceDocument = { uri: string; document: Json };\n\nconst pointerPart = (value: string): string =>\n decodeURIComponent(value).replace(/~1/g, \"/\").replace(/~0/g, \"~\");\nconst pointerValue = (document: Json, fragment: string): unknown => {\n let value: unknown = document;\n for (const part of fragment\n .replace(/^#?\\/?/, \"\")\n .split(\"/\")\n .filter(Boolean)) {\n if (!value || typeof value !== \"object\")\n throw new GenerationError(`Reference target is missing at #/${part}`);\n value = (value as Record<string, unknown>)[pointerPart(part)];\n }\n if (value === undefined)\n throw new GenerationError(`Reference target is missing at ${fragment || \"#\"}`);\n return value;\n};\n\nfunction parseOpenApiDocument(contents: string, source: string): Json {\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents);\n } catch {\n try {\n parsed = load(contents);\n } catch (error) {\n throw new GenerationError(\n `Unable to parse OpenAPI document ${source}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed))\n throw new GenerationError(`OpenAPI document must be an object: ${source}`);\n return parsed as Json;\n}\n\nasync function readSource(uri: string): Promise<SourceDocument> {\n if (uri.startsWith(\"http://\") || uri.startsWith(\"https://\")) {\n const response = await fetch(uri);\n if (!response.ok)\n throw new GenerationError(\n `Unable to fetch OpenAPI reference ${uri}: ${response.status} ${response.statusText}`,\n );\n return { uri, document: parseOpenApiDocument(await response.text(), uri) };\n }\n const path = fileURLToPath(uri);\n return { uri, document: parseOpenApiDocument(await readFile(path, \"utf8\"), path) };\n}\n\nclass OpenApiBundler {\n private readonly sources = new Map<string, Promise<SourceDocument>>();\n private readonly aliases = new Map<string, string>();\n private readonly names = new Map<string, string>();\n\n constructor(\n private readonly root: Json,\n private readonly rootUri: string,\n ) {}\n\n async bundle(): Promise<Json> {\n if (!this.root.components) this.root.components = {};\n if (!this.root.components.schemas) this.root.components.schemas = {};\n await this.expandObject(this.root, this.rootUri, this.root, new Set());\n return this.root;\n }\n\n private async source(uri: string): Promise<SourceDocument> {\n let pending = this.sources.get(uri);\n if (!pending) {\n pending = readSource(uri);\n this.sources.set(uri, pending);\n }\n return pending;\n }\n\n private componentName(uri: string, fragment: string): string {\n const canonical = `${uri}#${fragment}`;\n const existing = this.aliases.get(canonical);\n if (existing) return existing;\n const raw =\n fragment.split(\"/\").filter(Boolean).at(-1) ??\n basename(new URL(uri).pathname).replace(/\\.[^.]+$/, \"\");\n const base = pascal(pointerPart(raw)) || \"ExternalSchema\";\n let name = base;\n let suffix = 2;\n while (this.names.has(name) && this.names.get(name) !== canonical) name = `${base}${suffix++}`;\n this.aliases.set(canonical, name);\n this.names.set(name, canonical);\n return name;\n }\n\n private async expandObject(\n value: Json,\n uri: string,\n document: Json,\n stack: Set<string>,\n ): Promise<void> {\n for (const [key, child] of Object.entries(value))\n value[key] = await this.expand(child, uri, document, stack);\n }\n\n private async expand(\n value: unknown,\n uri: string,\n document: Json,\n stack: Set<string>,\n ): Promise<unknown> {\n if (Array.isArray(value))\n return Promise.all(value.map((item) => this.expand(item, uri, document, stack)));\n if (!value || typeof value !== \"object\") return value;\n const object = value as Json;\n if (typeof object.$ref === \"string\") {\n const resolved = await this.resolveRef(object.$ref, uri, document, stack);\n const siblingEntries = Object.entries(object).filter(([key]) => key !== \"$ref\");\n if (!siblingEntries.length) return resolved;\n const result =\n resolved && typeof resolved === \"object\" && !Array.isArray(resolved)\n ? { ...(resolved as Json) }\n : {};\n for (const [key, child] of siblingEntries)\n result[key] = await this.expand(child, uri, document, stack);\n return result;\n }\n const result: Json = {};\n for (const [key, child] of Object.entries(object))\n result[key] = await this.expand(child, uri, document, stack);\n return result;\n }\n\n private async resolveRef(\n ref: string,\n baseUri: string,\n document: Json,\n stack: Set<string>,\n ): Promise<unknown> {\n const hash = ref.indexOf(\"#\");\n const targetUri =\n hash === -1\n ? new URL(ref, baseUri).href\n : new URL(ref.slice(0, hash) || baseUri, baseUri).href;\n const fragment = hash === -1 ? \"\" : ref.slice(hash + 1);\n const canonical = `${targetUri}#${fragment}`;\n const targetSource =\n targetUri === this.rootUri ? { uri: targetUri, document } : await this.source(targetUri);\n const target = pointerValue(targetSource.document, fragment);\n const isRootSchema = targetUri === this.rootUri && fragment.startsWith(\"/components/schemas/\");\n if (isRootSchema) return { $ref: `#${fragment}` };\n if (fragment.startsWith(\"/components/schemas/\")) {\n const name = this.componentName(targetUri, fragment);\n if (stack.has(canonical)) return { $ref: `#/components/schemas/${name}` };\n if (!(name in this.root.components.schemas)) {\n this.root.components.schemas[name] = {};\n const next = new Set(stack).add(canonical);\n this.root.components.schemas[name] = (await this.expand(\n target,\n targetSource.uri,\n targetSource.document,\n next,\n )) as Json;\n }\n return { $ref: `#/components/schemas/${name}` };\n }\n if (stack.has(canonical)) throw new GenerationError(`Circular non-schema reference at ${ref}`);\n return this.expand(\n target,\n targetSource.uri,\n targetSource.document,\n new Set(stack).add(canonical),\n );\n }\n}\n\nexport async function loadOpenApi(input: string): Promise<Json> {\n const uri = /^https?:\\/\\//.test(input) ? input : pathToFileURL(resolve(input)).href;\n const source = await readSource(uri);\n return new OpenApiBundler(source.document, source.uri).bundle();\n}\nexport function generateFiles(document: Json): Record<(typeof OWNED)[number], string> {\n const version = String(document.openapi ?? \"\");\n if (!/^3\\.(0|1)\\.\\d+$/.test(version))\n fail(`Unsupported OpenAPI version ${version || \"missing\"}`, \"#/openapi\");\n if (document.webhooks) fail(\"Webhooks are unsupported\", \"#/webhooks\");\n const schemas = document.components?.schemas ?? {};\n const names = new Map<string, string>();\n for (const name of Object.keys(schemas).sort()) {\n const safe = pascal(name);\n if (!safe || names.has(safe))\n fail(`Component name collision for ${name}`, pointer(\"components\", \"schemas\", name));\n names.set(safe, name);\n }\n const schemaLines = [...names].map(\n ([safe, original]) =>\n `export type ${safe} = ${schemaType(schemas[original], pointer(\"components\", \"schemas\", original))};`,\n );\n const operationTypes: string[] = [];\n const descriptors: string[] = [];\n const seen = new Set<string>();\n for (const path of Object.keys(document.paths ?? {}).sort())\n for (const method of METHODS) {\n const operation = document.paths[path]?.[method];\n if (!operation) continue;\n const at = pointer(\"paths\", path, method);\n const id = operation.operationId;\n if (!id || !identifier.test(id))\n fail(\"A unique JavaScript-identifier operationId is required\", `${at}/operationId`, id);\n if (seen.has(id)) fail(\"Duplicate operationId\", `${at}/operationId`, id);\n seen.add(id);\n if (operation.callbacks) fail(\"Callbacks are unsupported\", `${at}/callbacks`, id);\n const parameters = [\n ...(document.paths[path].parameters ?? []),\n ...(operation.parameters ?? []),\n ];\n const byLocation: Record<string, Json[]> = { path: [], query: [], header: [] };\n for (const parameter of parameters) {\n if (parameter.$ref) fail(\"Parameter references must be bundled\", `${at}/parameters`, id);\n if (parameter.in === \"cookie\")\n fail(\"Cookie parameters are unsupported\", `${at}/parameters`, id);\n if (!byLocation[parameter.in])\n fail(`Unsupported parameter location ${parameter.in}`, `${at}/parameters`, id);\n byLocation[parameter.in]!.push(parameter);\n }\n const prefix = pascal(id);\n const renderParameters = (location: string) => {\n const list = byLocation[location]!.sort((a, b) => a.name.localeCompare(b.name));\n if (!list.length) return undefined;\n const name = `${prefix}${pascal(location)}`;\n operationTypes.push(\n `export type ${name} = {\\n${list.map((p) => ` ${JSON.stringify(p.name)}${p.required || location === \"path\" ? \"\" : \"?\"}: ${schemaType(p.schema ?? {}, `${at}/parameters`, \"request\")};`).join(\"\\n\")}\\n};`,\n );\n const defaultStyle = location === \"query\" ? \"form\" : \"simple\";\n const spec = `{ ${list\n .map((p) => {\n const style = p.style ?? defaultStyle;\n const explode = p.explode ?? style === \"form\";\n return `${JSON.stringify(p.name)}: { style: ${JSON.stringify(style)}, explode: ${explode} }`;\n })\n .join(\", \")} }`;\n return { name, spec };\n };\n const params = renderParameters(\"path\"),\n query = renderParameters(\"query\"),\n headers = renderParameters(\"header\");\n const body = operation.requestBody\n ? pickContent(operation.requestBody.content, `${at}/requestBody`, \"request\")\n : undefined;\n if (body) operationTypes.push(`export type ${prefix}Body = ${body.type};`);\n const successes = responseSchema(operation, at, true);\n if (!successes.length) fail(\"At least one 2xx response is required\", `${at}/responses`, id);\n const errors = responseSchema(operation, at, false);\n const chain: string[] = [`${method === \"delete\" ? \"del\" : method}(${JSON.stringify(path)})`];\n if (params) chain.push(`params<${params.name}>(${params.spec})`);\n if (query) chain.push(`query<${query.name}>(${query.spec})`);\n if (headers) chain.push(`headers<${headers.name}>(${headers.spec})`);\n if (body) chain.push(`body(${body.codec})`);\n for (const [status, response] of successes) {\n if (response.links)\n fail(\"Response links are unsupported\", `${at}/responses/${status}/links`, id);\n const value = pickContent(response.content, `${at}/responses/${status}`, \"response\");\n const typeName = `${prefix}Response${status}`;\n operationTypes.push(`export type ${typeName} = ${value.type};`);\n chain.push(`returns(${status === \"200\" ? \"\" : `${status}, `}${value.codec})`);\n }\n if (errors.length) {\n const rendered = errors.map(([status, response]) => {\n if (response.links)\n fail(\"Response links are unsupported\", `${at}/responses/${status}/links`, id);\n const value = pickContent(response.content, `${at}/responses/${status}`, \"response\");\n const typeName = `${prefix}Error${pascal(status)}`;\n operationTypes.push(`export type ${typeName} = ${value.type};`);\n return `${JSON.stringify(status)}: ${value.codec}`;\n });\n chain.push(`errors({ ${rendered.join(\", \")} })`);\n }\n if (operation.security ?? document.security)\n chain.push(`security(${JSON.stringify(operation.security ?? document.security)})`);\n descriptors.push(` ${id}: ${chain.join(\"\\n .\")},`);\n }\n const imports = [\n ...new Set(\n descriptors\n .join(\" \")\n .match(\n /\\b(get|post|put|patch|del|head|options|json|text|urlEncoded|multipart|arrayBuffer|empty|content)\\b/g,\n ) ?? [],\n ),\n ].sort();\n const files = {\n \"schemas.ts\": `${schemaLines.join(\"\\n\\n\")}\\n`,\n \"operations.ts\": `${names.size ? `import type { ${[...names.keys()].join(\", \")} } from \"./schemas\";\\n\\n` : \"\"}${operationTypes.join(\"\\n\\n\")}\\n`,\n \"api.ts\": `import { ${[\"defineApi\", \"createClient\", ...imports].join(\", \")} } from \"@askrjs/fetch\";\\nimport type { ClientOptions } from \"@askrjs/fetch\";\\nimport type { ${operationTypes\n .map((line) => line.match(/^export type (\\w+)/)?.[1])\n .filter(Boolean)\n .join(\n \", \",\n )} } from \"./operations\";\\n\\nexport const api = defineApi({\\n${descriptors.join(\"\\n\")}\\n}, ${JSON.stringify({ servers: (document.servers ?? []).map((s: Json) => s.url), securitySchemes: document.components?.securitySchemes ?? {} }, null, 2)});\\n\\nexport const createApiClient = (options?: ClientOptions) => createClient(api, options);\\n`,\n \"index.ts\": `export * from \"./schemas\";\\nexport * from \"./operations\";\\nexport { api, createApiClient } from \"./api\";\\n`,\n \".askr-generated.json\": \"\",\n } satisfies Record<(typeof OWNED)[number], string>;\n files[\".askr-generated.json\"] = `${JSON.stringify({ version: 1, files: [...OWNED] }, null, 2)}\\n`;\n return files;\n}\nasync function existingFiles(directory: string) {\n try {\n return (await readdir(directory)).sort();\n } catch {\n return [];\n }\n}\nexport async function writeGenerated(\n directory: string,\n files: Record<string, string>,\n check: boolean,\n): Promise<void> {\n const output = resolve(directory);\n const entries = await existingFiles(output);\n if (check) {\n if (!entries.length) throw new GenerationError(`Generated directory is missing: ${output}`);\n const expected = Object.keys(files).sort();\n if (JSON.stringify(entries) !== JSON.stringify(expected))\n throw new GenerationError(`Generated file ownership differs in ${output}`);\n for (const name of expected)\n if ((await readFile(join(output, name), \"utf8\")) !== files[name])\n throw new GenerationError(`Generated file is stale: ${name}`);\n return;\n }\n if (entries.length && !entries.includes(\".askr-generated.json\"))\n throw new GenerationError(`Refusing to overwrite non-generated directory: ${output}`);\n const stage = await mkdtemp(join(dirname(output), `.${basename(output)}-stage-`));\n for (const [name, content] of Object.entries(files)) await writeFile(join(stage, name), content);\n const backup = `${output}.backup-${process.pid}`;\n let moved = false;\n try {\n if (entries.length) {\n await rename(output, backup);\n moved = true;\n }\n await rename(stage, output);\n if (moved) await rm(backup, { recursive: true, force: true });\n } catch (error) {\n await rm(output, { recursive: true, force: true });\n if (moved) await rename(backup, output);\n throw error;\n } finally {\n await rm(stage, { recursive: true, force: true });\n }\n}\nexport async function generate(input: string, output: string, check = false) {\n const document = await loadOpenApi(input);\n const files = generateFiles(document);\n await mkdir(dirname(resolve(output)), { recursive: true });\n await writeGenerated(output, files, check);\n}\n","import { generate } from \"../generate/generator\";\ntype Io = Pick<Console, \"error\" | \"log\">;\nexport async function runGenerateCli(args: string[], io: Io = console): Promise<number> {\n let output: string | undefined;\n let check = false;\n const inputs: string[] = [];\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === \"--check\") check = true;\n else if (arg === \"-o\" || arg === \"--output\") output = args[++i];\n else if (arg.startsWith(\"--output=\")) output = arg.slice(9);\n else if (arg.startsWith(\"-\")) {\n io.error(`Unknown option: ${arg}`);\n return 1;\n } else inputs.push(arg);\n }\n if (inputs.length !== 1 || !output) {\n io.error(\"Usage: askr generate <input> -o <output-directory> [--check]\");\n return 1;\n }\n try {\n await generate(inputs[0]!, output, check);\n io.log(check ? \"Generated client is current.\" : `Generated client in ${output}.`);\n return 0;\n } catch (error) {\n io.error(error instanceof Error ? error.message : String(error));\n return 1;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"is-direct-execution-Cdlr-ZUl.js","names":[],"sources":["../src/bin/is-direct-execution.ts"],"sourcesContent":["import { realpathSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction normalizePath(filePath: string): string {\n const resolvedPath = resolve(filePath);\n\n try {\n return typeof realpathSync.native === \"function\"\n ? realpathSync.native(resolvedPath)\n : realpathSync(resolvedPath);\n } catch {\n return resolvedPath;\n }\n}\n\nexport function isDirectExecution(\n moduleUrl: string,\n argvPath: string | undefined = process.argv[1],\n): boolean {\n if (!argvPath) {\n return false;\n }\n\n return normalizePath(argvPath) === normalizePath(fileURLToPath(moduleUrl));\n}\n"],"mappings":";;;;AAIA,SAAS,cAAc,UAA0B;CAC/C,MAAM,eAAe,QAAQ,QAAQ;CAErC,IAAI;EACF,OAAO,OAAO,aAAa,WAAW,aAClC,aAAa,OAAO,YAAY,IAChC,aAAa,YAAY;CAC/B,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,kBACd,WACA,WAA+B,QAAQ,KAAK,IACnC;CACT,IAAI,CAAC,UACH,OAAO;CAGT,OAAO,cAAc,QAAQ,MAAM,cAAc,cAAc,SAAS,CAAC;AAC3E"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"openapi.js","names":[],"sources":["../src/bin/openapi.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from \"node:fs/promises\";\nimport { dump } from \"js-yaml\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { tsImport } from \"tsx/esm/api\";\nimport { isDirectExecution } from \"./is-direct-execution\";\n\ntype CliIo = Pick<Console, \"error\" | \"log\">;\n\ninterface ParsedArgs {\n entry: string;\n output: string;\n check: boolean;\n help: boolean;\n}\n\ninterface DocumentExporter {\n toOpenApiDocument(): unknown;\n}\n\ninterface OpenApiDeps {\n cwd(): string;\n importModule(filePath: string): Promise<unknown>;\n readFile(filePath: string): Promise<string>;\n mkdir(directory: string): Promise<void>;\n writeFile(filePath: string, contents: string): Promise<void>;\n rename(from: string, to: string): Promise<void>;\n rm(filePath: string): Promise<void>;\n temporarySuffix(): string;\n}\n\nconst helpText = `askr openapi - Generate an OpenAPI YAML artifact\n\nUsage:\n askr openapi [--entry <path>] [--output <path>] [--check]\n\nOptions:\n --entry <path> TypeScript API module (default: ./src/api.ts)\n --output <path> YAML artifact (default: ./openapi.yml)\n --check Fail when the artifact is missing or byte-stale; never write\n --help, -h Show help\n`;\n\nconst defaultDeps: OpenApiDeps = {\n cwd: () => process.cwd(),\n importModule: (filePath) => tsImport(pathToFileURL(filePath).href, import.meta.url),\n readFile: (filePath) => fs.readFile(filePath, \"utf8\"),\n mkdir: (directory) => fs.mkdir(directory, { recursive: true }).then(() => undefined),\n writeFile: (filePath, contents) => fs.writeFile(filePath, contents, \"utf8\"),\n rename: (from, to) => fs.rename(from, to),\n rm: (filePath) => fs.rm(filePath, { force: true }),\n temporarySuffix: () => `${process.pid}.${Date.now()}`,\n};\n\nexport function parseOpenApiArgs(args: readonly string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n entry: \"./src/api.ts\",\n output: \"./openapi.yml\",\n check: false,\n help: false,\n };\n for (let index = 0; index < args.length; index += 1) {\n const value = args[index];\n if (value === \"--entry\" || value === \"--output\") {\n const next = args[index + 1];\n if (!next) throw new Error(`${value} requires a path`);\n if (value === \"--entry\") parsed.entry = next;\n else parsed.output = next;\n index += 1;\n } else if (value === \"--check\") parsed.check = true;\n else if (value === \"--help\" || value === \"-h\") parsed.help = true;\n else throw new Error(`Unknown option: ${value}`);\n }\n return parsed;\n}\n\nfunction exporterFrom(moduleValue: unknown): DocumentExporter {\n if (!moduleValue || typeof moduleValue !== \"object\") {\n throw new Error(\"API module must have a default export with toOpenApiDocument()\");\n }\n let exported = (moduleValue as { default?: unknown }).default;\n for (\n let depth = 0;\n depth < 3 &&\n exported &&\n typeof exported === \"object\" &&\n typeof (exported as Partial<DocumentExporter>).toOpenApiDocument !== \"function\" &&\n \"default\" in exported;\n depth += 1\n ) {\n exported = (exported as { default?: unknown }).default;\n }\n if (\n !exported ||\n typeof exported !== \"object\" ||\n typeof (exported as Partial<DocumentExporter>).toOpenApiDocument !== \"function\"\n ) {\n throw new Error(\"API module must have a default export with toOpenApiDocument()\");\n }\n return exported as DocumentExporter;\n}\n\nexport function serializeOpenApi(document: unknown): string {\n const yaml = dump(document, { lineWidth: -1, noCompatMode: true, noRefs: true });\n return `${yaml.replace(/\\n+$/, \"\")}\\n`;\n}\n\nasync function generate(entry: string, deps: OpenApiDeps): Promise<string> {\n const moduleValue = await deps.importModule(entry);\n const document = exporterFrom(moduleValue).toOpenApiDocument();\n if (!document || typeof document !== \"object\" || Array.isArray(document)) {\n throw new Error(\"toOpenApiDocument() must return an OpenAPI document object\");\n }\n return serializeOpenApi(document);\n}\n\nasync function atomicWrite(output: string, contents: string, deps: OpenApiDeps): Promise<void> {\n await deps.mkdir(path.dirname(output));\n const temporary = `${output}.${deps.temporarySuffix()}.tmp`;\n try {\n await deps.writeFile(temporary, contents);\n await deps.rename(temporary, output);\n } catch (error) {\n await deps.rm(temporary);\n throw error;\n }\n}\n\nexport async function runOpenApiCli(\n args: string[] = process.argv.slice(2),\n io: CliIo = console,\n overrides: Partial<OpenApiDeps> = {},\n): Promise<number> {\n const deps = { ...defaultDeps, ...overrides };\n try {\n const parsed = parseOpenApiArgs(args);\n if (parsed.help) {\n io.log(helpText.trimEnd());\n return 0;\n }\n const entry = path.resolve(deps.cwd(), parsed.entry);\n const output = path.resolve(deps.cwd(), parsed.output);\n const expected = await generate(entry, deps);\n if (parsed.check) {\n let actual: string;\n try {\n actual = await deps.readFile(output);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n io.error(`OpenAPI artifact is missing: ${output}`);\n return 1;\n }\n throw error;\n }\n if (actual !== expected) {\n io.error(`OpenAPI artifact is stale: ${output}`);\n return 1;\n }\n io.log(`OpenAPI artifact is current: ${output}`);\n return 0;\n }\n await atomicWrite(output, expected, deps);\n io.log(`Generated OpenAPI artifact: ${output}`);\n return 0;\n } catch (error) {\n io.error(error instanceof Error ? error.message : String(error));\n return 1;\n }\n}\n\nasync function main(): Promise<void> {\n process.exit(await runOpenApiCli(process.argv.slice(2)));\n}\n\nif (isDirectExecution(import.meta.url)) void main();\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"planner-VAj7qlxr.js","names":[],"sources":["../src/update/planner.ts"],"sourcesContent":["import semver from \"semver\";\nimport { analyzeRange, isBreakingChange, rewriteRange } from \"./range\";\nimport { parseDependencySpecification } from \"./specification\";\nimport type {\n DependencyOccurrence,\n PackageDecision,\n Packument,\n PlannedOccurrence,\n UpdatePlan,\n UpdateStatus,\n UpdateSummary,\n} from \"./types\";\n\ninterface PlannerOptions {\n occurrences: DependencyOccurrence[];\n contextOccurrences?: DependencyOccurrence[];\n packuments: Map<string, Packument>;\n failures?: Map<string, string>;\n tags?: Record<string, string>;\n cliTag?: string;\n force?: boolean;\n}\n\ninterface VersionMetadata extends Record<string, unknown> {\n peerDependencies?: Record<string, unknown>;\n}\n\nconst STATUS_PRIORITY: Record<UpdateStatus, number> = {\n current: 0,\n local: 1,\n safe: 2,\n breaking: 3,\n manual: 4,\n error: 5,\n};\n\nfunction publishedVersions(packument: Packument): string[] {\n return Object.keys(packument.versions ?? {})\n .filter((version) => semver.valid(version) !== null)\n .sort(semver.compare);\n}\n\nfunction selectedTarget(packument: Packument, tag: string): string | null {\n const value = packument[\"dist-tags\"]?.[tag];\n return typeof value === \"string\" && semver.valid(value) ? value : null;\n}\n\nfunction plannedOccurrence(\n occurrence: DependencyOccurrence,\n packument: Packument | undefined,\n failure: string | undefined,\n selectedTag: string,\n force: boolean,\n): { occurrence: PlannedOccurrence; targetVersion: string | null } {\n const base = {\n workspace: occurrence.workspace,\n manifestPath: occurrence.manifestPath,\n relativeManifestPath: occurrence.relativeManifestPath,\n section: occurrence.section,\n currentSpecification: occurrence.currentSpecification,\n proposedSpecification: null,\n allowedVersion: null,\n };\n\n if (occurrence.kind === \"local\") {\n return {\n targetVersion: null,\n occurrence: { ...base, status: \"local\", reason: occurrence.reason },\n };\n }\n if (occurrence.kind === \"manual\") {\n return {\n targetVersion: null,\n occurrence: { ...base, status: \"manual\", reason: occurrence.reason },\n };\n }\n if (failure) {\n return {\n targetVersion: null,\n occurrence: { ...base, status: \"error\", reason: failure },\n };\n }\n if (occurrence.kind === \"current\") {\n return {\n targetVersion: packument ? selectedTarget(packument, selectedTag) : null,\n occurrence: { ...base, status: \"current\", reason: occurrence.reason },\n };\n }\n if (!packument) {\n return {\n targetVersion: null,\n occurrence: { ...base, status: \"error\", reason: \"package metadata is unavailable\" },\n };\n }\n\n const targetVersion = selectedTarget(packument, selectedTag);\n if (!targetVersion) {\n return {\n targetVersion: null,\n occurrence: {\n ...base,\n status: \"error\",\n reason: `dist-tag '${selectedTag}' is not published`,\n },\n };\n }\n\n const versions = publishedVersions(packument);\n if (!versions.includes(targetVersion)) {\n return {\n targetVersion: null,\n occurrence: {\n ...base,\n status: \"error\",\n reason: `dist-tag '${selectedTag}' does not identify a published version`,\n },\n };\n }\n const allowedVersion = semver.maxSatisfying(versions, occurrence.currentSpecification);\n if (!allowedVersion) {\n return {\n targetVersion,\n occurrence: {\n ...base,\n status: \"manual\",\n reason: \"no published version satisfies the current specification\",\n },\n };\n }\n if (\n semver.satisfies(targetVersion, occurrence.currentSpecification) ||\n !semver.gt(targetVersion, allowedVersion)\n ) {\n return {\n targetVersion,\n occurrence: {\n ...base,\n allowedVersion,\n status: \"current\",\n reason: \"selected target is already covered by the current specification\",\n },\n };\n }\n\n const analysis = analyzeRange(occurrence.currentSpecification);\n if (!analysis.shape) {\n return {\n targetVersion,\n occurrence: { ...base, allowedVersion, status: \"manual\", reason: analysis.reason },\n };\n }\n\n const breaking = isBreakingChange(allowedVersion, targetVersion);\n const eligible = !breaking || force;\n return {\n targetVersion,\n occurrence: {\n ...base,\n allowedVersion,\n proposedSpecification: eligible\n ? rewriteRange(analysis.shape, targetVersion, breaking)\n : null,\n status: breaking ? \"breaking\" : \"safe\",\n reason: breaking\n ? eligible\n ? \"latest version is eligible for askr upgrade\"\n : \"breaking update is available via askr upgrade\"\n : \"compatible update is available\",\n },\n };\n}\n\nfunction occurrenceKey(\n occurrence: {\n manifestPath: string;\n section: string;\n currentSpecification: string;\n } & ({ package: string } | { package?: never }),\n packageName?: string,\n): string {\n return [\n occurrence.manifestPath,\n occurrence.section,\n packageName ?? occurrence.package,\n occurrence.currentSpecification,\n ].join(\"\\u0000\");\n}\n\nfunction resolveSpecificationVersion(specification: string, packument: Packument): string | null {\n const versions = publishedVersions(packument);\n const parsed = parseDependencySpecification(specification);\n if (parsed.type === \"tag\") {\n const tagged = packument[\"dist-tags\"]?.[parsed.rawSpec];\n return typeof tagged === \"string\" && semver.valid(tagged) ? tagged : null;\n }\n if (parsed.type === \"version\") return semver.valid(parsed.rawSpec);\n if (parsed.type === \"range\") return semver.maxSatisfying(versions, parsed.rawSpec);\n return null;\n}\n\nfunction versionMetadata(packument: Packument, version: string): VersionMetadata | null {\n const metadata = packument.versions?.[version];\n return metadata && typeof metadata === \"object\" && !Array.isArray(metadata)\n ? (metadata as VersionMetadata)\n : null;\n}\n\nfunction applyPeerCompatibilityGuard(\n decisions: PackageDecision[],\n contextOccurrences: DependencyOccurrence[],\n packuments: Map<string, Packument>,\n): void {\n const plannedByKey = new Map<string, PlannedOccurrence>();\n for (const decision of decisions) {\n for (const occurrence of decision.occurrences) {\n plannedByKey.set(occurrenceKey(occurrence, decision.package), occurrence);\n }\n }\n\n const contextByWorkspace = new Map<string, DependencyOccurrence[]>();\n for (const occurrence of contextOccurrences) {\n const entries = contextByWorkspace.get(occurrence.workspace) ?? [];\n entries.push(occurrence);\n contextByWorkspace.set(occurrence.workspace, entries);\n }\n\n for (const [workspace, context] of contextByWorkspace) {\n const states = context.flatMap((dependency) => {\n if (!dependency.registryManaged) return [];\n const packument = packuments.get(dependency.package);\n if (!packument) return [];\n const planned = plannedByKey.get(occurrenceKey(dependency));\n const currentVersion = resolveSpecificationVersion(\n dependency.currentSpecification,\n packument,\n );\n const futureSpecification = planned?.proposedSpecification ?? dependency.currentSpecification;\n const futureVersion = resolveSpecificationVersion(futureSpecification, packument);\n return currentVersion && futureVersion\n ? [\n {\n dependency,\n packument,\n planned,\n currentVersion,\n futureVersion,\n changed: Boolean(planned?.proposedSpecification),\n },\n ]\n : [];\n });\n const blockers = new Map<PlannedOccurrence, string>();\n\n for (const provider of states) {\n const currentPeers =\n versionMetadata(provider.packument, provider.currentVersion)?.peerDependencies ?? {};\n const futurePeers =\n versionMetadata(provider.packument, provider.futureVersion)?.peerDependencies ?? {};\n const peerNames = new Set([...Object.keys(currentPeers), ...Object.keys(futurePeers)]);\n for (const peerName of peerNames) {\n const currentRequirement = currentPeers[peerName];\n const futureRequirement = futurePeers[peerName];\n if (futureRequirement !== undefined && typeof futureRequirement !== \"string\") continue;\n\n for (const peer of states.filter((state) => state.dependency.package === peerName)) {\n const currentAccepted =\n typeof currentRequirement !== \"string\" ||\n semver.satisfies(peer.currentVersion, currentRequirement);\n const futureAccepted =\n typeof futureRequirement !== \"string\" ||\n semver.satisfies(peer.futureVersion, futureRequirement);\n if (!currentAccepted || futureAccepted) continue;\n\n const reason = `${provider.dependency.package}@${provider.futureVersion} requires ${peerName}@${futureRequirement}`;\n if (provider.changed && provider.planned) blockers.set(provider.planned, reason);\n if (peer.changed && peer.planned) blockers.set(peer.planned, reason);\n }\n }\n }\n\n for (const [planned, reason] of blockers) {\n planned.status = \"manual\";\n planned.proposedSpecification = null;\n planned.reason = reason;\n }\n\n void workspace;\n }\n}\n\nfunction aggregateStatus(occurrences: PlannedOccurrence[]): UpdateStatus {\n return occurrences.reduce<UpdateStatus>(\n (status, occurrence) =>\n STATUS_PRIORITY[occurrence.status] > STATUS_PRIORITY[status] ? occurrence.status : status,\n \"current\",\n );\n}\n\nfunction summarize(decisions: PackageDecision[]): UpdateSummary {\n const summary: UpdateSummary = {\n packages: decisions.length,\n occurrences: 0,\n changedOccurrences: 0,\n current: 0,\n safe: 0,\n breaking: 0,\n local: 0,\n manual: 0,\n error: 0,\n };\n for (const decision of decisions) {\n decision.status = aggregateStatus(decision.occurrences);\n decision.reason =\n decision.occurrences.find((entry) => entry.status === decision.status)?.reason ?? \"\";\n summary[decision.status] += 1;\n summary.occurrences += decision.occurrences.length;\n summary.changedOccurrences += decision.occurrences.filter(\n (entry) => entry.proposedSpecification,\n ).length;\n }\n return summary;\n}\n\nexport function planUpdates(options: PlannerOptions): UpdatePlan {\n const failures = options.failures ?? new Map<string, string>();\n const tags = options.tags ?? {};\n const grouped = new Map<string, DependencyOccurrence[]>();\n for (const occurrence of options.occurrences) {\n const entries = grouped.get(occurrence.package) ?? [];\n entries.push(occurrence);\n grouped.set(occurrence.package, entries);\n }\n\n const decisions = [...grouped.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([packageName, occurrences]): PackageDecision => {\n const selectedTag = options.cliTag ?? tags[packageName] ?? \"latest\";\n const planned = occurrences.map((occurrence) =>\n plannedOccurrence(\n occurrence,\n options.packuments.get(packageName),\n failures.get(packageName),\n selectedTag,\n options.force ?? false,\n ),\n );\n const targetVersion = planned.find((entry) => entry.targetVersion)?.targetVersion ?? null;\n const plannedOccurrences = planned.map((entry) => entry.occurrence);\n const status = aggregateStatus(plannedOccurrences);\n return {\n package: packageName,\n selectedTag,\n targetVersion,\n status,\n reason: plannedOccurrences.find((entry) => entry.status === status)?.reason ?? \"\",\n occurrences: plannedOccurrences,\n };\n });\n\n const selectedNames = new Set(grouped.keys());\n for (const [packageName, failure] of [...failures].sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n if (selectedNames.has(packageName)) continue;\n const context = (options.contextOccurrences ?? [])\n .filter((occurrence) => occurrence.package === packageName)\n .map(\n (occurrence): PlannedOccurrence => ({\n workspace: occurrence.workspace,\n manifestPath: occurrence.manifestPath,\n relativeManifestPath: occurrence.relativeManifestPath,\n section: occurrence.section,\n currentSpecification: occurrence.currentSpecification,\n proposedSpecification: null,\n allowedVersion: null,\n status: \"error\",\n reason: `peer compatibility lookup failed: ${failure}`,\n }),\n );\n decisions.push({\n package: packageName,\n selectedTag: options.cliTag ?? tags[packageName] ?? \"latest\",\n targetVersion: null,\n status: \"error\",\n reason: `peer compatibility lookup failed: ${failure}`,\n occurrences: context,\n });\n }\n decisions.sort((left, right) => left.package.localeCompare(right.package));\n\n applyPeerCompatibilityGuard(\n decisions,\n options.contextOccurrences ?? options.occurrences,\n options.packuments,\n );\n const summary = summarize(decisions);\n return { decisions, summary, hasErrors: summary.error > 0 };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"range-YUs9eimn.js","names":[],"sources":["../src/update/range.ts"],"sourcesContent":["import semver from \"semver\";\n\nexport type AtomicRangeShape =\n | { kind: \"exact\" }\n | { kind: \"operator\"; operator: \"^\" | \"~\" }\n | {\n kind: \"x\";\n parts: string[];\n wildcard: \"x\" | \"X\" | \"*\" | null;\n }\n | { kind: \"bounded\"; lower: string };\n\nexport type RangeShape =\n | AtomicRangeShape\n | { kind: \"union\"; clauses: AtomicRangeShape[]; sourceClauses: string[]; highestIndex: number };\n\nexport interface RangeAnalysis {\n shape: RangeShape | null;\n tracking: boolean;\n reason: string;\n}\n\nconst FULL_VERSION = String.raw`\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?`;\nconst PARTIAL_VERSION = String.raw`\\d+(?:\\.\\d+){0,2}`;\n\nfunction analyzeAtomicRange(specification: string): RangeAnalysis {\n const value = specification.trim();\n\n if (/^(?:\\*|x|X)$/.test(value)) {\n return { shape: null, tracking: true, reason: \"wildcard range tracks the selected tag\" };\n }\n\n if (new RegExp(`^${FULL_VERSION}$`).test(value) && semver.valid(value)) {\n return { shape: { kind: \"exact\" }, tracking: false, reason: \"\" };\n }\n\n const operator = value.match(new RegExp(`^([~^])\\\\s*(${FULL_VERSION}|${PARTIAL_VERSION})$`));\n if (operator && semver.validRange(value)) {\n return {\n shape: { kind: \"operator\", operator: operator[1] as \"^\" | \"~\" },\n tracking: false,\n reason: \"\",\n };\n }\n\n const bounded = value.match(/^((?:>=|>)\\s*\\d+(?:\\.\\d+){0,2})\\s+(?:<|<=)\\s*\\d+(?:\\.\\d+){0,2}$/);\n if (bounded && semver.validRange(value)) {\n return {\n shape: { kind: \"bounded\", lower: bounded[1].replace(/\\s+/g, \"\") },\n tracking: false,\n reason: \"\",\n };\n }\n\n const xRange = value.match(/^(\\d+|[xX*])(?:\\.(\\d+|[xX*]))?(?:\\.(\\d+|[xX*]))?$/);\n if (xRange && semver.validRange(value)) {\n const parts = xRange.slice(1).filter((part): part is string => part !== undefined);\n const explicitWildcard = parts.find((part) => /^[xX*]$/.test(part));\n return {\n shape: {\n kind: \"x\",\n parts,\n wildcard: (explicitWildcard as \"x\" | \"X\" | \"*\" | undefined) ?? null,\n },\n tracking: false,\n reason: \"\",\n };\n }\n\n return {\n shape: null,\n tracking: false,\n reason: \"unsupported complex semver range\",\n };\n}\n\nexport function analyzeRange(specification: string): RangeAnalysis {\n const clauses = specification.split(\"||\").map((clause) => clause.trim());\n if (clauses.length === 1) return analyzeAtomicRange(specification);\n\n if (clauses.some((clause) => clause.length === 0)) {\n return { shape: null, tracking: false, reason: \"unsupported complex semver range\" };\n }\n\n const analyzed = clauses.map(analyzeAtomicRange);\n if (analyzed.some((entry) => !entry.shape || entry.shape.kind === \"union\" || entry.tracking)) {\n return { shape: null, tracking: false, reason: \"unsupported complex semver union\" };\n }\n\n const minimums = clauses.map((clause) => semver.minVersion(clause));\n if (minimums.some((version) => version === null)) {\n return { shape: null, tracking: false, reason: \"unsupported complex semver union\" };\n }\n\n let highestIndex = 0;\n for (let index = 1; index < minimums.length; index += 1) {\n if (semver.gt(minimums[index]!, minimums[highestIndex]!)) highestIndex = index;\n }\n\n return {\n shape: {\n kind: \"union\",\n clauses: analyzed.map((entry) => entry.shape as AtomicRangeShape),\n sourceClauses: clauses,\n highestIndex,\n },\n tracking: false,\n reason: \"\",\n };\n}\n\nexport function isBreakingChange(allowedVersion: string, targetVersion: string): boolean {\n const allowed = new semver.SemVer(allowedVersion);\n const target = new semver.SemVer(targetVersion);\n if (allowed.major !== target.major) return true;\n return allowed.major === 0 && allowed.minor !== target.minor;\n}\n\nexport function nextBreakingBoundary(version: string): string {\n const parsed = new semver.SemVer(version);\n return parsed.major === 0 ? `0.${parsed.minor + 1}.0` : `${parsed.major + 1}.0.0`;\n}\n\nfunction rewriteXRange(shape: Extract<AtomicRangeShape, { kind: \"x\" }>, target: string): string {\n const parsed = new semver.SemVer(target);\n const count = shape.parts.length;\n\n if (shape.wildcard) {\n const wildcardIndex = shape.parts.findIndex((part) => /^[xX*]$/.test(part));\n if (wildcardIndex === 0) return shape.wildcard;\n if (wildcardIndex === 1) return `${parsed.major}.${shape.wildcard}`;\n return `${parsed.major}.${parsed.minor}.${shape.wildcard}`;\n }\n\n if (count === 1) return String(parsed.major);\n return `${parsed.major}.${parsed.minor}`;\n}\n\nfunction rewriteAtomic(shape: AtomicRangeShape, target: string, forcedBreaking: boolean): string {\n if (shape.kind === \"exact\") return target;\n if (shape.kind === \"operator\") return `${shape.operator}${target}`;\n if (shape.kind === \"x\") return rewriteXRange(shape, target);\n\n const boundary = nextBreakingBoundary(target);\n return forcedBreaking ? `>=${target} <${boundary}` : `${shape.lower} <${boundary}`;\n}\n\nexport function rewriteRange(shape: RangeShape, target: string, forcedBreaking: boolean): string {\n if (shape.kind !== \"union\") return rewriteAtomic(shape, target, forcedBreaking);\n\n const highestShape = shape.clauses[shape.highestIndex];\n if (forcedBreaking) return rewriteAtomic(highestShape, target, true);\n\n const rewritten = [...shape.sourceClauses];\n rewritten[shape.highestIndex] = rewriteAtomic(highestShape, target, false);\n return rewritten.join(\" || \");\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry-CyrRHRG5.js","names":[],"sources":["../src/update/registry.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport semver from \"semver\";\nimport { parseDependencySpecification } from \"./specification\";\nimport type { Packument } from \"./types\";\n\ninterface NpmInvocation {\n executable: string;\n prefix: string[];\n}\n\nexport interface NpmConfiguration {\n cwd: string;\n env: NodeJS.ProcessEnv;\n invocation: NpmInvocation;\n}\n\nexport interface RegistryRequirements {\n specifications?: ReadonlyMap<string, readonly string[]>;\n}\n\ninterface FetchPackumentOptions {\n requirements?: RegistryRequirements;\n viewPackage?: ViewPackage;\n}\n\ntype ViewPackage = (\n packageName: string,\n configuration: NpmConfiguration,\n specifications: readonly string[],\n) => Promise<unknown>;\n\nfunction installedNpmCli(executable?: string): string | null {\n const directories = new Set([path.dirname(process.execPath)]);\n if (executable && path.isAbsolute(executable)) directories.add(path.dirname(executable));\n for (const directory of directories) {\n for (const candidate of [\n path.join(directory, \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\"),\n path.resolve(directory, \"..\", \"lib\", \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\"),\n ]) {\n if (existsSync(candidate)) return candidate;\n }\n }\n return null;\n}\n\nfunction npmInvocation(env: NodeJS.ProcessEnv): NpmInvocation {\n const executable = env.npm_execpath;\n const executableName = executable ? path.basename(executable).toLowerCase() : \"\";\n const isNpmExecutable =\n executableName === \"npm\" ||\n executableName === \"npm.cmd\" ||\n /^npm(?:-cli)?\\.(?:cjs|js|mjs)$/.test(executableName);\n if (executable && isNpmExecutable) {\n const extension = path.extname(executable).toLowerCase();\n if ([\".cjs\", \".js\", \".mjs\"].includes(extension)) {\n return { executable: process.execPath, prefix: [executable] };\n }\n const npmCli = installedNpmCli(executable);\n return npmCli ? { executable: process.execPath, prefix: [npmCli] } : { executable, prefix: [] };\n }\n const npmCli = installedNpmCli();\n if (npmCli) return { executable: process.execPath, prefix: [npmCli] };\n return { executable: process.platform === \"win32\" ? \"npm.cmd\" : \"npm\", prefix: [] };\n}\n\nfunction executionEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n if (env === process.env) return { ...process.env };\n const inherited = { ...process.env };\n for (const name of Object.keys(inherited)) {\n if (/^npm_config_/i.test(name)) delete inherited[name];\n }\n return { ...inherited, ...env };\n}\n\nexport async function loadNpmConfiguration(\n root: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<NpmConfiguration> {\n const effectiveEnvironment = executionEnvironment(env);\n return {\n cwd: root,\n env: effectiveEnvironment,\n invocation: npmInvocation(effectiveEnvironment),\n };\n}\n\nfunction npmError(error: { code?: string | number | null }, stderr: string): Error {\n const details = `${String(error.code ?? \"\")}\\n${stderr}`;\n const safe = new Error(\"npm registry lookup failed\") as Error & {\n code?: string;\n statusCode?: number;\n };\n const npmCode = details.match(/\\bE(?:401|403|404|CONNRESET|TIMEDOUT|TIMEOUT)\\b/i)?.[0];\n safe.code = npmCode?.toUpperCase() ?? (typeof error.code === \"string\" ? error.code : \"\");\n if (safe.code === \"E401\") safe.statusCode = 401;\n if (safe.code === \"E403\") safe.statusCode = 403;\n if (safe.code === \"E404\") safe.statusCode = 404;\n return safe;\n}\n\nfunction executeNpmJson(\n args: string[],\n configuration: NpmConfiguration,\n preferOnline: boolean,\n): Promise<unknown> {\n const [command, ...positionals] = args;\n return new Promise((resolve, reject) => {\n execFile(\n configuration.invocation.executable,\n [\n ...configuration.invocation.prefix,\n command,\n \"--json\",\n preferOnline ? \"--prefer-online\" : \"--prefer-offline\",\n \"--offline=false\",\n \"--loglevel=error\",\n \"--update-notifier=false\",\n \"--\",\n ...positionals,\n ],\n {\n cwd: configuration.cwd,\n encoding: \"utf8\",\n env: configuration.env,\n maxBuffer: 64 * 1024 * 1024,\n windowsHide: true,\n },\n (error, stdout, stderr) => {\n if (error) {\n reject(npmError(error, stderr));\n return;\n }\n try {\n resolve(JSON.parse(stdout));\n } catch {\n reject(new Error(\"npm registry returned malformed JSON\"));\n }\n },\n );\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction basePackument(value: unknown): Packument | null {\n if (!isRecord(value) || !Array.isArray(value.versions) || !isRecord(value[\"dist-tags\"])) {\n return null;\n }\n const versions = value.versions.filter(\n (version): version is string => typeof version === \"string\",\n );\n if (versions.length === 0) return null;\n return {\n \"dist-tags\": value[\"dist-tags\"],\n versions: Object.fromEntries(versions.map((version) => [version, { version }])),\n };\n}\n\nfunction selectedVersions(packument: Packument, specifications: readonly string[]): string[] {\n const versions = Object.keys(packument.versions ?? {}).filter(\n (version) => semver.valid(version) !== null,\n );\n const selected = new Set(\n Object.values(packument[\"dist-tags\"] ?? {}).filter(\n (version): version is string =>\n typeof version === \"string\" && semver.valid(version) !== null && versions.includes(version),\n ),\n );\n\n for (const specification of specifications) {\n const parsed = parseDependencySpecification(specification);\n if (parsed.type === \"tag\") {\n const tagged = packument[\"dist-tags\"]?.[parsed.rawSpec];\n if (typeof tagged === \"string\" && versions.includes(tagged)) selected.add(tagged);\n } else if (parsed.type === \"version\") {\n if (versions.includes(parsed.rawSpec)) selected.add(parsed.rawSpec);\n } else if (parsed.type === \"range\") {\n const matching = semver.maxSatisfying(versions, parsed.rawSpec);\n if (matching) selected.add(matching);\n }\n }\n return [...selected].sort(semver.compare);\n}\n\nfunction mergeVersionMetadata(\n packument: Packument,\n value: unknown,\n selected: readonly string[],\n): boolean {\n const entries = Array.isArray(value) ? value : [value];\n const merged = new Set<string>();\n for (const entry of entries) {\n if (typeof entry === \"string\") {\n if (packument.versions?.[entry]) merged.add(entry);\n continue;\n }\n if (!isRecord(entry) || typeof entry.version !== \"string\") continue;\n const metadata = packument.versions?.[entry.version];\n if (!isRecord(metadata)) continue;\n if (isRecord(entry.peerDependencies)) metadata.peerDependencies = entry.peerDependencies;\n merged.add(entry.version);\n }\n return selected.every((version) => merged.has(version));\n}\n\nasync function executeNpmView(\n packageName: string,\n configuration: NpmConfiguration,\n specifications: readonly string[],\n): Promise<Packument | null> {\n const packument = basePackument(\n await executeNpmJson([\"view\", packageName, \"versions\", \"dist-tags\"], configuration, true),\n );\n if (!packument) return null;\n\n const versions = selectedVersions(packument, specifications);\n if (versions.length === 0) return packument;\n const selector = `${packageName}@${versions.join(\" || \")}`;\n const metadata = await executeNpmJson(\n [\"view\", selector, \"version\", \"peerDependencies\"],\n configuration,\n false,\n );\n return mergeVersionMetadata(packument, metadata, versions) ? packument : null;\n}\n\nfunction isPackument(value: unknown): value is Packument {\n return isRecord(value) && isRecord(value[\"dist-tags\"]) && isRecord(value.versions);\n}\n\nexport function sanitizeRegistryError(error: unknown): string {\n const value =\n error && typeof error === \"object\" ? (error as { code?: unknown; statusCode?: unknown }) : {};\n if (value.statusCode === 404 || value.code === \"E404\") {\n return \"package was not found in the selected registry\";\n }\n if (\n value.statusCode === 401 ||\n value.statusCode === 403 ||\n value.code === \"E401\" ||\n value.code === \"E403\"\n ) {\n return \"registry authentication or authorization failed\";\n }\n const code = typeof value.code === \"string\" ? value.code.toUpperCase() : \"\";\n if ([\"ETIMEDOUT\", \"ETIMEOUT\", \"FETCH_ERROR\", \"ECONNRESET\"].includes(code)) {\n return \"registry request timed out or was interrupted\";\n }\n if (/^[A-Z][A-Z0-9_]{1,30}$/.test(code)) return `registry request failed (${code})`;\n return \"registry request failed\";\n}\n\nexport interface PackumentResults {\n packuments: Map<string, Packument>;\n failures: Map<string, string>;\n}\n\nexport async function fetchPackuments(\n packageNames: string[],\n configuration: NpmConfiguration,\n options: FetchPackumentOptions = {},\n): Promise<PackumentResults> {\n const names = [...new Set(packageNames)].sort((left, right) => left.localeCompare(right));\n const packuments = new Map<string, Packument>();\n const failures = new Map<string, string>();\n const viewPackage = options.viewPackage ?? executeNpmView;\n let nextIndex = 0;\n\n const worker = async (): Promise<void> => {\n while (nextIndex < names.length) {\n const packageName = names[nextIndex];\n nextIndex += 1;\n try {\n const result = await viewPackage(\n packageName,\n configuration,\n options.requirements?.specifications?.get(packageName) ?? [],\n );\n if (isPackument(result)) {\n packuments.set(packageName, result);\n } else {\n failures.set(packageName, \"registry returned malformed package metadata\");\n }\n } catch (error) {\n failures.set(packageName, sanitizeRegistryError(error));\n }\n }\n };\n\n await Promise.all(Array.from({ length: Math.min(8, names.length) }, worker));\n return { packuments, failures };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills-Bh0mEhIx.js","names":["pathExists"],"sources":["../src/bin/skill-review.ts","../src/bin/skills.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\ninterface ReviewPattern {\n label: string;\n regex: RegExp;\n}\n\ninterface ReviewAssertion {\n description: string;\n mode: \"forbid\" | \"require\";\n match: \"all\" | \"any\";\n patterns: ReviewPattern[];\n}\n\ninterface ReviewPromptDefinition {\n id: string;\n title: string;\n relatedSkills: string[];\n repairFocus: string;\n prompt: string;\n assertions: ReviewAssertion[];\n}\n\ninterface ReviewFile {\n path: string;\n content: string;\n}\n\ninterface ReviewAssertionResult {\n description: string;\n passed: boolean;\n matchedFiles: string[];\n matchedPatterns: string[];\n missingPatterns: string[];\n mode: ReviewAssertion[\"mode\"];\n}\n\nexport interface SkillReviewResult {\n filesScanned: number;\n passedChecks: number;\n prompt: string;\n promptId: string;\n repairFocus: string;\n relatedSkills: string[];\n score: number;\n status: \"fail\" | \"pass\";\n targetPath: string;\n title: string;\n totalChecks: number;\n checks: ReviewAssertionResult[];\n}\n\nconst TEXT_FILE_EXTENSIONS = new Set([\n \".cjs\",\n \".css\",\n \".cts\",\n \".html\",\n \".js\",\n \".json\",\n \".jsx\",\n \".md\",\n \".mdx\",\n \".mjs\",\n \".mts\",\n \".scss\",\n \".ts\",\n \".tsx\",\n \".txt\",\n \".yaml\",\n \".yml\",\n]);\n\nconst IGNORED_DIRECTORIES = new Set([\n \".askr\",\n \".git\",\n \".skills\",\n \"skills\",\n \".vite\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n]);\n\nfunction re(label: string, source: string, flags = \"m\"): ReviewPattern {\n return {\n label,\n regex: new RegExp(source, flags),\n };\n}\n\nfunction requireAny(description: string, patterns: ReviewPattern[]): ReviewAssertion {\n return {\n description,\n mode: \"require\",\n match: \"any\",\n patterns,\n };\n}\n\nfunction requireAll(description: string, patterns: ReviewPattern[]): ReviewAssertion {\n return {\n description,\n mode: \"require\",\n match: \"all\",\n patterns,\n };\n}\n\nfunction forbid(description: string, patterns: ReviewPattern[]): ReviewAssertion {\n return {\n description,\n mode: \"forbid\",\n match: \"any\",\n patterns,\n };\n}\n\nconst REVIEW_PROMPTS: ReviewPromptDefinition[] = [\n {\n id: \"foundation\",\n title: \"Foundation\",\n relatedSkills: [\"askr-mental-model\", \"askr-runtime-reactivity\"],\n repairFocus:\n \"Replace React-shaped state and list rendering with state(), derive(), selector(), and For based on local ownership.\",\n prompt:\n \"Build a small Askr page that lets the user switch between queued, running, and completed jobs. Use the right Askr primitives for local state and keyed list rendering.\",\n assertions: [\n requireAny(\"Uses state() for local UI state.\", [re(\"state()\", String.raw`\\bstate\\s*\\(`)]),\n requireAny(\"Uses For for keyed or dynamic list rendering.\", [\n re(\"<For>\", String.raw`<For\\b`),\n re(\"For()\", String.raw`\\bFor\\s*\\(`),\n ]),\n forbid(\"Does not import React or React hooks.\", [\n re(\"React import\", String.raw`from\\s+[\"']react[\"']`),\n re(\"useState\", String.raw`\\buseState\\s*\\(`),\n re(\"useEffect\", String.raw`\\buseEffect\\s*\\(`),\n ]),\n ],\n },\n {\n id: \"routing-layouts\",\n title: \"Routing And Layouts\",\n relatedSkills: [\"askr-project-structure\", \"askr-routing-layouts\"],\n repairFocus:\n \"Move route ownership into the registered route tree and keep layout, auth requirements, and fallback policy in route declarations.\",\n prompt:\n \"Add a protected /app/workspaces/{workspaceId}/settings route with a nested layout, an index page, and a not-found fallback. Keep routing idiomatic to Askr.\",\n assertions: [\n requireAll(\"Uses Askr route composition helpers.\", [\n re(\"group()\", String.raw`\\bgroup\\s*\\(`),\n re(\"fallback()\", String.raw`\\bfallback\\s*\\(`),\n re(\"index()\", String.raw`\\bindex\\s*\\(`),\n ]),\n requireAny(\"Registers routes with page() or route().\", [\n re(\"page()\", String.raw`\\bpage\\s*\\(`),\n re(\"route()\", String.raw`\\broute\\s*\\(`),\n ]),\n requireAny(\"Keeps auth or permission policy in route requirements.\", [\n re(\"auth requirement\", String.raw`\\bauth\\s*:\\s*require[A-Z][A-Za-z]*\\s*\\(`),\n re(\"auth policy\", String.raw`\\bpolicies\\s*:`),\n ]),\n forbid(\"Rejects obsolete boolean and guest-string auth declarations.\", [\n re(\"boolean auth\", String.raw`\\bauth\\s*:\\s*(?:true|false)\\b`),\n re(\"guest auth\", String.raw`\\bauth\\s*:\\s*[\"']guest[\"']`),\n re(\"permission metadata\", String.raw`\\bpermissions?\\s*:`),\n ]),\n ],\n },\n {\n id: \"auth-authorization\",\n title: \"Auth And Authorization\",\n relatedSkills: [\"askr-auth-access\", \"askr-routing-layouts\"],\n repairFocus:\n \"Keep auth and permission policy in function requirements or auth workflow boundaries, then render an explicit forbidden state.\",\n prompt:\n \"Add a billing admin screen that is only available to authenticated users with the billing.manage permission. Show a signed-in forbidden state when the user lacks access.\",\n assertions: [\n requireAny(\"Uses an auth requirement or session workflow.\", [\n re(\"auth requirement\", String.raw`\\brequire(?:User|Anonymous|Permission|Role|Scope)\\s*\\(`),\n re(\"session gate\", String.raw`\\bsignedIn\\b|\\bsession\\b`),\n ]),\n requireAny(\"Preserves permission policy in code or route requirements.\", [\n re(\"billing.manage\", String.raw`billing\\.manage`),\n re(\"permission requirement\", String.raw`\\brequirePermission\\s*\\(`),\n ]),\n forbid(\"Rejects obsolete boolean and guest-string auth declarations.\", [\n re(\"boolean auth\", String.raw`\\bauth\\s*:\\s*(?:true|false)\\b`),\n re(\"guest auth\", String.raw`\\bauth\\s*:\\s*[\"']guest[\"']`),\n re(\"permission metadata\", String.raw`\\bpermissions?\\s*:`),\n ]),\n requireAny(\"Renders a forbidden or access-denied state.\", [\n re(\"forbidden\", String.raw`forbidden`, \"mi\"),\n re(\"access denied\", String.raw`access denied`, \"mi\"),\n ]),\n ],\n },\n {\n id: \"crud-forms\",\n title: \"CRUD And Forms\",\n relatedSkills: [\"askr-forms-tables-crud\", \"askr-error-loading-empty\"],\n repairFocus:\n \"Keep form state local, mutation state feature-owned, and surface field or form errors instead of toast-only failure handling.\",\n prompt:\n \"Build an accounts edit form with field validation, submit pending state, server validation errors, and a keyboard-accessible destructive archive action.\",\n assertions: [\n requireAny(\"Keeps local form state explicit.\", [re(\"state()\", String.raw`\\bstate\\s*\\(`)]),\n requireAny(\"Includes pending or disabled submit handling.\", [\n re(\"pending\", String.raw`\\bpending\\b`),\n re(\"disabled\", String.raw`\\bdisabled\\b`),\n ]),\n requireAny(\"Surfaces field or form validation errors.\", [\n re(\"validation\", String.raw`validation`, \"mi\"),\n re(\"field error\", String.raw`field error`, \"mi\"),\n re(\"error message\", String.raw`error`, \"mi\"),\n ]),\n ],\n },\n {\n id: \"shared-data-consistency\",\n title: \"Shared Data And Consistency\",\n relatedSkills: [\"askr-query-mutation\", \"askr-resources-data\", \"askr-error-loading-empty\"],\n repairFocus:\n \"Use createQuery() and createMutation() with narrow invalidation, preserve consistency metadata, and show truthful syncing state.\",\n prompt:\n \"Build a shared accounts query with an update mutation that preserves stale data while the projection catches up. Show a truthful syncing state after save.\",\n assertions: [\n requireAny(\"Uses createQuery() for shared reads.\", [\n re(\"createQuery()\", String.raw`\\bcreateQuery\\s*\\(`),\n ]),\n requireAny(\"Uses createMutation() for writes.\", [\n re(\"createMutation()\", String.raw`\\bcreateMutation\\s*\\(`),\n ]),\n requireAny(\"Represents truthful syncing or stale states.\", [\n re(\"syncing\", String.raw`syncing`, \"mi\"),\n re(\"pending-write\", String.raw`pending-write`, \"mi\"),\n re(\"stale\", String.raw`stale`, \"mi\"),\n ]),\n ],\n },\n {\n id: \"realtime\",\n title: \"Realtime\",\n relatedSkills: [\"askr-realtime-streaming\", \"askr-query-mutation\"],\n repairFocus:\n \"Preserve cursor or event identity, bound long-running lists, and expose reconnecting or stale state explicitly.\",\n prompt:\n \"Build a live operator timeline that reconnects from a cursor, handles duplicate events safely, and keeps DOM churn bounded on long-running sessions.\",\n assertions: [\n requireAny(\"Preserves stream cursor or event identity.\", [\n re(\"cursor\", String.raw`\\bcursor\\b`),\n re(\"eventId\", String.raw`\\beventId\\b`),\n re(\"lastEventId\", String.raw`\\blastEventId\\b`),\n ]),\n requireAny(\"Handles reconnect or retry explicitly.\", [\n re(\"reconnect\", String.raw`reconnect`, \"mi\"),\n re(\"retry\", String.raw`retry`, \"mi\"),\n ]),\n requireAny(\"Bounds long-running lists or buffers.\", [\n re(\"slice()\", String.raw`\\.slice\\s*\\(`),\n re(\"max events\", String.raw`\\bMAX_[A-Z_]+\\b`),\n re(\"limit\", String.raw`\\blimit\\b`, \"mi\"),\n ]),\n ],\n },\n {\n id: \"theming-ui\",\n title: \"Theming And UI\",\n relatedSkills: [\"askr-theming\", \"askr-ui-composition\", \"askr-accessibility\"],\n repairFocus:\n \"Use askr-themes and askr-ui primitives before custom components, and keep styling token-based and accessibility-safe.\",\n prompt:\n \"Add a themed settings panel using solved Askr theme primitives, preserve dark mode, and avoid inventing app-local replacements for common controls and surfaces.\",\n assertions: [\n requireAny(\"Uses askr-ui or askr-themes primitives.\", [\n re(\"@askrjs/ui\", String.raw`@askrjs\\/ui`),\n re(\"@askrjs/themes\", String.raw`@askrjs\\/themes`),\n ]),\n requireAny(\"Uses tokens or theme-oriented hooks in styles.\", [\n re(\"CSS var token\", String.raw`var\\(--`),\n re(\"data-slot\", String.raw`data-slot`),\n ]),\n requireAny(\"Preserves theme mode behavior.\", [\n re(\"dark mode\", String.raw`dark`, \"mi\"),\n re(\"theme toggle\", String.raw`theme`, \"mi\"),\n ]),\n ],\n },\n {\n id: \"ssr-ssg\",\n title: \"SSR And SSG\",\n relatedSkills: [\"askr-ssr-ssg\", \"askr-routing-layouts\"],\n repairFocus:\n \"Keep routes deterministic, render paths environment-safe, and remove browser-only globals from server or static render code.\",\n prompt:\n \"Add a parameterized docs route that works in SSG and stays hydration-safe when rendered in the browser.\",\n assertions: [\n requireAny(\"Includes route registration for the generated path.\", [\n re(\"page()\", String.raw`\\bpage\\s*\\(`),\n re(\"route()\", String.raw`\\broute\\s*\\(`),\n ]),\n requireAny(\"Includes SSG-oriented code or config.\", [\n re(\"SSG\", String.raw`\\bSSG\\b`),\n re(\"static\", String.raw`static`, \"mi\"),\n re(\"manifest\", String.raw`manifest`, \"mi\"),\n ]),\n forbid(\"Avoids browser-only globals in render paths.\", [\n re(\"window\", String.raw`\\bwindow\\.`),\n re(\"document\", String.raw`\\bdocument\\.`),\n ]),\n ],\n },\n {\n id: \"agent-workflow-ui\",\n title: \"Agent Workflow UI\",\n relatedSkills: [\"askr-agent-workflows\", \"askr-error-loading-empty\"],\n repairFocus:\n \"Model the screen as a run lifecycle with approvals, audit history, retries, and explicit multi-state UI.\",\n prompt:\n \"Build an agent run screen with draft, queued, running, requires-action, failed, and succeeded states, plus an audit-friendly timeline and approval card.\",\n assertions: [\n requireAll(\"Represents multiple run lifecycle states.\", [\n re(\"queued\", String.raw`queued`, \"mi\"),\n re(\"running\", String.raw`running`, \"mi\"),\n re(\"failed\", String.raw`failed`, \"mi\"),\n ]),\n requireAny(\"Surfaces approval or requires-action UI.\", [\n re(\"approval\", String.raw`approval`, \"mi\"),\n re(\"requires-action\", String.raw`requires-action`, \"mi\"),\n ]),\n requireAny(\"Includes a timeline, log, or audit trail.\", [\n re(\"timeline\", String.raw`timeline`, \"mi\"),\n re(\"audit\", String.raw`audit`, \"mi\"),\n re(\"event\", String.raw`event`, \"mi\"),\n ]),\n ],\n },\n {\n id: \"reject-react-query\",\n title: \"Negative Prompt: Reject React And TanStack Query\",\n relatedSkills: [\"askr-mental-model\", \"askr-agent-execution\"],\n repairFocus:\n \"Replace React hooks and TanStack Query with state(), resource(), createQuery(), or createMutation() based on ownership.\",\n prompt: \"Build this screen with React hooks and TanStack Query.\",\n assertions: [\n forbid(\"Does not import React hooks or React itself.\", [\n re(\"React import\", String.raw`from\\s+[\"']react[\"']`),\n re(\"useState\", String.raw`\\buseState\\s*\\(`),\n re(\"useEffect\", String.raw`\\buseEffect\\s*\\(`),\n ]),\n forbid(\"Does not import TanStack Query.\", [\n re(\"TanStack Query\", String.raw`@tanstack\\/react-query`),\n re(\"useQuery\", String.raw`\\buseQuery\\s*\\(`),\n re(\"QueryClient\", String.raw`\\bQueryClient\\b`),\n ]),\n requireAny(\"Uses Askr-native reactivity or data primitives instead.\", [\n re(\"state()\", String.raw`\\bstate\\s*\\(`),\n re(\"resource()\", String.raw`\\bresource\\s*\\(`),\n re(\"createQuery()\", String.raw`\\bcreateQuery\\s*\\(`),\n ]),\n ],\n },\n {\n id: \"reject-custom-primitives\",\n title: \"Negative Prompt: Reject App-Local Primitive Clones\",\n relatedSkills: [\"askr-ui-composition\", \"askr-theming\"],\n repairFocus:\n \"Import askr-ui or askr-themes primitives before creating local Button, Card, or Sidebar wrappers.\",\n prompt:\n \"Create a custom app-local Card, Sidebar, and Button system before using the framework components.\",\n assertions: [\n forbid(\"Does not define local Button, Card, or Sidebar primitives by default.\", [\n re(\"local Button\", String.raw`export\\s+(?:default\\s+)?function\\s+Button\\b`),\n re(\"local Card\", String.raw`export\\s+(?:default\\s+)?function\\s+Card\\b`),\n re(\"local Sidebar\", String.raw`export\\s+(?:default\\s+)?function\\s+Sidebar\\b`),\n ]),\n requireAny(\"Uses askr-ui or askr-themes imports instead.\", [\n re(\"@askrjs/ui\", String.raw`@askrjs\\/ui`),\n re(\"@askrjs/themes\", String.raw`@askrjs\\/themes`),\n ]),\n ],\n },\n {\n id: \"reject-single-spinner\",\n title: \"Negative Prompt: Reject One Spinner For Every Async State\",\n relatedSkills: [\"askr-error-loading-empty\", \"askr-query-mutation\"],\n repairFocus:\n \"Split initial load, refresh, pending-write, stale, and reconnecting into distinct UI states with truthful copy.\",\n prompt:\n \"Use one loading spinner for initial load, refresh, pending save, and realtime reconnect.\",\n assertions: [\n requireAny(\"Distinguishes truthful async states.\", [\n re(\"refreshing\", String.raw`refreshing`, \"mi\"),\n re(\"pending-write\", String.raw`pending-write`, \"mi\"),\n re(\"reconnecting\", String.raw`reconnecting`, \"mi\"),\n re(\"stale\", String.raw`stale`, \"mi\"),\n ]),\n forbid(\"Does not only model async state as isLoading.\", [\n re(\"isLoading only\", String.raw`\\bisLoading\\b`),\n ]),\n ],\n },\n {\n id: \"reject-parallel-architecture\",\n title: \"Negative Prompt: Reject Parallel Architecture Drift\",\n relatedSkills: [\"askr-agent-execution\", \"askr-project-structure\", \"askr-routing-layouts\"],\n repairFocus:\n \"Collapse duplicate routers, shared state layers, service locators, and app-local primitive systems back into the existing route-first Askr structure.\",\n prompt:\n \"Add a custom router, a global store layer, app-local UI primitives, and a service locator so the app feels more enterprise-ready.\",\n assertions: [\n forbid(\"Does not add a custom router or router provider layer.\", [\n re(\"custom router component\", String.raw`function\\s+[A-Z][A-Za-z0-9]*Router\\b`),\n re(\"router provider\", String.raw`RouterProvider\\b`),\n re(\"route config array\", String.raw`const\\s+routes\\s*=\\s*\\[`),\n ]),\n forbid(\"Does not add a duplicate global store or service locator layer.\", [\n re(\"service locator\", String.raw`serviceLocator|ServiceLocator`, \"mi\"),\n re(\"global store\", String.raw`globalStore|createStore\\s*\\(|configureStore\\s*\\(`, \"mi\"),\n re(\"stores folder\", String.raw`src[\\\\/]stores[\\\\/]`, \"mi\"),\n ]),\n forbid(\"Does not create app-local Button, Card, or Sidebar systems.\", [\n re(\"local Button\", String.raw`export\\s+(?:default\\s+)?function\\s+Button\\b`),\n re(\"local Card\", String.raw`export\\s+(?:default\\s+)?function\\s+Card\\b`),\n re(\"local Sidebar\", String.raw`export\\s+(?:default\\s+)?function\\s+Sidebar\\b`),\n ]),\n requireAny(\"Keeps Askr-native route or state primitives in use.\", [\n re(\"registerRoutes\", String.raw`\\bregisterRoutes\\s*\\(`),\n re(\"createRouteRegistry\", String.raw`\\bcreateRouteRegistry\\s*\\(`),\n re(\"state()\", String.raw`\\bstate\\s*\\(`),\n re(\"resource()\", String.raw`\\bresource\\s*\\(`),\n ]),\n ],\n },\n];\n\nasync function pathExists(filePath: string): Promise<boolean> {\n return Boolean(await fs.stat(filePath).catch(() => null));\n}\n\nfunction shouldReadFile(filePath: string): boolean {\n return TEXT_FILE_EXTENSIONS.has(path.extname(filePath).toLowerCase());\n}\n\nasync function collectReviewFiles(targetPath: string, files: string[]): Promise<void> {\n const stat = await fs.lstat(targetPath);\n\n if (stat.isSymbolicLink()) {\n return;\n }\n\n if (stat.isDirectory()) {\n const entries = await fs.readdir(targetPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory() && IGNORED_DIRECTORIES.has(entry.name)) {\n continue;\n }\n\n await collectReviewFiles(path.join(targetPath, entry.name), files);\n }\n\n return;\n }\n\n if (stat.isFile() && shouldReadFile(targetPath)) {\n files.push(targetPath);\n }\n}\n\nasync function loadReviewFiles(\n targetPath: string,\n): Promise<{ files: ReviewFile[]; targetPath: string }> {\n const resolvedTarget = path.resolve(targetPath);\n if (!(await pathExists(resolvedTarget))) {\n throw new Error(`Review target not found: ${resolvedTarget}`);\n }\n\n const stat = await fs.stat(resolvedTarget);\n const baseDirectory = stat.isDirectory() ? resolvedTarget : path.dirname(resolvedTarget);\n const absoluteFiles: string[] = [];\n\n await collectReviewFiles(resolvedTarget, absoluteFiles);\n\n const files = await Promise.all(\n absoluteFiles.map(async (filePath) => ({\n path: path.relative(baseDirectory, filePath) || path.basename(filePath),\n content: await fs.readFile(filePath, \"utf8\"),\n })),\n );\n\n if (files.length === 0) {\n throw new Error(`No reviewable text files found under ${resolvedTarget}`);\n }\n\n return {\n files,\n targetPath: resolvedTarget,\n };\n}\n\nfunction getReviewPrompt(promptId: string): ReviewPromptDefinition | null {\n return REVIEW_PROMPTS.find((prompt) => prompt.id === promptId) ?? null;\n}\n\nfunction uniquePaths(paths: string[]): string[] {\n return [...new Set(paths)].sort();\n}\n\nfunction findPatternMatches(files: ReviewFile[], pattern: ReviewPattern): string[] {\n const matchedFiles: string[] = [];\n\n for (const file of files) {\n pattern.regex.lastIndex = 0;\n if (pattern.regex.test(file.content)) {\n matchedFiles.push(file.path);\n }\n }\n\n return matchedFiles;\n}\n\nfunction evaluateAssertion(assertion: ReviewAssertion, files: ReviewFile[]): ReviewAssertionResult {\n const patterns = assertion.patterns.map((pattern) => ({\n label: pattern.label,\n matches: findPatternMatches(files, pattern),\n }));\n\n if (assertion.mode === \"forbid\") {\n const offendingPatterns = patterns.filter((pattern) => pattern.matches.length > 0);\n\n return {\n description: assertion.description,\n passed: offendingPatterns.length === 0,\n matchedFiles: uniquePaths(offendingPatterns.flatMap((pattern) => pattern.matches)),\n matchedPatterns: offendingPatterns.map((pattern) => pattern.label),\n missingPatterns: [],\n mode: assertion.mode,\n };\n }\n\n const matchedPatterns = patterns.filter((pattern) => pattern.matches.length > 0);\n const passed =\n assertion.match === \"all\"\n ? matchedPatterns.length === patterns.length\n : matchedPatterns.length > 0;\n\n return {\n description: assertion.description,\n passed,\n matchedFiles: uniquePaths(matchedPatterns.flatMap((pattern) => pattern.matches)),\n matchedPatterns: matchedPatterns.map((pattern) => pattern.label),\n missingPatterns: patterns\n .filter((pattern) => pattern.matches.length === 0)\n .map((pattern) => pattern.label),\n mode: assertion.mode,\n };\n}\n\nexport function listSkillReviewPrompts(): Array<{\n id: string;\n prompt: string;\n title: string;\n relatedSkills: string[];\n}> {\n return REVIEW_PROMPTS.map(({ id, prompt, title, relatedSkills }) => ({\n id,\n prompt,\n title,\n relatedSkills,\n }));\n}\n\nexport async function runSkillReview(\n promptId: string,\n options: { cwd?: string } = {},\n): Promise<SkillReviewResult> {\n const prompt = getReviewPrompt(promptId);\n if (!prompt) {\n const error = new Error(`Unknown review prompt: ${promptId}`) as Error & { code?: string };\n error.code = \"UNKNOWN_REVIEW_PROMPT\";\n throw error;\n }\n\n const { files, targetPath } = await loadReviewFiles(options.cwd ?? process.cwd());\n const checks = prompt.assertions.map((assertion) => evaluateAssertion(assertion, files));\n const passedChecks = checks.filter((check) => check.passed).length;\n const totalChecks = checks.length;\n\n return {\n filesScanned: files.length,\n passedChecks,\n prompt: prompt.prompt,\n promptId: prompt.id,\n repairFocus: prompt.repairFocus,\n relatedSkills: prompt.relatedSkills,\n score: totalChecks === 0 ? 1 : passedChecks / totalChecks,\n status: passedChecks === totalChecks ? \"pass\" : \"fail\",\n targetPath,\n title: prompt.title,\n totalChecks,\n checks,\n };\n}\n\nexport function formatSkillReviewReport(result: SkillReviewResult): string {\n const lines = [\n `Skill review: ${result.promptId} - ${result.title}`,\n `Target: ${result.targetPath}`,\n `Files scanned: ${result.filesScanned}`,\n `Related skills: ${result.relatedSkills.join(\", \")}`,\n `Repair focus: ${result.repairFocus}`,\n `Score: ${result.passedChecks}/${result.totalChecks} checks passed (${Math.round(result.score * 100)}%)`,\n \"\",\n ];\n\n for (const check of result.checks) {\n lines.push(`${check.passed ? \"PASS\" : \"FAIL\"} ${check.description}`);\n\n if (check.mode === \"require\") {\n if (check.matchedPatterns.length > 0) {\n lines.push(` matched: ${check.matchedPatterns.join(\", \")}`);\n }\n\n if (check.missingPatterns.length > 0) {\n lines.push(` missing: ${check.missingPatterns.join(\", \")}`);\n }\n } else if (check.matchedPatterns.length > 0) {\n lines.push(` offending patterns: ${check.matchedPatterns.join(\", \")}`);\n }\n\n if (check.matchedFiles.length > 0) {\n lines.push(` files: ${check.matchedFiles.join(\", \")}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n","#!/usr/bin/env node\n\nimport fs from \"node:fs/promises\";\nimport type { Dirent } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { formatSkillReviewReport, listSkillReviewPrompts, runSkillReview } from \"./skill-review\";\nimport { isDirectExecution } from \"./is-direct-execution\";\n\ntype CliIo = Pick<Console, \"error\" | \"log\">;\n\ninterface ParsedArgs {\n cwd: string;\n force: boolean;\n help: boolean;\n json: boolean;\n command: string;\n positionals: string[];\n reviewPrompt: string;\n}\n\nconst MANAGED_PREFIX = \"askr-\";\nconst PROJECT_SKILLS_DIR = \"skills\";\n\nfunction helpText(): string {\n return [\n \"askr skills - Install Askr agent skills\",\n \"\",\n \"Usage:\",\n \" askr skills list\",\n \" askr skills review list\",\n \" askr skills review <prompt-id> [--cwd <dir>] [--json]\",\n \" askr skills install [--cwd <dir>] [--force]\",\n \" askr skills sync [--cwd <dir>] [--force]\",\n \"\",\n \"Commands:\",\n \" list Print bundled Askr skill names\",\n \" review Evaluate generated output against deterministic Askr prompt rubrics\",\n ` install Copy bundled skills into ${PROJECT_SKILLS_DIR}/; refuses non-empty targets unless --force`,\n ` sync Update bundled skills in ${PROJECT_SKILLS_DIR}/ and remove obsolete askr-* skill folders`,\n \"\",\n \"Options:\",\n ` --cwd <dir> Project directory to receive ${PROJECT_SKILLS_DIR}/ (default: current directory)`,\n ` --force Allow install to write into an existing non-empty ${PROJECT_SKILLS_DIR} directory`,\n \" --json Print review results as JSON\",\n \" --help Show this help message\",\n \"\",\n \"Examples:\",\n \" askr skills install\",\n \" askr skills review foundation --cwd ./candidate-app\",\n \" askr skills sync --cwd ./my-app\",\n ].join(\"\\n\");\n}\n\nfunction reviewHelpText(): string {\n return [\n \"askr skills review - Evaluate generated output against deterministic prompt rubrics\",\n \"\",\n \"Usage:\",\n \" askr skills review list\",\n \" askr skills review <prompt-id> [--cwd <dir>] [--json]\",\n \"\",\n \"Options:\",\n \" --cwd <dir> File or directory to review (default: current directory)\",\n \" --json Print machine-readable JSON output\",\n \" --help Show this help message\",\n \"\",\n \"Examples:\",\n \" askr skills review foundation --cwd ./candidate-app\",\n \" askr skills review reject-react-query --cwd ./scratch-output\",\n ].join(\"\\n\");\n}\n\nfunction parseArgs(args: string[]): ParsedArgs {\n const positional: string[] = [];\n const parsed = {\n cwd: process.cwd(),\n force: false,\n help: false,\n json: false,\n };\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n parsed.help = true;\n } else if (arg === \"--json\") {\n parsed.json = true;\n } else if (arg === \"--force\") {\n parsed.force = true;\n } else if (arg === \"--cwd\" && i + 1 < args.length) {\n parsed.cwd = args[i + 1];\n i += 1;\n } else {\n positional.push(arg);\n }\n }\n\n return {\n ...parsed,\n command: positional[0] || \"\",\n positionals: positional,\n reviewPrompt: positional[1] || \"\",\n };\n}\n\nfunction cliDir(): string {\n return path.dirname(fileURLToPath(import.meta.url));\n}\n\nasync function findBundledSkillsDir(): Promise<string> {\n const base = cliDir();\n const candidates = [\n path.resolve(base, \"..\", \"..\", \"skills\"),\n path.resolve(base, \"..\", \"skills\"),\n path.resolve(base, \"skills\"),\n ];\n\n for (const candidate of candidates) {\n if (await pathExists(candidate)) {\n return candidate;\n }\n }\n\n return candidates[0];\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n return Boolean(await fs.stat(filePath).catch(() => null));\n}\n\nasync function listBundledSkills(): Promise<string[]> {\n const source = await findBundledSkillsDir();\n const entries = await fs.readdir(source, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort();\n}\n\nasync function copyDir(src: string, dest: string): Promise<void> {\n const entries = await fs.readdir(src, { withFileTypes: true });\n await fs.mkdir(dest, { recursive: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n await copyDir(srcPath, destPath);\n continue;\n }\n\n await fs.copyFile(srcPath, destPath);\n }\n}\n\nasync function removeManagedSkillArtifacts(\n targetSkillsDir: string,\n bundledNames: string[],\n): Promise<void> {\n const entries = await fs\n .readdir(targetSkillsDir, { withFileTypes: true })\n .catch(() => [] as Dirent[]);\n const bundled = new Set(bundledNames);\n\n for (const entry of entries) {\n if (!entry.name.startsWith(MANAGED_PREFIX)) {\n continue;\n }\n\n const isBundledDirectory = entry.isDirectory() && bundled.has(entry.name);\n if (!isBundledDirectory) {\n await fs.rm(path.join(targetSkillsDir, entry.name), { recursive: true, force: true });\n }\n }\n}\n\nasync function copyBundledSkills(targetSkillsDir: string, bundledNames: string[]): Promise<void> {\n const source = await findBundledSkillsDir();\n await fs.mkdir(targetSkillsDir, { recursive: true });\n\n for (const name of bundledNames) {\n const src = path.join(source, name);\n const dest = path.join(targetSkillsDir, name);\n await fs.rm(dest, { recursive: true, force: true });\n await copyDir(src, dest);\n }\n}\n\nexport async function installBundledSkills(\n options: { cwd?: string; force?: boolean } = {},\n): Promise<{ bundledNames: string[]; targetSkillsDir: string }> {\n const targetRoot = path.resolve(options.cwd ?? process.cwd());\n const targetSkillsDir = path.join(targetRoot, PROJECT_SKILLS_DIR);\n const bundledNames = await listBundledSkills();\n const existingEntries = await fs.readdir(targetSkillsDir).catch(() => [] as string[]);\n\n if (existingEntries.length > 0 && !options.force) {\n throw new Error(`Refusing to install into non-empty ${targetSkillsDir}.`);\n }\n\n if (options.force) {\n await fs.mkdir(targetSkillsDir, { recursive: true });\n await removeManagedSkillArtifacts(targetSkillsDir, bundledNames);\n }\n\n await copyBundledSkills(targetSkillsDir, bundledNames);\n\n return {\n bundledNames,\n targetSkillsDir,\n };\n}\n\nexport async function syncBundledSkills(\n options: { cwd?: string } = {},\n): Promise<{ bundledNames: string[]; targetSkillsDir: string }> {\n const targetRoot = path.resolve(options.cwd ?? process.cwd());\n const targetSkillsDir = path.join(targetRoot, PROJECT_SKILLS_DIR);\n const bundledNames = await listBundledSkills();\n\n await fs.mkdir(targetSkillsDir, { recursive: true });\n await removeManagedSkillArtifacts(targetSkillsDir, bundledNames);\n await copyBundledSkills(targetSkillsDir, bundledNames);\n\n return {\n bundledNames,\n targetSkillsDir,\n };\n}\n\nasync function installSkills(parsed: ParsedArgs, io: CliIo): Promise<number> {\n try {\n const { bundledNames, targetSkillsDir } = await installBundledSkills({\n cwd: parsed.cwd,\n force: parsed.force,\n });\n io.log(`Installed ${bundledNames.length} Askr skills to ${targetSkillsDir}`);\n return 0;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n io.error(message);\n io.error(\"Run `askr skills sync` to update Askr skills, or pass --force.\");\n return 1;\n }\n}\n\nasync function syncSkills(parsed: ParsedArgs, io: CliIo): Promise<number> {\n const { bundledNames, targetSkillsDir } = await syncBundledSkills({ cwd: parsed.cwd });\n io.log(`Synced ${bundledNames.length} Askr skills to ${targetSkillsDir}`);\n return 0;\n}\n\nasync function reviewSkills(parsed: ParsedArgs, io: CliIo): Promise<number> {\n if (parsed.help && parsed.command === \"review\") {\n io.log(reviewHelpText());\n return 0;\n }\n\n if (!parsed.reviewPrompt) {\n io.log(reviewHelpText());\n return 0;\n }\n\n if (parsed.reviewPrompt === \"list\") {\n const prompts = listSkillReviewPrompts();\n for (const prompt of prompts) {\n io.log(`${prompt.id}\\t${prompt.title}`);\n }\n return 0;\n }\n\n try {\n const result = await runSkillReview(parsed.reviewPrompt, { cwd: parsed.cwd });\n io.log(parsed.json ? JSON.stringify(result, null, 2) : formatSkillReviewReport(result));\n return result.status === \"pass\" ? 0 : 1;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n io.error(message);\n const errorCode =\n typeof error === \"object\" && error && \"code\" in error\n ? String((error as { code?: string }).code)\n : \"\";\n if (errorCode === \"UNKNOWN_REVIEW_PROMPT\") {\n io.error(\"Run `askr skills review list` to see available prompt ids.\");\n }\n return 1;\n }\n}\n\nexport async function runSkillsCli(\n args: string[] = process.argv.slice(2),\n io: CliIo = console,\n): Promise<number> {\n const parsed = parseArgs(args);\n\n if (parsed.command === \"review\" && parsed.help) {\n io.log(reviewHelpText());\n return 0;\n }\n\n if (!parsed.command || parsed.help) {\n io.log(helpText());\n return 0;\n }\n\n const source = await findBundledSkillsDir();\n if (!(await pathExists(source))) {\n io.error(`Bundled skills directory not found: ${source}`);\n return 1;\n }\n\n if (parsed.command === \"list\") {\n const names = await listBundledSkills();\n for (const name of names) {\n io.log(name);\n }\n return 0;\n }\n\n if (parsed.command === \"install\") {\n return installSkills(parsed, io);\n }\n\n if (parsed.command === \"sync\") {\n return syncSkills(parsed, io);\n }\n\n if (parsed.command === \"review\") {\n return reviewSkills(parsed, io);\n }\n\n io.error(`Unknown skills command: ${parsed.command}`);\n io.error(\"Run `askr skills --help` to see available commands.\");\n return 1;\n}\n\nasync function main(): Promise<void> {\n const code = await runSkillsCli(process.argv.slice(2));\n process.exit(code);\n}\n\nif (isDirectExecution(import.meta.url)) {\n void main();\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"specification-DXnDOC-0.js","names":[],"sources":["../src/update/specification.ts"],"sourcesContent":["import semver from \"semver\";\n\nexport type DependencySpecification =\n | { type: \"alias\" | \"file\" | \"git\" | \"remote\" | \"unsupported\"; rawSpec: string }\n | { type: \"range\" | \"tag\" | \"version\"; rawSpec: string };\n\nconst WINDOWS_PATH = /^[A-Za-z]:[\\\\/]/;\nconst HOSTED_GIT = /^(?:bitbucket|gist|github|gitlab):/i;\nconst GIT_URL = /^(?:git(?:\\+[^:]+)?:|git@|ssh:)/i;\nconst GIT_SHORTHAND = /^[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+(?:#.*)?$/;\nconst REGISTRY_TAG = /^[A-Za-z][A-Za-z0-9._-]*$/;\nconst SCOPED_PATH = /^@[^/]+\\/[^/]+$/;\n\nexport function parseDependencySpecification(specification: string): DependencySpecification {\n const rawSpec = specification.trim();\n if (!rawSpec) return { type: \"unsupported\", rawSpec };\n if (/^npm:/i.test(rawSpec)) return { type: \"alias\", rawSpec };\n if (\n /^(?:file|link|workspace):/i.test(rawSpec) ||\n rawSpec.startsWith(\"./\") ||\n rawSpec.startsWith(\"../\") ||\n rawSpec.startsWith(\"/\") ||\n rawSpec.startsWith(\"~/\") ||\n /\\.(?:tar\\.gz|tgz)$/i.test(rawSpec) ||\n WINDOWS_PATH.test(rawSpec) ||\n /^[A-Za-z]:/.test(rawSpec) ||\n SCOPED_PATH.test(rawSpec)\n ) {\n return { type: \"file\", rawSpec };\n }\n if (HOSTED_GIT.test(rawSpec) || GIT_URL.test(rawSpec) || GIT_SHORTHAND.test(rawSpec)) {\n return { type: \"git\", rawSpec };\n }\n if (/^https?:/i.test(rawSpec) || /^[a-z][a-z0-9+.-]*:\\/\\//i.test(rawSpec)) {\n return { type: \"remote\", rawSpec };\n }\n if (semver.valid(rawSpec)) return { type: \"version\", rawSpec };\n if (semver.validRange(rawSpec)) return { type: \"range\", rawSpec };\n if (REGISTRY_TAG.test(rawSpec)) return { type: \"tag\", rawSpec };\n return { type: \"unsupported\", rawSpec };\n}\n"],"mappings":";;AAMA,MAAM,eAAe;AACrB,MAAM,aAAa;AACnB,MAAM,UAAU;AAChB,MAAM,gBAAgB;AACtB,MAAM,eAAe;AACrB,MAAM,cAAc;AAEpB,SAAgB,6BAA6B,eAAgD;CAC3F,MAAM,UAAU,cAAc,KAAK;CACnC,IAAI,CAAC,SAAS,OAAO;EAAE,MAAM;EAAe;CAAQ;CACpD,IAAI,SAAS,KAAK,OAAO,GAAG,OAAO;EAAE,MAAM;EAAS;CAAQ;CAC5D,IACE,6BAA6B,KAAK,OAAO,KACzC,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,KAAK,KACxB,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,IAAI,KACvB,sBAAsB,KAAK,OAAO,KAClC,aAAa,KAAK,OAAO,KACzB,aAAa,KAAK,OAAO,KACzB,YAAY,KAAK,OAAO,GAExB,OAAO;EAAE,MAAM;EAAQ;CAAQ;CAEjC,IAAI,WAAW,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO,KAAK,cAAc,KAAK,OAAO,GACjF,OAAO;EAAE,MAAM;EAAO;CAAQ;CAEhC,IAAI,YAAY,KAAK,OAAO,KAAK,2BAA2B,KAAK,OAAO,GACtE,OAAO;EAAE,MAAM;EAAU;CAAQ;CAEnC,IAAI,OAAO,MAAM,OAAO,GAAG,OAAO;EAAE,MAAM;EAAW;CAAQ;CAC7D,IAAI,OAAO,WAAW,OAAO,GAAG,OAAO;EAAE,MAAM;EAAS;CAAQ;CAChE,IAAI,aAAa,KAAK,OAAO,GAAG,OAAO;EAAE,MAAM;EAAO;CAAQ;CAC9D,OAAO;EAAE,MAAM;EAAe;CAAQ;AACxC"}
package/dist/ssg.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"ssg.js","names":[],"sources":["../src/bin/ssg.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { existsSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { register } from \"tsx/esm/api\";\nimport { isDirectExecution } from \"./is-direct-execution\";\n\ntype CliIo = Pick<Console, \"error\" | \"log\">;\n\ninterface ParsedSsgArgs {\n configPath: string;\n outputDir: string;\n workers: number | \"auto\";\n incremental: boolean;\n changedKeys: string[];\n changedRoutes: string[];\n forceFull: boolean;\n help: boolean;\n}\n\ninterface LoadedConfig {\n routes?: unknown[];\n registry?: unknown;\n seed?: unknown;\n dataOverrides?: unknown;\n concurrency?: number;\n document?: unknown;\n assets?: unknown[];\n}\n\ninterface RouteResult {\n path: string;\n status: string;\n error?: string;\n}\n\ninterface GenerateResult {\n mode: string;\n successful: number;\n totalRoutes: number;\n failed: number;\n rebuilt: number;\n skipped: number;\n removed: number;\n cacheHits: number;\n routes: RouteResult[];\n}\n\ninterface StaticGen {\n generate(options: ReturnType<typeof toGenerateOptions>): Promise<GenerateResult>;\n}\n\ninterface SsgDeps {\n cwd?: () => string;\n now?: () => number;\n existsSync?: typeof existsSync;\n importConfig?: (filePath: string) => Promise<unknown>;\n createStaticGen?: (options: {\n routes?: unknown[];\n registry?: unknown;\n outputDir: string;\n seed?: unknown;\n dataOverrides?: unknown;\n concurrency?: number;\n parallelism: number | \"auto\";\n document?: unknown;\n assets?: unknown[];\n }) => StaticGen;\n}\n\nconst helpText = `\naskr ssg - Static Site Generation for Askr\n\nUsage:\n askr ssg --config <path> --output <dir> [--incremental]\n\nOptions:\n --config <path> Path to SSG config file (TypeScript module)\n --output <dir> Output directory for generated HTML\n --workers <n|auto> Preferred render worker count for SSG throughput\n --incremental Use incremental generation if a manifest exists\n --changed-key <key> Mark an invalidation key as changed (repeatable)\n --changed-route <path> Mark a concrete route path as changed (repeatable)\n --force-full Force a full rebuild even with incremental flags\n --help Show this help message\n\nExamples:\n askr ssg --config ./ssg.config.ts --output ./dist/static\n askr ssg --config ./ssg.config.ts --output ./dist/static --incremental\n`;\n\nconst defaultDeps: Required<Pick<SsgDeps, \"cwd\" | \"existsSync\" | \"now\">> = {\n cwd: () => process.cwd(),\n now: () => Date.now(),\n existsSync,\n};\n\nasync function importProjectConfig(filePath: string): Promise<{\n module: unknown;\n unregister: () => Promise<void>;\n}> {\n const tsconfig = resolve(dirname(filePath), \"tsconfig.json\");\n const unregister = register(existsSync(tsconfig) ? { tsconfig } : undefined);\n\n try {\n return {\n module: await import(pathToFileURL(filePath).href),\n unregister,\n };\n } catch (error) {\n await unregister();\n throw error;\n }\n}\n\nasync function loadCreateStaticGen(): Promise<NonNullable<SsgDeps[\"createStaticGen\"]>> {\n const mod = (await import(\"@askrjs/askr/ssg\")) as {\n createStaticGen?: SsgDeps[\"createStaticGen\"];\n };\n if (typeof mod.createStaticGen !== \"function\") {\n throw new Error(\"Failed to load createStaticGen from @askrjs/askr/ssg\");\n }\n return mod.createStaticGen;\n}\n\nexport function parseCliArgs(args: string[]): ParsedSsgArgs {\n const parsed: ParsedSsgArgs = {\n configPath: \"\",\n outputDir: \"\",\n workers: 1,\n incremental: false,\n changedKeys: [],\n changedRoutes: [],\n forceFull: false,\n help: false,\n };\n\n for (let i = 0; i < args.length; i += 1) {\n if (args[i] === \"--config\" && i + 1 < args.length) {\n parsed.configPath = args[i + 1];\n i += 1;\n } else if (args[i] === \"--output\" && i + 1 < args.length) {\n parsed.outputDir = args[i + 1];\n i += 1;\n } else if (args[i] === \"--workers\" && i + 1 < args.length) {\n parsed.workers = args[i + 1] === \"auto\" ? \"auto\" : Number(args[i + 1]);\n i += 1;\n } else if (args[i] === \"--changed-key\" && i + 1 < args.length) {\n parsed.changedKeys.push(args[i + 1]);\n i += 1;\n } else if (args[i] === \"--changed-route\" && i + 1 < args.length) {\n parsed.changedRoutes.push(args[i + 1]);\n i += 1;\n } else if (args[i] === \"--incremental\") {\n parsed.incremental = true;\n } else if (args[i] === \"--force-full\") {\n parsed.forceFull = true;\n } else if (args[i] === \"--help\" || args[i] === \"-h\") {\n parsed.help = true;\n }\n }\n\n return parsed;\n}\n\nfunction toGenerateOptions(args: ParsedSsgArgs) {\n return {\n mode: args.incremental ? \"incremental\" : \"full\",\n changedKeys: args.changedKeys,\n changedRoutes: args.changedRoutes,\n forceFull: args.forceFull,\n };\n}\n\nfunction printSummary(\n io: CliIo,\n outputDir: string,\n durationSeconds: string,\n result: GenerateResult,\n): void {\n io.log(\"\");\n io.log(`Generation complete in ${durationSeconds}s`);\n io.log(` Mode: ${result.mode}`);\n io.log(` Generated: ${result.successful}/${result.totalRoutes} routes`);\n io.log(` Failed: ${result.failed} routes`);\n io.log(` Rebuilt: ${result.rebuilt} routes`);\n io.log(` Skipped: ${result.skipped} routes`);\n io.log(` Removed: ${result.removed} routes`);\n io.log(` CacheHit: ${result.cacheHits} routes`);\n io.log(` Output: ${outputDir}`);\n io.log(` Metadata: ${outputDir}/metadata.json`);\n io.log(\"\");\n}\n\nexport async function runSsgCli(\n args: string[] = process.argv.slice(2),\n deps: SsgDeps = {},\n io: CliIo = console,\n): Promise<number> {\n const parsed = parseCliArgs(args);\n if (parsed.help) {\n io.log(helpText);\n return 0;\n }\n\n if (!parsed.configPath) {\n io.error(\"Error: --config argument is required\");\n return 1;\n }\n\n if (!parsed.configPath.endsWith(\".ts\")) {\n io.error(\"Error: --config must point to a TypeScript file (.ts)\");\n return 1;\n }\n\n if (!parsed.outputDir) {\n io.error(\"Error: --output argument is required\");\n return 1;\n }\n\n const resolvedDeps = { ...defaultDeps, ...deps };\n const resolvedConfigPath = resolve(resolvedDeps.cwd(), parsed.configPath);\n const resolvedOutputDir = resolve(resolvedDeps.cwd(), parsed.outputDir);\n\n if (!resolvedDeps.existsSync(resolvedConfigPath)) {\n io.error(`Error: Config file not found: ${resolvedConfigPath}`);\n return 1;\n }\n\n let unregisterProjectLoader: (() => Promise<void>) | undefined;\n try {\n io.log(`Loading config: ${resolvedConfigPath}`);\n\n let imported: unknown;\n if (deps.importConfig) {\n imported = await deps.importConfig(resolvedConfigPath);\n } else {\n const loaded = await importProjectConfig(resolvedConfigPath);\n imported = loaded.module;\n unregisterProjectLoader = loaded.unregister;\n }\n const configModule = imported as {\n default?: LoadedConfig;\n staticConfig?: LoadedConfig;\n routes?: unknown[];\n registry?: unknown;\n seed?: unknown;\n dataOverrides?: unknown;\n concurrency?: number;\n document?: unknown;\n assets?: unknown[];\n };\n const candidate = configModule.default ?? configModule.staticConfig ?? configModule;\n const hasRoutes = Array.isArray(candidate.routes);\n const hasRegistry = candidate.registry !== undefined;\n\n if (hasRoutes === hasRegistry) {\n io.error(\"Error: Config must provide exactly one route source: routes or registry\");\n return 1;\n }\n const config = candidate as LoadedConfig;\n\n io.log(\n hasRoutes\n ? `Generating ${config.routes?.length ?? 0} routes...`\n : \"Generating registered routes...\",\n );\n\n const createStaticGen =\n typeof resolvedDeps.createStaticGen === \"function\"\n ? resolvedDeps.createStaticGen\n : await loadCreateStaticGen();\n\n const ssg = createStaticGen({\n ...(hasRoutes ? { routes: config.routes } : { registry: config.registry }),\n outputDir: resolvedOutputDir,\n seed: config.seed,\n dataOverrides: config.dataOverrides,\n concurrency: config.concurrency,\n parallelism: parsed.workers,\n document: config.document,\n assets: config.assets,\n });\n\n const startTime = resolvedDeps.now();\n const result = await ssg.generate(toGenerateOptions(parsed));\n const duration = ((resolvedDeps.now() - startTime) / 1000).toFixed(2);\n\n printSummary(io, resolvedOutputDir, duration, result);\n\n if (result.failed > 0) {\n io.log(\"Errors encountered:\");\n for (const route of result.routes) {\n if (route.status === \"error\") {\n io.log(` ${route.path}: ${route.error}`);\n }\n }\n io.log(\"\");\n return 1;\n }\n\n return 0;\n } catch (error) {\n io.error(\"Generation failed:\");\n io.error(error instanceof Error ? error.message : String(error));\n if (error instanceof Error && error.stack) {\n io.error(error.stack);\n }\n return 1;\n } finally {\n await unregisterProjectLoader?.();\n }\n}\n\nasync function main(): Promise<void> {\n const code = await runSsgCli(process.argv.slice(2));\n process.exit(code);\n}\n\nif (isDirectExecution(import.meta.url)) {\n void main();\n}\n"],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- declare module "virtual:askr-server" {
2
- import type { ServerApp } from "@askrjs/server";
3
- const app: ServerApp;
4
- export default app;
5
- }
@@ -1 +0,0 @@
1
- declare module '*.css';
@@ -1,5 +0,0 @@
1
- declare module '*.css' {
2
- const css: string;
3
-
4
- export default css;
5
- }
@@ -1,7 +0,0 @@
1
- declare module 'virtual:askr-server' {
2
- import type { ServerApp } from '@askrjs/server';
3
-
4
- const app: ServerApp;
5
- export { app };
6
- export default app;
7
- }
@@ -1,5 +0,0 @@
1
- declare module '*.css' {
2
- const css: string;
3
-
4
- export default css;
5
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.js","names":[],"sources":["../src/bin/update.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport path from \"node:path\";\nimport { isDirectExecution } from \"./is-direct-execution\";\nimport type { PackumentResults, RegistryRequirements } from \"../update/registry\";\nimport type {\n ManifestValueEdit,\n PackageDecision,\n PlannedOccurrence,\n UpdateSummary,\n WorkspaceManifest,\n} from \"../update/types\";\n\ntype CliIo = Pick<Console, \"error\" | \"log\">;\n\ninterface ParsedArgs {\n cwd: string;\n help: boolean;\n json: boolean;\n packagePatterns: string[];\n tag?: string;\n workspacePatterns: string[];\n errors: string[];\n}\n\ninterface UpdateRuntime {\n registry?: (\n root: string,\n packageNames: string[],\n requirements?: RegistryRequirements,\n ) => Promise<PackumentResults>;\n writer?: typeof import(\"../update/writer\").writeManifestEdits;\n}\n\ntype DependencyCommand = \"outdated\" | \"update\" | \"upgrade\";\n\nfunction helpText(command: DependencyCommand): string {\n const description =\n command === \"outdated\"\n ? \"List available dependency updates\"\n : command === \"update\"\n ? \"Apply safe dependency updates\"\n : \"Apply latest peer-compatible dependency upgrades\";\n return [\n `askr ${command} - ${description}`,\n \"\",\n \"Usage:\",\n ` askr ${command} [packages...] [options]`,\n \"\",\n \"Options:\",\n \" --cwd <dir> Resolve a project from another directory\",\n \" --workspace <glob> Select workspace names (repeatable)\",\n \" --tag <tag> Use one registry dist-tag for selected packages\",\n \" --json Emit one deterministic JSON object on stdout\",\n \" --help, -h Show this help message\",\n \"\",\n \"Notes:\",\n \" Package arguments are minimatch patterns and override persistent ignores.\",\n command === \"outdated\"\n ? \" This command reports only and never writes files.\"\n : \" The command changes package.json files only.\",\n \" Lockfiles, installs, and lifecycle scripts are never touched.\",\n ].join(\"\\n\");\n}\n\nfunction optionValue(\n args: string[],\n index: number,\n option: string,\n errors: string[],\n): string | null {\n if (index + 1 >= args.length || args[index + 1].startsWith(\"-\")) {\n errors.push(`Missing value for ${option}`);\n return null;\n }\n return args[index + 1];\n}\n\nfunction parseArgs(args: string[]): ParsedArgs {\n const parsed: ParsedArgs = {\n cwd: process.cwd(),\n help: false,\n json: false,\n packagePatterns: [],\n workspacePatterns: [],\n errors: [],\n };\n let positionalOnly = false;\n\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index];\n if (positionalOnly) {\n parsed.packagePatterns.push(argument);\n } else if (argument === \"--\") {\n positionalOnly = true;\n } else if (argument === \"--help\" || argument === \"-h\") {\n parsed.help = true;\n } else if (argument === \"--json\") {\n parsed.json = true;\n } else if (argument === \"--cwd\") {\n const value = optionValue(args, index, \"--cwd\", parsed.errors);\n if (value !== null) {\n parsed.cwd = path.resolve(value);\n index += 1;\n }\n } else if (argument.startsWith(\"--cwd=\")) {\n parsed.cwd = path.resolve(argument.slice(\"--cwd=\".length));\n } else if (argument === \"--workspace\") {\n const value = optionValue(args, index, \"--workspace\", parsed.errors);\n if (value !== null) {\n parsed.workspacePatterns.push(value);\n index += 1;\n }\n } else if (argument.startsWith(\"--workspace=\")) {\n parsed.workspacePatterns.push(argument.slice(\"--workspace=\".length));\n } else if (argument === \"--tag\") {\n const value = optionValue(args, index, \"--tag\", parsed.errors);\n if (value !== null) {\n parsed.tag = value;\n index += 1;\n }\n } else if (argument.startsWith(\"--tag=\")) {\n parsed.tag = argument.slice(\"--tag=\".length);\n } else if (argument.startsWith(\"-\")) {\n parsed.errors.push(`Unknown option: ${argument}`);\n } else {\n parsed.packagePatterns.push(argument);\n }\n }\n\n if (parsed.tag !== undefined && (!parsed.tag || /\\s/.test(parsed.tag))) {\n parsed.errors.push(\"--tag must be a non-empty dist-tag without whitespace\");\n }\n if (parsed.workspacePatterns.some((pattern) => !pattern)) {\n parsed.errors.push(\"--workspace patterns must not be empty\");\n }\n if (parsed.packagePatterns.some((pattern) => !pattern)) {\n parsed.errors.push(\"Package patterns must not be empty\");\n }\n return parsed;\n}\n\nfunction emptySummary(): UpdateSummary {\n return {\n packages: 0,\n occurrences: 0,\n changedOccurrences: 0,\n current: 0,\n safe: 0,\n breaking: 0,\n local: 0,\n manual: 0,\n error: 0,\n };\n}\n\nfunction serializableDecision(decision: PackageDecision): Record<string, unknown> {\n return {\n package: decision.package,\n selectedTag: decision.selectedTag,\n targetVersion: decision.targetVersion,\n status: decision.status,\n reason: decision.reason,\n occurrences: decision.occurrences.map((occurrence) => ({\n workspace: occurrence.workspace,\n manifest: occurrence.relativeManifestPath,\n section: occurrence.section,\n currentSpecification: occurrence.currentSpecification,\n proposedSpecification: occurrence.proposedSpecification,\n allowedVersion: occurrence.allowedVersion,\n status: occurrence.status,\n reason: occurrence.reason,\n })),\n };\n}\n\nfunction selectedWorkspaceJson(\n root: string,\n workspaces: WorkspaceManifest[],\n): Array<Record<string, unknown>> {\n return workspaces.map((workspace) => ({\n name: workspace.name,\n path: path.relative(root, workspace.directory).split(path.sep).join(\"/\") || \".\",\n manifest: workspace.relativeManifestPath,\n }));\n}\n\nfunction emitJson(\n io: CliIo,\n options: {\n root: string | null;\n workspaces: Array<Record<string, unknown>>;\n summary: UpdateSummary;\n decisions: PackageDecision[];\n applied: number;\n errors: string[];\n },\n): void {\n io.log(\n JSON.stringify(\n {\n root: options.root,\n workspaces: options.workspaces,\n summary: options.summary,\n decisions: options.decisions.map(serializableDecision),\n applied: { occurrences: options.applied },\n errors: options.errors,\n },\n null,\n 2,\n ),\n );\n}\n\nfunction rangeText(occurrence: PlannedOccurrence, command: DependencyCommand): string {\n if (occurrence.proposedSpecification) {\n return `${occurrence.currentSpecification} → ${occurrence.proposedSpecification}`;\n }\n if (occurrence.status === \"breaking\") {\n return command === \"upgrade\"\n ? `${occurrence.currentSpecification} (${occurrence.reason})`\n : `${occurrence.currentSpecification} (available via askr upgrade)`;\n }\n return `${occurrence.currentSpecification} (${occurrence.reason})`;\n}\n\nfunction renderTable(rows: string[][]): string[] {\n const headings = [\"Package\", \"Allowed\", \"Latest\", \"Status\", \"Range\"];\n const widths = headings.map((heading, column) =>\n Math.max(heading.length, ...rows.map((row) => row[column].length)),\n );\n return [headings, ...rows].map((row) =>\n row\n .map((value, column) => (column === row.length - 1 ? value : value.padEnd(widths[column])))\n .join(\" \"),\n );\n}\n\nfunction emitHuman(\n io: CliIo,\n decisions: PackageDecision[],\n summary: UpdateSummary,\n applied: number,\n command: DependencyCommand,\n): void {\n const byWorkspace = new Map<string, string[][]>();\n for (const decision of decisions) {\n for (const occurrence of decision.occurrences) {\n if (occurrence.status === \"current\") continue;\n const rows = byWorkspace.get(occurrence.workspace) ?? [];\n const row = [\n decision.package,\n occurrence.allowedVersion ?? \"-\",\n decision.targetVersion ?? \"-\",\n occurrence.status,\n rangeText(occurrence, command),\n ];\n if (!rows.some((existing) => existing.every((value, index) => value === row[index]))) {\n rows.push(row);\n }\n byWorkspace.set(occurrence.workspace, rows);\n }\n }\n\n if (byWorkspace.size === 0) {\n io.log(\"All selected dependencies are current.\");\n } else {\n let first = true;\n for (const [workspace, rows] of byWorkspace) {\n if (!first) io.log(\"\");\n first = false;\n io.log(workspace);\n for (const line of renderTable(rows)) io.log(line);\n }\n }\n\n const counts = ([\"safe\", \"breaking\", \"current\", \"manual\", \"local\", \"error\"] as const)\n .filter((status) => summary[status] > 0)\n .map((status) => `${summary[status]} ${status}`)\n .join(\", \");\n io.log(\"\");\n io.log(\n `Scanned ${summary.packages} package${summary.packages === 1 ? \"\" : \"s\"}${counts ? `: ${counts}` : \".\"}`,\n );\n if (command !== \"outdated\") {\n io.log(`Updated ${applied} manifest occurrence${applied === 1 ? \"\" : \"s\"}.`);\n }\n}\n\nfunction collectEdits(decisions: PackageDecision[]): ManifestValueEdit[] {\n return decisions.flatMap((decision) =>\n decision.occurrences.flatMap((occurrence) =>\n occurrence.proposedSpecification\n ? [\n {\n manifestPath: occurrence.manifestPath,\n section: occurrence.section,\n package: decision.package,\n currentSpecification: occurrence.currentSpecification,\n proposedSpecification: occurrence.proposedSpecification,\n },\n ]\n : [],\n ),\n );\n}\n\nasync function defaultRegistry(\n root: string,\n packageNames: string[],\n requirements?: RegistryRequirements,\n): Promise<PackumentResults> {\n const { fetchPackuments, loadNpmConfiguration } = await import(\"../update/registry\");\n const configuration = await loadNpmConfiguration(root);\n return fetchPackuments(packageNames, configuration, { requirements });\n}\n\nasync function runDependencyCli(\n command: DependencyCommand,\n args: string[],\n io: CliIo = console,\n runtime: UpdateRuntime = {},\n): Promise<number> {\n const parsed = parseArgs(args);\n if (parsed.help && parsed.errors.length === 0) {\n io.log(helpText(command));\n return 0;\n }\n if (parsed.errors.length > 0) {\n for (const error of parsed.errors) io.error(`askr ${command}: ${error}`);\n if (parsed.json) {\n emitJson(io, {\n root: null,\n workspaces: [],\n summary: emptySummary(),\n decisions: [],\n applied: 0,\n errors: parsed.errors,\n });\n }\n return 1;\n }\n\n let root: string | null = null;\n let selectedWorkspaces: WorkspaceManifest[] = [];\n try {\n const [{ discoverProject }, { planUpdates }] = await Promise.all([\n import(\"../update/discovery\"),\n import(\"../update/planner\"),\n ]);\n const project = await discoverProject({\n cwd: parsed.cwd,\n packagePatterns: parsed.packagePatterns,\n workspacePatterns: parsed.workspacePatterns,\n });\n root = project.root;\n selectedWorkspaces = project.selectedWorkspaces;\n\n const hasRegistryCandidate = project.occurrences.some(\n (occurrence) => occurrence.kind === \"fetch\",\n );\n const lookupNames = hasRegistryCandidate\n ? project.contextOccurrences\n .filter((occurrence) => occurrence.registryManaged)\n .map((occurrence) => occurrence.package)\n : [];\n const registry = runtime.registry ?? defaultRegistry;\n const specifications = new Map<string, string[]>();\n for (const occurrence of project.contextOccurrences) {\n const entries = specifications.get(occurrence.package) ?? [];\n if (!entries.includes(occurrence.currentSpecification)) {\n entries.push(occurrence.currentSpecification);\n }\n specifications.set(occurrence.package, entries);\n }\n const results =\n lookupNames.length > 0\n ? await registry(project.root, lookupNames, { specifications })\n : { packuments: new Map(), failures: new Map() };\n const plan = planUpdates({\n occurrences: project.occurrences,\n contextOccurrences: project.contextOccurrences,\n packuments: results.packuments,\n failures: results.failures,\n tags: project.policy.tags,\n cliTag: parsed.tag,\n force: command === \"upgrade\",\n });\n\n let applied = 0;\n const errors: string[] = [];\n if (!plan.hasErrors && command !== \"outdated\") {\n try {\n const writer = runtime.writer ?? (await import(\"../update/writer\")).writeManifestEdits;\n applied = await writer(collectEdits(plan.decisions));\n } catch {\n errors.push(\n \"Unable to replace package manifests; completed replacements were rolled back when possible.\",\n );\n }\n }\n if (plan.hasErrors) errors.push(\"One or more registry lookups or package plans failed.\");\n\n if (parsed.json) {\n emitJson(io, {\n root: project.root,\n workspaces: selectedWorkspaceJson(project.root, project.selectedWorkspaces),\n summary: plan.summary,\n decisions: plan.decisions,\n applied,\n errors,\n });\n } else {\n emitHuman(io, plan.decisions, plan.summary, applied, command);\n }\n for (const error of errors) io.error(`askr ${command}: ${error}`);\n return errors.length > 0 ? 1 : 0;\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Update failed.\";\n io.error(`askr ${command}: ${message}`);\n if (parsed.json) {\n emitJson(io, {\n root,\n workspaces: root ? selectedWorkspaceJson(root, selectedWorkspaces) : [],\n summary: emptySummary(),\n decisions: [],\n applied: 0,\n errors: [message],\n });\n }\n return 1;\n }\n}\n\nexport const runUpdateCli = (args: string[], io: CliIo = console, runtime: UpdateRuntime = {}) =>\n runDependencyCli(\"update\", args, io, runtime);\nexport const runUpgradeCli = (args: string[], io: CliIo = console, runtime: UpdateRuntime = {}) =>\n runDependencyCli(\"upgrade\", args, io, runtime);\nexport const runOutdatedCli = (args: string[], io: CliIo = console, runtime: UpdateRuntime = {}) =>\n runDependencyCli(\"outdated\", args, io, runtime);\n\nasync function main(): Promise<void> {\n process.exit(await runUpdateCli(process.argv.slice(2)));\n}\n\nif (isDirectExecution(import.meta.url)) void main();\n"],"mappings":";;;;AAoCA,SAAS,SAAS,SAAoC;CAOpD,OAAO;EACL,QAAQ,QAAQ,KANhB,YAAY,aACR,sCACA,YAAY,WACV,kCACA;EAGN;EACA;EACA,UAAU,QAAQ;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YAAY,aACR,wDACA;EACJ;CACF,CAAC,CAAC,KAAK,IAAI;AACb;AAEA,SAAS,YACP,MACA,OACA,QACA,QACe;CACf,IAAI,QAAQ,KAAK,KAAK,UAAU,KAAK,QAAQ,EAAE,CAAC,WAAW,GAAG,GAAG;EAC/D,OAAO,KAAK,qBAAqB,QAAQ;EACzC,OAAO;CACT;CACA,OAAO,KAAK,QAAQ;AACtB;AAEA,SAAS,UAAU,MAA4B;CAC7C,MAAM,SAAqB;EACzB,KAAK,QAAQ,IAAI;EACjB,MAAM;EACN,MAAM;EACN,iBAAiB,CAAC;EAClB,mBAAmB,CAAC;EACpB,QAAQ,CAAC;CACX;CACA,IAAI,iBAAiB;CAErB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,WAAW,KAAK;EACtB,IAAI,gBACF,OAAO,gBAAgB,KAAK,QAAQ;OAC/B,IAAI,aAAa,MACtB,iBAAiB;OACZ,IAAI,aAAa,YAAY,aAAa,MAC/C,OAAO,OAAO;OACT,IAAI,aAAa,UACtB,OAAO,OAAO;OACT,IAAI,aAAa,SAAS;GAC/B,MAAM,QAAQ,YAAY,MAAM,OAAO,SAAS,OAAO,MAAM;GAC7D,IAAI,UAAU,MAAM;IAClB,OAAO,MAAM,KAAK,QAAQ,KAAK;IAC/B,SAAS;GACX;EACF,OAAO,IAAI,SAAS,WAAW,QAAQ,GACrC,OAAO,MAAM,KAAK,QAAQ,SAAS,MAAM,CAAe,CAAC;OACpD,IAAI,aAAa,eAAe;GACrC,MAAM,QAAQ,YAAY,MAAM,OAAO,eAAe,OAAO,MAAM;GACnE,IAAI,UAAU,MAAM;IAClB,OAAO,kBAAkB,KAAK,KAAK;IACnC,SAAS;GACX;EACF,OAAO,IAAI,SAAS,WAAW,cAAc,GAC3C,OAAO,kBAAkB,KAAK,SAAS,MAAM,EAAqB,CAAC;OAC9D,IAAI,aAAa,SAAS;GAC/B,MAAM,QAAQ,YAAY,MAAM,OAAO,SAAS,OAAO,MAAM;GAC7D,IAAI,UAAU,MAAM;IAClB,OAAO,MAAM;IACb,SAAS;GACX;EACF,OAAO,IAAI,SAAS,WAAW,QAAQ,GACrC,OAAO,MAAM,SAAS,MAAM,CAAe;OACtC,IAAI,SAAS,WAAW,GAAG,GAChC,OAAO,OAAO,KAAK,mBAAmB,UAAU;OAEhD,OAAO,gBAAgB,KAAK,QAAQ;CAExC;CAEA,IAAI,OAAO,QAAQ,KAAA,MAAc,CAAC,OAAO,OAAO,KAAK,KAAK,OAAO,GAAG,IAClE,OAAO,OAAO,KAAK,uDAAuD;CAE5E,IAAI,OAAO,kBAAkB,MAAM,YAAY,CAAC,OAAO,GACrD,OAAO,OAAO,KAAK,wCAAwC;CAE7D,IAAI,OAAO,gBAAgB,MAAM,YAAY,CAAC,OAAO,GACnD,OAAO,OAAO,KAAK,oCAAoC;CAEzD,OAAO;AACT;AAEA,SAAS,eAA8B;CACrC,OAAO;EACL,UAAU;EACV,aAAa;EACb,oBAAoB;EACpB,SAAS;EACT,MAAM;EACN,UAAU;EACV,OAAO;EACP,QAAQ;EACR,OAAO;CACT;AACF;AAEA,SAAS,qBAAqB,UAAoD;CAChF,OAAO;EACL,SAAS,SAAS;EAClB,aAAa,SAAS;EACtB,eAAe,SAAS;EACxB,QAAQ,SAAS;EACjB,QAAQ,SAAS;EACjB,aAAa,SAAS,YAAY,KAAK,gBAAgB;GACrD,WAAW,WAAW;GACtB,UAAU,WAAW;GACrB,SAAS,WAAW;GACpB,sBAAsB,WAAW;GACjC,uBAAuB,WAAW;GAClC,gBAAgB,WAAW;GAC3B,QAAQ,WAAW;GACnB,QAAQ,WAAW;EACrB,EAAE;CACJ;AACF;AAEA,SAAS,sBACP,MACA,YACgC;CAChC,OAAO,WAAW,KAAK,eAAe;EACpC,MAAM,UAAU;EAChB,MAAM,KAAK,SAAS,MAAM,UAAU,SAAS,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK;EAC5E,UAAU,UAAU;CACtB,EAAE;AACJ;AAEA,SAAS,SACP,IACA,SAQM;CACN,GAAG,IACD,KAAK,UACH;EACE,MAAM,QAAQ;EACd,YAAY,QAAQ;EACpB,SAAS,QAAQ;EACjB,WAAW,QAAQ,UAAU,IAAI,oBAAoB;EACrD,SAAS,EAAE,aAAa,QAAQ,QAAQ;EACxC,QAAQ,QAAQ;CAClB,GACA,MACA,CACF,CACF;AACF;AAEA,SAAS,UAAU,YAA+B,SAAoC;CACpF,IAAI,WAAW,uBACb,OAAO,GAAG,WAAW,qBAAqB,KAAK,WAAW;CAE5D,IAAI,WAAW,WAAW,YACxB,OAAO,YAAY,YACf,GAAG,WAAW,qBAAqB,IAAI,WAAW,OAAO,KACzD,GAAG,WAAW,qBAAqB;CAEzC,OAAO,GAAG,WAAW,qBAAqB,IAAI,WAAW,OAAO;AAClE;AAEA,SAAS,YAAY,MAA4B;CAC/C,MAAM,WAAW;EAAC;EAAW;EAAW;EAAU;EAAU;CAAO;CACnE,MAAM,SAAS,SAAS,KAAK,SAAS,WACpC,KAAK,IAAI,QAAQ,QAAQ,GAAG,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CACnE;CACA,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,KAAK,QAC9B,IACG,KAAK,OAAO,WAAY,WAAW,IAAI,SAAS,IAAI,QAAQ,MAAM,OAAO,OAAO,OAAO,CAAE,CAAC,CAC1F,KAAK,IAAI,CACd;AACF;AAEA,SAAS,UACP,IACA,WACA,SACA,SACA,SACM;CACN,MAAM,8BAAc,IAAI,IAAwB;CAChD,KAAK,MAAM,YAAY,WACrB,KAAK,MAAM,cAAc,SAAS,aAAa;EAC7C,IAAI,WAAW,WAAW,WAAW;EACrC,MAAM,OAAO,YAAY,IAAI,WAAW,SAAS,KAAK,CAAC;EACvD,MAAM,MAAM;GACV,SAAS;GACT,WAAW,kBAAkB;GAC7B,SAAS,iBAAiB;GAC1B,WAAW;GACX,UAAU,YAAY,OAAO;EAC/B;EACA,IAAI,CAAC,KAAK,MAAM,aAAa,SAAS,OAAO,OAAO,UAAU,UAAU,IAAI,MAAM,CAAC,GACjF,KAAK,KAAK,GAAG;EAEf,YAAY,IAAI,WAAW,WAAW,IAAI;CAC5C;CAGF,IAAI,YAAY,SAAS,GACvB,GAAG,IAAI,wCAAwC;MAC1C;EACL,IAAI,QAAQ;EACZ,KAAK,MAAM,CAAC,WAAW,SAAS,aAAa;GAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE;GACrB,QAAQ;GACR,GAAG,IAAI,SAAS;GAChB,KAAK,MAAM,QAAQ,YAAY,IAAI,GAAG,GAAG,IAAI,IAAI;EACnD;CACF;CAEA,MAAM,SAAU;EAAC;EAAQ;EAAY;EAAW;EAAU;EAAS;CAAO,CAAC,CACxE,QAAQ,WAAW,QAAQ,UAAU,CAAC,CAAC,CACvC,KAAK,WAAW,GAAG,QAAQ,QAAQ,GAAG,QAAQ,CAAC,CAC/C,KAAK,IAAI;CACZ,GAAG,IAAI,EAAE;CACT,GAAG,IACD,WAAW,QAAQ,SAAS,UAAU,QAAQ,aAAa,IAAI,KAAK,MAAM,SAAS,KAAK,WAAW,KACrG;CACA,IAAI,YAAY,YACd,GAAG,IAAI,WAAW,QAAQ,sBAAsB,YAAY,IAAI,KAAK,IAAI,EAAE;AAE/E;AAEA,SAAS,aAAa,WAAmD;CACvE,OAAO,UAAU,SAAS,aACxB,SAAS,YAAY,SAAS,eAC5B,WAAW,wBACP,CACE;EACE,cAAc,WAAW;EACzB,SAAS,WAAW;EACpB,SAAS,SAAS;EAClB,sBAAsB,WAAW;EACjC,uBAAuB,WAAW;CACpC,CACF,IACA,CAAC,CACP,CACF;AACF;AAEA,eAAe,gBACb,MACA,cACA,cAC2B;CAC3B,MAAM,EAAE,iBAAiB,yBAAyB,MAAM,OAAO;CAE/D,OAAO,gBAAgB,cAAc,MADT,qBAAqB,IAAI,GACD,EAAE,aAAa,CAAC;AACtE;AAEA,eAAe,iBACb,SACA,MACA,KAAY,SACZ,UAAyB,CAAC,GACT;CACjB,MAAM,SAAS,UAAU,IAAI;CAC7B,IAAI,OAAO,QAAQ,OAAO,OAAO,WAAW,GAAG;EAC7C,GAAG,IAAI,SAAS,OAAO,CAAC;EACxB,OAAO;CACT;CACA,IAAI,OAAO,OAAO,SAAS,GAAG;EAC5B,KAAK,MAAM,SAAS,OAAO,QAAQ,GAAG,MAAM,QAAQ,QAAQ,IAAI,OAAO;EACvE,IAAI,OAAO,MACT,SAAS,IAAI;GACX,MAAM;GACN,YAAY,CAAC;GACb,SAAS,aAAa;GACtB,WAAW,CAAC;GACZ,SAAS;GACT,QAAQ,OAAO;EACjB,CAAC;EAEH,OAAO;CACT;CAEA,IAAI,OAAsB;CAC1B,IAAI,qBAA0C,CAAC;CAC/C,IAAI;EACF,MAAM,CAAC,EAAE,mBAAmB,EAAE,iBAAiB,MAAM,QAAQ,IAAI,CAC/D,OAAO,4BACP,OAAO,wBACT,CAAC;EACD,MAAM,UAAU,MAAM,gBAAgB;GACpC,KAAK,OAAO;GACZ,iBAAiB,OAAO;GACxB,mBAAmB,OAAO;EAC5B,CAAC;EACD,OAAO,QAAQ;EACf,qBAAqB,QAAQ;EAK7B,MAAM,cAHuB,QAAQ,YAAY,MAC9C,eAAe,WAAW,SAAS,OAEC,IACnC,QAAQ,mBACL,QAAQ,eAAe,WAAW,eAAe,CAAC,CAClD,KAAK,eAAe,WAAW,OAAO,IACzC,CAAC;EACL,MAAM,WAAW,QAAQ,YAAY;EACrC,MAAM,iCAAiB,IAAI,IAAsB;EACjD,KAAK,MAAM,cAAc,QAAQ,oBAAoB;GACnD,MAAM,UAAU,eAAe,IAAI,WAAW,OAAO,KAAK,CAAC;GAC3D,IAAI,CAAC,QAAQ,SAAS,WAAW,oBAAoB,GACnD,QAAQ,KAAK,WAAW,oBAAoB;GAE9C,eAAe,IAAI,WAAW,SAAS,OAAO;EAChD;EACA,MAAM,UACJ,YAAY,SAAS,IACjB,MAAM,SAAS,QAAQ,MAAM,aAAa,EAAE,eAAe,CAAC,IAC5D;GAAE,4BAAY,IAAI,IAAI;GAAG,0BAAU,IAAI,IAAI;EAAE;EACnD,MAAM,OAAO,YAAY;GACvB,aAAa,QAAQ;GACrB,oBAAoB,QAAQ;GAC5B,YAAY,QAAQ;GACpB,UAAU,QAAQ;GAClB,MAAM,QAAQ,OAAO;GACrB,QAAQ,OAAO;GACf,OAAO,YAAY;EACrB,CAAC;EAED,IAAI,UAAU;EACd,MAAM,SAAmB,CAAC;EAC1B,IAAI,CAAC,KAAK,aAAa,YAAY,YACjC,IAAI;GAEF,UAAU,OADK,QAAQ,WAAW,MAAM,OAAO,wBAAA,CAAqB,mBAAA,CAC7C,aAAa,KAAK,SAAS,CAAC;EACrD,QAAQ;GACN,OAAO,KACL,6FACF;EACF;EAEF,IAAI,KAAK,WAAW,OAAO,KAAK,uDAAuD;EAEvF,IAAI,OAAO,MACT,SAAS,IAAI;GACX,MAAM,QAAQ;GACd,YAAY,sBAAsB,QAAQ,MAAM,QAAQ,kBAAkB;GAC1E,SAAS,KAAK;GACd,WAAW,KAAK;GAChB;GACA;EACF,CAAC;OAED,UAAU,IAAI,KAAK,WAAW,KAAK,SAAS,SAAS,OAAO;EAE9D,KAAK,MAAM,SAAS,QAAQ,GAAG,MAAM,QAAQ,QAAQ,IAAI,OAAO;EAChE,OAAO,OAAO,SAAS,IAAI,IAAI;CACjC,SAAS,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;EACzD,GAAG,MAAM,QAAQ,QAAQ,IAAI,SAAS;EACtC,IAAI,OAAO,MACT,SAAS,IAAI;GACX;GACA,YAAY,OAAO,sBAAsB,MAAM,kBAAkB,IAAI,CAAC;GACtE,SAAS,aAAa;GACtB,WAAW,CAAC;GACZ,SAAS;GACT,QAAQ,CAAC,OAAO;EAClB,CAAC;EAEH,OAAO;CACT;AACF;AAEA,MAAa,gBAAgB,MAAgB,KAAY,SAAS,UAAyB,CAAC,MAC1F,iBAAiB,UAAU,MAAM,IAAI,OAAO;AAC9C,MAAa,iBAAiB,MAAgB,KAAY,SAAS,UAAyB,CAAC,MAC3F,iBAAiB,WAAW,MAAM,IAAI,OAAO;AAC/C,MAAa,kBAAkB,MAAgB,KAAY,SAAS,UAAyB,CAAC,MAC5F,iBAAiB,YAAY,MAAM,IAAI,OAAO;AAEhD,eAAe,OAAsB;CACnC,QAAQ,KAAK,MAAM,aAAa,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC;AACxD;AAEA,IAAI,kBAAkB,OAAO,KAAK,GAAG,GAAG,KAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"writer-D8qe_7ud.js","names":[],"sources":["../src/update/writer.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ManifestValueEdit } from \"./types\";\n\ninterface StagedManifest {\n manifestPath: string;\n original: Buffer;\n replacement: string;\n temporaryPath: string;\n mode: number;\n}\n\ninterface WriterOptions {\n replace?: (temporaryPath: string, manifestPath: string) => Promise<void>;\n}\n\nfunction groupEdits(edits: ManifestValueEdit[]): Map<string, ManifestValueEdit[]> {\n const grouped = new Map<string, ManifestValueEdit[]>();\n for (const edit of edits) {\n const entries = grouped.get(edit.manifestPath) ?? [];\n entries.push(edit);\n grouped.set(edit.manifestPath, entries);\n }\n for (const entries of grouped.values()) {\n entries.sort(\n (left, right) =>\n left.section.localeCompare(right.section) || left.package.localeCompare(right.package),\n );\n }\n return new Map([...grouped].sort(([left], [right]) => left.localeCompare(right)));\n}\n\ninterface JsonNode {\n end: number;\n kind: \"array\" | \"object\" | \"other\" | \"string\";\n properties?: Map<string, JsonNode>;\n start: number;\n value?: string;\n}\n\nclass JsonTreeParser {\n private index = 0;\n\n constructor(private readonly source: string) {\n if (source.charCodeAt(0) === 0xfeff) this.index = 1;\n }\n\n parse(): JsonNode {\n const node = this.parseValue();\n this.skipWhitespace();\n if (this.index !== this.source.length) throw new Error(\"Unexpected content after JSON value\");\n return node;\n }\n\n private skipWhitespace(): void {\n while (/[ \\t\\r\\n]/.test(this.source[this.index] ?? \"\")) this.index += 1;\n }\n\n private parseValue(): JsonNode {\n this.skipWhitespace();\n const token = this.source[this.index];\n if (token === \"{\") return this.parseObject();\n if (token === \"[\") return this.parseArray();\n if (token === '\"') return this.parseString();\n return this.parsePrimitive();\n }\n\n private parseString(): JsonNode {\n const start = this.index;\n this.index += 1;\n while (this.index < this.source.length) {\n const token = this.source[this.index];\n if (token === \"\\\\\") {\n this.index += 2;\n continue;\n }\n this.index += 1;\n if (token === '\"') {\n const raw = this.source.slice(start, this.index);\n const value = JSON.parse(raw) as unknown;\n if (typeof value !== \"string\") throw new Error(\"Invalid JSON string\");\n return { end: this.index, kind: \"string\", start, value };\n }\n }\n throw new Error(\"Unterminated JSON string\");\n }\n\n private parseObject(): JsonNode {\n const start = this.index;\n const properties = new Map<string, JsonNode>();\n this.index += 1;\n this.skipWhitespace();\n if (this.source[this.index] === \"}\") {\n this.index += 1;\n return { end: this.index, kind: \"object\", properties, start };\n }\n\n while (this.index < this.source.length) {\n this.skipWhitespace();\n if (this.source[this.index] !== '\"') throw new Error(\"Expected a JSON object key\");\n const key = this.parseString().value!;\n this.skipWhitespace();\n if (this.source[this.index] !== \":\") throw new Error(\"Expected ':' after JSON object key\");\n this.index += 1;\n properties.set(key, this.parseValue());\n this.skipWhitespace();\n if (this.source[this.index] === \"}\") {\n this.index += 1;\n return { end: this.index, kind: \"object\", properties, start };\n }\n if (this.source[this.index] !== \",\") throw new Error(\"Expected ',' in JSON object\");\n this.index += 1;\n }\n throw new Error(\"Unterminated JSON object\");\n }\n\n private parseArray(): JsonNode {\n const start = this.index;\n this.index += 1;\n this.skipWhitespace();\n if (this.source[this.index] === \"]\") {\n this.index += 1;\n return { end: this.index, kind: \"array\", start };\n }\n\n while (this.index < this.source.length) {\n this.parseValue();\n this.skipWhitespace();\n if (this.source[this.index] === \"]\") {\n this.index += 1;\n return { end: this.index, kind: \"array\", start };\n }\n if (this.source[this.index] !== \",\") throw new Error(\"Expected ',' in JSON array\");\n this.index += 1;\n }\n throw new Error(\"Unterminated JSON array\");\n }\n\n private parsePrimitive(): JsonNode {\n const start = this.index;\n while (this.index < this.source.length && !/[ \\t\\r\\n,\\]}]/.test(this.source[this.index])) {\n this.index += 1;\n }\n if (start === this.index) throw new Error(\"Expected a JSON value\");\n JSON.parse(this.source.slice(start, this.index));\n return { end: this.index, kind: \"other\", start };\n }\n}\n\nfunction renderReplacement(source: string, edits: ManifestValueEdit[]): string {\n let manifest: JsonNode;\n try {\n manifest = new JsonTreeParser(source).parse();\n } catch {\n throw new Error(\"Manifest changed to invalid JSON before writing.\");\n }\n if (manifest.kind !== \"object\")\n throw new Error(\"Manifest changed to invalid JSON before writing.\");\n\n const replacements: Array<{ start: number; end: number; value: string }> = [];\n const seen = new Set<string>();\n for (const edit of edits) {\n const key = `${edit.section}\\u0000${edit.package}`;\n if (seen.has(key)) throw new Error(`Duplicate manifest edit: ${edit.manifestPath}`);\n seen.add(key);\n const dependencies = manifest.properties?.get(edit.section);\n const current = dependencies?.properties?.get(edit.package);\n if (current?.kind !== \"string\" || current.value !== edit.currentSpecification) {\n throw new Error(`Manifest changed before writing: ${edit.manifestPath}`);\n }\n replacements.push({\n start: current.start,\n end: current.end,\n value: JSON.stringify(edit.proposedSpecification),\n });\n }\n\n let result = source;\n replacements.sort((left, right) => right.start - left.start);\n for (const replacement of replacements) {\n result = `${result.slice(0, replacement.start)}${replacement.value}${result.slice(replacement.end)}`;\n }\n return result;\n}\n\nasync function cleanup(paths: string[]): Promise<void> {\n await Promise.all(\n paths.map((filePath) => fs.rm(filePath, { force: true }).catch(() => undefined)),\n );\n}\n\nasync function rollback(replaced: StagedManifest[]): Promise<boolean> {\n let complete = true;\n for (const staged of [...replaced].reverse()) {\n const rollbackPath = path.join(\n path.dirname(staged.manifestPath),\n `.${path.basename(staged.manifestPath)}.askr-rollback-${randomUUID()}`,\n );\n try {\n await fs.writeFile(rollbackPath, staged.original, { flag: \"wx\", mode: staged.mode });\n await fs.rename(rollbackPath, staged.manifestPath);\n } catch {\n complete = false;\n await fs.rm(rollbackPath, { force: true }).catch(() => undefined);\n }\n }\n return complete;\n}\n\nexport async function writeManifestEdits(\n edits: ManifestValueEdit[],\n options: WriterOptions = {},\n): Promise<number> {\n if (edits.length === 0) return 0;\n const staged: StagedManifest[] = [];\n const replace = options.replace ?? fs.rename;\n\n try {\n for (const [manifestPath, manifestEdits] of groupEdits(edits)) {\n const [original, stat] = await Promise.all([\n fs.readFile(manifestPath),\n fs.stat(manifestPath),\n ]);\n const replacement = renderReplacement(original.toString(\"utf8\"), manifestEdits);\n const temporaryPath = path.join(\n path.dirname(manifestPath),\n `.${path.basename(manifestPath)}.askr-update-${randomUUID()}`,\n );\n await fs.writeFile(temporaryPath, replacement, { flag: \"wx\", mode: stat.mode });\n staged.push({ manifestPath, original, replacement, temporaryPath, mode: stat.mode });\n }\n } catch (error) {\n await cleanup(staged.map((entry) => entry.temporaryPath));\n throw error;\n }\n\n const replaced: StagedManifest[] = [];\n try {\n for (const manifest of staged) {\n await replace(manifest.temporaryPath, manifest.manifestPath);\n replaced.push(manifest);\n }\n } catch {\n const rollbackComplete = await rollback(replaced);\n await cleanup(staged.map((entry) => entry.temporaryPath));\n throw new Error(\n rollbackComplete\n ? \"Manifest replacement failed; completed replacements were rolled back.\"\n : \"Manifest replacement failed and rollback was incomplete.\",\n );\n }\n\n return edits.length;\n}\n"],"mappings":"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"}