pubship 0.24.0__tar.gz

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 (259) hide show
  1. pubship-0.24.0/.dockerignore +13 -0
  2. pubship-0.24.0/.gitignore +27 -0
  3. pubship-0.24.0/AGENTS.md +26 -0
  4. pubship-0.24.0/CHANGELOG.md +14 -0
  5. pubship-0.24.0/CLAUDE.md +26 -0
  6. pubship-0.24.0/CONTRIBUTING.md +3 -0
  7. pubship-0.24.0/Dockerfile +21 -0
  8. pubship-0.24.0/LEGAL.md +13 -0
  9. pubship-0.24.0/LICENSE +661 -0
  10. pubship-0.24.0/PKG-INFO +142 -0
  11. pubship-0.24.0/README.md +121 -0
  12. pubship-0.24.0/SECURITY.md +5 -0
  13. pubship-0.24.0/THIRD_PARTY_NOTICES.md +58 -0
  14. pubship-0.24.0/TRADEMARKS.md +13 -0
  15. pubship-0.24.0/api/README.md +28 -0
  16. pubship-0.24.0/api/discovery/androidpublisher.json +14995 -0
  17. pubship-0.24.0/api/discovery/playdeveloperreporting.json +2678 -0
  18. pubship-0.24.0/api/discovery/storage.json +216 -0
  19. pubship-0.24.0/docs/account-access.md +136 -0
  20. pubship-0.24.0/docs/api-methods.md +206 -0
  21. pubship-0.24.0/docs/appstore.md +132 -0
  22. pubship-0.24.0/docs/architecture/001-local-first.md +9 -0
  23. pubship-0.24.0/docs/architecture/002-local-edit-lifecycle.md +46 -0
  24. pubship-0.24.0/docs/architecture/003-track-staging.md +36 -0
  25. pubship-0.24.0/docs/architecture/004-local-publisher-reads.md +37 -0
  26. pubship-0.24.0/docs/architecture/005-local-edit-resource-writes.md +45 -0
  27. pubship-0.24.0/docs/architecture/006-local-artifacts.md +48 -0
  28. pubship-0.24.0/docs/architecture/007-local-commerce.md +60 -0
  29. pubship-0.24.0/docs/architecture/008-one-time-commerce.md +53 -0
  30. pubship-0.24.0/docs/architecture/009-legacy-managed-products.md +29 -0
  31. pubship-0.24.0/docs/architecture/010-support-delivery.md +63 -0
  32. pubship-0.24.0/docs/architecture/011-purchase-lifecycle.md +184 -0
  33. pubship-0.24.0/docs/artifacts.md +170 -0
  34. pubship-0.24.0/docs/assets/api-coverage.svg +38 -0
  35. pubship-0.24.0/docs/clients.md +110 -0
  36. pubship-0.24.0/docs/dependency-inventory.md +76 -0
  37. pubship-0.24.0/docs/distribution.md +18 -0
  38. pubship-0.24.0/docs/edit-lifecycle.md +139 -0
  39. pubship-0.24.0/docs/edit-writes.md +176 -0
  40. pubship-0.24.0/docs/hosted-capabilities.md +228 -0
  41. pubship-0.24.0/docs/hosted-transfers.md +77 -0
  42. pubship-0.24.0/docs/hosting.md +40 -0
  43. pubship-0.24.0/docs/legacy-products.md +78 -0
  44. pubship-0.24.0/docs/listing-preview.md +66 -0
  45. pubship-0.24.0/docs/listing-staging.md +112 -0
  46. pubship-0.24.0/docs/monetization.md +120 -0
  47. pubship-0.24.0/docs/one-time-products.md +81 -0
  48. pubship-0.24.0/docs/provider-acceptance.md +37 -0
  49. pubship-0.24.0/docs/provider-verification.md +180 -0
  50. pubship-0.24.0/docs/publisher-edits.md +84 -0
  51. pubship-0.24.0/docs/publisher-reads.md +124 -0
  52. pubship-0.24.0/docs/purchase-lifecycle.md +149 -0
  53. pubship-0.24.0/docs/releases/v0.24.0.md +16 -0
  54. pubship-0.24.0/docs/releasing.md +12 -0
  55. pubship-0.24.0/docs/roadmap.md +5 -0
  56. pubship-0.24.0/docs/setup.md +101 -0
  57. pubship-0.24.0/docs/signing.md +95 -0
  58. pubship-0.24.0/docs/support-operations.md +129 -0
  59. pubship-0.24.0/docs/track-staging.md +110 -0
  60. pubship-0.24.0/docs/validation.md +7 -0
  61. pubship-0.24.0/docs/vault-recovery.md +129 -0
  62. pubship-0.24.0/pyproject.toml +61 -0
  63. pubship-0.24.0/scripts/check_artifacts.py +66 -0
  64. pubship-0.24.0/scripts/distribution_metadata.py +48 -0
  65. pubship-0.24.0/scripts/generate_catalog.py +323 -0
  66. pubship-0.24.0/scripts/generate_verification.py +155 -0
  67. pubship-0.24.0/scripts/hosted_transfer_client.py +236 -0
  68. pubship-0.24.0/scripts/ops/operator_backup.py +665 -0
  69. pubship-0.24.0/scripts/ops/pubship-backup-report.service +15 -0
  70. pubship-0.24.0/scripts/ops/pubship-backup-status.service +16 -0
  71. pubship-0.24.0/scripts/ops/pubship-backup-status.timer +10 -0
  72. pubship-0.24.0/scripts/ops/pubship-backup.service +32 -0
  73. pubship-0.24.0/scripts/ops/pubship-backup.timer +11 -0
  74. pubship-0.24.0/scripts/ops/receiver.example.json +7 -0
  75. pubship-0.24.0/scripts/ops/source.example.json +6 -0
  76. pubship-0.24.0/scripts/prepare_pypi_release.py +376 -0
  77. pubship-0.24.0/scripts/prepare_registry_release.py +216 -0
  78. pubship-0.24.0/scripts/test_hosted_container.py +294 -0
  79. pubship-0.24.0/scripts/test_hosted_launch.py +1638 -0
  80. pubship-0.24.0/scripts/test_hosted_load.py +548 -0
  81. pubship-0.24.0/server.json +24 -0
  82. pubship-0.24.0/src/pubship/__init__.py +3 -0
  83. pubship-0.24.0/src/pubship/account_access.py +322 -0
  84. pubship-0.24.0/src/pubship/account_access_config.py +99 -0
  85. pubship-0.24.0/src/pubship/account_access_contracts.py +151 -0
  86. pubship-0.24.0/src/pubship/account_access_http.py +213 -0
  87. pubship-0.24.0/src/pubship/account_access_tools.py +74 -0
  88. pubship-0.24.0/src/pubship/appstore.py +307 -0
  89. pubship-0.24.0/src/pubship/appstore_config.py +68 -0
  90. pubship-0.24.0/src/pubship/appstore_contracts.py +226 -0
  91. pubship-0.24.0/src/pubship/appstore_http.py +145 -0
  92. pubship-0.24.0/src/pubship/appstore_tools.py +77 -0
  93. pubship-0.24.0/src/pubship/artifact.py +502 -0
  94. pubship-0.24.0/src/pubship/artifact_contracts.py +438 -0
  95. pubship-0.24.0/src/pubship/artifact_files.py +298 -0
  96. pubship-0.24.0/src/pubship/artifact_http.py +176 -0
  97. pubship-0.24.0/src/pubship/auth.py +113 -0
  98. pubship-0.24.0/src/pubship/catalog.py +94 -0
  99. pubship-0.24.0/src/pubship/config.py +386 -0
  100. pubship-0.24.0/src/pubship/contracts.json +10576 -0
  101. pubship-0.24.0/src/pubship/contracts.py +129 -0
  102. pubship-0.24.0/src/pubship/coverage.py +254 -0
  103. pubship-0.24.0/src/pubship/edit_lifecycle.py +216 -0
  104. pubship-0.24.0/src/pubship/edit_lifecycle_http.py +152 -0
  105. pubship-0.24.0/src/pubship/edit_writes.py +282 -0
  106. pubship-0.24.0/src/pubship/edit_writes_contracts.py +291 -0
  107. pubship-0.24.0/src/pubship/edit_writes_http.py +58 -0
  108. pubship-0.24.0/src/pubship/errors.py +5 -0
  109. pubship-0.24.0/src/pubship/hosted.py +983 -0
  110. pubship-0.24.0/src/pubship/hosted_administration.py +213 -0
  111. pubship-0.24.0/src/pubship/hosted_cancellation.py +89 -0
  112. pubship-0.24.0/src/pubship/hosted_catalog.py +288 -0
  113. pubship-0.24.0/src/pubship/hosted_config.py +172 -0
  114. pubship-0.24.0/src/pubship/hosted_distribution.py +305 -0
  115. pubship-0.24.0/src/pubship/hosted_edits.py +674 -0
  116. pubship-0.24.0/src/pubship/hosted_grants.py +627 -0
  117. pubship-0.24.0/src/pubship/hosted_pages.py +124 -0
  118. pubship-0.24.0/src/pubship/hosted_token_transport.py +71 -0
  119. pubship-0.24.0/src/pubship/hosted_tools.py +631 -0
  120. pubship-0.24.0/src/pubship/hosted_transfer_client.py +289 -0
  121. pubship-0.24.0/src/pubship/hosted_transfer_http.py +231 -0
  122. pubship-0.24.0/src/pubship/hosted_transfers.py +650 -0
  123. pubship-0.24.0/src/pubship/http.py +115 -0
  124. pubship-0.24.0/src/pubship/legacy_product_contracts.py +210 -0
  125. pubship-0.24.0/src/pubship/listing_preview.py +105 -0
  126. pubship-0.24.0/src/pubship/methods.json +6816 -0
  127. pubship-0.24.0/src/pubship/monetization.py +262 -0
  128. pubship-0.24.0/src/pubship/monetization_contracts.py +363 -0
  129. pubship-0.24.0/src/pubship/monetization_http.py +134 -0
  130. pubship-0.24.0/src/pubship/oauth.py +596 -0
  131. pubship-0.24.0/src/pubship/onetime_contracts.py +300 -0
  132. pubship-0.24.0/src/pubship/operator_identity.py +81 -0
  133. pubship-0.24.0/src/pubship/play.py +120 -0
  134. pubship-0.24.0/src/pubship/provider_transport.py +146 -0
  135. pubship-0.24.0/src/pubship/publisher_reads.py +74 -0
  136. pubship-0.24.0/src/pubship/publisher_reads_contracts.py +147 -0
  137. pubship-0.24.0/src/pubship/publishing.py +251 -0
  138. pubship-0.24.0/src/pubship/publishing_http.py +78 -0
  139. pubship-0.24.0/src/pubship/purchase.py +248 -0
  140. pubship-0.24.0/src/pubship/purchase_contracts.py +609 -0
  141. pubship-0.24.0/src/pubship/purchase_http.py +726 -0
  142. pubship-0.24.0/src/pubship/reporting.py +79 -0
  143. pubship-0.24.0/src/pubship/reports.py +147 -0
  144. pubship-0.24.0/src/pubship/server.py +819 -0
  145. pubship-0.24.0/src/pubship/sharing.py +366 -0
  146. pubship-0.24.0/src/pubship/signing.py +434 -0
  147. pubship-0.24.0/src/pubship/signing_tools.py +59 -0
  148. pubship-0.24.0/src/pubship/support.py +228 -0
  149. pubship-0.24.0/src/pubship/support_contracts.py +315 -0
  150. pubship-0.24.0/src/pubship/support_http.py +335 -0
  151. pubship-0.24.0/src/pubship/track_staging.py +244 -0
  152. pubship-0.24.0/src/pubship/track_staging_http.py +221 -0
  153. pubship-0.24.0/src/pubship/vault.py +425 -0
  154. pubship-0.24.0/src/pubship/vault_recovery.py +258 -0
  155. pubship-0.24.0/tests/browser/test_hosted_021_consent_browser.py +115 -0
  156. pubship-0.24.0/tests/browser/test_hosted_consent_browser.py +616 -0
  157. pubship-0.24.0/tests/conftest.py +15 -0
  158. pubship-0.24.0/tests/test_account_access.py +516 -0
  159. pubship-0.24.0/tests/test_account_mcp_integration.py +126 -0
  160. pubship-0.24.0/tests/test_appstore_adversarial.py +217 -0
  161. pubship-0.24.0/tests/test_appstore_contracts.py +217 -0
  162. pubship-0.24.0/tests/test_appstore_mcp.py +195 -0
  163. pubship-0.24.0/tests/test_appstore_service.py +184 -0
  164. pubship-0.24.0/tests/test_appstore_transport.py +142 -0
  165. pubship-0.24.0/tests/test_artifact_symbol_versions.py +116 -0
  166. pubship-0.24.0/tests/test_artifacts_adversarial.py +835 -0
  167. pubship-0.24.0/tests/test_artifacts_engineering.py +512 -0
  168. pubship-0.24.0/tests/test_bulk_read_deadline.py +52 -0
  169. pubship-0.24.0/tests/test_catalog_mcp.py +174 -0
  170. pubship-0.24.0/tests/test_completion_architecture.py +125 -0
  171. pubship-0.24.0/tests/test_core.py +318 -0
  172. pubship-0.24.0/tests/test_distribution.py +281 -0
  173. pubship-0.24.0/tests/test_edit_lifecycle_adversarial.py +393 -0
  174. pubship-0.24.0/tests/test_edit_lifecycle_engineering.py +250 -0
  175. pubship-0.24.0/tests/test_edit_writes_adversarial.py +786 -0
  176. pubship-0.24.0/tests/test_edit_writes_engineering.py +394 -0
  177. pubship-0.24.0/tests/test_hosted.py +410 -0
  178. pubship-0.24.0/tests/test_hosted_017_adversarial.py +122 -0
  179. pubship-0.24.0/tests/test_hosted_017_http.py +199 -0
  180. pubship-0.24.0/tests/test_hosted_018_engine_hooks.py +405 -0
  181. pubship-0.24.0/tests/test_hosted_018_registry.py +509 -0
  182. pubship-0.24.0/tests/test_hosted_018_tools.py +266 -0
  183. pubship-0.24.0/tests/test_hosted_019_adversarial.py +330 -0
  184. pubship-0.24.0/tests/test_hosted_019_engine_hooks.py +381 -0
  185. pubship-0.24.0/tests/test_hosted_019_grants.py +108 -0
  186. pubship-0.24.0/tests/test_hosted_019_registry.py +427 -0
  187. pubship-0.24.0/tests/test_hosted_019_tools.py +352 -0
  188. pubship-0.24.0/tests/test_hosted_020_adversarial.py +465 -0
  189. pubship-0.24.0/tests/test_hosted_020_catalog.py +117 -0
  190. pubship-0.24.0/tests/test_hosted_020_consent.py +78 -0
  191. pubship-0.24.0/tests/test_hosted_020_engine_hooks.py +522 -0
  192. pubship-0.24.0/tests/test_hosted_020_grants.py +233 -0
  193. pubship-0.24.0/tests/test_hosted_020_loopback.py +630 -0
  194. pubship-0.24.0/tests/test_hosted_020_reference_callback.py +53 -0
  195. pubship-0.24.0/tests/test_hosted_020_registry.py +486 -0
  196. pubship-0.24.0/tests/test_hosted_020_transfer_client.py +229 -0
  197. pubship-0.24.0/tests/test_hosted_020_transfer_http.py +312 -0
  198. pubship-0.24.0/tests/test_hosted_020_transfers.py +423 -0
  199. pubship-0.24.0/tests/test_hosted_021_adversarial.py +465 -0
  200. pubship-0.24.0/tests/test_hosted_021_catalog.py +106 -0
  201. pubship-0.24.0/tests/test_hosted_021_consent.py +266 -0
  202. pubship-0.24.0/tests/test_hosted_021_engines.py +459 -0
  203. pubship-0.24.0/tests/test_hosted_021_grants.py +430 -0
  204. pubship-0.24.0/tests/test_hosted_021_loopback.py +408 -0
  205. pubship-0.24.0/tests/test_hosted_021_registry.py +517 -0
  206. pubship-0.24.0/tests/test_hosted_adversarial.py +482 -0
  207. pubship-0.24.0/tests/test_hosted_callback_deadline.py +43 -0
  208. pubship-0.24.0/tests/test_hosted_cancellation_identity.py +72 -0
  209. pubship-0.24.0/tests/test_hosted_catalog.py +138 -0
  210. pubship-0.24.0/tests/test_hosted_consent.py +210 -0
  211. pubship-0.24.0/tests/test_hosted_dispatch_boundary.py +50 -0
  212. pubship-0.24.0/tests/test_hosted_download_disconnect.py +66 -0
  213. pubship-0.24.0/tests/test_hosted_edits.py +637 -0
  214. pubship-0.24.0/tests/test_hosted_execution_cancellation.py +231 -0
  215. pubship-0.24.0/tests/test_hosted_grants.py +271 -0
  216. pubship-0.24.0/tests/test_hosted_launch.py +372 -0
  217. pubship-0.24.0/tests/test_hosted_refresh_integration.py +46 -0
  218. pubship-0.24.0/tests/test_hosted_token_transport.py +211 -0
  219. pubship-0.24.0/tests/test_hosted_tools.py +344 -0
  220. pubship-0.24.0/tests/test_legacy_products.py +327 -0
  221. pubship-0.24.0/tests/test_listing_preview.py +168 -0
  222. pubship-0.24.0/tests/test_listing_preview_adversarial.py +341 -0
  223. pubship-0.24.0/tests/test_listing_staging_adversarial.py +254 -0
  224. pubship-0.24.0/tests/test_listing_staging_engineering.py +261 -0
  225. pubship-0.24.0/tests/test_monetization.py +690 -0
  226. pubship-0.24.0/tests/test_oauth_capacity_isolation.py +198 -0
  227. pubship-0.24.0/tests/test_onetime_commerce.py +427 -0
  228. pubship-0.24.0/tests/test_operator_allowlist.py +206 -0
  229. pubship-0.24.0/tests/test_operator_backup.py +533 -0
  230. pubship-0.24.0/tests/test_provider_transport_deadlines.py +455 -0
  231. pubship-0.24.0/tests/test_provider_transport_lifetime.py +207 -0
  232. pubship-0.24.0/tests/test_public_admission.py +356 -0
  233. pubship-0.24.0/tests/test_publisher_edits.py +220 -0
  234. pubship-0.24.0/tests/test_publisher_edits_adversarial.py +254 -0
  235. pubship-0.24.0/tests/test_publisher_no_content.py +90 -0
  236. pubship-0.24.0/tests/test_publisher_reads_adversarial.py +647 -0
  237. pubship-0.24.0/tests/test_publisher_reads_engineering.py +281 -0
  238. pubship-0.24.0/tests/test_pubship_identity.py +38 -0
  239. pubship-0.24.0/tests/test_purchase_config.py +113 -0
  240. pubship-0.24.0/tests/test_purchase_contracts.py +793 -0
  241. pubship-0.24.0/tests/test_purchase_mcp.py +141 -0
  242. pubship-0.24.0/tests/test_purchase_service_adversarial.py +467 -0
  243. pubship-0.24.0/tests/test_purchase_transport.py +738 -0
  244. pubship-0.24.0/tests/test_registry_distribution.py +232 -0
  245. pubship-0.24.0/tests/test_reporting.py +388 -0
  246. pubship-0.24.0/tests/test_sharing.py +364 -0
  247. pubship-0.24.0/tests/test_signing.py +297 -0
  248. pubship-0.24.0/tests/test_signing_adversarial.py +486 -0
  249. pubship-0.24.0/tests/test_support_contracts.py +358 -0
  250. pubship-0.24.0/tests/test_support_service_adversarial.py +410 -0
  251. pubship-0.24.0/tests/test_support_transport.py +311 -0
  252. pubship-0.24.0/tests/test_track_staging_adversarial.py +599 -0
  253. pubship-0.24.0/tests/test_track_staging_engineering.py +335 -0
  254. pubship-0.24.0/tests/test_vault_capacity.py +328 -0
  255. pubship-0.24.0/tests/test_vault_launch_capacity.py +468 -0
  256. pubship-0.24.0/tests/test_vault_migration_memory.py +99 -0
  257. pubship-0.24.0/tests/test_vault_recovery.py +363 -0
  258. pubship-0.24.0/tests/test_voided_disabled.py +55 -0
  259. pubship-0.24.0/uv.lock +1399 -0
