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.
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.github/workflows/ci.yml +1 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.github/workflows/publish.yml +57 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.gitignore +3 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.gitleaks.toml +6 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/CHANGELOG.md +96 -3
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/CLAUDE.md +3 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/Dockerfile +8 -4
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/PKG-INFO +7 -3
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/README.md +5 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/SECURITY.md +10 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docker-compose.full.yml +3 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docker-compose.yml +3 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/architecture.md +1 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/configuration.md +6 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/nav-route.md +2 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/roadmap.md +19 -14
- tesla_cli-5.4.0/docs/self-hosting.md +123 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/user-guide.md +2 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/pyproject.toml +9 -3
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/__init__.py +1 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/app.py +5 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/audit.py +34 -11
- tesla_cli-5.4.0/src/tesla_cli/api/errors.py +113 -0
- tesla_cli-5.4.0/src/tesla_cli/api/guards.py +54 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/auth.py +14 -20
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/charge.py +11 -23
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/climate.py +5 -32
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/colombia.py +8 -23
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/dossier.py +3 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/geofence.py +2 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/notify.py +2 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/security.py +10 -72
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/vehicle.py +2 -6
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Action-CwGHGX16.js +1 -0
- 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
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Analytics-BIQymqmz.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Automations-CkQ1lQFj.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/BarChart-BV8v0-uo.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/CartesianChart-CKwXbEZl.js +64 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/ChargeContent-p_xx3AZb.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/ChargeSessions-C1H3Njae.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/ClimateContent-DCZYi1fI.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/ControlsContent-eOQooqX6.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/CostsContent-BsZelAGJ.js +4 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Dossier-Bmte81sm.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Energy-CURVP8Bo.js +2 -0
- 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
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/LineChart-CINlhKeu.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Navigation-DYlD1nds.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Order-BWZlXyBZ.js +6 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Planner-DhobHUXh.js +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/Settings-BxKiGnXf.js +1 -0
- 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
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-CIGW-MKW.css +1 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-DszuubAr.js +4 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/index-9LcL7ZgR.js +346 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/index-BNByuiMZ.css +1 -0
- 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
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/p-CBzELu-H-BlubY4S-.js +3 -0
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/p-CU1SSH8_-B5lDEig9.js +3 -0
- 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
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/assets/p-Cwv-vmkN-Dv-2Rodk.js +3 -0
- 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
- tesla_cli-5.4.0/src/tesla_cli/api/ui_dist/index.html +32 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/vehicle_hub.py +9 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/app.py +16 -0
- tesla_cli-5.4.0/src/tesla_cli/cli/auth_flow.py +66 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/abrp.py +2 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/automations.py +4 -3
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/charge.py +7 -65
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/config_cmd.py +93 -128
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/data_cmd.py +2 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/dossier.py +1 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/ha.py +2 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/login.py +1 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/order.py +4 -3
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/setup.py +3 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/vehicle.py +2 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/browser_login.py +2 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/oauth.py +20 -89
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/portal_scrape.py +1 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/tokens.py +2 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/automation.py +2 -1
- tesla_cli-5.4.0/src/tesla_cli/core/backends/colombia_open_data.py +44 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/dossier.py +24 -3
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/http.py +76 -8
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/order.py +22 -5
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/owner.py +11 -37
- tesla_cli-5.4.0/src/tesla_cli/core/charging.py +85 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/computed.py +2 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/config.py +10 -1
- tesla_cli-5.4.0/src/tesla_cli/core/config_checks.py +90 -0
- tesla_cli-5.4.0/src/tesla_cli/core/config_migrations.py +59 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/events.py +3 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/exceptions.py +4 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/consumption.py +2 -1
- tesla_cli-5.4.0/src/tesla_cli/core/private_files.py +81 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/teslaMate.py +3 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/vehicle_api.py +3 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/conftest.py +10 -0
- tesla_cli-5.4.0/tests/test_api_errors.py +118 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_routes.py +2 -7
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_security.py +81 -0
- tesla_cli-5.4.0/tests/test_config_migrations.py +51 -0
- tesla_cli-5.4.0/tests/test_http_resilience.py +113 -0
- tesla_cli-5.4.0/tests/test_layering.py +67 -0
- tesla_cli-5.4.0/tests/test_private_files.py +129 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v280.py +3 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v300.py +8 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/eslint.config.js +3 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/package-lock.json +37 -1573
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/package.json +1 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/App.tsx +0 -6
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/api/client.ts +16 -4
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/BatteryGauge.tsx +0 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/hooks/useAppInit.ts +1 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/ChargeSessions.tsx +0 -3
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Dashboard.tsx +3 -8
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Dossier.tsx +0 -69
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Order.tsx +0 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Settings.tsx +3 -3
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/energy/CostsContent.tsx +0 -1
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/vehicle/ChargeContent.tsx +0 -8
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/vite.config.ts +0 -2
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/uv.lock +41 -43
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Action-D2jgMhrf.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Action-legacy-BjmsaTxz.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Alerts-legacy-E7lXFTHf.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Analytics-BAF-OckK.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Analytics-legacy-BfqY0A3r.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Automations-ChtxOCVx.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Automations-legacy-D2rTa2Dc.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/BarChart-CbvPuOm8.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/BarChart-legacy-CKvoptiV.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CartesianChart-C7oiHq6H.js +0 -32
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CartesianChart-legacy-C1alQFTe.js +0 -10
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeContent-DHrBXiYI.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeContent-legacy-W8Pj2GRz.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeSessions-CmSw1u46.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ChargeSessions-legacy-B6T9ZEkM.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ClimateContent-CQrV1cla.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ClimateContent-legacy-BrVp5Dw8.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ControlsContent-CstWZ5bj.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/ControlsContent-legacy-BjAyXo8j.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CostsContent-CK0of5Oy.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/CostsContent-legacy-CjT03-9Q.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Dossier-BmSpMi7X.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Dossier-legacy-BtJFqzv2.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Energy-DWGRyP9W.js +0 -2
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Energy-legacy-cm2mJNfJ.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Icons-legacy-ZQJ5sKUd.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/LineChart-DGCQr4Nw.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/LineChart-legacy-DrxGX8f1.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Navigation-Du1Aj9kc.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Navigation-legacy-fSc5iGaQ.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Order-Bz8dMpHT.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Order-legacy-F2DYekX2.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Planner-BTzxH_5N.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Planner-legacy-CV10WexM.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Settings-B1fRZDgg.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Settings-legacy-DKofNQMT.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/Timeline-legacy-CRhBzQS3.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-BBVP4gU_.js +0 -4
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-a6kZMJSm.css +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/VehicleMap-legacy-DP7L_nrh.js +0 -5
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/index-Co6dsD_A.css +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/index-DHJbtWU2.js +0 -305
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/index-legacy-tYlhPd-t.js +0 -407
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-BgwEQWW6-legacy-BzXX8Hmf.js +0 -5
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CBzELu-H-C6O9Iw3F.js +0 -3
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CBzELu-H-legacy-o6pkl5Q3.js +0 -5
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CU1SSH8_-gXCsnaTd.js +0 -3
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CU1SSH8_-legacy-BN-w_Fja.js +0 -5
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-CneGxKsZ-legacy-BvByEog5.js +0 -5
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cwv-vmkN-DxmWWo4m.js +0 -3
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cwv-vmkN-legacy-dIVDhulX.js +0 -5
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/p-Cz5nLPGT-legacy-BGxjZQ_L.js +0 -5
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/assets/polyfills-legacy-BoMm-z7f.js +0 -1
- tesla_cli-5.3.0/src/tesla_cli/api/ui_dist/index.html +0 -37
- tesla_cli-5.3.0/ui/src/components/ExploreContainer.css +0 -24
- tesla_cli-5.3.0/ui/src/components/ExploreContainer.tsx +0 -14
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.dockerignore +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.env.example +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.githooks/pre-push +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.github/workflows/secret-scan.yml +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/.python-version +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/CONTRIBUTING.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/LICENSE +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/Makefile +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/MIGRATION-PLAN-SOURCE-FIRST.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/TARGET-ARCHITECTURE.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/api-reference.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/data-sources.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/fleet-signed-setup.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/history-resynchronization.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/research/competitive-analysis.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/research/vatiolibre-comparison.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/docs/why-tesla-cli.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/notebooks/consumption-model-probe.ipynb +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/.claude-plugin/marketplace.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/.gitignore +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/CHANGELOG.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/CLAUDE.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/LICENSE +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/README.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/bin/tesla-check +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/docs/design.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/analytics/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/automations/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/charge/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/control/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/dossier/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/energy/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/order/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/serve/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/setup/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/status/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/telemetry/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/plugins/claude-code/skills/tesla-context/SKILL.md +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/scripts/secret-scan.sh +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/__main__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/auth.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/command_policy.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/abrp.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/alerts.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/automations.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/ble.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/dashcam.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/doctor.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/domains.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/drivers.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/energy_mgmt.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/energy_prices.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/events.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/fleet.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/init.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/mission_control.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/mqtt.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/order.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/planner.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/scenes.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/service.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/session.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/sources.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/routes/teslaMate.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/ui_dist/favicon.png +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/api/ui_dist/manifest.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/ble.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/climate.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/dashcam.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/doctor_cmd.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/domain_cmd.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/energy.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/event_stream_cmd.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/events.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/geofence.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/media.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/mqtt_cmd.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/nav.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/notify.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/providers_cmd.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/runt.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/scenes.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/security.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/serve.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/service.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/simit.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/telemetry.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/commands/teslaMate.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/i18n.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/cli/output.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/encryption.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/file_store.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/tesla_web_auth.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/auth/tessie.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/base.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/cached.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/energy.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/energy_prices.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/fleet.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/fleet_signed.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/fleet_telemetry.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/runt.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/simit.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/teslaMate.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/backends/tessie.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/db.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/diagnostics/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/diagnostics/teslamate_doctor.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/domains.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/geo.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/health/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/health/features.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/mission_control.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/automation.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/charge.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/climate.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/dossier.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/drive.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/energy.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/order.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/models/vehicle.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/arrival.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/dispatch.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/geocode.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/importers.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/nav/route.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/calibrated.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/car_models.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/chargers.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/elevation.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/export.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/graph.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/models.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/mvp.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/routing.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/planner/weather.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/base.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/abrp.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/apprise_notify.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/ble.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/ha.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/impl/mqtt.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/loader.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/providers/registry.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/sources.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/core/url_safety.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/endpoints.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/infra/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/infra/fleet_telemetry_stack.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/infra/teslamate_stack.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/src/tesla_cli/py.typed +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tesla-config.example.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/__init__.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/fixtures/charge_curve/expected.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/fixtures/charge_curve/session_y1200.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/fixtures/teslamate_schema/charges_v1.30.sql +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_app_refresh.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_charge_curve.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_charge_enrichment.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_doctor.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_routes_new.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_api_teslamate_doctor.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_auth.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_backends.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_browser_login.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_commands.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_doctor.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_domains.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_epa_fallbacks.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_events.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_events_purge.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_fleet_signed_backend.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_mission_control.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_models.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_arrival.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_cli.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_dispatch.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_geocode.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_importers.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_nav_models.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_new_commands.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_order_backend.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_outbound_safety.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_pipeline.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_api.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_calibrated.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_chargers.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_cli.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_consumption.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_elevation.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_export.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_graph.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_models.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_mvp.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_routing.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_planner_weather.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_providers.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_providers_new.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_runt.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_runt_integration.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_secret_scanning.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_server.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_simit.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_simit_integration.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_sources.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_tesla_web_auth.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_teslamate_charge_curve.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_teslamate_curiosities.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_teslamate_doctor.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_teslamate_schema.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_teslamate_stack.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_token_file_store.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_token_refresh_scope.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_tokens_no_keyring.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v260.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v270.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v290.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v310.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v320.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v330.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/tests/test_v340.py +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/.browserslistrc +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/.gitignore +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/cypress/e2e/test.cy.ts +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/cypress/fixtures/example.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/cypress/support/commands.ts +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/cypress/support/e2e.ts +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/cypress.config.ts +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/index.html +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/ionic.config.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/ionic.starter.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/public/favicon.png +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/public/manifest.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/App.test.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/AuthGate.test.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/AuthGate.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/CommandButton.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/CopyButton.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/EmptyState.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/ErrorBoundary.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/ModelYSilhouette.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/OrderProcessTracker.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/RecentCharges.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/SeatHeaterGrid.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/SkeletonCard.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/StatusBadge.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/VehicleMap.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/CollapsibleSection.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/LogisticsCard.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/OptionCodesPills.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/RuntCard.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/SimitCard.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/SpecsGrid.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/StatusPipeline.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/dossier/VinDecoder.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/icons/Icons.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/components/icons/Spinner.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/hooks/sseHub.ts +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/hooks/useDashboardTiles.ts +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/hooks/useMissionControl.ts +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/hooks/useVehicleData.ts +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/main.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Action.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Alerts.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Analytics.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Automations.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Energy.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Home.css +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Navigation.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Planner.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Timeline.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/Vehicle.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/vehicle/ClimateContent.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/vehicle/ControlsContent.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/pages/vehicle/ScheduleContent.tsx +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/setupTests.ts +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/theme/variables.css +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/src/vite-env.d.ts +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/tsconfig.json +0 -0
- {tesla_cli-5.3.0 → tesla_cli-5.4.0}/ui/tsconfig.node.json +0 -0
|
@@ -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
|
|
@@ -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
|
-
|
|
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]{
|
|
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
|
-
(
|
|
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
|
-
(
|
|
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
|
-
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
#
|
|
26
|
-
|
|
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
|
+
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 #
|
|
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` |
|
|
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
|
-
-
|
|
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:
|
|
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.
|
|
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,
|
|
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.
|
|
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
|
-
###
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
|
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> #
|
|
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
|
|