codex-usage-tracking 0.4.0__tar.gz → 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/.codex-plugin/plugin.json +1 -1
  2. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/CHANGELOG.md +16 -0
  3. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/PKG-INFO +34 -3
  4. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/README.md +33 -2
  5. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/cli-reference.md +58 -0
  6. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/dashboard-guide.md +11 -2
  7. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/development.md +10 -8
  8. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/install.md +2 -0
  9. codex_usage_tracking-0.5.0/docs/one-dot-oh-readiness.md +228 -0
  10. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/pricing-and-credits.md +4 -1
  11. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/pyproject.toml +2 -1
  12. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/scripts/check_release.py +184 -0
  13. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/scripts/smoke_installed_package.py +58 -2
  14. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/skills/codex-usage-tracker/scripts/run_mcp.py +2 -2
  15. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/__init__.py +1 -1
  16. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/cli.py +15 -0
  17. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/costing.py +14 -0
  18. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/dashboard.py +16 -2
  19. codex_usage_tracking-0.5.0/src/codex_usage_tracker/i18n.py +182 -0
  20. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard.css +20 -4
  21. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard.js +617 -303
  22. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/dashboard_template.html +146 -0
  23. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/ar.json +438 -0
  24. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/de.json +438 -0
  25. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/en.json +438 -0
  26. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/es.json +438 -0
  27. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/fr.json +438 -0
  28. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/it.json +438 -0
  29. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/ja.json +438 -0
  30. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/ko.json +438 -0
  31. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/pt.json +438 -0
  32. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/ru.json +438 -0
  33. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/vi.json +438 -0
  34. codex_usage_tracking-0.5.0/src/codex_usage_tracker/plugin_data/dashboard/locales/zh-Hans.json +438 -0
  35. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/recommendations.py +11 -1
  36. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/server.py +9 -0
  37. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracking.egg-info/PKG-INFO +34 -3
  38. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracking.egg-info/SOURCES.txt +15 -0
  39. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_cli_lifecycle.py +38 -1
  40. codex_usage_tracking-0.5.0/tests/test_cli_release.py +469 -0
  41. codex_usage_tracking-0.5.0/tests/test_dashboard_state.py +92 -0
  42. codex_usage_tracking-0.5.0/tests/test_i18n.py +402 -0
  43. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_plugin_installer.py +2 -1
  44. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_pricing.py +45 -0
  45. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_recommendations.py +9 -0
  46. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_store_dashboard_mcp.py +55 -25
  47. codex_usage_tracking-0.4.0/docs/one-dot-oh-readiness.md +0 -130
  48. codex_usage_tracking-0.4.0/src/codex_usage_tracker/plugin_data/dashboard/dashboard_template.html +0 -141
  49. codex_usage_tracking-0.4.0/tests/test_cli_release.py +0 -178
  50. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/.mcp.json +0 -0
  51. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/AGENTS.md +0 -0
  52. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/CONTRIBUTING.md +0 -0
  53. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/LICENSE +0 -0
  54. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/MANIFEST.in +0 -0
  55. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/SECURITY.md +0 -0
  56. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/assets/icon.svg +0 -0
  57. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/architecture.md +0 -0
  58. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/assets/dashboard-calls-preview.png +0 -0
  59. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/assets/dashboard-calls.png +0 -0
  60. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/assets/dashboard-details.png +0 -0
  61. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/assets/dashboard-insights.png +0 -0
  62. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/assets/dashboard-threads.png +0 -0
  63. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/assets/plugin-prompts.png +0 -0
  64. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/assets/plugin-thread-leaderboard.png +0 -0
  65. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/assets/ux/call-detail-panel.png +0 -0
  66. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/assets/ux/insight-overview.png +0 -0
  67. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/assets/ux/thread-investigation.png +0 -0
  68. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/cli-json-schemas.md +0 -0
  69. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/mcp.md +0 -0
  70. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/privacy.md +0 -0
  71. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/docs/ui-ux-improvement-plan.md +0 -0
  72. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/scripts/benchmark_synthetic_history.py +0 -0
  73. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/scripts/install_local_plugin.py +0 -0
  74. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/setup.cfg +0 -0
  75. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/skills/codex-usage-api/SKILL.md +0 -0
  76. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/skills/codex-usage-tracker/SKILL.md +0 -0
  77. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/__main__.py +0 -0
  78. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/allowance.py +0 -0
  79. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/api_payloads.py +0 -0
  80. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/context.py +0 -0
  81. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/diagnostics.py +0 -0
  82. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/formatting.py +0 -0
  83. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/json_contracts.py +0 -0
  84. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/mcp_server.py +0 -0
  85. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/models.py +0 -0
  86. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/parser.py +0 -0
  87. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/paths.py +0 -0
  88. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/__init__.py +0 -0
  89. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/assets/icon.svg +0 -0
  90. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_data.js +0 -0
  91. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_format.js +0 -0
  92. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/dashboard/dashboard_state.js +0 -0
  93. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-calls.png +0 -0
  94. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-details.png +0 -0
  95. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-insights.png +0 -0
  96. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/docs/assets/dashboard-threads.png +0 -0
  97. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/docs/dashboard-guide.html +0 -0
  98. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/rate_cards/codex-credit-rates.json +0 -0
  99. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/skills/codex-usage-api/SKILL.md +0 -0
  100. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_data/skills/codex-usage-tracker/SKILL.md +0 -0
  101. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/plugin_installer.py +0 -0
  102. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/pricing.py +0 -0
  103. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/pricing_config.py +0 -0
  104. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/pricing_estimates.py +0 -0
  105. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/pricing_openai.py +0 -0
  106. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/projects.py +0 -0
  107. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/redaction.py +0 -0
  108. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/reports.py +0 -0
  109. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/schema.py +0 -0
  110. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/store.py +0 -0
  111. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/support.py +0 -0
  112. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracker/threads.py +0 -0
  113. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracking.egg-info/dependency_links.txt +0 -0
  114. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracking.egg-info/entry_points.txt +0 -0
  115. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracking.egg-info/requires.txt +0 -0
  116. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/src/codex_usage_tracking.egg-info/top_level.txt +0 -0
  117. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_allowance.py +0 -0
  118. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_json_contracts.py +0 -0
  119. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_mcp_launcher.py +0 -0
  120. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_parser.py +0 -0
  121. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_privacy.py +0 -0
  122. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_projects.py +0 -0
  123. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_schema.py +0 -0
  124. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_store_migrations.py +0 -0
  125. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_support.py +0 -0
  126. {codex_usage_tracking-0.4.0 → codex_usage_tracking-0.5.0}/tests/test_threads.py +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-usage-tracker",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Unofficial local tracker for aggregate Codex token usage from local session logs.",
