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.
- biucingcli/__init__.py +5 -0
- biucingcli/cli.py +849 -0
- biucingcli/template_data/android/template/.editorconfig +9 -0
- biucingcli/template_data/android/template/.gitignore +26 -0
- biucingcli/template_data/android/template/.mise.toml +3 -0
- biucingcli/template_data/android/template/Brewfile +6 -0
- biucingcli/template_data/android/template/Makefile +103 -0
- biucingcli/template_data/android/template/README.md +163 -0
- biucingcli/template_data/android/template/app/build.gradle.kts +178 -0
- biucingcli/template_data/android/template/app/proguard-rules.pro +1 -0
- biucingcli/template_data/android/template/app/src/androidTest/java/app/HomeRouteUiTest.kt +21 -0
- biucingcli/template_data/android/template/app/src/main/AndroidManifest.xml +18 -0
- biucingcli/template_data/android/template/app/src/main/java/app/MainActivity.kt +36 -0
- biucingcli/template_data/android/template/app/src/main/res/values/strings.xml +4 -0
- biucingcli/template_data/android/template/app/src/main/res/values/themes.xml +8 -0
- biucingcli/template_data/android/template/app/src/test/java/app/AppSmokeTest.kt +19 -0
- biucingcli/template_data/android/template/build.gradle.kts +27 -0
- biucingcli/template_data/android/template/core/designsystem/build.gradle.kts +33 -0
- biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/Components.kt +75 -0
- biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/DesignTokens.kt +23 -0
- biucingcli/template_data/android/template/core/designsystem/src/main/java/designsystem/Theme.kt +110 -0
- biucingcli/template_data/android/template/core/model/build.gradle.kts +26 -0
- biucingcli/template_data/android/template/core/model/src/main/java/model/Greeting.kt +6 -0
- biucingcli/template_data/android/template/core/model/src/test/java/model/GreetingTest.kt +16 -0
- biucingcli/template_data/android/template/core/network/build.gradle.kts +26 -0
- biucingcli/template_data/android/template/core/network/src/main/java/network/AppEnvironment.kt +17 -0
- biucingcli/template_data/android/template/core/testing/build.gradle.kts +27 -0
- biucingcli/template_data/android/template/core/testing/src/main/java/testing/FakeAppEnvironmentProvider.kt +13 -0
- biucingcli/template_data/android/template/docs/release-delivery.md +68 -0
- biucingcli/template_data/android/template/docs/release-signing.properties.example +20 -0
- biucingcli/template_data/android/template/fastlane/.env.example +22 -0
- biucingcli/template_data/android/template/fastlane/Appfile +1 -0
- biucingcli/template_data/android/template/fastlane/Fastfile +121 -0
- biucingcli/template_data/android/template/feature/home/build.gradle.kts +35 -0
- biucingcli/template_data/android/template/feature/home/src/main/java/home/HomeRoute.kt +38 -0
- biucingcli/template_data/android/template/feature/settings/build.gradle.kts +34 -0
- biucingcli/template_data/android/template/feature/settings/src/main/java/settings/SettingsRoute.kt +35 -0
- biucingcli/template_data/android/template/gradle/libs.versions.toml +35 -0
- biucingcli/template_data/android/template/gradle/verification-metadata.xml +3462 -0
- biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.jar +0 -0
- biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.jar.sha256 +1 -0
- biucingcli/template_data/android/template/gradle/wrapper/gradle-wrapper.properties +10 -0
- biucingcli/template_data/android/template/gradle.properties +4 -0
- biucingcli/template_data/android/template/gradlew +252 -0
- biucingcli/template_data/android/template/gradlew.bat +94 -0
- biucingcli/template_data/android/template/scripts/artifact-info +11 -0
- biucingcli/template_data/android/template/scripts/bootstrap +17 -0
- biucingcli/template_data/android/template/scripts/doctor +133 -0
- biucingcli/template_data/android/template/scripts/setup-android-sdk +23 -0
- biucingcli/template_data/android/template/scripts/sync-gradle-wrapper +19 -0
- biucingcli/template_data/android/template/scripts/verify-gradle-supply-chain +61 -0
- biucingcli/template_data/android/template/scripts/verify-release-artifact +104 -0
- biucingcli/template_data/android/template/settings.gradle.kts +25 -0
- biucingcli/template_data/android/template.json +146 -0
- biucingcli/template_data/apple/template/.gitignore +28 -0
- biucingcli/template_data/apple/template/.mise.toml +4 -0
- biucingcli/template_data/apple/template/.swiftformat +10 -0
- biucingcli/template_data/apple/template/.swiftlint.yml +33 -0
- biucingcli/template_data/apple/template/App/Config/ProjectDescriptionHelpers/Module.swift +6 -0
- biucingcli/template_data/apple/template/App/Config/XCConfig/Base.xcconfig +4 -0
- biucingcli/template_data/apple/template/App/Project.swift +66 -0
- biucingcli/template_data/apple/template/App/Targets/App/Resources/.gitkeep +1 -0
- biucingcli/template_data/apple/template/App/Targets/App/Sources/AppEntry.swift +9 -0
- biucingcli/template_data/apple/template/App/Targets/App/Sources/HomeView.swift +18 -0
- biucingcli/template_data/apple/template/App/Targets/App/Sources/HomeViewModel.swift +38 -0
- biucingcli/template_data/apple/template/App/Targets/AppTests/Sources/AppTests.swift +59 -0
- biucingcli/template_data/apple/template/Brewfile +8 -0
- biucingcli/template_data/apple/template/Makefile +128 -0
- biucingcli/template_data/apple/template/Packages/AppServices/Package.swift +20 -0
- biucingcli/template_data/apple/template/Packages/AppServices/Sources/AppServices/StarterMetadata.swift +52 -0
- biucingcli/template_data/apple/template/Packages/DesignSystem/Package.swift +20 -0
- biucingcli/template_data/apple/template/Packages/DesignSystem/Sources/DesignSystem/Theme.swift +8 -0
- biucingcli/template_data/apple/template/README.md +133 -0
- biucingcli/template_data/apple/template/Tuist.swift +8 -0
- biucingcli/template_data/apple/template/Workspace.swift +11 -0
- biucingcli/template_data/apple/template/docs/release-delivery.md +55 -0
- biucingcli/template_data/apple/template/fastlane/.env.example +20 -0
- biucingcli/template_data/apple/template/fastlane/Appfile +3 -0
- biucingcli/template_data/apple/template/fastlane/Fastfile +126 -0
- biucingcli/template_data/apple/template/fastlane/Matchfile +7 -0
- biucingcli/template_data/apple/template/scripts/bootstrap +9 -0
- biucingcli/template_data/apple/template/scripts/doctor +163 -0
- biucingcli/template_data/apple/template/scripts/setup-xcode +6 -0
- biucingcli/template_data/apple/template/scripts/test-destination +42 -0
- biucingcli/template_data/apple/template/scripts/verify-release-identity +88 -0
- biucingcli/template_data/apple/template.json +110 -0
- biucingcli/template_data/frontend/template/.dockerignore +8 -0
- biucingcli/template_data/frontend/template/.env.example +1 -0
- biucingcli/template_data/frontend/template/.gitignore +7 -0
- biucingcli/template_data/frontend/template/.npmrc +1 -0
- biucingcli/template_data/frontend/template/.prettierignore +2 -0
- biucingcli/template_data/frontend/template/.prettierrc.json +4 -0
- biucingcli/template_data/frontend/template/Dockerfile +25 -0
- biucingcli/template_data/frontend/template/Dockerfile.dev +35 -0
- biucingcli/template_data/frontend/template/Dockerfile.dev.full +40 -0
- biucingcli/template_data/frontend/template/Makefile +137 -0
- biucingcli/template_data/frontend/template/README.md +146 -0
- biucingcli/template_data/frontend/template/compose.dev.yaml +29 -0
- biucingcli/template_data/frontend/template/eslint.config.js +27 -0
- biucingcli/template_data/frontend/template/index.html +12 -0
- biucingcli/template_data/frontend/template/nginx.conf +11 -0
- biucingcli/template_data/frontend/template/package.json +50 -0
- biucingcli/template_data/frontend/template/playwright.production.config.ts +21 -0
- biucingcli/template_data/frontend/template/playwright.smoke.config.ts +19 -0
- biucingcli/template_data/frontend/template/pnpm-lock.yaml +4054 -0
- biucingcli/template_data/frontend/template/public/.gitkeep +1 -0
- biucingcli/template_data/frontend/template/scripts/browser-smoke-production +55 -0
- biucingcli/template_data/frontend/template/scripts/doctor +46 -0
- biucingcli/template_data/frontend/template/src/App.test.tsx +18 -0
- biucingcli/template_data/frontend/template/src/App.tsx +5 -0
- biucingcli/template_data/frontend/template/src/components/MetricCard.tsx +14 -0
- biucingcli/template_data/frontend/template/src/components/TaskPanel.tsx +32 -0
- biucingcli/template_data/frontend/template/src/config/env.ts +3 -0
- biucingcli/template_data/frontend/template/src/hooks/useProjectOverview.ts +24 -0
- biucingcli/template_data/frontend/template/src/index.css +208 -0
- biucingcli/template_data/frontend/template/src/main.tsx +11 -0
- biucingcli/template_data/frontend/template/src/pages/HomePage.tsx +60 -0
- biucingcli/template_data/frontend/template/src/router/AppRouter.tsx +14 -0
- biucingcli/template_data/frontend/template/src/services/api/client.ts +33 -0
- biucingcli/template_data/frontend/template/src/services/projectOverview.ts +39 -0
- biucingcli/template_data/frontend/template/src/test/setup.ts +1 -0
- biucingcli/template_data/frontend/template/src/types/projectOverview.ts +22 -0
- biucingcli/template_data/frontend/template/src/vite-env.d.ts +9 -0
- biucingcli/template_data/frontend/template/tests/browser-smoke.spec.ts +16 -0
- biucingcli/template_data/frontend/template/tests/production-browser-smoke.spec.ts +22 -0
- biucingcli/template_data/frontend/template/tsconfig.json +21 -0
- biucingcli/template_data/frontend/template/vite.config.ts +12 -0
- biucingcli/template_data/frontend/template.json +81 -0
- biucingcli/template_data/harmonyos/template/.gitignore +21 -0
- biucingcli/template_data/harmonyos/template/.mise.toml +2 -0
- biucingcli/template_data/harmonyos/template/AppScope/app.json5 +10 -0
- biucingcli/template_data/harmonyos/template/AppScope/resources/base/element/string.json +8 -0
- biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/background.svg +3 -0
- biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/foreground.svg +4 -0
- biucingcli/template_data/harmonyos/template/AppScope/resources/base/media/layered_image.json +6 -0
- biucingcli/template_data/harmonyos/template/Makefile +106 -0
- biucingcli/template_data/harmonyos/template/README.md +152 -0
- biucingcli/template_data/harmonyos/template/build-profile.json5 +36 -0
- biucingcli/template_data/harmonyos/template/code-linter.json5 +12 -0
- biucingcli/template_data/harmonyos/template/docs/release-signing.local.properties.example +14 -0
- biucingcli/template_data/harmonyos/template/entry/build-profile.json5 +9 -0
- biucingcli/template_data/harmonyos/template/entry/hvigorfile.ts +6 -0
- biucingcli/template_data/harmonyos/template/entry/oh-package.json5 +9 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/ets/core/config/AppConfig.ets +10 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/ets/core/designsystem/Tokens.ets +28 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/ets/entryability/EntryAbility.ets +29 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/ets/pages/Index.ets +47 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/ets/pages/Settings.ets +96 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/module.json5 +34 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/element/color.json +24 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/element/string.json +12 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/media/app_icon.svg +5 -0
- biucingcli/template_data/harmonyos/template/entry/src/main/resources/base/profile/main_pages.json +6 -0
- biucingcli/template_data/harmonyos/template/entry/src/test/List.test.ets +11 -0
- biucingcli/template_data/harmonyos/template/hvigor/hvigor-config.json5 +8 -0
- biucingcli/template_data/harmonyos/template/hvigorfile.ts +6 -0
- biucingcli/template_data/harmonyos/template/oh-package-lock.json5 +19 -0
- biucingcli/template_data/harmonyos/template/oh-package.json5 +13 -0
- biucingcli/template_data/harmonyos/template/scripts/artifact-info +31 -0
- biucingcli/template_data/harmonyos/template/scripts/bootstrap +38 -0
- biucingcli/template_data/harmonyos/template/scripts/doctor +147 -0
- biucingcli/template_data/harmonyos/template/scripts/lint +105 -0
- biucingcli/template_data/harmonyos/template/scripts/release-build +199 -0
- biucingcli/template_data/harmonyos/template/scripts/release-preflight +109 -0
- biucingcli/template_data/harmonyos/template/scripts/test +28 -0
- biucingcli/template_data/harmonyos/template/scripts/verify-release-artifact +173 -0
- biucingcli/template_data/harmonyos/template/scripts/verify-supply-chain +70 -0
- biucingcli/template_data/harmonyos/template.json +134 -0
- biucingcli/template_data/microservice/template/.air.toml +11 -0
- biucingcli/template_data/microservice/template/.dockerignore +5 -0
- biucingcli/template_data/microservice/template/.gitignore +4 -0
- biucingcli/template_data/microservice/template/.mise.toml +3 -0
- biucingcli/template_data/microservice/template/Brewfile +7 -0
- biucingcli/template_data/microservice/template/Dockerfile +44 -0
- biucingcli/template_data/microservice/template/Dockerfile.dev +50 -0
- biucingcli/template_data/microservice/template/Makefile +145 -0
- biucingcli/template_data/microservice/template/README.md +191 -0
- biucingcli/template_data/microservice/template/api/buf.gen.yaml +11 -0
- biucingcli/template_data/microservice/template/api/buf.yaml +11 -0
- biucingcli/template_data/microservice/template/api/proto/service/v1/service.proto +18 -0
- biucingcli/template_data/microservice/template/cmd/server/main.go +81 -0
- biucingcli/template_data/microservice/template/compose.dev.yaml +49 -0
- biucingcli/template_data/microservice/template/configs/config.yaml +18 -0
- biucingcli/template_data/microservice/template/deploy/compose.yaml +35 -0
- biucingcli/template_data/microservice/template/deploy/otel-collector.yaml +15 -0
- biucingcli/template_data/microservice/template/go.mod +53 -0
- biucingcli/template_data/microservice/template/go.sum +138 -0
- biucingcli/template_data/microservice/template/internal/config/config.go +112 -0
- biucingcli/template_data/microservice/template/internal/config/config_test.go +92 -0
- biucingcli/template_data/microservice/template/internal/handler/health.go +25 -0
- biucingcli/template_data/microservice/template/internal/handler/ping.go +25 -0
- biucingcli/template_data/microservice/template/internal/model/health.go +8 -0
- biucingcli/template_data/microservice/template/internal/model/ping.go +7 -0
- biucingcli/template_data/microservice/template/internal/repository/.gitkeep +1 -0
- biucingcli/template_data/microservice/template/internal/router/router.go +26 -0
- biucingcli/template_data/microservice/template/internal/runtime/server.go +116 -0
- biucingcli/template_data/microservice/template/internal/runtime/server_test.go +161 -0
- biucingcli/template_data/microservice/template/internal/service/health.go +26 -0
- biucingcli/template_data/microservice/template/internal/service/ping.go +23 -0
- biucingcli/template_data/microservice/template/internal/telemetry/telemetry.go +56 -0
- biucingcli/template_data/microservice/template/internal/transport/grpc.go +51 -0
- biucingcli/template_data/microservice/template/internal/transport/ping.go +28 -0
- biucingcli/template_data/microservice/template/scripts/bootstrap +29 -0
- biucingcli/template_data/microservice/template/scripts/doctor +115 -0
- biucingcli/template_data/microservice/template/tests/server_test.go +153 -0
- biucingcli/template_data/microservice/template.json +114 -0
- biucingcli/template_data/web-service/template/.air.toml +11 -0
- biucingcli/template_data/web-service/template/.dockerignore +5 -0
- biucingcli/template_data/web-service/template/.gitignore +5 -0
- biucingcli/template_data/web-service/template/.mise.toml +2 -0
- biucingcli/template_data/web-service/template/Brewfile +5 -0
- biucingcli/template_data/web-service/template/Dockerfile +41 -0
- biucingcli/template_data/web-service/template/Dockerfile.dev +45 -0
- biucingcli/template_data/web-service/template/Makefile +113 -0
- biucingcli/template_data/web-service/template/README.md +164 -0
- biucingcli/template_data/web-service/template/cmd/server/main.go +50 -0
- biucingcli/template_data/web-service/template/compose.dev.yaml +28 -0
- biucingcli/template_data/web-service/template/compose.yaml +14 -0
- biucingcli/template_data/web-service/template/configs/config.yaml +10 -0
- biucingcli/template_data/web-service/template/go.mod +36 -0
- biucingcli/template_data/web-service/template/go.sum +89 -0
- biucingcli/template_data/web-service/template/internal/config/config.go +84 -0
- biucingcli/template_data/web-service/template/internal/config/config_test.go +88 -0
- biucingcli/template_data/web-service/template/internal/handler/health.go +25 -0
- biucingcli/template_data/web-service/template/internal/handler/ping.go +25 -0
- biucingcli/template_data/web-service/template/internal/handler/user.go +40 -0
- biucingcli/template_data/web-service/template/internal/model/health.go +6 -0
- biucingcli/template_data/web-service/template/internal/model/ping.go +7 -0
- biucingcli/template_data/web-service/template/internal/model/user.go +7 -0
- biucingcli/template_data/web-service/template/internal/repository/.gitkeep +1 -0
- biucingcli/template_data/web-service/template/internal/repository/user.go +37 -0
- biucingcli/template_data/web-service/template/internal/router/router.go +28 -0
- biucingcli/template_data/web-service/template/internal/runtime/server.go +76 -0
- biucingcli/template_data/web-service/template/internal/runtime/server_test.go +139 -0
- biucingcli/template_data/web-service/template/internal/service/health.go +22 -0
- biucingcli/template_data/web-service/template/internal/service/ping.go +23 -0
- biucingcli/template_data/web-service/template/internal/service/user.go +27 -0
- biucingcli/template_data/web-service/template/scripts/bootstrap +23 -0
- biucingcli/template_data/web-service/template/scripts/doctor +83 -0
- biucingcli/template_data/web-service/template/tests/server_test.go +160 -0
- biucingcli/template_data/web-service/template.json +88 -0
- biucingcli/template_data/worker/template/.dockerignore +3 -0
- biucingcli/template_data/worker/template/.gitignore +2 -0
- biucingcli/template_data/worker/template/.mise.toml +2 -0
- biucingcli/template_data/worker/template/Brewfile +1 -0
- biucingcli/template_data/worker/template/Dockerfile +19 -0
- biucingcli/template_data/worker/template/Dockerfile.dev +9 -0
- biucingcli/template_data/worker/template/Makefile +105 -0
- biucingcli/template_data/worker/template/README.md +164 -0
- biucingcli/template_data/worker/template/cmd/worker/main.go +41 -0
- biucingcli/template_data/worker/template/compose.dev.yaml +29 -0
- biucingcli/template_data/worker/template/configs/config.json +11 -0
- biucingcli/template_data/worker/template/go.mod +3 -0
- biucingcli/template_data/worker/template/go.sum +1 -0
- biucingcli/template_data/worker/template/internal/config/config.go +108 -0
- biucingcli/template_data/worker/template/internal/config/config_test.go +86 -0
- biucingcli/template_data/worker/template/internal/runtime/runner.go +199 -0
- biucingcli/template_data/worker/template/internal/runtime/runner_test.go +215 -0
- biucingcli/template_data/worker/template/internal/task/heartbeat.go +19 -0
- biucingcli/template_data/worker/template/scripts/bootstrap +6 -0
- biucingcli/template_data/worker/template/scripts/doctor +41 -0
- biucingcli/template_data/worker/template/tests/worker_test.go +44 -0
- biucingcli/template_data/worker/template.json +100 -0
- biucingcli/templates.py +902 -0
- biucingcli-0.9.1.dist-info/METADATA +204 -0
- biucingcli-0.9.1.dist-info/RECORD +269 -0
- biucingcli-0.9.1.dist-info/WHEEL +5 -0
- biucingcli-0.9.1.dist-info/entry_points.txt +2 -0
- biucingcli-0.9.1.dist-info/top_level.txt +1 -0
|
@@ -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,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,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
|
+
}
|