create-disposabl-app 0.0.4 → 0.1.1

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 (399) hide show
  1. package/dist/index.js +490 -105
  2. package/dist/templates/default/LICENSE +21 -0
  3. package/dist/templates/default/apps/blog/package.json +1 -0
  4. package/dist/templates/default/apps/changelog/package.json +1 -0
  5. package/dist/templates/default/apps/desktop/.oxfmtrc.json +5 -0
  6. package/dist/templates/default/apps/desktop/.oxlintrc.json +6 -0
  7. package/dist/templates/default/apps/desktop/README.md +58 -0
  8. package/dist/templates/default/apps/desktop/forge.config.mts +90 -0
  9. package/dist/templates/default/apps/desktop/index.html +12 -0
  10. package/dist/templates/default/apps/desktop/package.json +55 -0
  11. package/dist/templates/default/apps/desktop/src/declarations.d.ts +2 -0
  12. package/dist/templates/default/apps/desktop/src/index.css +8 -0
  13. package/dist/templates/default/apps/desktop/src/main.ts +58 -0
  14. package/dist/templates/default/apps/desktop/src/preload.ts +3 -0
  15. package/dist/templates/default/apps/desktop/src/renderer.ts +19 -0
  16. package/dist/templates/default/apps/desktop/tsconfig.json +14 -0
  17. package/dist/templates/default/apps/desktop/vite.main.config.mts +4 -0
  18. package/dist/templates/default/apps/desktop/vite.preload.config.mts +4 -0
  19. package/dist/templates/default/apps/desktop/vite.renderer.config.mts +4 -0
  20. package/dist/templates/default/apps/docs/package.json +1 -0
  21. package/dist/templates/default/apps/mobile/.agents/skills/agent-device/SKILL.md +22 -0
  22. package/dist/templates/default/apps/mobile/.agents/skills/android-emulator/SKILL.md +32 -0
  23. package/dist/templates/default/apps/mobile/.agents/skills/dogfood/SKILL.md +27 -0
  24. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/SKILL.md +176 -0
  25. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/agents/openai.yaml +4 -0
  26. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/app-store-metadata.md +497 -0
  27. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/ios-app-store.md +376 -0
  28. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/native-ios.md +167 -0
  29. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/play-store.md +244 -0
  30. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/testflight.md +62 -0
  31. package/dist/templates/default/apps/mobile/.agents/skills/eas-app-stores/references/workflows.md +120 -0
  32. package/dist/templates/default/apps/mobile/.agents/skills/eas-hosting/SKILL.md +431 -0
  33. package/dist/templates/default/apps/mobile/.agents/skills/eas-hosting/agents/openai.yaml +4 -0
  34. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/SKILL.md +46 -0
  35. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/agents/openai.yaml +4 -0
  36. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/metrics.md +98 -0
  37. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/queries.md +444 -0
  38. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/setup.md +529 -0
  39. package/dist/templates/default/apps/mobile/.agents/skills/eas-observe/references/third-party.md +136 -0
  40. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/SKILL.md +237 -0
  41. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/agents/openai.yaml +4 -0
  42. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/controllers.md +139 -0
  43. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/logs-and-crashes.md +101 -0
  44. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/run-your-app.md +256 -0
  45. package/dist/templates/default/apps/mobile/.agents/skills/eas-simulator/references/troubleshooting.md +56 -0
  46. package/dist/templates/default/apps/mobile/.agents/skills/eas-update/SKILL.md +146 -0
  47. package/dist/templates/default/apps/mobile/.agents/skills/eas-update/agents/openai.yaml +4 -0
  48. package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/SKILL.md +238 -0
  49. package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/agents/openai.yaml +4 -0
  50. package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
  51. package/dist/templates/default/apps/mobile/.agents/skills/eas-update-insights/references/update-insights-schema.md +69 -0
  52. package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/SKILL.md +99 -0
  53. package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/agents/openai.yaml +4 -0
  54. package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/scripts/fetch.js +109 -0
  55. package/dist/templates/default/apps/mobile/.agents/skills/eas-workflows/scripts/package.json +6 -0
  56. package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/LICENSE +21 -0
  57. package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/RECIPES.md +385 -0
  58. package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/SKILL.md +274 -0
  59. package/dist/templates/default/apps/mobile/.agents/skills/expo-animation/agents/openai.yaml +4 -0
  60. package/dist/templates/default/apps/mobile/.agents/skills/expo-app-clip/SKILL.md +290 -0
  61. package/dist/templates/default/apps/mobile/.agents/skills/expo-app-clip/agents/openai.yaml +4 -0
  62. package/dist/templates/default/apps/mobile/.agents/skills/expo-app-clip/references/native-module.md +96 -0
  63. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/SKILL.md +69 -0
  64. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/agents/openai.yaml +4 -0
  65. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/brownfield-integrated.md +551 -0
  66. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/brownfield-isolated.md +449 -0
  67. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/comparison.md +63 -0
  68. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/feature-integration.md +163 -0
  69. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/troubleshooting.md +88 -0
  70. package/dist/templates/default/apps/mobile/.agents/skills/expo-brownfield/references/version-compatibility.md +40 -0
  71. package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/SKILL.md +478 -0
  72. package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/agents/openai.yaml +4 -0
  73. package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/references/expo-router-loaders.md +341 -0
  74. package/dist/templates/default/apps/mobile/.agents/skills/expo-data-fetching/references/offline-and-cancellation.md +68 -0
  75. package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/SKILL.md +376 -0
  76. package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/agents/openai.yaml +4 -0
  77. package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/references/audit.md +190 -0
  78. package/dist/templates/default/apps/mobile/.agents/skills/expo-design-system/references/native-slop.md +74 -0
  79. package/dist/templates/default/apps/mobile/.agents/skills/expo-dev-client/SKILL.md +184 -0
  80. package/dist/templates/default/apps/mobile/.agents/skills/expo-dev-client/agents/openai.yaml +4 -0
  81. package/dist/templates/default/apps/mobile/.agents/skills/expo-dom/SKILL.md +425 -0
  82. package/dist/templates/default/apps/mobile/.agents/skills/expo-dom/agents/openai.yaml +4 -0
  83. package/dist/templates/default/apps/mobile/.agents/skills/expo-examples/SKILL.md +106 -0
  84. package/dist/templates/default/apps/mobile/.agents/skills/expo-examples/agents/openai.yaml +4 -0
  85. package/dist/templates/default/apps/mobile/.agents/skills/expo-examples/references/catalog.md +105 -0
  86. package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/SKILL.md +124 -0
  87. package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/agents/openai.yaml +4 -0
  88. package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/references/compatibility.md +130 -0
  89. package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/references/example.md +212 -0
  90. package/dist/templates/default/apps/mobile/.agents/skills/expo-migrate-module/references/migration-map.md +457 -0
  91. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/SKILL.md +151 -0
  92. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/agents/openai.yaml +4 -0
  93. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/config-plugin.md +90 -0
  94. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/create-expo-module.md +206 -0
  95. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/lifecycle.md +127 -0
  96. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/module-config.md +48 -0
  97. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/native-module.md +286 -0
  98. package/dist/templates/default/apps/mobile/.agents/skills/expo-module/references/native-view.md +171 -0
  99. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/SKILL.md +201 -0
  100. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/agents/openai.yaml +4 -0
  101. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/controls.md +231 -0
  102. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/gradients.md +106 -0
  103. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/icons.md +232 -0
  104. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/media.md +193 -0
  105. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/storage.md +121 -0
  106. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/visual-effects.md +198 -0
  107. package/dist/templates/default/apps/mobile/.agents/skills/expo-native-ui/references/webgpu-three.md +605 -0
  108. package/dist/templates/default/apps/mobile/.agents/skills/expo-overview/SKILL.md +120 -0
  109. package/dist/templates/default/apps/mobile/.agents/skills/expo-overview/agents/openai.yaml +4 -0
  110. package/dist/templates/default/apps/mobile/.agents/skills/expo-overview/references/launch-without-dev-menu.md +24 -0
  111. package/dist/templates/default/apps/mobile/.agents/skills/expo-project-structure/SKILL.md +114 -0
  112. package/dist/templates/default/apps/mobile/.agents/skills/expo-project-structure/agents/openai.yaml +4 -0
  113. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/SKILL.md +240 -0
  114. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/agents/openai.yaml +4 -0
  115. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/form-sheet.md +253 -0
  116. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/route-structure.md +229 -0
  117. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/search.md +248 -0
  118. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/tabs.md +433 -0
  119. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/toolbar-and-headers.md +284 -0
  120. package/dist/templates/default/apps/mobile/.agents/skills/expo-router/references/zoom-transitions.md +158 -0
  121. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/SKILL.md +314 -0
  122. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/agents/visual-grader.md +52 -0
  123. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/references/design-rubric.md +45 -0
  124. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/references/runtime-matrix.md +34 -0
  125. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/check-static.sh +64 -0
  126. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/clean-fixture.sh +56 -0
  127. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/generate_viewer.py +450 -0
  128. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/latest-sdk.sh +46 -0
  129. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/make-fixture.sh +95 -0
  130. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/make-workspace.sh +31 -0
  131. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/snapshot-android.sh +284 -0
  132. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/snapshot-ios.sh +132 -0
  133. package/dist/templates/default/apps/mobile/.agents/skills/expo-skill-eval/scripts/snapshot-web.sh +61 -0
  134. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/SKILL.md +101 -0
  135. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/agents/openai.yaml +4 -0
  136. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/drop-in-replacements.md +27 -0
  137. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/jetpack-compose.md +73 -0
  138. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/swift-ui.md +73 -0
  139. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/references/universal.md +104 -0
  140. package/dist/templates/default/apps/mobile/.agents/skills/expo-ui/scripts/list-components.js +193 -0
  141. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/SKILL.md +150 -0
  142. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/agents/openai.yaml +4 -0
  143. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/expo-av-to-audio.md +132 -0
  144. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/expo-av-to-video.md +160 -0
  145. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/native-tabs.md +124 -0
  146. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/new-architecture.md +79 -0
  147. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/react-19.md +79 -0
  148. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/react-compiler.md +59 -0
  149. package/dist/templates/default/apps/mobile/.agents/skills/expo-upgrade/references/react-navigation-to-expo-router.md +61 -0
  150. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/SKILL.md +91 -0
  151. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/agents/openai.yaml +4 -0
  152. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/false-friends.md +119 -0
  153. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/native-patterns.md +39 -0
  154. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/run-as-goal.md +48 -0
  155. package/dist/templates/default/apps/mobile/.agents/skills/expo-web-to-native/references/verify-on-device.md +45 -0
  156. package/dist/templates/default/apps/mobile/.agents/skills/ios-simulator/SKILL.md +32 -0
  157. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/POWER.md +172 -0
  158. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/SKILL.md +238 -0
  159. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/agents/openai.yaml +4 -0
  160. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-analyze-app.md +208 -0
  161. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-analyze-js.md +264 -0
  162. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-barrel-exports.md +250 -0
  163. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-code-splitting.md +255 -0
  164. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-hermes-mmap.md +167 -0
  165. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-library-size.md +164 -0
  166. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-native-assets.md +208 -0
  167. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-r8-android.md +231 -0
  168. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/bundle-tree-shaking.md +215 -0
  169. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/bundle-treemap-source-map-explorer.png +0 -0
  170. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/controlled-textinput-pingpong.png +0 -0
  171. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/devtools-flamegraph.png +0 -0
  172. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/emerge-xray-ios.png +0 -0
  173. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/expo-atlas-treemap.png +0 -0
  174. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/flashlight-flatlist-vs-flashlist.png +0 -0
  175. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/fps-drop-graph.png +0 -0
  176. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/memory-heap-snapshot.png +0 -0
  177. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/tti-warm-start-diagram.png +0 -0
  178. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/view-hierarchy-flattening.png +0 -0
  179. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/xcode-instruments-templates.png +0 -0
  180. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/images/xcode-thread-view.png +0 -0
  181. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-animations-reanimated.md +273 -0
  182. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-atomic-state.md +190 -0
  183. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-bottomsheet.md +339 -0
  184. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-concurrent-react.md +238 -0
  185. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-lists-flatlist-flashlist.md +223 -0
  186. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-measure-fps.md +178 -0
  187. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-memory-leaks.md +168 -0
  188. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-profile-react.md +138 -0
  189. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-react-compiler.md +261 -0
  190. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/js-uncontrolled-components.md +219 -0
  191. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-android-16kb-alignment.md +114 -0
  192. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-measure-tti.md +221 -0
  193. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-memory-leaks.md +206 -0
  194. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-memory-patterns.md +240 -0
  195. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-platform-setup.md +112 -0
  196. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-profiling.md +140 -0
  197. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-sdks-over-polyfills.md +192 -0
  198. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-threading-model.md +230 -0
  199. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-turbo-modules.md +210 -0
  200. package/dist/templates/default/apps/mobile/.agents/skills/react-native-best-practices/references/native-view-flattening.md +180 -0
  201. package/dist/templates/default/apps/mobile/AGENTS.md +41 -0
  202. package/dist/templates/default/apps/mobile/app.json +38 -0
  203. package/dist/templates/default/apps/mobile/assets/expo.icon/Assets/expo-symbol 2.svg +3 -0
  204. package/dist/templates/default/apps/mobile/assets/expo.icon/Assets/grid.png +0 -0
  205. package/dist/templates/default/apps/mobile/assets/expo.icon/icon.json +40 -0
  206. package/dist/templates/default/apps/mobile/assets/images/android-icon-background.png +0 -0
  207. package/dist/templates/default/apps/mobile/assets/images/android-icon-foreground.png +0 -0
  208. package/dist/templates/default/apps/mobile/assets/images/android-icon-monochrome.png +0 -0
  209. package/dist/templates/default/apps/mobile/assets/images/icon.png +0 -0
  210. package/dist/templates/default/apps/mobile/assets/images/splash-icon.png +0 -0
  211. package/dist/templates/default/apps/mobile/eslint.config.js +10 -0
  212. package/dist/templates/default/apps/mobile/package.json +43 -0
  213. package/dist/templates/default/apps/mobile/skills-lock.json +185 -0
  214. package/dist/templates/default/apps/mobile/src/app/_layout.tsx +5 -0
  215. package/dist/templates/default/apps/mobile/src/app/index.tsx +17 -0
  216. package/dist/templates/default/apps/mobile/tsconfig.json +20 -0
  217. package/dist/templates/default/apps/web/.agents/skills/frontend-design/SKILL.md +71 -0
  218. package/dist/templates/default/apps/web/.agents/skills/web-design-guidelines/SKILL.md +39 -0
  219. package/dist/templates/default/apps/web/.env.example +3 -0
  220. package/dist/templates/default/apps/web/components.json +23 -0
  221. package/dist/templates/default/apps/web/eslint.config.ts +21 -0
  222. package/dist/templates/default/apps/web/package.json +39 -0
  223. package/dist/templates/default/apps/web/public/disposabl-logo.svg +8 -0
  224. package/dist/templates/default/apps/web/public/favicon.ico +0 -0
  225. package/dist/templates/default/apps/web/public/manifest.json +25 -0
  226. package/dist/templates/default/apps/web/skills-lock.json +17 -0
  227. package/dist/templates/default/apps/web/src/index.css +92 -0
  228. package/dist/templates/default/apps/web/src/routeTree.gen.ts +282 -0
  229. package/dist/templates/default/apps/web/src/router/__root.tsx +63 -0
  230. package/dist/templates/default/apps/web/src/router/_authenticated/dashboard.tsx +9 -0
  231. package/dist/templates/default/apps/web/src/router/_authenticated/todos/$id.tsx +27 -0
  232. package/dist/templates/default/apps/web/src/router/_authenticated/todos/index.tsx +33 -0
  233. package/dist/templates/default/apps/web/src/router/index.tsx +15 -0
  234. package/dist/templates/default/apps/web/src/router.tsx +20 -0
  235. package/dist/templates/default/apps/web/tsconfig.json +33 -0
  236. package/dist/templates/default/apps/web/tsr.config.json +6 -0
  237. package/dist/templates/default/apps/web/vite.config.ts +67 -0
  238. package/dist/templates/default/bun.lock +3932 -0
  239. package/dist/templates/default/bunfig.toml +5 -0
  240. package/dist/templates/default/disposabl.json +5 -0
  241. package/dist/templates/default/gitignore +10 -0
  242. package/dist/templates/default/package.json +31 -10
  243. package/dist/templates/default/packages/backend/.agents/skills/convex/SKILL.md +69 -0
  244. package/dist/templates/default/packages/backend/.agents/skills/convex-add/SKILL.md +26 -0
  245. package/dist/templates/default/packages/backend/.agents/skills/convex-advisor/SKILL.md +32 -0
  246. package/dist/templates/default/packages/backend/.agents/skills/convex-agent/SKILL.md +25 -0
  247. package/dist/templates/default/packages/backend/.agents/skills/convex-auth/SKILL.md +29 -0
  248. package/dist/templates/default/packages/backend/.agents/skills/convex-authz/SKILL.md +36 -0
  249. package/dist/templates/default/packages/backend/.agents/skills/convex-backup/SKILL.md +33 -0
  250. package/dist/templates/default/packages/backend/.agents/skills/convex-billing/SKILL.md +69 -0
  251. package/dist/templates/default/packages/backend/.agents/skills/convex-cost/SKILL.md +29 -0
  252. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/SKILL.md +325 -0
  253. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/agents/openai.yaml +14 -0
  254. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/assets/icon.svg +3 -0
  255. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/advanced-patterns.md +146 -0
  256. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/hybrid-components.md +38 -0
  257. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/local-components.md +39 -0
  258. package/dist/templates/default/packages/backend/.agents/skills/convex-create-component/references/packaged-components.md +54 -0
  259. package/dist/templates/default/packages/backend/.agents/skills/convex-crons/SKILL.md +23 -0
  260. package/dist/templates/default/packages/backend/.agents/skills/convex-deploy-guard/SKILL.md +29 -0
  261. package/dist/templates/default/packages/backend/.agents/skills/convex-design/SKILL.md +30 -0
  262. package/dist/templates/default/packages/backend/.agents/skills/convex-docs/SKILL.md +31 -0
  263. package/dist/templates/default/packages/backend/.agents/skills/convex-domains/SKILL.md +26 -0
  264. package/dist/templates/default/packages/backend/.agents/skills/convex-env/SKILL.md +24 -0
  265. package/dist/templates/default/packages/backend/.agents/skills/convex-expert/SKILL.md +38 -0
  266. package/dist/templates/default/packages/backend/.agents/skills/convex-explain-app/SKILL.md +29 -0
  267. package/dist/templates/default/packages/backend/.agents/skills/convex-improve-convex-plugin/SKILL.md +24 -0
  268. package/dist/templates/default/packages/backend/.agents/skills/convex-insights/SKILL.md +32 -0
  269. package/dist/templates/default/packages/backend/.agents/skills/convex-launch-readiness/SKILL.md +35 -0
  270. package/dist/templates/default/packages/backend/.agents/skills/convex-migrate/SKILL.md +23 -0
  271. package/dist/templates/default/packages/backend/.agents/skills/convex-migrate-rehearse/SKILL.md +31 -0
  272. package/dist/templates/default/packages/backend/.agents/skills/convex-monitor/SKILL.md +22 -0
  273. package/dist/templates/default/packages/backend/.agents/skills/convex-optimize/SKILL.md +26 -0
  274. package/dist/templates/default/packages/backend/.agents/skills/convex-quickstart/SKILL.md +29 -0
  275. package/dist/templates/default/packages/backend/.agents/skills/convex-quickstart/agents/openai.yaml +14 -0
  276. package/dist/templates/default/packages/backend/.agents/skills/convex-quickstart/assets/icon.svg +4 -0
  277. package/dist/templates/default/packages/backend/.agents/skills/convex-reviewer/SKILL.md +26 -0
  278. package/dist/templates/default/packages/backend/.agents/skills/convex-seed/SKILL.md +23 -0
  279. package/dist/templates/default/packages/backend/.agents/skills/convex-self-heal/SKILL.md +38 -0
  280. package/dist/templates/default/packages/backend/.agents/skills/convex-sentinel/SKILL.md +25 -0
  281. package/dist/templates/default/packages/backend/.agents/skills/convex-suggest/SKILL.md +27 -0
  282. package/dist/templates/default/packages/backend/.agents/skills/convex-test/SKILL.md +23 -0
  283. package/dist/templates/default/packages/backend/.agents/skills/convex-verify/SKILL.md +34 -0
  284. package/dist/templates/default/packages/backend/.prettierignore +4 -0
  285. package/dist/templates/default/packages/backend/AGENTS.md +18 -0
  286. package/dist/templates/default/packages/backend/CLAUDE.md +13 -0
  287. package/dist/templates/default/packages/backend/README.md +25 -0
  288. package/dist/templates/default/packages/backend/convex/_generated/ai/ai-files.state.json +6 -0
  289. package/dist/templates/default/packages/backend/convex/_generated/ai/guidelines.md +286 -0
  290. package/dist/templates/default/packages/backend/convex/_generated/api.d.ts +66 -0
  291. package/dist/templates/default/packages/backend/convex/_generated/api.js +23 -0
  292. package/dist/templates/default/packages/backend/convex/_generated/dataModel.d.ts +60 -0
  293. package/dist/templates/default/packages/backend/convex/_generated/server.d.ts +164 -0
  294. package/dist/templates/default/packages/backend/convex/_generated/server.js +101 -0
  295. package/dist/templates/default/packages/backend/convex/auth.config.ts +14 -0
  296. package/dist/templates/default/packages/backend/convex/auth.ts +15 -0
  297. package/dist/templates/default/packages/backend/convex/convex.config.ts +30 -0
  298. package/dist/templates/default/packages/backend/convex/http.ts +5 -0
  299. package/dist/templates/default/packages/backend/convex/mcp.ts +8 -0
  300. package/dist/templates/default/packages/backend/convex/schema.ts +10 -0
  301. package/dist/templates/default/packages/backend/convex/todos/index.ts +26 -0
  302. package/dist/templates/default/packages/backend/convex/todos/internal.ts +43 -0
  303. package/dist/templates/default/packages/backend/convex/tsconfig.json +27 -0
  304. package/dist/templates/default/packages/backend/convex/users.ts +20 -0
  305. package/dist/templates/default/packages/backend/eslint.config.mjs +62 -0
  306. package/dist/templates/default/packages/backend/package.json +36 -0
  307. package/dist/templates/default/packages/backend/skills-lock.json +203 -0
  308. package/dist/templates/default/packages/disposabl-kit/client/components/ui/accordion.tsx +77 -0
  309. package/dist/templates/default/packages/disposabl-kit/client/components/ui/alert-dialog.tsx +185 -0
  310. package/dist/templates/default/packages/disposabl-kit/client/components/ui/alert.tsx +75 -0
  311. package/dist/templates/default/packages/disposabl-kit/client/components/ui/aspect-ratio.tsx +22 -0
  312. package/dist/templates/default/packages/disposabl-kit/client/components/ui/attachment.tsx +207 -0
  313. package/dist/templates/default/packages/disposabl-kit/client/components/ui/avatar.tsx +106 -0
  314. package/dist/templates/default/packages/disposabl-kit/client/components/ui/badge.tsx +51 -0
  315. package/dist/templates/default/packages/disposabl-kit/client/components/ui/breadcrumb.tsx +121 -0
  316. package/dist/templates/default/packages/disposabl-kit/client/components/ui/bubble.tsx +127 -0
  317. package/dist/templates/default/packages/disposabl-kit/client/components/ui/button-group.tsx +87 -0
  318. package/dist/templates/default/packages/disposabl-kit/client/components/ui/button.tsx +57 -0
  319. package/dist/templates/default/packages/disposabl-kit/client/components/ui/calendar.tsx +241 -0
  320. package/dist/templates/default/packages/disposabl-kit/client/components/ui/card.tsx +102 -0
  321. package/dist/templates/default/packages/disposabl-kit/client/components/ui/carousel.tsx +239 -0
  322. package/dist/templates/default/packages/disposabl-kit/client/components/ui/chart.tsx +368 -0
  323. package/dist/templates/default/packages/disposabl-kit/client/components/ui/checkbox.tsx +27 -0
  324. package/dist/templates/default/packages/disposabl-kit/client/components/ui/code-block.tsx +243 -0
  325. package/dist/templates/default/packages/disposabl-kit/client/components/ui/collapsible.tsx +19 -0
  326. package/dist/templates/default/packages/disposabl-kit/client/components/ui/combobox.tsx +300 -0
  327. package/dist/templates/default/packages/disposabl-kit/client/components/ui/command.tsx +194 -0
  328. package/dist/templates/default/packages/disposabl-kit/client/components/ui/context-menu.tsx +271 -0
  329. package/dist/templates/default/packages/disposabl-kit/client/components/ui/dialog.tsx +156 -0
  330. package/dist/templates/default/packages/disposabl-kit/client/components/ui/direction.tsx +4 -0
  331. package/dist/templates/default/packages/disposabl-kit/client/components/ui/drawer.tsx +224 -0
  332. package/dist/templates/default/packages/disposabl-kit/client/components/ui/dropdown-menu.tsx +269 -0
  333. package/dist/templates/default/packages/disposabl-kit/client/components/ui/empty.tsx +103 -0
  334. package/dist/templates/default/packages/disposabl-kit/client/components/ui/field.tsx +236 -0
  335. package/dist/templates/default/packages/disposabl-kit/client/components/ui/hover-card.tsx +50 -0
  336. package/dist/templates/default/packages/disposabl-kit/client/components/ui/input-group.tsx +158 -0
  337. package/dist/templates/default/packages/disposabl-kit/client/components/ui/input-otp.tsx +83 -0
  338. package/dist/templates/default/packages/disposabl-kit/client/components/ui/input.tsx +19 -0
  339. package/dist/templates/default/packages/disposabl-kit/client/components/ui/item.tsx +201 -0
  340. package/dist/templates/default/packages/disposabl-kit/client/components/ui/kbd.tsx +26 -0
  341. package/dist/templates/default/packages/disposabl-kit/client/components/ui/label.tsx +19 -0
  342. package/dist/templates/default/packages/disposabl-kit/client/components/ui/marker.tsx +70 -0
  343. package/dist/templates/default/packages/disposabl-kit/client/components/ui/menubar.tsx +284 -0
  344. package/dist/templates/default/packages/disposabl-kit/client/components/ui/message-scroller.tsx +128 -0
  345. package/dist/templates/default/packages/disposabl-kit/client/components/ui/message.tsx +91 -0
  346. package/dist/templates/default/packages/disposabl-kit/client/components/ui/native-select.tsx +64 -0
  347. package/dist/templates/default/packages/disposabl-kit/client/components/ui/navigation-menu.tsx +170 -0
  348. package/dist/templates/default/packages/disposabl-kit/client/components/ui/pagination.tsx +133 -0
  349. package/dist/templates/default/packages/disposabl-kit/client/components/ui/popover.tsx +87 -0
  350. package/dist/templates/default/packages/disposabl-kit/client/components/ui/progress.tsx +82 -0
  351. package/dist/templates/default/packages/disposabl-kit/client/components/ui/questionnaire.tsx +330 -0
  352. package/dist/templates/default/packages/disposabl-kit/client/components/ui/radio-group.tsx +35 -0
  353. package/dist/templates/default/packages/disposabl-kit/client/components/ui/resizable.tsx +49 -0
  354. package/dist/templates/default/packages/disposabl-kit/client/components/ui/scroll-area.tsx +51 -0
  355. package/dist/templates/default/packages/disposabl-kit/client/components/ui/select.tsx +201 -0
  356. package/dist/templates/default/packages/disposabl-kit/client/components/ui/separator.tsx +22 -0
  357. package/dist/templates/default/packages/disposabl-kit/client/components/ui/sheet.tsx +132 -0
  358. package/dist/templates/default/packages/disposabl-kit/client/components/ui/sidebar.tsx +723 -0
  359. package/dist/templates/default/packages/disposabl-kit/client/components/ui/skeleton.tsx +13 -0
  360. package/dist/templates/default/packages/disposabl-kit/client/components/ui/slider.tsx +51 -0
  361. package/dist/templates/default/packages/disposabl-kit/client/components/ui/spinner.tsx +16 -0
  362. package/dist/templates/default/packages/disposabl-kit/client/components/ui/switch.tsx +31 -0
  363. package/dist/templates/default/packages/disposabl-kit/client/components/ui/table.tsx +113 -0
  364. package/dist/templates/default/packages/disposabl-kit/client/components/ui/tabs.tsx +81 -0
  365. package/dist/templates/default/packages/disposabl-kit/client/components/ui/textarea.tsx +17 -0
  366. package/dist/templates/default/packages/disposabl-kit/client/components/ui/toast.tsx +229 -0
  367. package/dist/templates/default/packages/disposabl-kit/client/components/ui/toggle-group.tsx +87 -0
  368. package/dist/templates/default/packages/disposabl-kit/client/components/ui/toggle.tsx +42 -0
  369. package/dist/templates/default/packages/disposabl-kit/client/components/ui/tooltip.tsx +65 -0
  370. package/dist/templates/default/packages/disposabl-kit/client/components/ui/trace.tsx +161 -0
  371. package/dist/templates/default/packages/disposabl-kit/client/hooks/use-mobile.ts +21 -0
  372. package/dist/templates/default/packages/disposabl-kit/client/lib/prerender.ts +89 -0
  373. package/dist/templates/default/packages/disposabl-kit/client/lib/return-to.ts +12 -0
  374. package/dist/templates/default/packages/disposabl-kit/client/lib/utils.ts +1 -0
  375. package/dist/templates/default/packages/disposabl-kit/client/routes/_auth-pages/login.tsx +114 -0
  376. package/dist/templates/default/packages/disposabl-kit/client/routes/_auth-pages/signUp.tsx +120 -0
  377. package/dist/templates/default/packages/disposabl-kit/client/routes/_authenticated/route.tsx +38 -0
  378. package/dist/templates/default/packages/disposabl-kit/client/routes/consent.tsx +137 -0
  379. package/dist/templates/default/packages/disposabl-kit/client/routes/route.tsx +30 -0
  380. package/dist/templates/default/packages/disposabl-kit/client/styles/globals.css +60 -0
  381. package/dist/templates/default/packages/disposabl-kit/client/vite.config.ts +32 -0
  382. package/dist/templates/default/packages/disposabl-kit/components.json +23 -0
  383. package/dist/templates/default/packages/disposabl-kit/eslint.config.js +21 -0
  384. package/dist/templates/default/packages/disposabl-kit/package.json +60 -0
  385. package/dist/templates/default/packages/disposabl-kit/server/http.ts +86 -0
  386. package/dist/templates/default/packages/disposabl-kit/server/lib/functions.ts +40 -0
  387. package/dist/templates/default/packages/disposabl-kit/server/lib/platforms.ts +20 -0
  388. package/dist/templates/default/packages/disposabl-kit/server/lib/static-routes.ts +56 -0
  389. package/dist/templates/default/packages/disposabl-kit/tsconfig.json +17 -0
  390. package/dist/templates/default/patches/@convex-dev%2Fauth@2.0.0-beta.0.patch +310 -0
  391. package/dist/templates/default/patches/@convex-dev%2Fstatic-hosting@0.2.1.patch +187 -0
  392. package/dist/templates/default/tsconfig.json +9 -0
  393. package/dist/templates/default/turbo.json +51 -0
  394. package/package.json +21 -5
  395. package/README.md +0 -34
  396. package/dist/templates/default/README.md +0 -12
  397. package/dist/templates/default/docs/index.html +0 -8
  398. package/dist/templates/default/eslint.config.js +0 -18
  399. package/dist/templates/default/index.ts +0 -14
