argus-code 0.5.2__tar.gz → 0.7.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 (392) hide show
  1. {argus_code-0.5.2 → argus_code-0.7.0}/PKG-INFO +165 -87
  2. argus_code-0.7.0/README.md +326 -0
  3. argus_code-0.7.0/dashboard-dist/assets/AlertsPage-BzxuOIP5.js +1 -0
  4. argus_code-0.5.2/dashboard-dist/assets/AreaLine-BQsLuA8C.js → argus_code-0.7.0/dashboard-dist/assets/AreaLine-DVivOkZb.js +1 -1
  5. argus_code-0.5.2/dashboard-dist/assets/AttentionStrip-C1RqWKWe.js → argus_code-0.7.0/dashboard-dist/assets/AttentionStrip-C4S2Lszh.js +1 -1
  6. argus_code-0.5.2/dashboard-dist/assets/Bars-DMb_quIu.js → argus_code-0.7.0/dashboard-dist/assets/Bars-BavaWNhM.js +1 -1
  7. argus_code-0.5.2/dashboard-dist/assets/Button-CpS_v0eC.js → argus_code-0.7.0/dashboard-dist/assets/Button-D2qCw3Bg.js +1 -1
  8. argus_code-0.5.2/dashboard-dist/assets/ChartTable-BVgzTIE9.js → argus_code-0.7.0/dashboard-dist/assets/ChartTable-Cs4_Bkur.js +1 -1
  9. argus_code-0.5.2/dashboard-dist/assets/Chip-CFh85KNf.js → argus_code-0.7.0/dashboard-dist/assets/Chip-BfVZybGP.js +1 -1
  10. argus_code-0.5.2/dashboard-dist/assets/ErrorPanel-CI3QUuQD.js → argus_code-0.7.0/dashboard-dist/assets/ErrorPanel-B-6j7s5W.js +1 -1
  11. argus_code-0.5.2/dashboard-dist/assets/ModelsPage-B7cswqCK.js → argus_code-0.7.0/dashboard-dist/assets/ModelsPage-ZckGDACZ.js +1 -1
  12. argus_code-0.7.0/dashboard-dist/assets/MultiLine-C0zPyGoR.js +1 -0
  13. argus_code-0.7.0/dashboard-dist/assets/OverviewPage-BZXbesGh.js +1 -0
  14. argus_code-0.5.2/dashboard-dist/assets/Panel-CJXvZgtF.js → argus_code-0.7.0/dashboard-dist/assets/Panel-D9OW_N0O.js +1 -1
  15. argus_code-0.7.0/dashboard-dist/assets/SearchPage-BDwLqLRp.js +1 -0
  16. argus_code-0.7.0/dashboard-dist/assets/SessionPage-DQZVoIDZ.js +2 -0
  17. argus_code-0.5.2/dashboard-dist/assets/SessionsPage-DQuMS1ZJ.js → argus_code-0.7.0/dashboard-dist/assets/SessionsPage-CiIJBE2Z.js +2 -2
  18. argus_code-0.7.0/dashboard-dist/assets/SettingsPage-kFOEzh7m.js +1 -0
  19. argus_code-0.5.2/dashboard-dist/assets/StackedColumns-Dow8yAFe.js → argus_code-0.7.0/dashboard-dist/assets/StackedColumns-CFuYUdeJ.js +1 -1
  20. argus_code-0.7.0/dashboard-dist/assets/Tile-CTKO3Y6u.js +1 -0
  21. argus_code-0.5.2/dashboard-dist/assets/TimelineTab-DfQceFmu.js → argus_code-0.7.0/dashboard-dist/assets/TimelineTab-CZ-cy_B_.js +1 -1
  22. argus_code-0.5.2/dashboard-dist/assets/ToolsPage-DrFNg1A7.js → argus_code-0.7.0/dashboard-dist/assets/ToolsPage-B8LTs6p5.js +1 -1
  23. argus_code-0.5.2/dashboard-dist/assets/TrendsPage-CYu9wobK.js → argus_code-0.7.0/dashboard-dist/assets/TrendsPage-8sE0AOTG.js +1 -1
  24. argus_code-0.7.0/dashboard-dist/assets/agents-DLrqrj4h.js +1 -0
  25. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/index-CpQkAwD7.css +1 -1
  26. argus_code-0.7.0/dashboard-dist/assets/index-KIvNrQPN.js +50 -0
  27. argus_code-0.7.0/dashboard-dist/assets/rollups-Dqiwg3gD.js +1 -0
  28. argus_code-0.5.2/dashboard-dist/assets/uplotTheme-CBSv2dtb.js → argus_code-0.7.0/dashboard-dist/assets/uplotTheme-Danfgh6n.js +1 -1
  29. argus_code-0.7.0/dashboard-dist/assets/windows-B3y4OLGl.js +1 -0
  30. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/index.html +3 -3
  31. argus_code-0.7.0/pricing/2026-09-22.json +31 -0
  32. argus_code-0.7.0/pricing/2026-10-04.json +68 -0
  33. {argus_code-0.5.2 → argus_code-0.7.0}/pyproject.toml +19 -1
  34. argus_code-0.7.0/python/argus/AGENTS.md +117 -0
  35. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/__init__.py +1 -1
  36. argus_code-0.7.0/python/argus/adapters/AGENTS.md +152 -0
  37. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/__init__.py +1 -0
  38. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/base.py +19 -0
  39. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/claude_code/adapter.py +3 -0
  40. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/claude_code/extract_tool_calls.py +34 -10
  41. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/claude_code/extract_turns.py +46 -11
  42. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/claude_code/ingest_file.py +25 -9
  43. argus_code-0.7.0/python/argus/adapters/codex/__init__.py +5 -0
  44. argus_code-0.7.0/python/argus/adapters/codex/adapter.py +94 -0
  45. argus_code-0.7.0/python/argus/adapters/codex/discover.py +172 -0
  46. argus_code-0.7.0/python/argus/adapters/codex/ingest_file.py +181 -0
  47. argus_code-0.7.0/python/argus/adapters/codex/lines.py +79 -0
  48. argus_code-0.7.0/python/argus/adapters/codex/records.py +224 -0
  49. argus_code-0.7.0/python/argus/adapters/codex/state.py +150 -0
  50. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/cli.py +53 -32
  51. argus_code-0.7.0/python/argus/collector/AGENTS.md +101 -0
  52. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/collector/aggregate.py +25 -2
  53. argus_code-0.7.0/python/argus/collector/first_run.py +560 -0
  54. argus_code-0.7.0/python/argus/collector/pipeline.py +421 -0
  55. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/collector/scheduler.py +8 -2
  56. argus_code-0.7.0/python/argus/collector/search_backfill.py +142 -0
  57. argus_code-0.7.0/python/argus/collector/session_files.py +18 -0
  58. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/collector/watcher.py +12 -3
  59. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/core/runtime.py +49 -19
  60. argus_code-0.7.0/python/argus/daemon/pidfile.py +281 -0
  61. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/daemon/process.py +23 -6
  62. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/daemon/service.py +2 -2
  63. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/detectors/__init__.py +2 -0
  64. argus_code-0.7.0/python/argus/detectors/base.py +59 -0
  65. argus_code-0.7.0/python/argus/detectors/cache_hit_drop.py +129 -0
  66. argus_code-0.7.0/python/argus/detectors/cost_spike.py +128 -0
  67. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/detectors/tool_error_rate_spike.py +3 -11
  68. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/pricing/compute.py +17 -0
  69. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/pricing/load.py +27 -5
  70. argus_code-0.7.0/python/argus/scaffold/snapshot.py +191 -0
  71. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/server/AGENTS.md +11 -1
  72. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/server/api.py +43 -13
  73. argus_code-0.7.0/python/argus/store/AGENTS.md +83 -0
  74. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/store/db.py +59 -1
  75. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/store/migrations/inline.py +8 -0
  76. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/store/repository.py +446 -47
  77. {argus_code-0.5.2 → argus_code-0.7.0}/tests/AGENTS.md +7 -3
  78. argus_code-0.7.0/tests/adapters/codex/test_adapter.py +109 -0
  79. argus_code-0.7.0/tests/adapters/codex/test_discover.py +95 -0
  80. argus_code-0.7.0/tests/adapters/codex/test_ingest_file.py +139 -0
  81. argus_code-0.7.0/tests/adapters/codex/test_lines.py +52 -0
  82. argus_code-0.7.0/tests/adapters/codex/test_real_root.py +64 -0
  83. argus_code-0.7.0/tests/adapters/codex/test_records.py +109 -0
  84. argus_code-0.7.0/tests/adapters/codex/test_state.py +76 -0
  85. argus_code-0.7.0/tests/cli/test_pricing_refresh_cli.py +43 -0
  86. argus_code-0.7.0/tests/collector/test_codex_incremental_invariant.py +165 -0
  87. {argus_code-0.5.2 → argus_code-0.7.0}/tests/collector/test_first_run.py +82 -0
  88. argus_code-0.7.0/tests/collector/test_fork_dedup.py +182 -0
  89. argus_code-0.7.0/tests/collector/test_fork_dedup_db.py +103 -0
  90. argus_code-0.7.0/tests/collector/test_incremental_invariant.py +286 -0
  91. argus_code-0.7.0/tests/collector/test_incremental_repairs.py +110 -0
  92. {argus_code-0.5.2 → argus_code-0.7.0}/tests/collector/test_pipeline.py +54 -0
  93. argus_code-0.7.0/tests/collector/test_pipeline_codex.py +133 -0
  94. argus_code-0.7.0/tests/collector/test_session_files.py +58 -0
  95. {argus_code-0.5.2 → argus_code-0.7.0}/tests/conftest.py +13 -2
  96. {argus_code-0.5.2 → argus_code-0.7.0}/tests/core/test_runtime.py +5 -4
  97. argus_code-0.7.0/tests/core/test_runtime_shutdown.py +236 -0
  98. argus_code-0.7.0/tests/daemon/test_pidfile_identity.py +244 -0
  99. {argus_code-0.5.2 → argus_code-0.7.0}/tests/daemon/test_process.py +8 -0
  100. {argus_code-0.5.2 → argus_code-0.7.0}/tests/daemon/test_service.py +14 -8
  101. argus_code-0.7.0/tests/detectors/test_base_helpers.py +35 -0
  102. argus_code-0.7.0/tests/detectors/test_cache_hit_drop.py +153 -0
  103. argus_code-0.7.0/tests/detectors/test_cost_spike.py +191 -0
  104. {argus_code-0.5.2 → argus_code-0.7.0}/tests/detectors/test_registry.py +6 -3
  105. {argus_code-0.5.2 → argus_code-0.7.0}/tests/pricing/test_compute.py +19 -0
  106. argus_code-0.7.0/tests/pricing/test_load.py +130 -0
  107. argus_code-0.7.0/tests/scaffold/test_snapshot_secrets.py +246 -0
  108. argus_code-0.7.0/tests/server/test_day_buckets.py +100 -0
  109. {argus_code-0.5.2 → argus_code-0.7.0}/tests/store/test_db.py +66 -3
  110. {argus_code-0.5.2 → argus_code-0.7.0}/tests/store/test_repository.py +62 -0
  111. argus_code-0.7.0/tests/store/test_transactions.py +109 -0
  112. {argus_code-0.5.2 → argus_code-0.7.0}/uv.lock +1 -1
  113. argus_code-0.5.2/.github/ISSUE_TEMPLATE/bug_report.yml +0 -68
  114. argus_code-0.5.2/.github/ISSUE_TEMPLATE/config.yml +0 -5
  115. argus_code-0.5.2/.github/ISSUE_TEMPLATE/feature_request.yml +0 -46
  116. argus_code-0.5.2/.github/pull_request_template.md +0 -36
  117. argus_code-0.5.2/.github/workflows/test.yml +0 -74
  118. argus_code-0.5.2/.xo/project.json +0 -7
  119. argus_code-0.5.2/AGENTS.md +0 -120
  120. argus_code-0.5.2/ARCHITECTURE.md +0 -321
  121. argus_code-0.5.2/CLAUDE.md +0 -14
  122. argus_code-0.5.2/CONTRIBUTING.md +0 -178
  123. argus_code-0.5.2/PRD.md +0 -387
  124. argus_code-0.5.2/README.md +0 -248
  125. argus_code-0.5.2/SECURITY.md +0 -116
  126. argus_code-0.5.2/TESTING.md +0 -377
  127. argus_code-0.5.2/dashboard/.astro/content-assets.mjs +0 -1
  128. argus_code-0.5.2/dashboard/.astro/content-modules.mjs +0 -1
  129. argus_code-0.5.2/dashboard/.astro/content.d.ts +0 -155
  130. argus_code-0.5.2/dashboard/.astro/types.d.ts +0 -2
  131. argus_code-0.5.2/dashboard/AGENTS.md +0 -73
  132. argus_code-0.5.2/dashboard/e2e/smoke.spec.ts +0 -35
  133. argus_code-0.5.2/dashboard/index.html +0 -12
  134. argus_code-0.5.2/dashboard/package-lock.json +0 -4414
  135. argus_code-0.5.2/dashboard/package.json +0 -44
  136. argus_code-0.5.2/dashboard/playwright.config.ts +0 -17
  137. argus_code-0.5.2/dashboard/scripts/size.mjs +0 -19
  138. argus_code-0.5.2/dashboard/src/App.test.tsx +0 -15
  139. argus_code-0.5.2/dashboard/src/app/queryClient.ts +0 -5
  140. argus_code-0.5.2/dashboard/src/app/router.tsx +0 -19
  141. argus_code-0.5.2/dashboard/src/app/shell/CommandPalette.test.tsx +0 -16
  142. argus_code-0.5.2/dashboard/src/app/shell/CommandPalette.tsx +0 -52
  143. argus_code-0.5.2/dashboard/src/app/shell/Shell.tsx +0 -13
  144. argus_code-0.5.2/dashboard/src/app/shell/Sidebar.test.tsx +0 -21
  145. argus_code-0.5.2/dashboard/src/app/shell/Sidebar.tsx +0 -73
  146. argus_code-0.5.2/dashboard/src/app/shell/TopBar.tsx +0 -28
  147. argus_code-0.5.2/dashboard/src/components/charts/AlertStrip.tsx +0 -22
  148. argus_code-0.5.2/dashboard/src/components/charts/AreaLine.test.tsx +0 -14
  149. argus_code-0.5.2/dashboard/src/components/charts/AreaLine.tsx +0 -50
  150. argus_code-0.5.2/dashboard/src/components/charts/Bars.test.tsx +0 -12
  151. argus_code-0.5.2/dashboard/src/components/charts/Bars.tsx +0 -28
  152. argus_code-0.5.2/dashboard/src/components/charts/CalendarHeatmap.test.tsx +0 -8
  153. argus_code-0.5.2/dashboard/src/components/charts/CalendarHeatmap.tsx +0 -30
  154. argus_code-0.5.2/dashboard/src/components/charts/ChartTable.tsx +0 -40
  155. argus_code-0.5.2/dashboard/src/components/charts/GridHeatmap.tsx +0 -27
  156. argus_code-0.5.2/dashboard/src/components/charts/Legend.tsx +0 -12
  157. argus_code-0.5.2/dashboard/src/components/charts/Meter.test.tsx +0 -8
  158. argus_code-0.5.2/dashboard/src/components/charts/Meter.tsx +0 -21
  159. argus_code-0.5.2/dashboard/src/components/charts/Minimap.test.tsx +0 -17
  160. argus_code-0.5.2/dashboard/src/components/charts/Minimap.tsx +0 -35
  161. argus_code-0.5.2/dashboard/src/components/charts/MultiLine.tsx +0 -5
  162. argus_code-0.5.2/dashboard/src/components/charts/README.md +0 -22
  163. argus_code-0.5.2/dashboard/src/components/charts/Scatter.tsx +0 -83
  164. argus_code-0.5.2/dashboard/src/components/charts/Sparkline.tsx +0 -14
  165. argus_code-0.5.2/dashboard/src/components/charts/StackedColumns.tsx +0 -67
  166. argus_code-0.5.2/dashboard/src/components/charts/UPlotChart.tsx +0 -36
  167. argus_code-0.5.2/dashboard/src/components/charts/ramp.ts +0 -3
  168. argus_code-0.5.2/dashboard/src/components/charts/uplotTheme.ts +0 -14
  169. argus_code-0.5.2/dashboard/src/components/ui/Button.tsx +0 -18
  170. argus_code-0.5.2/dashboard/src/components/ui/Chip.tsx +0 -16
  171. argus_code-0.5.2/dashboard/src/components/ui/CopyId.tsx +0 -28
  172. argus_code-0.5.2/dashboard/src/components/ui/DataTable.tsx +0 -70
  173. argus_code-0.5.2/dashboard/src/components/ui/EmptyState.tsx +0 -6
  174. argus_code-0.5.2/dashboard/src/components/ui/ErrorPanel.tsx +0 -5
  175. argus_code-0.5.2/dashboard/src/components/ui/Icon.tsx +0 -30
  176. argus_code-0.5.2/dashboard/src/components/ui/Kbd.tsx +0 -3
  177. argus_code-0.5.2/dashboard/src/components/ui/Panel.tsx +0 -18
  178. argus_code-0.5.2/dashboard/src/components/ui/Pill.test.tsx +0 -11
  179. argus_code-0.5.2/dashboard/src/components/ui/Pill.tsx +0 -24
  180. argus_code-0.5.2/dashboard/src/components/ui/Seg.test.tsx +0 -10
  181. argus_code-0.5.2/dashboard/src/components/ui/Seg.tsx +0 -18
  182. argus_code-0.5.2/dashboard/src/components/ui/Skeleton.tsx +0 -3
  183. argus_code-0.5.2/dashboard/src/components/ui/Tile.test.tsx +0 -23
  184. argus_code-0.5.2/dashboard/src/components/ui/Tile.tsx +0 -28
  185. argus_code-0.5.2/dashboard/src/features/alerts/AlertsPage.tsx +0 -91
  186. argus_code-0.5.2/dashboard/src/features/models/ModelsPage.tsx +0 -83
  187. argus_code-0.5.2/dashboard/src/features/overview/AttentionStrip.tsx +0 -40
  188. argus_code-0.5.2/dashboard/src/features/overview/OverviewPage.tsx +0 -113
  189. argus_code-0.5.2/dashboard/src/features/overview/TopSessions.tsx +0 -45
  190. argus_code-0.5.2/dashboard/src/features/overview/useOverviewModel.test.ts +0 -31
  191. argus_code-0.5.2/dashboard/src/features/overview/useOverviewModel.ts +0 -57
  192. argus_code-0.5.2/dashboard/src/features/search/SearchPage.tsx +0 -112
  193. argus_code-0.5.2/dashboard/src/features/search/cleanSnippet.test.ts +0 -11
  194. argus_code-0.5.2/dashboard/src/features/search/cleanSnippet.ts +0 -24
  195. argus_code-0.5.2/dashboard/src/features/session/OverviewTab.tsx +0 -61
  196. argus_code-0.5.2/dashboard/src/features/session/SessionPage.tsx +0 -88
  197. argus_code-0.5.2/dashboard/src/features/session/SubagentsTab.tsx +0 -183
  198. argus_code-0.5.2/dashboard/src/features/session/TimelineTab.tsx +0 -139
  199. argus_code-0.5.2/dashboard/src/features/session/model.test.ts +0 -22
  200. argus_code-0.5.2/dashboard/src/features/session/model.ts +0 -37
  201. argus_code-0.5.2/dashboard/src/features/sessions/AnalysisStrip.tsx +0 -67
  202. argus_code-0.5.2/dashboard/src/features/sessions/SessionsPage.tsx +0 -66
  203. argus_code-0.5.2/dashboard/src/features/sessions/SessionsTable.tsx +0 -44
  204. argus_code-0.5.2/dashboard/src/features/sessions/filters.test.ts +0 -15
  205. argus_code-0.5.2/dashboard/src/features/sessions/filters.ts +0 -19
  206. argus_code-0.5.2/dashboard/src/features/settings/SettingsPage.tsx +0 -89
  207. argus_code-0.5.2/dashboard/src/features/tools/ToolsPage.tsx +0 -86
  208. argus_code-0.5.2/dashboard/src/features/tools/toolsOverTime.test.ts +0 -15
  209. argus_code-0.5.2/dashboard/src/features/tools/toolsOverTime.ts +0 -29
  210. argus_code-0.5.2/dashboard/src/features/trends/TrendsPage.tsx +0 -101
  211. argus_code-0.5.2/dashboard/src/lib/analysis/composition.test.ts +0 -7
  212. argus_code-0.5.2/dashboard/src/lib/analysis/composition.ts +0 -14
  213. argus_code-0.5.2/dashboard/src/lib/analysis/cumulative.test.ts +0 -3
  214. argus_code-0.5.2/dashboard/src/lib/analysis/cumulative.ts +0 -4
  215. argus_code-0.5.2/dashboard/src/lib/analysis/deltas.test.ts +0 -14
  216. argus_code-0.5.2/dashboard/src/lib/analysis/deltas.ts +0 -13
  217. argus_code-0.5.2/dashboard/src/lib/analysis/hourWeekday.test.ts +0 -9
  218. argus_code-0.5.2/dashboard/src/lib/analysis/hourWeekday.ts +0 -13
  219. argus_code-0.5.2/dashboard/src/lib/analysis/rollups.test.ts +0 -43
  220. argus_code-0.5.2/dashboard/src/lib/analysis/rollups.ts +0 -49
  221. argus_code-0.5.2/dashboard/src/lib/analysis/series.test.ts +0 -25
  222. argus_code-0.5.2/dashboard/src/lib/analysis/series.ts +0 -32
  223. argus_code-0.5.2/dashboard/src/lib/analysis/testutil.ts +0 -23
  224. argus_code-0.5.2/dashboard/src/lib/analysis/trendsMetrics.test.ts +0 -31
  225. argus_code-0.5.2/dashboard/src/lib/analysis/trendsMetrics.ts +0 -53
  226. argus_code-0.5.2/dashboard/src/lib/analysis/windows.test.ts +0 -19
  227. argus_code-0.5.2/dashboard/src/lib/analysis/windows.ts +0 -33
  228. argus_code-0.5.2/dashboard/src/lib/api/__fixtures__/alerts.json +0 -1
  229. argus_code-0.5.2/dashboard/src/lib/api/__fixtures__/overview.json +0 -1
  230. argus_code-0.5.2/dashboard/src/lib/api/__fixtures__/sessions.json +0 -1
  231. argus_code-0.5.2/dashboard/src/lib/api/__fixtures__/timeline.json +0 -2785
  232. argus_code-0.5.2/dashboard/src/lib/api/__fixtures__/tools-overview.json +0 -1
  233. argus_code-0.5.2/dashboard/src/lib/api/__fixtures__/trends.json +0 -1
  234. argus_code-0.5.2/dashboard/src/lib/api/client.test.ts +0 -26
  235. argus_code-0.5.2/dashboard/src/lib/api/client.ts +0 -68
  236. argus_code-0.5.2/dashboard/src/lib/api/hooks.ts +0 -29
  237. argus_code-0.5.2/dashboard/src/lib/api/schemas.ts +0 -195
  238. argus_code-0.5.2/dashboard/src/lib/format/format.test.ts +0 -54
  239. argus_code-0.5.2/dashboard/src/lib/format/format.ts +0 -51
  240. argus_code-0.5.2/dashboard/src/main.tsx +0 -18
  241. argus_code-0.5.2/dashboard/src/routeTree.gen.ts +0 -273
  242. argus_code-0.5.2/dashboard/src/routes/__root.tsx +0 -10
  243. argus_code-0.5.2/dashboard/src/routes/alerts.tsx +0 -3
  244. argus_code-0.5.2/dashboard/src/routes/index.tsx +0 -3
  245. argus_code-0.5.2/dashboard/src/routes/models.tsx +0 -3
  246. argus_code-0.5.2/dashboard/src/routes/prompts.tsx +0 -8
  247. argus_code-0.5.2/dashboard/src/routes/search.tsx +0 -3
  248. argus_code-0.5.2/dashboard/src/routes/session.tsx +0 -10
  249. argus_code-0.5.2/dashboard/src/routes/sessions.$id.tsx +0 -9
  250. argus_code-0.5.2/dashboard/src/routes/sessions.index.tsx +0 -3
  251. argus_code-0.5.2/dashboard/src/routes/settings.tsx +0 -3
  252. argus_code-0.5.2/dashboard/src/routes/tools.tsx +0 -3
  253. argus_code-0.5.2/dashboard/src/routes/trends.tsx +0 -3
  254. argus_code-0.5.2/dashboard/src/styles.css +0 -62
  255. argus_code-0.5.2/dashboard/tsconfig.json +0 -18
  256. argus_code-0.5.2/dashboard/vite.config.ts +0 -19
  257. argus_code-0.5.2/dashboard/vitest.config.ts +0 -15
  258. argus_code-0.5.2/dashboard/vitest.setup.ts +0 -25
  259. argus_code-0.5.2/dashboard-dist/assets/AlertsPage-4HlLKV-X.js +0 -1
  260. argus_code-0.5.2/dashboard-dist/assets/MultiLine-m6Bb_pWg.js +0 -1
  261. argus_code-0.5.2/dashboard-dist/assets/OverviewPage-BJsuaA9A.js +0 -1
  262. argus_code-0.5.2/dashboard-dist/assets/SearchPage-C9-thlw8.js +0 -1
  263. argus_code-0.5.2/dashboard-dist/assets/SessionPage-D9AQ-1zV.js +0 -2
  264. argus_code-0.5.2/dashboard-dist/assets/SettingsPage-ngGLbFIg.js +0 -1
  265. argus_code-0.5.2/dashboard-dist/assets/Tile-5_GRUf2q.js +0 -1
  266. argus_code-0.5.2/dashboard-dist/assets/index-9L00WNJR.js +0 -50
  267. argus_code-0.5.2/dashboard-dist/assets/rollups-C1zMwbci.js +0 -1
  268. argus_code-0.5.2/dashboard-dist/assets/windows-7ctt19Z4.js +0 -1
  269. argus_code-0.5.2/python/argus/AGENTS.md +0 -60
  270. argus_code-0.5.2/python/argus/adapters/AGENTS.md +0 -57
  271. argus_code-0.5.2/python/argus/collector/AGENTS.md +0 -50
  272. argus_code-0.5.2/python/argus/collector/first_run.py +0 -321
  273. argus_code-0.5.2/python/argus/collector/pipeline.py +0 -198
  274. argus_code-0.5.2/python/argus/collector/search_backfill.py +0 -109
  275. argus_code-0.5.2/python/argus/daemon/pidfile.py +0 -79
  276. argus_code-0.5.2/python/argus/detectors/base.py +0 -34
  277. argus_code-0.5.2/python/argus/scaffold/snapshot.py +0 -113
  278. argus_code-0.5.2/python/argus/store/AGENTS.md +0 -46
  279. argus_code-0.5.2/tests/pricing/test_load.py +0 -43
  280. argus_code-0.5.2/tests/scaffold/test_snapshot_secrets.py +0 -103
  281. {argus_code-0.5.2 → argus_code-0.7.0}/.gitignore +0 -0
  282. {argus_code-0.5.2 → argus_code-0.7.0}/LICENSE +0 -0
  283. {argus_code-0.5.2 → argus_code-0.7.0}/NOTICE +0 -0
  284. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/cumulative-C3-3HW0n.js +0 -0
  285. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  286. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  287. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  288. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  289. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  290. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  291. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  292. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  293. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  294. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  295. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/series-BjP-80tt.js +0 -0
  296. {argus_code-0.5.2 → argus_code-0.7.0}/dashboard-dist/assets/uplotTheme-D1GxaB_c.css +0 -0
  297. {argus_code-0.5.2 → argus_code-0.7.0}/pricing/2026-05-02.json +0 -0
  298. {argus_code-0.5.2 → argus_code-0.7.0}/pricing/2026-06-12.json +0 -0
  299. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/claude_code/__init__.py +0 -0
  300. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/claude_code/discover.py +0 -0
  301. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/claude_code/extract_transcript.py +0 -0
  302. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/claude_code/history_jsonl.py +0 -0
  303. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/claude_code/model.py +0 -0
  304. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/claude_code/schemas.py +0 -0
  305. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/adapters/registry.py +0 -0
  306. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/collector/__init__.py +0 -0
  307. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/collector/rollup_subagents.py +0 -0
  308. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/core/__init__.py +0 -0
  309. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/daemon/__init__.py +0 -0
  310. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/daemon/logging.py +0 -0
  311. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/detectors/registry.py +0 -0
  312. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/pricing/__init__.py +0 -0
  313. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/pricing/refresh.py +0 -0
  314. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/pricing/types.py +0 -0
  315. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/scaffold/__init__.py +0 -0
  316. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/scaffold/scaffolder.py +0 -0
  317. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/scaffold/storage.py +0 -0
  318. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/schema/__init__.py +0 -0
  319. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/schema/types.py +0 -0
  320. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/server/__init__.py +0 -0
  321. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/server/app.py +0 -0
  322. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/store/__init__.py +0 -0
  323. {argus_code-0.5.2 → argus_code-0.7.0}/python/argus/store/migrations/__init__.py +0 -0
  324. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/agents/code-reviewer.md +0 -0
  325. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/agents/security-auditor.md +0 -0
  326. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/commands/commit.md +0 -0
  327. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/commands/deploy.md +0 -0
  328. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/commands/fix-issue.md +0 -0
  329. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/commands/pr.md +0 -0
  330. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/commands/review.md +0 -0
  331. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/rules/api-conventions.md +0 -0
  332. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/rules/code-style.md +0 -0
  333. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/rules/testing.md +0 -0
  334. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/settings.json +0 -0
  335. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/.claude/skills/example/SKILL.md +0 -0
  336. {argus_code-0.5.2 → argus_code-0.7.0}/templates/default/CLAUDE.md +0 -0
  337. {argus_code-0.5.2 → argus_code-0.7.0}/tests/__init__.py +0 -0
  338. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/__init__.py +0 -0
  339. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/__init__.py +0 -0
  340. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_adapter.py +0 -0
  341. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_discover.py +0 -0
  342. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_extract_tool_calls.py +0 -0
  343. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_extract_transcript.py +0 -0
  344. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_extract_turns.py +0 -0
  345. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_history_jsonl.py +0 -0
  346. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_ingest_file.py +0 -0
  347. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_integration.py +0 -0
  348. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_model.py +0 -0
  349. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_path_containment.py +0 -0
  350. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/claude_code/test_schemas.py +0 -0
  351. {argus_code-0.5.2/tests/cli → argus_code-0.7.0/tests/adapters/codex}/__init__.py +0 -0
  352. {argus_code-0.5.2 → argus_code-0.7.0}/tests/adapters/test_registry.py +0 -0
  353. {argus_code-0.5.2/tests/collector → argus_code-0.7.0/tests/cli}/__init__.py +0 -0
  354. {argus_code-0.5.2 → argus_code-0.7.0}/tests/cli/test_indexing_cli.py +0 -0
  355. {argus_code-0.5.2/tests/core → argus_code-0.7.0/tests/collector}/__init__.py +0 -0
  356. {argus_code-0.5.2 → argus_code-0.7.0}/tests/collector/test_aggregate.py +0 -0
  357. {argus_code-0.5.2 → argus_code-0.7.0}/tests/collector/test_first_run_shutdown.py +0 -0
  358. {argus_code-0.5.2 → argus_code-0.7.0}/tests/collector/test_rollup_subagents.py +0 -0
  359. {argus_code-0.5.2 → argus_code-0.7.0}/tests/collector/test_scheduler.py +0 -0
  360. {argus_code-0.5.2 → argus_code-0.7.0}/tests/collector/test_watcher.py +0 -0
  361. {argus_code-0.5.2/tests/daemon → argus_code-0.7.0/tests/core}/__init__.py +0 -0
  362. {argus_code-0.5.2/tests/dashboard → argus_code-0.7.0/tests/daemon}/__init__.py +0 -0
  363. {argus_code-0.5.2 → argus_code-0.7.0}/tests/daemon/test_logs.py +0 -0
  364. {argus_code-0.5.2 → argus_code-0.7.0}/tests/daemon/test_no_claude_dir.py +0 -0
  365. {argus_code-0.5.2 → argus_code-0.7.0}/tests/daemon/test_pidfile.py +0 -0
  366. {argus_code-0.5.2 → argus_code-0.7.0}/tests/daemon/test_spawn_safe_path.py +0 -0
  367. {argus_code-0.5.2 → argus_code-0.7.0}/tests/daemon/test_yield.py +0 -0
  368. {argus_code-0.5.2/tests/detectors → argus_code-0.7.0/tests/dashboard}/__init__.py +0 -0
  369. {argus_code-0.5.2 → argus_code-0.7.0}/tests/dashboard/test_no_raw_html.py +0 -0
  370. {argus_code-0.5.2/tests/pricing → argus_code-0.7.0/tests/detectors}/__init__.py +0 -0
  371. {argus_code-0.5.2 → argus_code-0.7.0}/tests/detectors/test_tool_error_rate_spike.py +0 -0
  372. {argus_code-0.5.2/tests/scaffold → argus_code-0.7.0/tests/pricing}/__init__.py +0 -0
  373. {argus_code-0.5.2 → argus_code-0.7.0}/tests/pricing/test_refresh.py +0 -0
  374. {argus_code-0.5.2/tests/schema → argus_code-0.7.0/tests/scaffold}/__init__.py +0 -0
  375. {argus_code-0.5.2 → argus_code-0.7.0}/tests/scaffold/test_bundled_template.py +0 -0
  376. {argus_code-0.5.2 → argus_code-0.7.0}/tests/scaffold/test_cli_claude.py +0 -0
  377. {argus_code-0.5.2 → argus_code-0.7.0}/tests/scaffold/test_scaffold_containment.py +0 -0
  378. {argus_code-0.5.2 → argus_code-0.7.0}/tests/scaffold/test_scaffolder.py +0 -0
  379. {argus_code-0.5.2 → argus_code-0.7.0}/tests/scaffold/test_snapshot.py +0 -0
  380. {argus_code-0.5.2 → argus_code-0.7.0}/tests/scaffold/test_storage.py +0 -0
  381. {argus_code-0.5.2/tests/server → argus_code-0.7.0/tests/schema}/__init__.py +0 -0
  382. {argus_code-0.5.2 → argus_code-0.7.0}/tests/schema/test_types.py +0 -0
  383. {argus_code-0.5.2/tests/store → argus_code-0.7.0/tests/server}/__init__.py +0 -0
  384. {argus_code-0.5.2 → argus_code-0.7.0}/tests/server/test_api.py +0 -0
  385. {argus_code-0.5.2 → argus_code-0.7.0}/tests/server/test_api_search.py +0 -0
  386. {argus_code-0.5.2 → argus_code-0.7.0}/tests/server/test_param_bounds.py +0 -0
  387. {argus_code-0.5.2 → argus_code-0.7.0}/tests/server/test_read_cache.py +0 -0
  388. {argus_code-0.5.2 → argus_code-0.7.0}/tests/server/test_server.py +0 -0
  389. {argus_code-0.5.2 → argus_code-0.7.0}/tests/server/test_spa_fallback.py +0 -0
  390. {argus_code-0.5.2 → argus_code-0.7.0}/tests/server/test_week_of.py +0 -0
  391. /argus_code-0.5.2/.npmrc → /argus_code-0.7.0/tests/store/__init__.py +0 -0
  392. {argus_code-0.5.2 → argus_code-0.7.0}/tests/test_e2e.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: argus-code
