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,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,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,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 @@
|
|
|
1
|
+
|
|
@@ -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
|
+
}
|