agentpack-cli 0.3.16__tar.gz → 0.3.18__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.
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/PKG-INFO +7 -4
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/README.md +5 -3
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/pyproject.toml +3 -1
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/__init__.py +1 -1
- agentpack_cli-0.3.18/src/agentpack/analysis/python_ast.py +12 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/python_imports.py +3 -1
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/role_inference.py +2 -1
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/symbols.py +2 -1
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/application/pack_service.py +49 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/cli.py +12 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/benchmark.py +10 -10
- agentpack_cli-0.3.18/src/agentpack/commands/compress_output.py +33 -0
- agentpack_cli-0.3.18/src/agentpack/commands/dashboard.py +43 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/eval_cmd.py +7 -7
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/explain.py +3 -3
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/init.py +27 -11
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/learn.py +113 -4
- agentpack_cli-0.3.18/src/agentpack/commands/memory.py +45 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/next_cmd.py +36 -0
- agentpack_cli-0.3.18/src/agentpack/commands/perf.py +69 -0
- agentpack_cli-0.3.18/src/agentpack/commands/release_check.py +278 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/release_cmd.py +11 -1
- agentpack_cli-0.3.18/src/agentpack/commands/retrieve.py +53 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/scan.py +1 -1
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/skills.py +7 -5
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/stats.py +13 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/tune.py +1 -1
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/workflow_cmd.py +110 -5
- agentpack_cli-0.3.18/src/agentpack/commands/wrap.py +114 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/config.py +54 -0
- agentpack_cli-0.3.18/src/agentpack/core/loop_protocol.py +349 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/models.py +1 -0
- agentpack_cli-0.3.18/src/agentpack/core/pack_registry.py +259 -0
- agentpack_cli-0.3.18/src/agentpack/dashboard/__init__.py +1 -0
- agentpack_cli-0.3.18/src/agentpack/dashboard/collectors.py +705 -0
- agentpack_cli-0.3.18/src/agentpack/dashboard/models.py +159 -0
- agentpack_cli-0.3.18/src/agentpack/dashboard/renderers.py +382 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/collector.py +29 -1
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/extractor.py +90 -2
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/feedback.py +110 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/models.py +12 -0
- agentpack_cli-0.3.18/src/agentpack/learning/provider.py +180 -0
- agentpack_cli-0.3.18/src/agentpack/learning/renderers.py +366 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/mcp_server.py +57 -0
- agentpack_cli-0.3.18/src/agentpack/output_compression/__init__.py +3 -0
- agentpack_cli-0.3.18/src/agentpack/output_compression/core.py +161 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/discovery.py +16 -31
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/models.py +1 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/parser.py +1 -0
- agentpack_cli-0.3.18/src/agentpack/router/skills_index.py +191 -0
- agentpack_cli-0.3.18/src/agentpack/session/events.py +63 -0
- agentpack_cli-0.3.16/src/agentpack/commands/release_check.py +0 -119
- agentpack_cli-0.3.16/src/agentpack/learning/provider.py +0 -52
- agentpack_cli-0.3.16/src/agentpack/learning/renderers.py +0 -235
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/.gitignore +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/LICENSE +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/antigravity.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/base.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/claude.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/codex.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/cursor.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/detect.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/generic.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/windsurf.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/dependency_graph.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/go_imports.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/java_imports.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/js_ts_imports.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/monorepo.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/naming_signals.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/ranking.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/repo_map.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/rust_imports.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/task_classifier.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/tests.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/application/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/_shared.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/ci_cmd.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/claude_cmd.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/dev_check.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/diagnose_selection.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/diff.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/doctor.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/guard.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/hook_cmd.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/ignore_cmd.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/install.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/mcp_cmd.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/migrate.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/monitor.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/pack.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/quickstart.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/repair.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/route.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/start_cmd.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/state_cmd.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/status.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/summarize.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/task_cmd.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/threads.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/verify_wheel.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/watch.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/bootstrap.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/cache.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/changed_paths.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/context_pack.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/diff.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/evals.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/execution_state.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/git.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/git_hooks.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/global_install.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/ignore.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/merkle.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/redactor.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/scanner.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/snapshot.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/task_freshness.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/thread_context.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/token_estimator.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/vscode_tasks.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/data/agentpack.md +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/antigravity.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/claude.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/codex.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/cursor.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/windsurf.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/agents.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/git_hooks.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/global_install.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/platform.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/vscode_tasks.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/lesson_ranker.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/quality.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/skill_map.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/renderers/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/renderers/compact.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/renderers/markdown.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/renderers/receipts.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/prompt_builder.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/scoring.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/service.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/session/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/session/state.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/summaries/__init__.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/summaries/base.py +0 -0
- {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/summaries/offline.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentpack-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.18
|
|
4
4
|
Summary: Local MCP context router for Claude Code, Codex, Cursor, and AI coding agents.
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -29,6 +29,7 @@ Requires-Dist: watchdog>=4.0.0; extra == 'all'
|
|
|
29
29
|
Provides-Extra: dev
|
|
30
30
|
Requires-Dist: mypy; extra == 'dev'
|
|
31
31
|
Requires-Dist: pytest; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-asyncio; extra == 'dev'
|
|
32
33
|
Requires-Dist: pytest-cov; extra == 'dev'
|
|
33
34
|
Requires-Dist: ruff; extra == 'dev'
|
|
34
35
|
Requires-Dist: tomli>=2.0.0; (python_version < '3.11') and extra == 'dev'
|
|
@@ -140,12 +141,12 @@ Suggested commands:
|
|
|
140
141
|
|
|
141
142
|
- **Task-focused packing**: ranks files from git changes, task terms, symbols, imports, related tests, configs, churn, repo history, and deterministic offline summaries.
|
|
142
143
|
- **Budget-aware compression**: emits `full`, `diff`, `symbols`, `skeleton`, or `summary` views instead of all-or-nothing file dumps.
|
|
143
|
-
- **Rendered-token accounting**: budgets against
|
|
144
|
-
- **Reserve buckets**: changed files, tests, docs, and dependencies each get protected selection capacity so one dirty area cannot starve the others.
|
|
144
|
+
- **Rendered-token accounting and reserve buckets**: budgets against actual markdown while protecting changed files, tests, docs, and dependencies.
|
|
145
145
|
- **Execution state**: optional task state files and git-derived fallback status show whether work is planned, in progress, blocked, done, committed, or committed but not pushed.
|
|
146
146
|
- **Thread-scoped context**: explicit `--thread <id>` or `--thread auto` isolates task/context files for multiple agents in one repo and warns on same-branch file overlap.
|
|
147
147
|
- **Task router**: MCP and CLI surfaces route a task to relevant files, scoped rules, installed skills, suggested commands, and safety warnings without executing skills automatically.
|
|
148
|
-
- **
|
|
148
|
+
- **Reversible registry and learning layer**: retrieves packed context by block ID, writes developer lessons, and feeds bounded selected-file miss feedback into future ranking.
|
|
149
|
+
- **Runtime scorecard and output compression**: `perf --history` tracks activity, while `compress-output` preserves failures, paths, diffs, and search hits from noisy logs.
|
|
149
150
|
- **Agent integrations**: installs Claude Code, Cursor, Windsurf, Codex, Antigravity, VS Code tasks, git hooks, and MCP configuration.
|
|
150
151
|
- **Local and measurable**: no API calls for scan, summarize, rank, pack, stats, or benchmark; quality is measured with expected-file evals.
|
|
151
152
|
|
|
@@ -376,6 +377,7 @@ gate.
|
|
|
376
377
|
| `agentpack guard --repair-stale --refresh-context` | Check freshness, repair stale rules, refresh context |
|
|
377
378
|
| `agentpack status` | Show context freshness and git/task state |
|
|
378
379
|
| `agentpack stats` | Show pack size, token savings, and top files |
|
|
380
|
+
| `agentpack dashboard` | Local HTML control plane for context, skills, learning, and benchmark quality |
|
|
379
381
|
| `agentpack explain --task auto` | Debug selected and omitted files |
|
|
380
382
|
| `agentpack diagnose-selection` | Turn latest pack/benchmark signals into concrete tuning actions |
|
|
381
383
|
| `agentpack ignore suggest|apply` | Suggest or apply `.agentignore` improvements |
|
|
@@ -459,6 +461,7 @@ AgentPack writes local artifacts under `.agentpack/`:
|
|
|
459
461
|
| `.agentpack/learning.prompt.md` | optional source-backed prompt for external LLM refinement |
|
|
460
462
|
| `.agentpack/pr-learning-comment.md` | optional PR-comment-ready learning summary |
|
|
461
463
|
| `.agentpack/learning-dashboard.html` | optional static dashboard from `agentpack learn --dashboard` |
|
|
464
|
+
| `.agentpack/dashboard.html` | local project dashboard from `agentpack dashboard` |
|
|
462
465
|
| `.agentpack/team-lessons.md` | optional shared lesson export from `agentpack learn --team-export` |
|
|
463
466
|
| `.agentpack/learning-feedback.jsonl` | optional local helpful/not-helpful feedback records |
|
|
464
467
|
| `.agentpack/pack_metadata.json` | freshness and pack metadata |
|
|
@@ -100,12 +100,12 @@ Suggested commands:
|
|
|
100
100
|
|
|
101
101
|
- **Task-focused packing**: ranks files from git changes, task terms, symbols, imports, related tests, configs, churn, repo history, and deterministic offline summaries.
|
|
102
102
|
- **Budget-aware compression**: emits `full`, `diff`, `symbols`, `skeleton`, or `summary` views instead of all-or-nothing file dumps.
|
|
103
|
-
- **Rendered-token accounting**: budgets against
|
|
104
|
-
- **Reserve buckets**: changed files, tests, docs, and dependencies each get protected selection capacity so one dirty area cannot starve the others.
|
|
103
|
+
- **Rendered-token accounting and reserve buckets**: budgets against actual markdown while protecting changed files, tests, docs, and dependencies.
|
|
105
104
|
- **Execution state**: optional task state files and git-derived fallback status show whether work is planned, in progress, blocked, done, committed, or committed but not pushed.
|
|
106
105
|
- **Thread-scoped context**: explicit `--thread <id>` or `--thread auto` isolates task/context files for multiple agents in one repo and warns on same-branch file overlap.
|
|
107
106
|
- **Task router**: MCP and CLI surfaces route a task to relevant files, scoped rules, installed skills, suggested commands, and safety warnings without executing skills automatically.
|
|
108
|
-
- **
|
|
107
|
+
- **Reversible registry and learning layer**: retrieves packed context by block ID, writes developer lessons, and feeds bounded selected-file miss feedback into future ranking.
|
|
108
|
+
- **Runtime scorecard and output compression**: `perf --history` tracks activity, while `compress-output` preserves failures, paths, diffs, and search hits from noisy logs.
|
|
109
109
|
- **Agent integrations**: installs Claude Code, Cursor, Windsurf, Codex, Antigravity, VS Code tasks, git hooks, and MCP configuration.
|
|
110
110
|
- **Local and measurable**: no API calls for scan, summarize, rank, pack, stats, or benchmark; quality is measured with expected-file evals.
|
|
111
111
|
|
|
@@ -336,6 +336,7 @@ gate.
|
|
|
336
336
|
| `agentpack guard --repair-stale --refresh-context` | Check freshness, repair stale rules, refresh context |
|
|
337
337
|
| `agentpack status` | Show context freshness and git/task state |
|
|
338
338
|
| `agentpack stats` | Show pack size, token savings, and top files |
|
|
339
|
+
| `agentpack dashboard` | Local HTML control plane for context, skills, learning, and benchmark quality |
|
|
339
340
|
| `agentpack explain --task auto` | Debug selected and omitted files |
|
|
340
341
|
| `agentpack diagnose-selection` | Turn latest pack/benchmark signals into concrete tuning actions |
|
|
341
342
|
| `agentpack ignore suggest|apply` | Suggest or apply `.agentignore` improvements |
|
|
@@ -419,6 +420,7 @@ AgentPack writes local artifacts under `.agentpack/`:
|
|
|
419
420
|
| `.agentpack/learning.prompt.md` | optional source-backed prompt for external LLM refinement |
|
|
420
421
|
| `.agentpack/pr-learning-comment.md` | optional PR-comment-ready learning summary |
|
|
421
422
|
| `.agentpack/learning-dashboard.html` | optional static dashboard from `agentpack learn --dashboard` |
|
|
423
|
+
| `.agentpack/dashboard.html` | local project dashboard from `agentpack dashboard` |
|
|
422
424
|
| `.agentpack/team-lessons.md` | optional shared lesson export from `agentpack learn --team-export` |
|
|
423
425
|
| `.agentpack/learning-feedback.jsonl` | optional local helpful/not-helpful feedback records |
|
|
424
426
|
| `.agentpack/pack_metadata.json` | freshness and pack metadata |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "agentpack-cli"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.18"
|
|
4
4
|
description = "Local MCP context router for Claude Code, Codex, Cursor, and AI coding agents."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -47,6 +47,7 @@ all = [
|
|
|
47
47
|
|
|
48
48
|
dev = [
|
|
49
49
|
"pytest",
|
|
50
|
+
"pytest-asyncio",
|
|
50
51
|
"pytest-cov",
|
|
51
52
|
"ruff",
|
|
52
53
|
"mypy",
|
|
@@ -55,6 +56,7 @@ dev = [
|
|
|
55
56
|
|
|
56
57
|
[tool.pytest.ini_options]
|
|
57
58
|
pythonpath = ["src"]
|
|
59
|
+
asyncio_default_fixture_loop_scope = "function"
|
|
58
60
|
markers = [
|
|
59
61
|
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
|
|
60
62
|
]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import ast
|
|
4
|
+
import warnings
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def parse_python_source(source: str, path: Path | str) -> ast.Module:
|
|
9
|
+
"""Parse scanned Python source without surfacing user-code SyntaxWarnings."""
|
|
10
|
+
with warnings.catch_warnings():
|
|
11
|
+
warnings.simplefilter("ignore", SyntaxWarning)
|
|
12
|
+
return ast.parse(source, filename=str(path))
|
|
@@ -3,11 +3,13 @@ from __future__ import annotations
|
|
|
3
3
|
import ast
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
|
|
6
|
+
from agentpack.analysis.python_ast import parse_python_source
|
|
7
|
+
|
|
6
8
|
|
|
7
9
|
def extract_imports(path: Path, text: str | None = None) -> list[str]:
|
|
8
10
|
try:
|
|
9
11
|
source = text if text is not None else path.read_text(errors="replace")
|
|
10
|
-
tree =
|
|
12
|
+
tree = parse_python_source(source, path)
|
|
11
13
|
except SyntaxError:
|
|
12
14
|
return []
|
|
13
15
|
|
|
@@ -6,6 +6,7 @@ from collections import defaultdict
|
|
|
6
6
|
from dataclasses import dataclass, field
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
|
+
from agentpack.analysis.python_ast import parse_python_source
|
|
9
10
|
from agentpack.core.models import Symbol
|
|
10
11
|
|
|
11
12
|
|
|
@@ -239,7 +240,7 @@ def extract_failure_hints(text: str) -> list[str]:
|
|
|
239
240
|
|
|
240
241
|
def _python_intelligence(path: str, text: str, symbols: list[Symbol]) -> CodeIntelligence:
|
|
241
242
|
try:
|
|
242
|
-
tree =
|
|
243
|
+
tree = parse_python_source(text, path)
|
|
243
244
|
except SyntaxError:
|
|
244
245
|
return CodeIntelligence(defines=[s.name for s in symbols[:40]])
|
|
245
246
|
|
|
@@ -4,13 +4,14 @@ import ast
|
|
|
4
4
|
import re
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
|
|
7
|
+
from agentpack.analysis.python_ast import parse_python_source
|
|
7
8
|
from agentpack.core.models import Symbol
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
def extract_python_symbols(path: Path) -> list[Symbol]:
|
|
11
12
|
try:
|
|
12
13
|
source = path.read_text(errors="replace")
|
|
13
|
-
tree =
|
|
14
|
+
tree = parse_python_source(source, path)
|
|
14
15
|
except (SyntaxError, OSError):
|
|
15
16
|
return []
|
|
16
17
|
|
|
@@ -27,6 +27,7 @@ from agentpack.core.models import (
|
|
|
27
27
|
ScanResult,
|
|
28
28
|
SelectedFile,
|
|
29
29
|
)
|
|
30
|
+
from agentpack.core.pack_registry import save_pack_registry
|
|
30
31
|
from agentpack.core.task_freshness import read_task_md, task_metadata
|
|
31
32
|
from agentpack.core.thread_context import (
|
|
32
33
|
append_thread_index,
|
|
@@ -36,6 +37,7 @@ from agentpack.core.thread_context import (
|
|
|
36
37
|
thread_paths,
|
|
37
38
|
)
|
|
38
39
|
from agentpack.core.token_estimator import estimate_tokens
|
|
40
|
+
from agentpack.learning.feedback import ranking_feedback_boosts
|
|
39
41
|
from agentpack.renderers.markdown import render_claude, render_generic
|
|
40
42
|
from agentpack.analysis.ranking import (
|
|
41
43
|
build_keyword_plan,
|
|
@@ -59,6 +61,7 @@ from agentpack.analysis.task_classifier import classify_task
|
|
|
59
61
|
from agentpack.analysis.tests import find_related_tests
|
|
60
62
|
from agentpack.analysis import dependency_graph as dep_graph_mod
|
|
61
63
|
from agentpack.summaries.base import build_all_summaries
|
|
64
|
+
from agentpack.session.events import record_event
|
|
62
65
|
|
|
63
66
|
|
|
64
67
|
@dataclass
|
|
@@ -267,6 +270,7 @@ class FileRanker:
|
|
|
267
270
|
changes.all_changed,
|
|
268
271
|
generic_ratio=generic_ratio,
|
|
269
272
|
)
|
|
273
|
+
scored = _apply_ranking_feedback_boosts(root, scored, task, changes.all_changed)
|
|
270
274
|
return RankResult(
|
|
271
275
|
keywords=keywords,
|
|
272
276
|
keyword_plan=keyword_plan,
|
|
@@ -673,6 +677,9 @@ class AdapterRegistry:
|
|
|
673
677
|
cfg.learning.dashboard_output,
|
|
674
678
|
cfg.learning.team_lessons_output,
|
|
675
679
|
cfg.learning.feedback_output,
|
|
680
|
+
cfg.learning.ranking_feedback_output,
|
|
681
|
+
cfg.runtime.pack_registry_output,
|
|
682
|
+
cfg.runtime.session_events_output,
|
|
676
683
|
}
|
|
677
684
|
)
|
|
678
685
|
return paths
|
|
@@ -789,6 +796,29 @@ class PackService:
|
|
|
789
796
|
concurrent_context=pack_obj.concurrent_context,
|
|
790
797
|
metadata_path=scoped_paths.metadata if scoped_paths else None,
|
|
791
798
|
)
|
|
799
|
+
save_pack_registry(
|
|
800
|
+
root,
|
|
801
|
+
pack_obj,
|
|
802
|
+
packable,
|
|
803
|
+
output_path=cfg.runtime.pack_registry_output,
|
|
804
|
+
max_records=cfg.runtime.max_registry_records,
|
|
805
|
+
)
|
|
806
|
+
record_event(
|
|
807
|
+
root,
|
|
808
|
+
"pack",
|
|
809
|
+
{
|
|
810
|
+
"task": request.task,
|
|
811
|
+
"agent": request.agent,
|
|
812
|
+
"mode": plan.mode,
|
|
813
|
+
"packed_tokens": packed_tokens,
|
|
814
|
+
"raw_tokens": all_tokens,
|
|
815
|
+
"selected_files": len(pack_obj.selected_files),
|
|
816
|
+
"omitted_files": len(pack_obj.omitted_relevant_files),
|
|
817
|
+
"changed_files": len(pack_obj.changed_files),
|
|
818
|
+
"context_path": str(out_path.relative_to(root)),
|
|
819
|
+
},
|
|
820
|
+
output_path=cfg.runtime.session_events_output,
|
|
821
|
+
)
|
|
792
822
|
if thread_row:
|
|
793
823
|
append_thread_index(root, thread_row)
|
|
794
824
|
excluded_receipts = [r for r in pack_obj.receipts if r.action == "excluded"]
|
|
@@ -1145,6 +1175,25 @@ def _apply_history_penalties(
|
|
|
1145
1175
|
return adjusted
|
|
1146
1176
|
|
|
1147
1177
|
|
|
1178
|
+
def _apply_ranking_feedback_boosts(
|
|
1179
|
+
root: Path,
|
|
1180
|
+
scored: list[tuple[Any, float, list[str]]],
|
|
1181
|
+
task: str,
|
|
1182
|
+
changed_paths: set[str],
|
|
1183
|
+
) -> list[tuple[Any, float, list[str]]]:
|
|
1184
|
+
boosts = ranking_feedback_boosts(root, task)
|
|
1185
|
+
if not boosts:
|
|
1186
|
+
return scored
|
|
1187
|
+
adjusted: list[tuple[Any, float, list[str]]] = []
|
|
1188
|
+
for fi, score, reasons in scored:
|
|
1189
|
+
boost = boosts.get(fi.path, 0.0)
|
|
1190
|
+
if boost <= 0 or fi.path in changed_paths:
|
|
1191
|
+
adjusted.append((fi, score, reasons))
|
|
1192
|
+
continue
|
|
1193
|
+
adjusted.append((fi, score + boost, [*reasons, f"learning feedback miss boost +{boost:.0f}"]))
|
|
1194
|
+
return adjusted
|
|
1195
|
+
|
|
1196
|
+
|
|
1148
1197
|
def _history_noise_counts(root: Path, *, window: int = 20) -> dict[str, int]:
|
|
1149
1198
|
metrics_path = root / ".agentpack" / "metrics.jsonl"
|
|
1150
1199
|
if not metrics_path.exists():
|
|
@@ -5,6 +5,8 @@ from agentpack.commands import (
|
|
|
5
5
|
benchmark,
|
|
6
6
|
claude_cmd,
|
|
7
7
|
ci_cmd,
|
|
8
|
+
compress_output,
|
|
9
|
+
dashboard,
|
|
8
10
|
dev_check,
|
|
9
11
|
diagnose_selection,
|
|
10
12
|
diff,
|
|
@@ -17,14 +19,17 @@ from agentpack.commands import (
|
|
|
17
19
|
init,
|
|
18
20
|
install,
|
|
19
21
|
learn,
|
|
22
|
+
memory,
|
|
20
23
|
mcp_cmd,
|
|
21
24
|
migrate,
|
|
22
25
|
monitor,
|
|
23
26
|
next_cmd,
|
|
24
27
|
pack,
|
|
28
|
+
perf,
|
|
25
29
|
quickstart,
|
|
26
30
|
release_cmd,
|
|
27
31
|
release_check,
|
|
32
|
+
retrieve,
|
|
28
33
|
repair,
|
|
29
34
|
route,
|
|
30
35
|
scan,
|
|
@@ -39,6 +44,7 @@ from agentpack.commands import (
|
|
|
39
44
|
tune,
|
|
40
45
|
verify_wheel,
|
|
41
46
|
watch,
|
|
47
|
+
wrap,
|
|
42
48
|
workflow_cmd,
|
|
43
49
|
)
|
|
44
50
|
from agentpack import __version__
|
|
@@ -70,9 +76,13 @@ for mod in [
|
|
|
70
76
|
task_cmd,
|
|
71
77
|
threads,
|
|
72
78
|
stats,
|
|
79
|
+
dashboard,
|
|
73
80
|
summarize,
|
|
81
|
+
compress_output,
|
|
74
82
|
learn,
|
|
83
|
+
memory,
|
|
75
84
|
pack,
|
|
85
|
+
perf,
|
|
76
86
|
install,
|
|
77
87
|
repair,
|
|
78
88
|
route,
|
|
@@ -97,7 +107,9 @@ for mod in [
|
|
|
97
107
|
skills,
|
|
98
108
|
release_check,
|
|
99
109
|
release_cmd,
|
|
110
|
+
retrieve,
|
|
100
111
|
start_cmd,
|
|
112
|
+
wrap,
|
|
101
113
|
workflow_cmd,
|
|
102
114
|
]:
|
|
103
115
|
mod.register(app)
|
|
@@ -1930,21 +1930,21 @@ def benchmark(
|
|
|
1930
1930
|
mode: str = typer.Option("balanced", "--mode", help="Mode for single-task run (lite|minimal|balanced|deep)."),
|
|
1931
1931
|
workspace: str = typer.Option("", "--workspace", help="Restrict benchmark packs to a workspace, e.g. apps/web."),
|
|
1932
1932
|
cases: str = typer.Option("", "--cases", help="Path to TOML cases file (default: .agentpack/benchmark.toml)."),
|
|
1933
|
-
compare: bool = typer.Option(False, "--compare",
|
|
1934
|
-
init: bool = typer.Option(False, "--init",
|
|
1935
|
-
results_template: bool = typer.Option(False, "--results-template",
|
|
1933
|
+
compare: bool = typer.Option(False, "--compare", help="Compare minimal/balanced/deep for each task."),
|
|
1934
|
+
init: bool = typer.Option(False, "--init", help="Scaffold a benchmark.toml and exit."),
|
|
1935
|
+
results_template: bool = typer.Option(False, "--results-template", help="Create benchmarks/results/YYYY-MM-DD.md for publishing benchmark evidence."),
|
|
1936
1936
|
from_history: int = typer.Option(0, "--from-history", help="Sample last N unique tasks from metrics.jsonl history."),
|
|
1937
1937
|
write_cases: bool = typer.Option(False, "--write-cases", help="Append --from-history cases to .agentpack/benchmark.toml."),
|
|
1938
|
-
sample_fixtures: bool = typer.Option(False, "--sample-fixtures",
|
|
1939
|
-
release_gate: bool = typer.Option(False, "--release-gate",
|
|
1940
|
-
public_repos: bool = typer.Option(False, "--public-repos",
|
|
1938
|
+
sample_fixtures: bool = typer.Option(False, "--sample-fixtures", help="Run bundled FastAPI/Next.js/mixed-repo fixture evals from a source checkout."),
|
|
1939
|
+
release_gate: bool = typer.Option(False, "--release-gate", help="Run the public real-repo release gate."),
|
|
1940
|
+
public_repos: bool = typer.Option(False, "--public-repos", help="Run real public-repo commit cases from benchmarks/public-repos.toml."),
|
|
1941
1941
|
public_repos_file: str = typer.Option("", "--public-repos-file", help="Path to public repo benchmark manifest."),
|
|
1942
1942
|
public_repos_cache: str = typer.Option("", "--public-repos-cache", help="Directory for cached public repo clones."),
|
|
1943
|
-
refresh_public_repos: bool = typer.Option(False, "--refresh-public-repos",
|
|
1944
|
-
public_table: bool = typer.Option(False, "--public-table",
|
|
1943
|
+
refresh_public_repos: bool = typer.Option(False, "--refresh-public-repos", help="Delete and reclone public repo benchmark cache before running."),
|
|
1944
|
+
public_table: bool = typer.Option(False, "--public-table", help="Write a publishable Markdown benchmark table under benchmarks/results/."),
|
|
1945
1945
|
no_public_table: bool = typer.Option(False, "--no-public-table", help="Do not write a benchmark results markdown table."),
|
|
1946
|
-
misses: bool = typer.Option(False, "--misses",
|
|
1947
|
-
prove_targets: bool = typer.Option(False, "--prove-targets",
|
|
1946
|
+
misses: bool = typer.Option(False, "--misses", help="Show diagnostics for expected files that were not selected."),
|
|
1947
|
+
prove_targets: bool = typer.Option(False, "--prove-targets", help="Exit non-zero unless recall/token precision targets pass."),
|
|
1948
1948
|
min_recall: float = typer.Option(0.60, "--min-recall", help="Recall target for --prove-targets."),
|
|
1949
1949
|
min_token_precision: float = typer.Option(0.50, "--min-token-precision", help="Token precision target for --prove-targets."),
|
|
1950
1950
|
) -> None:
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from agentpack.commands._shared import _root
|
|
8
|
+
from agentpack.core.config import load_config
|
|
9
|
+
from agentpack.output_compression import compress_output
|
|
10
|
+
from agentpack.session.events import record_event
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def register(app: typer.Typer) -> None:
|
|
14
|
+
@app.command("compress-output")
|
|
15
|
+
def compress_output_cmd(
|
|
16
|
+
file: str = typer.Argument("-", help="Output file to summarize, or '-' for stdin."),
|
|
17
|
+
kind: str = typer.Option("auto", "--kind", help="Output kind: auto|pytest|npm|git-diff|rg|ls."),
|
|
18
|
+
) -> None:
|
|
19
|
+
"""Summarize noisy command output while preserving actionable lines."""
|
|
20
|
+
root = _root()
|
|
21
|
+
cfg = load_config(root)
|
|
22
|
+
if file == "-":
|
|
23
|
+
content = sys.stdin.read()
|
|
24
|
+
else:
|
|
25
|
+
content = (root / file).read_text(encoding="utf-8", errors="replace")
|
|
26
|
+
result = compress_output(content, kind=kind, max_items=cfg.runtime.max_output_summary_items)
|
|
27
|
+
record_event(
|
|
28
|
+
root,
|
|
29
|
+
"compress_output",
|
|
30
|
+
{"kind": kind, "input_chars": len(content), "output_chars": len(result)},
|
|
31
|
+
output_path=cfg.runtime.session_events_output,
|
|
32
|
+
)
|
|
33
|
+
typer.echo(result, nl=False)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import subprocess
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
import typer
|
|
9
|
+
|
|
10
|
+
from agentpack.commands._shared import _atomic_write, _root, console
|
|
11
|
+
from agentpack.dashboard.collectors import build_project_dashboard_snapshot
|
|
12
|
+
from agentpack.dashboard.renderers import render_dashboard_html
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def register(app: typer.Typer) -> None:
|
|
16
|
+
@app.command()
|
|
17
|
+
def dashboard(
|
|
18
|
+
json_output: bool = typer.Option(False, "--json", help="Print normalized dashboard snapshot JSON."),
|
|
19
|
+
open_browser: bool = typer.Option(False, "--open", help="Open the generated HTML dashboard."),
|
|
20
|
+
output: str = typer.Option("", "--output", "-o", help="Dashboard HTML output path."),
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Generate a local AgentPack dashboard."""
|
|
23
|
+
root = _root()
|
|
24
|
+
snapshot = build_project_dashboard_snapshot(root)
|
|
25
|
+
if json_output:
|
|
26
|
+
typer.echo(json.dumps(snapshot.model_dump(mode="json"), indent=2, sort_keys=True))
|
|
27
|
+
return
|
|
28
|
+
|
|
29
|
+
out = root / (output or ".agentpack/dashboard.html")
|
|
30
|
+
out.parent.mkdir(parents=True, exist_ok=True)
|
|
31
|
+
_atomic_write(out, render_dashboard_html(snapshot))
|
|
32
|
+
console.print(f"[green]✓[/] Wrote [bold]{out}[/]")
|
|
33
|
+
if open_browser:
|
|
34
|
+
_open_file(out)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _open_file(path: Path) -> None:
|
|
38
|
+
if sys.platform == "darwin":
|
|
39
|
+
subprocess.run(["open", str(path)], check=False)
|
|
40
|
+
elif sys.platform.startswith("win"):
|
|
41
|
+
subprocess.run(["cmd", "/c", "start", "", str(path)], check=False)
|
|
42
|
+
else:
|
|
43
|
+
subprocess.run(["xdg-open", str(path)], check=False)
|
|
@@ -28,25 +28,25 @@ from agentpack.core.evals import (
|
|
|
28
28
|
def register(app: typer.Typer) -> None:
|
|
29
29
|
@app.command(name="eval")
|
|
30
30
|
def eval_command(
|
|
31
|
-
init: bool = typer.Option(False, "--init",
|
|
31
|
+
init: bool = typer.Option(False, "--init", help="Scaffold .agentpack/evals.toml and exit."),
|
|
32
32
|
cases: str = typer.Option("", "--cases", help="Path to eval TOML file (default: .agentpack/evals.toml)."),
|
|
33
33
|
case: str = typer.Option("", "--case", help="Run one eval case by id."),
|
|
34
|
-
prove_targets: bool = typer.Option(False, "--prove-targets",
|
|
34
|
+
prove_targets: bool = typer.Option(False, "--prove-targets", help="Exit non-zero when any eval case fails."),
|
|
35
35
|
capture: str = typer.Option("", "--capture", help="Append a case from current git diff using this id."),
|
|
36
36
|
failure_class: str = typer.Option("context", "--failure-class", help=f"Failure class ({' | '.join(FAILURE_CLASSES)})."),
|
|
37
37
|
failure_source: str = typer.Option("agent_failed", "--failure-source", help="Failure source for captured cases."),
|
|
38
38
|
check: list[str] | None = typer.Option(None, "--check", help="Deterministic command check for --capture. Repeatable."),
|
|
39
39
|
task: str = typer.Option("", "--task", help="Task text for --capture."),
|
|
40
40
|
base_ref: str = typer.Option("HEAD", "--base-ref", help="Git base ref for diff checks."),
|
|
41
|
-
report: bool = typer.Option(False, "--report",
|
|
42
|
-
ci_template: bool = typer.Option(False, "--ci-template",
|
|
41
|
+
report: bool = typer.Option(False, "--report", help="Write benchmarks/results/YYYY-MM-DD-eval.md."),
|
|
42
|
+
ci_template: bool = typer.Option(False, "--ci-template", help="Scaffold .github/workflows/agentpack-eval.yml and exit."),
|
|
43
43
|
variant: str = typer.Option("agentpack", "--variant", help="Result variant label, e.g. baseline or agentpack."),
|
|
44
44
|
compare_variants: str = typer.Option("", "--compare-variants", help="Compare latest results as BASELINE:VARIANT."),
|
|
45
|
-
replay: bool = typer.Option(False, "--replay",
|
|
46
|
-
watch: bool = typer.Option(False, "--watch",
|
|
45
|
+
replay: bool = typer.Option(False, "--replay", help="Run cases in isolated git worktrees using captured patch_file artifacts."),
|
|
46
|
+
watch: bool = typer.Option(False, "--watch", help="Rerun evals when git diff state changes."),
|
|
47
47
|
interval: float = typer.Option(2.0, "--interval", help="Watch polling interval in seconds."),
|
|
48
48
|
max_runs: int = typer.Option(0, "--max-runs", help="Maximum watch runs (0 = unlimited)."),
|
|
49
|
-
until_pass: bool = typer.Option(False, "--until-pass",
|
|
49
|
+
until_pass: bool = typer.Option(False, "--until-pass", help="Stop watch mode after all cases pass."),
|
|
50
50
|
agent: str = typer.Option("", "--agent", help="Agent label to store with --capture metadata."),
|
|
51
51
|
prompt_file: str = typer.Option("", "--prompt-file", help="Prompt artifact path to store with --capture."),
|
|
52
52
|
context_file: str = typer.Option(".agentpack/context.md", "--context-file", help="Context artifact path to store with --capture."),
|
|
@@ -294,9 +294,9 @@ def register(app: typer.Typer) -> None:
|
|
|
294
294
|
budget: int = typer.Option(0, "--budget", help="Token budget (0 = use config default)."),
|
|
295
295
|
since: Optional[str] = typer.Option(None, "--since", help="Git ref to compare against (e.g. HEAD~1, main)."),
|
|
296
296
|
file: Optional[str] = typer.Option(None, "--file", help="Show detailed score breakdown for a specific file."),
|
|
297
|
-
omitted: bool = typer.Option(False, "--omitted",
|
|
298
|
-
why_noisy: bool = typer.Option(False, "--why-noisy",
|
|
299
|
-
budget_plan: bool = typer.Option(False, "--budget-plan",
|
|
297
|
+
omitted: bool = typer.Option(False, "--omitted", help="Show top-10 excluded files and why."),
|
|
298
|
+
why_noisy: bool = typer.Option(False, "--why-noisy", help="Explain broad task terms and noisy selection signals."),
|
|
299
|
+
budget_plan: bool = typer.Option(False, "--budget-plan", help="Show selected modes, token costs, and value per token."),
|
|
300
300
|
) -> None:
|
|
301
301
|
"""Explain which files would be selected and why, without writing a context file."""
|
|
302
302
|
if mode not in ("lite", "minimal", "balanced", "deep"):
|
|
@@ -55,13 +55,9 @@ def _repo_gitignore_entries(share_cache: bool = False, agent: str = "generic") -
|
|
|
55
55
|
".agentpack/snapshots/",
|
|
56
56
|
".agentpack/context*",
|
|
57
57
|
".agentpack/metrics.jsonl",
|
|
58
|
+
".agentpack/session-events.jsonl",
|
|
58
59
|
".agentpack/pack_metadata.json",
|
|
59
|
-
".agentpack/
|
|
60
|
-
".agentpack/.gitignore",
|
|
61
|
-
".agentpack/.mcp_reminded",
|
|
62
|
-
".agentpack/session.json",
|
|
63
|
-
".agentpack/task.md",
|
|
64
|
-
".agentpack/benchmark_results.jsonl",
|
|
60
|
+
".agentpack/pack-registry.json",
|
|
65
61
|
".agentpack/learning.md",
|
|
66
62
|
".agentpack/daily-summary.md",
|
|
67
63
|
".agentpack/skills-progress.json",
|
|
@@ -71,6 +67,18 @@ def _repo_gitignore_entries(share_cache: bool = False, agent: str = "generic") -
|
|
|
71
67
|
".agentpack/learning-dashboard.html",
|
|
72
68
|
".agentpack/team-lessons.md",
|
|
73
69
|
".agentpack/learning-feedback.jsonl",
|
|
70
|
+
".agentpack/ranking-feedback.jsonl",
|
|
71
|
+
".agentpack/learning-inputs.json",
|
|
72
|
+
".agentpack/activity.log",
|
|
73
|
+
".agentpack/.gitignore",
|
|
74
|
+
".agentpack/.mcp_reminded",
|
|
75
|
+
".agentpack/session.json",
|
|
76
|
+
".agentpack/task.md",
|
|
77
|
+
".agentpack/benchmark_results.jsonl",
|
|
78
|
+
".agentpack/loop_state.json",
|
|
79
|
+
".agentpack/progress.md",
|
|
80
|
+
".agentpack/loop_events.jsonl",
|
|
81
|
+
".agentpack/loop_failures.jsonl",
|
|
74
82
|
".agentignore",
|
|
75
83
|
]
|
|
76
84
|
)
|
|
@@ -97,12 +105,9 @@ def _agentpack_gitignore_content(share_cache: bool = False) -> str:
|
|
|
97
105
|
"snapshots/",
|
|
98
106
|
"context.*",
|
|
99
107
|
"metrics.jsonl",
|
|
108
|
+
"session-events.jsonl",
|
|
100
109
|
"pack_metadata.json",
|
|
101
|
-
"
|
|
102
|
-
".mcp_reminded",
|
|
103
|
-
"session.json",
|
|
104
|
-
"task.md",
|
|
105
|
-
"benchmark_results.jsonl",
|
|
110
|
+
"pack-registry.json",
|
|
106
111
|
"learning.md",
|
|
107
112
|
"daily-summary.md",
|
|
108
113
|
"skills-progress.json",
|
|
@@ -112,6 +117,17 @@ def _agentpack_gitignore_content(share_cache: bool = False) -> str:
|
|
|
112
117
|
"learning-dashboard.html",
|
|
113
118
|
"team-lessons.md",
|
|
114
119
|
"learning-feedback.jsonl",
|
|
120
|
+
"ranking-feedback.jsonl",
|
|
121
|
+
"learning-inputs.json",
|
|
122
|
+
"activity.log",
|
|
123
|
+
".mcp_reminded",
|
|
124
|
+
"session.json",
|
|
125
|
+
"task.md",
|
|
126
|
+
"benchmark_results.jsonl",
|
|
127
|
+
"loop_state.json",
|
|
128
|
+
"progress.md",
|
|
129
|
+
"loop_events.jsonl",
|
|
130
|
+
"loop_failures.jsonl",
|
|
115
131
|
]
|
|
116
132
|
)
|
|
117
133
|
return "\n".join(entries) + "\n"
|