argus-code 0.5.2__tar.gz → 0.6.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 (386) hide show
  1. argus_code-0.6.0/.claude/settings.local.json +7 -0
  2. {argus_code-0.5.2 → argus_code-0.6.0}/AGENTS.md +11 -0
  3. {argus_code-0.5.2 → argus_code-0.6.0}/ARCHITECTURE.md +31 -5
  4. {argus_code-0.5.2 → argus_code-0.6.0}/PKG-INFO +155 -85
  5. argus_code-0.6.0/README.md +318 -0
  6. {argus_code-0.5.2 → argus_code-0.6.0}/TESTING.md +29 -0
  7. argus_code-0.6.0/assets/hero.png +0 -0
  8. argus_code-0.6.0/assets/logo.svg +7 -0
  9. argus_code-0.6.0/assets/screenshots/alerts.png +0 -0
  10. argus_code-0.6.0/assets/screenshots/models.png +0 -0
  11. argus_code-0.6.0/assets/screenshots/overview.png +0 -0
  12. argus_code-0.6.0/assets/screenshots/search.png +0 -0
  13. argus_code-0.6.0/assets/screenshots/session-detail.png +0 -0
  14. argus_code-0.6.0/assets/screenshots/session-timeline.png +0 -0
  15. argus_code-0.6.0/assets/screenshots/sessions.png +0 -0
  16. argus_code-0.6.0/assets/screenshots/settings.png +0 -0
  17. argus_code-0.6.0/assets/screenshots/subagents.png +0 -0
  18. argus_code-0.6.0/assets/screenshots/tools.png +0 -0
  19. argus_code-0.6.0/assets/screenshots/trends.png +0 -0
  20. argus_code-0.6.0/assets - Shortcut.lnk +0 -0
  21. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/AGENTS.md +6 -0
  22. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Tile.test.tsx +11 -3
  23. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Tile.tsx +11 -1
  24. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/alerts/AlertsPage.tsx +11 -4
  25. argus_code-0.6.0/dashboard/src/features/overview/useOverviewModel.test.ts +33 -0
  26. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/overview/useOverviewModel.ts +15 -17
  27. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/rollups.test.ts +1 -8
  28. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/rollups.ts +0 -12
  29. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/windows.test.ts +3 -5
  30. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/windows.ts +0 -10
  31. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/overview.json +1 -1
  32. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/api/client.ts +8 -2
  33. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/api/hooks.ts +5 -3
  34. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/api/schemas.ts +2 -0
  35. argus_code-0.6.0/dashboard/src/lib/api/timezone.test.ts +48 -0
  36. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routeTree.gen.ts +273 -273
  37. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/tsconfig.json +1 -2
  38. argus_code-0.6.0/dashboard-dist/assets/AlertsPage-wRJbF_gs.js +1 -0
  39. argus_code-0.5.2/dashboard-dist/assets/AreaLine-BQsLuA8C.js → argus_code-0.6.0/dashboard-dist/assets/AreaLine-DULy1vR8.js +1 -1
  40. argus_code-0.5.2/dashboard-dist/assets/AttentionStrip-C1RqWKWe.js → argus_code-0.6.0/dashboard-dist/assets/AttentionStrip-0x1TKexK.js +1 -1
  41. argus_code-0.5.2/dashboard-dist/assets/Bars-DMb_quIu.js → argus_code-0.6.0/dashboard-dist/assets/Bars-DGflHvWv.js +1 -1
  42. argus_code-0.5.2/dashboard-dist/assets/Button-CpS_v0eC.js → argus_code-0.6.0/dashboard-dist/assets/Button-CaBiDq5j.js +1 -1
  43. argus_code-0.5.2/dashboard-dist/assets/ChartTable-BVgzTIE9.js → argus_code-0.6.0/dashboard-dist/assets/ChartTable-DnQkfC-d.js +1 -1
  44. argus_code-0.5.2/dashboard-dist/assets/Chip-CFh85KNf.js → argus_code-0.6.0/dashboard-dist/assets/Chip-CIL0lYXp.js +1 -1
  45. argus_code-0.5.2/dashboard-dist/assets/ErrorPanel-CI3QUuQD.js → argus_code-0.6.0/dashboard-dist/assets/ErrorPanel-JuK3IhI4.js +1 -1
  46. argus_code-0.5.2/dashboard-dist/assets/ModelsPage-B7cswqCK.js → argus_code-0.6.0/dashboard-dist/assets/ModelsPage-Cr6lRqQu.js +1 -1
  47. argus_code-0.6.0/dashboard-dist/assets/MultiLine-PWsvBuFC.js +1 -0
  48. argus_code-0.6.0/dashboard-dist/assets/OverviewPage-aSPc0cOY.js +1 -0
  49. argus_code-0.5.2/dashboard-dist/assets/Panel-CJXvZgtF.js → argus_code-0.6.0/dashboard-dist/assets/Panel-NdM4AeT3.js +1 -1
  50. argus_code-0.5.2/dashboard-dist/assets/SearchPage-C9-thlw8.js → argus_code-0.6.0/dashboard-dist/assets/SearchPage-DjBBvR08.js +1 -1
  51. argus_code-0.5.2/dashboard-dist/assets/SessionPage-D9AQ-1zV.js → argus_code-0.6.0/dashboard-dist/assets/SessionPage-UuHPkPWG.js +1 -1
  52. argus_code-0.5.2/dashboard-dist/assets/SessionsPage-DQuMS1ZJ.js → argus_code-0.6.0/dashboard-dist/assets/SessionsPage-BUzlxT4V.js +1 -1
  53. argus_code-0.5.2/dashboard-dist/assets/SettingsPage-ngGLbFIg.js → argus_code-0.6.0/dashboard-dist/assets/SettingsPage-DhimL0WE.js +1 -1
  54. argus_code-0.5.2/dashboard-dist/assets/StackedColumns-Dow8yAFe.js → argus_code-0.6.0/dashboard-dist/assets/StackedColumns-1_v1JDXl.js +1 -1
  55. argus_code-0.6.0/dashboard-dist/assets/Tile-C4mpgbF2.js +1 -0
  56. argus_code-0.5.2/dashboard-dist/assets/TimelineTab-DfQceFmu.js → argus_code-0.6.0/dashboard-dist/assets/TimelineTab-CaaXFc1o.js +1 -1
  57. argus_code-0.5.2/dashboard-dist/assets/ToolsPage-DrFNg1A7.js → argus_code-0.6.0/dashboard-dist/assets/ToolsPage-gfkohaLX.js +1 -1
  58. argus_code-0.5.2/dashboard-dist/assets/TrendsPage-CYu9wobK.js → argus_code-0.6.0/dashboard-dist/assets/TrendsPage-D0LVzVow.js +1 -1
  59. argus_code-0.6.0/dashboard-dist/assets/index-B3DMfZOx.js +50 -0
  60. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/index-CpQkAwD7.css +1 -1
  61. argus_code-0.6.0/dashboard-dist/assets/rollups-Dqiwg3gD.js +1 -0
  62. argus_code-0.5.2/dashboard-dist/assets/uplotTheme-CBSv2dtb.js → argus_code-0.6.0/dashboard-dist/assets/uplotTheme-eHUsIKi3.js +1 -1
  63. argus_code-0.6.0/dashboard-dist/assets/windows-B3y4OLGl.js +1 -0
  64. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/index.html +1 -1
  65. argus_code-0.6.0/pricing/2026-09-22.json +31 -0
  66. {argus_code-0.5.2 → argus_code-0.6.0}/pyproject.toml +1 -1
  67. argus_code-0.6.0/python/argus/AGENTS.md +114 -0
  68. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/__init__.py +1 -1
  69. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/AGENTS.md +16 -0
  70. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/base.py +4 -0
  71. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/claude_code/extract_tool_calls.py +34 -10
  72. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/claude_code/extract_turns.py +46 -11
  73. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/claude_code/ingest_file.py +25 -9
  74. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/cli.py +53 -32
  75. argus_code-0.6.0/python/argus/collector/AGENTS.md +96 -0
  76. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/collector/aggregate.py +25 -2
  77. argus_code-0.6.0/python/argus/collector/first_run.py +564 -0
  78. argus_code-0.6.0/python/argus/collector/pipeline.py +415 -0
  79. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/collector/scheduler.py +8 -2
  80. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/collector/search_backfill.py +68 -24
  81. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/collector/watcher.py +12 -3
  82. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/core/runtime.py +46 -16
  83. argus_code-0.6.0/python/argus/daemon/pidfile.py +281 -0
  84. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/daemon/process.py +23 -6
  85. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/daemon/service.py +2 -2
  86. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/detectors/__init__.py +2 -0
  87. argus_code-0.6.0/python/argus/detectors/base.py +59 -0
  88. argus_code-0.6.0/python/argus/detectors/cache_hit_drop.py +129 -0
  89. argus_code-0.6.0/python/argus/detectors/cost_spike.py +128 -0
  90. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/detectors/tool_error_rate_spike.py +3 -11
  91. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/pricing/compute.py +17 -0
  92. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/pricing/load.py +27 -5
  93. argus_code-0.6.0/python/argus/scaffold/snapshot.py +191 -0
  94. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/server/AGENTS.md +11 -1
  95. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/server/api.py +43 -13
  96. argus_code-0.6.0/python/argus/store/AGENTS.md +83 -0
  97. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/store/db.py +59 -1
  98. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/store/migrations/inline.py +8 -0
  99. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/store/repository.py +446 -47
  100. argus_code-0.6.0/scripts/screenshots/capture.mjs +176 -0
  101. argus_code-0.6.0/scripts/screenshots/frame.mjs +67 -0
  102. {argus_code-0.5.2 → argus_code-0.6.0}/tests/AGENTS.md +3 -2
  103. argus_code-0.6.0/tests/cli/test_pricing_refresh_cli.py +43 -0
  104. {argus_code-0.5.2 → argus_code-0.6.0}/tests/collector/test_first_run.py +82 -0
  105. argus_code-0.6.0/tests/collector/test_fork_dedup.py +182 -0
  106. argus_code-0.6.0/tests/collector/test_fork_dedup_db.py +103 -0
  107. argus_code-0.6.0/tests/collector/test_incremental_invariant.py +286 -0
  108. argus_code-0.6.0/tests/collector/test_incremental_repairs.py +110 -0
  109. {argus_code-0.5.2 → argus_code-0.6.0}/tests/collector/test_pipeline.py +54 -0
  110. {argus_code-0.5.2 → argus_code-0.6.0}/tests/conftest.py +5 -2
  111. {argus_code-0.5.2 → argus_code-0.6.0}/tests/core/test_runtime.py +5 -4
  112. argus_code-0.6.0/tests/core/test_runtime_shutdown.py +236 -0
  113. argus_code-0.6.0/tests/daemon/test_pidfile_identity.py +244 -0
  114. {argus_code-0.5.2 → argus_code-0.6.0}/tests/daemon/test_process.py +8 -0
  115. {argus_code-0.5.2 → argus_code-0.6.0}/tests/daemon/test_service.py +14 -8
  116. argus_code-0.6.0/tests/detectors/test_base_helpers.py +35 -0
  117. argus_code-0.6.0/tests/detectors/test_cache_hit_drop.py +153 -0
  118. argus_code-0.6.0/tests/detectors/test_cost_spike.py +191 -0
  119. {argus_code-0.5.2 → argus_code-0.6.0}/tests/detectors/test_registry.py +6 -3
  120. {argus_code-0.5.2 → argus_code-0.6.0}/tests/pricing/test_compute.py +19 -0
  121. argus_code-0.6.0/tests/pricing/test_load.py +88 -0
  122. argus_code-0.6.0/tests/scaffold/test_snapshot_secrets.py +246 -0
  123. argus_code-0.6.0/tests/server/test_day_buckets.py +100 -0
  124. {argus_code-0.5.2 → argus_code-0.6.0}/tests/store/test_db.py +66 -3
  125. {argus_code-0.5.2 → argus_code-0.6.0}/tests/store/test_repository.py +62 -0
  126. argus_code-0.6.0/tests/store/test_transactions.py +109 -0
  127. {argus_code-0.5.2 → argus_code-0.6.0}/uv.lock +1 -1
  128. argus_code-0.5.2/.xo/project.json +0 -7
  129. argus_code-0.5.2/README.md +0 -248
  130. argus_code-0.5.2/dashboard/src/features/overview/useOverviewModel.test.ts +0 -31
  131. argus_code-0.5.2/dashboard-dist/assets/AlertsPage-4HlLKV-X.js +0 -1
  132. argus_code-0.5.2/dashboard-dist/assets/MultiLine-m6Bb_pWg.js +0 -1
  133. argus_code-0.5.2/dashboard-dist/assets/OverviewPage-BJsuaA9A.js +0 -1
  134. argus_code-0.5.2/dashboard-dist/assets/Tile-5_GRUf2q.js +0 -1
  135. argus_code-0.5.2/dashboard-dist/assets/index-9L00WNJR.js +0 -50
  136. argus_code-0.5.2/dashboard-dist/assets/rollups-C1zMwbci.js +0 -1
  137. argus_code-0.5.2/dashboard-dist/assets/windows-7ctt19Z4.js +0 -1
  138. argus_code-0.5.2/python/argus/AGENTS.md +0 -60
  139. argus_code-0.5.2/python/argus/collector/AGENTS.md +0 -50
  140. argus_code-0.5.2/python/argus/collector/first_run.py +0 -321
  141. argus_code-0.5.2/python/argus/collector/pipeline.py +0 -198
  142. argus_code-0.5.2/python/argus/daemon/pidfile.py +0 -79
  143. argus_code-0.5.2/python/argus/detectors/base.py +0 -34
  144. argus_code-0.5.2/python/argus/scaffold/snapshot.py +0 -113
  145. argus_code-0.5.2/python/argus/store/AGENTS.md +0 -46
  146. argus_code-0.5.2/tests/pricing/test_load.py +0 -43
  147. argus_code-0.5.2/tests/scaffold/test_snapshot_secrets.py +0 -103
  148. {argus_code-0.5.2 → argus_code-0.6.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  149. {argus_code-0.5.2 → argus_code-0.6.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  150. {argus_code-0.5.2 → argus_code-0.6.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  151. {argus_code-0.5.2 → argus_code-0.6.0}/.github/pull_request_template.md +0 -0
  152. {argus_code-0.5.2 → argus_code-0.6.0}/.github/workflows/test.yml +0 -0
  153. {argus_code-0.5.2 → argus_code-0.6.0}/.gitignore +0 -0
  154. {argus_code-0.5.2 → argus_code-0.6.0}/.npmrc +0 -0
  155. {argus_code-0.5.2 → argus_code-0.6.0}/CLAUDE.md +0 -0
  156. {argus_code-0.5.2 → argus_code-0.6.0}/CONTRIBUTING.md +0 -0
  157. {argus_code-0.5.2 → argus_code-0.6.0}/LICENSE +0 -0
  158. {argus_code-0.5.2 → argus_code-0.6.0}/NOTICE +0 -0
  159. {argus_code-0.5.2 → argus_code-0.6.0}/PRD.md +0 -0
  160. {argus_code-0.5.2 → argus_code-0.6.0}/SECURITY.md +0 -0
  161. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/.astro/content-assets.mjs +0 -0
  162. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/.astro/content-modules.mjs +0 -0
  163. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/.astro/content.d.ts +0 -0
  164. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/.astro/types.d.ts +0 -0
  165. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/e2e/smoke.spec.ts +0 -0
  166. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/index.html +0 -0
  167. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/package-lock.json +0 -0
  168. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/package.json +0 -0
  169. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/playwright.config.ts +0 -0
  170. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/scripts/size.mjs +0 -0
  171. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/App.test.tsx +0 -0
  172. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/app/queryClient.ts +0 -0
  173. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/app/router.tsx +0 -0
  174. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/app/shell/CommandPalette.test.tsx +0 -0
  175. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/app/shell/CommandPalette.tsx +0 -0
  176. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/app/shell/Shell.tsx +0 -0
  177. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/app/shell/Sidebar.test.tsx +0 -0
  178. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/app/shell/Sidebar.tsx +0 -0
  179. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/app/shell/TopBar.tsx +0 -0
  180. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/AlertStrip.tsx +0 -0
  181. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/AreaLine.test.tsx +0 -0
  182. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/AreaLine.tsx +0 -0
  183. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/Bars.test.tsx +0 -0
  184. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/Bars.tsx +0 -0
  185. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/CalendarHeatmap.test.tsx +0 -0
  186. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/CalendarHeatmap.tsx +0 -0
  187. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/ChartTable.tsx +0 -0
  188. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/GridHeatmap.tsx +0 -0
  189. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/Legend.tsx +0 -0
  190. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/Meter.test.tsx +0 -0
  191. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/Meter.tsx +0 -0
  192. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/Minimap.test.tsx +0 -0
  193. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/Minimap.tsx +0 -0
  194. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/MultiLine.tsx +0 -0
  195. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/README.md +0 -0
  196. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/Scatter.tsx +0 -0
  197. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/Sparkline.tsx +0 -0
  198. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/StackedColumns.tsx +0 -0
  199. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/UPlotChart.tsx +0 -0
  200. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/ramp.ts +0 -0
  201. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/charts/uplotTheme.ts +0 -0
  202. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Button.tsx +0 -0
  203. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Chip.tsx +0 -0
  204. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/CopyId.tsx +0 -0
  205. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/DataTable.tsx +0 -0
  206. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/EmptyState.tsx +0 -0
  207. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/ErrorPanel.tsx +0 -0
  208. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Icon.tsx +0 -0
  209. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Kbd.tsx +0 -0
  210. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Panel.tsx +0 -0
  211. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Pill.test.tsx +0 -0
  212. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Pill.tsx +0 -0
  213. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Seg.test.tsx +0 -0
  214. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Seg.tsx +0 -0
  215. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/components/ui/Skeleton.tsx +0 -0
  216. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/models/ModelsPage.tsx +0 -0
  217. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/overview/AttentionStrip.tsx +0 -0
  218. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/overview/OverviewPage.tsx +0 -0
  219. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/overview/TopSessions.tsx +0 -0
  220. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/search/SearchPage.tsx +0 -0
  221. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/search/cleanSnippet.test.ts +0 -0
  222. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/search/cleanSnippet.ts +0 -0
  223. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/session/OverviewTab.tsx +0 -0
  224. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/session/SessionPage.tsx +0 -0
  225. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/session/SubagentsTab.tsx +0 -0
  226. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/session/TimelineTab.tsx +0 -0
  227. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/session/model.test.ts +0 -0
  228. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/session/model.ts +0 -0
  229. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/sessions/AnalysisStrip.tsx +0 -0
  230. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/sessions/SessionsPage.tsx +0 -0
  231. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/sessions/SessionsTable.tsx +0 -0
  232. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/sessions/filters.test.ts +0 -0
  233. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/sessions/filters.ts +0 -0
  234. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/settings/SettingsPage.tsx +0 -0
  235. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/tools/ToolsPage.tsx +0 -0
  236. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/tools/toolsOverTime.test.ts +0 -0
  237. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/tools/toolsOverTime.ts +0 -0
  238. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/features/trends/TrendsPage.tsx +0 -0
  239. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/composition.test.ts +0 -0
  240. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/composition.ts +0 -0
  241. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/cumulative.test.ts +0 -0
  242. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/cumulative.ts +0 -0
  243. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/deltas.test.ts +0 -0
  244. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/deltas.ts +0 -0
  245. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/hourWeekday.test.ts +0 -0
  246. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/hourWeekday.ts +0 -0
  247. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/series.test.ts +0 -0
  248. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/series.ts +0 -0
  249. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/testutil.ts +0 -0
  250. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/trendsMetrics.test.ts +0 -0
  251. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/analysis/trendsMetrics.ts +0 -0
  252. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/alerts.json +0 -0
  253. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/sessions.json +0 -0
  254. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/timeline.json +0 -0
  255. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/tools-overview.json +0 -0
  256. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/trends.json +0 -0
  257. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/api/client.test.ts +0 -0
  258. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/format/format.test.ts +0 -0
  259. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/lib/format/format.ts +0 -0
  260. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/main.tsx +0 -0
  261. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/__root.tsx +0 -0
  262. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/alerts.tsx +0 -0
  263. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/index.tsx +0 -0
  264. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/models.tsx +0 -0
  265. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/prompts.tsx +0 -0
  266. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/search.tsx +0 -0
  267. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/session.tsx +0 -0
  268. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/sessions.$id.tsx +0 -0
  269. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/sessions.index.tsx +0 -0
  270. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/settings.tsx +0 -0
  271. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/tools.tsx +0 -0
  272. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/routes/trends.tsx +0 -0
  273. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/src/styles.css +0 -0
  274. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/vite.config.ts +0 -0
  275. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/vitest.config.ts +0 -0
  276. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard/vitest.setup.ts +0 -0
  277. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/cumulative-C3-3HW0n.js +0 -0
  278. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  279. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  280. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  281. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  282. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  283. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  284. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  285. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  286. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  287. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  288. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/series-BjP-80tt.js +0 -0
  289. {argus_code-0.5.2 → argus_code-0.6.0}/dashboard-dist/assets/uplotTheme-D1GxaB_c.css +0 -0
  290. {argus_code-0.5.2 → argus_code-0.6.0}/pricing/2026-05-02.json +0 -0
  291. {argus_code-0.5.2 → argus_code-0.6.0}/pricing/2026-06-12.json +0 -0
  292. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/__init__.py +0 -0
  293. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/claude_code/__init__.py +0 -0
  294. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/claude_code/adapter.py +0 -0
  295. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/claude_code/discover.py +0 -0
  296. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/claude_code/extract_transcript.py +0 -0
  297. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/claude_code/history_jsonl.py +0 -0
  298. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/claude_code/model.py +0 -0
  299. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/claude_code/schemas.py +0 -0
  300. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/adapters/registry.py +0 -0
  301. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/collector/__init__.py +0 -0
  302. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/collector/rollup_subagents.py +0 -0
  303. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/core/__init__.py +0 -0
  304. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/daemon/__init__.py +0 -0
  305. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/daemon/logging.py +0 -0
  306. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/detectors/registry.py +0 -0
  307. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/pricing/__init__.py +0 -0
  308. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/pricing/refresh.py +0 -0
  309. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/pricing/types.py +0 -0
  310. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/scaffold/__init__.py +0 -0
  311. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/scaffold/scaffolder.py +0 -0
  312. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/scaffold/storage.py +0 -0
  313. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/schema/__init__.py +0 -0
  314. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/schema/types.py +0 -0
  315. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/server/__init__.py +0 -0
  316. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/server/app.py +0 -0
  317. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/store/__init__.py +0 -0
  318. {argus_code-0.5.2 → argus_code-0.6.0}/python/argus/store/migrations/__init__.py +0 -0
  319. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/agents/code-reviewer.md +0 -0
  320. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/agents/security-auditor.md +0 -0
  321. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/commands/commit.md +0 -0
  322. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/commands/deploy.md +0 -0
  323. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/commands/fix-issue.md +0 -0
  324. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/commands/pr.md +0 -0
  325. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/commands/review.md +0 -0
  326. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/rules/api-conventions.md +0 -0
  327. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/rules/code-style.md +0 -0
  328. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/rules/testing.md +0 -0
  329. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/settings.json +0 -0
  330. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/.claude/skills/example/SKILL.md +0 -0
  331. {argus_code-0.5.2 → argus_code-0.6.0}/templates/default/CLAUDE.md +0 -0
  332. {argus_code-0.5.2 → argus_code-0.6.0}/tests/__init__.py +0 -0
  333. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/__init__.py +0 -0
  334. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/__init__.py +0 -0
  335. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_adapter.py +0 -0
  336. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_discover.py +0 -0
  337. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_extract_tool_calls.py +0 -0
  338. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_extract_transcript.py +0 -0
  339. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_extract_turns.py +0 -0
  340. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_history_jsonl.py +0 -0
  341. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_ingest_file.py +0 -0
  342. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_integration.py +0 -0
  343. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_model.py +0 -0
  344. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_path_containment.py +0 -0
  345. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/claude_code/test_schemas.py +0 -0
  346. {argus_code-0.5.2 → argus_code-0.6.0}/tests/adapters/test_registry.py +0 -0
  347. {argus_code-0.5.2 → argus_code-0.6.0}/tests/cli/__init__.py +0 -0
  348. {argus_code-0.5.2 → argus_code-0.6.0}/tests/cli/test_indexing_cli.py +0 -0
  349. {argus_code-0.5.2 → argus_code-0.6.0}/tests/collector/__init__.py +0 -0
  350. {argus_code-0.5.2 → argus_code-0.6.0}/tests/collector/test_aggregate.py +0 -0
  351. {argus_code-0.5.2 → argus_code-0.6.0}/tests/collector/test_first_run_shutdown.py +0 -0
  352. {argus_code-0.5.2 → argus_code-0.6.0}/tests/collector/test_rollup_subagents.py +0 -0
  353. {argus_code-0.5.2 → argus_code-0.6.0}/tests/collector/test_scheduler.py +0 -0
  354. {argus_code-0.5.2 → argus_code-0.6.0}/tests/collector/test_watcher.py +0 -0
  355. {argus_code-0.5.2 → argus_code-0.6.0}/tests/core/__init__.py +0 -0
  356. {argus_code-0.5.2 → argus_code-0.6.0}/tests/daemon/__init__.py +0 -0
  357. {argus_code-0.5.2 → argus_code-0.6.0}/tests/daemon/test_logs.py +0 -0
  358. {argus_code-0.5.2 → argus_code-0.6.0}/tests/daemon/test_no_claude_dir.py +0 -0
  359. {argus_code-0.5.2 → argus_code-0.6.0}/tests/daemon/test_pidfile.py +0 -0
  360. {argus_code-0.5.2 → argus_code-0.6.0}/tests/daemon/test_spawn_safe_path.py +0 -0
  361. {argus_code-0.5.2 → argus_code-0.6.0}/tests/daemon/test_yield.py +0 -0
  362. {argus_code-0.5.2 → argus_code-0.6.0}/tests/dashboard/__init__.py +0 -0
  363. {argus_code-0.5.2 → argus_code-0.6.0}/tests/dashboard/test_no_raw_html.py +0 -0
  364. {argus_code-0.5.2 → argus_code-0.6.0}/tests/detectors/__init__.py +0 -0
  365. {argus_code-0.5.2 → argus_code-0.6.0}/tests/detectors/test_tool_error_rate_spike.py +0 -0
  366. {argus_code-0.5.2 → argus_code-0.6.0}/tests/pricing/__init__.py +0 -0
  367. {argus_code-0.5.2 → argus_code-0.6.0}/tests/pricing/test_refresh.py +0 -0
  368. {argus_code-0.5.2 → argus_code-0.6.0}/tests/scaffold/__init__.py +0 -0
  369. {argus_code-0.5.2 → argus_code-0.6.0}/tests/scaffold/test_bundled_template.py +0 -0
  370. {argus_code-0.5.2 → argus_code-0.6.0}/tests/scaffold/test_cli_claude.py +0 -0
  371. {argus_code-0.5.2 → argus_code-0.6.0}/tests/scaffold/test_scaffold_containment.py +0 -0
  372. {argus_code-0.5.2 → argus_code-0.6.0}/tests/scaffold/test_scaffolder.py +0 -0
  373. {argus_code-0.5.2 → argus_code-0.6.0}/tests/scaffold/test_snapshot.py +0 -0
  374. {argus_code-0.5.2 → argus_code-0.6.0}/tests/scaffold/test_storage.py +0 -0
  375. {argus_code-0.5.2 → argus_code-0.6.0}/tests/schema/__init__.py +0 -0
  376. {argus_code-0.5.2 → argus_code-0.6.0}/tests/schema/test_types.py +0 -0
  377. {argus_code-0.5.2 → argus_code-0.6.0}/tests/server/__init__.py +0 -0
  378. {argus_code-0.5.2 → argus_code-0.6.0}/tests/server/test_api.py +0 -0
  379. {argus_code-0.5.2 → argus_code-0.6.0}/tests/server/test_api_search.py +0 -0
  380. {argus_code-0.5.2 → argus_code-0.6.0}/tests/server/test_param_bounds.py +0 -0
  381. {argus_code-0.5.2 → argus_code-0.6.0}/tests/server/test_read_cache.py +0 -0
  382. {argus_code-0.5.2 → argus_code-0.6.0}/tests/server/test_server.py +0 -0
  383. {argus_code-0.5.2 → argus_code-0.6.0}/tests/server/test_spa_fallback.py +0 -0
  384. {argus_code-0.5.2 → argus_code-0.6.0}/tests/server/test_week_of.py +0 -0
  385. {argus_code-0.5.2 → argus_code-0.6.0}/tests/store/__init__.py +0 -0
  386. {argus_code-0.5.2 → argus_code-0.6.0}/tests/test_e2e.py +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "WebFetch(domain:raw.githubusercontent.com)"
5
+ ]
6
+ }
7
+ }
@@ -78,6 +78,17 @@ When cutting version `X.Y.Z`:
78
78
  token is the maintainer's secret; **an agent must never run this or handle the