3
- Version: 0.5.2
3
+ Version: 0.7.0
4
4
  Summary: Local-first dashboard for Claude Code cost, token, tool-usage, and full-text search analytics
5
5
  Project-URL: Homepage, https://github.com/KrishBhimani/argus-code
6
6
  Project-URL: Repository, https://github.com/KrishBhimani/argus-code.git
@@ -50,28 +50,46 @@ Requires-Dist: uvicorn[standard]>=0.32
50
50
  Requires-Dist: watchdog>=5.0
51
51
  Description-Content-Type: text/markdown
52
52
 
53
- # Argus
53
+ <div align="center">
54
54
 
55
- **The observability console for Claude Code — local-first, permanent, and honest about cost.**
55
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/logo.svg" width="84" alt="Argus logo">
56
56
 
57
- [![PyPI](https://img.shields.io/pypi/v/argus-code)](https://pypi.org/project/argus-code/)
58
- [![Python ≥ 3.11](https://img.shields.io/badge/python-%E2%89%A5%203.11-blue)](#requirements)
59
- [![License: MIT](https://img.shields.io/badge/license-MIT-green)](./LICENSE)
57
+ <h1>Argus</h1>
58
+
59
+ <p><strong>The observability console for Claude Code — local-first, permanent, and honest about cost.</strong></p>
60
+
61
+ <p>
62
+ <a href="#-quick-start"><b>Quick start</b></a> ·
63
+ <a href="#-a-tour"><b>Tour</b></a> ·
64
+ <a href="#-cli"><b>CLI</b></a> ·
65
+ <a href="#-privacy--security"><b>Privacy</b></a> ·
66
+ <a href="./ARCHITECTURE.md"><b>Architecture</b></a> ·
67
+ <a href="./CONTRIBUTING.md"><b>Contributing</b></a>
68
+ </p>
69
+
70
+ <p>
71
+ <a href="https://pypi.org/project/argus-code/"><img src="https://img.shields.io/pypi/v/argus-code?color=f0883e" alt="PyPI"></a>
72
+ <a href="https://pypi.org/project/argus-code/"><img src="https://img.shields.io/pypi/dm/argus-code?color=f0883e" alt="PyPI downloads"></a>
73
+ <a href="#-requirements"><img src="https://img.shields.io/badge/python-%E2%89%A5%203.11-blue" alt="Python ≥ 3.11"></a>
74
+ <a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="License: MIT"></a>
75
+ <a href="https://github.com/KrishBhimani/argus-code"><img src="https://img.shields.io/github/stars/KrishBhimani/argus-code?style=flat&logo=github&color=8b94a3" alt="GitHub stars"></a>
76
+ </p>
77
+
78
+ </div>
60
79
 
61
80
  Claude Code writes a detailed transcript of every session to `~/.claude/` — every turn,
62
- every token, every tool call, every sub-agent it spawned — and then **deletes it after
63
- 30 days**. Argus tails those files into a SQLite archive on your machine, prices each
64
- turn from a bundled table, and serves a dashboard at `http://localhost:4242` that
65
- answers the questions the transcripts never do:
81
+ every token, every tool call, every sub-agent it spawned — and then tells you almost
82
+ nothing about it. Argus tails those files into a SQLite archive on your machine, prices
83
+ each turn, and serves a dashboard at `http://localhost:4242` that answers the questions
84
+ the transcripts never do: *what am I spending, where did it go, and which turn made it
85
+ so?*
86
+
87
+ Nothing leaves your computer. No telemetry, no API calls, no embeddings — SQLite and a
88
+ static web app, bound to `127.0.0.1`.
66
89
 
67
- - *How much am I actually spending, and is it going up?*
68
- - *Which sessions were expensive — and which turn made them so?*
69
- - *Where do my tools fail, and when did that start?*
70
- - *What did that sub-agent get told, and what did it do?*
71
- - *When do I actually work, and on what?*
90
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/hero.png" alt="The Argus overview — tokens, cost, sessions and tool error rate at a glance">
72
91
 
73
- Nothing leaves your computer. No telemetry, no API calls, no embeddings — SQLite and
74
- a static web app, bound to `127.0.0.1`.
92
+ ## 🚀 Quick start
75
93
 
76
94
  ```sh
77
95
  pipx install argus-code # or: uv tool install argus-code
@@ -79,61 +97,109 @@ argus start
79
97
  ```
80
98
 
81
99
  Your browser opens once the first pass finishes (5–10 s for a typical install). From
82
- then on, every session you run is ingested live.
100
+ then on, every session you run is ingested live. All you need is Python ≥ 3.11 and a
101
+ `~/.claude/` directory or a Codex home — i.e. you've used Claude Code or Codex at least once.
83
102
 
84
- ---
103
+ **Codex too.** Argus also reads OpenAI Codex rollouts from `$CODEX_HOME` (default
104
+ `~/.codex`; only `sessions/` and `archived_sessions/` are read — never `auth.json`,
105
+ config or state databases). Codex sessions get the same treatment: per-response
106
+ turns and estimated cost (OpenAI's standard-tier API rates; Codex plans are usually
107
+ billed differently, so treat it as an API-equivalent figure), tool health, and
108
+ sub-agents folded under their parent thread. With both agents present the Sessions
109
+ page gains an agent filter and column.
85
110
 
86
- ## Why it exists
111
+ ## ✨ Why Argus
87
112
 
88
- Tools like `ccusage` read what's on disk *right now*. Claude Code rotates its own
89
- logs (`cleanupPeriodDays`, default 30), so "right now" is a sliding month. Once
90
- Argus has ingested a session into `~/.argus/argus.db` the row stays forever — a few
91
- months in, Argus remembers sessions Claude has already forgotten. **It accumulates.**
113
+ **It does forensics, not just totals.** Argus keeps the *structure* of every session —
114
+ turns, tool calls, sub-agents, cache reads — not just its sums. So you can find the
115
+ turn that blew the budget, the tool that quietly started failing last Tuesday, and
116
+ exactly what a sub-agent was told before it went off the rails.
92
117
 
93
- And because it keeps the *structure* of each session (turns, tool calls, sub-agents,
94
- cache hits), it can do forensics, not just totals.
118
+ **It watches for you.** Detectors re-check your data every 10 minutes against
119
+ historical baselines and file alerts — a tool whose error rate doubles, a project whose
120
+ weekly spend triples, a prompt cache that quietly stopped hitting — all flagged the day
121
+ it happens, not when you happen to notice.
95
122
 
96
- ---
123
+ **It accumulates.** Usage tools like `ccusage` read what's on disk *right now*, and
124
+ Claude Code rotates its own logs (`cleanupPeriodDays`, default 30) — so "right now" is
125
+ a sliding month. Once Argus has ingested a session into `~/.argus/argus.db` the row
126
+ stays forever; a few months in, Argus remembers sessions Claude has already forgotten.
97
127
 
98
- ## What you get
128
+ ## 🔭 A tour
99
129
 
100
- The dashboard is organised by the job you came to do.
130
+ ### Every session, priced
101
131
 
102
- ### Monitor
132
+ A virtualised, sortable grid of every session you've ever run, with inline token bars
133
+ and a **duration × tokens scatter** (log–log, coloured by model) that makes outliers
134
+ obvious. Filter by text, project, model or time window; export to CSV.
103
135
 
104
- | Page | What it answers |
105
- |---|---|
106
- | **Overview** | Four tiles — tokens, estimated cost, sessions, tool error rate — each with its **change vs. the previous window**. A "Needs attention" strip that is always visible (it says *all clear* when there's nothing). Tokens per day, stackable by model. A 90-day activity heatmap and a **weekday × hour** map of when you start sessions. Top sessions in the window. |
107
- | **Alerts** | The inbox for detector findings, with unseen / all / severity filters and a 30-day strip. Today's detector flags any tool whose error rate doubled against its 4-week baseline; more are planned. |
136
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/screenshots/sessions.png" alt="Sessions — sortable grid with duration × tokens scatter">
108
137
 
109
- ### Analyze
138
+ ### Session forensics
110
139
 
111
- | Page | What it answers |
112
- |---|---|
113
- | **Sessions** | A virtualised, sortable grid of every session with inline token bars. Above it, a **duration × tokens scatter** (log–log, coloured by model) that makes outliers obvious, or a per-project rollup. Filter by text, project, model, window. |
114
- | **Session detail** | Tiles, then a **session-shape minimap** — one bar per turn, cache reads beneath fresh tokens, failing turns in red; click a bar to jump. A cumulative-cost line. A compact timeline where every row expands into its tool calls, their sizes, status and output, and error text inline. Resumed sessions are stitched into one chronological thread. |
115
- | **Sub-agents** | For sessions that delegated: a sticky list with an at-a-glance strip (tokens per agent, red where one failed), filter and sort, and ↑↓ stepping. Each agent's **task as given**, tools, shape and full timeline, inline. |
116
- | **Tools** | Leaderboard with error segments, **tool calls per day** (columns / area / table), MCP servers, sub-agent invocations by type. |
117
- | **Models** | Tokens and cost per model, **$ per million tokens** as you actually experienced it, and each model's share over time. |
118
- | **Trends** | Built around **rates, not totals**: this period vs last, a run-rate projection, tokens per session, cache-read share, unit cost — plus the by-model lines, cumulative total and a full breakdown table. |
140
+ Click a session and you get its **shape** — one bar per turn, cache reads beneath fresh
141
+ tokens, failing turns in red, click a bar to jump — plus a cumulative-cost line, a tool
142
+ mix with error segments, and a timeline where every turn expands into its tool calls,
143
+ sizes, status and error text inline. Resumed sessions are stitched into one
144
+ chronological thread.
119
145
 
120
- ### Search *(opt-in)*
146
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/screenshots/session-detail.png" alt="Session detail — per-turn shape, cumulative cost, tool mix">
121
147
 
122
- Full-text search over every prompt you've typed **and** every assistant reply,
123
- thinking block and tool output. SQLite FTS5 — sub-millisecond, lexical,
124
- deterministic, offline. Off by default; see [Privacy](#privacy--security).
148
+ ### Sub-agent X-ray
125
149
 
126
- ### Govern
150
+ When a session delegates to sub-agents, Argus keeps each one: the **task as it was
151
+ given**, its tools, tokens, cost, shape and full timeline — with an at-a-glance strip
152
+ that turns red where an agent failed. No more guessing what that `Task` call actually
153
+ did.
127
154
 
128
- **Settings** (indexing toggle, pricing version, export, parse errors).
155
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/screenshots/subagents.png" alt="Sub-agents — task given, tools used, per-agent shape and cost">
129
156
 
130
- Every chart follows a few house rules: one axis per chart, a legend whenever there's
131
- more than one series, status colours always paired with an icon and a label, and a
132
- table view behind every chart. Tokens are exact; costs are estimates, and the UI says so.
157
+ ### Trends that use rates, not totals
133
158
 
134
- ---
159
+ This period vs last, a monthly run-rate projection, tokens per session, cache-read
160
+ share, and **$ per million tokens as you actually experienced it** — so you can tell
161
+ "I'm working more" apart from "each session got more expensive".
162
+
163
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/screenshots/trends.png" alt="Trends — weekly tokens by model, run rate, unit cost">
135
164
 
136
- ## CLI
165
+ ### Tool health
166
+
167
+ A leaderboard of every tool with its error share, calls per day stacked by tool, MCP
168
+ servers, and sub-agent invocations by type. Three detectors re-check the last 7 days
169
+ against a 4-week baseline every 10 minutes and file an **alert** when a tool's failures
170
+ double (`tool_error_rate_spike`), when a project's weekly spend multiplies
171
+ (`cost_spike`), or when its prompt-cache hit rate falls off a cliff
172
+ (`cache_hit_drop`) — so you notice the day something breaks, not the week after.
173
+
174
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/screenshots/tools.png" alt="Tools — leaderboard with error segments and calls per day">
175
+
176
+ ### Full-text search *(opt-in)*
177
+
178
+ Search every prompt you've typed **and** every assistant reply, thinking block and tool
179
+ output. SQLite FTS5 — sub-millisecond, lexical, deterministic, offline. Off by default;
180
+ see [Privacy](#-privacy--security).
181
+
182
+ ### House rules
183
+
184
+ Every chart follows a few rules: one axis per chart, a legend whenever there's more than
185
+ one series, status colours always paired with an icon and a label, and a table view
186
+ behind every chart. Tokens are exact; costs are estimates, and the UI says so.
187
+
188
+ ## 💻 CLI
189
+
190
+ ```sh
191
+ argus start # watcher + ingester + dashboard at :4242
192
+ argus daemon start # keep ingesting in the background (argusd)
193
+ argus indexing enable # opt in to full-text transcript search
194
+ argus pricing refresh # pull latest model prices from LiteLLM
195
+ argus claude init # scaffold a good .claude/ setup into a project
196
+ argus wipe # delete ~/.argus/ entirely
197
+ ```
198
+
199
+ `--help` works at every level.
200
+
201
+ <details>
202
+ <summary><b>Full command tree</b></summary>
137
203
 
138
204
  ```sh
139
205
  argus # top-level command group
@@ -162,14 +228,14 @@ argus # top-level command group
162
228
  └─ wipe # delete ~/.argus/ entirely
163
229
  ```
164
230
 
165
- `--help` works at every level.
231
+ </details>
166
232
 
167
- ### `argus daemon` — keep ingesting when the dashboard is closed
233
+ <details>
234
+ <summary><b><code>argus daemon</code> — keep ingesting when the dashboard is closed</b></summary>
168
235
 
169
- By default the watcher and detector scheduler run *inside* `argus start`; close it
170
- and ingestion stops. **argusd** moves that work into a long-running background
171
- process. It does not serve the dashboard — port 4242 is still only bound by
172
- `argus start`.
236
+ By default the watcher and detector scheduler run *inside* `argus start`; close it and
237
+ ingestion stops. **argusd** moves that work into a long-running background process. It
238
+ does not serve the dashboard — port 4242 is still only bound by `argus start`.
173
239
 
174
240
  ```sh
175
241
  argus daemon start # run argusd in the background (survives closing the terminal)
@@ -183,8 +249,8 @@ read-only viewer of the database the daemon keeps fresh (the sidebar footer says
183
249
  *argusd daemon*). When it isn't, `argus start` ingests in-process exactly as before.
184
250
 
185
251
  **Living with it.** Idle cost is negligible: the watcher is event-driven and the
186
- scheduler wakes every 10 minutes — expect ~40–70 MB RAM and no idle CPU. Logs rotate
187
- at ~1 MB × 3 in `~/.argus/argusd.log`. Things to know:
252
+ scheduler wakes every 10 minutes — expect ~40–70 MB RAM and no idle CPU. Logs rotate at
253
+ ~1 MB × 3 in `~/.argus/argusd.log`. Things to know:
188
254
 
189
255
  - **Restart after upgrading** (`argus daemon restart`) — a running daemon holds the old code.
190
256
  - **No auto-restart yet.** A crashed daemon stays down until you start it again; the stale PID file is cleaned up. OS-native autostart (`argus install`) is a follow-up.
@@ -192,18 +258,22 @@ at ~1 MB × 3 in `~/.argus/argusd.log`. Things to know:
192
258
  - **Windows `stop` is a hard kill** — safe (no critical in-memory state), but no `argusd stopped.` line lands in the log.
193
259
  - **Toggling search:** the dashboard's *Enable indexing* button indexes immediately; the CLI `argus indexing enable` flips the flag and backfills on the next `argus start` / `argus daemon restart`.
194
260
 
195
- ### `argus claude` — scaffold good agent config
261
+ </details>
262
+
263
+ <details>
264
+ <summary><b><code>argus claude</code> — scaffold good agent config</b></summary>
196
265
 
197
266
  Set things up well *before* you run, not just observe afterwards. `init` copies a
198
267
  template into a project: `CLAUDE.md` to the root, everything else into `.claude/`.
199
268
  Existing files are skipped (`--force` overwrites — except `CLAUDE.md`, which is never
200
269
  overwritten). The bundled `default` template ships a sensible `settings.json`, agents,
201
270
  commands, rules and a placeholder skill. Save your own project's setup with
202
- `template create`; user templates live in `~/.argus/templates/` and win over bundled ones.
271
+ `template create`; user templates live in `~/.argus/templates/` and win over bundled
272
+ ones.
203
273
 
204
- ---
274
+ </details>
205
275
 
206
- ## Privacy & security
276
+ ## 🔒 Privacy & security
207
277
 
208
278
  Argus is built for one person on one machine, and the defaults say so.
209
279
 
@@ -218,30 +288,25 @@ Argus is built for one person on one machine, and the defaults say so.
218
288
  Your data is one file, `~/.argus/argus.db`. `argus wipe` deletes it; so does `rm`.
219
289
  Vulnerability reports: [SECURITY.md](./SECURITY.md).
220
290
 
221
- ---
222
-
223
- ## How it works
291
+ ## ⚙️ How it works
224
292
 
225
293
  1. **Ingest.** A `watchdog` observer tails `~/.claude/projects/<project>/<session>.jsonl`. Lines are validated with `pydantic`, de-duplicated by `message.id`, and normalised into session / turn rows in SQLite (WAL mode). Resumed sessions and sub-agent files are folded into their parent.
226
- 2. **Cost.** Per-turn cost comes from a bundled `pricing/<version>.json` sourced from [LiteLLM](https://github.com/BerriAI/litellm). Tokens are exact; costs are estimates.
227
- 3. **Tools.** Each `tool_use` block becomes a `tool_calls` row; errors come from the matching `tool_result`. MCP servers are parsed from `mcp__<server>__<tool>`; the `Agent` tool's `subagent_type` is kept so delegation is visible.
228
- 4. **Search (opt-in).** Two FTS5 tables: one over `~/.claude/history.jsonl` (every prompt, ~150 KB for a heavy user), one over assistant text, thinking, user content and tool output (~30–60 MB for hundreds of sessions). Indexed incrementally during the normal ingest tick.
229
- 5. **Detection.** A scheduler thread runs registered *detectors* every 10 minutes. Each reads the DB and returns findings; the scheduler upserts them into `alerts` with a seen / resolved lifecycle, so an issue that recovers and recurs fires again instead of staying silent.
230
- 6. **Dashboard.** A Vite + React single-page app (uPlot and hand-drawn SVG charts), statically built and served by the FastAPI app. Analyses that aren't in the API yet — prior-window deltas, tokens per session, cache-read share, calls per day — are derived client-side from the existing endpoints. No Node at runtime, no network beyond `/api/*`.
231
- 7. **One runtime, two hosts.** The watcher, scheduler and first-pass ingest live in a single `CoreRuntime` that both `argus start` and `argusd` construct, so they can never double-ingest.
294
+ 2. **Cost.** Per-turn cost comes from a bundled price table sourced from [LiteLLM](https://github.com/BerriAI/litellm). Tokens are exact; costs are estimates.
295
+ 3. **Tools.** Each `tool_use` block becomes a row; errors come from the matching `tool_result`. MCP servers are parsed from `mcp__<server>__<tool>`; the `Agent` tool's `subagent_type` is kept so delegation is visible.
296
+ 4. **Search (opt-in).** Two FTS5 tables — one over your prompt history, one over transcript text — indexed incrementally during the normal ingest tick.
297
+ 5. **Detection.** A scheduler runs registered *detectors* every 10 minutes; findings land in an alerts inbox with a seen / resolved lifecycle, so an issue that recovers and recurs fires again instead of staying silent.
298
+ 6. **Dashboard.** A Vite + React single-page app (uPlot and hand-drawn SVG charts), statically built and served by the FastAPI app. No Node at runtime, no network beyond `/api/*`.
232
299
 
233
300
  Want the deeper tour? [ARCHITECTURE.md](./ARCHITECTURE.md).
234
301
 
235
- ---
236
-
237
- ## Configuration
302
+ ## 🔧 Configuration
238
303
 
239
304
  | Where | Knob |
240
305
  |---|---|
241
306
  | `argus start --port <n>` | Port (default 4242). |
242
307
  | `argus start --host <h>` | Bind host (default `127.0.0.1`; `0.0.0.0` for LAN exposure). |
243
308
  | `argus start --data-dir <path>` | Override `~/.argus/`. |
244
- | `pricing/*.json` | Bundled price tables; refresh with `argus pricing refresh`. |
309
+ | `argus pricing refresh` | Fetch the latest price table into `~/.argus/pricing/` (newest table wins). |
245
310
 
246
311
  ### Keep more history in Claude Code itself
247
312
 
@@ -254,14 +319,12 @@ Claude Code deletes session files after 30 days by default. Raise it in
254
319
 
255
320
  Argus keeps its own copy regardless — this only widens what Claude itself retains.
256
321
 
257
- ## Requirements
322
+ ## 📋 Requirements
258
323
 
259
324
  - **Python ≥ 3.11** with an FTS5-enabled `sqlite3` (the standard CPython builds for macOS, Linux and Windows all are; Argus checks at startup and says so clearly if not).
260
- - A `~/.claude/` directory with real session JSONL — i.e. you've used Claude Code at least once.
325
+ - A `~/.claude/` directory with real session JSONL, or a Codex home (`$CODEX_HOME`, default `~/.codex`) with rollouts under `sessions/`.
261
326
 
262
- ---
263
-
264
- ## Development
327
+ ## 🛠️ Development
265
328
 
266
329
  ```sh
267
330
  git clone https://github.com/KrishBhimani/argus-code.git
@@ -276,9 +339,12 @@ proxies `/api` to a running `argus start`; `npm test`, `npm run build`, `npm run
276
339
  and `npm run e2e` are the gates. The built copy in `dashboard-dist/` ships inside the
277
340
  wheel, so end users never touch `npm`. See [CONTRIBUTING.md](./CONTRIBUTING.md).
278
341
 
342
+ <details>
343
+ <summary><b>Repository layout</b></summary>
344
+
279
345
  ```
280
346
  python/argus/ Python ingest, store, server, CLI
281
- adapters/ Claude Code JSONL parsers + adapter registry
347
+ adapters/ Claude Code + Codex parsers + adapter registry
282
348
  store/ SQLite schema + migrations + repo
283
349
  server/ FastAPI app + /api routes
284
350
  collector/ watcher + pipeline + first-run + search backfill + alert scheduler
@@ -295,6 +361,18 @@ templates/ Bundled .claude/ scaffolding templates (shipped in wheel a
295
361
  tests/ pytest suite, mirrors python/argus/ layout
296
362
  ```
297
363
 
298
- ## License
364
+ </details>
365
+
366
+ ---
367
+
368
+ <div align="center">
369
+
370
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/logo.svg" width="36" alt="">
371
+
372
+ <p>MIT — see <a href="./LICENSE">LICENSE</a>.</p>
373
+
374
+ <p><i>Named for Argus Panoptes — the watchman with a hundred eyes, who never slept.</i></p>
375
+
376
+ <p>If it keeps good watch for you, a ⭐ helps other Claude Code users find it.</p>
299
377
 
300
- MIT — see [LICENSE](./LICENSE).
378
+ </div>