biucingcli 0.9.1__py3-none-any.whl

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 (269) hide show
  1. biucingcli/__init__.py +5 -0
  2. biucingcli/cli.py +849 -0
  3. biucingcli/template_data/android/template/.editorconfig +9 -0
  4. biucingcli/template_data/android/template/.gitignore +26 -0
  5. biucingcli/template_data/android/template/.mise.toml +3 -0
  6. biucingcli/template_data/android/template/Brewfile +6 -0
  7. biucingcli/template_data/android/template/Makefile +103 -0
  8. biucingcli/template_data/android/template/README.md +163 -0
  9. biucingcli/template_data/android/template/app/build.gradle.kts +178 -0
  10. biucingcli/template_data/android/template/app/proguard-rules.pro +1 -0
  11. biucingcli/template_data/android/template/app/src/androidTest/java/app/HomeRouteUiTest.kt +21 -0
  12. biucingcli/template_data/android/template/app/src/main/AndroidManifest.xml +18 -0
  13. biucingcli/template_data/android/template/app/src/main/java/app/MainActivity.kt +36 -0
  14. biucingcli/template_data/android/template/app/src/main/res/values/strings.xml +4 -0
  15. biucingcli/template_data/android/template/app/src/main/res/values/themes.xml +8 -0
  16. biucingcli/template_data/android/template/app/src/test/java/app/AppSmokeTest.kt +19 -0
  17. biucingcli/template_data/android/template/build.gradle.kts +27 -0
  18. biucingcli/template_data/android/template/core/designsystem/build.gradle.kts +33 -0
  19. biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/Components.kt +75 -0
  20. biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/DesignTokens.kt +23 -0
  21. biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/Theme.kt +110 -0
  22. biucingcli/template_data/android/template/core/model/build.gradle.kts +26 -0
  23. biucingcli/template_data/android/template/core/model/src/main/java/model/Greeting.kt +6 -0
  24. biucingcli/template_data/android/template/core/model/src/test/java/model/GreetingTest.kt +16 -0
  25. biucingcli/template_data/android/template/core/network/build.gradle.kts +26 -0
  26. biucingcli/template_data/android/template/core/network/src/main/java/network/AppEnvironment.kt +17 -0
  27. biucingcli/template_data/android/template/core/testing/build.gradle.kts +27 -0
  28. biucingcli/template_data/android/template/core/testing/src/main/java/testing/FakeAppEnvironmentProvider.kt +13 -0
  29. biucingcli/template_data/android/template/docs/release-delivery.md +68 -0
  30. biucingcli/template_data/android/template/docs/release-signing.properties.example +20 -0
  31. biucingcli/template_data/android/template/fastlane/.env.example +22 -0
  32. biucingcli/template_data/android/template/fastlane/Appfile +1 -0
  33. biucingcli/template_data/android/template/fastlane/Fastfile +121 -0
  34. biucingcli/template_data/android/template/feature/home/build.gradle.kts +35 -0
  35. biucingcli/template_data/android/template/feature/home/src/main/java/home/HomeRoute.kt +38 -0
  36. biucingcli/template_data/android/template/feature/settings/build.gradle.kts +34 -0
  37. biucingcli/template_data/android/template/feature/settings/src/main/java/settings/SettingsRoute.kt +35 -0
  38. biucingcli/template_data/android/template/gradle/libs.versions.toml +35 -0
  39. biucingcli/template_data/android/template/gradle/verification-metadata.xml +3462 -0
  40. biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.jar +0 -0
  41. biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.jar.sha256 +1 -0
  42. biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.properties +10 -0
  43. biucingcli/template_data/android/template/gradle.properties +4 -0
  44. biucingcli/template_data/android/template/gradlew +252 -0
  45. biucingcli/template_data/android/template/gradlew.bat +94 -0
  46. biucingcli/template_data/android/template/scripts/artifact-info +11 -0
  47. biucingcli/template_data/android/template/scripts/bootstrap +17 -0
  48. biucingcli/template_data/android/template/scripts/doctor +133 -0
  49. biucingcli/template_data/android/template/scripts/setup-android-sdk +23 -0
  50. biucingcli/template_data/android/template/scripts/sync-gradle-wrapper +19 -0
  51. biucingcli/template_data/android/template/scripts/verify-gradle-supply-chain +61 -0
  52. biucingcli/template_data/android/template/scripts/verify-release-artifact +104 -0
  53. biucingcli/template_data/android/template/settings.gradle.kts +25 -0
  54. biucingcli/template_data/android/template.json +146 -0
  55. biucingcli/template_data/apple/template/.gitignore +28 -0
  56. biucingcli/template_data/apple/template/.mise.toml +4 -0
  57. biucingcli/template_data/apple/template/.swiftformat +10 -0
  58. biucingcli/template_data/apple/template/.swiftlint.yml +33 -0
  59. biucingcli/template_data/apple/template/App/Config/ProjectDescriptionHelpers/Module.swift +6 -0
  60. biucingcli/template_data/apple/template/App/Config/XCConfig/Base.xcconfig +4 -0
  61. biucingcli/template_data/apple/template/App/Project.swift +66 -0
  62. biucingcli/template_data/apple/template/App/Targets/App/Resources/.gitkeep +1 -0
  63. biucingcli/template_data/apple/template/App/Targets/App/Sources/AppEntry.swift +9 -0
  64. biucingcli/template_data/apple/template/App/Targets/App/Sources/HomeView.swift +18 -0
  65. biucingcli/template_data/apple/template/App/Targets/App/Sources/HomeViewModel.swift +38 -0
  66. biucingcli/template_data/apple/template/App/Targets/AppTests/Sources/AppTests.swift +59 -0
  67. biucingcli/template_data/apple/template/Brewfile +8 -0
  68. biucingcli/template_data/apple/template/Makefile +128 -0
  69. biucingcli/template_data/apple/template/Packages/AppServices/Package.swift +20 -0
  70. biucingcli/template_data/apple/template/Packages/AppServices/Sources/AppServices/StarterMetadata.swift +52 -0
  71. biucingcli/template_data/apple/template/Packages/DesignSystem/Package.swift +20 -0
  72. biucingcli/template_data/apple/template/Packages/DesignSystem/Sources/DesignSystem/Theme.swift +8 -0
  73. biucingcli/template_data/apple/template/README.md +133 -0
  74. biucingcli/template_data/apple/template/Tuist.swift +8 -0
  75. biucingcli/template_data/apple/template/Workspace.swift +11 -0
  76. biucingcli/template_data/apple/template/docs/release-delivery.md +55 -0
  77. biucingcli/template_data/apple/template/fastlane/.env.example +20 -0
  78. biucingcli/template_data/apple/template/fastlane/Appfile +3 -0
  79. biucingcli/template_data/apple/template/fastlane/Fastfile +126 -0
  80. biucingcli/template_data/apple/template/fastlane/Matchfile +7 -0
  81. biucingcli/template_data/apple/template/scripts/bootstrap +9 -0
  82. biucingcli/template_data/apple/template/scripts/doctor +163 -0
  83. biucingcli/template_data/apple/template/scripts/setup-xcode +6 -0
  84. biucingcli/template_data/apple/template/scripts/test-destination +42 -0
  85. biucingcli/template_data/apple/template/scripts/verify-release-identity +88 -0
  86. biucingcli/template_data/apple/template.json +110 -0
  87. biucingcli/template_data/frontend/template/.dockerignore +8 -0
  88. biucingcli/template_data/frontend/template/.env.example +1 -0
  89. biucingcli/template_data/frontend/template/.gitignore +7 -0
  90. biucingcli/template_data/frontend/template/.npmrc +1 -0
  91. biucingcli/template_data/frontend/template/.prettierignore +2 -0
  92. biucingcli/template_data/frontend/template/.prettierrc.json +4 -0
  93. biucingcli/template_data/frontend/template/Dockerfile +25 -0
  94. biucingcli/template_data/frontend/template/Dockerfile.dev +35 -0
  95. biucingcli/template_data/frontend/template/Dockerfile.dev.full +40 -0
  96. biucingcli/template_data/frontend/template/Makefile +137 -0
  97. biucingcli/template_data/frontend/template/README.md +146 -0
  98. biucingcli/template_data/frontend/template/compose.dev.yaml +29 -0
  99. biucingcli/template_data/frontend/template/eslint.config.js +27 -0
  100. biucingcli/template_data/frontend/template/index.html +12 -0
  101. biucingcli/template_data/frontend/template/nginx.conf +11 -0
  102. biucingcli/template_data/frontend/template/package.json +50 -0
  103. biucingcli/template_data/frontend/template/playwright.production.config.ts +21 -0
  104. biucingcli/template_data/frontend/template/playwright.smoke.config.ts +19 -0
  105. biucingcli/template_data/frontend/template/pnpm-lock.yaml +4054 -0
  106. biucingcli/template_data/frontend/template/public/.gitkeep +1 -0
  107. biucingcli/template_data/frontend/template/scripts/browser-smoke-production +55 -0
  108. biucingcli/template_data/frontend/template/scripts/doctor +46 -0
  109. biucingcli/template_data/frontend/template/src/App.test.tsx +18 -0
  110. biucingcli/template_data/frontend/template/src/App.tsx +5 -0
  111. biucingcli/template_data/frontend/template/src/components/MetricCard.tsx +14 -0
  112. biucingcli/template_data/frontend/template/src/components/TaskPanel.tsx +32 -0
  113. biucingcli/template_data/frontend/template/src/config/env.ts +3 -0
  114. biucingcli/template_data/frontend/template/src/hooks/useProjectOverview.ts +24 -0
  115. biucingcli/template_data/frontend/template/src/index.css +208 -0
  116. biucingcli/template_data/frontend/template/src/main.tsx +11 -0
  117. biucingcli/template_data/frontend/template/src/pages/HomePage.tsx +60 -0
  118. biucingcli/template_data/frontend/template/src/router/AppRouter.tsx +14 -0
  119. biucingcli/template_data/frontend/template/src/services/api/client.ts +33 -0
  120. biucingcli/template_data/frontend/template/src/services/projectOverview.ts +39 -0
  121. biucingcli/template_data/frontend/template/src/test/setup.ts +1 -0
  122. biucingcli/template_data/frontend/template/src/types/projectOverview.ts +22 -0
  123. biucingcli/template_data/frontend/template/src/vite-env.d.ts +9 -0
  124. biucingcli/template_data/frontend/template/tests/browser-smoke.spec.ts +16 -0
  125. biucingcli/template_data/frontend/template/tests/production-browser-smoke.spec.ts +22 -0
  126. biucingcli/template_data/frontend/template/tsconfig.json +21 -0
  127. biucingcli/template_data/frontend/template/vite.config.ts +12 -0
  128. biucingcli/template_data/frontend/template.json +81 -0
  129. biucingcli/template_data/harmonyos/template/.gitignore +21 -0
  130. biucingcli/template_data/harmonyos/template/.mise.toml +2 -0
  131. biucingcli/template_data/harmonyos/template/AppScope/app.json5 +10 -0
  132. biucingcli/template_data/harmonyos/template/AppScope/resources/base/element/string.json +8 -0
  133. biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/background.svg +3 -0
  134. biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/foreground.svg +4 -0
  135. biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/layered_image.json +6 -0
  136. biucingcli/template_data/harmonyos/template/Makefile +106 -0
  137. biucingcli/template_data/harmonyos/template/README.md +152 -0
  138. biucingcli/template_data/harmonyos/template/build-profile.json5 +36 -0
  139. biucingcli/template_data/harmonyos/template/code-linter.json5 +12 -0
  140. biucingcli/template_data/harmonyos/template/docs/release-signing.local.properties.example +14 -0
  141. biucingcli/template_data/harmonyos/template/entry/build-profile.json5 +9 -0
  142. biucingcli/template_data/harmonyos/template/entry/hvigorfile.ts +6 -0
  143. biucingcli/template_data/harmonyos/template/entry/oh-package.json5 +9 -0
  144. biucingcli/template_data/harmonyos/template/entry/src/main/ets/core/config/AppConfig.ets +10 -0
  145. biucingcli/template_data/harmonyos/template/entry/src/main/ets/core/designsystem/Tokens.ets +28 -0
  146. biucingcli/template_data/harmonyos/template/entry/src/main/ets/entryability/EntryAbility.ets +29 -0
  147. biucingcli/template_data/harmonyos/template/entry/src/main/ets/pages/Index.ets +47 -0
  148. biucingcli/template_data/harmonyos/template/entry/src/main/ets/pages/Settings.ets +96 -0
  149. biucingcli/template_data/harmonyos/template/entry/src/main/module.json5 +34 -0
  150. biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/element/color.json +24 -0
  151. biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/element/string.json +12 -0
  152. biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/media/app_icon.svg +5 -0
  153. biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/profile/main_pages.json +6 -0
  154. biucingcli/template_data/harmonyos/template/entry/src/test/List.test.ets +11 -0
  155. biucingcli/template_data/harmonyos/template/hvigor/hvigor-config.json5 +8 -0
  156. biucingcli/template_data/harmonyos/template/hvigorfile.ts +6 -0
  157. biucingcli/template_data/harmonyos/template/oh-package-lock.json5 +19 -0
  158. biucingcli/template_data/harmonyos/template/oh-package.json5 +13 -0
  159. biucingcli/template_data/harmonyos/template/scripts/artifact-info +31 -0
  160. biucingcli/template_data/harmonyos/template/scripts/bootstrap +38 -0
  161. biucingcli/template_data/harmonyos/template/scripts/doctor +147 -0
  162. biucingcli/template_data/harmonyos/template/scripts/lint +105 -0
  163. biucingcli/template_data/harmonyos/template/scripts/release-build +199 -0
  164. biucingcli/template_data/harmonyos/template/scripts/release-preflight +109 -0
  165. biucingcli/template_data/harmonyos/template/scripts/test +28 -0
  166. biucingcli/template_data/harmonyos/template/scripts/verify-release-artifact +173 -0
  167. biucingcli/template_data/harmonyos/template/scripts/verify-supply-chain +70 -0
  168. biucingcli/template_data/harmonyos/template.json +134 -0
  169. biucingcli/template_data/microservice/template/.air.toml +11 -0
  170. biucingcli/template_data/microservice/template/.dockerignore +5 -0
  171. biucingcli/template_data/microservice/template/.gitignore +4 -0
  172. biucingcli/template_data/microservice/template/.mise.toml +3 -0
  173. biucingcli/template_data/microservice/template/Brewfile +7 -0
  174. biucingcli/template_data/microservice/template/Dockerfile +44 -0
  175. biucingcli/template_data/microservice/template/Dockerfile.dev +50 -0
  176. biucingcli/template_data/microservice/template/Makefile +145 -0
  177. biucingcli/template_data/microservice/template/README.md +191 -0
  178. biucingcli/template_data/microservice/template/api/buf.gen.yaml +11 -0
  179. biucingcli/template_data/microservice/template/api/buf.yaml +11 -0
  180. biucingcli/template_data/microservice/template/api/proto/service/v1/service.proto +18 -0
  181. biucingcli/template_data/microservice/template/cmd/server/main.go +81 -0
  182. biucingcli/template_data/microservice/template/compose.dev.yaml +49 -0
  183. biucingcli/template_data/microservice/template/configs/config.yaml +18 -0
  184. biucingcli/template_data/microservice/template/deploy/compose.yaml +35 -0
  185. biucingcli/template_data/microservice/template/deploy/otel-collector.yaml +15 -0
  186. biucingcli/template_data/microservice/template/go.mod +53 -0
  187. biucingcli/template_data/microservice/template/go.sum +138 -0
  188. biucingcli/template_data/microservice/template/internal/config/config.go +112 -0
  189. biucingcli/template_data/microservice/template/internal/config/config_test.go +92 -0
  190. biucingcli/template_data/microservice/template/internal/handler/health.go +25 -0
  191. biucingcli/template_data/microservice/template/internal/handler/ping.go +25 -0
  192. biucingcli/template_data/microservice/template/internal/model/health.go +8 -0
  193. biucingcli/template_data/microservice/template/internal/model/ping.go +7 -0
  194. biucingcli/template_data/microservice/template/internal/repository/.gitkeep +1 -0
  195. biucingcli/template_data/microservice/template/internal/router/router.go +26 -0
  196. biucingcli/template_data/microservice/template/internal/runtime/server.go +116 -0
  197. biucingcli/template_data/microservice/template/internal/runtime/server_test.go +161 -0
  198. biucingcli/template_data/microservice/template/internal/service/health.go +26 -0
  199. biucingcli/template_data/microservice/template/internal/service/ping.go +23 -0
  200. biucingcli/template_data/microservice/template/internal/telemetry/telemetry.go +56 -0
  201. biucingcli/template_data/microservice/template/internal/transport/grpc.go +51 -0
  202. biucingcli/template_data/microservice/template/internal/transport/ping.go +28 -0
  203. biucingcli/template_data/microservice/template/scripts/bootstrap +29 -0
  204. biucingcli/template_data/microservice/template/scripts/doctor +115 -0
  205. biucingcli/template_data/microservice/template/tests/server_test.go +153 -0
  206. biucingcli/template_data/microservice/template.json +114 -0
  207. biucingcli/template_data/web-service/template/.air.toml +11 -0
  208. biucingcli/template_data/web-service/template/.dockerignore +5 -0
  209. biucingcli/template_data/web-service/template/.gitignore +5 -0
  210. biucingcli/template_data/web-service/template/.mise.toml +2 -0
  211. biucingcli/template_data/web-service/template/Brewfile +5 -0
  212. biucingcli/template_data/web-service/template/Dockerfile +41 -0
  213. biucingcli/template_data/web-service/template/Dockerfile.dev +45 -0
  214. biucingcli/template_data/web-service/template/Makefile +113 -0
  215. biucingcli/template_data/web-service/template/README.md +164 -0
  216. biucingcli/template_data/web-service/template/cmd/server/main.go +50 -0
  217. biucingcli/template_data/web-service/template/compose.dev.yaml +28 -0
  218. biucingcli/template_data/web-service/template/compose.yaml +14 -0
  219. biucingcli/template_data/web-service/template/configs/config.yaml +10 -0
  220. biucingcli/template_data/web-service/template/go.mod +36 -0
  221. biucingcli/template_data/web-service/template/go.sum +89 -0
  222. biucingcli/template_data/web-service/template/internal/config/config.go +84 -0
  223. biucingcli/template_data/web-service/template/internal/config/config_test.go +88 -0
  224. biucingcli/template_data/web-service/template/internal/handler/health.go +25 -0
  225. biucingcli/template_data/web-service/template/internal/handler/ping.go +25 -0
  226. biucingcli/template_data/web-service/template/internal/handler/user.go +40 -0
  227. biucingcli/template_data/web-service/template/internal/model/health.go +6 -0
  228. biucingcli/template_data/web-service/template/internal/model/ping.go +7 -0
  229. biucingcli/template_data/web-service/template/internal/model/user.go +7 -0
  230. biucingcli/template_data/web-service/template/internal/repository/.gitkeep +1 -0
  231. biucingcli/template_data/web-service/template/internal/repository/user.go +37 -0
  232. biucingcli/template_data/web-service/template/internal/router/router.go +28 -0
  233. biucingcli/template_data/web-service/template/internal/runtime/server.go +76 -0
  234. biucingcli/template_data/web-service/template/internal/runtime/server_test.go +139 -0
  235. biucingcli/template_data/web-service/template/internal/service/health.go +22 -0
  236. biucingcli/template_data/web-service/template/internal/service/ping.go +23 -0
  237. biucingcli/template_data/web-service/template/internal/service/user.go +27 -0
  238. biucingcli/template_data/web-service/template/scripts/bootstrap +23 -0
  239. biucingcli/template_data/web-service/template/scripts/doctor +83 -0
  240. biucingcli/template_data/web-service/template/tests/server_test.go +160 -0
  241. biucingcli/template_data/web-service/template.json +88 -0
  242. biucingcli/template_data/worker/template/.dockerignore +3 -0
  243. biucingcli/template_data/worker/template/.gitignore +2 -0
  244. biucingcli/template_data/worker/template/.mise.toml +2 -0
  245. biucingcli/template_data/worker/template/Brewfile +1 -0
  246. biucingcli/template_data/worker/template/Dockerfile +19 -0
  247. biucingcli/template_data/worker/template/Dockerfile.dev +9 -0
  248. biucingcli/template_data/worker/template/Makefile +105 -0
  249. biucingcli/template_data/worker/template/README.md +164 -0
  250. biucingcli/template_data/worker/template/cmd/worker/main.go +41 -0
  251. biucingcli/template_data/worker/template/compose.dev.yaml +29 -0
  252. biucingcli/template_data/worker/template/configs/config.json +11 -0
  253. biucingcli/template_data/worker/template/go.mod +3 -0
  254. biucingcli/template_data/worker/template/go.sum +1 -0
  255. biucingcli/template_data/worker/template/internal/config/config.go +108 -0
  256. biucingcli/template_data/worker/template/internal/config/config_test.go +86 -0
  257. biucingcli/template_data/worker/template/internal/runtime/runner.go +199 -0
  258. biucingcli/template_data/worker/template/internal/runtime/runner_test.go +215 -0
  259. biucingcli/template_data/worker/template/internal/task/heartbeat.go +19 -0
  260. biucingcli/template_data/worker/template/scripts/bootstrap +6 -0
  261. biucingcli/template_data/worker/template/scripts/doctor +41 -0
  262. biucingcli/template_data/worker/template/tests/worker_test.go +44 -0
  263. biucingcli/template_data/worker/template.json +100 -0
  264. biucingcli/templates.py +902 -0
  265. biucingcli-0.9.1.dist-info/METADATA +204 -0
  266. biucingcli-0.9.1.dist-info/RECORD +269 -0
  267. biucingcli-0.9.1.dist-info/WHEEL +5 -0
  268. biucingcli-0.9.1.dist-info/entry_points.txt +2 -0
  269. biucingcli-0.9.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,9 @@