79
79
  token.** Stop and hand off.
80
80
 
81
+ ### Screenshots (README + site)
82
+
83
+ `assets/` is the only tracked image location (`docs/` is gitignored). Regenerate
84
+ every dashboard screenshot with an Argus instance running on a spare port:
85
+ `uv run argus start --port 4243`, then
86
+ `node scripts/screenshots/capture.mjs --out <tmp>` and
87
+ `node scripts/screenshots/frame.mjs --in <tmp>`. Filenames are stable; the README
88
+ and the site repo (`KrishBhimani/argus`) hotlink them from `main`. The capture
89
+ script redacts the Settings parse-error paths in-page before shooting; extend the
90
+ same hook rather than editing images by hand.
91
+
81
92
  ## Work Guidance
82
93
 
83
94
  Global engineering rules (binding):
@@ -174,11 +174,37 @@ Rules that matter:
174
174
  side-effect in `python/argus/detectors/__init__.py` — same pattern as
175
175
  adapters. Adding one is a new file + the import line; no scheduler edits.
176
176
 
177
- The v1 detector (`tool_error_rate_spike`) compares each tool's last-7-day
178
- error rate against its preceding 4-week baseline and fires when the rate
179
- multiplies past a threshold — or breaks from a zero baseline. Cost was
180
- deliberately *not* the v1 signal: it's meaningless for Pro/Max users who
181
- don't pay per token.
177
+ Three detectors ship today. All of them compare a trailing 7-day **window**
178
+ against the 28 days immediately before it (the **baseline**), and all of them
179
+ gate on a volume floor so a quiet week can't fire:
180
+
181
+ | Detector | Keyed on | Fires when |
182
+ |---|---|---|
183
+ | `tool_error_rate_spike` | tool name | the window error rate is >= 2x the baseline rate (or breaks from a zero baseline) |
184
+ | `cost_spike` | project path | window spend is >= 2x the baseline's *per-week* average |
185
+ | `cache_hit_drop` | project path | the input-token cache hit rate falls >= 15 points below baseline |
186
+
187
+ Notes that shape those rules:
188
+
189
+ - **The baseline is up to four weeks long, so cost is compared per week**, not
190
+ per window — otherwise every project looks cheaper than its own history. The
191
+ weeks are the ones the project **existed** for (from its first turn, capped
192
+ at 4), and a project with under a week of history is skipped: dividing a
193
+ 10-day-old project's spend by 4 weeks made steady work read as a 9x spike
194
+ (77 of 137 alerts in a 100-day backtest on a real archive).
195
+ - **Cost was deliberately not the v1 signal:** it's meaningless as *money* for
196
+ Pro/Max users who don't pay per token. It survives as a v2 signal because it
197
+ still tracks how much work the agent did; the absolute dollar floors keep
198
+ small projects quiet.
199
+ - **`cache_hit_drop` divides by input tokens only** (`cache_read / (cache_read +
200
+ cache_write + fresh_input)`), unlike the dashboard's "cache read share" which
201
+ divides by all tokens. Output volume is not a caching regression, and cache
202
+ *writes* are exactly what a miss looks like. It measures the fall in
203
+ percentage points, not as a ratio: near the top of the range a ratio hides the
204
+ damage (96% -> 90% doubles the uncached input but reads as "0.94x").
205
+ - Both project-keyed detectors read one aggregate,
206
+ `Repository.project_turn_stats_in_range`, which attributes sub-agent turns to
207
+ the parent session's project.
182
208
 
