tesla-cli 5.3.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 (437) hide show
  1. tesla_cli-5.3.0/.dockerignore +9 -0
  2. tesla_cli-5.3.0/.env.example +17 -0
  3. tesla_cli-5.3.0/.githooks/pre-push +20 -0
  4. tesla_cli-5.3.0/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
  5. tesla_cli-5.3.0/.github/ISSUE_TEMPLATE/feature_request.md +18 -0
  6. tesla_cli-5.3.0/.github/workflows/ci.yml +93 -0
  7. tesla_cli-5.3.0/.github/workflows/publish.yml +78 -0
  8. tesla_cli-5.3.0/.github/workflows/secret-scan.yml +31 -0
  9. tesla_cli-5.3.0/.gitignore +90 -0
  10. tesla_cli-5.3.0/.gitleaks.toml +45 -0
  11. tesla_cli-5.3.0/.python-version +1 -0
  12. tesla_cli-5.3.0/CHANGELOG.md +1599 -0
  13. tesla_cli-5.3.0/CLAUDE.md +94 -0
  14. tesla_cli-5.3.0/CONTRIBUTING.md +171 -0
  15. tesla_cli-5.3.0/Dockerfile +49 -0
  16. tesla_cli-5.3.0/LICENSE +21 -0
  17. tesla_cli-5.3.0/Makefile +78 -0
  18. tesla_cli-5.3.0/PKG-INFO +419 -0
  19. tesla_cli-5.3.0/README.md +370 -0
  20. tesla_cli-5.3.0/SECURITY.md +46 -0
  21. tesla_cli-5.3.0/docker-compose.full.yml +92 -0
  22. tesla_cli-5.3.0/docker-compose.yml +28 -0
  23. tesla_cli-5.3.0/docs/MIGRATION-PLAN-SOURCE-FIRST.md +220 -0
  24. tesla_cli-5.3.0/docs/TARGET-ARCHITECTURE.md +335 -0
  25. tesla_cli-5.3.0/docs/api-reference.md +378 -0
  26. tesla_cli-5.3.0/docs/architecture.md +198 -0
  27. tesla_cli-5.3.0/docs/configuration.md +162 -0
  28. tesla_cli-5.3.0/docs/data-sources.md +256 -0
  29. tesla_cli-5.3.0/docs/fleet-signed-setup.md +374 -0
  30. tesla_cli-5.3.0/docs/history-resynchronization.md +12 -0
  31. tesla_cli-5.3.0/docs/nav-route.md +157 -0
  32. tesla_cli-5.3.0/docs/research/competitive-analysis.md +1462 -0
  33. tesla_cli-5.3.0/docs/research/vatiolibre-comparison.md +242 -0
  34. tesla_cli-5.3.0/docs/roadmap.md +137 -0
  35. tesla_cli-5.3.0/docs/user-guide.md +692 -0
  36. tesla_cli-5.3.0/docs/why-tesla-cli.md +115 -0
  37. tesla_cli-5.3.0/notebooks/consumption-model-probe.ipynb +172 -0
  38. tesla_cli-5.3.0/plugins/claude-code/.claude-plugin/marketplace.json +31 -0
  39. tesla_cli-5.3.0/plugins/claude-code/.claude-plugin/plugin.json +14 -0
  40. tesla_cli-5.3.0/plugins/claude-code/.gitignore +5 -0
  41. tesla_cli-5.3.0/plugins/claude-code/CHANGELOG.md +50 -0
  42. tesla_cli-5.3.0/plugins/claude-code/CLAUDE.md +44 -0
  43. tesla_cli-5.3.0/plugins/claude-code/LICENSE +21 -0
  44. tesla_cli-5.3.0/plugins/claude-code/README.md +142 -0
  45. tesla_cli-5.3.0/plugins/claude-code/bin/tesla-check +63 -0
  46. tesla_cli-5.3.0/plugins/claude-code/docs/design.md +87 -0
  47. tesla_cli-5.3.0/plugins/claude-code/skills/analytics/SKILL.md +100 -0
  48. tesla_cli-5.3.0/plugins/claude-code/skills/automations/SKILL.md +98 -0
  49. tesla_cli-5.3.0/plugins/claude-code/skills/charge/SKILL.md +96 -0
  50. tesla_cli-5.3.0/plugins/claude-code/skills/control/SKILL.md +109 -0
  51. tesla_cli-5.3.0/plugins/claude-code/skills/dossier/SKILL.md +80 -0
  52. tesla_cli-5.3.0/plugins/claude-code/skills/energy/SKILL.md +74 -0
  53. tesla_cli-5.3.0/plugins/claude-code/skills/order/SKILL.md +86 -0
  54. tesla_cli-5.3.0/plugins/claude-code/skills/serve/SKILL.md +58 -0
  55. tesla_cli-5.3.0/plugins/claude-code/skills/setup/SKILL.md +90 -0
  56. tesla_cli-5.3.0/plugins/claude-code/skills/status/SKILL.md +107 -0
  57. tesla_cli-5.3.0/plugins/claude-code/skills/telemetry/SKILL.md +68 -0
  58. tesla_cli-5.3.0/plugins/claude-code/skills/tesla-context/SKILL.md +60 -0
  59. tesla_cli-5.3.0/pyproject.toml +82 -0
  60. tesla_cli-5.3.0/scripts/secret-scan.sh +276 -0
  61. tesla_cli-5.3.0/src/tesla_cli/__init__.py +3 -0
  62. tesla_cli-5.3.0/src/tesla_cli/__main__.py +5 -0
  63. tesla_cli-5.3.0/src/tesla_cli/api/__init__.py +0 -0
  64. tesla_cli-5.3.0/src/tesla_cli/api/app.py +721 -0
  65. tesla_cli-5.3.0/src/tesla_cli/api/audit.py +80 -0
  66. tesla_cli-5.3.0/src/tesla_cli/api/auth.py +190 -0
  67. tesla_cli-5.3.0/src/tesla_cli/api/command_policy.py +96 -0
  68. tesla_cli-5.3.0/src/tesla_cli/api/routes/__init__.py +1 -0
  69. tesla_cli-5.3.0/src/tesla_cli/api/routes/abrp.py +73 -0
  70. tesla_cli-5.3.0/src/tesla_cli/api/routes/alerts.py +25 -0
  71. tesla_cli-5.3.0/src/tesla_cli/api/routes/auth.py +439 -0
  72. tesla_cli-5.3.0/src/tesla_cli/api/routes/automations.py +149 -0
  73. tesla_cli-5.3.0/src/tesla_cli/api/routes/ble.py +114 -0
  74. tesla_cli-5.3.0/src/tesla_cli/api/routes/charge.py +372 -0
  75. tesla_cli-5.3.0/src/tesla_cli/api/routes/climate.py +105 -0
  76. tesla_cli-5.3.0/src/tesla_cli/api/routes/colombia.py +143 -0
  77. tesla_cli-5.3.0/src/tesla_cli/api/routes/dashcam.py +113 -0
  78. tesla_cli-5.3.0/src/tesla_cli/api/routes/doctor.py +19 -0
  79. tesla_cli-5.3.0/src/tesla_cli/api/routes/domains.py +32 -0
  80. tesla_cli-5.3.0/src/tesla_cli/api/routes/dossier.py +137 -0
  81. tesla_cli-5.3.0/src/tesla_cli/api/routes/drivers.py +119 -0
  82. tesla_cli-5.3.0/src/tesla_cli/api/routes/energy_mgmt.py +119 -0
  83. tesla_cli-5.3.0/src/tesla_cli/api/routes/energy_prices.py +108 -0
  84. tesla_cli-5.3.0/src/tesla_cli/api/routes/events.py +35 -0
  85. tesla_cli-5.3.0/src/tesla_cli/api/routes/fleet.py +91 -0
  86. tesla_cli-5.3.0/src/tesla_cli/api/routes/geofence.py +135 -0
  87. tesla_cli-5.3.0/src/tesla_cli/api/routes/init.py +237 -0
  88. tesla_cli-5.3.0/src/tesla_cli/api/routes/mission_control.py +21 -0
  89. tesla_cli-5.3.0/src/tesla_cli/api/routes/mqtt.py +85 -0
  90. tesla_cli-5.3.0/src/tesla_cli/api/routes/notify.py +204 -0
  91. tesla_cli-5.3.0/src/tesla_cli/api/routes/order.py +126 -0
  92. tesla_cli-5.3.0/src/tesla_cli/api/routes/planner.py +394 -0
  93. tesla_cli-5.3.0/src/tesla_cli/api/routes/scenes.py +218 -0
  94. tesla_cli-5.3.0/src/tesla_cli/api/routes/security.py +200 -0
  95. tesla_cli-5.3.0/src/tesla_cli/api/routes/service.py +127 -0
  96. tesla_cli-5.3.0/src/tesla_cli/api/routes/session.py +67 -0
  97. tesla_cli-5.3.0/src/tesla_cli/api/routes/sources.py +153 -0
  98. tesla_cli-5.3.0/src/tesla_cli/api/routes/teslaMate.py +509 -0
  99. tesla_cli-5.3.0/src/tesla_cli/api/routes/vehicle.py +412 -0
  100. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Action-D2jgMhrf.js +1 -0
  101. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Action-legacy-BjmsaTxz.js +1 -0
  102. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Alerts-CxjS0eWD.js +1 -0
  103. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Alerts-legacy-E7lXFTHf.js +1 -0
  104. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Analytics-BAF-OckK.js +1 -0
  105. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Analytics-legacy-BfqY0A3r.js +1 -0
  106. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Automations-ChtxOCVx.js +1 -0
  107. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Automations-legacy-D2rTa2Dc.js +1 -0
  108. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/BarChart-CbvPuOm8.js +1 -0
  109. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/BarChart-legacy-CKvoptiV.js +1 -0
  110. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CartesianChart-C7oiHq6H.js +32 -0
  111. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CartesianChart-legacy-C1alQFTe.js +10 -0
  112. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeContent-DHrBXiYI.js +1 -0
  113. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeContent-legacy-W8Pj2GRz.js +1 -0
  114. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeSessions-CmSw1u46.js +1 -0
  115. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeSessions-legacy-B6T9ZEkM.js +1 -0
  116. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ClimateContent-CQrV1cla.js +1 -0
  117. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ClimateContent-legacy-BrVp5Dw8.js +1 -0
  118. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ControlsContent-CstWZ5bj.js +1 -0
  119. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ControlsContent-legacy-BjAyXo8j.js +1 -0
  120. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CostsContent-CK0of5Oy.js +1 -0
  121. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CostsContent-legacy-CjT03-9Q.js +1 -0
  122. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Dossier-BmSpMi7X.js +1 -0
  123. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Dossier-legacy-BtJFqzv2.js +1 -0
  124. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Energy-DWGRyP9W.js +2 -0
  125. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Energy-legacy-cm2mJNfJ.js +1 -0
  126. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Icons-BuFerITU.js +1 -0
  127. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Icons-legacy-ZQJ5sKUd.js +1 -0
  128. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/LineChart-DGCQr4Nw.js +1 -0
  129. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/LineChart-legacy-DrxGX8f1.js +1 -0
  130. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Navigation-Du1Aj9kc.js +1 -0
  131. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Navigation-legacy-fSc5iGaQ.js +1 -0
  132. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Order-Bz8dMpHT.js +1 -0
  133. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Order-legacy-F2DYekX2.js +1 -0
  134. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Planner-BTzxH_5N.js +1 -0
  135. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Planner-legacy-CV10WexM.js +1 -0
  136. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Settings-B1fRZDgg.js +1 -0
  137. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Settings-legacy-DKofNQMT.js +1 -0
  138. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Timeline-Dsr24gQY.js +1 -0
  139. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Timeline-legacy-CRhBzQS3.js +1 -0
  140. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-BBVP4gU_.js +4 -0
  141. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-a6kZMJSm.css +1 -0
  142. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-legacy-DP7L_nrh.js +5 -0
  143. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/index-Co6dsD_A.css +1 -0
  144. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/index-DHJbtWU2.js +305 -0
  145. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/index-legacy-tYlhPd-t.js +407 -0
  146. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-BgwEQWW6-DWljCkpc.js +3 -0
  147. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-BgwEQWW6-legacy-BzXX8Hmf.js +5 -0
  148. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CBzELu-H-C6O9Iw3F.js +3 -0
  149. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CBzELu-H-legacy-o6pkl5Q3.js +5 -0
  150. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CU1SSH8_-gXCsnaTd.js +3 -0
  151. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CU1SSH8_-legacy-BN-w_Fja.js +5 -0
  152. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CneGxKsZ-DyyIfLCm.js +3 -0
  153. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CneGxKsZ-legacy-BvByEog5.js +5 -0
  154. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cwv-vmkN-DxmWWo4m.js +3 -0
  155. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cwv-vmkN-legacy-dIVDhulX.js +5 -0
  156. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cz5nLPGT-Ch5sGzu_.js +3 -0
  157. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cz5nLPGT-legacy-BGxjZQ_L.js +5 -0
  158. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/polyfills-legacy-BoMm-z7f.js +1 -0
  159. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/favicon.png +0 -0
  160. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/index.html +37 -0
  161. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/manifest.json +24 -0
  162. tesla_cli-5.3.0/src/tesla_cli/api/vehicle_hub.py +211 -0
  163. tesla_cli-5.3.0/src/tesla_cli/cli/__init__.py +0 -0
  164. tesla_cli-5.3.0/src/tesla_cli/cli/app.py +289 -0
  165. tesla_cli-5.3.0/src/tesla_cli/cli/commands/__init__.py +0 -0
  166. tesla_cli-5.3.0/src/tesla_cli/cli/commands/abrp.py +278 -0
  167. tesla_cli-5.3.0/src/tesla_cli/cli/commands/automations.py +804 -0
  168. tesla_cli-5.3.0/src/tesla_cli/cli/commands/ble.py +395 -0
  169. tesla_cli-5.3.0/src/tesla_cli/cli/commands/charge.py +1642 -0
  170. tesla_cli-5.3.0/src/tesla_cli/cli/commands/climate.py +432 -0
  171. tesla_cli-5.3.0/src/tesla_cli/cli/commands/config_cmd.py +1359 -0
  172. tesla_cli-5.3.0/src/tesla_cli/cli/commands/dashcam.py +255 -0
  173. tesla_cli-5.3.0/src/tesla_cli/cli/commands/data_cmd.py +893 -0
  174. tesla_cli-5.3.0/src/tesla_cli/cli/commands/doctor_cmd.py +164 -0
  175. tesla_cli-5.3.0/src/tesla_cli/cli/commands/domain_cmd.py +99 -0
  176. tesla_cli-5.3.0/src/tesla_cli/cli/commands/dossier.py +2203 -0
  177. tesla_cli-5.3.0/src/tesla_cli/cli/commands/energy.py +298 -0
  178. tesla_cli-5.3.0/src/tesla_cli/cli/commands/event_stream_cmd.py +108 -0
  179. tesla_cli-5.3.0/src/tesla_cli/cli/commands/events.py +102 -0
  180. tesla_cli-5.3.0/src/tesla_cli/cli/commands/geofence.py +246 -0
  181. tesla_cli-5.3.0/src/tesla_cli/cli/commands/ha.py +316 -0
  182. tesla_cli-5.3.0/src/tesla_cli/cli/commands/login.py +237 -0
  183. tesla_cli-5.3.0/src/tesla_cli/cli/commands/media.py +161 -0
  184. tesla_cli-5.3.0/src/tesla_cli/cli/commands/mqtt_cmd.py +413 -0
  185. tesla_cli-5.3.0/src/tesla_cli/cli/commands/nav.py +989 -0
  186. tesla_cli-5.3.0/src/tesla_cli/cli/commands/notify.py +249 -0
  187. tesla_cli-5.3.0/src/tesla_cli/cli/commands/order.py +1436 -0
  188. tesla_cli-5.3.0/src/tesla_cli/cli/commands/providers_cmd.py +194 -0
  189. tesla_cli-5.3.0/src/tesla_cli/cli/commands/runt.py +83 -0
  190. tesla_cli-5.3.0/src/tesla_cli/cli/commands/scenes.py +299 -0
  191. tesla_cli-5.3.0/src/tesla_cli/cli/commands/security.py +196 -0
  192. tesla_cli-5.3.0/src/tesla_cli/cli/commands/serve.py +580 -0
  193. tesla_cli-5.3.0/src/tesla_cli/cli/commands/service.py +398 -0
  194. tesla_cli-5.3.0/src/tesla_cli/cli/commands/setup.py +975 -0
  195. tesla_cli-5.3.0/src/tesla_cli/cli/commands/simit.py +95 -0
  196. tesla_cli-5.3.0/src/tesla_cli/cli/commands/telemetry.py +323 -0
  197. tesla_cli-5.3.0/src/tesla_cli/cli/commands/teslaMate.py +2443 -0
  198. tesla_cli-5.3.0/src/tesla_cli/cli/commands/vehicle.py +3207 -0
  199. tesla_cli-5.3.0/src/tesla_cli/cli/i18n.py +604 -0
  200. tesla_cli-5.3.0/src/tesla_cli/cli/output.py +156 -0
  201. tesla_cli-5.3.0/src/tesla_cli/core/__init__.py +0 -0
  202. tesla_cli-5.3.0/src/tesla_cli/core/auth/__init__.py +0 -0
  203. tesla_cli-5.3.0/src/tesla_cli/core/auth/browser_login.py +177 -0
  204. tesla_cli-5.3.0/src/tesla_cli/core/auth/encryption.py +70 -0
  205. tesla_cli-5.3.0/src/tesla_cli/core/auth/file_store.py +110 -0
  206. tesla_cli-5.3.0/src/tesla_cli/core/auth/oauth.py +297 -0
  207. tesla_cli-5.3.0/src/tesla_cli/core/auth/portal_scrape.py +127 -0
  208. tesla_cli-5.3.0/src/tesla_cli/core/auth/tesla_web_auth.py +64 -0
  209. tesla_cli-5.3.0/src/tesla_cli/core/auth/tessie.py +12 -0
  210. tesla_cli-5.3.0/src/tesla_cli/core/auth/tokens.py +103 -0
  211. tesla_cli-5.3.0/src/tesla_cli/core/automation.py +490 -0
  212. tesla_cli-5.3.0/src/tesla_cli/core/backends/__init__.py +77 -0
  213. tesla_cli-5.3.0/src/tesla_cli/core/backends/base.py +122 -0
  214. tesla_cli-5.3.0/src/tesla_cli/core/backends/cached.py +194 -0
  215. tesla_cli-5.3.0/src/tesla_cli/core/backends/dossier.py +1118 -0
  216. tesla_cli-5.3.0/src/tesla_cli/core/backends/energy.py +111 -0
  217. tesla_cli-5.3.0/src/tesla_cli/core/backends/energy_prices.py +169 -0
  218. tesla_cli-5.3.0/src/tesla_cli/core/backends/fleet.py +425 -0
  219. tesla_cli-5.3.0/src/tesla_cli/core/backends/fleet_signed.py +529 -0
  220. tesla_cli-5.3.0/src/tesla_cli/core/backends/fleet_telemetry.py +150 -0
  221. tesla_cli-5.3.0/src/tesla_cli/core/backends/http.py +114 -0
  222. tesla_cli-5.3.0/src/tesla_cli/core/backends/order.py +810 -0
  223. tesla_cli-5.3.0/src/tesla_cli/core/backends/owner.py +214 -0
  224. tesla_cli-5.3.0/src/tesla_cli/core/backends/runt.py +130 -0
  225. tesla_cli-5.3.0/src/tesla_cli/core/backends/simit.py +187 -0
  226. tesla_cli-5.3.0/src/tesla_cli/core/backends/teslaMate.py +1104 -0
  227. tesla_cli-5.3.0/src/tesla_cli/core/backends/tessie.py +152 -0
  228. tesla_cli-5.3.0/src/tesla_cli/core/computed.py +213 -0
  229. tesla_cli-5.3.0/src/tesla_cli/core/config.py +226 -0
  230. tesla_cli-5.3.0/src/tesla_cli/core/db.py +280 -0
  231. tesla_cli-5.3.0/src/tesla_cli/core/diagnostics/__init__.py +1 -0
  232. tesla_cli-5.3.0/src/tesla_cli/core/diagnostics/teslamate_doctor.py +444 -0
  233. tesla_cli-5.3.0/src/tesla_cli/core/domains.py +613 -0
  234. tesla_cli-5.3.0/src/tesla_cli/core/events.py +409 -0
  235. tesla_cli-5.3.0/src/tesla_cli/core/exceptions.py +104 -0
  236. tesla_cli-5.3.0/src/tesla_cli/core/geo.py +17 -0
  237. tesla_cli-5.3.0/src/tesla_cli/core/health/__init__.py +0 -0
  238. tesla_cli-5.3.0/src/tesla_cli/core/health/features.py +304 -0
  239. tesla_cli-5.3.0/src/tesla_cli/core/mission_control.py +307 -0
  240. tesla_cli-5.3.0/src/tesla_cli/core/models/__init__.py +0 -0
  241. tesla_cli-5.3.0/src/tesla_cli/core/models/automation.py +53 -0
  242. tesla_cli-5.3.0/src/tesla_cli/core/models/charge.py +237 -0
  243. tesla_cli-5.3.0/src/tesla_cli/core/models/climate.py +23 -0
  244. tesla_cli-5.3.0/src/tesla_cli/core/models/dossier.py +450 -0
  245. tesla_cli-5.3.0/src/tesla_cli/core/models/drive.py +33 -0
  246. tesla_cli-5.3.0/src/tesla_cli/core/models/energy.py +35 -0
  247. tesla_cli-5.3.0/src/tesla_cli/core/models/order.py +88 -0
  248. tesla_cli-5.3.0/src/tesla_cli/core/models/vehicle.py +26 -0
  249. tesla_cli-5.3.0/src/tesla_cli/core/nav/__init__.py +8 -0
  250. tesla_cli-5.3.0/src/tesla_cli/core/nav/arrival.py +108 -0
  251. tesla_cli-5.3.0/src/tesla_cli/core/nav/dispatch.py +26 -0
  252. tesla_cli-5.3.0/src/tesla_cli/core/nav/geocode.py +110 -0
  253. tesla_cli-5.3.0/src/tesla_cli/core/nav/importers.py +351 -0
  254. tesla_cli-5.3.0/src/tesla_cli/core/nav/route.py +308 -0
  255. tesla_cli-5.3.0/src/tesla_cli/core/planner/__init__.py +5 -0
  256. tesla_cli-5.3.0/src/tesla_cli/core/planner/calibrated.py +225 -0
  257. tesla_cli-5.3.0/src/tesla_cli/core/planner/car_models.py +31 -0
  258. tesla_cli-5.3.0/src/tesla_cli/core/planner/chargers.py +196 -0
  259. tesla_cli-5.3.0/src/tesla_cli/core/planner/consumption.py +268 -0
  260. tesla_cli-5.3.0/src/tesla_cli/core/planner/elevation.py +76 -0
  261. tesla_cli-5.3.0/src/tesla_cli/core/planner/export.py +160 -0
  262. tesla_cli-5.3.0/src/tesla_cli/core/planner/graph.py +258 -0
  263. tesla_cli-5.3.0/src/tesla_cli/core/planner/models.py +74 -0
  264. tesla_cli-5.3.0/src/tesla_cli/core/planner/mvp.py +148 -0
  265. tesla_cli-5.3.0/src/tesla_cli/core/planner/routing.py +167 -0
  266. tesla_cli-5.3.0/src/tesla_cli/core/planner/weather.py +60 -0
  267. tesla_cli-5.3.0/src/tesla_cli/core/providers/__init__.py +52 -0
  268. tesla_cli-5.3.0/src/tesla_cli/core/providers/base.py +180 -0
  269. tesla_cli-5.3.0/src/tesla_cli/core/providers/impl/__init__.py +1 -0
  270. tesla_cli-5.3.0/src/tesla_cli/core/providers/impl/abrp.py +169 -0
  271. tesla_cli-5.3.0/src/tesla_cli/core/providers/impl/apprise_notify.py +93 -0
  272. tesla_cli-5.3.0/src/tesla_cli/core/providers/impl/ble.py +113 -0
  273. tesla_cli-5.3.0/src/tesla_cli/core/providers/impl/ha.py +137 -0
  274. tesla_cli-5.3.0/src/tesla_cli/core/providers/impl/mqtt.py +162 -0
  275. tesla_cli-5.3.0/src/tesla_cli/core/providers/impl/teslaMate.py +133 -0
  276. tesla_cli-5.3.0/src/tesla_cli/core/providers/impl/vehicle_api.py +126 -0
  277. tesla_cli-5.3.0/src/tesla_cli/core/providers/loader.py +64 -0
  278. tesla_cli-5.3.0/src/tesla_cli/core/providers/registry.py +228 -0
  279. tesla_cli-5.3.0/src/tesla_cli/core/sources.py +1682 -0
  280. tesla_cli-5.3.0/src/tesla_cli/core/url_safety.py +84 -0
  281. tesla_cli-5.3.0/src/tesla_cli/endpoints.json +3121 -0
  282. tesla_cli-5.3.0/src/tesla_cli/infra/__init__.py +0 -0
  283. tesla_cli-5.3.0/src/tesla_cli/infra/fleet_telemetry_stack.py +490 -0
  284. tesla_cli-5.3.0/src/tesla_cli/infra/teslamate_stack.py +506 -0
  285. tesla_cli-5.3.0/src/tesla_cli/py.typed +0 -0
  286. tesla_cli-5.3.0/tesla-config.example.json +20 -0
  287. tesla_cli-5.3.0/tests/__init__.py +1 -0
  288. tesla_cli-5.3.0/tests/conftest.py +164 -0
  289. tesla_cli-5.3.0/tests/fixtures/charge_curve/expected.json +12 -0
  290. tesla_cli-5.3.0/tests/fixtures/charge_curve/session_y1200.json +10802 -0
  291. tesla_cli-5.3.0/tests/fixtures/teslamate_schema/charges_v1.30.sql +39 -0
  292. tesla_cli-5.3.0/tests/test_api_app_refresh.py +60 -0
  293. tesla_cli-5.3.0/tests/test_api_charge_curve.py +203 -0
  294. tesla_cli-5.3.0/tests/test_api_charge_enrichment.py +128 -0
  295. tesla_cli-5.3.0/tests/test_api_doctor.py +30 -0
  296. tesla_cli-5.3.0/tests/test_api_routes.py +1539 -0
  297. tesla_cli-5.3.0/tests/test_api_routes_new.py +497 -0
  298. tesla_cli-5.3.0/tests/test_api_security.py +452 -0
  299. tesla_cli-5.3.0/tests/test_api_teslamate_doctor.py +112 -0
  300. tesla_cli-5.3.0/tests/test_auth.py +436 -0
  301. tesla_cli-5.3.0/tests/test_backends.py +163 -0
  302. tesla_cli-5.3.0/tests/test_browser_login.py +129 -0
  303. tesla_cli-5.3.0/tests/test_commands.py +800 -0
  304. tesla_cli-5.3.0/tests/test_doctor.py +134 -0
  305. tesla_cli-5.3.0/tests/test_domains.py +288 -0
  306. tesla_cli-5.3.0/tests/test_epa_fallbacks.py +50 -0
  307. tesla_cli-5.3.0/tests/test_events.py +211 -0
  308. tesla_cli-5.3.0/tests/test_events_purge.py +90 -0
  309. tesla_cli-5.3.0/tests/test_fleet_signed_backend.py +203 -0
  310. tesla_cli-5.3.0/tests/test_mission_control.py +254 -0
  311. tesla_cli-5.3.0/tests/test_models.py +274 -0
  312. tesla_cli-5.3.0/tests/test_nav_arrival.py +98 -0
  313. tesla_cli-5.3.0/tests/test_nav_cli.py +394 -0
  314. tesla_cli-5.3.0/tests/test_nav_dispatch.py +45 -0
  315. tesla_cli-5.3.0/tests/test_nav_geocode.py +121 -0
  316. tesla_cli-5.3.0/tests/test_nav_importers.py +580 -0
  317. tesla_cli-5.3.0/tests/test_nav_models.py +442 -0
  318. tesla_cli-5.3.0/tests/test_new_commands.py +9630 -0
  319. tesla_cli-5.3.0/tests/test_order_backend.py +619 -0
  320. tesla_cli-5.3.0/tests/test_outbound_safety.py +166 -0
  321. tesla_cli-5.3.0/tests/test_pipeline.py +169 -0
  322. tesla_cli-5.3.0/tests/test_planner_api.py +251 -0
  323. tesla_cli-5.3.0/tests/test_planner_calibrated.py +169 -0
  324. tesla_cli-5.3.0/tests/test_planner_chargers.py +197 -0
  325. tesla_cli-5.3.0/tests/test_planner_cli.py +365 -0
  326. tesla_cli-5.3.0/tests/test_planner_consumption.py +136 -0
  327. tesla_cli-5.3.0/tests/test_planner_elevation.py +72 -0
  328. tesla_cli-5.3.0/tests/test_planner_export.py +130 -0
  329. tesla_cli-5.3.0/tests/test_planner_graph.py +144 -0
  330. tesla_cli-5.3.0/tests/test_planner_models.py +94 -0
  331. tesla_cli-5.3.0/tests/test_planner_mvp.py +159 -0
  332. tesla_cli-5.3.0/tests/test_planner_routing.py +135 -0
  333. tesla_cli-5.3.0/tests/test_planner_weather.py +45 -0
  334. tesla_cli-5.3.0/tests/test_providers.py +693 -0
  335. tesla_cli-5.3.0/tests/test_providers_new.py +918 -0
  336. tesla_cli-5.3.0/tests/test_runt.py +189 -0
  337. tesla_cli-5.3.0/tests/test_runt_integration.py +36 -0
  338. tesla_cli-5.3.0/tests/test_secret_scanning.py +388 -0
  339. tesla_cli-5.3.0/tests/test_server.py +633 -0
  340. tesla_cli-5.3.0/tests/test_simit.py +118 -0
  341. tesla_cli-5.3.0/tests/test_simit_integration.py +42 -0
  342. tesla_cli-5.3.0/tests/test_sources.py +1134 -0
  343. tesla_cli-5.3.0/tests/test_tesla_web_auth.py +26 -0
  344. tesla_cli-5.3.0/tests/test_teslamate_charge_curve.py +217 -0
  345. tesla_cli-5.3.0/tests/test_teslamate_curiosities.py +239 -0
  346. tesla_cli-5.3.0/tests/test_teslamate_doctor.py +415 -0
  347. tesla_cli-5.3.0/tests/test_teslamate_schema.py +29 -0
  348. tesla_cli-5.3.0/tests/test_teslamate_stack.py +438 -0
  349. tesla_cli-5.3.0/tests/test_token_file_store.py +91 -0
  350. tesla_cli-5.3.0/tests/test_token_refresh_scope.py +84 -0
  351. tesla_cli-5.3.0/tests/test_tokens_no_keyring.py +68 -0
  352. tesla_cli-5.3.0/tests/test_v260.py +529 -0
  353. tesla_cli-5.3.0/tests/test_v270.py +259 -0
  354. tesla_cli-5.3.0/tests/test_v280.py +466 -0
  355. tesla_cli-5.3.0/tests/test_v290.py +541 -0
  356. tesla_cli-5.3.0/tests/test_v300.py +495 -0
  357. tesla_cli-5.3.0/tests/test_v310.py +398 -0
  358. tesla_cli-5.3.0/tests/test_v320.py +476 -0
  359. tesla_cli-5.3.0/tests/test_v330.py +417 -0
  360. tesla_cli-5.3.0/tests/test_v340.py +452 -0
  361. tesla_cli-5.3.0/ui/.browserslistrc +6 -0
  362. tesla_cli-5.3.0/ui/.gitignore +31 -0
  363. tesla_cli-5.3.0/ui/cypress/e2e/test.cy.ts +8 -0
  364. tesla_cli-5.3.0/ui/cypress/fixtures/example.json +5 -0
  365. tesla_cli-5.3.0/ui/cypress/support/commands.ts +37 -0
  366. tesla_cli-5.3.0/ui/cypress/support/e2e.ts +20 -0
  367. tesla_cli-5.3.0/ui/cypress.config.ts +10 -0
  368. tesla_cli-5.3.0/ui/eslint.config.js +30 -0
  369. tesla_cli-5.3.0/ui/index.html +31 -0
  370. tesla_cli-5.3.0/ui/ionic.config.json +5 -0
  371. tesla_cli-5.3.0/ui/ionic.starter.json +12 -0
  372. tesla_cli-5.3.0/ui/package-lock.json +11123 -0
  373. tesla_cli-5.3.0/ui/package.json +54 -0
  374. tesla_cli-5.3.0/ui/public/favicon.png +0 -0
  375. tesla_cli-5.3.0/ui/public/manifest.json +24 -0
  376. tesla_cli-5.3.0/ui/src/App.test.tsx +8 -0
  377. tesla_cli-5.3.0/ui/src/App.tsx +269 -0
  378. tesla_cli-5.3.0/ui/src/api/client.ts +1145 -0
  379. tesla_cli-5.3.0/ui/src/components/AuthGate.test.tsx +65 -0
  380. tesla_cli-5.3.0/ui/src/components/AuthGate.tsx +131 -0
  381. tesla_cli-5.3.0/ui/src/components/BatteryGauge.tsx +136 -0
  382. tesla_cli-5.3.0/ui/src/components/CommandButton.tsx +85 -0
  383. tesla_cli-5.3.0/ui/src/components/CopyButton.tsx +54 -0
  384. tesla_cli-5.3.0/ui/src/components/EmptyState.tsx +38 -0
  385. tesla_cli-5.3.0/ui/src/components/ErrorBoundary.tsx +31 -0
  386. tesla_cli-5.3.0/ui/src/components/ExploreContainer.css +24 -0
  387. tesla_cli-5.3.0/ui/src/components/ExploreContainer.tsx +14 -0
  388. tesla_cli-5.3.0/ui/src/components/ModelYSilhouette.tsx +328 -0
  389. tesla_cli-5.3.0/ui/src/components/OrderProcessTracker.tsx +488 -0
  390. tesla_cli-5.3.0/ui/src/components/RecentCharges.tsx +57 -0
  391. tesla_cli-5.3.0/ui/src/components/SeatHeaterGrid.tsx +152 -0
  392. tesla_cli-5.3.0/ui/src/components/SkeletonCard.tsx +28 -0
  393. tesla_cli-5.3.0/ui/src/components/StatusBadge.tsx +50 -0
  394. tesla_cli-5.3.0/ui/src/components/VehicleMap.tsx +98 -0
  395. tesla_cli-5.3.0/ui/src/components/dossier/CollapsibleSection.tsx +43 -0
  396. tesla_cli-5.3.0/ui/src/components/dossier/LogisticsCard.tsx +127 -0
  397. tesla_cli-5.3.0/ui/src/components/dossier/OptionCodesPills.tsx +64 -0
  398. tesla_cli-5.3.0/ui/src/components/dossier/RuntCard.tsx +114 -0
  399. tesla_cli-5.3.0/ui/src/components/dossier/SimitCard.tsx +90 -0
  400. tesla_cli-5.3.0/ui/src/components/dossier/SpecsGrid.tsx +65 -0
  401. tesla_cli-5.3.0/ui/src/components/dossier/StatusPipeline.tsx +71 -0
  402. tesla_cli-5.3.0/ui/src/components/dossier/VinDecoder.tsx +182 -0
  403. tesla_cli-5.3.0/ui/src/components/icons/Icons.tsx +273 -0
  404. tesla_cli-5.3.0/ui/src/components/icons/Spinner.tsx +25 -0
  405. tesla_cli-5.3.0/ui/src/hooks/sseHub.ts +92 -0
  406. tesla_cli-5.3.0/ui/src/hooks/useAppInit.ts +203 -0
  407. tesla_cli-5.3.0/ui/src/hooks/useDashboardTiles.ts +91 -0
  408. tesla_cli-5.3.0/ui/src/hooks/useMissionControl.ts +47 -0
  409. tesla_cli-5.3.0/ui/src/hooks/useVehicleData.ts +144 -0
  410. tesla_cli-5.3.0/ui/src/main.tsx +11 -0
  411. tesla_cli-5.3.0/ui/src/pages/Action.tsx +302 -0
  412. tesla_cli-5.3.0/ui/src/pages/Alerts.tsx +95 -0
  413. tesla_cli-5.3.0/ui/src/pages/Analytics.tsx +848 -0
  414. tesla_cli-5.3.0/ui/src/pages/Automations.tsx +568 -0
  415. tesla_cli-5.3.0/ui/src/pages/ChargeSessions.tsx +841 -0
  416. tesla_cli-5.3.0/ui/src/pages/Dashboard.tsx +1104 -0
  417. tesla_cli-5.3.0/ui/src/pages/Dossier.tsx +829 -0
  418. tesla_cli-5.3.0/ui/src/pages/Energy.tsx +82 -0
  419. tesla_cli-5.3.0/ui/src/pages/Home.css +0 -0
  420. tesla_cli-5.3.0/ui/src/pages/Navigation.tsx +386 -0
  421. tesla_cli-5.3.0/ui/src/pages/Order.tsx +658 -0
  422. tesla_cli-5.3.0/ui/src/pages/Planner.tsx +408 -0
  423. tesla_cli-5.3.0/ui/src/pages/Settings.tsx +1158 -0
  424. tesla_cli-5.3.0/ui/src/pages/Timeline.tsx +82 -0
  425. tesla_cli-5.3.0/ui/src/pages/Vehicle.tsx +81 -0
  426. tesla_cli-5.3.0/ui/src/pages/energy/CostsContent.tsx +429 -0
  427. tesla_cli-5.3.0/ui/src/pages/vehicle/ChargeContent.tsx +362 -0
  428. tesla_cli-5.3.0/ui/src/pages/vehicle/ClimateContent.tsx +366 -0
  429. tesla_cli-5.3.0/ui/src/pages/vehicle/ControlsContent.tsx +189 -0
  430. tesla_cli-5.3.0/ui/src/pages/vehicle/ScheduleContent.tsx +302 -0
  431. tesla_cli-5.3.0/ui/src/setupTests.ts +14 -0
  432. tesla_cli-5.3.0/ui/src/theme/variables.css +1071 -0
  433. tesla_cli-5.3.0/ui/src/vite-env.d.ts +1 -0
  434. tesla_cli-5.3.0/ui/tsconfig.json +21 -0
  435. tesla_cli-5.3.0/ui/tsconfig.node.json +9 -0
  436. tesla_cli-5.3.0/ui/vite.config.ts +32 -0
  437. tesla_cli-5.3.0/uv.lock +3871 -0
