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.
- argus_code-0.6.0/.claude/settings.local.json +7 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/.github/workflows/test.yml +74 -74
- {argus_code-0.5.1 → argus_code-0.6.0}/AGENTS.md +11 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/ARCHITECTURE.md +31 -5
- {argus_code-0.5.1 → argus_code-0.6.0}/NOTICE +22 -22
- {argus_code-0.5.1 → argus_code-0.6.0}/PKG-INFO +155 -86
- argus_code-0.6.0/README.md +318 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/TESTING.md +29 -0
- argus_code-0.6.0/assets/hero.png +0 -0
- argus_code-0.6.0/assets/logo.svg +7 -0
- argus_code-0.6.0/assets/screenshots/alerts.png +0 -0
- argus_code-0.6.0/assets/screenshots/models.png +0 -0
- argus_code-0.6.0/assets/screenshots/overview.png +0 -0
- argus_code-0.6.0/assets/screenshots/search.png +0 -0
- argus_code-0.6.0/assets/screenshots/session-detail.png +0 -0
- argus_code-0.6.0/assets/screenshots/session-timeline.png +0 -0
- argus_code-0.6.0/assets/screenshots/sessions.png +0 -0
- argus_code-0.6.0/assets/screenshots/settings.png +0 -0
- argus_code-0.6.0/assets/screenshots/subagents.png +0 -0
- argus_code-0.6.0/assets/screenshots/tools.png +0 -0
- argus_code-0.6.0/assets/screenshots/trends.png +0 -0
- argus_code-0.6.0/assets - Shortcut.lnk +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/.astro/content.d.ts +155 -155
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/.astro/types.d.ts +1 -1
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/AGENTS.md +6 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/e2e/smoke.spec.ts +1 -1
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/CommandPalette.tsx +1 -1
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/Sidebar.tsx +2 -3
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Tile.test.tsx +11 -3
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Tile.tsx +11 -1
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/alerts/AlertsPage.tsx +11 -4
- argus_code-0.6.0/dashboard/src/features/overview/useOverviewModel.test.ts +33 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/overview/useOverviewModel.ts +15 -17
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/rollups.test.ts +1 -8
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/rollups.ts +0 -12
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/windows.test.ts +3 -5
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/windows.ts +0 -10
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/overview.json +1 -1
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/client.ts +8 -2
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/hooks.ts +5 -3
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/schemas.ts +2 -0
- argus_code-0.6.0/dashboard/src/lib/api/timezone.test.ts +48 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routeTree.gen.ts +273 -294
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/tsconfig.json +1 -2
- argus_code-0.6.0/dashboard-dist/assets/AlertsPage-wRJbF_gs.js +1 -0
- argus_code-0.5.1/dashboard-dist/assets/AreaLine-VUt7zZPY.js → argus_code-0.6.0/dashboard-dist/assets/AreaLine-DULy1vR8.js +1 -1
- argus_code-0.6.0/dashboard-dist/assets/AttentionStrip-0x1TKexK.js +1 -0
- argus_code-0.5.1/dashboard-dist/assets/Bars-gdNIlXNl.js → argus_code-0.6.0/dashboard-dist/assets/Bars-DGflHvWv.js +1 -1
- argus_code-0.6.0/dashboard-dist/assets/Button-CaBiDq5j.js +1 -0
- 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
- argus_code-0.5.1/dashboard-dist/assets/Chip-CSAZEvs5.js → argus_code-0.6.0/dashboard-dist/assets/Chip-CIL0lYXp.js +1 -1
- argus_code-0.5.1/dashboard-dist/assets/ErrorPanel-YJvBzoti.js → argus_code-0.6.0/dashboard-dist/assets/ErrorPanel-JuK3IhI4.js +1 -1
- argus_code-0.5.1/dashboard-dist/assets/ModelsPage-CC5HgXSC.js → argus_code-0.6.0/dashboard-dist/assets/ModelsPage-Cr6lRqQu.js +1 -1
- argus_code-0.6.0/dashboard-dist/assets/MultiLine-PWsvBuFC.js +1 -0
- argus_code-0.6.0/dashboard-dist/assets/OverviewPage-aSPc0cOY.js +1 -0
- argus_code-0.5.1/dashboard-dist/assets/Panel-C0lmkoau.js → argus_code-0.6.0/dashboard-dist/assets/Panel-NdM4AeT3.js +1 -1
- argus_code-0.6.0/dashboard-dist/assets/SearchPage-DjBBvR08.js +1 -0
- 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
- argus_code-0.5.1/dashboard-dist/assets/SessionsPage-BQOKS0MJ.js → argus_code-0.6.0/dashboard-dist/assets/SessionsPage-BUzlxT4V.js +2 -2
- argus_code-0.6.0/dashboard-dist/assets/SettingsPage-DhimL0WE.js +1 -0
- 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
- argus_code-0.6.0/dashboard-dist/assets/Tile-C4mpgbF2.js +1 -0
- argus_code-0.6.0/dashboard-dist/assets/TimelineTab-CaaXFc1o.js +1 -0
- argus_code-0.6.0/dashboard-dist/assets/ToolsPage-gfkohaLX.js +1 -0
- argus_code-0.5.1/dashboard-dist/assets/TrendsPage-tRubbqz4.js → argus_code-0.6.0/dashboard-dist/assets/TrendsPage-D0LVzVow.js +1 -1
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/cumulative-C3-3HW0n.js +1 -1
- argus_code-0.6.0/dashboard-dist/assets/index-B3DMfZOx.js +50 -0
- argus_code-0.6.0/dashboard-dist/assets/index-CpQkAwD7.css +1 -0
- argus_code-0.6.0/dashboard-dist/assets/rollups-Dqiwg3gD.js +1 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/series-BjP-80tt.js +1 -1
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/uplotTheme-D1GxaB_c.css +1 -1
- argus_code-0.5.1/dashboard-dist/assets/uplotTheme-dVdt58Jw.js → argus_code-0.6.0/dashboard-dist/assets/uplotTheme-eHUsIKi3.js +1 -1
- argus_code-0.6.0/dashboard-dist/assets/windows-B3y4OLGl.js +1 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/index.html +3 -3
- argus_code-0.6.0/pricing/2026-09-22.json +31 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/pyproject.toml +1 -1
- argus_code-0.6.0/python/argus/AGENTS.md +114 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/__init__.py +1 -1
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/AGENTS.md +16 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/base.py +4 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/extract_tool_calls.py +34 -10
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/extract_turns.py +46 -11
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/ingest_file.py +25 -9
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/cli.py +53 -32
- argus_code-0.6.0/python/argus/collector/AGENTS.md +96 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/aggregate.py +25 -2
- argus_code-0.6.0/python/argus/collector/first_run.py +564 -0
- argus_code-0.6.0/python/argus/collector/pipeline.py +415 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/scheduler.py +8 -2
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/search_backfill.py +68 -24
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/watcher.py +12 -3
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/core/runtime.py +46 -16
- argus_code-0.6.0/python/argus/daemon/pidfile.py +281 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/daemon/process.py +23 -6
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/daemon/service.py +2 -2
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/detectors/__init__.py +2 -0
- argus_code-0.6.0/python/argus/detectors/base.py +59 -0
- argus_code-0.6.0/python/argus/detectors/cache_hit_drop.py +129 -0
- argus_code-0.6.0/python/argus/detectors/cost_spike.py +128 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/detectors/tool_error_rate_spike.py +3 -11
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/pricing/compute.py +17 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/pricing/load.py +27 -5
- argus_code-0.6.0/python/argus/scaffold/snapshot.py +191 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/server/AGENTS.md +11 -1
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/server/api.py +43 -13
- argus_code-0.6.0/python/argus/store/AGENTS.md +83 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/store/db.py +59 -1
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/store/migrations/inline.py +8 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/store/repository.py +446 -47
- argus_code-0.6.0/scripts/screenshots/capture.mjs +176 -0
- argus_code-0.6.0/scripts/screenshots/frame.mjs +67 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/AGENTS.md +3 -2
- argus_code-0.6.0/tests/cli/test_pricing_refresh_cli.py +43 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_first_run.py +82 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_first_run_shutdown.py +87 -87
- argus_code-0.6.0/tests/collector/test_fork_dedup.py +182 -0
- argus_code-0.6.0/tests/collector/test_fork_dedup_db.py +103 -0
- argus_code-0.6.0/tests/collector/test_incremental_invariant.py +286 -0
- argus_code-0.6.0/tests/collector/test_incremental_repairs.py +110 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_pipeline.py +54 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/conftest.py +5 -2
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/core/test_runtime.py +5 -4
- argus_code-0.6.0/tests/core/test_runtime_shutdown.py +236 -0
- argus_code-0.6.0/tests/daemon/test_pidfile_identity.py +244 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_process.py +8 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_service.py +14 -8
- argus_code-0.6.0/tests/detectors/test_base_helpers.py +35 -0
- argus_code-0.6.0/tests/detectors/test_cache_hit_drop.py +153 -0
- argus_code-0.6.0/tests/detectors/test_cost_spike.py +191 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/detectors/test_registry.py +6 -3
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/pricing/test_compute.py +19 -0
- argus_code-0.6.0/tests/pricing/test_load.py +88 -0
- argus_code-0.6.0/tests/scaffold/test_snapshot_secrets.py +246 -0
- argus_code-0.6.0/tests/server/test_day_buckets.py +100 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/store/test_db.py +66 -3
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/store/test_repository.py +62 -0
- argus_code-0.6.0/tests/store/test_transactions.py +109 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/uv.lock +983 -983
- argus_code-0.5.1/README.md +0 -249
- argus_code-0.5.1/dashboard/src/features/budgets/BudgetsPage.tsx +0 -26
- argus_code-0.5.1/dashboard/src/features/overview/useOverviewModel.test.ts +0 -31
- argus_code-0.5.1/dashboard/src/routes/budgets.tsx +0 -3
- argus_code-0.5.1/dashboard-dist/assets/AlertsPage-Cs8_bu24.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/AttentionStrip-uulCqq7B.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/BudgetsPage-DNk4EMLO.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/Button-BqHL1YGs.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/MultiLine-DaOioHM_.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/OverviewPage-DtYtpPeA.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/Pill-BaEMC6Uo.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/SearchPage-DENLda5C.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/SettingsPage-JyOusfCm.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/Tile-kzNeIivi.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/TimelineTab-D86rkM-N.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/ToolsPage-DAKkhNxC.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/index-CiLtq5Ja.js +0 -50
- argus_code-0.5.1/dashboard-dist/assets/index-DwJcAbKT.css +0 -1
- argus_code-0.5.1/dashboard-dist/assets/rollups-C1zMwbci.js +0 -1
- argus_code-0.5.1/dashboard-dist/assets/windows-7ctt19Z4.js +0 -1
- argus_code-0.5.1/python/argus/AGENTS.md +0 -60
- argus_code-0.5.1/python/argus/collector/AGENTS.md +0 -50
- argus_code-0.5.1/python/argus/collector/first_run.py +0 -321
- argus_code-0.5.1/python/argus/collector/pipeline.py +0 -198
- argus_code-0.5.1/python/argus/daemon/pidfile.py +0 -79
- argus_code-0.5.1/python/argus/detectors/base.py +0 -34
- argus_code-0.5.1/python/argus/scaffold/snapshot.py +0 -113
- argus_code-0.5.1/python/argus/store/AGENTS.md +0 -46
- argus_code-0.5.1/tests/pricing/test_load.py +0 -43
- argus_code-0.5.1/tests/scaffold/test_snapshot_secrets.py +0 -103
- {argus_code-0.5.1 → argus_code-0.6.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/.github/pull_request_template.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/.gitignore +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/.npmrc +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/CLAUDE.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/CONTRIBUTING.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/LICENSE +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/PRD.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/SECURITY.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/.astro/content-assets.mjs +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/.astro/content-modules.mjs +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/index.html +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/package-lock.json +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/package.json +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/playwright.config.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/scripts/size.mjs +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/App.test.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/queryClient.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/router.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/CommandPalette.test.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/Shell.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/Sidebar.test.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/app/shell/TopBar.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/AlertStrip.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/AreaLine.test.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/AreaLine.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Bars.test.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Bars.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/CalendarHeatmap.test.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/CalendarHeatmap.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/ChartTable.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/GridHeatmap.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Legend.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Meter.test.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Meter.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Minimap.test.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Minimap.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/MultiLine.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/README.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Scatter.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/Sparkline.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/StackedColumns.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/UPlotChart.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/ramp.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/charts/uplotTheme.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Button.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Chip.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/CopyId.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/DataTable.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/EmptyState.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/ErrorPanel.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Icon.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Kbd.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Panel.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Pill.test.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Pill.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Seg.test.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Seg.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/components/ui/Skeleton.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/models/ModelsPage.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/overview/AttentionStrip.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/overview/OverviewPage.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/overview/TopSessions.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/search/SearchPage.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/search/cleanSnippet.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/search/cleanSnippet.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/OverviewTab.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/SessionPage.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/SubagentsTab.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/TimelineTab.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/model.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/session/model.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/sessions/AnalysisStrip.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/sessions/SessionsPage.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/sessions/SessionsTable.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/sessions/filters.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/sessions/filters.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/settings/SettingsPage.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/tools/ToolsPage.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/tools/toolsOverTime.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/tools/toolsOverTime.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/features/trends/TrendsPage.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/composition.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/composition.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/cumulative.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/cumulative.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/deltas.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/deltas.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/hourWeekday.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/hourWeekday.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/series.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/series.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/testutil.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/trendsMetrics.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/analysis/trendsMetrics.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/alerts.json +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/sessions.json +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/timeline.json +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/tools-overview.json +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/__fixtures__/trends.json +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/api/client.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/format/format.test.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/lib/format/format.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/main.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/__root.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/alerts.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/index.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/models.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/prompts.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/search.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/session.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/sessions.$id.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/sessions.index.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/settings.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/tools.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/routes/trends.tsx +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/src/styles.css +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/vite.config.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/vitest.config.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard/vitest.setup.ts +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/dashboard-dist/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/pricing/2026-05-02.json +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/pricing/2026-06-12.json +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/adapter.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/discover.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/extract_transcript.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/history_jsonl.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/model.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/claude_code/schemas.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/adapters/registry.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/collector/rollup_subagents.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/core/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/daemon/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/daemon/logging.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/detectors/registry.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/pricing/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/pricing/refresh.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/pricing/types.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/scaffold/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/scaffold/scaffolder.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/scaffold/storage.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/schema/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/schema/types.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/server/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/server/app.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/store/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/python/argus/store/migrations/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/agents/code-reviewer.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/agents/security-auditor.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/commands/commit.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/commands/deploy.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/commands/fix-issue.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/commands/pr.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/commands/review.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/rules/api-conventions.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/rules/code-style.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/rules/testing.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/settings.json +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/.claude/skills/example/SKILL.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/templates/default/CLAUDE.md +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_adapter.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_discover.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_extract_tool_calls.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_extract_transcript.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_extract_turns.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_history_jsonl.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_ingest_file.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_integration.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_model.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_path_containment.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/claude_code/test_schemas.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/adapters/test_registry.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/cli/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/cli/test_indexing_cli.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_aggregate.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_rollup_subagents.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_scheduler.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/collector/test_watcher.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/core/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_logs.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_no_claude_dir.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_pidfile.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_spawn_safe_path.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/daemon/test_yield.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/dashboard/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/dashboard/test_no_raw_html.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/detectors/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/detectors/test_tool_error_rate_spike.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/pricing/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/pricing/test_refresh.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_bundled_template.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_cli_claude.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_scaffold_containment.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_scaffolder.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_snapshot.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/scaffold/test_storage.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/schema/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/schema/test_types.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_api.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_api_search.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_param_bounds.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_read_cache.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_server.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_spa_fallback.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/server/test_week_of.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/store/__init__.py +0 -0
- {argus_code-0.5.1 → argus_code-0.6.0}/tests/test_e2e.py +0 -0
|
@@ -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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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.
|
|
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
|
-
|
|
53
|
+
<div align="center">
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
<img src="https://raw.githubusercontent.com/KrishBhimani/argus-code/main/assets/logo.svg" width="84" alt="Argus logo">
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
|
63
|
-
|
|
64
|
-
turn
|
|
65
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
94
|
-
|
|
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
|
-
|
|
122
|
+
### Every session, priced
|
|
99
123
|
|
|
100
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
140
|
+
### Sub-agent X-ray
|
|
121
141
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
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
|
-
|
|
129
|
-
**Budgets** — monthly ceilings with threshold alerts — is the next slot.
|
|
149
|
+
### Trends that use rates, not totals
|
|
130
150
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
223
|
+
</details>
|
|
167
224
|
|
|
168
|
-
|
|
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
|
-
|
|
172
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
228
|
-
3. **Tools.** Each `tool_use` block becomes a
|
|
229
|
-
4. **Search (opt-in).** Two FTS5 tables
|
|
230
|
-
5. **Detection.** A scheduler
|
|
231
|
-
6. **Dashboard.** A Vite + React single-page app (uPlot and hand-drawn SVG charts), statically built and served by the FastAPI app.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
370
|
+
</div>
|