183
209
  ## Scaffolding (`argus claude`)
184
210
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: argus-code
3
- Version: 0.5.2
3
+ Version: 0.6.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,101 @@ 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 — i.e. you've used Claude Code at least once.
83
102
 
84
- ---
103
+ ## ✨ Why Argus
85
104
 
86
- ## Why it exists
105
+ **It does forensics, not just totals.** Argus keeps the *structure* of every session —
106
+ turns, tool calls, sub-agents, cache reads — not just its sums. So you can find the
107
+ turn that blew the budget, the tool that quietly started failing last Tuesday, and
108
+ exactly what a sub-agent was told before it went off the rails.
87
109
 
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.**
110
+ **It watches for you.** Detectors re-check your data every 10 minutes against
111
+ historical baselines and file alerts — a tool whose error rate doubles, a project whose
112
+ weekly spend triples, a prompt cache that quietly stopped hitting — all flagged the day
113
+ it happens, not when you happen to notice.
92
114
 
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.
115
+ **It accumulates.** Usage tools like `ccusage` read what's on disk *right now*, and
116
+ Claude Code rotates its own logs (`cleanupPeriodDays`, default 30) — so "right now" is
117
+ a sliding month. Once Argus has ingested a session into `~/.argus/argus.db` the row
118
+ stays forever; a few months in, Argus remembers sessions Claude has already forgotten.
95
119
 
