@askrjs/cli 0.0.2

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 (460) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +140 -0
  3. package/dist/add-DqhqRzBQ.js +555 -0
  4. package/dist/add-DqhqRzBQ.js.map +1 -0
  5. package/dist/add.js +3 -0
  6. package/dist/cli.js +91 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/create.js +923 -0
  9. package/dist/create.js.map +1 -0
  10. package/dist/is-direct-execution-Cdlr-ZUl.js +20 -0
  11. package/dist/is-direct-execution-Cdlr-ZUl.js.map +1 -0
  12. package/dist/openapi.js +127 -0
  13. package/dist/openapi.js.map +1 -0
  14. package/dist/skills/askr-accessibility/SKILL.md +68 -0
  15. package/dist/skills/askr-accessibility/agents/openai.yaml +4 -0
  16. package/dist/skills/askr-agent-execution/SKILL.md +85 -0
  17. package/dist/skills/askr-agent-execution/agents/openai.yaml +4 -0
  18. package/dist/skills/askr-agent-workflows/SKILL.md +57 -0
  19. package/dist/skills/askr-agent-workflows/agents/openai.yaml +4 -0
  20. package/dist/skills/askr-api-integration/SKILL.md +79 -0
  21. package/dist/skills/askr-api-integration/agents/openai.yaml +4 -0
  22. package/dist/skills/askr-app-builder/SKILL.md +99 -0
  23. package/dist/skills/askr-app-builder/agents/openai.yaml +4 -0
  24. package/dist/skills/askr-auth-access/SKILL.md +74 -0
  25. package/dist/skills/askr-auth-access/agents/openai.yaml +4 -0
  26. package/dist/skills/askr-cli-vite/SKILL.md +76 -0
  27. package/dist/skills/askr-cli-vite/agents/openai.yaml +4 -0
  28. package/dist/skills/askr-dashboard-charts/SKILL.md +82 -0
  29. package/dist/skills/askr-dashboard-charts/agents/openai.yaml +4 -0
  30. package/dist/skills/askr-design-system/SKILL.md +86 -0
  31. package/dist/skills/askr-design-system/agents/openai.yaml +4 -0
  32. package/dist/skills/askr-env-config/SKILL.md +74 -0
  33. package/dist/skills/askr-env-config/agents/openai.yaml +4 -0
  34. package/dist/skills/askr-error-loading-empty/SKILL.md +89 -0
  35. package/dist/skills/askr-error-loading-empty/agents/openai.yaml +4 -0
  36. package/dist/skills/askr-file-upload-artifacts/SKILL.md +77 -0
  37. package/dist/skills/askr-file-upload-artifacts/agents/openai.yaml +4 -0
  38. package/dist/skills/askr-forms-tables-crud/SKILL.md +98 -0
  39. package/dist/skills/askr-forms-tables-crud/agents/openai.yaml +4 -0
  40. package/dist/skills/askr-mental-model/SKILL.md +109 -0
  41. package/dist/skills/askr-mental-model/agents/openai.yaml +4 -0
  42. package/dist/skills/askr-migration-react/SKILL.md +81 -0
  43. package/dist/skills/askr-migration-react/agents/openai.yaml +4 -0
  44. package/dist/skills/askr-observability-debugging/SKILL.md +83 -0
  45. package/dist/skills/askr-observability-debugging/agents/openai.yaml +4 -0
  46. package/dist/skills/askr-project-structure/SKILL.md +79 -0
  47. package/dist/skills/askr-project-structure/agents/openai.yaml +4 -0
  48. package/dist/skills/askr-query-mutation/SKILL.md +115 -0
  49. package/dist/skills/askr-query-mutation/agents/openai.yaml +4 -0
  50. package/dist/skills/askr-realtime-streaming/SKILL.md +76 -0
  51. package/dist/skills/askr-realtime-streaming/agents/openai.yaml +4 -0
  52. package/dist/skills/askr-resources-data/SKILL.md +100 -0
  53. package/dist/skills/askr-resources-data/agents/openai.yaml +4 -0
  54. package/dist/skills/askr-routing-layouts/SKILL.md +107 -0
  55. package/dist/skills/askr-routing-layouts/agents/openai.yaml +4 -0
  56. package/dist/skills/askr-runtime-reactivity/SKILL.md +92 -0
  57. package/dist/skills/askr-runtime-reactivity/agents/openai.yaml +4 -0
  58. package/dist/skills/askr-ssr-ssg/SKILL.md +76 -0
  59. package/dist/skills/askr-ssr-ssg/agents/openai.yaml +4 -0
  60. package/dist/skills/askr-testing-determinism/SKILL.md +75 -0
  61. package/dist/skills/askr-testing-determinism/agents/openai.yaml +4 -0
  62. package/dist/skills/askr-theming/SKILL.md +86 -0
  63. package/dist/skills/askr-theming/agents/openai.yaml +4 -0
  64. package/dist/skills/askr-ui-composition/SKILL.md +92 -0
  65. package/dist/skills/askr-ui-composition/agents/openai.yaml +4 -0
  66. package/dist/skills-Bh0mEhIx.js +682 -0
  67. package/dist/skills-Bh0mEhIx.js.map +1 -0
  68. package/dist/skills.js +3 -0
  69. package/dist/ssg.js +188 -0
  70. package/dist/ssg.js.map +1 -0
  71. package/dist/templates/full-stack/AGENTS.md +12 -0
  72. package/dist/templates/full-stack/README.md +18 -0
  73. package/dist/templates/full-stack/gitignore.template +4 -0
  74. package/dist/templates/full-stack/index.html +14 -0
  75. package/dist/templates/full-stack/package.json +37 -0
  76. package/dist/templates/full-stack/server.ts +13 -0
  77. package/dist/templates/full-stack/src/action-authorizations.ts +10 -0
  78. package/dist/templates/full-stack/src/actions/create-message.ts +10 -0
  79. package/dist/templates/full-stack/src/i18n.ts +8 -0
  80. package/dist/templates/full-stack/src/main.tsx +12 -0
  81. package/dist/templates/full-stack/src/pages/home.tsx +25 -0
  82. package/dist/templates/full-stack/src/pages/layout.tsx +33 -0
  83. package/dist/templates/full-stack/src/pages/not-found.tsx +4 -0
  84. package/dist/templates/full-stack/src/routes.tsx +20 -0
  85. package/dist/templates/full-stack/src/schemas.ts +11 -0
  86. package/dist/templates/full-stack/src/server/action-registry.ts +12 -0
  87. package/dist/templates/full-stack/src/server/actions/create-message.ts +14 -0
  88. package/dist/templates/full-stack/src/server/app.ts +66 -0
  89. package/dist/templates/full-stack/src/server/dependencies.ts +55 -0
  90. package/dist/templates/full-stack/src/server/entry-server.ts +8 -0
  91. package/dist/templates/full-stack/src/telemetry.ts +4 -0
  92. package/dist/templates/full-stack/src/vite-server.d.ts +6 -0
  93. package/dist/templates/full-stack/tests/actions/create-message.test.ts +13 -0
  94. package/dist/templates/full-stack/tsconfig.json +16 -0
  95. package/dist/templates/full-stack/vite.config.ts +11 -0
  96. package/dist/templates/spa/AGENTS.md +60 -0
  97. package/dist/templates/spa/README.md +96 -0
  98. package/dist/templates/spa/gitignore.template +16 -0
  99. package/dist/templates/spa/index.html +13 -0
  100. package/dist/templates/spa/package.json +35 -0
  101. package/dist/templates/spa/src/adapters/operations-client.ts +90 -0
  102. package/dist/templates/spa/src/components/shared/metric-card.tsx +27 -0
  103. package/dist/templates/spa/src/components/shared/status-badge.tsx +24 -0
  104. package/dist/templates/spa/src/features/operations/operations.query.ts +9 -0
  105. package/dist/templates/spa/src/main.tsx +10 -0
  106. package/dist/templates/spa/src/pages/_layout.tsx +9 -0
  107. package/dist/templates/spa/src/pages/_routes.tsx +27 -0
  108. package/dist/templates/spa/src/pages/app/_layout.tsx +94 -0
  109. package/dist/templates/spa/src/pages/app/_routes.tsx +10 -0
  110. package/dist/templates/spa/src/pages/app/admin-home.tsx +152 -0
  111. package/dist/templates/spa/src/pages/app/agent-runs.tsx +93 -0
  112. package/dist/templates/spa/src/pages/app/settings.tsx +91 -0
  113. package/dist/templates/spa/src/pages/auth/_layout.tsx +38 -0
  114. package/dist/templates/spa/src/pages/auth/_routes.tsx +6 -0
  115. package/dist/templates/spa/src/pages/auth/login.tsx +63 -0
  116. package/dist/templates/spa/src/pages/not-found.tsx +22 -0
  117. package/dist/templates/spa/src/pages/public/_layout.tsx +47 -0
  118. package/dist/templates/spa/src/pages/public/_routes.tsx +6 -0
  119. package/dist/templates/spa/src/pages/public/home.tsx +143 -0
  120. package/dist/templates/spa/src/shared/format.ts +12 -0
  121. package/dist/templates/spa/src/shared/navigation.ts +15 -0
  122. package/dist/templates/spa/src/styles/components.css +49 -0
  123. package/dist/templates/spa/src/styles/layout.css +192 -0
  124. package/dist/templates/spa/src/styles/reset.css +44 -0
  125. package/dist/templates/spa/src/styles/theme.css +57 -0
  126. package/dist/templates/spa/src/styles/tokens.css +20 -0
  127. package/dist/templates/spa/src/styles.css +7 -0
  128. package/dist/templates/spa/src/styles.d.ts +1 -0
  129. package/dist/templates/spa/tests/app.test.tsx +37 -0
  130. package/dist/templates/spa/tests/components/shared.test.tsx +12 -0
  131. package/dist/templates/spa/tests/resources.test.ts +22 -0
  132. package/dist/templates/spa/tsconfig.json +20 -0
  133. package/dist/templates/spa/tsconfig.node.json +10 -0
  134. package/dist/templates/spa/vite.config.ts +24 -0
  135. package/dist/templates/spa/vitest.config.ts +17 -0
  136. package/dist/templates/ssg/AGENTS.md +55 -0
  137. package/dist/templates/ssg/README.md +39 -0
  138. package/dist/templates/ssg/gitignore.template +17 -0
  139. package/dist/templates/ssg/index.html +13 -0
  140. package/dist/templates/ssg/package.json +35 -0
  141. package/dist/templates/ssg/src/app.tsx +14 -0
  142. package/dist/templates/ssg/src/components/badge.tsx +3 -0
  143. package/dist/templates/ssg/src/components/counter.tsx +30 -0
  144. package/dist/templates/ssg/src/components/site-shell.tsx +111 -0
  145. package/dist/templates/ssg/src/jsx.d.ts +23 -0
  146. package/dist/templates/ssg/src/main.tsx +8 -0
  147. package/dist/templates/ssg/src/pages/about.tsx +82 -0
  148. package/dist/templates/ssg/src/pages/content.tsx +63 -0
  149. package/dist/templates/ssg/src/pages/example.tsx +97 -0
  150. package/dist/templates/ssg/src/pages/home.tsx +51 -0
  151. package/dist/templates/ssg/src/resources/user.ts +15 -0
  152. package/dist/templates/ssg/src/routes.tsx +15 -0
  153. package/dist/templates/ssg/src/styles.css +89 -0
  154. package/dist/templates/ssg/src/vite-env.d.ts +5 -0
  155. package/dist/templates/ssg/ssg.config.ts +34 -0
  156. package/dist/templates/ssg/tests/app.test.tsx +19 -0
  157. package/dist/templates/ssg/tests/components/counter.test.tsx +18 -0
  158. package/dist/templates/ssg/tests/resources.test.ts +11 -0
  159. package/dist/templates/ssg/tests/ssg-config.test.ts +11 -0
  160. package/dist/templates/ssg/tsconfig.json +20 -0
  161. package/dist/templates/ssg/tsconfig.node.json +10 -0
  162. package/dist/templates/ssg/vite.config.ts +24 -0
  163. package/dist/templates/ssg/vitest.config.ts +17 -0
  164. package/dist/templates/ssr/AGENTS.md +28 -0
  165. package/dist/templates/ssr/README.md +38 -0
  166. package/dist/templates/ssr/gitignore.template +16 -0
  167. package/dist/templates/ssr/index.html +13 -0
  168. package/dist/templates/ssr/package.json +34 -0
  169. package/dist/templates/ssr/server.ts +16 -0
  170. package/dist/templates/ssr/src/app.tsx +21 -0
  171. package/dist/templates/ssr/src/components/counter.tsx +26 -0
  172. package/dist/templates/ssr/src/entry-server.tsx +10 -0
  173. package/dist/templates/ssr/src/main.tsx +11 -0
  174. package/dist/templates/ssr/src/pages/about.tsx +75 -0
  175. package/dist/templates/ssr/src/pages/example.tsx +113 -0
  176. package/dist/templates/ssr/src/pages/home.tsx +56 -0
  177. package/dist/templates/ssr/src/resources/user.ts +15 -0
  178. package/dist/templates/ssr/src/routes.tsx +13 -0
  179. package/dist/templates/ssr/src/styles.css +148 -0
  180. package/dist/templates/ssr/src/vite-server.d.ts +7 -0
  181. package/dist/templates/ssr/tests/app.test.tsx +24 -0
  182. package/dist/templates/ssr/tests/components/counter.test.tsx +13 -0
  183. package/dist/templates/ssr/tests/resources.test.ts +11 -0
  184. package/dist/templates/ssr/tsconfig.json +22 -0
  185. package/dist/templates/ssr/tsconfig.node.json +10 -0
  186. package/dist/templates/ssr/tsconfig.server.json +15 -0
  187. package/dist/templates/ssr/vite.config.ts +25 -0
  188. package/dist/templates/ssr/vitest.config.ts +13 -0
  189. package/dist/templates/startkit/AGENTS.md +77 -0
  190. package/dist/templates/startkit/README.md +192 -0
  191. package/dist/templates/startkit/gitignore.template +16 -0
  192. package/dist/templates/startkit/index.html +13 -0
  193. package/dist/templates/startkit/package.json +35 -0
  194. package/dist/templates/startkit/src/components/app-header.tsx +93 -0
  195. package/dist/templates/startkit/src/components/app-sidebar.tsx +95 -0
  196. package/dist/templates/startkit/src/components/data-table.tsx +80 -0
  197. package/dist/templates/startkit/src/components/empty-state.tsx +13 -0
  198. package/dist/templates/startkit/src/components/page-header.tsx +23 -0
  199. package/dist/templates/startkit/src/components/stat-card.tsx +24 -0
  200. package/dist/templates/startkit/src/features/accounts/account-filters.tsx +61 -0
  201. package/dist/templates/startkit/src/features/accounts/account-table.tsx +79 -0
  202. package/dist/templates/startkit/src/lib/format.ts +31 -0
  203. package/dist/templates/startkit/src/lib/mock-data.ts +441 -0
  204. package/dist/templates/startkit/src/lib/routes.ts +116 -0
  205. package/dist/templates/startkit/src/main.tsx +12 -0
  206. package/dist/templates/startkit/src/pages/_layout.tsx +56 -0
  207. package/dist/templates/startkit/src/pages/auth/_layout.tsx +7 -0
  208. package/dist/templates/startkit/src/pages/auth/login.tsx +129 -0
  209. package/dist/templates/startkit/src/pages/home.tsx +83 -0
  210. package/dist/templates/startkit/src/pages/not-found.tsx +24 -0
  211. package/dist/templates/startkit/src/pages/workspace/_layout.tsx +17 -0
  212. package/dist/templates/startkit/src/pages/workspace/accounts/index.tsx +217 -0
  213. package/dist/templates/startkit/src/pages/workspace/dashboard.tsx +118 -0
  214. package/dist/templates/startkit/src/pages/workspace/settings.tsx +218 -0
  215. package/dist/templates/startkit/src/router.tsx +7 -0
  216. package/dist/templates/startkit/src/routes/auth-config.ts +38 -0
  217. package/dist/templates/startkit/src/routes/auth.ts +8 -0
  218. package/dist/templates/startkit/src/routes/index.ts +28 -0
  219. package/dist/templates/startkit/src/routes/public.ts +8 -0
  220. package/dist/templates/startkit/src/routes/workspace/accounts.ts +8 -0
  221. package/dist/templates/startkit/src/routes/workspace/index.ts +14 -0
  222. package/dist/templates/startkit/src/styles/components.css +396 -0
  223. package/dist/templates/startkit/src/styles/layout.css +192 -0
  224. package/dist/templates/startkit/src/styles/reset.css +38 -0
  225. package/dist/templates/startkit/src/styles/theme.css +76 -0
  226. package/dist/templates/startkit/src/styles/tokens.css +67 -0
  227. package/dist/templates/startkit/src/styles.css +7 -0
  228. package/dist/templates/startkit/src/toast.ts +55 -0
  229. package/dist/templates/startkit/src/utils/join-classes.ts +4 -0
  230. package/dist/templates/startkit/src/vite-env.d.ts +5 -0
  231. package/dist/templates/startkit/tests/app.test.tsx +32 -0
  232. package/dist/templates/startkit/tests/preferences.test.ts +43 -0
  233. package/dist/templates/startkit/tests/resources.test.ts +82 -0
  234. package/dist/templates/startkit/tsconfig.json +20 -0
  235. package/dist/templates/startkit/tsconfig.node.json +10 -0
  236. package/dist/templates/startkit/vite.config.ts +32 -0
  237. package/dist/templates/startkit/vitest.config.ts +13 -0
  238. package/dist/update-DyW1na5V.js +1140 -0
  239. package/dist/update-DyW1na5V.js.map +1 -0
  240. package/dist/update.js +3 -0
  241. package/package.json +84 -0
  242. package/skills/askr-accessibility/SKILL.md +68 -0
  243. package/skills/askr-accessibility/agents/openai.yaml +4 -0
  244. package/skills/askr-agent-execution/SKILL.md +85 -0
  245. package/skills/askr-agent-execution/agents/openai.yaml +4 -0
  246. package/skills/askr-agent-workflows/SKILL.md +57 -0
  247. package/skills/askr-agent-workflows/agents/openai.yaml +4 -0
  248. package/skills/askr-api-integration/SKILL.md +79 -0
  249. package/skills/askr-api-integration/agents/openai.yaml +4 -0
  250. package/skills/askr-app-builder/SKILL.md +99 -0
  251. package/skills/askr-app-builder/agents/openai.yaml +4 -0
  252. package/skills/askr-auth-access/SKILL.md +74 -0
  253. package/skills/askr-auth-access/agents/openai.yaml +4 -0
  254. package/skills/askr-cli-vite/SKILL.md +76 -0
  255. package/skills/askr-cli-vite/agents/openai.yaml +4 -0
  256. package/skills/askr-dashboard-charts/SKILL.md +82 -0
  257. package/skills/askr-dashboard-charts/agents/openai.yaml +4 -0
  258. package/skills/askr-design-system/SKILL.md +86 -0
  259. package/skills/askr-design-system/agents/openai.yaml +4 -0
  260. package/skills/askr-env-config/SKILL.md +74 -0
  261. package/skills/askr-env-config/agents/openai.yaml +4 -0
  262. package/skills/askr-error-loading-empty/SKILL.md +89 -0
  263. package/skills/askr-error-loading-empty/agents/openai.yaml +4 -0
  264. package/skills/askr-file-upload-artifacts/SKILL.md +77 -0
  265. package/skills/askr-file-upload-artifacts/agents/openai.yaml +4 -0
  266. package/skills/askr-forms-tables-crud/SKILL.md +98 -0
  267. package/skills/askr-forms-tables-crud/agents/openai.yaml +4 -0
  268. package/skills/askr-mental-model/SKILL.md +109 -0
  269. package/skills/askr-mental-model/agents/openai.yaml +4 -0
  270. package/skills/askr-migration-react/SKILL.md +81 -0
  271. package/skills/askr-migration-react/agents/openai.yaml +4 -0
  272. package/skills/askr-observability-debugging/SKILL.md +83 -0
  273. package/skills/askr-observability-debugging/agents/openai.yaml +4 -0
  274. package/skills/askr-project-structure/SKILL.md +79 -0
  275. package/skills/askr-project-structure/agents/openai.yaml +4 -0
  276. package/skills/askr-query-mutation/SKILL.md +115 -0
  277. package/skills/askr-query-mutation/agents/openai.yaml +4 -0
  278. package/skills/askr-realtime-streaming/SKILL.md +76 -0
  279. package/skills/askr-realtime-streaming/agents/openai.yaml +4 -0
  280. package/skills/askr-resources-data/SKILL.md +100 -0
  281. package/skills/askr-resources-data/agents/openai.yaml +4 -0
  282. package/skills/askr-routing-layouts/SKILL.md +107 -0
  283. package/skills/askr-routing-layouts/agents/openai.yaml +4 -0
  284. package/skills/askr-runtime-reactivity/SKILL.md +92 -0
  285. package/skills/askr-runtime-reactivity/agents/openai.yaml +4 -0
  286. package/skills/askr-ssr-ssg/SKILL.md +76 -0
  287. package/skills/askr-ssr-ssg/agents/openai.yaml +4 -0
  288. package/skills/askr-testing-determinism/SKILL.md +75 -0
  289. package/skills/askr-testing-determinism/agents/openai.yaml +4 -0
  290. package/skills/askr-theming/SKILL.md +86 -0
  291. package/skills/askr-theming/agents/openai.yaml +4 -0
  292. package/skills/askr-ui-composition/SKILL.md +92 -0
  293. package/skills/askr-ui-composition/agents/openai.yaml +4 -0
  294. package/templates/full-stack/AGENTS.md +12 -0
  295. package/templates/full-stack/README.md +18 -0
  296. package/templates/full-stack/gitignore.template +4 -0
  297. package/templates/full-stack/index.html +14 -0
  298. package/templates/full-stack/package.json +37 -0
  299. package/templates/full-stack/server.ts +13 -0
  300. package/templates/full-stack/src/action-authorizations.ts +10 -0
  301. package/templates/full-stack/src/actions/create-message.ts +10 -0
  302. package/templates/full-stack/src/i18n.ts +8 -0
  303. package/templates/full-stack/src/main.tsx +12 -0
  304. package/templates/full-stack/src/pages/home.tsx +25 -0
  305. package/templates/full-stack/src/pages/layout.tsx +33 -0
  306. package/templates/full-stack/src/pages/not-found.tsx +4 -0
  307. package/templates/full-stack/src/routes.tsx +20 -0
  308. package/templates/full-stack/src/schemas.ts +11 -0
  309. package/templates/full-stack/src/server/action-registry.ts +12 -0
  310. package/templates/full-stack/src/server/actions/create-message.ts +14 -0
  311. package/templates/full-stack/src/server/app.ts +66 -0
  312. package/templates/full-stack/src/server/dependencies.ts +55 -0
  313. package/templates/full-stack/src/server/entry-server.ts +8 -0
  314. package/templates/full-stack/src/telemetry.ts +4 -0
  315. package/templates/full-stack/src/vite-server.d.ts +6 -0
  316. package/templates/full-stack/tests/actions/create-message.test.ts +13 -0
  317. package/templates/full-stack/tsconfig.json +16 -0
  318. package/templates/full-stack/vite.config.ts +11 -0
  319. package/templates/spa/AGENTS.md +60 -0
  320. package/templates/spa/README.md +96 -0
  321. package/templates/spa/gitignore.template +16 -0
  322. package/templates/spa/index.html +13 -0
  323. package/templates/spa/package.json +35 -0
  324. package/templates/spa/src/adapters/operations-client.ts +90 -0
  325. package/templates/spa/src/components/shared/metric-card.tsx +27 -0
  326. package/templates/spa/src/components/shared/status-badge.tsx +24 -0
  327. package/templates/spa/src/features/operations/operations.query.ts +9 -0
  328. package/templates/spa/src/main.tsx +10 -0
  329. package/templates/spa/src/pages/_layout.tsx +9 -0
  330. package/templates/spa/src/pages/_routes.tsx +27 -0
  331. package/templates/spa/src/pages/app/_layout.tsx +94 -0
  332. package/templates/spa/src/pages/app/_routes.tsx +10 -0
  333. package/templates/spa/src/pages/app/admin-home.tsx +152 -0
  334. package/templates/spa/src/pages/app/agent-runs.tsx +93 -0
  335. package/templates/spa/src/pages/app/settings.tsx +91 -0
  336. package/templates/spa/src/pages/auth/_layout.tsx +38 -0
  337. package/templates/spa/src/pages/auth/_routes.tsx +6 -0
  338. package/templates/spa/src/pages/auth/login.tsx +63 -0
  339. package/templates/spa/src/pages/not-found.tsx +22 -0
  340. package/templates/spa/src/pages/public/_layout.tsx +47 -0
  341. package/templates/spa/src/pages/public/_routes.tsx +6 -0
  342. package/templates/spa/src/pages/public/home.tsx +143 -0
  343. package/templates/spa/src/shared/format.ts +12 -0
  344. package/templates/spa/src/shared/navigation.ts +15 -0
  345. package/templates/spa/src/styles/components.css +49 -0
  346. package/templates/spa/src/styles/layout.css +192 -0
  347. package/templates/spa/src/styles/reset.css +44 -0
  348. package/templates/spa/src/styles/theme.css +57 -0
  349. package/templates/spa/src/styles/tokens.css +20 -0
  350. package/templates/spa/src/styles.css +7 -0
  351. package/templates/spa/src/styles.d.ts +1 -0
  352. package/templates/spa/tests/app.test.tsx +37 -0
  353. package/templates/spa/tests/components/shared.test.tsx +12 -0
  354. package/templates/spa/tests/resources.test.ts +22 -0
  355. package/templates/spa/tsconfig.json +20 -0
  356. package/templates/spa/tsconfig.node.json +10 -0
  357. package/templates/spa/vite.config.ts +24 -0
  358. package/templates/spa/vitest.config.ts +17 -0
  359. package/templates/ssg/AGENTS.md +55 -0
  360. package/templates/ssg/README.md +39 -0
  361. package/templates/ssg/gitignore.template +17 -0
  362. package/templates/ssg/index.html +13 -0
  363. package/templates/ssg/package.json +35 -0
  364. package/templates/ssg/src/app.tsx +14 -0
  365. package/templates/ssg/src/components/badge.tsx +3 -0
  366. package/templates/ssg/src/components/counter.tsx +30 -0
  367. package/templates/ssg/src/components/site-shell.tsx +111 -0
  368. package/templates/ssg/src/jsx.d.ts +23 -0
  369. package/templates/ssg/src/main.tsx +8 -0
  370. package/templates/ssg/src/pages/about.tsx +82 -0
  371. package/templates/ssg/src/pages/content.tsx +63 -0
  372. package/templates/ssg/src/pages/example.tsx +97 -0
  373. package/templates/ssg/src/pages/home.tsx +51 -0
  374. package/templates/ssg/src/resources/user.ts +15 -0
  375. package/templates/ssg/src/routes.tsx +15 -0
  376. package/templates/ssg/src/styles.css +89 -0
  377. package/templates/ssg/src/vite-env.d.ts +5 -0
  378. package/templates/ssg/ssg.config.ts +34 -0
  379. package/templates/ssg/tests/app.test.tsx +19 -0
  380. package/templates/ssg/tests/components/counter.test.tsx +18 -0
  381. package/templates/ssg/tests/resources.test.ts +11 -0
  382. package/templates/ssg/tests/ssg-config.test.ts +11 -0
  383. package/templates/ssg/tsconfig.json +20 -0
  384. package/templates/ssg/tsconfig.node.json +10 -0
  385. package/templates/ssg/vite.config.ts +24 -0
  386. package/templates/ssg/vitest.config.ts +17 -0
  387. package/templates/ssr/AGENTS.md +28 -0
  388. package/templates/ssr/README.md +38 -0
  389. package/templates/ssr/gitignore.template +16 -0
  390. package/templates/ssr/index.html +13 -0
  391. package/templates/ssr/package.json +34 -0
  392. package/templates/ssr/server.ts +16 -0
  393. package/templates/ssr/src/app.tsx +21 -0
  394. package/templates/ssr/src/components/counter.tsx +26 -0
  395. package/templates/ssr/src/entry-server.tsx +10 -0
  396. package/templates/ssr/src/main.tsx +11 -0
  397. package/templates/ssr/src/pages/about.tsx +75 -0
  398. package/templates/ssr/src/pages/example.tsx +113 -0
  399. package/templates/ssr/src/pages/home.tsx +56 -0
  400. package/templates/ssr/src/resources/user.ts +15 -0
  401. package/templates/ssr/src/routes.tsx +13 -0
  402. package/templates/ssr/src/styles.css +148 -0
  403. package/templates/ssr/src/vite-server.d.ts +7 -0
  404. package/templates/ssr/tests/app.test.tsx +24 -0
  405. package/templates/ssr/tests/components/counter.test.tsx +13 -0
  406. package/templates/ssr/tests/resources.test.ts +11 -0
  407. package/templates/ssr/tsconfig.json +22 -0
  408. package/templates/ssr/tsconfig.node.json +10 -0
  409. package/templates/ssr/tsconfig.server.json +15 -0
  410. package/templates/ssr/vite.config.ts +25 -0
  411. package/templates/ssr/vitest.config.ts +13 -0
  412. package/templates/startkit/AGENTS.md +77 -0
  413. package/templates/startkit/README.md +192 -0
  414. package/templates/startkit/gitignore.template +16 -0
  415. package/templates/startkit/index.html +13 -0
  416. package/templates/startkit/package.json +35 -0
  417. package/templates/startkit/src/components/app-header.tsx +93 -0
  418. package/templates/startkit/src/components/app-sidebar.tsx +95 -0
  419. package/templates/startkit/src/components/data-table.tsx +80 -0
  420. package/templates/startkit/src/components/empty-state.tsx +13 -0
  421. package/templates/startkit/src/components/page-header.tsx +23 -0
  422. package/templates/startkit/src/components/stat-card.tsx +24 -0
  423. package/templates/startkit/src/features/accounts/account-filters.tsx +61 -0
  424. package/templates/startkit/src/features/accounts/account-table.tsx +79 -0
  425. package/templates/startkit/src/lib/format.ts +31 -0
  426. package/templates/startkit/src/lib/mock-data.ts +441 -0
  427. package/templates/startkit/src/lib/routes.ts +116 -0
  428. package/templates/startkit/src/main.tsx +12 -0
  429. package/templates/startkit/src/pages/_layout.tsx +56 -0
  430. package/templates/startkit/src/pages/auth/_layout.tsx +7 -0
  431. package/templates/startkit/src/pages/auth/login.tsx +129 -0
  432. package/templates/startkit/src/pages/home.tsx +83 -0
  433. package/templates/startkit/src/pages/not-found.tsx +24 -0
  434. package/templates/startkit/src/pages/workspace/_layout.tsx +17 -0
  435. package/templates/startkit/src/pages/workspace/accounts/index.tsx +217 -0
  436. package/templates/startkit/src/pages/workspace/dashboard.tsx +118 -0
  437. package/templates/startkit/src/pages/workspace/settings.tsx +218 -0
  438. package/templates/startkit/src/router.tsx +7 -0
  439. package/templates/startkit/src/routes/auth-config.ts +38 -0
  440. package/templates/startkit/src/routes/auth.ts +8 -0
  441. package/templates/startkit/src/routes/index.ts +28 -0
  442. package/templates/startkit/src/routes/public.ts +8 -0
  443. package/templates/startkit/src/routes/workspace/accounts.ts +8 -0
  444. package/templates/startkit/src/routes/workspace/index.ts +14 -0
  445. package/templates/startkit/src/styles/components.css +396 -0
  446. package/templates/startkit/src/styles/layout.css +192 -0
  447. package/templates/startkit/src/styles/reset.css +38 -0
  448. package/templates/startkit/src/styles/theme.css +76 -0
  449. package/templates/startkit/src/styles/tokens.css +67 -0
  450. package/templates/startkit/src/styles.css +7 -0
  451. package/templates/startkit/src/toast.ts +55 -0
  452. package/templates/startkit/src/utils/join-classes.ts +4 -0
  453. package/templates/startkit/src/vite-env.d.ts +5 -0
  454. package/templates/startkit/tests/app.test.tsx +32 -0
  455. package/templates/startkit/tests/preferences.test.ts +43 -0
  456. package/templates/startkit/tests/resources.test.ts +82 -0
  457. package/templates/startkit/tsconfig.json +20 -0
  458. package/templates/startkit/tsconfig.node.json +10 -0
  459. package/templates/startkit/vite.config.ts +32 -0
  460. package/templates/startkit/vitest.config.ts +13 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-DyW1na5V.js","names":[],"sources":["../src/update/range.ts","../src/update/npm-adapters.ts","../src/update/types.ts","../src/update/discovery.ts","../src/update/planner.ts","../src/update/registry.ts","../src/update/writer.ts","../src/bin/update.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","import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\n\ninterface NpmPackageSpec {\n escapedName: string;\n name?: string;\n rawSpec: string;\n type: string;\n}\n\ninterface NpmPackageArg {\n (specification: string): NpmPackageSpec;\n resolve(name: string, specification: string, where?: string): NpmPackageSpec;\n}\n\ninterface MapWorkspaces {\n (options: {\n cwd: string;\n pkg: { workspaces: string[] };\n ignore?: string[];\n }): Promise<Map<string, string>>;\n}\n\nexport interface NpmFetchOptions extends Record<string, unknown> {\n headers?: Record<string, string>;\n spec?: NpmPackageSpec;\n}\n\ninterface NpmRegistryFetch {\n json(uri: string, options: NpmFetchOptions): Promise<unknown>;\n}\n\nexport const npmPackageArg = require(\"npm-package-arg\") as NpmPackageArg;\nexport const mapDeclaredWorkspaces = require(\"@npmcli/map-workspaces\") as MapWorkspaces;\nexport const npmRegistryFetch = require(\"npm-registry-fetch\") as NpmRegistryFetch;\n\ninterface NpmConfigInstance {\n flat: NpmFetchOptions;\n load(): Promise<void>;\n validate(): boolean;\n}\n\ninterface NpmConfigConstructor {\n new (options: {\n argv: string[];\n cwd: string;\n definitions: Record<string, unknown>;\n env: NodeJS.ProcessEnv;\n flatten(source: Record<string, unknown>, destination: Record<string, unknown>): unknown;\n npmPath: string;\n shorthands: Record<string, string[]>;\n }): NpmConfigInstance;\n}\n\nexport const NpmConfig = require(\"@npmcli/config\") as NpmConfigConstructor;\nexport const npmConfigDefinitions = require(\"@npmcli/config/lib/definitions\") as {\n definitions: Record<string, unknown>;\n flatten(source: Record<string, unknown>, destination: Record<string, unknown>): unknown;\n shorthands: Record<string, string[]>;\n};\n","export const DEPENDENCY_SECTIONS = [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"peerDependencies\",\n] as const;\n\nexport type DependencySection = (typeof DEPENDENCY_SECTIONS)[number];\n\nexport type UpdateStatus = \"current\" | \"safe\" | \"breaking\" | \"local\" | \"manual\" | \"error\";\n\nexport interface UpdatePolicy {\n ignore: string[];\n tags: Record<string, string>;\n}\n\nexport interface WorkspaceManifest {\n name: string;\n directory: string;\n manifestPath: string;\n relativeManifestPath: string;\n manifest: Record<string, unknown>;\n isRoot: boolean;\n}\n\nexport interface DependencyOccurrence {\n package: string;\n workspace: string;\n manifestPath: string;\n relativeManifestPath: string;\n section: DependencySection;\n currentSpecification: string;\n kind: \"fetch\" | \"local\" | \"manual\" | \"current\";\n registryManaged: boolean;\n reason: string;\n}\n\nexport interface DiscoveredProject {\n root: string;\n workspaces: WorkspaceManifest[];\n selectedWorkspaces: WorkspaceManifest[];\n policy: UpdatePolicy;\n occurrences: DependencyOccurrence[];\n contextOccurrences: DependencyOccurrence[];\n}\n\nexport interface Packument {\n \"dist-tags\"?: Record<string, unknown>;\n versions?: Record<string, unknown>;\n}\n\nexport interface PlannedOccurrence {\n workspace: string;\n manifestPath: string;\n relativeManifestPath: string;\n section: DependencySection;\n currentSpecification: string;\n proposedSpecification: string | null;\n status: UpdateStatus;\n reason: string;\n allowedVersion: string | null;\n}\n\nexport interface PackageDecision {\n package: string;\n selectedTag: string;\n targetVersion: string | null;\n status: UpdateStatus;\n reason: string;\n occurrences: PlannedOccurrence[];\n}\n\nexport interface UpdateSummary extends Record<UpdateStatus, number> {\n packages: number;\n occurrences: number;\n changedOccurrences: number;\n}\n\nexport interface UpdatePlan {\n decisions: PackageDecision[];\n summary: UpdateSummary;\n hasErrors: boolean;\n}\n\nexport interface ManifestValueEdit {\n manifestPath: string;\n section: DependencySection;\n package: string;\n currentSpecification: string;\n proposedSpecification: string;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { minimatch } from \"minimatch\";\nimport { parseDocument } from \"yaml\";\nimport { analyzeRange } from \"./range\";\nimport { mapDeclaredWorkspaces, npmPackageArg } from \"./npm-adapters\";\nimport {\n DEPENDENCY_SECTIONS,\n type DependencyOccurrence,\n type DiscoveredProject,\n type UpdatePolicy,\n type WorkspaceManifest,\n} from \"./types\";\n\ninterface DiscoveryOptions {\n cwd: string;\n packagePatterns: string[];\n workspacePatterns: string[];\n}\n\nasync function isFile(filePath: string): Promise<boolean> {\n return (await fs.stat(filePath).catch(() => null))?.isFile() ?? false;\n}\n\nasync function readManifest(manifestPath: string): Promise<Record<string, unknown>> {\n let source: string;\n try {\n source = await fs.readFile(manifestPath, \"utf8\");\n } catch {\n throw new Error(`Unable to read manifest: ${manifestPath}`);\n }\n\n try {\n const value = JSON.parse(source.replace(/^\\uFEFF/, \"\")) as unknown;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error();\n return value as Record<string, unknown>;\n } catch {\n throw new Error(`Malformed package manifest: ${manifestPath}`);\n }\n}\n\nfunction packageWorkspacePatterns(manifest: Record<string, unknown>): string[] | null {\n if (!(\"workspaces\" in manifest)) return null;\n const declaration = manifest.workspaces;\n const patterns = Array.isArray(declaration)\n ? declaration\n : declaration && typeof declaration === \"object\" && !Array.isArray(declaration)\n ? (declaration as Record<string, unknown>).packages\n : null;\n\n if (!Array.isArray(patterns) || patterns.some((pattern) => typeof pattern !== \"string\")) {\n throw new Error(\"Invalid package.json workspaces declaration; expected an array of paths.\");\n }\n return patterns as string[];\n}\n\nasync function pnpmWorkspacePatterns(root: string): Promise<string[] | null> {\n const workspacePath = path.join(root, \"pnpm-workspace.yaml\");\n if (!(await isFile(workspacePath))) return null;\n\n const source = await fs.readFile(workspacePath, \"utf8\");\n const document = parseDocument(source, { prettyErrors: false });\n if (document.errors.length > 0) {\n throw new Error(`Malformed pnpm workspace declaration: ${workspacePath}`);\n }\n\n const value = document.toJS() as unknown;\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Invalid pnpm workspace declaration; expected a mapping with packages.\");\n }\n const packages = (value as Record<string, unknown>).packages;\n if (!Array.isArray(packages) || packages.some((pattern) => typeof pattern !== \"string\")) {\n throw new Error(\"Invalid pnpm workspace declaration; expected packages to be an array.\");\n }\n return packages as string[];\n}\n\nasync function findProjectRoot(start: string): Promise<string> {\n const resolved = path.resolve(start);\n const startStat = await fs.stat(resolved).catch(() => null);\n if (!startStat?.isDirectory()) throw new Error(`Working directory does not exist: ${resolved}`);\n\n let directory = resolved;\n let nearestManifestDirectory: string | null = null;\n\n while (true) {\n const manifestPath = path.join(directory, \"package.json\");\n const hasManifest = await isFile(manifestPath);\n if (hasManifest) {\n const manifest = await readManifest(manifestPath);\n nearestManifestDirectory ??= directory;\n if (packageWorkspacePatterns(manifest) !== null) return directory;\n }\n\n if (await isFile(path.join(directory, \"pnpm-workspace.yaml\"))) {\n if (!hasManifest) throw new Error(`Workspace root is missing package.json: ${directory}`);\n await pnpmWorkspacePatterns(directory);\n return directory;\n }\n\n const parent = path.dirname(directory);\n if (parent === directory) break;\n directory = parent;\n }\n\n if (nearestManifestDirectory) return nearestManifestDirectory;\n throw new Error(`No package.json found from ${resolved}.`);\n}\n\nfunction parsePolicy(manifest: Record<string, unknown>): UpdatePolicy {\n const empty = { ignore: [], tags: {} };\n if (!(\"askr\" in manifest)) return empty;\n if (!manifest.askr || typeof manifest.askr !== \"object\" || Array.isArray(manifest.askr)) {\n throw new Error(\"Invalid askr update configuration in the workspace root.\");\n }\n const update = (manifest.askr as Record<string, unknown>).update;\n if (update === undefined) return empty;\n if (!update || typeof update !== \"object\" || Array.isArray(update)) {\n throw new Error(\"Invalid askr.update configuration in the workspace root.\");\n }\n\n const config = update as Record<string, unknown>;\n const ignore = config.ignore ?? [];\n const tags = config.tags ?? {};\n if (!Array.isArray(ignore) || ignore.some((entry) => typeof entry !== \"string\")) {\n throw new Error(\"Invalid askr.update.ignore configuration; expected an array of patterns.\");\n }\n if (\n !tags ||\n typeof tags !== \"object\" ||\n Array.isArray(tags) ||\n Object.entries(tags).some(([name, tag]) => !name || typeof tag !== \"string\" || !tag)\n ) {\n throw new Error(\"Invalid askr.update.tags configuration; expected package-to-tag strings.\");\n }\n\n return { ignore: ignore as string[], tags: tags as Record<string, string> };\n}\n\nfunction relativeManifestPath(root: string, manifestPath: string): string {\n return path.relative(root, manifestPath).split(path.sep).join(\"/\") || \"package.json\";\n}\n\nfunction workspaceName(manifest: Record<string, unknown>, fallback: string): string {\n return typeof manifest.name === \"string\" && manifest.name.trim() ? manifest.name : fallback;\n}\n\nasync function discoverWorkspaces(root: string): Promise<{\n policy: UpdatePolicy;\n rootManifest: Record<string, unknown>;\n workspaces: WorkspaceManifest[];\n}> {\n const rootManifestPath = path.join(root, \"package.json\");\n const rootManifest = await readManifest(rootManifestPath);\n const policy = parsePolicy(rootManifest);\n const packagePatterns = packageWorkspacePatterns(rootManifest) ?? [];\n const pnpmPatterns = (await pnpmWorkspacePatterns(root)) ?? [];\n const patterns = [...packagePatterns, ...pnpmPatterns];\n const mapped =\n patterns.length > 0\n ? await mapDeclaredWorkspaces({ cwd: root, pkg: { workspaces: patterns } })\n : new Map<string, string>();\n\n const rootName = workspaceName(rootManifest, \"(root)\");\n if (mapped.has(rootName)) {\n throw new Error(`Duplicate workspace name '${rootName}' includes the workspace root.`);\n }\n\n const workspaces: WorkspaceManifest[] = [\n {\n name: rootName,\n directory: root,\n manifestPath: rootManifestPath,\n relativeManifestPath: \"package.json\",\n manifest: rootManifest,\n isRoot: true,\n },\n ];\n\n for (const [mappedName, directory] of mapped) {\n const manifestPath = path.join(directory, \"package.json\");\n const manifest = await readManifest(manifestPath);\n workspaces.push({\n name: workspaceName(manifest, mappedName),\n directory,\n manifestPath,\n relativeManifestPath: relativeManifestPath(root, manifestPath),\n manifest,\n isRoot: false,\n });\n }\n\n workspaces.sort((left, right) => {\n if (left.isRoot !== right.isRoot) return left.isRoot ? -1 : 1;\n return (\n left.name.localeCompare(right.name) || left.manifestPath.localeCompare(right.manifestPath)\n );\n });\n return { policy, rootManifest, workspaces };\n}\n\nfunction matchesAny(value: string, patterns: string[]): boolean {\n return patterns.some((pattern) => minimatch(value, pattern, { dot: true }));\n}\n\nfunction classifySpecification(\n packageName: string,\n specification: string,\n directory: string,\n localNames: Set<string>,\n): Pick<DependencyOccurrence, \"kind\" | \"registryManaged\" | \"reason\"> {\n if (localNames.has(packageName)) {\n return {\n kind: \"local\",\n registryManaged: false,\n reason: \"dependency resolves to a discovered workspace\",\n };\n }\n if (/^workspace:/i.test(specification)) {\n return {\n kind: \"local\",\n registryManaged: false,\n reason: \"workspace protocol is not registry-managed\",\n };\n }\n if (/^link:/i.test(specification)) {\n return {\n kind: \"local\",\n registryManaged: false,\n reason: \"link protocol is not registry-managed\",\n };\n }\n\n let parsed: ReturnType<typeof npmPackageArg.resolve>;\n try {\n parsed = npmPackageArg.resolve(packageName, specification, directory);\n } catch {\n return {\n kind: \"manual\",\n registryManaged: false,\n reason: \"unsupported dependency specification\",\n };\n }\n\n if ([\"directory\", \"file\", \"git\", \"remote\"].includes(parsed.type)) {\n return {\n kind: \"local\",\n registryManaged: false,\n reason: `${parsed.type} specification is not registry-managed`,\n };\n }\n if (parsed.type === \"alias\") {\n return { kind: \"manual\", registryManaged: false, reason: \"npm aliases require manual review\" };\n }\n if (parsed.type === \"tag\") {\n return { kind: \"current\", registryManaged: true, reason: \"tracking tag is not rewritten\" };\n }\n if (parsed.type !== \"range\" && parsed.type !== \"version\") {\n return {\n kind: \"manual\",\n registryManaged: false,\n reason: \"unsupported dependency specification\",\n };\n }\n\n const analysis = analyzeRange(specification);\n if (analysis.tracking) {\n return { kind: \"current\", registryManaged: true, reason: analysis.reason };\n }\n if (!analysis.shape) {\n return { kind: \"manual\", registryManaged: false, reason: analysis.reason };\n }\n return { kind: \"fetch\", registryManaged: true, reason: \"\" };\n}\n\nfunction collectOccurrences(\n root: string,\n workspaces: WorkspaceManifest[],\n localNames: Set<string>,\n policy: UpdatePolicy,\n packagePatterns: string[],\n): DependencyOccurrence[] {\n const occurrences: DependencyOccurrence[] = [];\n for (const workspace of workspaces) {\n for (const section of DEPENDENCY_SECTIONS) {\n const dependencies = workspace.manifest[section];\n if (dependencies === undefined) continue;\n if (!dependencies || typeof dependencies !== \"object\" || Array.isArray(dependencies)) {\n throw new Error(\n `Invalid ${section} in ${workspace.relativeManifestPath}; expected an object.`,\n );\n }\n\n for (const [packageName, specification] of Object.entries(dependencies)) {\n if (typeof specification !== \"string\") {\n throw new Error(\n `Invalid ${section}.${packageName} in ${workspace.relativeManifestPath}.`,\n );\n }\n if (packagePatterns.length > 0 && !matchesAny(packageName, packagePatterns)) continue;\n if (packagePatterns.length === 0 && matchesAny(packageName, policy.ignore)) continue;\n occurrences.push({\n package: packageName,\n workspace: workspace.name,\n manifestPath: workspace.manifestPath,\n relativeManifestPath: relativeManifestPath(root, workspace.manifestPath),\n section,\n currentSpecification: specification,\n ...classifySpecification(packageName, specification, workspace.directory, localNames),\n });\n }\n }\n }\n\n const sectionOrder = new Map(DEPENDENCY_SECTIONS.map((section, index) => [section, index]));\n occurrences.sort(\n (left, right) =>\n left.package.localeCompare(right.package) ||\n left.workspace.localeCompare(right.workspace) ||\n left.relativeManifestPath.localeCompare(right.relativeManifestPath) ||\n sectionOrder.get(left.section)! - sectionOrder.get(right.section)!,\n );\n return occurrences;\n}\n\nexport async function discoverProject(options: DiscoveryOptions): Promise<DiscoveredProject> {\n const root = await findProjectRoot(options.cwd);\n const { policy, workspaces } = await discoverWorkspaces(root);\n const selectedWorkspaces =\n options.workspacePatterns.length === 0\n ? workspaces\n : workspaces.filter((workspace) => matchesAny(workspace.name, options.workspacePatterns));\n if (selectedWorkspaces.length === 0) {\n throw new Error(\"No discovered workspace matches the requested --workspace filters.\");\n }\n\n const localNames = new Set(workspaces.map((workspace) => workspace.name));\n return {\n root,\n workspaces,\n selectedWorkspaces,\n policy,\n occurrences: collectOccurrences(\n root,\n selectedWorkspaces,\n localNames,\n policy,\n options.packagePatterns,\n ),\n contextOccurrences: collectOccurrences(\n root,\n selectedWorkspaces,\n localNames,\n { ignore: [], tags: policy.tags },\n [],\n ),\n };\n}\n","import semver from \"semver\";\nimport { npmPackageArg } from \"./npm-adapters\";\nimport { analyzeRange, isBreakingChange, rewriteRange } from \"./range\";\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 ? \"breaking update included by --force\"\n : \"breaking update requires --upgrade --force\"\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 let parsed: ReturnType<typeof npmPackageArg.resolve>;\n try {\n parsed = npmPackageArg.resolve(\"placeholder\", specification);\n } catch {\n return null;\n }\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","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport {\n NpmConfig,\n npmConfigDefinitions,\n npmPackageArg,\n npmRegistryFetch,\n type NpmFetchOptions,\n} from \"./npm-adapters\";\nimport type { Packument } from \"./types\";\n\nconst ABBREVIATED_PACKUMENT =\n \"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*\";\n\nfunction npmPathFromExecutable(executable: string): string | null {\n let directory = path.dirname(path.resolve(executable));\n for (let depth = 0; depth < 5; depth += 1) {\n const manifestPath = path.join(directory, \"package.json\");\n if (existsSync(manifestPath)) {\n try {\n const manifest = createRequire(import.meta.url)(manifestPath) as { name?: string };\n if (manifest.name === \"npm\") return directory;\n } catch {\n // Continue to a parent; npm may be launched through a shim.\n }\n }\n const parent = path.dirname(directory);\n if (parent === directory) break;\n directory = parent;\n }\n return null;\n}\n\nfunction resolveNpmPath(env: NodeJS.ProcessEnv): string {\n if (env.npm_execpath) {\n const fromEnvironment = npmPathFromExecutable(env.npm_execpath);\n if (fromEnvironment) return fromEnvironment;\n }\n\n const executableDirectory = path.dirname(process.execPath);\n const candidates =\n process.platform === \"win32\"\n ? [path.join(executableDirectory, \"node_modules\", \"npm\")]\n : [path.resolve(executableDirectory, \"..\", \"lib\", \"node_modules\", \"npm\")];\n const installed = candidates.find((candidate) =>\n existsSync(path.join(candidate, \"package.json\")),\n );\n if (installed) return installed;\n\n return path.dirname(createRequire(import.meta.url).resolve(\"@npmcli/config/package.json\"));\n}\n\nexport async function loadNpmConfiguration(\n root: string,\n env: NodeJS.ProcessEnv = process.env,\n): Promise<NpmFetchOptions> {\n try {\n const config = new NpmConfig({\n argv: [],\n cwd: root,\n definitions: npmConfigDefinitions.definitions,\n env,\n flatten: npmConfigDefinitions.flatten,\n npmPath: resolveNpmPath(env),\n shorthands: npmConfigDefinitions.shorthands,\n });\n await config.load();\n if (!config.validate()) throw new Error(\"Invalid npm configuration\");\n return { ...config.flat };\n } catch {\n throw new Error(\"Unable to load or validate npm configuration.\");\n }\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) return \"package was not found in the selected registry\";\n if (value.statusCode === 401 || value.statusCode === 403) {\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\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isPackument(value: unknown): value is Packument {\n return isRecord(value) && isRecord(value[\"dist-tags\"]) && isRecord(value.versions);\n}\n\nexport async function fetchPackuments(\n packageNames: string[],\n configuration: NpmFetchOptions,\n fetchJson: typeof npmRegistryFetch.json = npmRegistryFetch.json.bind(npmRegistryFetch),\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 let nextIndex = 0;\n\n const worker = async (): Promise<void> => {\n while (nextIndex < names.length) {\n const packageName = names[nextIndex];\n nextIndex += 1;\n const spec = npmPackageArg(packageName);\n try {\n const result = await fetchJson(`/${spec.escapedName}`, {\n ...configuration,\n headers: {\n ...configuration.headers,\n accept: ABBREVIATED_PACKUMENT,\n },\n offline: false,\n preferOffline: false,\n preferOnline: true,\n spec,\n });\n if (!isPackument(result)) {\n failures.set(packageName, \"registry returned malformed package metadata\");\n } else {\n packuments.set(packageName, result as Packument);\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","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { applyEdits, modify, parse, type ParseError } from \"jsonc-parser\";\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\nfunction renderReplacement(source: string, edits: ManifestValueEdit[]): string {\n const errors: ParseError[] = [];\n const manifest = parse(source, errors, { allowTrailingComma: true }) as unknown;\n if (errors.length > 0 || !manifest || typeof manifest !== \"object\" || Array.isArray(manifest)) {\n throw new Error(\"Manifest changed to invalid JSON before writing.\");\n }\n\n let result = source;\n for (const edit of edits) {\n const dependencies = (manifest as Record<string, unknown>)[edit.section];\n const current =\n dependencies && typeof dependencies === \"object\" && !Array.isArray(dependencies)\n ? (dependencies as Record<string, unknown>)[edit.package]\n : undefined;\n if (current !== edit.currentSpecification) {\n throw new Error(`Manifest changed before writing: ${edit.manifestPath}`);\n }\n result = applyEdits(\n result,\n modify(result, [edit.section, edit.package], edit.proposedSpecification, {}),\n );\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","#!/usr/bin/env node\n\nimport path from \"node:path\";\nimport { isDirectExecution } from \"./is-direct-execution\";\nimport { discoverProject } from \"../update/discovery\";\nimport { planUpdates } from \"../update/planner\";\nimport { fetchPackuments, loadNpmConfiguration, type PackumentResults } from \"../update/registry\";\nimport type {\n ManifestValueEdit,\n PackageDecision,\n PlannedOccurrence,\n UpdateSummary,\n WorkspaceManifest,\n} from \"../update/types\";\nimport { writeManifestEdits } from \"../update/writer\";\n\ntype CliIo = Pick<Console, \"error\" | \"log\">;\n\ninterface ParsedArgs {\n cwd: string;\n force: boolean;\n help: boolean;\n json: boolean;\n packagePatterns: string[];\n tag?: string;\n upgrade: boolean;\n workspacePatterns: string[];\n errors: string[];\n}\n\ninterface UpdateRuntime {\n registry?: (root: string, packageNames: string[]) => Promise<PackumentResults>;\n writer?: typeof writeManifestEdits;\n}\n\nfunction helpText(): string {\n return [\n \"askr update - Plan or apply dependency manifest updates\",\n \"\",\n \"Usage:\",\n \" askr update [packages...] [options]\",\n \"\",\n \"Options:\",\n \" -u, --upgrade Apply compatible package.json edits\",\n \" -f, --force Include breaking updates (requires --upgrade)\",\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 \" The command is dry-run by default and 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 force: false,\n help: false,\n json: false,\n packagePatterns: [],\n upgrade: false,\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 === \"--upgrade\" || argument === \"-u\") {\n parsed.upgrade = true;\n } else if (argument === \"--force\" || argument === \"-f\") {\n parsed.force = 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.force && !parsed.upgrade) {\n parsed.errors.push(\"--force requires --upgrade\");\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): string {\n if (occurrence.proposedSpecification) {\n return `${occurrence.currentSpecification} → ${occurrence.proposedSpecification}`;\n }\n if (occurrence.status === \"breaking\") {\n return `${occurrence.currentSpecification} (skipped; use -u -f)`;\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 upgrade: boolean,\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 rows.push([\n decision.package,\n occurrence.allowedVersion ?? \"-\",\n decision.targetVersion ?? \"-\",\n occurrence.status,\n rangeText(occurrence),\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 (upgrade) {\n io.log(`Updated ${applied} manifest occurrence${applied === 1 ? \"\" : \"s\"}.`);\n } else if (summary.changedOccurrences > 0) {\n io.log(\n `Dry run: ${summary.changedOccurrences} manifest occurrence${summary.changedOccurrences === 1 ? \"\" : \"s\"} can be updated; rerun with -u to apply.`,\n );\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(root: string, packageNames: string[]): Promise<PackumentResults> {\n const configuration = await loadNpmConfiguration(root);\n return fetchPackuments(packageNames, configuration);\n}\n\nexport async function runUpdateCli(\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());\n return 0;\n }\n if (parsed.errors.length > 0) {\n for (const error of parsed.errors) io.error(`askr update: ${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 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 results =\n lookupNames.length > 0\n ? await registry(project.root, lookupNames)\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: parsed.force,\n });\n\n let applied = 0;\n const errors: string[] = [];\n if (!plan.hasErrors && parsed.upgrade) {\n try {\n applied = await (runtime.writer ?? writeManifestEdits)(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, parsed.upgrade);\n }\n for (const error of errors) io.error(`askr update: ${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 update: ${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\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":"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"}
