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.
Files changed (155) hide show
  1. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/PKG-INFO +7 -4
  2. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/README.md +5 -3
  3. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/pyproject.toml +3 -1
  4. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/__init__.py +1 -1
  5. agentpack_cli-0.3.18/src/agentpack/analysis/python_ast.py +12 -0
  6. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/python_imports.py +3 -1
  7. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/role_inference.py +2 -1
  8. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/symbols.py +2 -1
  9. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/application/pack_service.py +49 -0
  10. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/cli.py +12 -0
  11. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/benchmark.py +10 -10
  12. agentpack_cli-0.3.18/src/agentpack/commands/compress_output.py +33 -0
  13. agentpack_cli-0.3.18/src/agentpack/commands/dashboard.py +43 -0
  14. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/eval_cmd.py +7 -7
  15. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/explain.py +3 -3
  16. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/init.py +27 -11
  17. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/learn.py +113 -4
  18. agentpack_cli-0.3.18/src/agentpack/commands/memory.py +45 -0
  19. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/next_cmd.py +36 -0
  20. agentpack_cli-0.3.18/src/agentpack/commands/perf.py +69 -0
  21. agentpack_cli-0.3.18/src/agentpack/commands/release_check.py +278 -0
  22. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/release_cmd.py +11 -1
  23. agentpack_cli-0.3.18/src/agentpack/commands/retrieve.py +53 -0
  24. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/scan.py +1 -1
  25. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/skills.py +7 -5
  26. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/stats.py +13 -0
  27. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/tune.py +1 -1
  28. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/workflow_cmd.py +110 -5
  29. agentpack_cli-0.3.18/src/agentpack/commands/wrap.py +114 -0
  30. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/config.py +54 -0
  31. agentpack_cli-0.3.18/src/agentpack/core/loop_protocol.py +349 -0
  32. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/models.py +1 -0
  33. agentpack_cli-0.3.18/src/agentpack/core/pack_registry.py +259 -0
  34. agentpack_cli-0.3.18/src/agentpack/dashboard/__init__.py +1 -0
  35. agentpack_cli-0.3.18/src/agentpack/dashboard/collectors.py +705 -0
  36. agentpack_cli-0.3.18/src/agentpack/dashboard/models.py +159 -0
  37. agentpack_cli-0.3.18/src/agentpack/dashboard/renderers.py +382 -0
  38. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/collector.py +29 -1
  39. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/extractor.py +90 -2
  40. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/feedback.py +110 -0
  41. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/models.py +12 -0
  42. agentpack_cli-0.3.18/src/agentpack/learning/provider.py +180 -0
  43. agentpack_cli-0.3.18/src/agentpack/learning/renderers.py +366 -0
  44. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/mcp_server.py +57 -0
  45. agentpack_cli-0.3.18/src/agentpack/output_compression/__init__.py +3 -0
  46. agentpack_cli-0.3.18/src/agentpack/output_compression/core.py +161 -0
  47. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/discovery.py +16 -31
  48. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/models.py +1 -0
  49. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/parser.py +1 -0
  50. agentpack_cli-0.3.18/src/agentpack/router/skills_index.py +191 -0
  51. agentpack_cli-0.3.18/src/agentpack/session/events.py +63 -0
  52. agentpack_cli-0.3.16/src/agentpack/commands/release_check.py +0 -119
  53. agentpack_cli-0.3.16/src/agentpack/learning/provider.py +0 -52
  54. agentpack_cli-0.3.16/src/agentpack/learning/renderers.py +0 -235
  55. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/.gitignore +0 -0
  56. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/LICENSE +0 -0
  57. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/__init__.py +0 -0
  58. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/antigravity.py +0 -0
  59. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/base.py +0 -0
  60. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/claude.py +0 -0
  61. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/codex.py +0 -0
  62. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/cursor.py +0 -0
  63. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/detect.py +0 -0
  64. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/generic.py +0 -0
  65. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/adapters/windsurf.py +0 -0
  66. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/__init__.py +0 -0
  67. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/dependency_graph.py +0 -0
  68. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/go_imports.py +0 -0
  69. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/java_imports.py +0 -0
  70. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/js_ts_imports.py +0 -0
  71. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/monorepo.py +0 -0
  72. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/naming_signals.py +0 -0
  73. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/ranking.py +0 -0
  74. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/repo_map.py +0 -0
  75. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/rust_imports.py +0 -0
  76. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/task_classifier.py +0 -0
  77. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/analysis/tests.py +0 -0
  78. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/application/__init__.py +0 -0
  79. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/__init__.py +0 -0
  80. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/_shared.py +0 -0
  81. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/ci_cmd.py +0 -0
  82. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/claude_cmd.py +0 -0
  83. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/dev_check.py +0 -0
  84. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/diagnose_selection.py +0 -0
  85. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/diff.py +0 -0
  86. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/doctor.py +0 -0
  87. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/guard.py +0 -0
  88. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/hook_cmd.py +0 -0
  89. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/ignore_cmd.py +0 -0
  90. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/install.py +0 -0
  91. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/mcp_cmd.py +0 -0
  92. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/migrate.py +0 -0
  93. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/monitor.py +0 -0
  94. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/pack.py +0 -0
  95. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/quickstart.py +0 -0
  96. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/repair.py +0 -0
  97. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/route.py +0 -0
  98. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/start_cmd.py +0 -0
  99. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/state_cmd.py +0 -0
  100. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/status.py +0 -0
  101. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/summarize.py +0 -0
  102. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/task_cmd.py +0 -0
  103. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/threads.py +0 -0
  104. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/verify_wheel.py +0 -0
  105. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/commands/watch.py +0 -0
  106. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/__init__.py +0 -0
  107. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/bootstrap.py +0 -0
  108. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/cache.py +0 -0
  109. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/changed_paths.py +0 -0
  110. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/context_pack.py +0 -0
  111. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/diff.py +0 -0
  112. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/evals.py +0 -0
  113. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/execution_state.py +0 -0
  114. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/git.py +0 -0
  115. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/git_hooks.py +0 -0
  116. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/global_install.py +0 -0
  117. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/ignore.py +0 -0
  118. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/merkle.py +0 -0
  119. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/redactor.py +0 -0
  120. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/scanner.py +0 -0
  121. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/snapshot.py +0 -0
  122. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/task_freshness.py +0 -0
  123. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/thread_context.py +0 -0
  124. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/token_estimator.py +0 -0
  125. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/core/vscode_tasks.py +0 -0
  126. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/data/agentpack.md +0 -0
  127. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/__init__.py +0 -0
  128. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/antigravity.py +0 -0
  129. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/claude.py +0 -0
  130. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/codex.py +0 -0
  131. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/cursor.py +0 -0
  132. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/installers/windsurf.py +0 -0
  133. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/__init__.py +0 -0
  134. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/agents.py +0 -0
  135. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/git_hooks.py +0 -0
  136. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/global_install.py +0 -0
  137. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/platform.py +0 -0
  138. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/integrations/vscode_tasks.py +0 -0
  139. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/__init__.py +0 -0
  140. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/lesson_ranker.py +0 -0
  141. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/quality.py +0 -0
  142. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/learning/skill_map.py +0 -0
  143. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/renderers/__init__.py +0 -0
  144. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/renderers/compact.py +0 -0
  145. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/renderers/markdown.py +0 -0
  146. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/renderers/receipts.py +0 -0
  147. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/__init__.py +0 -0
  148. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/prompt_builder.py +0 -0
  149. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/scoring.py +0 -0
  150. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/router/service.py +0 -0
  151. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/session/__init__.py +0 -0
  152. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/session/state.py +0 -0
  153. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/summaries/__init__.py +0 -0
  154. {agentpack_cli-0.3.16 → agentpack_cli-0.3.18}/src/agentpack/summaries/base.py +0 -0
  155. {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.16
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 the actual markdown context, not only file payloads.
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
- - **Learning layer**: turns task diffs into developer learning notes, skill evidence, and compact lessons future agents can reuse.
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 the actual markdown context, not only file payloads.
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
- - **Learning layer**: turns task diffs into developer learning notes, skill evidence, and compact lessons future agents can reuse.
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.16"
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
  ]