96
- ---
120
+ ## 🔭 A tour
97
121
 
98
- ## What you get
122
+ ### Every session, priced
99
123
 
100
- The dashboard is organised by the job you came to do.
124
+ A virtualised, sortable grid of every session you've ever run, with inline token bars
125
+ and a **duration × tokens scatter** (log–log, coloured by model) that makes outliers
126
+ obvious. Filter by text, project, model or time window; export to CSV.
101
127
 
102
- ### Monitor
128
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/screenshots/sessions.png" alt="Sessions — sortable grid with duration × tokens scatter">
103
129
 
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. |
130
+ ### Session forensics
108
131
 
109
- ### Analyze
132
+ Click a session and you get its **shape** — one bar per turn, cache reads beneath fresh
133
+ tokens, failing turns in red, click a bar to jump — plus a cumulative-cost line, a tool
134
+ mix with error segments, and a timeline where every turn expands into its tool calls,
135
+ sizes, status and error text inline. Resumed sessions are stitched into one
136
+ chronological thread.
110
137
 
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. |
138
+ <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">
119
139
 
120
- ### Search *(opt-in)*
140
+ ### Sub-agent X-ray
121
141
 
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).
142
+ When a session delegates to sub-agents, Argus keeps each one: the **task as it was
143
+ given**, its tools, tokens, cost, shape and full timeline — with an at-a-glance strip
144
+ that turns red where an agent failed. No more guessing what that `Task` call actually
145
+ did.
125
146
 
