tesla-cli 5.3.0__tar.gz → 5.4.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 (476) hide show
  1. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.github/workflows/ci.yml +1 -0
  2. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.github/workflows/publish.yml +57 -0
  3. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.gitignore +3 -0
  4. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.gitleaks.toml +6 -2
  5. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/CHANGELOG.md +96 -3
  6. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/CLAUDE.md +3 -2
  7. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/Dockerfile +8 -4
  8. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/PKG-INFO +7 -3
  9. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/README.md +5 -0
  10. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/SECURITY.md +10 -0
  11. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docker-compose.full.yml +3 -0
  12. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docker-compose.yml +3 -0
  13. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/architecture.md +1 -1
  14. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/configuration.md +6 -1
  15. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/nav-route.md +2 -2
  16. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/roadmap.md +19 -14
  17. tesla_cli-5.4.0/docs/self-hosting.md +123 -0
  18. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/user-guide.md +2 -1
  19. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/pyproject.toml +9 -3
  20. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/__init__.py +1 -1
  21. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/app.py +5 -2
  22. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/audit.py +34 -11
  23. tesla_cli-5.4.0/src/tesla_cli/api/errors.py +113 -0
  24. tesla_cli-5.4.0/src/tesla_cli/api/guards.py +54 -0
  25. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/auth.py +14 -20
  26. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/charge.py +11 -23
  27. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/climate.py +5 -32
  28. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/colombia.py +8 -23
  29. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/dossier.py +3 -1
  30. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/geofence.py +2 -1
  31. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/notify.py +2 -1
  32. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/security.py +10 -72
  33. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/vehicle.py +2 -6
  34. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Action-CwGHGX16.js +1 -0
  35. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Alerts-CxjS0eWD.js → tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Alerts-Dis9EFEc.js +1 -1
  36. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Analytics-BIQymqmz.js +1 -0
  37. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Automations-CkQ1lQFj.js +1 -0
  38. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/BarChart-BV8v0-uo.js +1 -0
  39. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/CartesianChart-CKwXbEZl.js +64 -0
  40. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/ChargeContent-p_xx3AZb.js +1 -0
  41. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/ChargeSessions-C1H3Njae.js +1 -0
  42. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/ClimateContent-DCZYi1fI.js +1 -0
  43. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/ControlsContent-eOQooqX6.js +1 -0
  44. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/CostsContent-BsZelAGJ.js +4 -0
  45. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Dossier-Bmte81sm.js +1 -0
  46. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Energy-CURVP8Bo.js +2 -0
  47. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Icons-BuFerITU.js → tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Icons-DilChhnH.js +1 -1
  48. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/LineChart-CINlhKeu.js +1 -0
  49. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Navigation-DYlD1nds.js +1 -0
  50. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Order-BWZlXyBZ.js +6 -0
  51. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Planner-DhobHUXh.js +1 -0
  52. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Settings-BxKiGnXf.js +1 -0
  53. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Timeline-Dsr24gQY.js → tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Timeline-BuxKAgcv.js +1 -1
  54. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-CIGW-MKW.css +1 -0
  55. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-DszuubAr.js +4 -0
  56. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/index-9LcL7ZgR.js +346 -0
  57. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/index-BNByuiMZ.css +1 -0
  58. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-BgwEQWW6-DWljCkpc.js → tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/p-BgwEQWW6-twSofMjU.js +1 -1
  59. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/p-CBzELu-H-BlubY4S-.js +3 -0
  60. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/p-CU1SSH8_-B5lDEig9.js +3 -0
  61. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CneGxKsZ-DyyIfLCm.js → tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/p-CneGxKsZ-DVUGf-0a.js +1 -1
  62. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/p-Cwv-vmkN-Dv-2Rodk.js +3 -0
  63. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cz5nLPGT-Ch5sGzu_.js → tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/p-Cz5nLPGT-BCGRVDqy.js +1 -1
  64. tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/index.html +32 -0
  65. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/vehicle_hub.py +9 -2
  66. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/app.py +16 -0
  67. tesla_cli-5.4.0/src/tesla_cli/cli/auth_flow.py +66 -0
  68. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/abrp.py +2 -1
  69. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/automations.py +4 -3
  70. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/charge.py +7 -65
  71. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/config_cmd.py +93 -128
  72. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/data_cmd.py +2 -2
  73. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/dossier.py +1 -1
  74. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/ha.py +2 -1
  75. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/login.py +1 -1
  76. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/order.py +4 -3
  77. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/setup.py +3 -2
  78. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/vehicle.py +2 -1
  79. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/browser_login.py +2 -2
  80. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/oauth.py +20 -89
  81. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/portal_scrape.py +1 -1
  82. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/tokens.py +2 -1
  83. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/automation.py +2 -1
  84. tesla_cli-5.4.0/src/tesla_cli/core/backends/colombia_open_data.py +44 -0
  85. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/dossier.py +24 -3
  86. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/http.py +76 -8
  87. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/order.py +22 -5
  88. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/owner.py +11 -37
  89. tesla_cli-5.4.0/src/tesla_cli/core/charging.py +85 -0
  90. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/computed.py +2 -2
  91. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/config.py +10 -1
  92. tesla_cli-5.4.0/src/tesla_cli/core/config_checks.py +90 -0
  93. tesla_cli-5.4.0/src/tesla_cli/core/config_migrations.py +59 -0
  94. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/events.py +3 -2
  95. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/exceptions.py +4 -0
  96. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/consumption.py +2 -1
  97. tesla_cli-5.4.0/src/tesla_cli/core/private_files.py +81 -0
  98. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/teslaMate.py +3 -1
  99. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/vehicle_api.py +3 -1
  100. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/conftest.py +10 -0
  101. tesla_cli-5.4.0/tests/test_api_errors.py +118 -0
  102. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_routes.py +2 -7
  103. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_security.py +81 -0
  104. tesla_cli-5.4.0/tests/test_config_migrations.py +51 -0
  105. tesla_cli-5.4.0/tests/test_http_resilience.py +113 -0
  106. tesla_cli-5.4.0/tests/test_layering.py +67 -0
  107. tesla_cli-5.4.0/tests/test_private_files.py +129 -0
  108. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v280.py +3 -1
  109. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v300.py +8 -1
  110. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/eslint.config.js +3 -0
  111. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/package-lock.json +37 -1573
  112. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/package.json +1 -2
  113. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/App.tsx +0 -6
  114. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/api/client.ts +16 -4
  115. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/BatteryGauge.tsx +0 -1
  116. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/hooks/useAppInit.ts +1 -1
  117. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/ChargeSessions.tsx +0 -3
  118. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Dashboard.tsx +3 -8
  119. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Dossier.tsx +0 -69
  120. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Order.tsx +0 -1
  121. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Settings.tsx +3 -3
  122. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/energy/CostsContent.tsx +0 -1
  123. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/vehicle/ChargeContent.tsx +0 -8
  124. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/vite.config.ts +0 -2
  125. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/uv.lock +41 -43
  126. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Action-D2jgMhrf.js +0 -1
  127. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Action-legacy-BjmsaTxz.js +0 -1
  128. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Alerts-legacy-E7lXFTHf.js +0 -1
  129. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Analytics-BAF-OckK.js +0 -1
  130. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Analytics-legacy-BfqY0A3r.js +0 -1
  131. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Automations-ChtxOCVx.js +0 -1
  132. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Automations-legacy-D2rTa2Dc.js +0 -1
  133. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/BarChart-CbvPuOm8.js +0 -1
  134. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/BarChart-legacy-CKvoptiV.js +0 -1
  135. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CartesianChart-C7oiHq6H.js +0 -32
  136. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CartesianChart-legacy-C1alQFTe.js +0 -10
  137. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeContent-DHrBXiYI.js +0 -1
  138. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeContent-legacy-W8Pj2GRz.js +0 -1
  139. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeSessions-CmSw1u46.js +0 -1
  140. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeSessions-legacy-B6T9ZEkM.js +0 -1
  141. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ClimateContent-CQrV1cla.js +0 -1
  142. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ClimateContent-legacy-BrVp5Dw8.js +0 -1
  143. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ControlsContent-CstWZ5bj.js +0 -1
  144. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ControlsContent-legacy-BjAyXo8j.js +0 -1
  145. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CostsContent-CK0of5Oy.js +0 -1
  146. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CostsContent-legacy-CjT03-9Q.js +0 -1
  147. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Dossier-BmSpMi7X.js +0 -1
  148. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Dossier-legacy-BtJFqzv2.js +0 -1
  149. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Energy-DWGRyP9W.js +0 -2
  150. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Energy-legacy-cm2mJNfJ.js +0 -1
  151. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Icons-legacy-ZQJ5sKUd.js +0 -1
  152. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/LineChart-DGCQr4Nw.js +0 -1
  153. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/LineChart-legacy-DrxGX8f1.js +0 -1
  154. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Navigation-Du1Aj9kc.js +0 -1
  155. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Navigation-legacy-fSc5iGaQ.js +0 -1
  156. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Order-Bz8dMpHT.js +0 -1
  157. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Order-legacy-F2DYekX2.js +0 -1
  158. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Planner-BTzxH_5N.js +0 -1
  159. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Planner-legacy-CV10WexM.js +0 -1
  160. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Settings-B1fRZDgg.js +0 -1
  161. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Settings-legacy-DKofNQMT.js +0 -1
  162. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Timeline-legacy-CRhBzQS3.js +0 -1
  163. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-BBVP4gU_.js +0 -4
  164. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-a6kZMJSm.css +0 -1
  165. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-legacy-DP7L_nrh.js +0 -5
  166. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/index-Co6dsD_A.css +0 -1
  167. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/index-DHJbtWU2.js +0 -305
  168. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/index-legacy-tYlhPd-t.js +0 -407
  169. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-BgwEQWW6-legacy-BzXX8Hmf.js +0 -5
  170. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CBzELu-H-C6O9Iw3F.js +0 -3
  171. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CBzELu-H-legacy-o6pkl5Q3.js +0 -5
  172. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CU1SSH8_-gXCsnaTd.js +0 -3
  173. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CU1SSH8_-legacy-BN-w_Fja.js +0 -5
  174. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CneGxKsZ-legacy-BvByEog5.js +0 -5
  175. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cwv-vmkN-DxmWWo4m.js +0 -3
  176. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cwv-vmkN-legacy-dIVDhulX.js +0 -5
  177. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cz5nLPGT-legacy-BGxjZQ_L.js +0 -5
  178. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/polyfills-legacy-BoMm-z7f.js +0 -1
  179. tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/index.html +0 -37
  180. tesla_cli-5.3.0/ui/src/components/ExploreContainer.css +0 -24
  181. tesla_cli-5.3.0/ui/src/components/ExploreContainer.tsx +0 -14
  182. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.dockerignore +0 -0
  183. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.env.example +0 -0
  184. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.githooks/pre-push +0 -0
  185. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  186. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  187. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.github/workflows/secret-scan.yml +0 -0
  188. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.python-version +0 -0
  189. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/CONTRIBUTING.md +0 -0
  190. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/LICENSE +0 -0
  191. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/Makefile +0 -0
  192. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/MIGRATION-PLAN-SOURCE-FIRST.md +0 -0
  193. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/TARGET-ARCHITECTURE.md +0 -0
  194. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/api-reference.md +0 -0
  195. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/data-sources.md +0 -0
  196. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/fleet-signed-setup.md +0 -0
  197. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/history-resynchronization.md +0 -0
  198. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/research/competitive-analysis.md +0 -0
  199. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/research/vatiolibre-comparison.md +0 -0
  200. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/why-tesla-cli.md +0 -0
  201. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/notebooks/consumption-model-probe.ipynb +0 -0
  202. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/.claude-plugin/marketplace.json +0 -0
  203. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  204. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/.gitignore +0 -0
  205. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/CHANGELOG.md +0 -0
  206. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/CLAUDE.md +0 -0
  207. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/LICENSE +0 -0
  208. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/README.md +0 -0
  209. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/bin/tesla-check +0 -0
  210. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/docs/design.md +0 -0
  211. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/analytics/SKILL.md +0 -0
  212. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/automations/SKILL.md +0 -0
  213. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/charge/SKILL.md +0 -0
  214. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/control/SKILL.md +0 -0
  215. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/dossier/SKILL.md +0 -0
  216. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/energy/SKILL.md +0 -0
  217. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/order/SKILL.md +0 -0
  218. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/serve/SKILL.md +0 -0
  219. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/setup/SKILL.md +0 -0
  220. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/status/SKILL.md +0 -0
  221. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/telemetry/SKILL.md +0 -0
  222. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/tesla-context/SKILL.md +0 -0
  223. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/scripts/secret-scan.sh +0 -0
  224. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/__main__.py +0 -0
  225. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/__init__.py +0 -0
  226. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/auth.py +0 -0
  227. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/command_policy.py +0 -0
  228. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/__init__.py +0 -0
  229. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/abrp.py +0 -0
  230. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/alerts.py +0 -0
  231. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/automations.py +0 -0
  232. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/ble.py +0 -0
  233. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/dashcam.py +0 -0
  234. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/doctor.py +0 -0
  235. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/domains.py +0 -0
  236. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/drivers.py +0 -0
  237. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/energy_mgmt.py +0 -0
  238. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/energy_prices.py +0 -0
  239. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/events.py +0 -0
  240. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/fleet.py +0 -0
  241. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/init.py +0 -0
  242. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/mission_control.py +0 -0
  243. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/mqtt.py +0 -0
  244. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/order.py +0 -0
  245. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/planner.py +0 -0
  246. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/scenes.py +0 -0
  247. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/service.py +0 -0
  248. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/session.py +0 -0
  249. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/sources.py +0 -0
  250. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/teslaMate.py +0 -0
  251. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/ui_dist/favicon.png +0 -0
  252. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/ui_dist/manifest.json +0 -0
  253. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/__init__.py +0 -0
  254. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/__init__.py +0 -0
  255. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/ble.py +0 -0
  256. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/climate.py +0 -0
  257. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/dashcam.py +0 -0
  258. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/doctor_cmd.py +0 -0
  259. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/domain_cmd.py +0 -0
  260. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/energy.py +0 -0
  261. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/event_stream_cmd.py +0 -0
  262. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/events.py +0 -0
  263. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/geofence.py +0 -0
  264. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/media.py +0 -0
  265. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/mqtt_cmd.py +0 -0
  266. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/nav.py +0 -0
  267. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/notify.py +0 -0
  268. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/providers_cmd.py +0 -0
  269. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/runt.py +0 -0
  270. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/scenes.py +0 -0
  271. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/security.py +0 -0
  272. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/serve.py +0 -0
  273. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/service.py +0 -0
  274. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/simit.py +0 -0
  275. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/telemetry.py +0 -0
  276. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/teslaMate.py +0 -0
  277. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/i18n.py +0 -0
  278. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/output.py +0 -0
  279. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/__init__.py +0 -0
  280. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/__init__.py +0 -0
  281. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/encryption.py +0 -0
  282. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/file_store.py +0 -0
  283. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/tesla_web_auth.py +0 -0
  284. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/tessie.py +0 -0
  285. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/__init__.py +0 -0
  286. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/base.py +0 -0
  287. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/cached.py +0 -0
  288. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/energy.py +0 -0
  289. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/energy_prices.py +0 -0
  290. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/fleet.py +0 -0
  291. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/fleet_signed.py +0 -0
  292. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/fleet_telemetry.py +0 -0
  293. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/runt.py +0 -0
  294. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/simit.py +0 -0
  295. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/teslaMate.py +0 -0
  296. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/tessie.py +0 -0
  297. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/db.py +0 -0
  298. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/diagnostics/__init__.py +0 -0
  299. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/diagnostics/teslamate_doctor.py +0 -0
  300. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/domains.py +0 -0
  301. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/geo.py +0 -0
  302. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/health/__init__.py +0 -0
  303. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/health/features.py +0 -0
  304. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/mission_control.py +0 -0
  305. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/__init__.py +0 -0
  306. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/automation.py +0 -0
  307. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/charge.py +0 -0
  308. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/climate.py +0 -0
  309. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/dossier.py +0 -0
  310. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/drive.py +0 -0
  311. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/energy.py +0 -0
  312. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/order.py +0 -0
  313. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/vehicle.py +0 -0
  314. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/__init__.py +0 -0
  315. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/arrival.py +0 -0
  316. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/dispatch.py +0 -0
  317. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/geocode.py +0 -0
  318. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/importers.py +0 -0
  319. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/route.py +0 -0
  320. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/__init__.py +0 -0
  321. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/calibrated.py +0 -0
  322. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/car_models.py +0 -0
  323. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/chargers.py +0 -0
  324. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/elevation.py +0 -0
  325. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/export.py +0 -0
  326. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/graph.py +0 -0
  327. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/models.py +0 -0
  328. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/mvp.py +0 -0
  329. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/routing.py +0 -0
  330. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/weather.py +0 -0
  331. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/__init__.py +0 -0
  332. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/base.py +0 -0
  333. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/__init__.py +0 -0
  334. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/abrp.py +0 -0
  335. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/apprise_notify.py +0 -0
  336. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/ble.py +0 -0
  337. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/ha.py +0 -0
  338. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/mqtt.py +0 -0
  339. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/loader.py +0 -0
  340. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/registry.py +0 -0
  341. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/sources.py +0 -0
  342. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/url_safety.py +0 -0
  343. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/endpoints.json +0 -0
  344. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/infra/__init__.py +0 -0
  345. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/infra/fleet_telemetry_stack.py +0 -0
  346. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/infra/teslamate_stack.py +0 -0
  347. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/py.typed +0 -0
  348. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tesla-config.example.json +0 -0
  349. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/__init__.py +0 -0
  350. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/fixtures/charge_curve/expected.json +0 -0
  351. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/fixtures/charge_curve/session_y1200.json +0 -0
  352. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/fixtures/teslamate_schema/charges_v1.30.sql +0 -0
  353. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_app_refresh.py +0 -0
  354. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_charge_curve.py +0 -0
  355. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_charge_enrichment.py +0 -0
  356. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_doctor.py +0 -0
  357. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_routes_new.py +0 -0
  358. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_teslamate_doctor.py +0 -0
  359. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_auth.py +0 -0
  360. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_backends.py +0 -0
  361. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_browser_login.py +0 -0
  362. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_commands.py +0 -0
  363. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_doctor.py +0 -0
  364. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_domains.py +0 -0
  365. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_epa_fallbacks.py +0 -0
  366. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_events.py +0 -0
  367. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_events_purge.py +0 -0
  368. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_fleet_signed_backend.py +0 -0
  369. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_mission_control.py +0 -0
  370. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_models.py +0 -0
  371. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_arrival.py +0 -0
  372. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_cli.py +0 -0
  373. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_dispatch.py +0 -0
  374. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_geocode.py +0 -0
  375. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_importers.py +0 -0
  376. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_models.py +0 -0
  377. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_new_commands.py +0 -0
  378. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_order_backend.py +0 -0
  379. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_outbound_safety.py +0 -0
  380. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_pipeline.py +0 -0
  381. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_api.py +0 -0
  382. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_calibrated.py +0 -0
  383. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_chargers.py +0 -0
  384. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_cli.py +0 -0
  385. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_consumption.py +0 -0
  386. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_elevation.py +0 -0
  387. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_export.py +0 -0
  388. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_graph.py +0 -0
  389. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_models.py +0 -0
  390. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_mvp.py +0 -0
  391. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_routing.py +0 -0
  392. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_weather.py +0 -0
  393. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_providers.py +0 -0
  394. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_providers_new.py +0 -0
  395. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_runt.py +0 -0
  396. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_runt_integration.py +0 -0
  397. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_secret_scanning.py +0 -0
  398. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_server.py +0 -0
  399. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_simit.py +0 -0
  400. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_simit_integration.py +0 -0
  401. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_sources.py +0 -0
  402. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_tesla_web_auth.py +0 -0
  403. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_teslamate_charge_curve.py +0 -0
  404. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_teslamate_curiosities.py +0 -0
  405. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_teslamate_doctor.py +0 -0
  406. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_teslamate_schema.py +0 -0
  407. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_teslamate_stack.py +0 -0
  408. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_token_file_store.py +0 -0
  409. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_token_refresh_scope.py +0 -0
  410. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_tokens_no_keyring.py +0 -0
  411. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v260.py +0 -0
  412. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v270.py +0 -0
  413. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v290.py +0 -0
  414. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v310.py +0 -0
  415. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v320.py +0 -0
  416. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v330.py +0 -0
  417. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v340.py +0 -0
  418. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/.browserslistrc +0 -0
  419. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/.gitignore +0 -0
  420. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/cypress/e2e/test.cy.ts +0 -0
  421. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/cypress/fixtures/example.json +0 -0
  422. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/cypress/support/commands.ts +0 -0
  423. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/cypress/support/e2e.ts +0 -0
  424. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/cypress.config.ts +0 -0
  425. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/index.html +0 -0
  426. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/ionic.config.json +0 -0
  427. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/ionic.starter.json +0 -0
  428. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/public/favicon.png +0 -0
  429. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/public/manifest.json +0 -0
  430. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/App.test.tsx +0 -0
  431. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/AuthGate.test.tsx +0 -0
  432. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/AuthGate.tsx +0 -0
  433. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/CommandButton.tsx +0 -0
  434. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/CopyButton.tsx +0 -0
  435. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/EmptyState.tsx +0 -0
  436. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/ErrorBoundary.tsx +0 -0
  437. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/ModelYSilhouette.tsx +0 -0
  438. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/OrderProcessTracker.tsx +0 -0
  439. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/RecentCharges.tsx +0 -0
  440. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/SeatHeaterGrid.tsx +0 -0
  441. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/SkeletonCard.tsx +0 -0
  442. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/StatusBadge.tsx +0 -0
  443. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/VehicleMap.tsx +0 -0
  444. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/CollapsibleSection.tsx +0 -0
  445. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/LogisticsCard.tsx +0 -0
  446. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/OptionCodesPills.tsx +0 -0
  447. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/RuntCard.tsx +0 -0
  448. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/SimitCard.tsx +0 -0
  449. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/SpecsGrid.tsx +0 -0
  450. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/StatusPipeline.tsx +0 -0
  451. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/VinDecoder.tsx +0 -0
  452. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/icons/Icons.tsx +0 -0
  453. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/icons/Spinner.tsx +0 -0
  454. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/hooks/sseHub.ts +0 -0
  455. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/hooks/useDashboardTiles.ts +0 -0
  456. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/hooks/useMissionControl.ts +0 -0
  457. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/hooks/useVehicleData.ts +0 -0
  458. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/main.tsx +0 -0
  459. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Action.tsx +0 -0
  460. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Alerts.tsx +0 -0
  461. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Analytics.tsx +0 -0
  462. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Automations.tsx +0 -0
  463. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Energy.tsx +0 -0
  464. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Home.css +0 -0
  465. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Navigation.tsx +0 -0
  466. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Planner.tsx +0 -0
  467. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Timeline.tsx +0 -0
  468. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Vehicle.tsx +0 -0
  469. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/vehicle/ClimateContent.tsx +0 -0
  470. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/vehicle/ControlsContent.tsx +0 -0
  471. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/vehicle/ScheduleContent.tsx +0 -0
  472. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/setupTests.ts +0 -0
  473. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/theme/variables.css +0 -0
  474. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/vite-env.d.ts +0 -0
  475. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/tsconfig.json +0 -0
  476. {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/tsconfig.node.json +0 -0
@@ -66,6 +66,7 @@ jobs:
66
66
  env:
67
67
  CYPRESS_INSTALL_BINARY: "0"
68
68
  - run: npx tsc --noEmit
69
+ - run: npm run lint
69
70
  - run: npx vitest run
70
71
  - run: npx vite build --outDir "$RUNNER_TEMP/ui-dist" --emptyOutDir
71
72
 
@@ -68,11 +68,68 @@ jobs:
68
68
  - name: Set up Python
69
69
  run: uv python install 3.12
70
70
 
71
+ - uses: actions/setup-node@v4
72
+ with:
73
+ node-version: "20"
74
+ cache: npm
75
+ cache-dependency-path: ui/package-lock.json
76
+
77
+ - name: Build dashboard into the package
78
+ working-directory: ui
79
+ env:
80
+ CYPRESS_INSTALL_BINARY: "0"
81
+ run: |
82
+ npm ci
83
+ npm run build
84
+
71
85
  - name: Build package
72
86
  run: uv build
73
87
 
88
+ - name: Wheel ships the dashboard
89
+ run: |
90
+ python3 - <<'PY'
91
+ import glob, zipfile
92
+ names = zipfile.ZipFile(glob.glob("dist/*.whl")[0]).namelist()
93
+ assert "tesla_cli/api/ui_dist/index.html" in names, "dashboard missing from wheel"
94
+ print(sum(n.startswith("tesla_cli/api/ui_dist/") for n in names), "dashboard files in wheel")
95
+ PY
96
+
74
97
  - name: Scan distribution archives before publication
75
98
  run: scripts/secret-scan.sh --artifacts dist
76
99
 
77
100
  - name: Publish to PyPI
78
101
  uses: pypa/gh-action-pypi-publish@release/v1
102
+
103
+ docker:
104
+ name: Publish multi-arch image to GHCR
105
+ needs: verify
106
+ runs-on: ubuntu-latest
107
+ permissions:
108
+ contents: read
109
+ packages: write
110
+ steps:
111
+ - uses: actions/checkout@v4
112
+ - uses: docker/setup-qemu-action@v3
113
+ - uses: docker/setup-buildx-action@v3
114
+ - uses: docker/login-action@v3
115
+ with:
116
+ registry: ghcr.io
117
+ username: ${{ github.actor }}
118
+ password: ${{ secrets.GITHUB_TOKEN }}
119
+ - id: meta
120
+ uses: docker/metadata-action@v5
121
+ with:
122
+ images: ghcr.io/${{ github.repository_owner }}/tesla-cli
123
+ tags: |
124
+ type=semver,pattern={{version}}
125
+ type=semver,pattern={{major}}.{{minor}}
126
+ type=raw,value=latest
127
+ - uses: docker/build-push-action@v6
128
+ with:
129
+ context: .
130
+ platforms: linux/amd64,linux/arm64
131
+ push: true
132
+ tags: ${{ steps.meta.outputs.tags }}
133
+ labels: ${{ steps.meta.outputs.labels }}
134
+ cache-from: type=gha
135
+ cache-to: type=gha,mode=max
@@ -88,3 +88,6 @@ audit/
88
88
  /tesla-config*.bak
89
89
  /tesla-config*.backup
90
90
  coverage.xml
91
+
92
+ # Built dashboard (make build / release workflow); shipped via hatch artifacts
93
+ src/tesla_cli/api/ui_dist/
@@ -29,10 +29,14 @@ regex = '''\b[0-9]{7,12}:[A-Za-z0-9_-]{30,50}\b'''
29
29
  [[rules]]
30
30
  id = "generic-api-key"
31
31
  [[rules.allowlists]]
32
- description = "Audited generated React vnode SHA1 keys, not authentication keys"
32
+ # Ionic/Stencil compiled components carry 40-hex SHA1 vnode keys
33
+ # (`key:"<sha1>"`). The generic rule sometimes captures only a prefix of one
34
+ # (seen: 27 chars), so accept hex-only prefixes of 20-40 chars — still only
35
+ # inside built dashboard bundles, and only in the `key:"<hex>` vnode shape.
36
+ description = "Audited generated React/Stencil vnode SHA1 keys, not authentication keys"
33
37
  condition = "AND"
34
38
  regexTarget = "match"
35
- regexes = ['''\bkey\s*:\s*["'][a-f0-9]{30,40}(?:["']|$)''']
39
+ regexes = ['''\bkey\s*:\s*["'][a-f0-9]{20,40}(?:["']|$)''']
36
40
  paths = ['''(?:^|/)(?:src/)?tesla_cli/api/ui_dist/assets/[^/]+\.js$''']
37
41
 
38
42
  [[rules]]
@@ -5,6 +5,99 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [5.4.0] - 2026-11-04
9
+
10
+ Stabilization release: works through the remaining findings of the critical
11
+ production-readiness review. No new end-user features.
12
+
13
+ ### Upgrading from 5.3.x
14
+
15
+ - **`openquery` is now optional** (`tesla-cli[query]`). It was a hard
16
+ dependency that pulled paddlepaddle, torch and CUDA libraries (gigabytes)
17
+ into every install and has no Linux arm64 wheels. A base install with the
18
+ dashboard is now ~84 MB. Colombian registry features (RUNT, SIMIT, …) need
19
+ `pip install 'tesla-cli[query]'`; the Docker image omits it (build with
20
+ `--build-arg UV_EXTRAS=...` to include it, amd64 only).
21
+
22
+ - `POST /api/dossier/refresh` replaces `GET` (state-changing GETs are
23
+ triggerable cross-site). The bundled dashboard is updated.
24
+ - `/api/auth/browser-login` ignores `email`/`password` (they were never used:
25
+ login happens in Tesla's own page in a browser window on the server).
26
+ - Order tracking sends `deviceCountry`/`deviceLanguage` from the new
27
+ `[order] country` / `language` settings (default `US` / `en`; it used to
28
+ be hardcoded to `CO` / `es`). Colombian users: `tesla config set
29
+ order.country CO` and `order.language es`.
30
+ - Tesla authentication failures surface as HTTP 424 (not 401, which the
31
+ dashboard reads as "wrong API key"); Tesla unreachable is 504.
32
+ - Docker images: `ghcr.io/dacrypt/tesla-cli` (amd64 + arm64).
33
+
34
+ ### Reliability
35
+
36
+ - **Central error mapping** (`api/errors.py`) replaces 19 copy-pasted blocks
37
+ that guessed the HTTP status by searching for "412"/"429" in error text;
38
+ typed errors escaping any route are mapped by a global handler.
39
+ - **Network retries** for every backend: connection failures are retried for
40
+ any method, read timeouts only for GET — a command is never sent twice.
41
+ New typed `NetworkError`.
42
+ - **Rate limits per Tesla quota class** (data 45/min, commands 25/min, wake
43
+ 3/min) instead of one 5/min bucket shared with the dashboard poller, which
44
+ could block commands for up to 30 s.
45
+ - Owner API backend moved onto the shared HTTP helper (429/503 backoff,
46
+ Retry-After, typed errors).
47
+ - 31 silently swallowed exceptions now log with tracebacks; new global
48
+ `--debug` flag / `TESLA_LOG_LEVEL`; a test blocks new silent swallows.
49
+
50
+ ### Security
51
+
52
+ - **Root cause of the October 2026 disclosure fixed.** `tesla config backup`
53
+ wrote `tesla-config-backup.json` into the current directory (the project
54
+ checkout, where it was committed) and its key-name redaction let Apprise
55
+ notification URLs (Telegram bot token), VIN and reservation through.
56
+ Backups, `config export -o` and `config export-env -o` now go through
57
+ `core/private_files.py`: default location `~/.tesla-cli/backups/`, mode
58
+ `0600`, and **refuse to write inside any git work tree**. Redaction covers
59
+ notification/webhook URLs. `config export` no longer claims to be "safe to
60
+ share" while printing every key: credentials are redacted unless
61
+ `--include-secrets`. `config restore` never writes `[REDACTED]`
62
+ placeholders back.
63
+ - Secret-scanner allowlist for compiled dashboard bundles also accepts
64
+ 20–40-char prefixes of Stencil vnode SHA1 keys (gitleaks captured a 27-char
65
+ prefix of one after the legacy bundle was dropped). Still restricted to
66
+ `ui_dist/assets/*.js` and the `key:"<hex>` shape.
67
+ - Single-flight guard on endpoints that spawn headless browsers (login,
68
+ portal scrape, dossier refresh): concurrent calls get 429.
69
+ - Audit log covers every mutating API call with recursive redaction (PINs,
70
+ URLs, keys).
71
+ - Static file serving uses `Path.is_relative_to` (prefix check matched
72
+ sibling directories).
73
+ - Dashboard no longer sends the Tesla password to the server.
74
+
75
+ ### Architecture
76
+
77
+ - `core/` no longer imports the CLI or Rich (interactive login moved to
78
+ `cli/auth_flow.py`; dossier progress via callback); the API no longer
79
+ imports private CLI helpers (`core/charging.py`, `core/config_checks.py`);
80
+ routes no longer call external APIs inline
81
+ (`core/backends/colombia_open_data.py`). `tests/test_layering.py`
82
+ enforces it.
83
+ - **Config schema versioning**: `schema_version` + step-by-step migrations;
84
+ configs from a newer tesla-cli are refused. `tesla config migrate` now
85
+ actually detects missing keys (it diffed the loaded model before) and its
86
+ backup is `0600`.
87
+
88
+ ### Dashboard & release
89
+
90
+ - ESLint errors fixed and lint runs in CI (legacy `any` capped as warnings);
91
+ one shared HTTP client; TeslaMate/Grafana links use the dashboard host.
92
+ - Dropped `@vitejs/plugin-legacy`: bundle 4.6 MB → 2.3 MB.
93
+ - The compiled dashboard is no longer committed; the release workflow builds
94
+ it and verifies the wheel ships it.
95
+ - Multi-arch image published to GHCR on each release; new
96
+ [self-hosting guide](docs/self-hosting.md) (remote access, upgrades,
97
+ backups).
98
+ - Docs: removed links to unpublished design notes; CLI translations marked
99
+ experimental (`--lang` does not translate output yet).
100
+
8
101
  ## [5.3.0] - 2026-11-04
9
102
 
10
103
  First stable 5.x release on PyPI (the previous published version is 4.9.0;
@@ -220,7 +313,7 @@ managed TeslaMate stack — and a verified release pipeline.
220
313
  ### CLI — Native EV Route Planner (Phase 1 MVP)
221
314
 
222
315
  First shippable phase of the native EV planner roadmap
223
- (`.omc/plans/native-ev-planner.md`). Suggests charging stops along a route
316
+ (the `native-ev-planner` design notes (internal, not published)). Suggests charging stops along a route
224
317
  using open-source data — no ABRP Premium contract required.
225
318
 
226
319
  - **`tesla nav plan <origin> <destination>`** — computes a driving route via
@@ -311,7 +404,7 @@ using open-source data — no ABRP Premium contract required.
311
404
  ### Why
312
405
 
313
406
  Unblocks the phased native EV route planner roadmap
314
- (`.omc/plans/native-ev-planner.md`): Phase 1 `tesla nav plan <from> <to>`
407
+ (the `native-ev-planner` design notes (internal, not published)): Phase 1 `tesla nav plan <from> <to>`
315
408
  will tag generated routes with `source="native-planner"` so that re-running
316
409
  a plan cannot clobber a route you created by hand with `tesla nav route
317
410
  create`. Ships standalone (no dependency on later phases).
@@ -369,7 +462,7 @@ create`. Ships standalone (no dependency on later phases).
369
462
  - `docs/user-guide.md` — new "Favorites Importer" section with command examples
370
463
  and dedupe semantics.
371
464
  - `docs/roadmap.md` — current state advanced to v4.9.3.
372
- - `.omc/plans/nav-favorites-importer.md` — ralplan consensus design record.
465
+ - the `nav-favorites-importer` design notes (internal, not published) — ralplan consensus design record.
373
466
 
374
467
  ## [4.9.2] - 2026-04-20
375
468
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  Full-stack Tesla management platform: CLI (Typer) + REST API (FastAPI) + Web Dashboard (React/Ionic). Tracks orders, controls vehicles, aggregates data from 15+ sources, integrates with TeslaMate/MQTT/HA/ABRP.
6
6
 
7
- **Version**: v5.3.0 | **Python**: 3.12+ | **Package manager**: uv | **Tests**: 2100+
7
+ **Version**: v5.4.0 | **Python**: 3.12+ | **Package manager**: uv | **Tests**: 2100+
8
8
 
9
9
  ## Architecture (quick reference)
10
10
 
@@ -42,7 +42,7 @@ Full architecture: [docs/architecture.md](docs/architecture.md)
42
42
  ## Development commands
43
43
 
44
44
  ```bash
45
- uv sync --extra dev --extra serve --extra teslaMate --extra fleet --extra pdf
45
+ uv sync --extra dev --extra serve --extra teslaMate --extra fleet --extra pdf --extra query
46
46
  uv run pytest -m "not integration" -x # unit tests (fast)
47
47
  uv run pytest # all tests including integration
48
48
  uv run ruff check src/ tests/ # lint
@@ -91,4 +91,5 @@ make api # FastAPI dev server (port 8080)
91
91
  | [docs/configuration.md](docs/configuration.md) | Config keys, auth, tokens |
92
92
  | [docs/api-reference.md](docs/api-reference.md) | REST endpoints, SSE, Prometheus |
93
93
  | [docs/data-sources.md](docs/data-sources.md) | Tesla APIs, 15 registered sources |
94
+ | [docs/self-hosting.md](docs/self-hosting.md) | Production install, remote access, upgrades, backups |
94
95
  | [docs/roadmap.md](docs/roadmap.md) | Remaining gaps, priorities |
@@ -1,5 +1,6 @@
1
- # Stage 1: Build UI
2
- FROM node:20-alpine AS ui-build
1
+ # Stage 1: Build UI (on the build host's native platform: the bundle is
2
+ # platform-independent, so arm64 images do not pay for emulated npm builds)
3
+ FROM --platform=$BUILDPLATFORM node:20-alpine AS ui-build
3
4
  WORKDIR /app/ui
4
5
  COPY ui/package*.json ./
5
6
  # Cypress (e2e only) is not needed to build the bundle
@@ -22,8 +23,11 @@ WORKDIR /app
22
23
  COPY pyproject.toml uv.lock README.md ./
23
24
  COPY src/ src/
24
25
 
25
- # Install with serve extra
26
- RUN uv sync --frozen --extra serve --extra fleet --extra teslaMate --extra pdf --no-dev
26
+ # Extras baked into the image. Colombian registry lookups (RUNT/SIMIT) need
27
+ # `--build-arg UV_EXTRAS="--extra serve --extra fleet --extra teslaMate --extra pdf --extra query"`
28
+ # — amd64 only: openquery pulls paddlepaddle/torch, which ship no arm64 wheels.
29
+ ARG UV_EXTRAS="--extra serve --extra fleet --extra teslaMate --extra pdf"
30
+ RUN uv sync --frozen $UV_EXTRAS --no-dev
27
31
 
28
32
  # Copy freshly built UI into the location the API serves from
29
33
  COPY --from=ui-build /app/src/tesla_cli/api/ui_dist src/tesla_cli/api/ui_dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tesla-cli
3
- Version: 5.3.0
3
+ Version: 5.4.0
4
4
  Summary: CLI tool for Tesla order tracking and vehicle control
5
5
  Project-URL: Homepage, https://github.com/dacrypt/tesla
6
6
  Project-URL: Repository, https://github.com/dacrypt/tesla
@@ -23,7 +23,6 @@ Requires-Dist: apprise>=1.9
23
23
  Requires-Dist: cryptography>=46.0.5
24
24
  Requires-Dist: httpx>=0.28
25
25
  Requires-Dist: keyring>=25
26
- Requires-Dist: openquery~=1.4.0
27
26
  Requires-Dist: pydantic-settings>=2.7
28
27
  Requires-Dist: pydantic>=2.10
29
28
  Requires-Dist: pyjwt>=2.10
@@ -39,7 +38,7 @@ Requires-Dist: tesla-fleet-api>=1.0; extra == 'fleet'
39
38
  Provides-Extra: pdf
40
39
  Requires-Dist: fpdf2>=2.7; extra == 'pdf'
41
40
  Provides-Extra: query
42
- Requires-Dist: openquery; extra == 'query'
41
+ Requires-Dist: openquery~=1.4.0; extra == 'query'
43
42
  Provides-Extra: serve
44
43
  Requires-Dist: fastapi>=0.110; extra == 'serve'
45
44
  Requires-Dist: uvicorn[standard]>=0.29; extra == 'serve'
@@ -71,6 +70,7 @@ tesla serve → start REST API + web dashboard
71
70
  ```bash
72
71
  # Requirements: Python 3.12+
73
72
  uv tool install "tesla-cli[serve,fleet]" # or: pipx install "tesla-cli[serve,fleet]"
73
+ # Colombian registries (RUNT, SIMIT…): add the heavy `query` extra → "tesla-cli[serve,fleet,query]"
74
74
  tesla setup
75
75
  ```
76
76
 
@@ -384,6 +384,10 @@ Notes:
384
384
  - You do not need to set `localStorage.tesla_api_url` for local dev.
385
385
  - For a non-default API target, set `VITE_TESLA_API_URL` before `make ui`.
386
386
 
387
+ Prebuilt multi-arch images (amd64 + arm64) are published to
388
+ `ghcr.io/dacrypt/tesla-cli`; see the [self-hosting guide](docs/self-hosting.md)
389
+ for remote access (Tailscale / reverse proxy), upgrades and backups.
390
+
387
391
  ### Full Stack (with TeslaMate + Grafana)
388
392
 
389
393
  Requires `DB_PASSWORD`, `ENCRYPTION_KEY` and `GRAFANA_PASSWORD` in `.env` (no
@@ -22,6 +22,7 @@ tesla serve → start REST API + web dashboard
22
22
  ```bash
23
23
  # Requirements: Python 3.12+
24
24
  uv tool install "tesla-cli[serve,fleet]" # or: pipx install "tesla-cli[serve,fleet]"
25
+ # Colombian registries (RUNT, SIMIT…): add the heavy `query` extra → "tesla-cli[serve,fleet,query]"
25
26
  tesla setup
26
27
  ```
27
28
 
@@ -335,6 +336,10 @@ Notes:
335
336
  - You do not need to set `localStorage.tesla_api_url` for local dev.
336
337
  - For a non-default API target, set `VITE_TESLA_API_URL` before `make ui`.
337
338
 
339
+ Prebuilt multi-arch images (amd64 + arm64) are published to
340
+ `ghcr.io/dacrypt/tesla-cli`; see the [self-hosting guide](docs/self-hosting.md)
341
+ for remote access (Tailscale / reverse proxy), upgrades and backups.
342
+
338
343
  ### Full Stack (with TeslaMate + Grafana)
339
344
 
340
345
  Requires `DB_PASSWORD`, `ENCRYPTION_KEY` and `GRAFANA_PASSWORD` in `.env` (no
@@ -28,6 +28,16 @@ We will respond within 48 hours and provide a fix timeline.
28
28
  - **Network**: All API calls direct to Tesla (no third-party relay). Self-hosted telemetry.
29
29
  - **Docker**: Non-root container, health checks, named volumes for persistent data.
30
30
 
31
+ ## Past incidents
32
+
33
+ - **October 2026** — a configuration backup (`tesla-config-backup.json`)
34
+ generated inside the project checkout was committed, exposing a Telegram bot
35
+ token (revoked), a VIN, an order reservation and a Fleet API client ID.
36
+ History was rewritten, affected pull requests and cached objects were purged
37
+ by GitHub Support, and contaminated PyPI sdists were deleted. Since 5.4.0
38
+ the CLI refuses to write backups/exports inside a git work tree and writes
39
+ them `0600` under `~/.tesla-cli/backups/`.
40
+
31
41
  ## Publication checks
32
42
 
33
43
  CI scans all reachable history and tracked files using pinned Gitleaks, plus VIN, reservation and Telegram rules. Package publication also scans generated archives. Findings are never uploaded as public reports. GitHub secret scanning and push protection should remain enabled.
@@ -12,6 +12,9 @@
12
12
 
13
13
  services:
14
14
  tesla-cli:
15
+ # Prebuilt multi-arch image (amd64 + arm64: Raspberry Pi, most NAS).
16
+ # Pin a release with TESLA_CLI_TAG=5.4.0; `docker compose build` builds locally.
17
+ image: ghcr.io/dacrypt/tesla-cli:${TESLA_CLI_TAG:-latest}
15
18
  build: .
16
19
  container_name: tesla-cli
17
20
  ports:
@@ -1,5 +1,8 @@
1
1
  services:
2
2
  tesla-cli:
3
+ # Prebuilt multi-arch image (amd64 + arm64: Raspberry Pi, most NAS).
4
+ # Pin a release with TESLA_CLI_TAG=5.4.0; `docker compose build` builds locally.
5
+ image: ghcr.io/dacrypt/tesla-cli:${TESLA_CLI_TAG:-latest}
3
6
  build: .
4
7
  container_name: tesla-cli
5
8
  ports:
@@ -11,7 +11,7 @@ src/tesla_cli/
11
11
  ├── app.py # Entry point — registers all Typer sub-apps
12
12
  ├── config.py # Pydantic-Settings config model (~/.tesla-cli/config.toml)
13
13
  ├── output.py # Rich rendering + JSON mode + --anon anonymizer
14
- ├── i18n.py # Lightweight i18n: t(key) — en/es/pt/fr/de/it
14
+ ├── i18n.py # Translation catalog t(key) (experimental: commands not yet translated)
15
15
  ├── exceptions.py # AuthenticationError, ApiError, BackendError, etc.
16
16
  │
17
17
  ├── core/
@@ -32,6 +32,11 @@ qos = 0
32
32
  retain = false
33
33
  tls = false
34
34
 
35
+ [order]
36
+ reservation_number = ""
37
+ country = "US" # deviceCountry sent to Tesla's order-tasks API (e.g. "CO")
38
+ language = "en" # deviceLanguage (e.g. "es")
39
+
35
40
  [server]
36
41
  api_key = "" # full-control key; auto-generated when serving off-localhost
37
42
  read_only_key = "" # optional GET-only key (wall dashboards, Home Assistant)
@@ -155,7 +160,7 @@ tesla config auth fleet # Fleet API OAuth2 flow
155
160
 
156
161
  | Variable | Description |
157
162
  |----------|-------------|
158
- | `TESLA_LANG` | UI language (`en`, `es`, `pt`, `fr`, `de`, `it`) |
163
+ | `TESLA_LANG` | Reserved for CLI translations (experimental — output is English today) |
159
164
  | `TESLA_API_KEY` | API server full-control key (overrides config) |
160
165
  | `TESLA_READ_ONLY_KEY` | API server read-only key (overrides config) |
161
166
  | `TESLA_CLI_TOKEN_STORE` | `file` forces the encrypted file token store (default in Docker; automatic when no keyring exists) |
@@ -135,7 +135,7 @@ the real path. Single-user CLI — no lockfile.
135
135
 
136
136
  - `docs/fleet-signed-setup.md` — how to get `share` working (VCP pairing).
137
137
  - `docs/roadmap.md` — v4.9.2.1 plan (real `TelemetryArrivalSource`).
138
- - `.omc/plans/nav-route-telemetry.md` — full design + ADR-012.
138
+ - the `nav-route-telemetry` design notes (internal, not published) — full design + ADR-012.
139
139
 
140
140
  ## ADR-012 — Why the split?
141
141
 
@@ -154,4 +154,4 @@ ABRP-Premium UX minus one keypress.
154
154
  - `ArrivalSource` protocol lets v4.9.2.1 plug in a real subscriber with zero
155
155
  changes to the detector, dispatcher, or CLI.
156
156
 
157
- Full rationale: `.omc/plans/nav-route-telemetry.md` §7.
157
+ Full rationale: the `nav-route-telemetry` design notes (internal, not published) §7.
@@ -5,9 +5,9 @@
5
5
 
6
6
  ---
7
7
 
8
- ## Current State (v5.3.0)
8
+ ## Current State (v5.4.0)
9
9
 
10
- 180+ commands across 26 groups, 1970+ tests, 86 API endpoints, 27 Prometheus gauges, React dashboard with live map + Recharts analytics + Planner page, 7 providers, managed TeslaMate + Fleet Telemetry stacks, 15 data sources, 6 i18n languages, Claude Code plugin (11 skills), automation engine, Powerwall/Solar support, **VCP signed commands (fleet-signed backend)**, **multi-stop navigation with manual advance + simulated auto-advance**, **favorites importer for Google Takeout / KML / GPX**, **native EV route planner (Phases 1 + 2 + 3) with OpenRouteService + OpenChargeMap + open-elevation + OpenWeatherMap + ABRP deep-link, TeslaMate-calibrated consumption model, A\* alternatives, GPX/KML export, REST API + dashboard page**.
10
+ 180+ commands across 26 groups, 1970+ tests, 86 API endpoints, 27 Prometheus gauges, React dashboard with live map + Recharts analytics + Planner page, 7 providers, managed TeslaMate + Fleet Telemetry stacks, 15 data sources, Claude Code plugin (11 skills), automation engine, Powerwall/Solar support, **VCP signed commands (fleet-signed backend)**, **multi-stop navigation with manual advance + simulated auto-advance**, **favorites importer for Google Takeout / KML / GPX**, **native EV route planner (Phases 1 + 2 + 3) with OpenRouteService + OpenChargeMap + open-elevation + OpenWeatherMap + ABRP deep-link, TeslaMate-calibrated consumption model, A\* alternatives, GPX/KML export, REST API + dashboard page**.
11
11
 
12
12
  ---
13
13
 
@@ -37,7 +37,7 @@
37
37
  - ✅ **Favorites Importer (v4.9.3)** — `tesla nav place import` pulls favorites from Google Takeout (CSV + GeoJSON), KML, and GPX into the local place book. Stable `(source, source_id)` dedupe survives renames in Google Maps; hand-created places are never overwritten by imports. `tesla nav place send <alias>` dispatches any stored place to the car via the signed share command. Stdlib-only parsers, 25 MB file guard, 20-call geocode cap.
38
38
  - ✅ **Route Model Extension (v4.9.4)** — `Route` dataclass gains optional `source` / `source_id` fields (mirroring `Place`). `save_route` adopts the filter-None serialization pattern with hand-created dedupe. Unblocks planner-generated routes that can't overwrite user routes. Backward-compatible with existing `nav.toml` files.
39
39
  - ✅ **Native EV Route Planner — Phase 1 MVP (v4.10.0)** — `tesla nav plan <from> <to>` auto-suggests charging stops using OpenRouteService (routing) + OpenChargeMap (chargers). Default 150 km interpolation (LATAM-safe), `--network tesla|ccs|any`, `--min-power`, `--save-as` (persists as nav Route, `source="native-planner"`), `--json` output, `--abrp-link` deep URL for SoC-aware second opinion. BYOK required for both APIs (free tier signups at [openchargemap.org](https://openchargemap.org/site/profile/applications) and [openrouteservice.org](https://openrouteservice.org/dev/#/signup)). `--router osrm` for zero-key public demo.
40
- - ⚠️ **Native EV Route Planner — Phases 2 + 3 (v5.0.0, speculative)** — ships probe-deferred. Phase 2: TeslaMate-calibrated consumption model with `tesla nav consumption calibrate`, SoC prediction along route, elevation + weather integration, `--soc-start/--soc-target/--min-arrival-soc/--battery-kwh` flags. Phase 3: A\* alternatives (`--alternatives N`), GPX/KML export (`tesla nav route export`), REST API (`POST /api/nav/plan`), React Planner dashboard page. **Accuracy caveat**: shipped with published Tesla baseline coefficients; per-vehicle calibration requires running the Jupyter probe notebook (`notebooks/consumption-model-probe.ipynb`) against real TeslaMate data. Full design: [.omc/plans/native-ev-planner.md](../.omc/plans/native-ev-planner.md).
40
+ - ⚠️ **Native EV Route Planner — Phases 2 + 3 (v5.0.0, speculative)** — ships probe-deferred. Phase 2: TeslaMate-calibrated consumption model with `tesla nav consumption calibrate`, SoC prediction along route, elevation + weather integration, `--soc-start/--soc-target/--min-arrival-soc/--battery-kwh` flags. Phase 3: A\* alternatives (`--alternatives N`), GPX/KML export (`tesla nav route export`), REST API (`POST /api/nav/plan`), React Planner dashboard page. **Accuracy caveat**: shipped with published Tesla baseline coefficients; per-vehicle calibration requires running the Jupyter probe notebook (`notebooks/consumption-model-probe.ipynb`) against real TeslaMate data. Design notes are internal (not published).
41
41
 
42
42
  ---
43
43
 
@@ -53,16 +53,21 @@ work takes priority over new features.
53
53
  - ✅ Encrypted file token store for Docker / headless hosts (Docker-secret master key)
54
54
  - ✅ Release pipeline: version consistency, tests before publish, UI + Docker jobs in CI, coverage floor
55
55
 
56
- ### S1 — Next stabilization release
57
- - **Typed error handling** — global FastAPI exception handlers keyed on `core/exceptions.py`; replace 32 `"429" in str(exc)` checks and `detail=str(exc)` leaks; log instead of `except Exception: pass`.
58
- - **Uniform HTTP resilience** — retries on transport errors/timeouts for every backend (Owner and Order backends bypass the shared helper); per-vehicle rate budget instead of a global 5 req/min bucket shared with the hub poller.
59
- - **Layering** — move `_fetch_sessions` / config checks out of `cli/` into `core/`; remove `rich`/CLI imports from `core/`.
60
- - **Rate limiting** on login/scrape endpoints that spawn headless browsers.
61
- - **Multi-arch image on GHCR** (amd64 + arm64 for Pi/NAS) built by the release workflow.
62
- - **Config schema versioning** with real migrations (rename/remove keys).
63
- - **Backups** — `tesla backup` / `restore` for config, events DB and TeslaMate.
64
- - Raise coverage floor toward 70% for `core/` + `api/`; fix the 128 ESLint errors and add ESLint to CI.
65
- - Mark unofficial-API features (order tracking, portal scraping, RUNT/SIMIT, speculative planner) as **experimental** with health alerts when they break.
56
+ ### Done in 5.4.0
57
+ - ✅ Typed error handling: central mapping + global handlers; silent `except: pass` now logged; `--debug`
58
+ - ✅ HTTP resilience: safe transport retries everywhere; rate limits per Tesla quota class
59
+ - ✅ Layering enforced by test (core ↛ cli/rich/fastapi, api ↛ cli); no HTTP calls inside routes
60
+ - ✅ Single-flight guard on headless-browser endpoints; full audit log; dossier refresh is POST
61
+ - ✅ Multi-arch image on GHCR; self-hosting guide (remote access, upgrades, manual backups)
62
+ - ✅ Config `schema_version` with step-by-step migrations
63
+ - ✅ ESLint clean + in CI; dashboard bundle halved; compiled UI out of git
64
+
65
+ ### S2 — Next
66
+ - **Backups as a command** — `tesla backup` / `restore` (today: documented `tar` + `pg_dump`).
67
+ - **Experimental features** — flag unofficial-API features (order tracking, portal scraping, RUNT/SIMIT, speculative planner) in CLI help and dashboard; raise an alert when they start failing.
68
+ - **CLI translations** — decide: wire `cli/i18n.py` into commands or drop `--lang`.
69
+ - **God-modules** — split `cli/commands/vehicle.py` (3.2k lines), `teslaMate.py`, `dossier.py`, `core/sources.py`; `ui/src/pages/Settings.tsx`, `api/client.ts`.
70
+ - **Tests** — regroup the version-named files (`test_v260.py` … `test_v340.py`) by feature; raise the coverage floor (58% today) toward 70% for `core/` + `api/`; replace the 113 legacy `any` types in the dashboard.
66
71
 
67
72
  ## Remaining Gaps
68
73
 
@@ -72,7 +77,7 @@ work takes priority over new features.
72
77
  - Wire a concrete `TelemetryArrivalSource` into `tesla nav route go` (currently `NullArrivalSource` only).
73
78
  - Requires a publish-sink decision (SSE / Kafka / NATS) for the in-tree Fleet Telemetry receiver.
74
79
  - Removes the hardcoded `external-blocker` on the `nav_route_auto_advance` doctor row.
75
- - Trigger: open the v4.9.2.1 spike PR within 7 days of v4.9.2 merge. See ADR-012 in `.omc/plans/nav-route-telemetry.md`.
80
+ - Trigger: open the v4.9.2.1 spike PR within 7 days of v4.9.2 merge. See ADR-012 in the `nav-route-telemetry` design notes (internal, not published).
76
81
 
77
82
  ### P3 — Lower Priority
78
83
 
@@ -0,0 +1,123 @@
1
+ # Self-hosting guide
2
+
3
+ tesla-cli is built to run on hardware you own — a home server, NAS, Raspberry
4
+ Pi or VPS. There is no hosted/SaaS version. This guide covers a production
5
+ setup: installation, remote access, upgrades and backups.
6
+
7
+ ## 1. Install
8
+
9
+ ### Docker (recommended)
10
+
11
+ Prebuilt images for `linux/amd64` and `linux/arm64` are published to
12
+ `ghcr.io/dacrypt/tesla-cli` on every release (`latest`, `X.Y.Z`, `X.Y`).
13
+
14
+ ```bash
15
+ curl -O https://raw.githubusercontent.com/dacrypt/tesla/main/docker-compose.yml
16
+ docker compose up -d
17
+ docker compose logs tesla-cli | grep -A1 "API key generated" # first start only
18
+ ```
19
+
20
+ Pin a version for reproducible upgrades: `TESLA_CLI_TAG=5.4.0 docker compose up -d`.
21
+
22
+ Full stack with TeslaMate, Grafana, Postgres and Mosquitto:
23
+ `docker-compose.full.yml` (requires `DB_PASSWORD`, `ENCRYPTION_KEY`,
24
+ `GRAFANA_PASSWORD` in `.env` — see the README).
25
+
26
+ ### Bare metal / VM
27
+
28
+ ```bash
29
+ uv tool install "tesla-cli[serve,fleet]" # or: pipx install ...
30
+ tesla setup
31
+ tesla serve install-service --host 0.0.0.0 # systemd (Linux) / launchd (macOS)
32
+ ```
33
+
34
+ ## 2. Security model (read this)
35
+
36
+ - Binding beyond `127.0.0.1` **requires an API key**; one is generated on first
37
+ start. Show or rotate it with `tesla serve api-key [--rotate]`. A read-only
38
+ key for wall displays / Home Assistant: `tesla serve api-key --read-only --rotate`.
39
+ - The dashboard signs in once with the key and keeps an HttpOnly cookie.
40
+ - Cross-site requests and DNS-rebinding attempts are blocked; raw vehicle
41
+ commands are allowlisted (`server.extra_allowed_commands` to extend).
42
+ - Tokens live in the OS keyring, or — in Docker/headless — in an AES-256-GCM
43
+ encrypted file. Keep the master key outside the volume with
44
+ `TESLA_CLI_MASTER_KEY_FILE` (Docker secret).
45
+ - Every state-changing API call is written to `~/.tesla-cli/events/audit.jsonl`
46
+ (secrets redacted). `GET /api/audit` shows it.
47
+
48
+ ## 3. Remote access
49
+
50
+ Never port-forward the API to the internet. Pick one:
51
+
52
+ | Option | Effort | Notes |
53
+ |--------|--------|-------|
54
+ | **Tailscale / WireGuard** | low | Best default. Reach `http://<tailnet-host>:8080` from your phone; nothing is exposed publicly. |
55
+ | **Reverse proxy with HTTPS** (Caddy, Traefik, nginx) | medium | Terminate TLS at the proxy; keep the API key. With the proxy on the same host, uvicorn trusts its `X-Forwarded-Proto` and the session cookie is marked `Secure`. |
56
+ | **Cloudflare Tunnel + Access** | medium | Put Cloudflare Access (SSO) in front; keep the API key as a second factor. |
57
+
58
+ Caddy example (`Caddyfile`):
59
+
60
+ ```
61
+ tesla.example.com {
62
+ reverse_proxy 127.0.0.1:8080
63
+ }
64
+ ```
65
+
66
+ Only if the proxy itself authenticates every request may you run
67
+ `tesla serve --insecure-no-auth`; add the public hostname to
68
+ `server.allowed_hosts`.
69
+
70
+ TeslaMate, Grafana and Mosquitto bind to `127.0.0.1` by default
71
+ (`STACK_BIND` / `TM_BIND_ADDR` to change) — they have weak or no auth of their
72
+ own, so reach them through the same VPN/proxy.
73
+
74
+ ## 4. Upgrades
75
+
76
+ ```bash
77
+ docker compose pull && docker compose up -d # Docker
78
+ uv tool upgrade tesla-cli && tesla config migrate # bare metal
79
+ ```
80
+
81
+ `config.toml` carries a `schema_version`; older files are migrated
82
+ automatically on load, and `tesla config migrate` writes the upgraded file
83
+ (keeping a `0600` backup). Read the CHANGELOG "Upgrading" section of each
84
+ release before jumping major versions.
85
+
86
+ ## 5. Backups
87
+
88
+ Everything tesla-cli owns lives in one directory (`~/.tesla-cli`, or the
89
+ `tesla-config` Docker volume):
90
+
91
+ | Path | Contents |
92
+ |------|----------|
93
+ | `config.toml` | settings, API keys, integration tokens (secret) |
94
+ | `tokens.enc.json` + `master.key` | encrypted Tesla OAuth tokens (Docker/headless) |
95
+ | `events/` | events, alerts, audit log |
96
+ | `dossier/`, source caches | vehicle dossier and data-source history |
97
+
98
+ ```bash
99
+ # Docker volume → encrypted-at-rest location of your choice
100
+ docker run --rm -v tesla-config:/data -v "$PWD":/backup alpine \
101
+ tar czf /backup/tesla-cli-$(date +%F).tgz -C /data .
102
+ chmod 600 tesla-cli-*.tgz
103
+ ```
104
+
105
+ Treat backups as secrets. If you keep `master.key` outside the volume (Docker
106
+ secret), back it up separately — tokens cannot be decrypted without it.
107
+ TeslaMate data lives in Postgres: `docker exec tesla-postgres pg_dump -U teslamate teslamate > teslamate.sql`.
108
+
109
+ ## 6. Health and troubleshooting
110
+
111
+ - `GET /api/health` (public) for uptime checks; `GET /api/health?deep=true`
112
+ and `tesla doctor` for diagnostics.
113
+ - `tesla --debug <command>` (or `TESLA_LOG_LEVEL=DEBUG`) prints suppressed
114
+ errors with tracebacks.
115
+ - Features built on unofficial Tesla endpoints (order tracking, ownership
116
+ portal scraping) and Colombian registry scrapers (RUNT, SIMIT) can break
117
+ without notice when the upstream site changes.
118
+
119
+ ## Maintainer note: GHCR visibility
120
+
121
+ The first image push creates the `tesla-cli` package as **private**. Make it
122
+ public once in GitHub → Packages → tesla-cli → Package settings → Change
123
+ visibility, so `docker compose pull` works without a login.
@@ -11,7 +11,8 @@ tesla -j <command> # JSON output (pipe to jq)
11
11
  tesla --json <command> # same
12
12
  tesla --vin modely <cmd> # target specific vehicle (VIN or alias)
13
13
  tesla --anon <command> # anonymize PII (VIN, RN, email masked)
14
- tesla --lang es <command> # Spanish output (also: TESLA_LANG=es)
14
+ tesla --lang es <command> # experimental: translation catalog only; output is English today
15
+ tesla --debug <command> # verbose logs to stderr, incl. errors that are otherwise suppressed
15
16
  tesla --verbose <command> # debug logging
16
17
  ```
17
18