argus-code 0.5.1__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 (396) hide show
  1. argus_code-0.6.0/.claude/settings.local.json +7 -0
  2. {argus_code-0.5.1 → argus_code-0.6.0}/.github/workflows/test.yml +74 -74
  3. {argus_code-0.5.1 → argus_code-0.6.0}/AGENTS.md +11 -0
  4. {argus_code-0.5.1 → argus_code-0.6.0}/ARCHITECTURE.md +31 -5
  5. {argus_code-0.5.1 → argus_code-0.6.0}/NOTICE +22 -22
  6. {argus_code-0.5.1 → argus_code-0.6.0}/PKG-INFO +155 -86
  7. argus_code-0.6.0/README.md +318 -0
  8. {argus_code-0.5.1 → argus_code-0.6.0}/TESTING.md +29 -0
  9. argus_code-0.6.0/assets/hero.png +0 -0
  10. argus_code-0.6.0/assets/logo.svg +7 -0
  11. argus_code-0.6.0/assets/screenshots/alerts.png +0 -0
  12. argus_code-0.6.0/assets/screenshots/models.png +0 -0
  13. argus_code-0.6.0/assets/screenshots/overview.png +0 -0
  14. argus_code-0.6.0/assets/screenshots/search.png +0 -0
  15. argus_code-0.6.0/assets/screenshots/session-detail.png +0 -0
  16. argus_code-0.6.0/assets/screenshots/session-timeline.png +0 -0
  17. argus_code-0.6.0/assets/screenshots/sessions.png +0 -0
  18. argus_code-0.6.0/assets/screenshots/settings.png +0 -0
  19. argus_code-0.6.0/assets/screenshots/subagents.png +0 -0
  20. argus_code-0.6.0/assets/screenshots/tools.png +0 -0
  21. argus_code-0.6.0/assets/screenshots/trends.png +0 -0
  22. argus_code-0.6.0/assets - Shortcut.lnk +0 -0
  23. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/.astro/content.d.ts +155 -155
  24. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/.astro/types.d.ts +1 -1
  25. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/AGENTS.md +6 -0
  26. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/e2e/smoke.spec.ts +1 -1
  27. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/CommandPalette.tsx +1 -1
  28. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/Sidebar.tsx +2 -3
  29. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Tile.test.tsx +11 -3
  30. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Tile.tsx +11 -1
  31. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/alerts/AlertsPage.tsx +11 -4
  32. argus_code-0.6.0/dashboard/src/features/overview/useOverviewModel.test.ts +33 -0
  33. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/overview/useOverviewModel.ts +15 -17
  34. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/rollups.test.ts +1 -8
  35. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/rollups.ts +0 -12
  36. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/windows.test.ts +3 -5
  37. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/windows.ts +0 -10
  38. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/overview.json +1 -1
  39. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/client.ts +8 -2
  40. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/hooks.ts +5 -3
  41. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/schemas.ts +2 -0
  42. argus_code-0.6.0/dashboard/src/lib/api/timezone.test.ts +48 -0
  43. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routeTree.gen.ts +273 -294
  44. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/tsconfig.json +1 -2
  45. argus_code-0.6.0/dashboard-dist/assets/AlertsPage-wRJbF_gs.js +1 -0
  46. argus_code-0.5.1/dashboard-dist/assets/AreaLine-VUt7zZPY.js → argus_code-0.6.0/dashboard-dist/assets/AreaLine-DULy1vR8.js +1 -1
  47. argus_code-0.6.0/dashboard-dist/assets/AttentionStrip-0x1TKexK.js +1 -0
  48. argus_code-0.5.1/dashboard-dist/assets/Bars-gdNIlXNl.js → argus_code-0.6.0/dashboard-dist/assets/Bars-DGflHvWv.js +1 -1
  49. argus_code-0.6.0/dashboard-dist/assets/Button-CaBiDq5j.js +1 -0
  50. argus_code-0.5.1/dashboard-dist/assets/ChartTable-C2SF4hxC.js → argus_code-0.6.0/dashboard-dist/assets/ChartTable-DnQkfC-d.js +1 -1
  51. argus_code-0.5.1/dashboard-dist/assets/Chip-CSAZEvs5.js → argus_code-0.6.0/dashboard-dist/assets/Chip-CIL0lYXp.js +1 -1
  52. argus_code-0.5.1/dashboard-dist/assets/ErrorPanel-YJvBzoti.js → argus_code-0.6.0/dashboard-dist/assets/ErrorPanel-JuK3IhI4.js +1 -1
  53. argus_code-0.5.1/dashboard-dist/assets/ModelsPage-CC5HgXSC.js → argus_code-0.6.0/dashboard-dist/assets/ModelsPage-Cr6lRqQu.js +1 -1
  54. argus_code-0.6.0/dashboard-dist/assets/MultiLine-PWsvBuFC.js +1 -0
  55. argus_code-0.6.0/dashboard-dist/assets/OverviewPage-aSPc0cOY.js +1 -0
  56. argus_code-0.5.1/dashboard-dist/assets/Panel-C0lmkoau.js → argus_code-0.6.0/dashboard-dist/assets/Panel-NdM4AeT3.js +1 -1
  57. argus_code-0.6.0/dashboard-dist/assets/SearchPage-DjBBvR08.js +1 -0
  58. argus_code-0.5.1/dashboard-dist/assets/SessionPage-h4KU-Iel.js → argus_code-0.6.0/dashboard-dist/assets/SessionPage-UuHPkPWG.js +2 -2
  59. argus_code-0.5.1/dashboard-dist/assets/SessionsPage-BQOKS0MJ.js → argus_code-0.6.0/dashboard-dist/assets/SessionsPage-BUzlxT4V.js +2 -2
  60. argus_code-0.6.0/dashboard-dist/assets/SettingsPage-DhimL0WE.js +1 -0
  61. argus_code-0.5.1/dashboard-dist/assets/StackedColumns-D_Ewnsrg.js → argus_code-0.6.0/dashboard-dist/assets/StackedColumns-1_v1JDXl.js +1 -1
  62. argus_code-0.6.0/dashboard-dist/assets/Tile-C4mpgbF2.js +1 -0
  63. argus_code-0.6.0/dashboard-dist/assets/TimelineTab-CaaXFc1o.js +1 -0
  64. argus_code-0.6.0/dashboard-dist/assets/ToolsPage-gfkohaLX.js +1 -0
  65. argus_code-0.5.1/dashboard-dist/assets/TrendsPage-tRubbqz4.js → argus_code-0.6.0/dashboard-dist/assets/TrendsPage-D0LVzVow.js +1 -1
  66. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/cumulative-C3-3HW0n.js +1 -1
  67. argus_code-0.6.0/dashboard-dist/assets/index-B3DMfZOx.js +50 -0
  68. argus_code-0.6.0/dashboard-dist/assets/index-CpQkAwD7.css +1 -0
  69. argus_code-0.6.0/dashboard-dist/assets/rollups-Dqiwg3gD.js +1 -0
  70. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/series-BjP-80tt.js +1 -1
  71. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/uplotTheme-D1GxaB_c.css +1 -1
  72. argus_code-0.5.1/dashboard-dist/assets/uplotTheme-dVdt58Jw.js → argus_code-0.6.0/dashboard-dist/assets/uplotTheme-eHUsIKi3.js +1 -1
  73. argus_code-0.6.0/dashboard-dist/assets/windows-B3y4OLGl.js +1 -0
  74. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/index.html +3 -3
  75. argus_code-0.6.0/pricing/2026-09-22.json +31 -0
  76. {argus_code-0.5.1 → argus_code-0.6.0}/pyproject.toml +1 -1
  77. argus_code-0.6.0/python/argus/AGENTS.md +114 -0
  78. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/__init__.py +1 -1
  79. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/AGENTS.md +16 -0
  80. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/base.py +4 -0
  81. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/extract_tool_calls.py +34 -10
  82. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/extract_turns.py +46 -11
  83. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/ingest_file.py +25 -9
  84. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/cli.py +53 -32
  85. argus_code-0.6.0/python/argus/collector/AGENTS.md +96 -0
  86. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/aggregate.py +25 -2
  87. argus_code-0.6.0/python/argus/collector/first_run.py +564 -0
  88. argus_code-0.6.0/python/argus/collector/pipeline.py +415 -0
  89. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/scheduler.py +8 -2
  90. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/search_backfill.py +68 -24
  91. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/watcher.py +12 -3
  92. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/core/runtime.py +46 -16
  93. argus_code-0.6.0/python/argus/daemon/pidfile.py +281 -0
  94. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/daemon/process.py +23 -6
  95. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/daemon/service.py +2 -2
  96. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/detectors/__init__.py +2 -0
  97. argus_code-0.6.0/python/argus/detectors/base.py +59 -0
  98. argus_code-0.6.0/python/argus/detectors/cache_hit_drop.py +129 -0
  99. argus_code-0.6.0/python/argus/detectors/cost_spike.py +128 -0
  100. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/detectors/tool_error_rate_spike.py +3 -11
  101. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/pricing/compute.py +17 -0
  102. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/pricing/load.py +27 -5
  103. argus_code-0.6.0/python/argus/scaffold/snapshot.py +191 -0
  104. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/server/AGENTS.md +11 -1
  105. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/server/api.py +43 -13
  106. argus_code-0.6.0/python/argus/store/AGENTS.md +83 -0
  107. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/store/db.py +59 -1
  108. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/store/migrations/inline.py +8 -0
  109. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/store/repository.py +446 -47
  110. argus_code-0.6.0/scripts/screenshots/capture.mjs +176 -0
  111. argus_code-0.6.0/scripts/screenshots/frame.mjs +67 -0
  112. {argus_code-0.5.1 → argus_code-0.6.0}/tests/AGENTS.md +3 -2
  113. argus_code-0.6.0/tests/cli/test_pricing_refresh_cli.py +43 -0
  114. {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_first_run.py +82 -0
  115. {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_first_run_shutdown.py +87 -87
  116. argus_code-0.6.0/tests/collector/test_fork_dedup.py +182 -0
  117. argus_code-0.6.0/tests/collector/test_fork_dedup_db.py +103 -0
  118. argus_code-0.6.0/tests/collector/test_incremental_invariant.py +286 -0
  119. argus_code-0.6.0/tests/collector/test_incremental_repairs.py +110 -0
  120. {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_pipeline.py +54 -0
  121. {argus_code-0.5.1 → argus_code-0.6.0}/tests/conftest.py +5 -2
  122. {argus_code-0.5.1 → argus_code-0.6.0}/tests/core/test_runtime.py +5 -4
  123. argus_code-0.6.0/tests/core/test_runtime_shutdown.py +236 -0
  124. argus_code-0.6.0/tests/daemon/test_pidfile_identity.py +244 -0
  125. {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_process.py +8 -0
  126. {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_service.py +14 -8
  127. argus_code-0.6.0/tests/detectors/test_base_helpers.py +35 -0
  128. argus_code-0.6.0/tests/detectors/test_cache_hit_drop.py +153 -0
  129. argus_code-0.6.0/tests/detectors/test_cost_spike.py +191 -0
  130. {argus_code-0.5.1 → argus_code-0.6.0}/tests/detectors/test_registry.py +6 -3
  131. {argus_code-0.5.1 → argus_code-0.6.0}/tests/pricing/test_compute.py +19 -0
  132. argus_code-0.6.0/tests/pricing/test_load.py +88 -0
  133. argus_code-0.6.0/tests/scaffold/test_snapshot_secrets.py +246 -0
  134. argus_code-0.6.0/tests/server/test_day_buckets.py +100 -0
  135. {argus_code-0.5.1 → argus_code-0.6.0}/tests/store/test_db.py +66 -3
  136. {argus_code-0.5.1 → argus_code-0.6.0}/tests/store/test_repository.py +62 -0
  137. argus_code-0.6.0/tests/store/test_transactions.py +109 -0
  138. {argus_code-0.5.1 → argus_code-0.6.0}/uv.lock +983 -983
  139. argus_code-0.5.1/README.md +0 -249
  140. argus_code-0.5.1/dashboard/src/features/budgets/BudgetsPage.tsx +0 -26
  141. argus_code-0.5.1/dashboard/src/features/overview/useOverviewModel.test.ts +0 -31
  142. argus_code-0.5.1/dashboard/src/routes/budgets.tsx +0 -3
  143. argus_code-0.5.1/dashboard-dist/assets/AlertsPage-Cs8_bu24.js +0 -1
  144. argus_code-0.5.1/dashboard-dist/assets/AttentionStrip-uulCqq7B.js +0 -1
  145. argus_code-0.5.1/dashboard-dist/assets/BudgetsPage-DNk4EMLO.js +0 -1
  146. argus_code-0.5.1/dashboard-dist/assets/Button-BqHL1YGs.js +0 -1
  147. argus_code-0.5.1/dashboard-dist/assets/MultiLine-DaOioHM_.js +0 -1
  148. argus_code-0.5.1/dashboard-dist/assets/OverviewPage-DtYtpPeA.js +0 -1
  149. argus_code-0.5.1/dashboard-dist/assets/Pill-BaEMC6Uo.js +0 -1
  150. argus_code-0.5.1/dashboard-dist/assets/SearchPage-DENLda5C.js +0 -1
  151. argus_code-0.5.1/dashboard-dist/assets/SettingsPage-JyOusfCm.js +0 -1
  152. argus_code-0.5.1/dashboard-dist/assets/Tile-kzNeIivi.js +0 -1
  153. argus_code-0.5.1/dashboard-dist/assets/TimelineTab-D86rkM-N.js +0 -1
  154. argus_code-0.5.1/dashboard-dist/assets/ToolsPage-DAKkhNxC.js +0 -1
  155. argus_code-0.5.1/dashboard-dist/assets/index-CiLtq5Ja.js +0 -50
  156. argus_code-0.5.1/dashboard-dist/assets/index-DwJcAbKT.css +0 -1
  157. argus_code-0.5.1/dashboard-dist/assets/rollups-C1zMwbci.js +0 -1
  158. argus_code-0.5.1/dashboard-dist/assets/windows-7ctt19Z4.js +0 -1
  159. argus_code-0.5.1/python/argus/AGENTS.md +0 -60
  160. argus_code-0.5.1/python/argus/collector/AGENTS.md +0 -50
  161. argus_code-0.5.1/python/argus/collector/first_run.py +0 -321
  162. argus_code-0.5.1/python/argus/collector/pipeline.py +0 -198
  163. argus_code-0.5.1/python/argus/daemon/pidfile.py +0 -79
  164. argus_code-0.5.1/python/argus/detectors/base.py +0 -34
  165. argus_code-0.5.1/python/argus/scaffold/snapshot.py +0 -113
  166. argus_code-0.5.1/python/argus/store/AGENTS.md +0 -46
  167. argus_code-0.5.1/tests/pricing/test_load.py +0 -43
  168. argus_code-0.5.1/tests/scaffold/test_snapshot_secrets.py +0 -103
  169. {argus_code-0.5.1 → argus_code-0.6.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  170. {argus_code-0.5.1 → argus_code-0.6.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  171. {argus_code-0.5.1 → argus_code-0.6.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  172. {argus_code-0.5.1 → argus_code-0.6.0}/.github/pull_request_template.md +0 -0
  173. {argus_code-0.5.1 → argus_code-0.6.0}/.gitignore +0 -0
  174. {argus_code-0.5.1 → argus_code-0.6.0}/.npmrc +0 -0
  175. {argus_code-0.5.1 → argus_code-0.6.0}/CLAUDE.md +0 -0
  176. {argus_code-0.5.1 → argus_code-0.6.0}/CONTRIBUTING.md +0 -0
  177. {argus_code-0.5.1 → argus_code-0.6.0}/LICENSE +0 -0
  178. {argus_code-0.5.1 → argus_code-0.6.0}/PRD.md +0 -0
  179. {argus_code-0.5.1 → argus_code-0.6.0}/SECURITY.md +0 -0
  180. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/.astro/content-assets.mjs +0 -0
  181. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/.astro/content-modules.mjs +0 -0
  182. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/index.html +0 -0
  183. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/package-lock.json +0 -0
  184. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/package.json +0 -0
  185. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/playwright.config.ts +0 -0
  186. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/scripts/size.mjs +0 -0
  187. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/App.test.tsx +0 -0
  188. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/queryClient.ts +0 -0
  189. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/router.tsx +0 -0
  190. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/CommandPalette.test.tsx +0 -0
  191. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/Shell.tsx +0 -0
  192. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/Sidebar.test.tsx +0 -0
  193. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/TopBar.tsx +0 -0
  194. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/AlertStrip.tsx +0 -0
  195. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/AreaLine.test.tsx +0 -0
  196. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/AreaLine.tsx +0 -0
  197. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Bars.test.tsx +0 -0
  198. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Bars.tsx +0 -0
  199. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/CalendarHeatmap.test.tsx +0 -0
  200. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/CalendarHeatmap.tsx +0 -0
  201. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/ChartTable.tsx +0 -0
  202. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/GridHeatmap.tsx +0 -0
  203. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Legend.tsx +0 -0
  204. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Meter.test.tsx +0 -0
  205. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Meter.tsx +0 -0
  206. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Minimap.test.tsx +0 -0
  207. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Minimap.tsx +0 -0
  208. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/MultiLine.tsx +0 -0
  209. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/README.md +0 -0
  210. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Scatter.tsx +0 -0
  211. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Sparkline.tsx +0 -0
  212. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/StackedColumns.tsx +0 -0
  213. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/UPlotChart.tsx +0 -0
  214. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/ramp.ts +0 -0
  215. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/uplotTheme.ts +0 -0
  216. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Button.tsx +0 -0
  217. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Chip.tsx +0 -0
  218. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/CopyId.tsx +0 -0
  219. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/DataTable.tsx +0 -0
  220. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/EmptyState.tsx +0 -0
  221. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/ErrorPanel.tsx +0 -0
  222. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Icon.tsx +0 -0
  223. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Kbd.tsx +0 -0
  224. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Panel.tsx +0 -0
  225. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Pill.test.tsx +0 -0
  226. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Pill.tsx +0 -0
  227. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Seg.test.tsx +0 -0
  228. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Seg.tsx +0 -0
  229. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Skeleton.tsx +0 -0
  230. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/models/ModelsPage.tsx +0 -0
  231. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/overview/AttentionStrip.tsx +0 -0
  232. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/overview/OverviewPage.tsx +0 -0
  233. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/overview/TopSessions.tsx +0 -0
  234. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/search/SearchPage.tsx +0 -0
  235. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/search/cleanSnippet.test.ts +0 -0
  236. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/search/cleanSnippet.ts +0 -0
  237. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/OverviewTab.tsx +0 -0
  238. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/SessionPage.tsx +0 -0
  239. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/SubagentsTab.tsx +0 -0
  240. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/TimelineTab.tsx +0 -0
  241. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/model.test.ts +0 -0
  242. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/model.ts +0 -0
  243. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/sessions/AnalysisStrip.tsx +0 -0
  244. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/sessions/SessionsPage.tsx +0 -0
  245. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/sessions/SessionsTable.tsx +0 -0
  246. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/sessions/filters.test.ts +0 -0
  247. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/sessions/filters.ts +0 -0
  248. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/settings/SettingsPage.tsx +0 -0
  249. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/tools/ToolsPage.tsx +0 -0
  250. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/tools/toolsOverTime.test.ts +0 -0
  251. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/tools/toolsOverTime.ts +0 -0
  252. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/trends/TrendsPage.tsx +0 -0
  253. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/composition.test.ts +0 -0
  254. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/composition.ts +0 -0
  255. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/cumulative.test.ts +0 -0
  256. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/cumulative.ts +0 -0
  257. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/deltas.test.ts +0 -0
  258. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/deltas.ts +0 -0
  259. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/hourWeekday.test.ts +0 -0
  260. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/hourWeekday.ts +0 -0
  261. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/series.test.ts +0 -0
  262. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/series.ts +0 -0
  263. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/testutil.ts +0 -0
  264. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/trendsMetrics.test.ts +0 -0
  265. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/trendsMetrics.ts +0 -0
  266. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/alerts.json +0 -0
  267. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/sessions.json +0 -0
  268. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/timeline.json +0 -0
  269. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/tools-overview.json +0 -0
  270. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/trends.json +0 -0
  271. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/client.test.ts +0 -0
  272. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/format/format.test.ts +0 -0
  273. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/format/format.ts +0 -0
  274. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/main.tsx +0 -0
  275. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/__root.tsx +0 -0
  276. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/alerts.tsx +0 -0
  277. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/index.tsx +0 -0
  278. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/models.tsx +0 -0
  279. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/prompts.tsx +0 -0
  280. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/search.tsx +0 -0
  281. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/session.tsx +0 -0
  282. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/sessions.$id.tsx +0 -0
  283. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/sessions.index.tsx +0 -0
  284. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/settings.tsx +0 -0
  285. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/tools.tsx +0 -0
  286. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/trends.tsx +0 -0
  287. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/styles.css +0 -0
  288. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/vite.config.ts +0 -0
  289. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/vitest.config.ts +0 -0
  290. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/vitest.setup.ts +0 -0
  291. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  292. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  293. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  294. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  295. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  296. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  297. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  298. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  299. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  300. {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  301. {argus_code-0.5.1 → argus_code-0.6.0}/pricing/2026-05-02.json +0 -0
  302. {argus_code-0.5.1 → argus_code-0.6.0}/pricing/2026-06-12.json +0 -0
  303. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/__init__.py +0 -0
  304. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/__init__.py +0 -0
  305. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/adapter.py +0 -0
  306. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/discover.py +0 -0
  307. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/extract_transcript.py +0 -0
  308. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/history_jsonl.py +0 -0
  309. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/model.py +0 -0
  310. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/schemas.py +0 -0
  311. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/registry.py +0 -0
  312. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/__init__.py +0 -0
  313. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/rollup_subagents.py +0 -0
  314. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/core/__init__.py +0 -0
  315. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/daemon/__init__.py +0 -0
  316. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/daemon/logging.py +0 -0
  317. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/detectors/registry.py +0 -0
  318. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/pricing/__init__.py +0 -0
  319. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/pricing/refresh.py +0 -0
  320. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/pricing/types.py +0 -0
  321. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/scaffold/__init__.py +0 -0
  322. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/scaffold/scaffolder.py +0 -0
  323. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/scaffold/storage.py +0 -0
  324. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/schema/__init__.py +0 -0
  325. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/schema/types.py +0 -0
  326. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/server/__init__.py +0 -0
  327. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/server/app.py +0 -0
  328. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/store/__init__.py +0 -0
  329. {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/store/migrations/__init__.py +0 -0
  330. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/agents/code-reviewer.md +0 -0
  331. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/agents/security-auditor.md +0 -0
  332. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/commands/commit.md +0 -0
  333. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/commands/deploy.md +0 -0
  334. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/commands/fix-issue.md +0 -0
  335. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/commands/pr.md +0 -0
  336. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/commands/review.md +0 -0
  337. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/rules/api-conventions.md +0 -0
  338. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/rules/code-style.md +0 -0
  339. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/rules/testing.md +0 -0
  340. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/settings.json +0 -0
  341. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/skills/example/SKILL.md +0 -0
  342. {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/CLAUDE.md +0 -0
  343. {argus_code-0.5.1 → argus_code-0.6.0}/tests/__init__.py +0 -0
  344. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/__init__.py +0 -0
  345. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/__init__.py +0 -0
  346. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_adapter.py +0 -0
  347. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_discover.py +0 -0
  348. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_extract_tool_calls.py +0 -0
  349. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_extract_transcript.py +0 -0
  350. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_extract_turns.py +0 -0
  351. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_history_jsonl.py +0 -0
  352. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_ingest_file.py +0 -0
  353. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_integration.py +0 -0
  354. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_model.py +0 -0
  355. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_path_containment.py +0 -0
  356. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_schemas.py +0 -0
  357. {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/test_registry.py +0 -0
  358. {argus_code-0.5.1 → argus_code-0.6.0}/tests/cli/__init__.py +0 -0
  359. {argus_code-0.5.1 → argus_code-0.6.0}/tests/cli/test_indexing_cli.py +0 -0
  360. {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/__init__.py +0 -0
  361. {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_aggregate.py +0 -0
  362. {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_rollup_subagents.py +0 -0
  363. {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_scheduler.py +0 -0
  364. {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_watcher.py +0 -0
  365. {argus_code-0.5.1 → argus_code-0.6.0}/tests/core/__init__.py +0 -0
  366. {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/__init__.py +0 -0
  367. {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_logs.py +0 -0
  368. {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_no_claude_dir.py +0 -0
  369. {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_pidfile.py +0 -0
  370. {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_spawn_safe_path.py +0 -0
  371. {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_yield.py +0 -0
  372. {argus_code-0.5.1 → argus_code-0.6.0}/tests/dashboard/__init__.py +0 -0
  373. {argus_code-0.5.1 → argus_code-0.6.0}/tests/dashboard/test_no_raw_html.py +0 -0
  374. {argus_code-0.5.1 → argus_code-0.6.0}/tests/detectors/__init__.py +0 -0
  375. {argus_code-0.5.1 → argus_code-0.6.0}/tests/detectors/test_tool_error_rate_spike.py +0 -0
  376. {argus_code-0.5.1 → argus_code-0.6.0}/tests/pricing/__init__.py +0 -0
  377. {argus_code-0.5.1 → argus_code-0.6.0}/tests/pricing/test_refresh.py +0 -0
  378. {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/__init__.py +0 -0
  379. {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_bundled_template.py +0 -0
  380. {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_cli_claude.py +0 -0
  381. {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_scaffold_containment.py +0 -0
  382. {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_scaffolder.py +0 -0
  383. {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_snapshot.py +0 -0
  384. {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_storage.py +0 -0
  385. {argus_code-0.5.1 → argus_code-0.6.0}/tests/schema/__init__.py +0 -0
  386. {argus_code-0.5.1 → argus_code-0.6.0}/tests/schema/test_types.py +0 -0
  387. {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/__init__.py +0 -0
  388. {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_api.py +0 -0
  389. {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_api_search.py +0 -0
  390. {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_param_bounds.py +0 -0
  391. {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_read_cache.py +0 -0
  392. {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_server.py +0 -0
  393. {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_spa_fallback.py +0 -0
  394. {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_week_of.py +0 -0
  395. {argus_code-0.5.1 → argus_code-0.6.0}/tests/store/__init__.py +0 -0
  396. {argus_code-0.5.1 → 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
+ }
@@ -1,74 +1,74 @@
1
- name: test
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
-
8
- concurrency:
9
- group: ${{ github.workflow }}-${{ github.ref }}
10
- cancel-in-progress: true
11
-
12
- jobs:
13
- pytest:
14
- name: pytest (${{ matrix.os }}, py${{ matrix.python-version }})
15
- runs-on: ${{ matrix.os }}
16
- strategy:
17
- # Don't cancel the whole matrix on one platform's failure — path
18
- # handling, symlink behaviour and signal delivery all differ per OS,
19
- # and seeing which combination broke is the point.
20
- fail-fast: false
21
- matrix:
22
- os: [ubuntu-latest, macos-latest, windows-latest]
23
- python-version: ["3.11", "3.12", "3.13"]
24
-
25
- steps:
26
- - uses: actions/checkout@v4
27
-
28
- - name: Install uv
29
- uses: astral-sh/setup-uv@v5
30
- with:
31
- enable-cache: true
32
-
33
- - name: Install dependencies
34
- run: uv sync --dev --python ${{ matrix.python-version }}
35
-
36
- - name: Run tests
37
- run: uv run pytest -q
38
-
39
- dashboard:
40
- name: dashboard build
41
- runs-on: ubuntu-latest
42
- steps:
43
- - uses: actions/checkout@v4
44
-
45
- - uses: actions/setup-node@v4
46
- with:
47
- node-version: "22"
48
- cache: npm
49
- cache-dependency-path: dashboard/package-lock.json
50
-
51
- - name: Install and build
52
- working-directory: dashboard
53
- run: |
54
- npm ci
55
- npm run build
56
-
57
- # The wheel ships dashboard-dist/, not dashboard/dist/. If a source edit
58
- # is committed without refreshing the shipped copy, users get the old UI
59
- # — including, historically, an unfixed XSS. Fail loudly on drift.
60
- #
61
- # Compare file *names*, not bytes: Astro content-hashes asset filenames,
62
- # so any real source change renames the asset. Byte comparison would
63
- # instead trip over line endings, since dashboard-dist/ is tracked (and
64
- # so checked out CRLF on Windows) while dashboard/dist/ is a fresh LF
65
- # build — a difference that says nothing about staleness.
66
- - name: Check dashboard-dist is in sync with dashboard/src
67
- run: |
68
- (cd dashboard/dist && find . -type f | sort) > /tmp/built.txt
69
- (cd dashboard-dist && find . -type f | sort) > /tmp/shipped.txt
70
- if ! diff -u /tmp/shipped.txt /tmp/built.txt; then
71
- echo "::error::dashboard-dist/ is stale. Rebuild and commit it — see dashboard/AGENTS.md."
72
- exit 1
73
- fi
74
- echo "dashboard-dist matches the build."
1
+ name: test
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ pytest:
14
+ name: pytest (${{ matrix.os }}, py${{ matrix.python-version }})
15
+ runs-on: ${{ matrix.os }}
16
+ strategy:
17
+ # Don't cancel the whole matrix on one platform's failure — path
18
+ # handling, symlink behaviour and signal delivery all differ per OS,
19
+ # and seeing which combination broke is the point.
20
+ fail-fast: false
21
+ matrix:
22
+ os: [ubuntu-latest, macos-latest, windows-latest]
23
+ python-version: ["3.11", "3.12", "3.13"]
24
+
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+
28
+ - name: Install uv
29
+ uses: astral-sh/setup-uv@v5
30
+ with:
31
+ enable-cache: true
32
+
33
+ - name: Install dependencies
34
+ run: uv sync --dev --python ${{ matrix.python-version }}
35
+
36
+ - name: Run tests
37
+ run: uv run pytest -q
38
+
39
+ dashboard:
40
+ name: dashboard build
41
+ runs-on: ubuntu-latest
42
+ steps:
43
+ - uses: actions/checkout@v4
44
+
45
+ - uses: actions/setup-node@v4
46
+ with:
47
+ node-version: "22"
48
+ cache: npm
49
+ cache-dependency-path: dashboard/package-lock.json
50
+
51
+ - name: Install and build
52
+ working-directory: dashboard
53
+ run: |
54
+ npm ci
55
+ npm run build
56
+
57
+ # The wheel ships dashboard-dist/, not dashboard/dist/. If a source edit
58
+ # is committed without refreshing the shipped copy, users get the old UI
59
+ # — including, historically, an unfixed XSS. Fail loudly on drift.
60
+ #
61
+ # Compare file *names*, not bytes: Astro content-hashes asset filenames,
62
+ # so any real source change renames the asset. Byte comparison would
63
+ # instead trip over line endings, since dashboard-dist/ is tracked (and
64
+ # so checked out CRLF on Windows) while dashboard/dist/ is a fresh LF
65
+ # build — a difference that says nothing about staleness.
66
+ - name: Check dashboard-dist is in sync with dashboard/src
67
+ run: |
68
+ (cd dashboard/dist && find . -type f | sort) > /tmp/built.txt
69
+ (cd dashboard-dist && find . -type f | sort) > /tmp/shipped.txt
70
+ if ! diff -u /tmp/shipped.txt /tmp/built.txt; then
71
+ echo "::error::dashboard-dist/ is stale. Rebuild and commit it — see dashboard/AGENTS.md."
72
+ exit 1
73
+ fi
74
+ echo "dashboard-dist matches the build."
@@ -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,22 +1,22 @@
1
- Argus bundles project-scaffolding templates derived from Agent Anatomy
2
- (https://github.com/agent-anatomy/claude), used under the MIT License.
3
-
4
- Copyright (c) 2025 Agent Anatomy
5
-
6
- Permission is hereby granted, free of charge, to any person obtaining a copy
7
- of this software and associated documentation files (the "Software"), to deal
8
- in the Software without restriction, including without limitation the rights
9
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- copies of the Software, and to permit persons to whom the Software is
11
- furnished to do so, subject to the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be included in all
14
- copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
- SOFTWARE.
1
+ Argus bundles project-scaffolding templates derived from Agent Anatomy
2
+ (https://github.com/agent-anatomy/claude), used under the MIT License.
3
+
4
+ Copyright (c) 2025 Agent Anatomy
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: argus-code
3
- Version: 0.5.1
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,62 +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 arrive with Budgets. |
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) today;
129
- **Budgets** — monthly ceilings with threshold alerts — is the next slot.
149
+ ### Trends that use rates, not totals
130
150
 
131
- Every chart follows a few house rules: one axis per chart, a legend whenever there's
132
- more than one series, status colours always paired with an icon and a label, and a
133
- 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".
134
154
 
135
- ---
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.
136
192
 
137
- ## CLI
193
+ <details>
194
+ <summary><b>Full command tree</b></summary>
138
195
 
139
196
  ```sh
140
197
  argus # top-level command group
@@ -163,14 +220,14 @@ argus # top-level command group
163
220
  └─ wipe # delete ~/.argus/ entirely
164
221
  ```
165
222
 
166
- `--help` works at every level.
223
+ </details>
167
224
 
168
- ### `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>
169
227
 
170
- By default the watcher and detector scheduler run *inside* `argus start`; close it
171
- and ingestion stops. **argusd** moves that work into a long-running background
172
- process. It does not serve the dashboard — port 4242 is still only bound by
173
- `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`.
174
231
 
175
232
  ```sh
176
233
  argus daemon start # run argusd in the background (survives closing the terminal)
@@ -184,8 +241,8 @@ read-only viewer of the database the daemon keeps fresh (the sidebar footer says
184
241
  *argusd daemon*). When it isn't, `argus start` ingests in-process exactly as before.
185
242
 
186
243
  **Living with it.** Idle cost is negligible: the watcher is event-driven and the
187
- scheduler wakes every 10 minutes — expect ~40–70 MB RAM and no idle CPU. Logs rotate
188
- 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:
189
246
 
190
247
  - **Restart after upgrading** (`argus daemon restart`) — a running daemon holds the old code.
191
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.
@@ -193,18 +250,22 @@ at ~1 MB × 3 in `~/.argus/argusd.log`. Things to know:
193
250
  - **Windows `stop` is a hard kill** — safe (no critical in-memory state), but no `argusd stopped.` line lands in the log.
194
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`.
195
252
 
196
- ### `argus claude` — scaffold good agent config
253
+ </details>
254
+
255
+ <details>
256
+ <summary><b><code>argus claude</code> — scaffold good agent config</b></summary>
197
257
 
198
258
  Set things up well *before* you run, not just observe afterwards. `init` copies a
199
259
  template into a project: `CLAUDE.md` to the root, everything else into `.claude/`.
200
260
  Existing files are skipped (`--force` overwrites — except `CLAUDE.md`, which is never
201
261
  overwritten). The bundled `default` template ships a sensible `settings.json`, agents,
202
262
  commands, rules and a placeholder skill. Save your own project's setup with
203
- `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.
204
265
 
205
- ---
266
+ </details>
206
267
 
207
- ## Privacy & security
268
+ ## 🔒 Privacy & security
208
269
 
209
270
  Argus is built for one person on one machine, and the defaults say so.
210
271
 
@@ -219,30 +280,25 @@ Argus is built for one person on one machine, and the defaults say so.
219
280
  Your data is one file, `~/.argus/argus.db`. `argus wipe` deletes it; so does `rm`.
220
281
  Vulnerability reports: [SECURITY.md](./SECURITY.md).
221
282
 
222
- ---
223
-
224
- ## How it works
283
+ ## ⚙️ How it works
225
284
 
226
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.
227
- 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.
228
- 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.
229
- 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.
230
- 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.
231
- 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/*`.
232
- 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/*`.
233
291
 
234
292
  Want the deeper tour? [ARCHITECTURE.md](./ARCHITECTURE.md).
235
293
 
236
- ---
237
-
238
- ## Configuration
294
+ ## 🔧 Configuration
239
295
 
240
296
  | Where | Knob |
241
297
  |---|---|
242
298
  | `argus start --port <n>` | Port (default 4242). |
243
299
  | `argus start --host <h>` | Bind host (default `127.0.0.1`; `0.0.0.0` for LAN exposure). |
244
300
  | `argus start --data-dir <path>` | Override `~/.argus/`. |
245
- | `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). |
246
302
 
247
303
  ### Keep more history in Claude Code itself
248
304
 
@@ -255,14 +311,12 @@ Claude Code deletes session files after 30 days by default. Raise it in
255
311
 
256
312
  Argus keeps its own copy regardless — this only widens what Claude itself retains.
257
313
 
258
- ## Requirements
314
+ ## 📋 Requirements
259
315
 
260
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).
261
317
  - A `~/.claude/` directory with real session JSONL — i.e. you've used Claude Code at least once.
262
318
 
263
- ---
264
-
265
- ## Development
319
+ ## 🛠️ Development
266
320
 
267
321
  ```sh
268
322
  git clone https://github.com/KrishBhimani/argus-code.git
@@ -277,6 +331,9 @@ proxies `/api` to a running `argus start`; `npm test`, `npm run build`, `npm run
277
331
  and `npm run e2e` are the gates. The built copy in `dashboard-dist/` ships inside the
278
332
  wheel, so end users never touch `npm`. See [CONTRIBUTING.md](./CONTRIBUTING.md).
279
333
 
334
+ <details>
335
+ <summary><b>Repository layout</b></summary>
336
+
280
337
  ```
281
338
  python/argus/ Python ingest, store, server, CLI
282
339
  adapters/ Claude Code JSONL parsers + adapter registry
@@ -296,6 +353,18 @@ templates/ Bundled .claude/ scaffolding templates (shipped in wheel a
296
353
  tests/ pytest suite, mirrors python/argus/ layout
297
354
  ```
298
355
 
299
- ## 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>
300
369
 
301
- MIT — see [LICENSE](./LICENSE).
370
+ </div>