package/dist/index.js CHANGED
@@ -1,127 +1,512 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // cli/index.ts
3
+ // index.ts
4
4
  import { spawn, spawnSync } from "node:child_process";
5
+ import { existsSync as existsSync2 } from "node:fs";
6
+ import { resolve } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { Command, CommanderError } from "commander";
9
+ import * as p2 from "@clack/prompts";
10
+ // package.json
11
+ var version = "0.1.1";
12
+
13
+ // options.ts
14
+ var platforms = [
15
+ { id: "web", label: "Web", group: "Required", status: "required" },
16
+ { id: "android", label: "Android", group: "Mobile", status: "available" },
17
+ { id: "ios", label: "iOS", group: "Mobile", status: "available" },
18
+ { id: "windows", label: "Windows", group: "Desktop", status: "available" },
19
+ { id: "linux", label: "Linux", group: "Desktop", status: "available" },
20
+ { id: "macos", label: "macOS", group: "Desktop", status: "available" },
21
+ {
22
+ id: "mcp",
23
+ label: "MCP",
24
+ group: "MCP & plugins",
25
+ status: "available",
26
+ description: "Tools for AI assistants"
27
+ },
28
+ {
29
+ id: "openai-plugin",
30
+ label: "OpenAI Plugin",
31
+ description: "Tools and skills for OpenAI",
32
+ group: "MCP & plugins",
33
+ status: "available"
34
+ },
35
+ {
36
+ id: "claude-code-plugin",
37
+ label: "Claude Code Plugin",
38
+ description: "Tools and skills for Claude Code",
39
+ group: "MCP & plugins",
40
+ status: "available"
41
+ },
42
+ { id: "api", label: "API", group: "Coming soon", status: "disabled" },
43
+ { id: "cli", label: "CLI", group: "Coming soon", status: "disabled" },
44
+ {
45
+ id: "python-sdk",
46
+ label: "Python SDK",
47
+ group: "Coming soon",
48
+ status: "disabled"
49
+ },
50
+ {
51
+ id: "typescript-sdk",
52
+ label: "TypeScript SDK",
53
+ group: "Coming soon",
54
+ status: "disabled"
55
+ }
56
+ ];
57
+ var platformDependencies = {
58
+ "openai-plugin": ["mcp"],
59
+ "claude-code-plugin": ["mcp"]
60
+ };
61
+ var features = [
62
+ { id: "docs", label: "Docs", hint: "apps/docs" },
63
+ { id: "blog", label: "Blog", hint: "apps/blog" },
64
+ { id: "changelog", label: "Changelog", hint: "apps/changelog" },
65
+ {
66
+ id: "authentication",
67
+ label: "Authentication",
68
+ hint: "Always included"
69
+ }
70
+ ];
71
+ var requiredFeatures = ["authentication"];
72
+ var parseList = (input) => input.split(",").map((value) => value.trim());
73
+ function selectPlatforms(input = "web") {
74
+ const requested = parseList(input);
75
+ for (const id of requested) {
76
+ const option = platforms.find((platform) => platform.id === id);
77
+ if (!option)
78
+ throw new Error("Unknown platform " + JSON.stringify(id) + ". Use --list-options to see valid IDs.");
79
+ if (option.status === "disabled")
80
+ throw new Error(option.label + " is not available yet and cannot be selected.");
81
+ }
82
+ for (const [plugin, dependencies] of Object.entries(platformDependencies)) {
83
+ if (requested.includes(plugin))
84
+ requested.push(...dependencies);
85
+ }
86
+ return platforms.filter((option) => option.id === "web" || requested.includes(option.id)).map((option) => option.id);
87
+ }
88
+ function selectFeatures(input = "none") {
89
+ const requested = input === "none" ? [] : parseList(input);
90
+ for (const id of requested) {
91
+ if (!features.some((feature) => feature.id === id)) {
92
+ throw new Error("Unknown feature " + JSON.stringify(id) + ". Use --features none or --list-options to see valid IDs.");
93
+ }
94
+ }
95
+ return features.filter((option) => requiredFeatures.includes(option.id) || requested.includes(option.id)).map((option) => option.id);
96
+ }
97
+ function selectedFolders(config) {
98
+ const result = ["apps/web"];
99
+ if (config.platforms.some((platform) => platform === "android" || platform === "ios"))
100
+ result.push("apps/mobile");
101
+ if (config.platforms.some((platform) => ["windows", "linux", "macos"].includes(platform)))
102
+ result.push("apps/desktop");
103
+ for (const feature of config.features) {
104
+ if (feature !== "authentication")
105
+ result.push("apps/" + feature);
106
+ }
107
+ return result;
108
+ }
109
+ function validateName(name) {
110
+ if (!/^[a-z0-9][a-z0-9._-]*$/.test(name) || name.length > 214 || ["node_modules", "favicon.ico"].includes(name)) {
111
+ return "Use a lowercase project name with letters, numbers, dots, hyphens, or underscores.";
112
+ }
113
+ }
114
+
115
+ // platform-prompt.ts
116
+ import { MultiSelectPrompt } from "@clack/core";
117
+ import * as p from "@clack/prompts";
118
+ import color from "picocolors";
119
+ function createPlatformPrompt(streams = {}) {
120
+ return new MultiSelectPrompt({
121
+ ...streams,
122
+ options: platforms.map((option) => ({
123
+ value: option.id,
124
+ label: option.label,
125
+ disabled: option.status !== "available",
126
+ description: "description" in option ? option.description : ""
127
+ })),
128
+ required: false,
129
+ render() {
130
+ const explicit = this.value ?? [];
131
+ const selected = selectPlatforms(explicit.length ? explicit.join(",") : "web");
132
+ const title = `${p.symbol(this.state)} Choose platforms`;
133
+ const bar = color.dim(p.S_BAR);
134
+ if (this.state === "submit") {
135
+ const labels = this.options.filter((option) => selected.includes(option.value)).map((option) => option.label.trim());
136
+ return `${title}
137
+ ${bar} ${color.dim(labels.join(", ") || "Web only")}`;
138
+ }
139
+ if (this.state === "cancel")
140
+ return `${title}
141
+ ${bar} ${color.dim("Cancelled")}`;
142
+ const style = (option, active) => {
143
+ const checked = selected.includes(option.value);
144
+ const hint = option.value === "web" ? "Required" : option.disabled ? "Unavailable" : option.description + (option.value.endsWith("-plugin") ? " · Requires MCP" : "");
145
+ const checkbox = checked ? p.S_CHECKBOX_SELECTED : active ? p.S_CHECKBOX_ACTIVE : p.S_CHECKBOX_INACTIVE;
146
+ const label = `${checkbox} ${option.label}`;
147
+ return (option.value === "web" ? color.green(label) : option.disabled ? color.dim(label) : active ? color.cyan(label) : label) + (hint ? color.dim(` (${hint})`) : "");
148
+ };
149
+ const unavailable = this.options.filter((option) => option.disabled && option.value !== "web");
150
+ const rows = p.limitOptions({
151
+ options: this.options.filter((option) => !unavailable.includes(option)),
152
+ cursor: this.cursor,
153
+ output: streams.output,
154
+ columnPadding: 3,
155
+ rowPadding: 6 + unavailable.length,
156
+ style
157
+ });
158
+ return [
159
+ title,
160
+ ...rows.map((row) => `${bar} ${row}`),
161
+ ...unavailable.map((option) => `${bar} ${style(option, false)}`),
162
+ `${bar} ${color.dim("↑/↓ move · Space select · Enter confirm")}`,
163
+ color.dim(p.S_BAR_END)
164
+ ].join(`
165
+ `);
166
+ }
167
+ });
168
+ }
169
+
170
+ // project-setup.ts
171
+ import { clearScreenDown, cursorTo, moveCursor } from "node:readline";
172
+ import color2 from "picocolors";
173
+ import { performance } from "node:perf_hooks";
174
+ function setupTable(name, config, status, columns = 80) {
175
+ const installation = status.installation + (status.elapsedSeconds === undefined ? "" : ` (${status.elapsedSeconds.toFixed(2)}s)`);
176
+ const rows = [
177
+ ["App", name],
178
+ ["Disposabl Version", config.version],
179
+ [
180
+ "Platforms",
181
+ config.platforms.map((id) => platforms.find((p) => p.id === id).label).join(", ")
182
+ ],
183
+ [
184
+ "Features",
185
+ config.features.map((id) => features.find((f) => f.id === id).label).join(", ") || "None"
186
+ ],
187
+ ["Installation", installation]
188
+ ];
189
+ const labelWidth = Math.max(...rows.map(([label]) => label.length));
190
+ const padding = labelWidth + 7;
191
+ const contentWidth = Math.max(46, ...rows.map(([, value]) => value.length + padding));
192
+ const width = Math.max(24, Math.min(columns - 1, 80, contentWidth));
193
+ const valueWidth = width - padding;
194
+ const border = color2.dim("─".repeat(width - 2));
195
+ const result = [color2.bold("App Setup"), `┌${border}┐`];
196
+ for (const [label, value] of rows) {
197
+ let remaining = value;
198
+ let first = true;
199
+ do {
200
+ let end = valueWidth;
201
+ if (remaining.length > end) {
202
+ const space = remaining.lastIndexOf(" ", end);
203
+ if (space > 0)
204
+ end = space;
205
+ }
206
+ const part = remaining.slice(0, end);
207
+ remaining = remaining.slice(end).trimStart();
208
+ const cell = part.padEnd(valueWidth);
209
+ const isStatus = label === "Installation";
210
+ const styled = isStatus && status.installation === "Complete" ? color2.green(cell) : isStatus && status.installation === "Failed" ? color2.red(cell) : label === "App" ? color2.bold(cell) : cell;
211
+ result.push(`│ ${(first ? label : "").padEnd(labelWidth)} │ ${styled} │`);
212
+ first = false;
213
+ } while (remaining);
214
+ }
215
+ result.push(`└${border}┘`);
216
+ return result.join(`
217
+ `);
218
+ }
219
+ function projectSetup(name, config) {
220
+ const live = Boolean(process.stdout.isTTY);
221
+ const status = { installation: "Pending" };
222
+ let lines = 0;
223
+ let started;
224
+ let timer;
225
+ function render() {
226
+ if (live && lines) {
227
+ moveCursor(process.stdout, 0, -lines);
228
+ cursorTo(process.stdout, 0);
229
+ clearScreenDown(process.stdout);
230
+ }
231
+ const frame = setupTable(name, config, status, process.stdout.columns);
232
+ process.stdout.write(frame + `
233
+ `);
234
+ lines = frame.split(`
235
+ `).length;
236
+ }
237
+ if (live)
238
+ render();
239
+ return {
240
+ live,
241
+ installing() {
242
+ started = performance.now();
243
+ status.installation = "Installing";
244
+ const tick = () => {
245
+ status.elapsedSeconds = (performance.now() - started) / 1000;
246
+ if (live)
247
+ render();
248
+ };
249
+ tick();
250
+ if (live)
251
+ timer = setInterval(tick, 100);
252
+ },
253
+ finish(next) {
254
+ clearInterval(timer);
255
+ Object.assign(status, next);
256
+ if (started !== undefined)
257
+ status.elapsedSeconds = (performance.now() - started) / 1000;
258
+ render();
259
+ }
260
+ };
261
+ }
262
+
263
+ // scaffold.ts
5
264
  import {
6
265
  cp,
7
266
  mkdir,
8
- readdir,
9
267
  readFile,
268
+ readdir,
10
269
  rename,
270
+ rm,
11
271
  writeFile
12
272
  } from "node:fs/promises";
