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