@@ -0,0 +1,13 @@
1
+ # An allowlist avoids sending credentials and local exports to the Docker daemon.
2
+ **
3
+ !pyproject.toml
4
+ !uv.lock
5
+ !README.md
6
+ !LICENSE
7
+ !src/
8
+ !src/pubship/
9
+ !src/pubship/*.py
10
+ !src/pubship/methods.json
11
+ !src/pubship/contracts.json
12
+ !THIRD_PARTY_NOTICES.md
13
+ !TRADEMARKS.md
@@ -0,0 +1,27 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.py[cod]
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ .coverage
7
+ coverage.xml
8
+ htmlcov/
9
+ dist/
10
+ *.egg-info/
11
+ .env
12
+ .env.*
13
+ !.env.example
14
+ *credentials*.json
15
+ *service-account*.json
16
+ reports/
17
+ .DS_Store
18
+ *.pem
19
+ *.key
20
+ *.p12
21
+ *.pfx
22
+ client_secret*.json
23
+ application_default_credentials.json
24
+ secrets/
25
+ private/
26
+ *.sqlite*
27
+ *.db
@@ -0,0 +1,26 @@
1
+ # PubShip project instructions
2
+
3
+ Owner: Denys Vorobyov. AGPL-3.0-only is fixed. No outside code contributions. Accept bug reports, ideas and questions as issues, not submitted code. Preserve third-party notices. No Google marks in product names or logos.
4
+
5
+ ## Product boundaries
6
+
7
+ Local-first, with the developer's own credentials. No project-run Google service. Self-hosting is only for the operator's own Google accounts. PUBSHIP_SERVER_ALLOWED_EMAILS is mandatory and must match Google's cryptographically verified email before credentials are stored. Enrollment is closed by default. Never add ADC fallback to HTTP mode or bypass the allowlist. Voided-purchase data must never reach an MCP client.
8
+
9
+ Keep GOOGLE_PLAY_* environment names stable. HTTP configuration uses PUBSHIP_SERVER_*. Never commit credentials, account exports or operator configuration. Tests use fakes, with GOOGLE_APPLICATION_CREDENTIALS unset at invocation. Keep dependencies, CI actions and generated discovery metadata reproducible. Do not describe synthetic tests as live Google verification.
10
+
11
+ ## Four-hat delivery
12
+
13
+ 1. Architecture: review contracts, authorization, identity, storage and failure paths.
14
+ 2. Engineering: implement focused changes and perform adversarial code review.
15
+ 3. QA: test success, rejection, isolation, packaging and client behavior. Never weaken a failing check.
16
+ 4. Delivery/TPM: keep scope, issue/PR links, README, release notes and validation evidence synchronized.
17
+
18
+ Keep issue -> branch -> PR -> checks -> owner review -> merge -> bundled release traceable. Never approve a review or GitHub deployment yourself. Do not rewrite published tags or assets. Never add unsolicited commit attribution.
19
+
20
+ ## Documentation and website
21
+
22
+ Review https://github.com/pubship/website in the same delivery cycle for every feature, authentication, release or data-handling change. Record exact claims checked when no website change is needed. Distinguish available source, published packages and deployments. Keep README, Claude Code, Codex and generic MCP client instructions aligned. No em-dashes in shipped files.
23
+
24
+ ## Commands
25
+
26
+ Use uv with the src layout. Run full pytest, ruff check, ruff format --check, generator checks, uv build, artifact inspection and redacted secret scanning. Use the pinned API discovery files without fetching credentials or changing provider contracts.
@@ -0,0 +1,14 @@
1
+ # Changelog
2
+
3
+ ## 0.24.0
4
+
5
+ - Distribution, import package and MCP name are `pubship`. Commands are `pubship` and `pubship-server`.
6
+ - Local use with your own Google credentials is the primary experience. The project does not operate a Google-connected service.
7
+ - Self-host configuration uses `PUBSHIP_SERVER_*`; local `GOOGLE_PLAY_*` names remain unchanged.
8
+ - Self-host startup requires an exact operator email allowlist. Signed Google identity, verified email and nonce are checked before storing credentials. Old or removed-account grants cannot be reused.
9
+ - Voided-purchases access is disabled in all execution paths. The inventory preserves its official definition as policy disabled.
10
+ - Legal notices, client setup, website and distribution workflows use the new identity. Outside code contributions are not accepted.
11
+
12
+ ## Validation
13
+
14
+ This candidate must pass the full synthetic suite, lint/format, generator checks, packaging, artifact inspection, secret scanning and website checks before publication. No real Google credentials or production mutations are used for migration acceptance. Publication and deployment require separate owner gates.
@@ -0,0 +1,26 @@
1
+ # Claude Code instructions
2
+
3
+ Read and follow [AGENTS.md](AGENTS.md).
4
+
5
+ # PubShip project instructions
6
+
7
+ Owner: Denys Vorobyov. AGPL-3.0-only is fixed. No outside code contributions. Accept bug reports, ideas and questions as issues, not submitted code. Preserve third-party notices. No Google marks in product names or logos.
8
+
9
+ ## Product boundaries
10
+
11
+ Local-first, with the developer's own credentials. No project-run Google service. Self-hosting is only for the operator's own Google accounts. PUBSHIP_SERVER_ALLOWED_EMAILS is mandatory and must match Google's cryptographically verified email before credentials are stored. Enrollment is closed by default. Never add ADC fallback to HTTP mode or bypass the allowlist. Voided-purchase data must never reach an MCP client.
12
+
13
+ Keep GOOGLE_PLAY_* environment names stable. HTTP configuration uses PUBSHIP_SERVER_*. Never commit credentials, account exports or operator configuration. Tests use fakes, with GOOGLE_APPLICATION_CREDENTIALS unset at invocation. Keep dependencies, CI actions and generated discovery metadata reproducible. Do not describe synthetic tests as live Google verification.
14
+
15
+ ## Four-hat delivery
16
+
17
+ 1. Architecture: review contracts, authorization, identity, storage and failure paths.
18
+ 2. Engineering: implement focused changes and perform adversarial code review.
19
+ 3. QA: test success, rejection, isolation, packaging and client behavior. Never weaken a failing check.
20
+ 4. Delivery/TPM: keep scope, issue/PR links, README, release notes and validation evidence synchronized.
21
+
22
+ Keep issue -> branch -> PR -> checks -> owner review -> merge -> bundled release traceable. Never approve a review or GitHub deployment yourself. Do not rewrite published tags or assets. Never add unsolicited commit attribution.
23
+
24
+ ## Documentation and website
25
+
26
+ Review https://github.com/pubship/website in the same delivery cycle for every feature, authentication, release or data-handling change. Record exact claims checked when no website change is needed. Distinguish available source, published packages and deployments. Keep README, Claude Code, Codex and generic MCP client instructions aligned. No em-dashes in shipped files.
@@ -0,0 +1,3 @@
1
+ # Contributing
2
+
3
+ PubShip is open source but does not accept code contributions. Bug reports, ideas and questions are welcome as issues; please describe them in words, as code posted in issues or pull requests will not be merged. This keeps one copyright holder, so PubShip can also be offered under other license terms. Send security reports to security@pubship.dev, never to public issues.
@@ -0,0 +1,21 @@
1
+ FROM ghcr.io/astral-sh/uv:0.11.14@sha256:1025398289b62de8269e70c45b91ffa37c373f38118d7da036fb8bb8efc85d97 AS uv
2
+ FROM python:3.14-slim-trixie@sha256:c3e521df8b2b498a7a682e7e18676771cb80c6b75b8699af886b2d554ce40151 AS build
3
+ COPY --from=uv /uv /usr/local/bin/uv
4
+ WORKDIR /opt/app
5
+ COPY pyproject.toml uv.lock README.md LICENSE THIRD_PARTY_NOTICES.md TRADEMARKS.md ./
6
+ COPY src ./src
7
+ ENV UV_LINK_MODE=copy UV_PYTHON_DOWNLOADS=never
8
+ RUN uv sync --frozen --extra hosted --no-dev --no-editable --python /usr/local/bin/python
9
+
10
+ FROM python:3.14-slim-trixie@sha256:c3e521df8b2b498a7a682e7e18676771cb80c6b75b8699af886b2d554ce40151
11
+ LABEL org.opencontainers.image.source="https://github.com/pubship/pubship" \
12
+ org.opencontainers.image.licenses="AGPL-3.0-only"
13
+ RUN useradd --uid 10001 --create-home --shell /usr/sbin/nologin mcp \
14
+ && install -d -m 0700 -o 10001 -g 10001 /var/lib/pubship-transfers
15
+ COPY --from=build /opt/app/.venv /opt/app/.venv
16
+ ENV PATH="/opt/app/.venv/bin:$PATH" PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
17
+ USER 10001:10001
18
+ WORKDIR /home/mcp
19
+ EXPOSE 8080
20
+ ENTRYPOINT ["pubship-server"]
21
+ CMD ["--host", "0.0.0.0", "--port", "8080"]
@@ -0,0 +1,13 @@
1
+ # Intended use and legal notices
2
+
3
+ PubShip helps developers automate their own Google Play distribution work. It runs on your computer or on infrastructure you control, with your own Google credentials and Play Console permissions. The PubShip project does not run a hosted service and never receives your credentials. Use it only for apps and developer accounts that you or your organization own, and follow Google's Play Developer API Terms. Hosted PubShip instances run by others are not provided or endorsed by the PubShip project.
4
+
5
+ PubShip is an independent open-source project and is not affiliated with, endorsed by, or sponsored by Google. Google, Google Play and Android are trademarks of Google LLC.
6
+
7
+ PubShip is free software under the GNU Affero General Public License v3.0 only (AGPL-3.0-only). Copyright (C) 2026 Denys Vorobyov. For other license terms, contact legal@pubship.dev.
8
+
9
+ See [LICENSE](LICENSE), [TRADEMARKS.md](TRADEMARKS.md) and third-party notices for the applicable terms. Third-party dependencies and provider definitions retain their own licenses and notices.
10
+
11
+ ## Provider definitions
12
+
13
+ Pinned discovery descriptions and schemas originate from Google, not Denys Vorobyov. Their provenance is recorded in api/README.md and THIRD_PARTY_NOTICES.md. Preserve applicable upstream rights and notices; the project license does not relicense Google-origin material. Confirm the redistribution basis for those inputs with counsel before making broader ownership claims.