126
- ### Govern
147
+ <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">
127
148
 
128
- **Settings** (indexing toggle, pricing version, export, parse errors).
149
+ ### Trends that use rates, not totals
129
150
 
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.
151
+ This period vs last, a monthly run-rate projection, tokens per session, cache-read
152
+ share, and **$ per million tokens as you actually experienced it** — so you can tell
153
+ "I'm working more" apart from "each session got more expensive".
133
154
 
134
- ---
155
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/screenshots/trends.png" alt="Trends — weekly tokens by model, run rate, unit cost">
156
+
157
+ ### Tool health
158
+
159
+ A leaderboard of every tool with its error share, calls per day stacked by tool, MCP
160
+ servers, and sub-agent invocations by type. Three detectors re-check the last 7 days
161
+ against a 4-week baseline every 10 minutes and file an **alert** when a tool's failures
162
+ double (`tool_error_rate_spike`), when a project's weekly spend multiplies
163
+ (`cost_spike`), or when its prompt-cache hit rate falls off a cliff
164
+ (`cache_hit_drop`) — so you notice the day something breaks, not the week after.
165
+
166
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/screenshots/tools.png" alt="Tools — leaderboard with error segments and calls per day">
167
+
168
+ ### Full-text search *(opt-in)*
169
+
170
+ Search every prompt you've typed **and** every assistant reply, thinking block and tool
171
+ output. SQLite FTS5 — sub-millisecond, lexical, deterministic, offline. Off by default;
172
+ see [Privacy](#-privacy--security).
173
+
174
+ ### House rules
175
+
176
+ Every chart follows a few rules: one axis per chart, a legend whenever there's more than
177
+ one series, status colours always paired with an icon and a label, and a table view
178
+ behind every chart. Tokens are exact; costs are estimates, and the UI says so.
179
+
180
+ ## 💻 CLI
181
+
182
+ ```sh
183
+ argus start # watcher + ingester + dashboard at :4242
184
+ argus daemon start # keep ingesting in the background (argusd)
185
+ argus indexing enable # opt in to full-text transcript search
186
+ argus pricing refresh # pull latest model prices from LiteLLM
187
+ argus claude init # scaffold a good .claude/ setup into a project
188
+ argus wipe # delete ~/.argus/ entirely
189
+ ```
190
+
191
+ `--help` works at every level.
135
192
 
136
- ## CLI
193
+ <details>
194
+ <summary><b>Full command tree</b></summary>
137
195
 
138
196
  ```sh
139
197
  argus # top-level command group
@@ -162,14 +220,14 @@ argus # top-level command group
162
220
  └─ wipe # delete ~/.argus/ entirely
163
221
  ```
164
222
 
165
- `--help` works at every level.
223
+ </details>
166
224
 
167
- ### `argus daemon` — keep ingesting when the dashboard is closed
225
+ <details>
226
+ <summary><b><code>argus daemon</code> — keep ingesting when the dashboard is closed</b></summary>
168
227
 
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`.
228
+ By default the watcher and detector scheduler run *inside* `argus start`; close it and
229
+ ingestion stops. **argusd** moves that work into a long-running background process. It
230
+ does not serve the dashboard — port 4242 is still only bound by `argus start`.
173
231
 
174
232
  ```sh
175
233
  argus daemon start # run argusd in the background (survives closing the terminal)
@@ -183,8 +241,8 @@ read-only viewer of the database the daemon keeps fresh (the sidebar footer says
183
241
  *argusd daemon*). When it isn't, `argus start` ingests in-process exactly as before.
184
242
 
185
243
  **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:
244
+ scheduler wakes every 10 minutes — expect ~40–70 MB RAM and no idle CPU. Logs rotate at
245
+ ~1 MB × 3 in `~/.argus/argusd.log`. Things to know:
188
246
 
189
247
  - **Restart after upgrading** (`argus daemon restart`) — a running daemon holds the old code.
190
248
  - **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 +250,22 @@ at ~1 MB × 3 in `~/.argus/argusd.log`. Things to know:
192
250
  - **Windows `stop` is a hard kill** — safe (no critical in-memory state), but no `argusd stopped.` line lands in the log.
193
251
  - **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
252
 
195
- ### `argus claude` — scaffold good agent config
253
+ </details>
254
+
255
+ <details>
256
+ <summary><b><code>argus claude</code> — scaffold good agent config</b></summary>
196
257
 
197
258
  Set things up well *before* you run, not just observe afterwards. `init` copies a
198
259
  template into a project: `CLAUDE.md` to the root, everything else into `.claude/`.
199
260
  Existing files are skipped (`--force` overwrites — except `CLAUDE.md`, which is never
200
261
  overwritten). The bundled `default` template ships a sensible `settings.json`, agents,
201
262
  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.
263
+ `template create`; user templates live in `~/.argus/templates/` and win over bundled
264
+ ones.
203
265
 
204
- ---
266
+ </details>
205
267
 
206
- ## Privacy & security
268
+ ## 🔒 Privacy & security
207
269
 
208
270
  Argus is built for one person on one machine, and the defaults say so.
209
271
 
@@ -218,30 +280,25 @@ Argus is built for one person on one machine, and the defaults say so.
218
280
  Your data is one file, `~/.argus/argus.db`. `argus wipe` deletes it; so does `rm`.
219
281
  Vulnerability reports: [SECURITY.md](./SECURITY.md).
220
282
 
221
- ---
222
-
223
- ## How it works
283
+ ## ⚙️ How it works
224
284
 
225
285
  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.
286
+ 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.
287
+ 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.
288
+ 4. **Search (opt-in).** Two FTS5 tables — one over your prompt history, one over transcript text — indexed incrementally during the normal ingest tick.
289
+ 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.
290
+ 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
291
 
233
292
  Want the deeper tour? [ARCHITECTURE.md](./ARCHITECTURE.md).
234
293
 
235
- ---
236
-
237
- ## Configuration
294
+ ## 🔧 Configuration
238
295
 
239
296
  | Where | Knob |
240
297
  |---|---|
241
298
  | `argus start --port <n>` | Port (default 4242). |
242
299
  | `argus start --host <h>` | Bind host (default `127.0.0.1`; `0.0.0.0` for LAN exposure). |
243
300
  | `argus start --data-dir <path>` | Override `~/.argus/`. |
244
- | `pricing/*.json` | Bundled price tables; refresh with `argus pricing refresh`. |
301
+ | `argus pricing refresh` | Fetch the latest price table into `~/.argus/pricing/` (newest table wins). |
245
302
 
246
303
  ### Keep more history in Claude Code itself
247
304
 
@@ -254,14 +311,12 @@ Claude Code deletes session files after 30 days by default. Raise it in
254
311
 
255
312
  Argus keeps its own copy regardless — this only widens what Claude itself retains.
256
313
 
257
- ## Requirements
314
+ ## 📋 Requirements
258
315
 
259
316
  - **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
317
  - A `~/.claude/` directory with real session JSONL — i.e. you've used Claude Code at least once.
261
318
 
262
- ---
263
-
264
- ## Development
319
+ ## 🛠️ Development
265
320
 
266
321
  ```sh
267
322
  git clone https://github.com/KrishBhimani/argus-code.git
@@ -276,6 +331,9 @@ proxies `/api` to a running `argus start`; `npm test`, `npm run build`, `npm run
276
331
  and `npm run e2e` are the gates. The built copy in `dashboard-dist/` ships inside the
277
332
  wheel, so end users never touch `npm`. See [CONTRIBUTING.md](./CONTRIBUTING.md).
278
333
 
334
+ <details>
335
+ <summary><b>Repository layout</b></summary>
336
+
279
337
  ```
280
338
  python/argus/ Python ingest, store, server, CLI
281
339
  adapters/ Claude Code JSONL parsers + adapter registry
@@ -295,6 +353,18 @@ templates/ Bundled .claude/ scaffolding templates (shipped in wheel a
295
353
  tests/ pytest suite, mirrors python/argus/ layout
296
354
  ```
297
355
 
298
- ## License
356
+ </details>
357
+
358
+ ---
359
+
360
+ <div align="center">
361
+
362
+ <img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/logo.svg" width="36" alt="">
363
+
364
+ <p>MIT — see <a href="./LICENSE">LICENSE</a>.</p>
365
+
366
+ <p><i>Named for Argus Panoptes — the watchman with a hundred eyes, who never slept.</i></p>
367
+
368
+ <p>If it keeps good watch for you, a ⭐ helps other Claude Code users find it.</p>
299
369
 
300
- MIT — see [LICENSE](./LICENSE).
370
+ </div>