Commit 94d9dfc
feat: multi-agent support, unified CLI, and extractors (#37)
* feat: add multi-agent data model with OpenAI and Google pricing
Introduce agent_type dimension across the data model to support Codex CLI
and Gemini CLI alongside Claude Code. Rename claude_version → agent_version
and claude_helpfulness → agent_helpfulness with backward-compatible Pydantic
validators. Add pricing for 9 OpenAI/Google models and agent_type filter
to analytics queries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add Codex CLI and Gemini CLI extractors with registry-based discovery
Introduce a SessionExtractor protocol and three implementations (Claude Code,
Codex CLI, Gemini CLI) behind an extractor registry. list_local_sessions() and
sync now dispatch through the registry, enabling multi-agent session discovery
and ingestion from ~/.codex/ and ~/.gemini/ alongside ~/.claude/.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add unified `primer` CLI with init, server, hook, mcp, and doctor commands
Replaces ~8 manual steps (python -m, scripts/, raw uvicorn, manual settings edits)
with a single `pip install . && primer init && primer server start` workflow.
Adds click-based CLI with commands: init, setup, server {start,stop,status,logs},
hook {install,uninstall,status}, mcp {install,uninstall,serve}, sync, doctor,
and configure {get,set,list}. Includes config.toml bridge, launchd/systemd/pidfile
server management, and refactored hook installer.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: increase CLI test coverage to 95% (was ~55%)
Add 40+ tests across server_manager, setup, server, sync, doctor,
configure, and config modules using monkeypatch — no real infrastructure.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: prevent PRIMER_ADMIN_API_KEY env leak between tests
The init test's load_config_into_env() set env vars without monkeypatch,
causing test_admin_headers to see a stale admin key. Fix both the source
(delenv in init test) and the victim (patch ADMIN_API_KEY in mcp fixture).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: sort imports in init.py to satisfy ruff I001 in CI
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address bugbot review comments
- Fix invalid systemd directive `StandardErrorOutput` → `StandardError`
- Close log file descriptor after spawning background server process
- Key cumulative token tracker per model to avoid cross-model deltas
- Only count `ExecCommandBegin` events (not paired End) for tool calls
- Populate `agent_type_counts` in overview stats from session data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address second round of bugbot comments
- Escape special chars in TOML string serializer (`\`, `"`)
- Read engineer ID from nested `engineer` key in setup response
- Escape XML special chars in launchd plist env values
- Fix operator precedence in Gemini extractor usage metadata access
- Remove dead `_project_path_to_dir_name` and `_find_transcript` from reader
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add Astro marketing website with landing, docs, blog, and deployment
Implements the marketing website plan using Astro 5 with Tailwind v4,
React islands for interactive components, and MDX content collections
for the blog. Includes dark hero, feature grid, comparison table,
pricing page, and GitHub Pages deployment workflow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address third round of bugbot comments
- Preserve comments in config.toml by doing line-level replacement in
set_value instead of full round-trip through tomllib
- Coerce string values to int/float/bool before storing in TOML
- Mask sensitive values in `configure set` output (consistent with get/list)
- Scope S603 suppression to cli/ and hook/ via per-file-ignores
- Use exact session_id match in Gemini telemetry lookup instead of
substring matching on raw log lines
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add agent_type_counts to frontend OverviewStats type
Aligns the TypeScript interface with the backend schema that now
returns agent type distribution data.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address fourth round of bugbot comments
- Merge _extract_session_id and _extract_project_path into single
_extract_session_meta to avoid reading each rollout file twice
- Use check=False in systemd stop to handle gracefully when server
isn't running instead of crashing with CalledProcessError
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: address fifth round of bugbot comments
- Preserve leading whitespace in config line replacement
- Guard API key truncation for short keys in doctor command
- XML-escape log path in launchd plist generation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add Codex CLI and Gemini CLI sessions to seed script
Extend seed_data.py with multi-agent support so the dashboard shows
realistic Codex/Gemini data alongside Claude Code. Also bump the ingest
rate limit from 120/min to 300/min to avoid 429s during seeding.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: mask short sensitive values in configure output
Short sensitive values (<=12 chars) were displayed in full by
`configure get`, `configure set`, and `configure list`. Now they
show "***" consistent with the doctor command.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>1 parent ce80d89 commit 94d9dfc
File tree
83 files changed
+15541
-216
lines changed- .github/workflows
- alembic/versions
- brand
- docs/plans
- frontend/src
- components/sessions
- __tests__
- pages/__tests__
- types
- scripts
- src/primer
- cli
- commands
- common
- hook
- mcp
- server/services
- tests
- website
- public
- src
- components
- content/blog
- layouts
- pages
- blog
- docs
- styles
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
83 files changed
+15541
-216
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
Lines changed: 60 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
0 commit comments