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