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,104 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ artifact_path="${1:-app/build/outputs/bundle/release/app-release.aab}"
5
+ properties_path="local.properties"
6
+ keytool_bin="${KEYTOOL:-keytool}"
7
+ jarsigner_bin="${JARSIGNER:-jarsigner}"
8
+
9
+ property_value() {
10
+ local property_name="$1"
11
+ local environment_name="$2"
12
+ local environment_value="${!environment_name:-}"
13
+ if [[ -n "$environment_value" ]]; then
14
+ printf '%s' "$environment_value"
15
+ elif [[ -f "$properties_path" ]]; then
16
+ awk -F= -v key="$property_name" '
17
+ $0 !~ /^[[:space:]]*#/ && $1 ~ "^[[:space:]]*" key "[[:space:]]*$" {
18
+ sub(/^[^=]*=/, ""); sub(/^[[:space:]]+/, ""); sub(/[[:space:]]+$/, ""); print; exit
19
+ }
20
+ ' "$properties_path"
21
+ fi
22
+ }
23
+
24
+ normalize_fingerprint() {
25
+ tr '[:lower:]' '[:upper:]' | tr -d ':[:space:]'
26
+ }
27
+
28
+ certificate_fingerprint() {
29
+ sed -nE 's/.*SHA-?256:[[:space:]]*([0-9A-Fa-f:]+).*/\1/p' | head -n 1 | normalize_fingerprint
30
+ }
31
+
32
+ echo "Android release artifact signature verification"
33
+
34
+ if [[ ! -s "$artifact_path" ]]; then
35
+ echo "AAB is missing or empty: $artifact_path" >&2
36
+ exit 1
37
+ fi
38
+ if ! unzip -tqq "$artifact_path"; then
39
+ echo "AAB archive validation failed: $artifact_path" >&2
40
+ exit 1
41
+ fi
42
+ for entry in BundleConfig.pb base/manifest/AndroidManifest.xml; do
43
+ if ! unzip -p "$artifact_path" "$entry" >/dev/null; then
44
+ echo "AAB does not contain required entry: $entry" >&2
45
+ exit 1
46
+ fi
47
+ done
48
+
49
+ for tool in "$keytool_bin" "$jarsigner_bin"; do
50
+ if ! command -v "$tool" >/dev/null 2>&1 && [[ ! -x "$tool" ]]; then
51
+ echo "Required JDK signing tool is unavailable: $tool" >&2
52
+ exit 1
53
+ fi
54
+ done
55
+
56
+ store_file="$(property_value biucing.release.storeFile BIUCING_RELEASE_STORE_FILE)"
57
+ store_password="$(property_value biucing.release.storePassword BIUCING_RELEASE_STORE_PASSWORD)"
58
+ key_alias="$(property_value biucing.release.keyAlias BIUCING_RELEASE_KEY_ALIAS)"
59
+ if [[ -z "$store_file" || -z "$store_password" || -z "$key_alias" ]]; then
60
+ echo "Release keystore path, store password, and key alias are required for artifact verification." >&2
61
+ exit 1
62
+ fi
63
+ if [[ "$store_file" != /* ]]; then
64
+ store_file="$PWD/$store_file"
65
+ fi
66
+ if [[ ! -f "$store_file" ]]; then
67
+ echo "Release keystore does not exist: $store_file" >&2
68
+ exit 1
69
+ fi
70
+
71
+ verification_output="$(mktemp "${TMPDIR:-/tmp}/biucing-jarsigner.XXXXXX")"
72
+ cleanup() {
73
+ rm -f "$verification_output"
74
+ unset BIUCING_KEYSTORE_PASSWORD_INPUT
75
+ }
76
+ trap cleanup EXIT HUP INT TERM
77
+
78
+ LC_ALL=C "$jarsigner_bin" -verify -verbose -certs "$artifact_path" >"$verification_output" 2>&1 || {
79
+ echo "AAB cryptographic signature verification failed." >&2
80
+ sed -n '1,20p' "$verification_output" >&2
81
+ exit 1
82
+ }
83
+ if ! grep -q 'jar verified' "$verification_output" || grep -q 'unsigned entry' "$verification_output"; then
84
+ echo "AAB is not fully JAR-signed." >&2
85
+ exit 1
86
+ fi
87
+
88
+ export BIUCING_KEYSTORE_PASSWORD_INPUT="$store_password"
89
+ expected_fingerprint="$(LC_ALL=C "$keytool_bin" -list -v -keystore "$store_file" -alias "$key_alias" -storepass:env BIUCING_KEYSTORE_PASSWORD_INPUT 2>/dev/null | certificate_fingerprint)"
90
+ actual_fingerprint="$(LC_ALL=C "$keytool_bin" -printcert -jarfile "$artifact_path" 2>/dev/null | certificate_fingerprint)"
91
+ unset BIUCING_KEYSTORE_PASSWORD_INPUT
92
+
93
+ if [[ -z "$expected_fingerprint" || -z "$actual_fingerprint" ]]; then
94
+ echo "Unable to read the expected or actual signer SHA-256 fingerprint." >&2
95
+ exit 1
96
+ fi
97
+ if [[ "$actual_fingerprint" != "$expected_fingerprint" ]]; then
98
+ echo "AAB signer certificate does not match the configured release key." >&2
99
+ echo "expected: $expected_fingerprint" >&2
100
+ echo "actual: $actual_fingerprint" >&2
101
+ exit 1
102
+ fi
103
+
104
+ echo "AAB signature is valid and matches the configured release certificate."
@@ -0,0 +1,25 @@
1
+ pluginManagement {
2
+ repositories {
3
+ google()
4
+ mavenCentral()
5
+ gradlePluginPortal()
6
+ }
7
+ }
8
+
9
+ dependencyResolutionManagement {
10
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
11
+ repositories {
12
+ google()
13
+ mavenCentral()
14
+ }
15
+ }
16
+
17
+ rootProject.name = "{{PROJECT_NAME}}"
18
+
19
+ include(":app")
20
+ include(":core:model")
21
+ include(":core:designsystem")
22
+ include(":core:network")
23
+ include(":core:testing")
24
+ include(":feature:home")
25
+ include(":feature:settings")
@@ -0,0 +1,146 @@
1
+ {
2
+ "name": "android",
3
+ "description": "Kotlin Android app starter for mid-sized teams",
4
+ "category": "native",
5
+ "stack": ["Kotlin", "Android", "Gradle", "Jetpack Compose", "fastlane"],
6
+ "tags": ["android", "kotlin", "compose", "fastlane"],
7
+ "platforms": ["android"],
8
+ "maturity": {
9
+ "level": "validated",
10
+ "summary": "Android starter with doctor, format, build, test, and UI smoke workflows."
11
+ },
12
+ "validation": {
13
+ "status": "generated-project-verified",
14
+ "verification_tier": "generated-project",
15
+ "evidence": [
16
+ "python unittest template rendering coverage",
17
+ "real generated project gradle build validation"
18
+ ]
19
+ },
20
+ "operating_assumptions": [
21
+ "The starter assumes a native Android workstation flow with Gradle, emulator, and release-signing guidance.",
22
+ "Generated projects should expose bootstrap, doctor, format, build, test, and UI smoke workflows."
23
+ ],
24
+ "workflow_labels": ["bootstrap", "doctor", "format", "build", "test", "ui-test", "open"],
25
+ "commands": {
26
+ "bootstrap": "make bootstrap",
27
+ "doctor": "make doctor",
28
+ "lint": "make lint",
29
+ "test": "make test",
30
+ "verify": "make verify",
31
+ "build": "make build",
32
+ "clean": "make clean",
33
+ "help": "make help"
34
+ },
35
+ "worktree": {
36
+ "support_level": "worktree-ready",
37
+ "isolation_dimensions": [
38
+ "caches",
39
+ "generated-output",
40
+ "local-config",
41
+ "installed-app-identity",
42
+ "cleanup",
43
+ "diagnostics"
44
+ ],
45
+ "diagnostics": [
46
+ "make worktree-info",
47
+ "make worktree-doctor"
48
+ ],
49
+ "cleanup": [
50
+ "make clean-worktree"
51
+ ]
52
+ },
53
+ "variables": [
54
+ {
55
+ "name": "project_name",
56
+ "required": true,
57
+ "validator": "project-name"
58
+ },
59
+ {
60
+ "name": "display_name",
61
+ "required": false,
62
+ "default_from": "project_name",
63
+ "validator": "display-name"
64
+ },
65
+ {
66
+ "name": "package_name",
67
+ "required": true,
68
+ "prompt": "Android package name: ",
69
+ "validator": "java-package"
70
+ },
71
+ {
72
+ "name": "application_id",
73
+ "required": false,
74
+ "default_from": "package_name",
75
+ "validator": "java-package"
76
+ },
77
+ {
78
+ "name": "organization_name",
79
+ "required": false,
80
+ "default": "Example Team",
81
+ "validator": "display-name"
82
+ },
83
+ {
84
+ "name": "compile_sdk",
85
+ "required": false,
86
+ "default": "35",
87
+ "validator": "positive-integer",
88
+ "maximum": 100
89
+ },
90
+ {
91
+ "name": "min_sdk",
92
+ "required": false,
93
+ "default": "26",
94
+ "validator": "positive-integer",
95
+ "maximum": 100
96
+ },
97
+ {
98
+ "name": "target_sdk",
99
+ "required": false,
100
+ "default": "35",
101
+ "validator": "positive-integer",
102
+ "maximum": 100
103
+ },
104
+ {
105
+ "name": "version_code",
106
+ "required": false,
107
+ "default": "1",
108
+ "validator": "positive-integer",
109
+ "maximum": 2100000000
110
+ },
111
+ {
112
+ "name": "version_name",
113
+ "required": false,
114
+ "default": "1.0.0",
115
+ "validator": "semantic-version"
116
+ },
117
+ {
118
+ "name": "java_version",
119
+ "required": false,
120
+ "default": "17",
121
+ "validator": "positive-integer",
122
+ "minimum": 8,
123
+ "maximum": 30
124
+ },
125
+ {
126
+ "name": "android_namespace",
127
+ "required": false,
128
+ "default_from": "package_name",
129
+ "validator": "java-package"
130
+ },
131
+ {
132
+ "name": "kotlin_module_name",
133
+ "required": false,
134
+ "validator": "identifier"
135
+ }
136
+ ],
137
+ "next_steps": [
138
+ "make bootstrap",
139
+ "make doctor",
140
+ "make format",
141
+ "make build",
142
+ "make test",
143
+ "make test-ui",
144
+ "open -a \"Android Studio\" ."
145
+ ]
146
+ }
@@ -0,0 +1,28 @@
1
+ .build
2
+ .bundle
3
+ .cache
4
+ .mise
5
+ DerivedData
6
+ build
7
+ Tuist/.cache
8
+ Tuist/Dependencies
9
+ *.xcodeproj
10
+ *.xcworkspace
11
+ *.xcarchive
12
+ *.ipa
13
+ *.pkg
14
+ xcuserdata
15
+
16
+ # Local credentials and signing material
17
+ .env
18
+ .env.*
19
+ !.env.example
20
+ /credentials/
21
+ /signing/
22
+ *.p8
23
+ *.p12
24
+ *.pfx
25
+ *.mobileprovision
26
+ *.provisionprofile
27
+ /fastlane/*.json
28
+ /app-store-connect-api-key.json
@@ -0,0 +1,4 @@
1
+ [tools]
2
+ ruby = "4.0.6"
3
+ node = "24.18.0"
4
+ tuist = "4.202.0"
@@ -0,0 +1,10 @@
1
+ --swiftversion 6
2
+ --indent 4
3
+ --linebreaks lf
4
+ --disable trailingCommas
5
+ --wraparguments before-first
6
+ --wrapcollections before-first
7
+ --closingparen balanced
8
+ --stripunusedargs closure-only
9
+ --self remove
10
+ --maxwidth 120
@@ -0,0 +1,33 @@
1
+ included:
2
+ - App
3
+ - Packages
4
+
5
+ excluded:
6
+ - .build
7
+ - DerivedData
8
+
9
+ opt_in_rules:
10
+ - empty_count
11
+ - explicit_init
12
+ - first_where
13
+ - force_unwrapping
14
+ - modifier_order
15
+ - trailing_closure
16
+
17
+ line_length:
18
+ warning: 120
19
+ error: 140
20
+
21
+ identifier_name:
22
+ min_length: 2
23
+ excluded:
24
+ - id
25
+
26
+ type_name:
27
+ min_length: 3
28
+ max_length:
29
+ warning: 40
30
+ error: 50
31
+
32
+ trailing_whitespace:
33
+ ignores_empty_lines: true
@@ -0,0 +1,6 @@
1
+ import ProjectDescription
2
+
3
+ public enum ModulePath {
4
+ public static let appServices = "../Packages/AppServices"
5
+ public static let designSystem = "../Packages/DesignSystem"
6
+ }
@@ -0,0 +1,4 @@
1
+ PRODUCT_NAME = $(TARGET_NAME)
2
+ MARKETING_VERSION = 1.0
3
+ CURRENT_PROJECT_VERSION = 1
4
+ SWIFT_STRICT_CONCURRENCY = complete
@@ -0,0 +1,66 @@
1
+ import ProjectDescription
2
+
3
+ let appName = "{{SWIFT_MODULE_NAME}}"
4
+ let debugBundleSuffix = Environment.debugBundleSuffix.getString(default: "")
5
+
6
+ let project = Project(
7
+ name: appName,
8
+ organizationName: "{{ORGANIZATION_NAME}}",
9
+ packages: [
10
+ .local(path: "../Packages/AppServices"),
11
+ .local(path: "../Packages/DesignSystem")
12
+ ],
13
+ settings: .settings(
14
+ base: [
15
+ "DEVELOPMENT_TEAM": "{{DEVELOPMENT_TEAM}}",
16
+ "SWIFT_VERSION": "6.0"
17
+ ]
18
+ ),
19
+ targets: [
20
+ .target(
21
+ name: appName,
22
+ destinations: {{TUIST_DESTINATIONS}},
23
+ product: .app,
24
+ bundleId: "{{BUNDLE_IDENTIFIER}}\(debugBundleSuffix)",
25
+ deploymentTargets: {{TUIST_DEPLOYMENT_TARGETS}},
26
+ infoPlist: .extendingDefault(
27
+ with: [
28
+ "UILaunchScreen": [:],
29
+ "CFBundleDisplayName": "{{DISPLAY_NAME}}"
30
+ ]
31
+ ),
32
+ sources: ["Targets/App/Sources/**"],
33
+ resources: ["Targets/App/Resources/**"],
34
+ dependencies: [
35
+ .package(product: "AppServices"),
36
+ .package(product: "DesignSystem")
37
+ ]
38
+ ),
39
+ .target(
40
+ name: "\(appName)Tests",
41
+ destinations: {{TUIST_DESTINATIONS}},
42
+ product: .unitTests,
43
+ bundleId: "{{BUNDLE_IDENTIFIER}}\(debugBundleSuffix).tests",
44
+ infoPlist: .default,
45
+ sources: ["Targets/AppTests/Sources/**"],
46
+ dependencies: [
47
+ .package(product: "AppServices"),
48
+ .target(name: appName)
49
+ ]
50
+ )
51
+ ],
52
+ schemes: [
53
+ .scheme(
54
+ name: appName,
55
+ shared: true,
56
+ buildAction: .buildAction(targets: [.target(appName)]),
57
+ testAction: .targets(
58
+ [
59
+ .testableTarget(target: .target("\(appName)Tests"))
60
+ ],
61
+ options: .options(coverage: true)
62
+ ),
63
+ runAction: .runAction(executable: .target(appName))
64
+ )
65
+ ]
66
+ )
@@ -0,0 +1,9 @@
1
+ import DesignSystem
2
+ import SwiftUI
3
+
4
+ @main
5
+ struct {{SWIFT_MODULE_NAME}}App: App {
6
+ var body: some Scene {
7
+ {{APPLE_SCENE_BODY}}
8
+ }
9
+ }
@@ -0,0 +1,18 @@
1
+ import DesignSystem
2
+ import SwiftUI
3
+
4
+ struct HomeView: View {
5
+ private let viewModel = HomeViewModel(
6
+ displayName: "{{DISPLAY_NAME}}",
7
+ bundleIdentifier: "{{BUNDLE_IDENTIFIER}}",
8
+ platformName: "{{APPLE_PLATFORM_NAME}}",
9
+ minimumOSVersion: "{{MINIMUM_OS_VERSION}}",
10
+ developmentTeam: "{{DEVELOPMENT_TEAM}}"
11
+ )
12
+
13
+ {{APPLE_HOME_BODY}}
14
+ }
15
+
16
+ #Preview {
17
+ HomeView()
18
+ }
@@ -0,0 +1,38 @@
1
+ import AppServices
2
+ import Foundation
3
+
4
+ typealias HomeFact = StarterFact
5
+
6
+ struct HomeViewModel {
7
+ let title: String
8
+ let subtitle: String
9
+ let facts: [HomeFact]
10
+ private let checklistProvider: ReleaseChecklistProviding
11
+
12
+ init(
13
+ displayName: String,
14
+ bundleIdentifier: String,
15
+ platformName: String,
16
+ minimumOSVersion: String,
17
+ developmentTeam: String,
18
+ checklistProvider: ReleaseChecklistProviding? = nil
19
+ ) {
20
+ title = displayName
21
+ subtitle = "Tuist-generated starter for Apple platform teams."
22
+ facts = StarterFactBuilder.overviewFacts(
23
+ bundleIdentifier: bundleIdentifier,
24
+ platformName: platformName,
25
+ minimumOSVersion: minimumOSVersion,
26
+ developmentTeam: developmentTeam
27
+ )
28
+ self.checklistProvider = checklistProvider
29
+ ?? DefaultReleaseChecklistProvider(
30
+ bundleIdentifier: bundleIdentifier,
31
+ developmentTeam: developmentTeam
32
+ )
33
+ }
34
+
35
+ func releaseChecklist() -> [String] {
36
+ checklistProvider.releaseChecklistItems()
37
+ }
38
+ }
@@ -0,0 +1,59 @@
1
+ import AppServices
2
+ @testable import {{SWIFT_MODULE_NAME}}
3
+ import XCTest
4
+
5
+ final class AppTests: XCTestCase {
6
+ func testHomeViewModelBuildsOverviewFacts() {
7
+ let viewModel = HomeViewModel(
8
+ displayName: "Pulse Mac",
9
+ bundleIdentifier: "com.example.pulsemac",
10
+ platformName: "macOS",
11
+ minimumOSVersion: "26.0",
12
+ developmentTeam: "ABCDE12345"
13
+ )
14
+
15
+ XCTAssertEqual(viewModel.title, "Pulse Mac")
16
+ XCTAssertEqual(viewModel.subtitle, "Tuist-generated starter for Apple platform teams.")
17
+ XCTAssertEqual(
18
+ viewModel.facts,
19
+ [
20
+ StarterFact(label: "Bundle ID", systemImage: "shippingbox", value: "com.example.pulsemac"),
21
+ StarterFact(label: "Platform", systemImage: "app", value: "macOS"),
22
+ StarterFact(label: "Minimum OS", systemImage: "gear", value: "26.0"),
23
+ StarterFact(label: "Team", systemImage: "person.3", value: "ABCDE12345")
24
+ ]
25
+ )
26
+ }
27
+
28
+ func testHomeViewModelUsesMockChecklistProvider() {
29
+ let viewModel = HomeViewModel(
30
+ displayName: "Pulse Mac",
31
+ bundleIdentifier: "com.example.pulsemac",
32
+ platformName: "macOS",
33
+ minimumOSVersion: "26.0",
34
+ developmentTeam: "ABCDE12345",
35
+ checklistProvider: MockReleaseChecklistProvider(
36
+ items: [
37
+ "Check beta notes.",
38
+ "Share build with QA."
39
+ ]
40
+ )
41
+ )
42
+
43
+ XCTAssertEqual(
44
+ viewModel.releaseChecklist(),
45
+ [
46
+ "Check beta notes.",
47
+ "Share build with QA."
48
+ ]
49
+ )
50
+ }
51
+ }
52
+
53
+ private struct MockReleaseChecklistProvider: ReleaseChecklistProviding {
54
+ let items: [String]
55
+
56
+ func releaseChecklistItems() -> [String] {
57
+ items
58
+ }
59
+ }
@@ -0,0 +1,8 @@
1
+ brew "mise"
2
+ brew "tuist"
3
+ brew "xcodes"
4
+ brew "swiftlint"
5
+ brew "swiftformat"
6
+ brew "xcbeautify"
7
+ brew "fastlane"
8
+ brew "gh"