5
5
  "author": {
6
6
  "name": "Douglas Monsky"
@@ -2,6 +2,22 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.5.0 - 2026-06-10
6
+
7
+ - Add the dashboard localization foundation, including starter locale catalogs, language metadata, local browser language selection, `--lang`, and `CODEX_USAGE_TRACKER_LANG`.
8
+ - Add Vietnamese dashboard localization and focused validation coverage for translated dashboard labels.
9
+ - Keep the README landing page focused on dashboard screenshots and companion usage workflows before detailed localization guidance.
10
+ - Stabilize the CI synthetic benchmark smoke so coverage instrumentation does not create false release failures.
11
+ - Pin the marketplace MCP runtime launcher to the exact `codex-usage-tracking==0.5.0` package.
12
+
13
+ ## 0.4.1 - 2026-06-09
14
+
15
+ - Harden the production PyPI workflow so manual publishing must run from `main` or a tag ref before artifacts are downloaded and uploaded.
16
+ - Skip TestPyPI/PyPI uploads when the exact distribution version already exists on the target index, allowing a GitHub Release to be reconciled after a workflow-dispatch publish.
17
+ - Strengthen `scripts/check_release.py` so it validates the publish-ref preflight inside both the TestPyPI and PyPI jobs.
18
+ - Check off completed 1.0 readiness items with evidence for migration coverage, localhost dashboard smoke testing, and the protected GitHub `pypi` environment.
19
+ - Pin the marketplace MCP runtime launcher to the exact `codex-usage-tracking==0.4.1` package.
20
+
5
21
  ## 0.4.0 - 2026-06-09
6
22
 
7
23
  - Add official Python 3.14 support across CI, package classifiers, README/install docs, and installed-package Docker smoke coverage.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-usage-tracking
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Summary: Unofficial local Codex plugin and dashboard for investigating aggregate token usage, costs, caching, and thread patterns.
5
5
  Author: Douglas Monsky
6
6
  License-Expression: MIT
@@ -190,6 +190,34 @@ The tracker cannot read your logged-in ChatGPT plan or live remaining usage auto
190
190
  - Companion Codex skills for operational setup and conversational usage analysis.
191
191
  - Optional local pricing, Codex credit, allowance, threshold, project alias, and privacy-mode configuration.
192
192
 
193
+ ## Dashboard Language
194
+
195
+ The dashboard supports localized UI text. English is the canonical catalog, and the project includes starter locale catalogs for common dashboard languages.
196
+
197
+ Set the initial dashboard language with `--lang`:
198
+
199
+ ```bash
200
+ codex-usage-tracker --lang vi serve-dashboard --open
201
+ ```
202
+
203
+ Or set a default with:
204
+
205
+ ```bash
206
+ CODEX_USAGE_TRACKER_LANG=vi codex-usage-tracker serve-dashboard --open
207
+ ```
208
+
209
+ The dashboard also includes a language selector. Browser selections are stored locally and can override the generated default for that browser.
210
+
211
+ Supported starter locales include English, Vietnamese, Spanish, French, German, Portuguese, Japanese, Simplified Chinese, Korean, Russian, Italian, and Arabic. This localizes dashboard UI text, not the full CLI output or data exports.
212
+
213
+ ### Adding A Dashboard Language
214
+
215
+ 1. Add a locale JSON file named by language code under `src/codex_usage_tracker/plugin_data/dashboard/locales/`.
216
+ 2. Include every key from the English catalog.
217
+ 3. Preserve every placeholder from the English string.
218
+ 4. Add the language code, native name, English name, and text direction to the supported language metadata.
219
+ 5. Run the i18n validation tests.
220
+
193
221
  ## Common Commands
194
222
 
195
223
  ```bash
@@ -253,10 +281,13 @@ This is optional. The normal shell install above is the fastest trusted path for
253
281
  ## Current Limitations
254
282
 
255
283
  - This is a sidecar dashboard and plugin, not a native Codex chat overlay.
284
+ - Codex upstream log formats can change, and parser compatibility may require tracker updates.
256
285
  - Token counts come from Codex's logged counters; the tracker does not re-tokenize prompts.
257
- - Pricing and Codex credit estimates depend on local rate data and confidence labels.
258
- - Remaining 5-hour and weekly allowance is not read automatically from the logged-in account.
286
+ - Pricing and rate-card sources can change outside this project.
287
+ - Pricing and Codex credit estimates depend on local rate data and confidence labels and are not guaranteed to match exact billing.
288
+ - Live account allowance cannot be read automatically by this local tracker; remaining 5-hour and weekly allowance is only available when you configure copied values.
259
289
  - Local Codex logs may not include usage from other ChatGPT agentic surfaces that share the same allowance.
290
+ - Plugin discovery limitations are separate from core Python CLI/dashboard support.
260
291
  - Parent-child thread relationships are only as good as the metadata Codex logs; inferred auto-review attachments are labeled as inferred.
261
292
 
262
293
  ## Roadmap
@@ -153,6 +153,34 @@ The tracker cannot read your logged-in ChatGPT plan or live remaining usage auto
153
153
  - Companion Codex skills for operational setup and conversational usage analysis.
154
154
  - Optional local pricing, Codex credit, allowance, threshold, project alias, and privacy-mode configuration.
155
155
 
156
+ ## Dashboard Language
157
+
158
+ The dashboard supports localized UI text. English is the canonical catalog, and the project includes starter locale catalogs for common dashboard languages.
159
+
160
+ Set the initial dashboard language with `--lang`:
161
+
162
+ ```bash
163
+ codex-usage-tracker --lang vi serve-dashboard --open
164
+ ```
165
+
166
+ Or set a default with:
167
+
168
+ ```bash
169
+ CODEX_USAGE_TRACKER_LANG=vi codex-usage-tracker serve-dashboard --open
170
+ ```
171
+
172
+ The dashboard also includes a language selector. Browser selections are stored locally and can override the generated default for that browser.
173
+
174
+ Supported starter locales include English, Vietnamese, Spanish, French, German, Portuguese, Japanese, Simplified Chinese, Korean, Russian, Italian, and Arabic. This localizes dashboard UI text, not the full CLI output or data exports.
175
+
176
+ ### Adding A Dashboard Language
177
+
178
+ 1. Add a locale JSON file named by language code under `src/codex_usage_tracker/plugin_data/dashboard/locales/`.
179
+ 2. Include every key from the English catalog.
180
+ 3. Preserve every placeholder from the English string.
181
+ 4. Add the language code, native name, English name, and text direction to the supported language metadata.
182
+ 5. Run the i18n validation tests.
183
+
156
184
  ## Common Commands
157
185
 
158
186
  ```bash
@@ -216,10 +244,13 @@ This is optional. The normal shell install above is the fastest trusted path for
216
244
  ## Current Limitations
217
245
 
218
246
  - This is a sidecar dashboard and plugin, not a native Codex chat overlay.
247
+ - Codex upstream log formats can change, and parser compatibility may require tracker updates.
219
248
  - Token counts come from Codex's logged counters; the tracker does not re-tokenize prompts.
220
- - Pricing and Codex credit estimates depend on local rate data and confidence labels.
221
- - Remaining 5-hour and weekly allowance is not read automatically from the logged-in account.
249
+ - Pricing and rate-card sources can change outside this project.
250
+ - Pricing and Codex credit estimates depend on local rate data and confidence labels and are not guaranteed to match exact billing.
251
+ - Live account allowance cannot be read automatically by this local tracker; remaining 5-hour and weekly allowance is only available when you configure copied values.
222
252
  - Local Codex logs may not include usage from other ChatGPT agentic surfaces that share the same allowance.
253
+ - Plugin discovery limitations are separate from core Python CLI/dashboard support.
223
254
  - Parent-child thread relationships are only as good as the metadata Codex logs; inferred auto-review attachments are labeled as inferred.
224
255
 
225
256
  ## Roadmap
@@ -4,6 +4,14 @@ This page lists the common command-line workflows. For tested JSON contract ids,
4
4
 
5
5
  ## Index And Setup
6
6
 
7
+ Run first-time setup:
8
+
9
+ ```bash
10
+ codex-usage-tracker setup
11
+ ```
12
+
13
+ `setup` installs or refreshes the local plugin wrapper, initializes local config templates when needed, refreshes the aggregate index, runs `doctor`, and prints whether Codex needs a restart for plugin discovery.
14
+
7
15
  Refresh the local aggregate index:
8
16
 
9
17
  ```bash
@@ -27,6 +35,36 @@ codex-usage-tracker inspect-log ~/.codex/sessions/YYYY/MM/DD/rollout-...jsonl --
27
35
 
28
36
  `inspect-log` reports parser adapter, aggregate token-count events, session ids, models, and parser diagnostics. It does not store raw prompts, assistant messages, tool output, or transcript snippets.
29
37
 
38
+ Check setup without writing files:
39
+
40
+ ```bash
41
+ codex-usage-tracker doctor
42
+ codex-usage-tracker doctor --suggest-repair
43
+ ```
44
+
45
+ `doctor` validates local paths, database state, parser diagnostics, pricing and allowance config, dashboard output, plugin files, and MCP importability. `--suggest-repair` adds likely next commands without making changes.
46
+
47
+ Reset only the local aggregate database:
48
+
49
+ ```bash
50
+ codex-usage-tracker reset-db --yes
51
+ ```
52
+
53
+ `reset-db` deletes tracker-owned aggregate SQLite rows. It does not delete raw Codex logs and requires `--yes`.
54
+
55
+ ## Plugin Lifecycle
56
+
57
+ ```bash
58
+ codex-usage-tracker install-plugin
59
+ codex-usage-tracker install-plugin --python .venv/bin/python
60
+ codex-usage-tracker upgrade-plugin
61
+ codex-usage-tracker uninstall-plugin
62
+ ```
63
+
64
+ `install-plugin` writes the package-owned local Codex plugin wrapper, companion skills, and MCP config. Use the `--python` form for source checkouts that should use a repo-local virtual environment.
65
+
66
+ `upgrade-plugin` refreshes an existing wrapper in place. `uninstall-plugin` removes only the tracker-owned plugin wrapper and marketplace entry.
67
+
30
68
  ## Dashboard
31
69
 
32
70
  ```bash
@@ -45,6 +83,8 @@ codex-usage-tracker serve-dashboard --no-context-api --open
45
83
 
46
84
  Dashboards default to active sessions only. Use `--include-archived` for an all-history static/opened dashboard, or switch the served dashboard's `History` control from `Active sessions only` to `All history` when you intentionally want archived logs scanned and included.
47
85
 
86
+ Use global `--lang <code>` before the dashboard command, or set `CODEX_USAGE_TRACKER_LANG`, to choose the dashboard's initial UI language. The dashboard language selector can then override that default in the browser. Localization applies to dashboard UI text, not JSON fields, CSV columns, model names, thread names, paths, or full CLI output.
87
+
48
88
  The localhost `/api/usage` endpoint accepts `limit` and `offset` query parameters, so automation can page aggregate rows without asking the server to load an entire large history at once.
49
89
 
50
90
  ## Summaries
@@ -110,6 +150,14 @@ codex-usage-tracker export --output usage.csv --limit 0
110
150
 
111
151
  Use `--privacy-mode redacted` or `--privacy-mode strict` before sharing CSV output.
112
152
 
153
+ ## Support Bundle
154
+
155
+ ```bash
156
+ codex-usage-tracker --privacy-mode strict support-bundle --output ~/.codex-usage-tracker/support-bundle.json
157
+ ```
158
+
159
+ Support bundles are diagnostic summaries for issues. They include package, platform, doctor, schema, parser, pricing, allowance, threshold, project-config, and privacy metadata. They exclude raw logs, aggregate rows, prompts, assistant messages, tool output, and context text.
160
+
113
161
  ## Local Config
114
162
 
115
163
  ```bash
@@ -125,6 +173,16 @@ codex-usage-tracker init-projects
125
173
 
126
174
  Local config files live under `~/.codex-usage-tracker/` and are never committed by this project.
127
175
 
176
+ Stable local config files:
177
+
178
+ - `pricing.json`: schema `_schema: codex-usage-tracker-pricing-v1`, optional `_source`, `models`, `aliases`, and `_estimated_models`. `models` maps model labels to USD-per-million-token rates such as `input`, `cached_input`, and `output`.
179
+ - `rate-card.json`: schema `codex-usage-tracker-codex-rate-card-v1`, optional `_source`, `credit_rates`, and `aliases`. `credit_rates` maps Codex model labels to credit rates for aggregate token counters.
180
+ - `allowance.json`: schema `codex-usage-tracker-allowance-v1`, `windows`, optional `credit_rates`, and `aliases`. `windows` stores copied 5-hour, weekly, or other allowance snapshots such as `remaining_percent`, `reset_at`, `remaining_credits`, and `total_credits`.
181
+ - `thresholds.json`: JSON object keyed by recommendation threshold names such as `low_cache_ratio`, `high_context_percent`, and `high_cost_usd`. Unknown keys are ignored.
182
+ - `projects.json`: JSON object with `aliases`, `ignored_paths`, and `tags` for local project attribution.
183
+
184
+ These config schemas are part of the 1.0 compatibility surface. New optional fields may be added, but existing meanings should not change without documentation and a compatibility plan.
185
+
128
186
  ## Privacy Mode
129
187
 
130
188
  `--privacy-mode` is a global option, so place it before the subcommand:
@@ -22,9 +22,9 @@ codex-usage-tracker init-allowance
22
22
  codex-usage-tracker parse-allowance "5h 79% 6:50 PM Weekly 33% Jun 7"
23
23
  ```
24
24
 
25
- To tune review thresholds locally, run `codex-usage-tracker init-thresholds` and edit `~/.codex-usage-tracker/thresholds.json`. These thresholds control low-cache, high-context, high-uncached-input, large-thread, reasoning-spike, low-output, and high-cost recommendations.
25
+ To tune review thresholds locally, run `codex-usage-tracker init-thresholds` and edit `~/.codex-usage-tracker/thresholds.json`. This file is a JSON object keyed by recommendation threshold names such as `low_cache_ratio`, `high_context_percent`, and `high_cost_usd`; unknown keys are ignored. These thresholds control low-cache, high-context, high-uncached-input, large-thread, reasoning-spike, low-output, and high-cost recommendations.
26
26
 
27
- To tune project attribution locally, run `codex-usage-tracker init-projects` and edit `~/.codex-usage-tracker/projects.json`. The dashboard derives project name, relative cwd, branch, tags, and a hashed remote origin from aggregate `cwd` and local Git metadata when available.
27
+ To tune project attribution locally, run `codex-usage-tracker init-projects` and edit `~/.codex-usage-tracker/projects.json`. This file supports `aliases`, `ignored_paths`, and `tags`. The dashboard derives project name, relative cwd, branch, tags, and a hashed remote origin from aggregate `cwd` and local Git metadata when available.
28
28
 
29
29
  Before sharing screenshots or generated artifacts, use `--privacy-mode redacted` or `--privacy-mode strict` before the subcommand:
30
30
 
@@ -37,6 +37,15 @@ Redacted mode hides raw cwd/source paths, hides Git remote labels, and hashes un
37
37
 
38
38
  `serve-dashboard` refreshes active-session logs before opening by default. Use `--no-refresh` only when you intentionally want a cached view of the existing local index.
39
39
 
40
+ Set the initial dashboard language with the global `--lang` option before the command, or use `CODEX_USAGE_TRACKER_LANG`:
41
+
42
+ ```bash
43
+ codex-usage-tracker --lang vi serve-dashboard --open
44
+ CODEX_USAGE_TRACKER_LANG=vi codex-usage-tracker serve-dashboard --open
45
+ ```
46
+
47
+ The dashboard language selector stores your browser preference locally. It localizes dashboard UI labels, captions, badges, empty states, detail-panel labels, context controls, and recommendation text; it does not translate raw data values, JSON fields, CSV columns, model names, thread names, project names, paths, or full CLI output.
48
+
40
49
  The server keeps the HTML aggregate-only and enables two live features:
41
50
 
42
51
  - `Refresh` rescans local Codex logs and updates the dashboard rows.
@@ -38,7 +38,7 @@ fix/<issue-number>-short-description
38
38
  docs/<issue-number>-short-description
39
39
  chore/<issue-number>-short-description
40
40
  test/<issue-number>-short-description
41
- release/0.4.0
41
+ release/0.5.0
42
42
  hotfix/0.3.3
43
43
  ```
44
44
 
@@ -91,7 +91,7 @@ blocked
91
91
  Recommended milestones:
92
92
 
93
93
  ```text
94
- 0.4.0
94
+ 0.5.0
95
95
  1.0-readiness
96
96
  1.0.0
97
97
  ```
@@ -147,10 +147,12 @@ python scripts/smoke_installed_package.py --docker
147
147
  To verify the public PyPI package instead of the local checkout:
148
148
 
149
149
  ```bash
150
- python scripts/smoke_installed_package.py --from-pypi --version 0.4.0
151
- python scripts/smoke_installed_package.py --docker --from-pypi --version 0.4.0
150
+ python scripts/smoke_installed_package.py --from-pypi --version 0.5.0
151
+ python scripts/smoke_installed_package.py --docker --from-pypi --version 0.5.0
152
152
  ```
153
153
 
154
+ `scripts/check_release.py` treats these public-package smoke commands as release-state claims. Keep their `--version` and `codex-usage-tracking==...` values aligned with `pyproject.toml`; the release gate fails when the docs claim a different public version. It also checks that install docs point at the real PyPI distribution, `codex-usage-tracking`, and keep the warning that `codex-usage-tracker` is a different PyPI package.
155
+
154
156
  Docker avoids local toolchain side effects during install testing. Keep one local `pipx` smoke for platform-specific PATH and plugin-discovery behavior, but use Docker for repeatable Linux package verification.
155
157
 
156
158
  For documentation-only branches, at minimum run:
@@ -222,7 +224,7 @@ Tracked timings:
222
224
  | `pricing_coverage_seconds` | Pricing coverage report |
223
225
  | `project_summary_seconds` | Project summary report |
224
226
 
225
- The normal CI smoke uses a tiny synthetic history with `--enforce-thresholds` so regressions in the benchmark contract are visible on pull requests. The 10k/100k runs are a practical local gate for performance-sensitive changes; the 500k run is the release-sized gate and can take about a minute on a modern laptop because recommendations and project summary intentionally scan all aggregate rows.
227
+ The normal CI smoke uses a tiny synthetic history with `--enforce-thresholds` and a small `--threshold-scale` allowance so coverage instrumentation and shared runner noise do not create false failures. The 10k/100k runs are a practical local gate for performance-sensitive changes; the 500k run is the release-sized gate and can take about a minute on a modern laptop because recommendations and project summary intentionally scan all aggregate rows.
226
228
 
227
229
  ## Release Checklist
228
230
 
@@ -264,8 +266,8 @@ After the release branch merges, tag from updated `main`, not from an unreviewed
264
266
  ```bash
265
267
  git switch main
266
268
  git pull --ff-only
267
- git tag -a v0.4.0 -m "codex-usage-tracker 0.4.0"
268
- git push origin v0.4.0
269
+ git tag -a v0.5.0 -m "codex-usage-tracker 0.5.0"
270
+ git push origin v0.5.0
269
271
  ```
270
272
 
271
273
  Do not create or push release tags without maintainer approval.
@@ -274,7 +276,7 @@ Do not create or push release tags without maintainer approval.
274
276
 
275
277
  Publishing uses GitHub Actions Trusted Publishing through `.github/workflows/publish.yml`; do not upload from a local machine and do not add PyPI or TestPyPI API tokens.
276
278
 
277
- The first public package release, `0.3.0`, was published on June 8, 2026. Patch release `0.3.1` followed the same day to ship the live-dashboard skill launch fix. Patch release `0.3.2` made dashboard launch refresh the default and added runtime enablement for context loading. Minor release `0.4.0` added Python 3.14 support, release recovery docs, stricter privacy/support-bundle regression coverage, and large-history benchmark thresholds:
279
+ The first public package release, `0.3.0`, was published on June 8, 2026. Patch release `0.3.1` followed the same day to ship the live-dashboard skill launch fix. Patch release `0.3.2` made dashboard launch refresh the default and added runtime enablement for context loading. Minor release `0.4.0` added Python 3.14 support, release recovery docs, stricter privacy/support-bundle regression coverage, and large-history benchmark thresholds. Patch release `0.4.1` was published by workflow dispatch from `main`; it hardened the PyPI publish workflow and checked off completed 1.0 readiness gates. Minor release `0.5.0` added dashboard localization support and starter language catalogs.
278
280
 
279
281
  - GitHub Release: `https://github.com/douglasmonsky/codex-usage-tracker/releases/tag/v0.3.0`
280
282
  - GitHub Release: `https://github.com/douglasmonsky/codex-usage-tracker/releases/tag/v0.3.1`
@@ -38,6 +38,8 @@ By default the tracker looks for Codex JSONL logs under `~/.codex`, stores its o
38
38
 
39
39
  Windows support should work for the core dashboard/CLI when Codex writes readable JSONL logs, but plugin discovery is tied to Codex's local plugin directory behavior. Run `codex-usage-tracker doctor --suggest-repair` after setup if Codex does not show the plugin.
40
40
 
41
+ Plugin discovery limitations are separate from core Python CLI/dashboard support. If Codex cannot discover the local plugin wrapper, the installed command, SQLite index, generated dashboard, localhost server, and CLI JSON reports can still work.
42
+
41
43
  ## Upgrade
42
44
 
43
45
  ```bash
@@ -0,0 +1,228 @@
1
+ # 1.0 Readiness
2
+
3
+ This checklist tracks the work needed to move from the first public PyPI releases toward a stable 1.0 contract. Keep all verification data synthetic or aggregate-only.
4
+
5
+ Each completed checkbox names the primary verification command inline. The evidence reference section at the end maps those commands to the concrete tests, scripts, workflow checks, or public-install smokes that prove the completed items.
6
+
7
+ ## Compatibility Promise
8
+
9
+ - CLI command names documented in `docs/cli-reference.md` are stable after 1.0.
10
+ - JSON schema IDs documented in `docs/cli-json-schemas.md` are stable after 1.0.
11
+ - New JSON fields may be added in minor releases, but existing required fields should not be removed or change type without a new schema version.
12
+ - MCP tool names and response schemas are stable after 1.0.
13
+ - CSV export columns are stable after 1.0 unless a new export schema or version flag is introduced.
14
+ - Config file schemas for pricing, allowance, thresholds, projects, and rate cards are stable after 1.0.
15
+ - Privacy-mode semantics are stable after 1.0.
16
+ - SQLite migrations must support upgrade from the last pre-1.0 release to 1.0.
17
+
18
+ Not guaranteed:
19
+
20
+ - Codex upstream log format stability.
21
+ - OpenAI pricing or rate-card source stability.
22
+ - Automatic access to live account allowance.
23
+ - Exact billing equivalence.
24
+
25
+ ## 1. Public Install And Package Metadata
26
+
27
+ - [x] Verify the current public PyPI version is visible as `0.5.0`: `python -c "import json, urllib.request; print(json.load(urllib.request.urlopen('https://pypi.org/pypi/codex-usage-tracking/json'))['info']['version'])"`.
28
+ - [x] Verify public venv install for `0.5.0`: `python -m venv /tmp/codex-usage-pypi-smoke && . /tmp/codex-usage-pypi-smoke/bin/activate && python -m pip install codex-usage-tracking==0.5.0 && codex-usage-tracker --version`.
29
+ - [x] Verify public pipx install path for `0.5.0`: `PIPX_HOME=/tmp/codex-usage-pipx-home PIPX_BIN_DIR=/tmp/codex-usage-pipx-bin pipx install codex-usage-tracking==0.5.0 && /tmp/codex-usage-pipx-bin/codex-usage-tracker --version`.
30
+ - [x] Verify installed package resources from a built wheel: `python scripts/smoke_installed_package.py`.
31
+ - [x] Verify installed package resources in Linux Docker: `python scripts/smoke_installed_package.py --docker`.
32
+ - [x] Verify public PyPI package in Docker: `python scripts/smoke_installed_package.py --docker --from-pypi --version 0.5.0`.
33
+ - [x] Verify PyPI metadata names remain unchanged: `python scripts/check_release.py`.
34
+ - [x] Add Python 3.14 as an official support target after CI, package classifiers, docs, and installed-package smoke coverage were added. Docker smoke coverage uses `python:3.14-slim` by default. Track this in issue #12.
35
+
36
+ ## 2. Upgrade And Migration
37
+
38
+ - [x] Add synthetic legacy SQLite fixture test proving `init_db` upgrades without data loss: `python -m pytest tests/test_store_migrations.py`.
39
+ - [x] Reassess whether a synthetic v0.3-style SQLite fixture is required; the current legacy migration fixture covers active schema drift, so no separate v0.3 fixture is currently needed: `python -m pytest tests/test_store_migrations.py`.
40
+ - [x] Verify `schema_state` reports expected version and checksum after migration: `python -m pytest tests/test_store_migrations.py`.
41
+ - [x] Verify `rebuild-index` clears only tracker-owned aggregate tables: `python -m pytest tests/test_store_dashboard_mcp.py`.
42
+ - [x] Verify `reset-db` does not touch raw Codex logs: `python -m pytest tests/test_cli_lifecycle.py`.
43
+ - [x] Verify refresh metadata and parser diagnostics survive migration: `python -m pytest tests/test_store_migrations.py tests/test_parser.py`.
44
+ - [x] Verify CSV export columns after migration: `python -m pytest tests/test_store_migrations.py`.
45
+
46
+ ## 3. CLI Compatibility
47
+
48
+ - [x] Confirm every documented command in `docs/cli-reference.md` exists: `python -m pytest tests/test_cli_release.py`.
49
+ - [x] Confirm no documented command is removed without a deprecation plan: manual diff review plus `python -m pytest tests/test_cli_release.py`.
50
+ - [x] Verify command help works from an installed wheel: `python scripts/smoke_installed_package.py`.
51
+ - [x] Verify lifecycle commands still return actionable errors without real logs: `python -m pytest tests/test_cli_lifecycle.py`.
52
+
53
+ ## 4. MCP Compatibility
54
+
55
+ - [x] Verify MCP tool names remain documented in `docs/mcp.md`: `python -m pytest tests/test_cli_release.py`.
56
+ - [x] Verify MCP JSON responses use tracked schema IDs where applicable: `python -m pytest tests/test_store_dashboard_mcp.py`.
57
+ - [x] Verify companion skill packaged copy matches source skill: `python scripts/check_release.py`.
58
+ - [x] Verify plugin installer writes MCP config from an installed wheel: `python scripts/smoke_installed_package.py`.
59
+
60
+ ## 5. JSON Contract Stability
61
+
62
+ - [x] Verify every documented `--json` command has a tracked schema: `python -m pytest tests/test_json_contracts.py`.
63
+ - [x] Verify every schema in `docs/cli-json-schemas.md` exists in `src/codex_usage_tracker/json_contracts.py`: `python -m pytest tests/test_json_contracts.py`.
64
+ - [x] Verify every schema in `json_contracts.py` is documented: `python -m pytest tests/test_json_contracts.py`.
65
+ - [x] Verify known payload examples pass `validate_json_payload_contract`: `python -m pytest tests/test_json_contracts.py`.
66
+ - [x] Verify invalid or missing required fields fail contract validation: `python -m pytest tests/test_json_contracts.py`.
67
+ - [x] Cover query, recommendations, summary, session, doctor, pricing-coverage, dashboard, export, support-bundle, and plugin lifecycle JSON payload contracts: `python -m pytest tests/test_json_contracts.py`.
68
+
69
+ ## 6. CSV Export Stability
70
+
71
+ - [x] Verify expected CSV columns for aggregate exports: `python -m pytest tests/test_cli_lifecycle.py`.
72
+ - [x] Verify redacted and strict privacy CSV exports omit private metadata: `python -m pytest tests/test_privacy.py`.
73
+ - [x] Verify migration fixtures still export the expected CSV shape: `python -m pytest tests/test_store_migrations.py`.
74
+
75
+ ## 7. Config File Stability
76
+
77
+ - [x] Verify pricing config initialization and parsing: `python -m pytest tests/test_pricing.py`.
78
+ - [x] Verify allowance and rate-card config initialization and parsing: `python -m pytest tests/test_allowance.py`.
79
+ - [x] Verify threshold config initialization and parsing: `python -m pytest tests/test_recommendations.py`.
80
+ - [x] Verify project alias/tag config initialization and parsing: `python -m pytest tests/test_projects.py`.
81
+ - [x] Document config schema changes before release: manual review of `docs/pricing-and-credits.md`, `docs/dashboard-guide.md`, and `docs/cli-reference.md`; enforced by `python -m pytest tests/test_cli_release.py`.
82
+
83
+ ## 8. Dashboard Behavior
84
+
85
+ - [x] Verify dashboard aggregate payload remains raw-context-free: `python -m pytest tests/test_store_dashboard_mcp.py`.
86
+ - [x] Verify dashboard URL state round trips: `python -m pytest tests/test_dashboard_state.py`.
87
+ - [x] Verify dashboard formatting helpers: `node --check src/codex_usage_tracker/plugin_data/dashboard/dashboard_format.js`.
88
+ - [x] Verify dashboard data helpers: `node --check src/codex_usage_tracker/plugin_data/dashboard/dashboard_data.js`.
89
+ - [x] Verify active-history and all-history state labels: `python -m pytest tests/test_cli_release.py tests/test_store_dashboard_mcp.py`.
90
+ - [x] Run a manual localhost dashboard smoke before release with temporary aggregate-only paths: `codex-usage-tracker serve-dashboard --open` plus `curl -fsS http://127.0.0.1:8897/dashboard.html`.
91
+
92
+ ## 9. Privacy And Sharing Safety
93
+
94
+ - [x] Verify dashboard payloads in normal, redacted, and strict modes: `python -m pytest tests/test_privacy.py`.
95
+ - [x] Verify query JSON in normal, redacted, and strict modes: `python -m pytest tests/test_privacy.py`.
96
+ - [x] Verify session JSON in normal, redacted, and strict modes: `python -m pytest tests/test_privacy.py`.
97
+ - [x] Verify CSV export in redacted and strict modes: `python -m pytest tests/test_privacy.py`.
98
+ - [x] Verify strict mode does not leak raw cwd, source paths, branch, remote labels, project tags, or synthetic private project names: `python -m pytest tests/test_privacy.py`.
99
+ - [x] Verify raw context fields never appear in SQLite, CSV, dashboard payloads, support bundles, generated static HTML, docs, or screenshots: `python -m pytest tests/test_privacy.py scripts/check_release.py`.
100
+
101
+ ## 10. Support-Bundle Safety
102
+
103
+ - [x] Verify support bundles include package version, Python version, OS/platform, doctor status, schema state, parser diagnostics, pricing status, allowance status, threshold status, project config status, and privacy metadata: `python -m pytest tests/test_support.py`.
104
+ - [x] Verify support bundles exclude raw logs, prompt text, assistant text, tool output, context text, and raw source paths in strict mode: `python -m pytest tests/test_support.py`.
105
+ - [x] Update issue templates to request only strict-mode support bundles: `python scripts/check_release.py`.
106
+
107
+ ## 11. Large-History Performance
108
+
109
+ - [x] Run synthetic 10k benchmark: `python scripts/benchmark_synthetic_history.py --rows 10000 --json --enforce-thresholds`.
110
+ - [x] Run synthetic 100k benchmark: `python scripts/benchmark_synthetic_history.py --rows 100000 --json --enforce-thresholds`.
111
+ - [x] Run synthetic 500k benchmark as a release gate when practical: `python scripts/benchmark_synthetic_history.py --rows 500000 --json --enforce-thresholds`.
112
+ - [x] Define thresholds for active-only dashboard query, all-history dashboard query, since/until, model/effort, min_tokens, recommendations, pricing coverage, and project summary.
113
+ - [x] Add a smaller CI-safe benchmark if it can stay fast and deterministic.
114
+
115
+ ## 12. Release Process
116
+
117
+ - [x] Verify publish workflow publishes `codex-usage-tracking`, not `codex-usage-tracker`: `python scripts/check_release.py`.
118
+ - [x] Verify publish workflow uses Trusted Publishing, not API tokens: `python scripts/check_release.py`.
119
+ - [x] Verify TestPyPI and PyPI jobs exist and publish only on workflow dispatch or release events: `python scripts/check_release.py`.
120
+ - [x] Verify manual PyPI workflow dispatch is restricted to `main` or tag refs: `python scripts/check_release.py`.
121
+ - [x] Verify PyPI job is gated by environment `pypi`: `gh api repos/douglasmonsky/codex-usage-tracker/environments/pypi`.
122
+ - [x] Verify dist filenames match `codex_usage_tracking`: `python -m build && python scripts/check_release.py --dist`.
123
+ - [x] Verify TestPyPI process: run `Publish Python package` with `target=testpypi` only when intentionally testing release publication.
124
+ - [x] Verify PyPI process: publish a GitHub Release or run workflow dispatch with `target=pypi` only when intentionally publishing a reviewed release.
125
+ - [x] Document release recovery by cutting a new patch version when an uploaded artifact is wrong: see `docs/development.md`.
126
+
127
+ ## 13. Known Limitations
128
+
129
+ - [x] Document that Codex upstream log formats can change and parser compatibility may require updates.
130
+ - [x] Document that pricing and rate-card sources can change outside this project.
131
+ - [x] Document that live account allowance cannot be read automatically by this local tracker.
132
+ - [x] Document that cost and credit estimates are not guaranteed to match exact billing.
133
+ - [x] Document platform/plugin discovery limitations separately from the core Python CLI/dashboard support.
134
+
135
+ ## Evidence References
136
+
137
+ These references are the concrete proof behind completed checklist items. Public package smoke commands are version-specific to `0.5.0`; all repo tests use synthetic or aggregate-only data.
138
+
139
+ ### Public Install And Package Metadata
140
+
141
+ - Public PyPI version, public venv install, and public pipx install are proven by the exact public-install commands in section 1.
142
+ - Built-wheel and installed-resource coverage is proven by `scripts/smoke_installed_package.py` and `tests/test_cli_release.py::test_installed_package_smoke_checks_help_for_stable_commands`.
143
+ - Linux package-resource coverage is proven by `scripts/smoke_installed_package.py --docker`.
144
+ - Public PyPI Docker coverage is proven by `scripts/smoke_installed_package.py --docker --from-pypi --version 0.5.0`.
145
+ - PyPI metadata, package/distribution names, package resources, source/wheel member names, Python 3.10-3.14 support metadata, CI workflow requirements, publish workflow safety text, and tracked secret patterns are proven by `scripts/check_release.py`, `scripts/check_release.py --dist`, and `tests/test_cli_release.py::test_release_check_script_passes`.
146
+
147
+ ### Upgrade And Migration
148
+
149
+ - Legacy SQLite migration, schema state, migration idempotence, malformed legacy schema handling, and migration CSV shape are proven by `tests/test_store_migrations.py`.
150
+ - The v0.3 fixture decision is covered by `tests/test_store_migrations.py`; no additional v0.3-specific fixture is currently required because the active pre-1.0 migration path is already represented by the legacy fixture.
151
+ - `rebuild-index` clearing only tracker-owned aggregate rows is proven by `tests/test_store_dashboard_mcp.py::test_rebuild_index_clears_aggregate_rows_before_rescan`.
152
+ - `reset-db` preserving raw Codex logs is proven by `tests/test_cli_lifecycle.py::test_setup_support_bundle_and_reset_db_cli`.
153
+ - Refresh metadata and parser diagnostics are proven by `tests/test_store_migrations.py`, `tests/test_parser.py`, and `tests/test_store_dashboard_mcp.py::test_refresh_reports_skipped_corrupt_token_events`.
154
+
155
+ ### CLI Compatibility
156
+
157
+ - Documented CLI command existence and stable command coverage are proven by `tests/test_cli_release.py::test_cli_reference_documents_only_existing_stable_commands` and `tests/test_cli_release.py::test_stable_cli_commands_are_not_removed_without_a_deprecation_plan`.
158
+ - Installed-wheel subcommand help coverage is proven by `scripts/smoke_installed_package.py` and guarded by `tests/test_cli_release.py::test_installed_package_smoke_checks_help_for_stable_commands`.
159
+ - Lifecycle actionable errors without real logs are proven by `tests/test_cli_lifecycle.py::test_lifecycle_commands_return_actionable_errors_without_real_logs`.
160
+
161
+ ### MCP Compatibility
162
+
163
+ - MCP tool documentation parity is proven by `tests/test_cli_release.py::test_mcp_tool_names_remain_documented`.
164
+ - MCP JSON response schema IDs and wrapper payload contracts are proven by `tests/test_store_dashboard_mcp.py::test_mcp_wrappers_smoke`.
165
+ - Companion skill source/package parity is proven by `scripts/check_release.py`.
166
+ - Installed-wheel plugin MCP config is proven by `scripts/smoke_installed_package.py`.
167
+
168
+ ### JSON Contract Stability
169
+
170
+ - Documented schema table parity, runtime schema ID tracking, example validation, invalid-payload rejection, and minimal payload validation are proven by `tests/test_json_contracts.py`.
171
+ - README and CLI schema doc references are additionally guarded by `tests/test_cli_release.py::test_cli_json_schema_doc_lists_tracked_contracts`.
172
+
173
+ ### CSV Export Stability
174
+
175
+ - Aggregate CSV columns are proven by `tests/test_cli_lifecycle.py::test_report_json_and_query_cli`.
176
+ - Redacted and strict privacy CSV behavior is proven by `tests/test_privacy.py::test_privacy_modes_cover_dashboard_query_session_and_csv` and `tests/test_privacy.py::test_aggregate_outputs_exclude_raw_transcript_content`.
177
+ - Migration CSV shape is proven by `tests/test_store_migrations.py::test_csv_export_keeps_current_columns_after_legacy_migration`.
178
+
179
+ ### Config File Stability
180
+
181
+ - Pricing config initialization and parsing are proven by `tests/test_pricing.py` and `tests/test_cli_lifecycle.py::test_rate_card_allowance_and_pricing_snapshot_cli`.
182
+ - Allowance and Codex rate-card config initialization/parsing are proven by `tests/test_allowance.py` and `tests/test_cli_lifecycle.py::test_rate_card_allowance_and_pricing_snapshot_cli`.
183
+ - Threshold config initialization/parsing is proven by `tests/test_recommendations.py::test_threshold_template_and_overrides`.
184
+ - Project alias, ignored-path, tag, and privacy behavior is proven by `tests/test_projects.py`.
185
+ - Config schema documentation coverage is proven by `tests/test_cli_release.py::test_local_config_schema_docs_reference_stable_fields`.
186
+
187
+ ### Dashboard Behavior
188
+
189
+ - Aggregate-only dashboard payloads and CSV are proven by `tests/test_store_dashboard_mcp.py::test_dashboard_and_csv_are_aggregate_only` and `tests/test_privacy.py::test_aggregate_outputs_exclude_raw_transcript_content`.
190
+ - URL-state round trips are proven by `tests/test_dashboard_state.py::test_dashboard_url_state_round_trips`.
191
+ - Dashboard helper syntax is proven by the `node --check` commands in section 8 and the CI dashboard JavaScript syntax job.
192
+ - Active/all-history payload behavior is proven by `tests/test_store_dashboard_mcp.py::test_dashboard_history_scope_excludes_archived_rows_by_default` and `tests/test_store_dashboard_mcp.py::test_dashboard_server_usage_api_switches_history_scope`.
193
+ - Active/all-history user-facing labels are proven by `tests/test_cli_release.py::test_dashboard_history_scope_labels_remain_user_facing`.
194
+ - No-context startup and runtime context enablement are proven by `tests/test_store_dashboard_mcp.py::test_dashboard_server_can_enable_context_api_at_runtime` and `tests/test_privacy.py::test_context_server_requires_loopback_origin_token_and_enablement`.
195
+ - Manual localhost smoke is proven by running `codex-usage-tracker serve-dashboard --open` against temporary database, config, output, and Codex-home paths on `127.0.0.1:8897`, then probing `/dashboard.html` with `curl -fsS`.
196
+
197
+ ### Privacy And Sharing Safety
198
+
199
+ - Dashboard, query, session, CSV, support-bundle, and generated-static-HTML privacy behavior is proven by `tests/test_privacy.py`.
200
+ - Strict project metadata redaction is proven by `tests/test_privacy.py::test_privacy_modes_cover_dashboard_query_session_and_csv` and `tests/test_projects.py::test_project_privacy_modes_redact_sensitive_metadata`.
201
+ - Raw context exclusion and explicit context loading are proven by `tests/test_privacy.py::test_context_loading_is_explicit_redacted_and_not_static_html`, `tests/test_privacy.py::test_context_server_requires_loopback_origin_token_and_enablement`, and `tests/test_store_dashboard_mcp.py::test_context_loads_raw_log_only_on_demand`.
202
+ - Tracked-file secret scanning is proven by `scripts/check_release.py`.
203
+
204
+ ### Support-Bundle Safety
205
+
206
+ - Support-bundle payload shape and secret safety are proven by `tests/test_support.py::test_support_bundle_default_mode_contract_and_secret_safety`.
207
+ - Strict support-bundle path and doctor-text redaction is proven by `tests/test_support.py::test_support_bundle_strict_mode_redacts_local_paths_and_doctor_text`.
208
+ - Safe issue-template requests are proven by `scripts/check_release.py`.
209
+
210
+ ### Large-History Performance
211
+
212
+ - Benchmark command behavior and threshold contract are smoke-tested by `tests/test_cli_release.py::test_synthetic_history_benchmark_script_smoke`.
213
+ - Release-size 10k, 100k, and 500k benchmark claims are proven by running `python scripts/benchmark_synthetic_history.py --rows 10000 100000 500000 --json --enforce-thresholds` before release work when practical.
214
+ - CI-safe benchmark coverage is proven by the CI `Release readiness` job through `tests/test_cli_release.py::test_synthetic_history_benchmark_script_smoke`, using a small `--threshold-scale` allowance for coverage instrumentation and shared runner noise.
215
+
216
+ ### Release Process
217
+
218
+ - Normal CI package build plus `twine check` and dist verification are proven by `.github/workflows/ci.yml` and enforced by `scripts/check_release.py::_check_ci_workflow`.
219
+ - Publish workflow package name, Trusted Publishing, TestPyPI/PyPI job presence, event guards, no push/PR publishing, no token/password publishing, and manual PyPI main/tag preflight are proven by `scripts/check_release.py::_check_publish_workflow`.
220
+ - The GitHub `pypi` environment gate is proven by `gh api repos/douglasmonsky/codex-usage-tracker/environments/pypi`, which reports a `required_reviewers` protection rule and `can_admins_bypass=false`.
221
+ - Dist filename and wheel/sdist member checks are proven by `python -m build`, `python -m twine check dist/*`, and `python scripts/check_release.py --dist`.
222
+ - TestPyPI publish process is proven by a workflow-dispatch run on `main`, followed by TestPyPI metadata and clean virtualenv install checks for `codex-usage-tracking==0.5.0`.
223
+ - PyPI publish process is proven by a workflow-dispatch run on `main`, protected `pypi` environment approval, PyPI metadata visibility, clean virtualenv install, temporary pipx install, and Docker public-package smoke for `codex-usage-tracking==0.5.0`.
224
+ - Release recovery documentation is proven by `scripts/check_release.py` required-file and docs checks.
225
+
226
+ ### Known Limitations
227
+
228
+ - Parser-format drift, pricing/rate-card drift, live allowance, non-billing-equivalence, and plugin-discovery boundary documentation are proven by `tests/test_cli_release.py::test_known_limitations_are_documented`.
@@ -83,8 +83,11 @@ Configure the usage component:
83
83
 
84
84
  ## Accuracy Notes
85
85
 
86
+ - Codex upstream log formats can change, and parser compatibility may require tracker updates before new event shapes are fully understood.
87
+ - Pricing and rate-card sources can change outside this project. Refresh or pin local files when reports need a known source snapshot.
86
88
  - Local Codex logs may not include usage from other ChatGPT agentic surfaces that share the same allowance.
87
- - The dashboard does not infer live remaining allowance from the logged-in account plan.
89
+ - Live account allowance cannot be read automatically by this local tracker, and the dashboard does not infer live remaining allowance from the logged-in account plan.
88
90
  - Pricing can change after a report is generated. Use `pin-pricing` when you need reproducible historical cost estimates.
89
91
  - Rows with direct model/rate-card matches are more trustworthy than inferred aliases or local overrides.
90
92
  - Cost and credit calculations use aggregate counters; the tracker does not re-tokenize prompts or reconstruct usage from raw text.
93
+ - Cost and credit estimates are not guaranteed to match exact billing.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "codex-usage-tracking"
7
- version = "0.4.0"
7
+ version = "0.5.0"
8
8
  description = "Unofficial local Codex plugin and dashboard for investigating aggregate token usage, costs, caching, and thread patterns."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -62,6 +62,7 @@ where = ["src"]
62
62
  "codex_usage_tracker.plugin_data" = [
63
63
  "assets/*",
64
64
  "dashboard/*",
65
+ "dashboard/locales/*",
65
66
  "docs/*",
66
67
  "docs/assets/*",
67
68
  "rate_cards/*",