13
- import { resolve } from "node:path";
14
- import { fileURLToPath } from "node:url";
15
- import { Command } from "commander";
16
- import prompts from "prompts";
17
- // cli/package.json
18
- var version = "0.0.4";
273
+ import { existsSync } from "node:fs";
274
+ import { join } from "node:path";
275
+ async function createProject(template, destination, name, config) {
276
+ config = {
277
+ ...config,
278
+ features: selectFeatures(config.features.join(",") || "none")
279
+ };
280
+ const folders = selectedFolders(config);
281
+ for (const folder of folders) {
282
+ if (!existsSync(join(template, folder, "package.json"))) {
283
+ throw new Error("The bundled starter is missing " + folder + "/package.json. Rebuild the CLI.");
284
+ }
285
+ }
286
+ await mkdir(destination);
287
+ try {
288
+ for (const entry of await readdir(template)) {
289
+ await cp(join(template, entry), join(destination, entry), {
290
+ recursive: true,
291
+ force: false,
292
+ errorOnExist: true
293
+ });
294
+ }
295
+ for (const entry of await readdir(join(destination, "apps"))) {
296
+ if (!folders.includes("apps/" + entry))
297
+ await rm(join(destination, "apps", entry), {
298
+ recursive: true,
299
+ force: true
300
+ });
301
+ }
302
+ if (existsSync(join(destination, "gitignore"))) {
303
+ await rename(join(destination, "gitignore"), join(destination, ".gitignore"));
304
+ }
305
+ const manifestPath = join(destination, "package.json");
306
+ const manifest = JSON.parse(await readFile(manifestPath, "utf8"));
307
+ manifest.name = name;
308
+ await writeFile(manifestPath, JSON.stringify(manifest, null, 2) + `
309
+ `);
310
+ await writeFile(join(destination, "disposabl.json"), JSON.stringify(config, null, 2) + `
311
+ `);
312
+ } catch (error) {
313
+ await rm(destination, { recursive: true, force: true });
314
+ throw error;
315
+ }
316
+ return folders;
317
+ }
19
318
 