1
+ root = true
2
+
3
+ [*.{kt,kts}]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ indent_style = space
7
+ indent_size = 4
8
+ insert_final_newline = true
9
+ ktlint_code_style = ktlint_official
@@ -0,0 +1,26 @@
1
+ .gradle/
2
+ .idea/
3
+ build/
4
+ local.properties
5
+ captures/
6
+ *.iml
7
+ app/build/
8
+ core/**/build/
9
+ feature/**/build/
10
+
11
+ # Local credentials and signing material
12
+ .env
13
+ .env.*
14
+ !.env.example
15
+ /credentials/
16
+ /signing/
17
+ *.p8
18
+ *.p12
19
+ *.pfx
20
+ *.jks
21
+ *.keystore
22
+ /key.properties
23
+ /keystore.properties
24
+ /signing.properties
25
+ /fastlane/*.json
26
+ /play-store-service-account.json
@@ -0,0 +1,3 @@
1
+ [tools]
2
+ java = "{{JAVA_VERSION}}"
3
+ ruby = "3.3.4"
@@ -0,0 +1,6 @@
1
+ brew "mise"
2
+ cask "android-platform-tools"
3
+ brew "openjdk@{{JAVA_VERSION}}"
4
+ brew "fastlane"
5
+ brew "gh"
6
+ brew "jq"
@@ -0,0 +1,103 @@
1
+ SHELL := /bin/zsh
2
+
3
+ APP_NAME={{PROJECT_NAME}}
4
+ WORKTREE_ROOT ?= $(shell git rev-parse --show-toplevel 2>/dev/null || pwd)
5
+ WORKTREE_LABEL ?= $(shell basename "$(WORKTREE_ROOT)" | tr '[:upper:]' '[:lower:]' | tr -cs 'a-z0-9' '-' | sed 's/^-//; s/-$$//')
6
+ WORKTREE_ID ?= w$(shell printf '%s' "$(WORKTREE_ROOT)" | shasum | cut -c1-8)
7
+ WORKTREE_SLUG ?= $(APP_NAME)-$(WORKTREE_ID)
8
+ GRADLE_USER_HOME ?= $(WORKTREE_ROOT)/.gradle/worktree/$(WORKTREE_ID)
9
+ GRADLE_PROJECT_CACHE ?= $(WORKTREE_ROOT)/.gradle
10
+ ANDROID_LOCAL_PROPERTIES ?= $(WORKTREE_ROOT)/local.properties
11
+ DEBUG_APPLICATION_ID_SUFFIX ?= .debug.$(WORKTREE_ID)
12
+ EFFECTIVE_DEBUG_APPLICATION_ID ?= {{APPLICATION_ID}}$(DEBUG_APPLICATION_ID_SUFFIX)
13
+ GRADLE := GRADLE_USER_HOME=$(GRADLE_USER_HOME) ./gradlew -Dorg.gradle.project.biucing.worktree.applicationIdSuffix=$(DEBUG_APPLICATION_ID_SUFFIX)
14
+
15
+ export GRADLE_USER_HOME
16
+
17
+ .PHONY: bootstrap doctor wrapper verify-supply-chain clean build bundle-release artifact-info verify-release-artifact verify verify-release-signing test test-ui lint format install-debug release-doctor archive beta release worktree-info worktree-doctor clean-worktree help
18
+
19
+ bootstrap:
20
+ ./scripts/bootstrap
21
+
22
+ doctor:
23
+ ./scripts/doctor
24
+
25
+ wrapper:
26
+ ./scripts/sync-gradle-wrapper
27
+
28
+ verify-supply-chain:
29
+ ./scripts/verify-gradle-supply-chain
30
+
31
+ clean build bundle-release verify-release-signing test test-ui lint format install-debug: verify-supply-chain
32
+
33
+ clean:
34
+ $(GRADLE) clean
35
+
36
+ build:
37
+ $(GRADLE) assembleDebug
38
+
39
+ bundle-release:
40
+ $(GRADLE) bundleRelease
41
+
42
+ artifact-info:
43
+ ./scripts/artifact-info
44
+
45
+ verify-release-artifact:
46
+ ./scripts/verify-release-artifact
47
+
48
+ verify: verify-supply-chain doctor lint test build
49
+
50
+ verify-release-signing:
51
+ $(GRADLE) :app:verifyReleaseSigning
52
+
53
+ test:
54
+ $(GRADLE) test
55
+
56
+ test-ui:
57
+ $(GRADLE) connectedDebugAndroidTest
58
+
59
+ lint:
60
+ $(GRADLE) lint
61
+
62
+ format:
63
+ $(GRADLE) spotlessApply
64
+
65
+ install-debug:
66
+ $(GRADLE) installDebug
67
+
68
+ release-doctor:
69
+ fastlane release_doctor
70
+
71
+ archive:
72
+ fastlane archive
73
+
74
+ beta:
75
+ fastlane beta
76
+
77
+ release:
78
+ fastlane release
79
+
80
+ worktree-info:
81
+ @printf '%s\n' "Project: {{PROJECT_NAME}}"
82
+ @printf '%s\n' "Worktree root: $(WORKTREE_ROOT)"
83
+ @printf '%s\n' "WORKTREE_LABEL: $(WORKTREE_LABEL)"
84
+ @printf '%s\n' "WORKTREE_ID: $(WORKTREE_ID)"
85
+ @printf '%s\n' "WORKTREE_SLUG: $(WORKTREE_SLUG)"
86
+ @printf '%s\n' "Gradle user home: $(GRADLE_USER_HOME)"
87
+ @printf '%s\n' "Gradle project cache: $(GRADLE_PROJECT_CACHE)"
88
+ @printf '%s\n' "local.properties: $(ANDROID_LOCAL_PROPERTIES)"
89
+ @printf '%s\n' "Debug application ID suffix: $(DEBUG_APPLICATION_ID_SUFFIX)"
90
+ @printf '%s\n' "Debug application ID: $(EFFECTIVE_DEBUG_APPLICATION_ID)"
91
+
92
+ worktree-doctor:
93
+ @printf '%s\n' "Checking Android worktree isolation..."
94
+ @test -n "$(WORKTREE_ID)" || (printf '%s\n' "WORKTREE_ID is empty" && exit 1)
95
+ @case "$(GRADLE_USER_HOME)" in "$(WORKTREE_ROOT)"/*) ;; *) printf '%s\n' "Gradle user home should stay inside this worktree: $(GRADLE_USER_HOME)"; exit 1;; esac
96
+ @if [ -f "$(ANDROID_LOCAL_PROPERTIES)" ]; then printf '%s\n' "local.properties is local to this worktree and must remain untracked."; else printf '%s\n' "local.properties is absent; run make bootstrap or configure Android SDK paths if needed."; fi
97
+ @printf '%s\n' "Android worktree isolation looks ready."
98
+
99
+ clean-worktree:
100
+ rm -rf "$(GRADLE_USER_HOME)" app/build core/*/build feature/*/build build
101
+
102
+ help:
103
+ @printf '%s\n' "Common commands:" " make bootstrap Prepare project dependencies and tooling" " make doctor Check the local environment" " make lint Run static checks" " make test Run automated tests" " make verify Run the template quality gate" " make build Build the project" " make clean Remove generated build state" " make help Show this command contract"
@@ -0,0 +1,163 @@
1
+ # {{DISPLAY_NAME}}
2
+
3
+ This project was generated by BiucingCLI as a Kotlin Android starter for a mid-sized team.
4
+
5
+ ## Stack
6
+
7
+ - Kotlin
8
+ - Android Gradle Plugin
9
+ - Gradle Wrapper
10
+ - Jetpack Compose
11
+ - fastlane
12
+
13
+ ## Configuration
14
+
15
+ - Application ID: `{{APPLICATION_ID}}`
16
+ - Namespace: `{{ANDROID_NAMESPACE}}`
17
+ - Compile SDK: `{{COMPILE_SDK}}`
18
+ - Minimum SDK: `{{MIN_SDK}}`
19
+ - Target SDK: `{{TARGET_SDK}}`
20
+ - Java version: `{{JAVA_VERSION}}`
21
+
22
+ ## Repository Layout
23
+
24
+ - `app/`: installable Android application module
25
+ - `feature/`: user-facing feature modules such as `home` and `settings`
26
+ - `core/`: shared modules such as models, design system, network config, and test support
27
+ `core/designsystem` now includes starter theme tokens, dark mode colors, and reusable Compose section components
28
+ - `gradle/`: version catalog and wrapper configuration
29
+ - `fastlane/`: beta and release automation
30
+ - `scripts/`: bootstrap and environment checks
31
+
32
+ ## Getting Started
33
+
34
+ ```bash
35
+ make bootstrap
36
+ make doctor
37
+ make format
38
+ make build
39
+ make test
40
+ make verify
41
+ ```
42
+
43
+ ## Worktree Workflow
44
+
45
+ Each worktree derives a human-readable `WORKTREE_LABEL` from its directory name
46
+ and a hash-based `WORKTREE_ID` from the worktree root path, prefixed with `w`
47
+ so generated Android application ID suffixes remain valid. Override
48
+ `WORKTREE_ID` when you want a shorter or stable value across renamed folders:
49
+
50
+ ```bash
51
+ WORKTREE_ID=feature-a make worktree-info
52
+ WORKTREE_ID=feature-a make build
53
+ WORKTREE_ID=feature-a make install-debug
54
+ WORKTREE_ID=feature-a make clean-worktree
55
+ ```
56
+
57
+ `make worktree-info` prints the isolated Gradle user home, project cache,
58
+ `local.properties`, and debug application ID. Debug builds receive
59
+ `DEBUG_APPLICATION_ID_SUFFIX` through Gradle, so parallel worktrees can install
60
+ side by side on the same emulator or device. Set `DEBUG_APPLICATION_ID_SUFFIX=.debug`
61
+ to keep the classic single debug package name.
62
+
63
+ If the team later upgrades Gradle and needs to refresh the wrapper files, run:
64
+
65
+ ```bash
66
+ make wrapper
67
+ ```
68
+
69
+ Then regenerate `gradle/verification-metadata.xml` with Gradle's dependency-verification workflow, review every new checksum, and commit the updated wrapper and verification files together. The template pins the Gradle distribution SHA-256 and the official wrapper JAR SHA-256; `make verify-supply-chain` rejects a changed URL, checksum, dynamic version, or incomplete dependency metadata.
70
+
71
+ ## Standard Commands
72
+
73
+ ```bash
74
+ make bootstrap
75
+ make doctor
76
+ make verify-supply-chain
77
+ make format
78
+ make build
79
+ ./gradlew assembleRelease
80
+ make test
81
+ make test-ui
82
+ make lint
83
+ make verify
84
+ make install-debug
85
+ make verify-release-signing
86
+ make release-doctor
87
+ make archive
88
+ make artifact-info
89
+ make verify-release-artifact
90
+ make beta
91
+ make release
92
+ make clean
93
+ make help
94
+ ```
95
+
96
+ `make doctor` validates the active JDK, Android SDK root, `cmdline-tools/latest`, `adb`, emulator/AVD visibility, and the committed Gradle supply-chain controls before you spend time on builds.
97
+ `make test-ui` runs `connectedDebugAndroidTest`, so boot an emulator or connect a device first. AVDs created through Android Studio Device Manager work well for the generated Compose smoke test.
98
+ If `adb devices` reports `unauthorized`, accept the host key prompt on the emulator or restart adb before re-running `make test-ui`.
99
+
100
+ ## Release Setup
101
+
102
+ The generated starter treats build types like this:
103
+
104
+ - `debug`: default local development build, with a `.debug` application ID suffix and `-debug` version suffix
105
+ - `release`: production-shaped build intended for CI, beta handoff, or store preparation
106
+
107
+ Release signing is optional for local generation and verification. If signing inputs are missing, `assembleRelease` still gives you an unsigned release artifact that is useful for smoke validation. Store delivery uses a signed Android App Bundle (AAB) built by `bundleRelease`.
108
+
109
+ To wire real signing, choose one of these paths:
110
+
111
+ 1. Copy the keys from `docs/release-signing.properties.example` into `local.properties`
112
+ 2. Export `BIUCING_RELEASE_STORE_FILE`, `BIUCING_RELEASE_STORE_PASSWORD`, `BIUCING_RELEASE_KEY_ALIAS`, and `BIUCING_RELEASE_KEY_PASSWORD` in CI or your shell
113
+
114
+ The Gradle template also accepts the same values as Gradle properties:
115
+
116
+ - `biucing.release.storeFile`
117
+ - `biucing.release.storePassword`
118
+ - `biucing.release.keyAlias`
119
+ - `biucing.release.keyPassword`
120
+
121
+ For direct Gradle invocations, put these values in the user-level `~/.gradle/gradle.properties`, not the tracked project-level `gradle.properties`. The fastlane delivery lanes use `local.properties` or `BIUCING_RELEASE_*` so `make release-doctor`, `make archive`, `make beta`, and `make release` can verify the signing material before building.
122
+
123
+ Before a real Google Play handoff, the team also needs to supply:
124
+
125
+ - a Google Play Console app record for `{{APPLICATION_ID}}`
126
+ - a Google Cloud service-account JSON key that is invited to the Play Console app
127
+ - an upload keystore and all four signing values above
128
+
129
+ Copy `fastlane/.env.example` to `fastlane/.env`, place the service-account JSON under the ignored `credentials/` directory and the upload keystore under the ignored `signing/` directory, then replace the placeholders. See `docs/release-delivery.md` for the complete setup path.
130
+
131
+ `make verify` is the default local quality gate: it verifies the Gradle distribution, wrapper JAR, dependency checksums, then runs doctor, lint, unit tests, and a debug build. `gradle/verification-metadata.xml` enables strict checksum verification for downloaded plugins and dependencies.
132
+
133
+ `make verify-release-signing` opens the configured keystore and verifies that the configured alias is a usable private-key entry without printing any signing secret.
134
+
135
+ `make release-doctor` checks the service-account JSON path, release-signing inputs, upload keystore, private key, and enabled metadata configuration before a native bundle spends time building.
136
+
137
+ `make archive` runs lint, unit tests, signing-input verification, and `bundleRelease`, then cryptographically verifies every AAB JAR signature and compares its signer SHA-256 fingerprint with the configured upload-key certificate before printing the artifact checksum. A mismatch fails before any Play upload.
138
+
139
+ `make beta` runs the archive lane and uploads the AAB to the Google Play `internal` track by default.
140
+
141
+ `make release` runs the archive lane and uploads the AAB to the Google Play `production` track as a `draft` by default. It does not make the release public; complete the Play Console review and required compliance information before promoting the draft.
142
+
143
+ ## Notes
144
+
145
+ - `settings.gradle.kts` defines the module graph.
146
+ - `gradle/libs.versions.toml` is the source of truth for plugin and dependency versions.
147
+ - `.editorconfig` defines the baseline formatting behavior shared by Kotlin and Gradle Kotlin DSL files.
148
+ - `make doctor` is the fastest way to catch missing SDK, JDK, or emulator setup before `make build` and `make test`.
149
+ - `app/src/androidTest/` contains a starter Compose UI smoke test for the generated home screen.
150
+ - `core/network` centralizes starter environment metadata that multiple features can share.
151
+ - `core/testing` gives app and feature tests a shared fake environment provider.
152
+ - `core/designsystem` now holds starter color tokens, spacing tokens, dark theme colors, and reusable Compose UI primitives such as section cards and status badges.
153
+ - `app/` should stay focused on app shell concerns.
154
+ - `feature/home` and `feature/settings` demonstrate how the template can scale past a single screen.
155
+ - The starter design system is intentionally small, but it is structured so teams can grow tokens and reusable components without rewriting the first screens.
156
+ - Dark mode is part of the starter theme contract, so new components should prefer `MaterialTheme.colorScheme` and shared tokens over hard-coded colors.
157
+ - `gradle/wrapper/gradle-wrapper.jar` is committed in the starter and should stay versioned in the repo.
158
+ - `gradle/wrapper/gradle-wrapper.jar.sha256`, `distributionSha256Sum`, and `gradle/verification-metadata.xml` are reviewable supply-chain inputs; never regenerate or accept checksum changes blindly.
159
+ - `docs/release-signing.properties.example` documents the expected signing keys without committing secrets.
160
+ - `.gitignore` protects the recommended `credentials/` and `signing/` directories, keystores, local signing property files, and Fastlane credential JSON. It cannot protect files already tracked or force-added.
161
+ - `fastlane/Fastfile` owns Google Play credential checks, signed AAB creation, internal-track delivery, and draft production delivery.
162
+ - `scripts/verify-release-artifact` verifies AAB archive structure, its JAR signature, and the exact upload certificate; `scripts/artifact-info` records the verified artifact checksum.
163
+ - Google Play store listings can be managed from `fastlane/metadata/android` after `fastlane supply init`; Data safety, content ratings, policy declarations, and review answers remain Play Console responsibilities.
@@ -0,0 +1,178 @@
1
+ plugins {
2
+ alias(libs.plugins.android.application)
3
+ alias(libs.plugins.kotlin.android)
4
+ alias(libs.plugins.kotlin.compose)
5
+ }
6
+
7
+ import java.util.Properties
8
+ import java.security.KeyStore
9
+
10
+ fun loadLocalProperties(rootDir: java.io.File): Properties {
11
+ val properties = Properties()
12
+ val localPropertiesFile = rootDir.resolve("local.properties")
13
+
14
+ if (localPropertiesFile.isFile) {
15
+ localPropertiesFile.inputStream().use(properties::load)
16
+ }
17
+
18
+ return properties
19
+ }
20
+
21
+ fun Project.releaseProperty(
22
+ localProperties: Properties,
23
+ gradleKey: String,
24
+ envKey: String,
25
+ ): String? {
26
+ return providers.gradleProperty(gradleKey).orNull
27
+ ?: System.getenv(envKey)
28
+ ?: localProperties.getProperty(gradleKey)
29
+ }
30
+
31
+ val localProperties = loadLocalProperties(rootDir)
32
+ val releaseStoreFile = project.releaseProperty(
33
+ localProperties,
34
+ "biucing.release.storeFile",
35
+ "BIUCING_RELEASE_STORE_FILE",
36
+ )
37
+ val releaseStorePassword = project.releaseProperty(
38
+ localProperties,
39
+ "biucing.release.storePassword",
40
+ "BIUCING_RELEASE_STORE_PASSWORD",
41
+ )
42
+ val releaseKeyAlias = project.releaseProperty(
43
+ localProperties,
44
+ "biucing.release.keyAlias",
45
+ "BIUCING_RELEASE_KEY_ALIAS",
46
+ )
47
+ val releaseKeyPassword = project.releaseProperty(
48
+ localProperties,
49
+ "biucing.release.keyPassword",
50
+ "BIUCING_RELEASE_KEY_PASSWORD",
51
+ )
52
+ val hasCompleteReleaseSigning =
53
+ listOf(
54
+ releaseStoreFile,
55
+ releaseStorePassword,
56
+ releaseKeyAlias,
57
+ releaseKeyPassword,
58
+ ).all { !it.isNullOrBlank() }
59
+ val debugApplicationIdSuffix =
60
+ providers.gradleProperty("biucing.worktree.applicationIdSuffix")
61
+ .orElse(providers.environmentVariable("BIUCING_ANDROID_APPLICATION_ID_SUFFIX"))
62
+ .orElse(".debug")
63
+ .get()
64
+
65
+ android {
66
+ namespace = "{{ANDROID_NAMESPACE}}"
67
+ compileSdk = {{COMPILE_SDK}}
68
+
69
+ defaultConfig {
70
+ applicationId = "{{APPLICATION_ID}}"
71
+ minSdk = {{MIN_SDK}}
72
+ targetSdk = {{TARGET_SDK}}
73
+ versionCode = {{VERSION_CODE}}
74
+ versionName = "{{VERSION_NAME}}"
75
+
76
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
77
+ vectorDrawables {
78
+ useSupportLibrary = true
79
+ }
80
+ }
81
+
82
+ signingConfigs {
83
+ create("release") {
84
+ if (hasCompleteReleaseSigning) {
85
+ storeFile = rootProject.file(releaseStoreFile!!)
86
+ storePassword = releaseStorePassword
87
+ keyAlias = releaseKeyAlias
88
+ keyPassword = releaseKeyPassword
89
+ }
90
+ }
91
+ }
92
+
93
+ buildTypes {
94
+ debug {
95
+ applicationIdSuffix = debugApplicationIdSuffix
96
+ versionNameSuffix = "-debug"
97
+ }
98
+
99
+ release {
100
+ isMinifyEnabled = false
101
+ if (hasCompleteReleaseSigning) {
102
+ signingConfig = signingConfigs.getByName("release")
103
+ }
104
+ proguardFiles(
105
+ getDefaultProguardFile("proguard-android-optimize.txt"),
106
+ "proguard-rules.pro"
107
+ )
108
+ }
109
+ }
110
+
111
+ compileOptions {
112
+ sourceCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
113
+ targetCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
114
+ }
115
+
116
+ kotlinOptions {
117
+ jvmTarget = "{{JAVA_VERSION}}"
118
+ }
119
+
120
+ buildFeatures {
121
+ compose = true
122
+ }
123
+ }
124
+
125
+ tasks.register("verifyReleaseSigning") {
126
+ group = "verification"
127
+ description = "Verifies that the configured release keystore contains the configured private key."
128
+
129
+ doLast {
130
+ require(hasCompleteReleaseSigning) {
131
+ "Configure all biucing.release.* values or BIUCING_RELEASE_* environment variables."
132
+ }
133
+
134
+ val storeFile = rootProject.file(requireNotNull(releaseStoreFile))
135
+ require(storeFile.isFile) { "Release keystore does not exist: ${storeFile.path}" }
136
+
137
+ val storePassword = requireNotNull(releaseStorePassword)
138
+ val keyAlias = requireNotNull(releaseKeyAlias)
139
+ val keyPassword = requireNotNull(releaseKeyPassword)
140
+ val keyStore = KeyStore.getInstance(KeyStore.getDefaultType())
141
+
142
+ storeFile.inputStream().use { keyStore.load(it, storePassword.toCharArray()) }
143
+ require(keyStore.containsAlias(keyAlias)) {
144
+ "Release keystore does not contain alias: $keyAlias"
145
+ }
146
+ require(keyStore.isKeyEntry(keyAlias)) {
147
+ "Release signing alias is not a private-key entry: $keyAlias"
148
+ }
149
+ requireNotNull(keyStore.getKey(keyAlias, keyPassword.toCharArray())) {
150
+ "Release signing key could not be opened for alias: $keyAlias"
151
+ }
152
+ }
153
+ }
154
+
155
+ dependencies {
156
+ implementation(project(":core:model"))
157
+ implementation(project(":core:designsystem"))
158
+ implementation(project(":core:network"))
159
+ implementation(project(":feature:home"))
160
+ implementation(project(":feature:settings"))
161
+
162
+ implementation(platform(libs.androidx.compose.bom))
163
+ implementation(libs.androidx.core.ktx)
164
+ implementation(libs.androidx.lifecycle.runtime.ktx)
165
+ implementation(libs.androidx.activity.compose)
166
+ implementation(libs.androidx.compose.ui)
167
+ implementation(libs.androidx.compose.ui.tooling.preview)
168
+ implementation(libs.androidx.compose.material3)
169
+ implementation(libs.google.material)
170
+
171
+ testImplementation(libs.junit4)
172
+ testImplementation(project(":core:testing"))
173
+ androidTestImplementation(platform(libs.androidx.compose.bom))
174
+ androidTestImplementation(libs.androidx.test.ext.junit)
175
+ androidTestImplementation(libs.androidx.espresso.core)
176
+ androidTestImplementation(libs.androidx.compose.ui.test.junit4)
177
+ debugImplementation(libs.androidx.compose.ui.test.manifest)
178
+ }
@@ -0,0 +1 @@
1
+ # Intentionally minimal for the starter template.
@@ -0,0 +1,21 @@
1
+ package {{PACKAGE_NAME}}
2
+
3
+ import androidx.compose.ui.test.assertIsDisplayed
4
+ import androidx.compose.ui.test.junit4.createAndroidComposeRule
5
+ import androidx.compose.ui.test.onNodeWithText
6
+ import androidx.test.ext.junit.runners.AndroidJUnit4
7
+ import org.junit.Rule
8
+ import org.junit.Test
9
+ import org.junit.runner.RunWith
10
+
11
+ @RunWith(AndroidJUnit4::class)
12
+ class HomeRouteUiTest {
13
+ @get:Rule
14
+ val composeRule = createAndroidComposeRule<MainActivity>()
15
+
16
+ @Test
17
+ fun homeScreenShowsGeneratedGreeting() {
18
+ composeRule.onNodeWithText("{{DISPLAY_NAME}}", substring = true).assertIsDisplayed()
19
+ composeRule.onNodeWithText("Generated by BiucingCLI", substring = true).assertIsDisplayed()
20
+ }
21
+ }
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
3
+ <application
4
+ android:allowBackup="true"
5
+ android:label="{{DISPLAY_NAME}}"
6
+ android:supportsRtl="true"
7
+ android:theme="@style/Theme.{{KOTLIN_MODULE_NAME}}">
8
+ <activity
9
+ android:name=".MainActivity"
10
+ android:exported="true">
11
+ <intent-filter>
12
+ <action android:name="android.intent.action.MAIN" />
13
+
14
+ <category android:name="android.intent.category.LAUNCHER" />
15
+ </intent-filter>
16
+ </activity>
17
+ </application>
18
+ </manifest>
@@ -0,0 +1,36 @@
1
+ package {{PACKAGE_NAME}}
2
+
3
+ import android.os.Bundle
4
+ import androidx.activity.ComponentActivity
5
+ import androidx.activity.compose.setContent
6
+ import androidx.compose.foundation.layout.Arrangement
7
+ import androidx.compose.foundation.layout.Column
8
+ import androidx.compose.foundation.layout.fillMaxSize
9
+ import androidx.compose.foundation.layout.padding
10
+ import androidx.compose.material3.Surface
11
+ import androidx.compose.ui.Modifier
12
+ import {{PACKAGE_NAME}}.core.designsystem.BiucingSpacing
13
+ import {{PACKAGE_NAME}}.core.designsystem.BiucingTheme
14
+ import {{PACKAGE_NAME}}.feature.home.HomeRoute
15
+ import {{PACKAGE_NAME}}.feature.settings.SettingsRoute
16
+
17
+ class MainActivity : ComponentActivity() {
18
+ override fun onCreate(savedInstanceState: Bundle?) {
19
+ super.onCreate(savedInstanceState)
20
+ setContent {
21
+ BiucingTheme {
22
+ Surface {
23
+ Column(
24
+ modifier = Modifier
25
+ .fillMaxSize()
26
+ .padding(BiucingSpacing.large),
27
+ verticalArrangement = Arrangement.spacedBy(BiucingSpacing.large),
28
+ ) {
29
+ HomeRoute()
30
+ SettingsRoute()
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <resources>
3
+ <string name="app_name">{{DISPLAY_NAME}}</string>
4
+ </resources>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <resources xmlns:tools="http://schemas.android.com/tools">
3
+ <style name="Theme.{{KOTLIN_MODULE_NAME}}" parent="Theme.Material3.DayNight">
4
+ <item name="android:statusBarColor">@android:color/transparent</item>
5
+ <item name="android:navigationBarColor">@android:color/black</item>
6
+ <item name="android:windowLightStatusBar" tools:targetApi="23">true</item>
7
+ </style>
8
+ </resources>
@@ -0,0 +1,19 @@
1
+ package {{PACKAGE_NAME}}
2
+
3
+ import {{PACKAGE_NAME}}.core.testing.FakeAppEnvironmentProvider
4
+ import org.junit.Assert.assertEquals
5
+ import org.junit.Test
6
+
7
+ class AppSmokeTest {
8
+ @Test
9
+ fun projectNameIsStable() {
10
+ assertEquals("{{PROJECT_NAME}}", "{{PROJECT_NAME}}")
11
+ }
12
+
13
+ @Test
14
+ fun fakeEnvironmentProviderExposesPredictableReleaseChannel() {
15
+ val environment = FakeAppEnvironmentProvider().environment()
16
+
17
+ assertEquals("beta", environment.releaseChannel)
18
+ }
19
+ }
@@ -0,0 +1,27 @@
1
+ import com.diffplug.gradle.spotless.SpotlessExtension
2
+
3
+ plugins {
4
+ alias(libs.plugins.android.application) apply false
5
+ alias(libs.plugins.android.library) apply false
6
+ alias(libs.plugins.kotlin.android) apply false
7
+ alias(libs.plugins.kotlin.compose) apply false
8
+ alias(libs.plugins.spotless)
9
+ }
10
+
11
+ subprojects {
12
+ apply(plugin = "com.diffplug.spotless")
13
+
14
+ extensions.configure<SpotlessExtension> {
15
+ kotlin {
16
+ target("**/*.kt")
17
+ targetExclude("**/build/**/*.kt")
18
+ ktlint(libs.versions.ktlint.get())
19
+ }
20
+
21
+ kotlinGradle {
22
+ target("**/*.kts")
23
+ targetExclude("**/build/**/*.kts")
24
+ ktlint(libs.versions.ktlint.get())
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,33 @@
1
+ plugins {
2
+ alias(libs.plugins.android.library)
3
+ alias(libs.plugins.kotlin.android)
4
+ alias(libs.plugins.kotlin.compose)
5
+ }
6
+
7
+ android {
8
+ namespace = "{{PACKAGE_NAME}}.core.designsystem"
9
+ compileSdk = {{COMPILE_SDK}}
10
+
11
+ defaultConfig {
12
+ minSdk = {{MIN_SDK}}
13
+ }
14
+
15
+ compileOptions {
16
+ sourceCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
17
+ targetCompatibility = JavaVersion.toVersion("{{JAVA_VERSION}}")
18
+ }
19
+
20
+ kotlinOptions {
21
+ jvmTarget = "{{JAVA_VERSION}}"
22
+ }
23
+
24
+ buildFeatures {
25
+ compose = true
26
+ }
27
+ }
28
+
29
+ dependencies {
30
+ implementation(platform(libs.androidx.compose.bom))
31
+ implementation(libs.androidx.compose.ui)
32
+ implementation(libs.androidx.compose.material3)
33
+ }