package/dist/update.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { t as runUpdateCli } from "./update-DyW1na5V.js";
3
+ export { runUpdateCli };
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@askrjs/cli",
3
+ "version": "0.0.2",
4
+ "description": "Unified CLI for the Askr platform",
5
+ "homepage": "https://github.com/askrjs/askr-cli#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/askrjs/askr-cli/issues"
8
+ },
9
+ "license": "Apache-2.0",
10
+ "author": {
11
+ "name": "askrjs",
12
+ "url": "https://github.com/askrjs"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/askrjs/askr-cli.git"
17
+ },
18
+ "bin": {
19
+ "askr": "./dist/cli.js"
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "skills",
24
+ "templates"
25
+ ],
26
+ "type": "module",
27
+ "exports": {
28
+ "./package.json": "./package.json"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "scripts": {
34
+ "clean": "npx rimraf dist node_modules",
35
+ "build": "vp pack",
36
+ "dev": "vp pack --watch",
37
+ "test": "vp test run -c vitest.config.ts",
38
+ "fmt": "vp fmt .",
39
+ "lint": "vp lint src tests vite.config.ts vitest.config.ts",
40
+ "typecheck": "tsc -p tsconfig.json --noEmit",
41
+ "test:publint": "publint",
42
+ "pack:check": "npm pack --ignore-scripts --dry-run --json",
43
+ "check": "npm run lint && npm run typecheck && npm test && npm run build && npm run test:publint && npm run pack:check",
44
+ "prepack": "npm run build",
45
+ "prepublishOnly": "npm run check"
46
+ },
47
+ "dependencies": {
48
+ "@npmcli/config": "^9.0.0",
49
+ "@npmcli/map-workspaces": "^4.0.2",
50
+ "jsonc-parser": "^3.3.1",
51
+ "minimatch": "^10.2.5",
52
+ "npm-package-arg": "^13.0.2",
53
+ "npm-registry-fetch": "^19.1.1",
54
+ "semver": "^7.8.5",
55
+ "tsx": "^4.23.1",
56
+ "yaml": "^2.9.0"
57
+ },
58
+ "devDependencies": {
59
+ "@askrjs/askr": "file:../askr",
60
+ "@askrjs/charts": "file:../askr-charts",
61
+ "@askrjs/logos": "file:../askr-logos",
62
+ "@askrjs/lucide": "file:../askr-lucide",
63
+ "@askrjs/themes": "file:../askr-themes",
64
+ "@askrjs/ui": "file:../askr-ui",
65
+ "@askrjs/vite": "file:../askr-vite",
66
+ "@types/node": "^25.9.2",
67
+ "@types/semver": "^7.7.1",
68
+ "publint": "^0.3.21",
69
+ "typescript": "^6.0.3",
70
+ "vite-plus": "^0.2.4",
71
+ "vitest": "^4.1.10"
72
+ },
73
+ "peerDependencies": {
74
+ "@askrjs/askr": ">=0.0.53 <0.1.0"
75
+ },
76
+ "peerDependenciesMeta": {
77
+ "@askrjs/askr": {
78
+ "optional": true
79
+ }
80
+ },
81
+ "engines": {
82
+ "node": "^20.19.0 || >=22.12.0"
83
+ }
84
+ }
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: askr-accessibility
3
+ description: Use when making Askr UI accessible, including keyboard flows, focus management, ARIA names, dialogs, menus, forms, tables, live regions, screen-reader behavior, and @askrjs/ui primitive selection.
4
+ ---
5
+
6
+ # Askr Accessibility
7
+
8
+ Use this for accessibility-sensitive UI or when composing interactive primitives. The goal is predictable keyboard flow, visible and announced state changes, and reuse of primitives that already own behavior.
9
+
10
+ ## Use This When
11
+
12
+ - The surface includes dialogs, menus, forms, tables, or other interactive controls.
13
+ - Focus management, keyboard flow, or screen-reader behavior matters to the task.
14
+ - Async status, stale state, or destructive confirmation must be announced clearly.
15
+ - You need to review whether a UI change stayed accessible after composition or theming work.
16
+
17
+ ## Inspect First
18
+
19
+ - Existing `@askrjs/ui` primitive usage
20
+ - Labels, accessible names, focus order, and keyboard behavior
21
+ - Form errors, async status messages, and destructive confirmations
22
+ - Browser tests for overlays, menus, forms, and tables
23
+
24
+ ## Do This In Order
25
+
26
+ 1. Prefer `@askrjs/ui` for behavior-heavy controls before raw HTML.
27
+ 2. Make sure every interactive control has an accessible name.
28
+ 3. Keep dialog, menu, and overlay focus behavior predictable.
29
+ 4. Make form errors, async failures, and important status changes visible and announceable.
30
+ 5. Check that stale, selected, pending, and error states are not color-only.
31
+
32
+ ## Copy This Shape
33
+
34
+ ```tsx
35
+ <Show when={mutation.error}>
36
+ <p role="alert">Unable to save changes.</p>
37
+ </Show>
38
+
39
+ <button aria-label="Archive account">Archive</button>
40
+ ```
41
+
42
+ ## Never Do These
43
+
44
+ - Reimplementing primitive keyboard behavior.
45
+ - Icon-only buttons without labels.
46
+ - Focus loss after route changes, dialogs, or list updates.
47
+ - Color-only error, stale, selected, or pending states.
48
+ - Toast-only critical errors.
49
+
50
+ ## Validate
51
+
52
+ - Keyboard-only users can complete the workflow.
53
+ - Focus lands in the expected place after navigation, dialog open or close, and submit.
54
+ - Axe or equivalent accessibility checks pass for changed surfaces when available.
55
+ - Browser tests cover complex focus and keyboard behavior.
56
+
57
+ ## Done When
58
+
59
+ - Keyboard, focus, and naming behavior are predictable.
60
+ - Important async and failure states are announced or visible semantically.
61
+ - The surface does not depend on color alone to communicate state.
62
+ - Accessibility behavior is verified at the right test level.
63
+
64
+ ## Handoff
65
+
66
+ - Use `askr-ui-composition` when the hard part is primitive behavior composition.
67
+ - Use `askr-error-loading-empty` when async state truth is the blocker.
68
+ - Use `askr-testing-determinism` before closing browser-level accessibility changes.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Askr Accessibility"
3
+ short_description: "Make Askr UI accessible and usable"
4
+ default_prompt: "Use $askr-accessibility to review or build accessible UI."
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: askr-agent-execution
3
+ description: Use when an AI coding agent needs the canonical execution playbook for reading an Askr repo, choosing the right skill, validating work, and avoiding invented primitives or foreign framework defaults.
4
+ ---
5
+
6
+ # Askr Agent Execution
7
+
8
+ Use this before any edit in an Askr repo. This is the execution loop that every other Askr skill assumes.
9
+
10
+ ## Use This When
11
+
12
+ - Starting a new task.
13
+ - The right Askr skill is not obvious yet.
14
+ - You need a fixed read order before editing.
15
+ - You need objective done criteria.
16
+
17
+ ## Read In This Order
18
+
19
+ 1. `package.json`
20
+ 2. `AGENTS.md` when it exists
21
+ 3. `src/main.tsx`
22
+ 4. `src/router.tsx` or `src/pages/_routes.tsx`
23
+ 5. The nearest branch `_routes.tsx` and `_layout.tsx`
24
+ 6. The nearest `src/features/<feature>/` or `src/components/<feature>/` owner
25
+ 7. Existing tests for the touched surface
26
+ 8. `src/styles.css` and `src/styles/*` only when visual behavior changes
27
+
28
+ ## Choose The Next Skill
29
+
30
+ - File ownership unclear: use `askr-project-structure`.
31
+ - Route tree, shell, metadata, or navigation change: use `askr-routing-layouts`.
32
+ - Local state, derived values, keyed rendering, or call-order safety: use `askr-runtime-reactivity`.
33
+ - One route or container owns an async read: use `askr-resources-data`.
34
+ - Shared keyed reads or writes must coordinate across screens: use `askr-query-mutation`.
35
+ - Loading, empty, stale, retry, or pending-write truth is the hard part: use `askr-error-loading-empty`.
36
+ - You are closing the task and need the right checks: use `askr-testing-determinism`.
37
+ - The task spans many app surfaces and no narrower owner is enough: use `askr-app-builder` last, not first.
38
+
39
+ ## Execution Loop
40
+
41
+ 1. Inspect the existing owner files before proposing a new abstraction.
42
+ 2. Pick one owning skill for the current slice.
43
+ 3. Make the smallest edit that matches the repo's current structure.
44
+ 4. Run the narrowest executable validation for that slice.
45
+ 5. Only widen scope after that validation passes or clearly changes your understanding.
46
+ 6. Stop when the change is structurally correct, validated, and easy for the next agent to follow.
47
+
48
+ ## Non-Negotiables
49
+
50
+ - Keep pages route-focused, features workflow-focused, and adapters transport-focused.
51
+ - Add files only where another agent could predict they belong.
52
+ - Reuse existing layouts, route groups, features, and shared helpers before creating new ones.
53
+ - Use `@askrjs/ui` and `@askrjs/themes` before inventing app-local primitives.
54
+
55
+ ## Never Do These By Default
56
+
57
+ - React hooks or React Router patterns.
58
+ - TanStack Query or a generic query-client abstraction.
59
+ - Custom routing systems or page-local route state copies.
60
+ - App-local `Button`, `Card`, `Panel`, `Sidebar`, `Navbar`, `EmptyState`, `Page`, `Toolbar`, `HStack`, or `VStack` clones.
61
+ - Generic store or service-locator layers when `state()`, `resource()`, `createQuery()`, or `createMutation()` already fit.
62
+ - Diff-only validation when a narrower executable check exists.
63
+
64
+ ## Validate In This Order
65
+
66
+ 1. Run the narrowest relevant test for the touched behavior.
67
+ 2. Run the nearest type check or project check.
68
+ 3. Run build or template-specific checks if the change affects app boot, routing, SSR/SSG, or packaging.
69
+ 4. Confirm loading, error, empty, stale, pending, focus, and overflow states when user-visible.
70
+
71
+ Use existing scripts such as `npm test`, `npm run type-check`, `npm run build`, `npm run lint`, or `npm run check` when they exist. Do not invent new validation commands when the repo already defines the contract.
72
+
73
+ ## Done When
74
+
75
+ - You can name the owner file for every new change.
76
+ - The chosen skill matches the slice you edited.
77
+ - No foreign framework defaults or parallel architecture were introduced.
78
+ - At least one executable validation ran, or the blocker is explicit.
79
+ - The next likely skill for follow-up work is obvious.
80
+
81
+ ## Handoff
82
+
83
+ - Use `askr-project-structure` when the next step is mostly about file placement.
84
+ - Use `askr-routing-layouts` when the next step is mostly about URL ownership or shell boundaries.
85
+ - Use `askr-testing-determinism` before closing any user-visible or stateful change.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Askr Agent Execution"
3
+ short_description: "Follow the canonical Askr editing playbook"
4
+ default_prompt: "Use $askr-agent-execution to decide how to read, edit, and validate an Askr repository."
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: askr-agent-workflows
3
+ description: Use when building Askr UI for AI or agent workflows, including prompts, runs, streaming output, tool timelines, approvals, cancellation, retries, audit logs, persistence, and event-sourced run state.
4
+ ---
5
+
6
+ # Askr Agent Workflows
7
+
8
+ Use this for user-facing agentic product flows.
9
+
10
+ ## Inspect First
11
+
12
+ - Existing agent API adapters and run/event schemas.
13
+ - Feature folders for prompts, runs, tools, approvals, or artifacts.
14
+ - Realtime/event-streaming utilities.
15
+ - Product requirements for human approval, audit, and cancellation.
16
+
17
+ ## Run State Model
18
+
19
+ Model agent work as a run, not a one-off response:
20
+
21
+ - `draft`: user is composing input.
22
+ - `queued`: backend accepted the run but no work is visible.
23
+ - `running`: events or tokens are arriving.
24
+ - `requires-action`: user approval, credential, or clarification is needed.
25
+ - `cancelling`: cancel requested, waiting for acknowledgement.
26
+ - `succeeded`, `failed`, `cancelled`: terminal states.
27
+
28
+ ## Event-Sourced UX
29
+
30
+ - Treat the server event log as the source of truth.
31
+ - Apply events idempotently by event ID or sequence.
32
+ - Show optimistic local intent separately from confirmed server state.
33
+ - Preserve `lastEventId` or cursor for resume/reconnect.
34
+ - On reconnect, request events after the last seen cursor and refetch the affected projection if a gap is detected.
35
+ - When projections lag, display "saving", "syncing", or "finalizing" rather than pretending completion.
36
+
37
+ ## UI Composition
38
+
39
+ - Prompt composer owns draft state and submit intent.
40
+ - Run timeline renders messages, tool calls, approvals, errors, and artifacts.
41
+ - Approval cards make the requested action, risk, and resulting command explicit.
42
+ - Cancel and retry controls reflect backend acknowledgement, not just button clicks.
43
+
44
+ ## Avoid
45
+
46
+ - A single `loading` boolean for the whole run.
47
+ - Replacing the timeline wholesale when streaming events arrive.
48
+ - Hiding tool calls or approvals in unstructured text.
49
+ - Retrying runs without idempotency or parent-run linkage.
50
+ - Losing partial output on refresh or reconnect.
51
+
52
+ ## Checks
53
+
54
+ - Run states map to visible UI.
55
+ - Event application is idempotent and ordered.
56
+ - Cancellation, retry, approval, and failure paths are covered.
57
+ - The user can understand what the agent did and what still needs attention.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Askr Agent Workflows"
3
+ short_description: "Build agent run product flows"
4
+ default_prompt: "Use $askr-agent-workflows to build an agent run workflow."
@@ -0,0 +1,79 @@
1
+ ---
2
+ name: askr-api-integration
3
+ description: Use when integrating Askr apps with generated API clients, transport adapters, auth headers, cancellation, DTO mapping, error normalization, retries, and event-sourced consistency metadata.
4
+ ---
5
+
6
+ # Askr API Integration
7
+
8
+ Use this for the boundary between Askr feature code and backend APIs. The goal is one adapter boundary, deterministic DTO mapping, and preserved cancellation and consistency metadata.
9
+
10
+ ## Use This When
11
+
12
+ - Frontend code crosses an HTTP, SSE, WebSocket, or generated-client boundary.
13
+ - DTOs need mapping before they enter features or UI.
14
+ - Auth headers, retries, request IDs, or error normalization belong in one place.
15
+ - Event-sourced writes need version, cursor, or event metadata for reconciliation.
16
+
17
+ ## Inspect First
18
+
19
+ - Existing `src/adapters` generated clients and transport wrappers
20
+ - Existing `src/features` query or mutation workflows
21
+ - Existing `src/shared` config, error formatting, and auth helpers
22
+ - API DTO naming, version fields, event IDs, cursor fields, and request IDs
23
+
24
+ ## Choose The Boundary
25
+
26
+ - `src/adapters`: generated clients, raw transport, auth header injection, and low-level retry behavior.
27
+ - `src/features/<feature>`: app-level queries, mutations, DTO-to-model mapping, and workflow state.
28
+ - `src/shared`: cross-cutting config, error normalization, formatters, and request tracing.
29
+ - Components should consume app models and feature state, never raw transport DTOs.
30
+
31
+ ## Do This In Order
32
+
33
+ 1. Keep raw client calls in the adapter boundary.
34
+ 2. Forward `AbortSignal` through every cancellable layer.
35
+ 3. Map DTOs into app models before they leave the feature or adapter boundary.
36
+ 4. Normalize errors into user-safe messages plus machine-readable diagnostics.
37
+ 5. Preserve request IDs, versions, cursors, or event IDs when the UI needs freshness or reconciliation truth.
38
+ 6. Retry only idempotent reads or commands with explicit idempotency keys.
39
+
40
+ ## Copy This Shape
41
+
42
+ ```ts
43
+ export async function listAccounts({ signal }: { signal: AbortSignal }) {
44
+ const response = await accountsClient.list({ signal });
45
+
46
+ return {
47
+ items: response.items.map(toAccount),
48
+ version: response.version,
49
+ lastEventId: response.last_event_id,
50
+ };
51
+ }
52
+ ```
53
+
54
+ ## Never Do These
55
+
56
+ - Returning raw API DTOs directly to page props.
57
+ - Hiding `signal`, request IDs, or version metadata because the first screen does not need them yet.
58
+ - Retrying a non-idempotent command from the UI without a server-recognized idempotency key.
59
+ - Putting raw clients in `src/pages` or generic UI components.
60
+
61
+ ## Validate
62
+
63
+ - Every async adapter accepts and forwards `signal`.
64
+ - Errors normalize into user-safe messages and machine-readable codes.
65
+ - DTO mapping is deterministic and tested where the boundary matters.
66
+ - Event or version metadata reaches query or mutation state when consistency matters.
67
+
68
+ ## Done When
69
+
70
+ - Components no longer see raw transport DTOs.
71
+ - `signal`, request IDs, and consistency metadata survive the adapter boundary.
72
+ - Retry behavior is explicit and safe.
73
+ - Error normalization is ready for both user copy and machine-readable handling.
74
+
75
+ ## Handoff
76
+
77
+ - Use `askr-query-mutation` when feature state must invalidate or reconcile shared reads.
78
+ - Use `askr-auth-access` when auth headers or session policy shape the adapter behavior.
79
+ - Use `askr-observability-debugging` when request IDs, traces, and safe diagnostics must survive end to end.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Askr API Integration"
3
+ short_description: "Connect APIs with Askr boundaries"
4
+ default_prompt: "Use $askr-api-integration to connect an API to an Askr feature."