20
- // cli/index.ts
21
- var program = new Command("create-disposabl-app").description("Create a Disposabl app from the bundled starter.").version(version, "-v, --version").argument("[appname]", "Name of the new app").option("-y, --yes", "Use defaults without asking questions").option("--docs", "Include Docs").option("--skip-install", "Skip bun install").helpOption("-h, --help").parse();
22
- var validName = (name) => /^[a-z0-9][a-z0-9._-]*$/.test(name) && name.length <= 214 && !["node_modules", "favicon.ico"].includes(name);
23
- try {
24
- const options = program.opts();
25
- let name = program.args[0];
26
- let docs = Boolean(options.docs);
27
- if (process.stdin.isTTY && !options.yes) {
28
- const answers = await prompts([
29
- {
30
- type: name ? null : "text",
31
- name: "name",
32
- message: "What is your project named?",
33
- initial: "my-app",
34
- validate: (value) => validName(value) || "Use a lowercase app name without spaces."
35
- },
36
- {
37
- type: "multiselect",
38
- name: "platforms",
39
- message: "Which platforms?",
40
- choices: [
41
- {
42
- title: "Web (required)",
43
- value: "web",
44
- selected: true,
45
- disabled: true
46
- }
47
- ],
48
- min: 1,
49
- warn: "Web is required.",
50
- onRender() {
51
- for (const choice of this.value) {
52
- if (choice.value === "web")
53
- choice.selected = true;
54
- }
55
- },
56
- hint: "Web is required. Press Enter to continue."
57
- },
58
- {
59
- type: options.docs ? null : "multiselect",
60
- name: "features",
61
- message: "Which features?",
62
- choices: [{ title: "Docs", value: "docs" }],
63
- hint: "Space to select. Enter to continue without optional features."
64
- }
65
- ], {
66
- onCancel: () => {
67
- console.log("Cancelled.");
68
- process.exit(0);
69
- }
70
- });
71
- name ??= answers.name;
72
- docs ||= answers.features?.includes("docs") ?? false;
73
- }
74
- if (!name || !validName(name))
75
- throw new Error("Provide a lowercase app name, or run with --help.");
76
- if (!options.skipInstall && spawnSync("bun", ["--version"]).status !== 0)
77
- throw new Error("Install Bun from https://bun.com first.");
78
- const dir = resolve(name);
79
- await mkdir(dir);
80
- console.log(`
81
- Creating a new Disposabl app in ${dir}.
319
+ // index.ts
320
+ var jsonOutput = process.argv.slice(2).includes("--json");
321
+ var program = new Command("create-disposabl-app").description("Create a Disposabl starter. Web and authentication are always included.").version(version, "-v, --version").argument("[appname]", "App name and new directory").option("--platforms <ids>", "Comma-separated platform IDs; Web is always included").option("--features <ids>", "Comma-separated optional feature IDs, or none; authentication is always included").option("-y, --yes", "Skip prompts; include Web and authentication, with no optional features").option("--skip-install", "Create files without running bun install").option("--list-options", "List every platform and feature, including disabled choices").option("--json", "Skip prompts and emit a JSON result or error; install logs go to stderr").helpOption("-h, --help").addHelpText("after", `
322
+ Platforms:
323
+ web (required), android, ios, windows, linux, macos, mcp,
324
+ openai-plugin, claude-code-plugin
325
+ Either plugin automatically includes MCP.
326
+ Disabled: api, cli, python-sdk, typescript-sdk
327
+
328
+ Optional features:
329
+ docs, blog, changelog
330
+ Authentication is always included, including with --features none.
82
331
 
83
- Using bun.
332
+ Examples:
333
+ bun create disposabl-app@latest
334
+ bun create disposabl-app@latest my-app --yes
335
+ bun create disposabl-app@latest my-app --platforms web,android,ios,mcp --features docs --yes
336
+ bun create disposabl-app@latest my-app --platforms web --features none --skip-install --json
337
+ bun create disposabl-app@latest --list-options --json
84
338
 
85
- Platform: Web
86
- Features: ${docs ? "Docs" : "None"}
339
+ Without a TTY, the CLI never prompts. Supply an app name.
340
+ Platform and feature choices are saved in disposabl.json.
341
+ The starter includes web and backend authentication code. No appId or Convex deployment is created.
342
+ `).configureOutput({ writeErr: () => {} }).exitOverride();
343
+
344
+ class Cancelled extends Error {
345
+ }
346
+ function answer(value) {
347
+ if (p2.isCancel(value))
348
+ throw new Cancelled("Cancelled. No files were created.");
349
+ return value;
350
+ }
351
+ function showOptions(json) {
352
+ if (json) {
353
+ console.log(JSON.stringify({
354
+ platforms,
355
+ platformDependencies,
356
+ features,
357
+ requiredFeatures,
358
+ defaults: { platforms: ["web"], features: selectFeatures() },
359
+ folders: {
360
+ web: "apps/web",
361
+ android: "apps/mobile",
362
+ ios: "apps/mobile",
363
+ windows: "apps/desktop",
364
+ linux: "apps/desktop",
365
+ macos: "apps/desktop",
366
+ docs: "apps/docs",
367
+ blog: "apps/blog",
368
+ changelog: "apps/changelog"
369
+ },
370
+ configOnly: ["mcp", "openai-plugin", "claude-code-plugin"]
371
+ }, null, 2));
372
+ return;
373
+ }
374
+ console.log(`Platforms
375
+ `);
376
+ for (const option of platforms)
377
+ console.log(" " + option.id.padEnd(21) + option.label.padEnd(20) + option.status);
378
+ console.log(`
379
+ OpenAI Plugin and Claude Code Plugin automatically include MCP.`);
380
+ console.log(`
381
+ Features
87
382
  `);
88
- const template = fileURLToPath(new URL("./templates/default", import.meta.url));
89
- for (const file of await readdir(template)) {
90
- if (file === "docs" && !docs)
91
- continue;
92
- await cp(resolve(template, file), resolve(dir, file), {
93
- recursive: true,
94
- force: false,
95
- errorOnExist: true
383
+ for (const option of features)
384
+ console.log(" " + option.id.padEnd(21) + option.hint);
385
+ console.log(`
386
+ Web and authentication are always included. No optional features are selected by default. Use --platforms and --features with the IDs above.`);
387
+ }
388
+ async function install(directory, interactive) {
389
+ await new Promise((done, reject) => {
390
+ const child = spawn("bun", ["install"], {
391
+ cwd: directory,
392
+ stdio: ["ignore", "pipe", "pipe"],
393
+ env: { ...process.env, NODE_ENV: "development" }
96
394
  });
395
+ let detail = "";
396
+ const onData = (chunk) => {
397
+ detail = (detail + chunk.toString()).slice(-4000);
398
+ if (!interactive)
399
+ process.stderr.write(chunk);
400
+ };
401
+ child.stdout.on("data", onData);
402
+ child.stderr.on("data", onData);
403
+ child.once("error", reject);
404
+ child.once("close", (code) => code === 0 ? done() : reject(new Error("bun install failed. The project was created at " + directory + `. Run bun install there to retry.
405
+ ` + detail.trim())));
406
+ });
407
+ }
408
+ async function main() {
409
+ program.parse();
410
+ const options = program.opts();
411
+ if (options.listOptions)
412
+ return showOptions(Boolean(options.json));
413
+ const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY && !p2.isCI() && !options.yes && !options.json);
414
+ let chosenPlatforms = selectPlatforms(options.platforms);
415
+ let chosenFeatures = selectFeatures(options.features);
416
+ let name = program.args[0];
417
+ if (interactive) {
418
+ if (!name)
419
+ name = answer(await p2.text({
420
+ message: "App name",
421
+ placeholder: "my-app",
422
+ defaultValue: "my-app",
423
+ validate: (value) => validateName(value ?? "") || (existsSync2(resolve(value ?? "")) ? "That directory already exists. Choose a new name." : undefined)
424
+ }));
97
425
  }
98
- await rename(resolve(dir, "gitignore"), resolve(dir, ".gitignore"));
99
- const manifestPath = resolve(dir, "package.json");
100
- const manifest = JSON.parse(await readFile(manifestPath, "utf8"));
101
- manifest.name = name;
102
- await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}
103
- `);
104
- if (!options.skipInstall) {
105
- await new Promise((done, reject) => {
106
- const child = spawn("bun", ["install"], {
107
- cwd: dir,
108
- stdio: "inherit",
109
- env: { ...process.env, NODE_ENV: "development" }
110
- });
111
- child.once("error", reject);
112
- child.once("close", (code) => code === 0 ? done() : reject(new Error(`Run bun install inside ${name} to retry.`)));
426
+ if (!name)
427
+ throw new Error("Provide an app name in non-interactive mode. Example: bun create disposabl-app@latest my-app --platforms web --features none --yes");
428
+ const invalidName = validateName(name);
429
+ if (invalidName)
430
+ throw new Error(invalidName);
431
+ const directory = resolve(name);
432
+ if (existsSync2(directory))
433
+ throw new Error("Directory already exists: " + directory + ". Choose a new name; existing files are never overwritten.");
434
+ if (interactive && options.platforms === undefined) {
435
+ const selected = answer(await createPlatformPrompt().prompt() ?? []);
436
+ chosenPlatforms = selectPlatforms(selected.length ? selected.join(",") : "web");
437
+ }
438
+ if (interactive && options.features === undefined) {
439
+ const selected = answer(await p2.multiselect({
440
+ message: "Choose optional features (authentication is always included)",
441
+ options: features.filter((feature) => !requiredFeatures.includes(feature.id)).map((feature) => ({
442
+ value: feature.id,
443
+ label: feature.label,
444
+ hint: feature.hint
445
+ })),
446
+ required: false
447
+ }));
448
+ chosenFeatures = selectFeatures(selected.length ? selected.join(",") : "none");
449
+ }
450
+ const config = {
451
+ version,
452
+ platforms: chosenPlatforms,
453
+ features: chosenFeatures
454
+ };
455
+ const setup = options.json ? undefined : projectSetup(name, config);
456
+ let installationStarted = false;
457
+ try {
458
+ if (!options.skipInstall && spawnSync("bun", ["--version"], { stdio: "ignore" }).status !== 0)
459
+ throw new Error("Install Bun first, or pass --skip-install to create the files only.");
460
+ const template = fileURLToPath(new URL("./templates/default", import.meta.url));
461
+ await createProject(template, directory, name, config);
462
+ if (!options.skipInstall) {
463
+ installationStarted = true;
464
+ setup?.installing();
465
+ await install(directory, Boolean(setup?.live));
466
+ }
467
+ setup?.finish({
468
+ installation: options.skipInstall ? "Skipped" : "Complete"
469
+ });
470
+ } catch (error) {
471
+ setup?.finish({
472
+ installation: installationStarted ? "Failed" : "Not started"
113
473
  });
474
+ throw error;
114
475
  }
115
- console.log(`
116
- Success! Created ${name} at ${dir}
117
-
118
- Get started:
476
+ const folders = selectedFolders(config);
477
+ if (options.json) {
478
+ console.log(JSON.stringify({
479
+ status: "created",
480
+ name,
481
+ directory,
482
+ configFile: "disposabl.json",
483
+ ...config,
484
+ folders,
485
+ installed: !options.skipInstall
486
+ }, null, 2));
487
+ } else {
488
+ console.log(`
489
+ Next steps
119
490
 
120
- cd ${name}
121
- ${options.skipInstall ? ` bun install
122
- ` : ""} bun run dev
491
+ cd ` + name + `
492
+ bun run dev
123
493
  `);
494
+ }
495
+ }
496
+ try {
497
+ await main();
124
498
  } catch (error) {
125
- console.error(error instanceof Error ? error.message : String(error));
126
- process.exitCode = 1;
499
+ if (error instanceof CommanderError && error.exitCode === 0) {
500
+ process.exitCode = 0;
501
+ } else if (error instanceof Cancelled) {
502
+ p2.cancel(error.message);
503
+ process.exitCode = 130;
504
+ } else {
505
+ const message = error instanceof Error ? error.message : String(error);
506
+ if (jsonOutput)
507
+ console.log(JSON.stringify({ status: "error", message }));
508
+ else
509
+ console.error("Error: " + message);
510
+ process.exitCode = 1;
511
+ }
127
512
  }
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Disposabl
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,5 @@
1
+ {
2
+ "singleQuote": true,
3
+ "printWidth": 80,
4
+ "sortPackageJson": false
5
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
3
+ "categories": {
4
+ "correctness": "warn"
5
+ }
6
+ }