@@ -1,3 +1,3 @@
1
1
  """AgentPack — task-aware context packing for AI coding agents."""
2
2
 
3
- __version__ = "0.3.16"
3
+ __version__ = "0.3.18"
@@ -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 = ast.parse(source)
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 = ast.parse(text)
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 = ast.parse(source)
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", is_flag=True, help="Compare minimal/balanced/deep for each task."),
1934
- init: bool = typer.Option(False, "--init", is_flag=True, help="Scaffold a benchmark.toml and exit."),
1935
- results_template: bool = typer.Option(False, "--results-template", is_flag=True, help="Create benchmarks/results/YYYY-MM-DD.md for publishing benchmark evidence."),
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", is_flag=True, help="Run bundled FastAPI/Next.js/mixed-repo fixture evals from a source checkout."),
1939
- release_gate: bool = typer.Option(False, "--release-gate", is_flag=True, help="Run the public real-repo release gate."),
1940
- public_repos: bool = typer.Option(False, "--public-repos", is_flag=True, help="Run real public-repo commit cases from benchmarks/public-repos.toml."),
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", is_flag=True, help="Delete and reclone public repo benchmark cache before running."),
1944
- public_table: bool = typer.Option(False, "--public-table", is_flag=True, help="Write a publishable Markdown benchmark table under benchmarks/results/."),
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", is_flag=True, help="Show diagnostics for expected files that were not selected."),
1947
- prove_targets: bool = typer.Option(False, "--prove-targets", is_flag=True, help="Exit non-zero unless recall/token precision targets pass."),
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", is_flag=True, help="Scaffold .agentpack/evals.toml and exit."),
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", is_flag=True, help="Exit non-zero when any eval case fails."),
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", is_flag=True, help="Write benchmarks/results/YYYY-MM-DD-eval.md."),
42
- ci_template: bool = typer.Option(False, "--ci-template", is_flag=True, help="Scaffold .github/workflows/agentpack-eval.yml and exit."),
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", is_flag=True, help="Run cases in isolated git worktrees using captured patch_file artifacts."),
46
- watch: bool = typer.Option(False, "--watch", is_flag=True, help="Rerun evals when git diff state changes."),
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", is_flag=True, help="Stop watch mode after all cases 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", is_flag=True, help="Show top-10 excluded files and why."),
298
- why_noisy: bool = typer.Option(False, "--why-noisy", is_flag=True, help="Explain broad task terms and noisy selection signals."),
299
- budget_plan: bool = typer.Option(False, "--budget-plan", is_flag=True, help="Show selected modes, token costs, and value per token."),
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/activity.log",
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
- "activity.log",
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"