@@ -0,0 +1,9 @@
1
+ .git
2
+ .venv
3
+ __pycache__
4
+ *.pyc
5
+ .pytest_cache
6
+ .ruff_cache
7
+ node_modules
8
+ audit/
9
+ .env*
@@ -0,0 +1,17 @@
1
+ # Tesla CLI — Docker Configuration
2
+ # Copy to .env and fill in your values: cp .env.example .env
3
+
4
+ # ── Required ──────────────────────────────────────────────────
5
+ TESLA_VIN= # Your Tesla VIN (17 characters)
6
+ TESLA_RN= # Order reservation number (e.g. RNXXXXXXXXX)
7
+
8
+ # ── API Server ────────────────────────────────────────────────
9
+ TESLA_PORT=8080 # Dashboard + API port
10
+
11
+ # ── Full Stack (docker-compose.full.yml) ──────────────────────
12
+ DB_PASSWORD=teslamate # PostgreSQL password
13
+ ENCRYPTION_KEY=changeme # TeslaMate encryption key (generate a random string)
14
+ TM_PORT=4000 # TeslaMate web UI port
15
+ GRAFANA_PORT=3000 # Grafana dashboard port
16
+ GRAFANA_PASSWORD=admin # Grafana admin password
17
+ MQTT_PORT=1883 # Mosquitto MQTT port
@@ -0,0 +1,20 @@
1
+ #!/bin/sh
2
+ # Opt in with: git config core.hooksPath .githooks
3
+ set -eu
4
+ root=$(git rev-parse --show-toplevel)
5
+ while read -r local_ref local_oid remote_ref remote_oid extra; do
6
+ [ -n "$local_ref" ] && [ -n "$remote_ref" ] && [ -z "$extra" ] || {
7
+ printf '%s\n' 'Invalid pre-push input.' >&2
8
+ exit 1
9
+ }
10
+ for oid in "$local_oid" "$remote_oid"; do
11
+ case "$oid" in
12
+ ''|*[!0-9a-fA-F]*) printf '%s\n' 'Invalid pre-push object ID.' >&2; exit 1 ;;
13
+ esac
14
+ [ "${#oid}" -eq 40 ] || [ "${#oid}" -eq 64 ] || exit 1
15
+ done
16
+ case "$local_oid" in
17
+ *[!0]*) "$root/scripts/secret-scan.sh" --ref "$local_oid" ;;
18
+ *) : ;; # Deleting a ref publishes no objects and needs no scanner.
19
+ esac
20
+ done
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Report a bug in tesla-cli
4
+ title: "[Bug] "
5
+ labels: bug
6
+ ---
7
+
8
+ ## Describe the bug
9
+ A clear description of what the bug is.
10
+
11
+ ## To Reproduce
12
+ Steps to reproduce:
13
+ 1. Run `tesla ...`
14
+ 2. See error
15
+
16
+ ## Expected behavior
17
+ What you expected to happen.
18
+
19
+ ## Environment
20
+ - OS: [e.g. macOS 15, Ubuntu 24.04]
21
+ - Python: [e.g. 3.12]
22
+ - tesla-cli version: [e.g. 4.8.0]
23
+ - Backend: [owner / fleet / fleet-signed / tessie]
24
+
25
+ ## Logs
26
+ ```
27
+ Paste relevant output here
28
+ ```
29
+
30
+ ## Additional context
31
+ Any other context (screenshots, config, etc.)
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: Feature Request
3
+ about: Suggest a new feature
4
+ title: "[Feature] "
5
+ labels: enhancement
6
+ ---
7
+
8
+ ## Problem
9
+ What problem does this solve?
10
+
11
+ ## Proposed Solution
12
+ Describe the feature you'd like.
13
+
14
+ ## Alternatives Considered
15
+ Any alternatives you've thought about.
16
+
17
+ ## Additional context
18
+ Any other context (screenshots, links, etc.)
@@ -0,0 +1,93 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ lint:
11
+ name: Lint
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: astral-sh/setup-uv@v4
16
+ with:
17
+ python-version: "3.12"
18
+ - run: uv sync --extra dev
19
+ - run: uv run ruff check src/ tests/
20
+ - run: uv run ruff format --check src/ tests/
21
+
22
+ test:
23
+ name: Test (Python ${{ matrix.python-version }})
24
+ runs-on: ubuntu-latest
25
+ strategy:
26
+ matrix:
27
+ python-version: ["3.12", "3.13"]
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+ - uses: astral-sh/setup-uv@v4
31
+ with:
32
+ python-version: ${{ matrix.python-version }}
33
+ - run: uv sync --extra dev --extra serve --extra fleet --extra teslaMate --extra pdf --extra query
34
+ - run: uv run pytest -m "not integration" -v --cov=tesla_cli --cov-report=xml --cov-report=term --cov-fail-under=55
35
+ env:
36
+ NO_COLOR: "1"
37
+
38
+ version:
39
+ name: Version consistency
40
+ runs-on: ubuntu-latest
41
+ steps:
42
+ - uses: actions/checkout@v4
43
+ - name: pyproject, __init__ and CHANGELOG agree
44
+ run: |
45
+ set -euo pipefail
46
+ py=$(sed -n 's/^version = "\(.*\)"/\1/p' pyproject.toml | head -1)
47
+ init=$(sed -n 's/^__version__ = "\(.*\)"/\1/p' src/tesla_cli/__init__.py)
48
+ echo "pyproject=$py __init__=$init"
49
+ test "$py" = "$init"
50
+ grep -Eq "^## \[(Unreleased|$py)\]" CHANGELOG.md
51
+
52
+ ui:
53
+ name: UI (typecheck, unit tests, build)
54
+ runs-on: ubuntu-latest
55
+ defaults:
56
+ run:
57
+ working-directory: ui
58
+ steps:
59
+ - uses: actions/checkout@v4
60
+ - uses: actions/setup-node@v4
61
+ with:
62
+ node-version: "20"
63
+ cache: npm
64
+ cache-dependency-path: ui/package-lock.json
65
+ - run: npm ci
66
+ env:
67
+ CYPRESS_INSTALL_BINARY: "0"
68
+ - run: npx tsc --noEmit
69
+ - run: npx vitest run
70
+ - run: npx vite build --outDir "$RUNNER_TEMP/ui-dist" --emptyOutDir
71
+
72
+ docker:
73
+ name: Docker image builds
74
+ runs-on: ubuntu-latest
75
+ steps:
76
+ - uses: actions/checkout@v4
77
+ - name: Build image
78
+ run: docker build -t tesla-cli:ci .
79
+ - name: Container serves health + requires API key
80
+ run: |
81
+ set -euo pipefail
82
+ docker run -d --name tesla-ci -p 8080:8080 tesla-cli:ci
83
+ for i in $(seq 1 30); do
84
+ curl -fsS http://127.0.0.1:8080/api/health && break
85
+ sleep 2
86
+ done
87
+ curl -fsS http://127.0.0.1:8080/api/health
88
+ code=$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8080/api/status)
89
+ test "$code" = "401"
90
+ docker logs tesla-ci 2>&1 | grep -q "API key generated"
91
+ test "$(docker exec tesla-ci id -u)" = "1000"
92
+ - if: always()
93
+ run: docker logs tesla-ci 2>&1 | tail -50 || true
@@ -0,0 +1,78 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ verify:
10
+ name: Verify release (tag, lint, tests)
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - name: Tag matches package version
15
+ run: |
16
+ set -euo pipefail
17
+ tag="${GITHUB_REF_NAME#v}"
18
+ py=$(sed -n 's/^version = "\(.*\)"/\1/p' pyproject.toml | head -1)
19
+ init=$(sed -n 's/^__version__ = "\(.*\)"/\1/p' src/tesla_cli/__init__.py)
20
+ echo "tag=$tag pyproject=$py __init__=$init"
21
+ test "$tag" = "$py"
22
+ test "$tag" = "$init"
23
+ grep -q "^## \[$tag\]" CHANGELOG.md
24
+ - uses: astral-sh/setup-uv@v4
25
+ with:
26
+ python-version: "3.12"
27
+ - run: uv sync --frozen --extra dev --extra serve --extra fleet --extra teslaMate --extra pdf --extra query
28
+ - run: uv run ruff check src/ tests/
29
+ - run: uv run ruff format --check src/ tests/
30
+ - run: uv run pytest -m "not integration" -q
31
+ env:
32
+ NO_COLOR: "1"
33
+
34
+ build-and-publish:
35
+ name: Build and publish to PyPI
36
+ needs: verify
37
+ runs-on: ubuntu-latest
38
+ environment:
39
+ name: pypi
40
+ url: https://pypi.org/p/tesla-cli
41
+ permissions:
42
+ contents: read
43
+ id-token: write # Trusted Publishing (no API token needed)
44
+
45
+ steps:
46
+ - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
47
+ with:
48
+ fetch-depth: 0
49
+ persist-credentials: false
50
+
51
+ - name: Install pinned Gitleaks
52
+ shell: bash
53
+ run: |
54
+ set -euo pipefail
55
+ archive="$RUNNER_TEMP/gitleaks.tar.gz"
56
+ curl --fail --silent --show-error --location https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_x64.tar.gz --output "$archive"
57
+ echo "551f6fc83ea457d62a0d98237cbad105af8d557003051f41f3e7ca7b3f2470eb $archive" | sha256sum --check --status
58
+ mkdir -p "$RUNNER_TEMP/gitleaks-bin"
59
+ tar -xzf "$archive" -C "$RUNNER_TEMP/gitleaks-bin" gitleaks
60
+ echo "$RUNNER_TEMP/gitleaks-bin" >> "$GITHUB_PATH"
61
+
62
+ - name: Block publication of sensitive data
63
+ run: scripts/secret-scan.sh
64
+
65
+ - name: Install uv
66
+ uses: astral-sh/setup-uv@v4
67
+
68
+ - name: Set up Python
69
+ run: uv python install 3.12
70
+
71
+ - name: Build package
72
+ run: uv build
73
+
74
+ - name: Scan distribution archives before publication
75
+ run: scripts/secret-scan.sh --artifacts dist
76
+
77
+ - name: Publish to PyPI
78
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,31 @@
1
+ name: Secret Scan
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ secrets:
13
+ name: Secrets and personal data
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
17
+ with:
18
+ fetch-depth: 0
19
+ persist-credentials: false
20
+ - name: Install pinned Gitleaks
21
+ shell: bash
22
+ run: |
23
+ set -euo pipefail
24
+ archive="$RUNNER_TEMP/gitleaks.tar.gz"
25
+ curl --fail --silent --show-error --location https://github.com/gitleaks/gitleaks/releases/download/v8.30.1/gitleaks_8.30.1_linux_x64.tar.gz --output "$archive"
26
+ echo "551f6fc83ea457d62a0d98237cbad105af8d557003051f41f3e7ca7b3f2470eb $archive" | sha256sum --check --status
27
+ mkdir -p "$RUNNER_TEMP/gitleaks-bin"
28
+ tar -xzf "$archive" -C "$RUNNER_TEMP/gitleaks-bin" gitleaks
29
+ echo "$RUNNER_TEMP/gitleaks-bin" >> "$GITHUB_PATH"
30
+ - name: Scan all history and tracked files
31
+ run: scripts/secret-scan.sh
@@ -0,0 +1,90 @@
1
+ # Python
2
+ __pycache__/
3
+ *.pyc
4
+ *.pyo
5
+ *.egg-info/
6
+ dist/
7
+ build/
8
+ .venv/
9
+
10
+ # IDE
11
+ .idea/
12
+ .vscode/
13
+ *.swp
14
+ *.swo
15
+
16
+ # OS
17
+ .DS_Store
18
+ Thumbs.db
19
+
20
+ # Secrets & tokens (NEVER commit)
21
+ .tesla-cli/
22
+ mitm-captures/
23
+ *.flow
24
+
25
+ # VCP key material — must live only in the user's local
26
+ # ~/.tesla-cli/keys/ (private) or their own hosting repo (public).
27
+ # Never in this OSS repo. See docs/fleet-signed-setup.md.
28
+ *.pem
29
+ *.key
30
+ keys/
31
+ .well-known/
32
+
33
+ # Large data files (generated, not source)
34
+ references/
35
+ nhtsa-complaints.json
36
+ nhtsa-investigations.json
37
+ public-api-data.json
38
+ activity-log.json
39
+ mission-control-data.json
40
+ history/
41
+ *.pdf
42
+
43
+ # Personal automation scripts
44
+ refresh-mission-control.py
45
+ change-detector.py
46
+ build-activity-log.sh
47
+ mitm-tesla-capture.py
48
+
49
+ # Generated reports and data exports
50
+ dossier-report.html
51
+ design-studio-co.json
52
+ specs-sources.json
53
+ tesla-ssr-data.json
54
+ IMPLEMENTATION-PLAN.md
55
+
56
+ # Claude Code local settings
57
+ .claude/settings.local.json
58
+ .claude/
59
+
60
+ # UI (React frontend)
61
+ ui/node_modules/
62
+ ui/dist/
63
+ ui/.vscode/
64
+
65
+ # Test artifacts
66
+ .coverage
67
+
68
+ # OMC
69
+ missions/
70
+ .omx/
71
+
72
+ # Temp
73
+ fix-live-sources.py
74
+ superchargers-co.json
75
+ .env.local
76
+ .codex/
77
+ AGENTS.md
78
+ audit/
79
+
80
+ # Local configuration, backups and environment credentials
81
+ .env
82
+ .env.*
83
+ !.env.example
84
+ .envrc
85
+ /tesla-config*.json
86
+ !/tesla-config.example.json
87
+ /tesla-config*.json.*
88
+ /tesla-config*.bak
89
+ /tesla-config*.backup
90
+ coverage.xml
@@ -0,0 +1,45 @@
1
+ title = "Tesla secrets and personal identifiers"
2
+
3
+ [extend]
4
+ useDefault = true
5
+
6
+ [[rules]]
7
+ id = "tesla-vin"
8
+ description = "Vehicle identifiers must not be published"
9
+ regex = '''\b(?:[1-5][A-HJ-NPR-Z0-9]{2}|7SA|7G2|LRW|XP7)[A-HJ-NPR-Z0-9]{14}\b'''
10
+
11
+ [[rules.allowlists]]
12
+ description = "Individually audited synthetic fixtures; never add a real identifier"
13
+ regexes = ['''^(?:5YJ3E1EA0JF000000|5YJ3E1EA1PF000001|5YJ3E1EA1PF000002|5YJ3E1EA1PF123456|5YJ3E1EA1PF999999|5YJ3E1EA8PF123456|5YJYGDEE5MF000000|LRWYE7FK4TC123456|LRWYGCEK3TC000000|7SAYGDEF1TF123456|7SAYGDEE4RF000001)$''']
14
+
15
+ [[rules]]
16
+ id = "tesla-reservation"
17
+ description = "Order reservations must not be published"
18
+ regex = '''\bRN[0-9]{6,12}\b'''
19
+
20
+ [[rules.allowlists]]
21
+ description = "Individually audited synthetic order fixtures"
22
+ regexes = ['''^(?:RN000000000|RN123456|RN123456789|RN987654321|RN999888|RN999999999)$''']
23
+
24
+ [[rules]]
25
+ id = "telegram-token-in-url"
26
+ description = "Telegram bot credentials, including Apprise URLs"
27
+ regex = '''\b[0-9]{7,12}:[A-Za-z0-9_-]{30,50}\b'''
28
+
29
+ [[rules]]
30
+ id = "generic-api-key"
31
+ [[rules.allowlists]]
32
+ description = "Audited generated React vnode SHA1 keys, not authentication keys"
33
+ condition = "AND"
34
+ regexTarget = "match"
35
+ regexes = ['''\bkey\s*:\s*["'][a-f0-9]{30,40}(?:["']|$)''']
36
+ paths = ['''(?:^|/)(?:src/)?tesla_cli/api/ui_dist/assets/[^/]+\.js$''']
37
+
38
+ [[rules]]
39
+ id = "private-key"
40
+ [[rules.allowlists]]
41
+ description = "Nonfunctional fake key marker used by the idempotency test"
42
+ condition = "AND"
43
+ regexTarget = "match"
44
+ regexes = ['''^-----BEGIN PRIVATE KEY-----(?:\\n|\n)fake(?:\\n|\n)''']
45
+ paths = ['''(?:^|/)tests/test_fleet_signed_backend\.py$''']
@@ -0,0 +1 @@
1
+ 3.12