agentpack-cli 0.3.13__tar.gz → 0.3.15__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 (141) hide show
  1. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/PKG-INFO +50 -5
  2. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/README.md +49 -4
  3. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/pyproject.toml +1 -1
  4. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/__init__.py +1 -1
  5. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/application/pack_service.py +36 -13
  6. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/benchmark.py +243 -5
  7. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/dev_check.py +14 -1
  8. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/explain.py +3 -3
  9. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/guard.py +3 -3
  10. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/init.py +22 -9
  11. agentpack_cli-0.3.15/src/agentpack/commands/learn.py +179 -0
  12. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/migrate.py +3 -3
  13. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/pack.py +3 -3
  14. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/quickstart.py +3 -3
  15. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/release_check.py +16 -1
  16. agentpack_cli-0.3.15/src/agentpack/commands/skills.py +106 -0
  17. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/config.py +8 -0
  18. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/context_pack.py +8 -1
  19. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/models.py +1 -1
  20. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/learning/__init__.py +4 -0
  21. agentpack_cli-0.3.15/src/agentpack/learning/feedback.py +171 -0
  22. agentpack_cli-0.3.15/src/agentpack/learning/lesson_ranker.py +39 -0
  23. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/learning/models.py +34 -0
  24. agentpack_cli-0.3.15/src/agentpack/learning/provider.py +52 -0
  25. agentpack_cli-0.3.15/src/agentpack/learning/renderers.py +235 -0
  26. agentpack_cli-0.3.15/src/agentpack/learning/skill_map.py +142 -0
  27. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/mcp_server.py +16 -0
  28. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/router/models.py +9 -0
  29. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/router/parser.py +34 -1
  30. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/router/prompt_builder.py +25 -3
  31. agentpack_cli-0.3.15/src/agentpack/router/scoring.py +409 -0
  32. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/router/service.py +100 -0
  33. agentpack_cli-0.3.13/src/agentpack/commands/learn.py +0 -101
  34. agentpack_cli-0.3.13/src/agentpack/commands/skills.py +0 -46
  35. agentpack_cli-0.3.13/src/agentpack/learning/feedback.py +0 -22
  36. agentpack_cli-0.3.13/src/agentpack/learning/renderers.py +0 -99
  37. agentpack_cli-0.3.13/src/agentpack/learning/skill_map.py +0 -29
  38. agentpack_cli-0.3.13/src/agentpack/router/scoring.py +0 -178
  39. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/.gitignore +0 -0
  40. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/LICENSE +0 -0
  41. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/adapters/__init__.py +0 -0
  42. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/adapters/antigravity.py +0 -0
  43. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/adapters/base.py +0 -0
  44. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/adapters/claude.py +0 -0
  45. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/adapters/codex.py +0 -0
  46. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/adapters/cursor.py +0 -0
  47. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/adapters/detect.py +0 -0
  48. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/adapters/generic.py +0 -0
  49. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/adapters/windsurf.py +0 -0
  50. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/__init__.py +0 -0
  51. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/dependency_graph.py +0 -0
  52. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/go_imports.py +0 -0
  53. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/java_imports.py +0 -0
  54. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/js_ts_imports.py +0 -0
  55. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/monorepo.py +0 -0
  56. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/naming_signals.py +0 -0
  57. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/python_imports.py +0 -0
  58. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/ranking.py +0 -0
  59. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/repo_map.py +0 -0
  60. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/role_inference.py +0 -0
  61. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/rust_imports.py +0 -0
  62. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/symbols.py +0 -0
  63. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/task_classifier.py +0 -0
  64. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/analysis/tests.py +0 -0
  65. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/application/__init__.py +0 -0
  66. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/cli.py +0 -0
  67. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/__init__.py +0 -0
  68. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/_shared.py +0 -0
  69. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/ci_cmd.py +0 -0
  70. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/claude_cmd.py +0 -0
  71. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/diagnose_selection.py +0 -0
  72. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/diff.py +0 -0
  73. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/doctor.py +0 -0
  74. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/eval_cmd.py +0 -0
  75. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/hook_cmd.py +0 -0
  76. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/ignore_cmd.py +0 -0
  77. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/install.py +0 -0
  78. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/mcp_cmd.py +0 -0
  79. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/monitor.py +0 -0
  80. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/next_cmd.py +0 -0
  81. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/release_cmd.py +0 -0
  82. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/repair.py +0 -0
  83. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/route.py +0 -0
  84. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/scan.py +0 -0
  85. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/start_cmd.py +0 -0
  86. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/state_cmd.py +0 -0
  87. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/stats.py +0 -0
  88. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/status.py +0 -0
  89. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/summarize.py +0 -0
  90. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/task_cmd.py +0 -0
  91. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/threads.py +0 -0
  92. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/tune.py +0 -0
  93. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/verify_wheel.py +0 -0
  94. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/watch.py +0 -0
  95. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/commands/workflow_cmd.py +0 -0
  96. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/__init__.py +0 -0
  97. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/bootstrap.py +0 -0
  98. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/cache.py +0 -0
  99. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/changed_paths.py +0 -0
  100. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/diff.py +0 -0
  101. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/evals.py +0 -0
  102. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/execution_state.py +0 -0
  103. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/git.py +0 -0
  104. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/git_hooks.py +0 -0
  105. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/global_install.py +0 -0
  106. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/ignore.py +0 -0
  107. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/merkle.py +0 -0
  108. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/redactor.py +0 -0
  109. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/scanner.py +0 -0
  110. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/snapshot.py +0 -0
  111. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/task_freshness.py +0 -0
  112. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/thread_context.py +0 -0
  113. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/token_estimator.py +0 -0
  114. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/core/vscode_tasks.py +0 -0
  115. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/data/agentpack.md +0 -0
  116. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/installers/__init__.py +0 -0
  117. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/installers/antigravity.py +0 -0
  118. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/installers/claude.py +0 -0
  119. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/installers/codex.py +0 -0
  120. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/installers/cursor.py +0 -0
  121. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/installers/windsurf.py +0 -0
  122. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/integrations/__init__.py +0 -0
  123. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/integrations/agents.py +0 -0
  124. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/integrations/git_hooks.py +0 -0
  125. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/integrations/global_install.py +0 -0
  126. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/integrations/platform.py +0 -0
  127. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/integrations/vscode_tasks.py +0 -0
  128. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/learning/collector.py +0 -0
  129. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/learning/extractor.py +0 -0
  130. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/learning/quality.py +0 -0
  131. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/renderers/__init__.py +0 -0
  132. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/renderers/compact.py +0 -0
  133. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/renderers/markdown.py +0 -0
  134. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/renderers/receipts.py +0 -0
  135. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/router/__init__.py +0 -0
  136. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/router/discovery.py +0 -0
  137. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/session/__init__.py +0 -0
  138. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/session/state.py +0 -0
  139. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/summaries/__init__.py +0 -0
  140. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/src/agentpack/summaries/base.py +0 -0
  141. {agentpack_cli-0.3.13 → agentpack_cli-0.3.15}/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.13
3
+ Version: 0.3.15
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
@@ -63,12 +63,39 @@ pipx run --spec agentpack-cli agentpack route --task "fix auth token expiry"
63
63
 
64
64
  ![AgentPack route demo](docs/assets/agentpack-route-demo.svg)
65
65
 
66
- > **Status: alpha (v0.3.13).** Works, tested, and used in real sessions. Python and JavaScript/TypeScript are the best-supported languages. Current benchmarks are useful regression checks, not broad proof that AgentPack improves coding-agent success. API may change before 1.0.
66
+ > **Status: alpha (v0.3.15).** Works, tested, and used in real sessions. Python and JavaScript/TypeScript are the best-supported languages. Current benchmarks are useful regression checks, not broad proof that AgentPack improves coding-agent success. API may change before 1.0.
67
67
  >
68
68
  > **Platform note:** macOS, Linux, and Windows are supported. Windows support targets PowerShell plus Git for Windows. `cmd.exe` and bare Git setups are not a supported path yet.
69
69
  >
70
70
  > **Name note:** PyPI package is `agentpack-cli`, npm package is `@vishal2612200/agentpack`, and the command is `agentpack`. This project is unrelated to AgentPack dataset papers or other repos with the same name.
71
71
 
72
+ ## What's New in 0.3.15
73
+
74
+ AgentPack Router now recommends skills with stronger local signals: richer
75
+ frontmatter, confidence thresholds, negative triggers, diversity-aware ranking,
76
+ and a pull-based MCP `get_skill` flow. Skill benchmark cases can declare
77
+ `expected_skills` and `avoid_skills`, and `agentpack skills feedback` records
78
+ local outcome signals for future routing.
79
+
80
+ ## What's New in 0.3.14
81
+
82
+ AgentPack Learn now covers both sides of AI-assisted development: the coding
83
+ agent gets compact future-agent lessons, and the developer gets task-specific
84
+ learning notes, skill evidence, and practice follow-up.
85
+
86
+ - `agentpack learn --provider-command` adds an opt-in local provider bridge:
87
+ AgentPack sends a bounded, redacted report JSON on stdin and accepts
88
+ LearningReport-compatible JSON fields on stdout. No hosted service is called
89
+ unless your command does it.
90
+ - `agentpack learn --dashboard` writes a static
91
+ `.agentpack/learning-dashboard.html` for IDE/browser review.
92
+ - `agentpack learn --team-export` writes `.agentpack/team-lessons.md`, a
93
+ shareable lesson file that omits personal skill history.
94
+ - `agentpack learn --feedback`, `--skills`, and `--drills` close the loop from
95
+ a task summary to skill memory and next-practice prompts.
96
+ - `agentpack dev-check` and `agentpack release-check` now print bounded failure
97
+ excerpts, so CI shows the failing test instead of only a red stage name.
98
+
72
99
  ## Before vs After
73
100
 
74
101
  Without AgentPack, a cold coding-agent session often starts with manual repo orientation:
@@ -205,10 +232,21 @@ agentpack learn --today
205
232
  agentpack learn --since main
206
233
  agentpack learn --json
207
234
  agentpack learn --llm-prompt --pr-comment
208
- agentpack learn --feedback helpful --feedback-note "Useful review prompts"
235
+ agentpack learn --provider-preview
236
+ agentpack learn --provider-command "python scripts/learn_provider.py"
237
+ agentpack learn --dashboard --team-export
238
+ agentpack learn --skills
239
+ agentpack learn --drills
240
+ agentpack learn --ci
241
+ agentpack learn --feedback helpful --feedback-target "skill:CLI design" --feedback-note "Useful review prompts"
209
242
  ```
210
243
 
211
- AgentPack writes developer notes to `.agentpack/learning.md` or `.agentpack/daily-summary.md`, updates `.agentpack/skills-progress.json`, writes `.agentpack/agent-lessons.md` for future coding agents, and can emit `.agentpack/learning.prompt.md` or `.agentpack/pr-learning-comment.md`. The MVP is local-first and reuses AgentPack redaction before reading diff snippets.
244
+ AgentPack writes developer notes to `.agentpack/learning.md` or `.agentpack/daily-summary.md`, updates a local skill memory in `.agentpack/skills-progress.json`, writes ranked `.agentpack/agent-lessons.md` for future coding agents, and can emit `.agentpack/learning.prompt.md`, `.agentpack/pr-learning-comment.md`, `.agentpack/learning-dashboard.html`, or `.agentpack/team-lessons.md`. Learn is local-first by default: `--provider-preview` shows the bounded payload for optional external refinement without making a network call, `--provider-command` runs only the local command you provide, and feedback stays in `.agentpack/learning-feedback.jsonl`.
245
+
246
+ Use `--dashboard` when a developer wants an IDE-friendly review surface. Use
247
+ `--team-export` when the useful lesson should be shared without publishing a
248
+ personal skill history. Use `--ci` to fail a workflow when the generated
249
+ learning is too generic or lacks changed-file evidence.
212
250
 
213
251
  ## Agent Setup
214
252
 
@@ -247,10 +285,15 @@ Generated instructions keep thread mode explicit. They recommend `AGENTPACK_THRE
247
285
  default_mode = "balanced"
248
286
  default_budget = 40000
249
287
 
288
+ [context_lite]
289
+ budget = 8000
290
+
250
291
  [agents.generic]
251
292
  output = ".agentpack/context.md"
252
293
  ```
253
294
 
295
+ Use `agentpack pack --mode lite` when you want a cheap ranked map before deeper file reads. Use `minimal`, `balanced`, or `deep` when you want progressively more file content in the generated pack.
296
+
254
297
  Use `.agentignore` to remove generated output, vendored code, large exports, or files that repeatedly appear as ranking noise. AgentPack imports obvious generated/noisy entries from gitignore sources during init, but repository-specific outputs should still be added by hand.
255
298
 
256
299
  Use scoring weights only after measuring a real miss:
@@ -319,7 +362,7 @@ gate.
319
362
  | `agentpack work "task"` | Initialize if needed, start task, refresh context, show next steps |
320
363
  | `agentpack start "task"` | Write task and run the guard/refresh workflow |
321
364
  | `agentpack finish --since main` | Diagnose, capture benchmark case, run checks, mark done |
322
- | `agentpack learn` | Generate developer learning notes, skill progress, and future-agent lessons |
365
+ | `agentpack learn` | Generate developer learning notes, skill memory, feedback-aware drills, and future-agent lessons |
323
366
  | `agentpack task show|set|clear` | Manage global or thread-scoped task files |
324
367
  | `agentpack pack` | Generate a ranked context pack for `.agentpack/task.md` |
325
368
  | `agentpack next --fix-all-safe` | Ask AgentPack what command or safe repair should happen next |
@@ -408,6 +451,8 @@ AgentPack writes local artifacts under `.agentpack/`:
408
451
  | `.agentpack/agent-lessons.md` | compact repo-specific lessons injected into future packs |
409
452
  | `.agentpack/learning.prompt.md` | optional source-backed prompt for external LLM refinement |
410
453
  | `.agentpack/pr-learning-comment.md` | optional PR-comment-ready learning summary |
454
+ | `.agentpack/learning-dashboard.html` | optional static dashboard from `agentpack learn --dashboard` |
455
+ | `.agentpack/team-lessons.md` | optional shared lesson export from `agentpack learn --team-export` |
411
456
  | `.agentpack/learning-feedback.jsonl` | optional local helpful/not-helpful feedback records |
412
457
  | `.agentpack/pack_metadata.json` | freshness and pack metadata |
413
458
  | `.agentpack/cache/` | offline file summaries keyed by hash |
@@ -24,12 +24,39 @@ pipx run --spec agentpack-cli agentpack route --task "fix auth token expiry"
24
24
 
25
25
  ![AgentPack route demo](docs/assets/agentpack-route-demo.svg)
26
26
 
27
- > **Status: alpha (v0.3.13).** Works, tested, and used in real sessions. Python and JavaScript/TypeScript are the best-supported languages. Current benchmarks are useful regression checks, not broad proof that AgentPack improves coding-agent success. API may change before 1.0.
27
+ > **Status: alpha (v0.3.15).** Works, tested, and used in real sessions. Python and JavaScript/TypeScript are the best-supported languages. Current benchmarks are useful regression checks, not broad proof that AgentPack improves coding-agent success. API may change before 1.0.
28
28
  >
29
29
  > **Platform note:** macOS, Linux, and Windows are supported. Windows support targets PowerShell plus Git for Windows. `cmd.exe` and bare Git setups are not a supported path yet.
30
30
  >
31
31
  > **Name note:** PyPI package is `agentpack-cli`, npm package is `@vishal2612200/agentpack`, and the command is `agentpack`. This project is unrelated to AgentPack dataset papers or other repos with the same name.
32
32
 
33
+ ## What's New in 0.3.15
34
+
35
+ AgentPack Router now recommends skills with stronger local signals: richer
36
+ frontmatter, confidence thresholds, negative triggers, diversity-aware ranking,
37
+ and a pull-based MCP `get_skill` flow. Skill benchmark cases can declare
38
+ `expected_skills` and `avoid_skills`, and `agentpack skills feedback` records
39
+ local outcome signals for future routing.
40
+
41
+ ## What's New in 0.3.14
42
+
43
+ AgentPack Learn now covers both sides of AI-assisted development: the coding
44
+ agent gets compact future-agent lessons, and the developer gets task-specific
45
+ learning notes, skill evidence, and practice follow-up.
46
+
47
+ - `agentpack learn --provider-command` adds an opt-in local provider bridge:
48
+ AgentPack sends a bounded, redacted report JSON on stdin and accepts
49
+ LearningReport-compatible JSON fields on stdout. No hosted service is called
50
+ unless your command does it.
51
+ - `agentpack learn --dashboard` writes a static
52
+ `.agentpack/learning-dashboard.html` for IDE/browser review.
53
+ - `agentpack learn --team-export` writes `.agentpack/team-lessons.md`, a
54
+ shareable lesson file that omits personal skill history.
55
+ - `agentpack learn --feedback`, `--skills`, and `--drills` close the loop from
56
+ a task summary to skill memory and next-practice prompts.
57
+ - `agentpack dev-check` and `agentpack release-check` now print bounded failure
58
+ excerpts, so CI shows the failing test instead of only a red stage name.
59
+
33
60
  ## Before vs After
34
61
 
35
62
  Without AgentPack, a cold coding-agent session often starts with manual repo orientation:
@@ -166,10 +193,21 @@ agentpack learn --today
166
193
  agentpack learn --since main
167
194
  agentpack learn --json
168
195
  agentpack learn --llm-prompt --pr-comment
169
- agentpack learn --feedback helpful --feedback-note "Useful review prompts"
196
+ agentpack learn --provider-preview
197
+ agentpack learn --provider-command "python scripts/learn_provider.py"
198
+ agentpack learn --dashboard --team-export
199
+ agentpack learn --skills
200
+ agentpack learn --drills
201
+ agentpack learn --ci
202
+ agentpack learn --feedback helpful --feedback-target "skill:CLI design" --feedback-note "Useful review prompts"
170
203
  ```
171
204
 
172
- AgentPack writes developer notes to `.agentpack/learning.md` or `.agentpack/daily-summary.md`, updates `.agentpack/skills-progress.json`, writes `.agentpack/agent-lessons.md` for future coding agents, and can emit `.agentpack/learning.prompt.md` or `.agentpack/pr-learning-comment.md`. The MVP is local-first and reuses AgentPack redaction before reading diff snippets.
205
+ AgentPack writes developer notes to `.agentpack/learning.md` or `.agentpack/daily-summary.md`, updates a local skill memory in `.agentpack/skills-progress.json`, writes ranked `.agentpack/agent-lessons.md` for future coding agents, and can emit `.agentpack/learning.prompt.md`, `.agentpack/pr-learning-comment.md`, `.agentpack/learning-dashboard.html`, or `.agentpack/team-lessons.md`. Learn is local-first by default: `--provider-preview` shows the bounded payload for optional external refinement without making a network call, `--provider-command` runs only the local command you provide, and feedback stays in `.agentpack/learning-feedback.jsonl`.
206
+
207
+ Use `--dashboard` when a developer wants an IDE-friendly review surface. Use
208
+ `--team-export` when the useful lesson should be shared without publishing a
209
+ personal skill history. Use `--ci` to fail a workflow when the generated
210
+ learning is too generic or lacks changed-file evidence.
173
211
 
174
212
  ## Agent Setup
175
213
 
@@ -208,10 +246,15 @@ Generated instructions keep thread mode explicit. They recommend `AGENTPACK_THRE
208
246
  default_mode = "balanced"
209
247
  default_budget = 40000
210
248
 
249
+ [context_lite]
250
+ budget = 8000
251
+
211
252
  [agents.generic]
212
253
  output = ".agentpack/context.md"
213
254
  ```
214
255
 
256
+ Use `agentpack pack --mode lite` when you want a cheap ranked map before deeper file reads. Use `minimal`, `balanced`, or `deep` when you want progressively more file content in the generated pack.
257
+
215
258
  Use `.agentignore` to remove generated output, vendored code, large exports, or files that repeatedly appear as ranking noise. AgentPack imports obvious generated/noisy entries from gitignore sources during init, but repository-specific outputs should still be added by hand.
216
259
 
217
260
  Use scoring weights only after measuring a real miss:
@@ -280,7 +323,7 @@ gate.
280
323
  | `agentpack work "task"` | Initialize if needed, start task, refresh context, show next steps |
281
324
  | `agentpack start "task"` | Write task and run the guard/refresh workflow |
282
325
  | `agentpack finish --since main` | Diagnose, capture benchmark case, run checks, mark done |
283
- | `agentpack learn` | Generate developer learning notes, skill progress, and future-agent lessons |
326
+ | `agentpack learn` | Generate developer learning notes, skill memory, feedback-aware drills, and future-agent lessons |
284
327
  | `agentpack task show|set|clear` | Manage global or thread-scoped task files |
285
328
  | `agentpack pack` | Generate a ranked context pack for `.agentpack/task.md` |
286
329
  | `agentpack next --fix-all-safe` | Ask AgentPack what command or safe repair should happen next |
@@ -369,6 +412,8 @@ AgentPack writes local artifacts under `.agentpack/`:
369
412
  | `.agentpack/agent-lessons.md` | compact repo-specific lessons injected into future packs |
370
413
  | `.agentpack/learning.prompt.md` | optional source-backed prompt for external LLM refinement |
371
414
  | `.agentpack/pr-learning-comment.md` | optional PR-comment-ready learning summary |
415
+ | `.agentpack/learning-dashboard.html` | optional static dashboard from `agentpack learn --dashboard` |
416
+ | `.agentpack/team-lessons.md` | optional shared lesson export from `agentpack learn --team-export` |
372
417
  | `.agentpack/learning-feedback.jsonl` | optional local helpful/not-helpful feedback records |
373
418
  | `.agentpack/pack_metadata.json` | freshness and pack metadata |
374
419
  | `.agentpack/cache/` | offline file summaries keyed by hash |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentpack-cli"
3
- version = "0.3.13"
3
+ version = "0.3.15"
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"
@@ -1,3 +1,3 @@
1
1
  """AgentPack — task-aware context packing for AI coding agents."""
2
2
 
3
- __version__ = "0.3.13"
3
+ __version__ = "0.3.15"
@@ -294,7 +294,6 @@ def _scan_metadata(
294
294
  "ignore_hash": _hash_text(ignore_text),
295
295
  "include_globs": include_globs,
296
296
  "exclude_globs": exclude_globs,
297
- "generated_paths": sorted(generated_paths),
298
297
  "max_file_tokens": cfg.context.max_file_tokens,
299
298
  "workspace": workspace,
300
299
  }
@@ -329,7 +328,10 @@ def _full_scan_reason(
329
328
  return "git unavailable"
330
329
 
331
330
  previous_meta = previous_snap.get("metadata") if isinstance(previous_snap.get("metadata"), dict) else {}
332
- if previous_meta.get("scan_fingerprint") != scan_metadata.get("scan_fingerprint"):
331
+ if previous_meta.get("scan_fingerprint") != scan_metadata.get("scan_fingerprint") and (
332
+ _normalized_scan_config(previous_meta.get("scan_config"))
333
+ != _normalized_scan_config(scan_metadata.get("scan_config"))
334
+ ):
333
335
  return "scan config or ignore rules changed"
334
336
  if previous_meta.get("git_branch") != scan_metadata.get("git_branch"):
335
337
  return "git branch changed"
@@ -346,6 +348,14 @@ def _hash_text(value: str) -> str:
346
348
  return hashlib.sha256(value.encode("utf-8")).hexdigest()
347
349
 
348
350
 
351
+ def _normalized_scan_config(value: Any) -> dict[str, Any]:
352
+ if not isinstance(value, dict):
353
+ return {}
354
+ normalized = dict(value)
355
+ normalized.pop("generated_paths", None)
356
+ return normalized
357
+
358
+
349
359
  def _hash_json(value: dict[str, Any]) -> str:
350
360
  raw = json.dumps(value, sort_keys=True, separators=(",", ":"))
351
361
  return _hash_text(raw)
@@ -382,7 +392,7 @@ class PackPlanner:
382
392
  def plan(self, request: PackRequest) -> PackPlan:
383
393
  root = request.root
384
394
  cfg = load_config(root)
385
- effective_budget = request.budget if request.budget > 0 else cfg.context.default_budget
395
+ effective_budget = _resolve_effective_budget(request, cfg)
386
396
  ignore_spec = load_spec(root / cfg.project.ignore_file)
387
397
  phase_times: dict[str, float] = {}
388
398
 
@@ -660,6 +670,8 @@ class AdapterRegistry:
660
670
  cfg.learning.agent_lessons_output,
661
671
  cfg.learning.llm_prompt_output,
662
672
  cfg.learning.pr_comment_output,
673
+ cfg.learning.dashboard_output,
674
+ cfg.learning.team_lessons_output,
663
675
  cfg.learning.feedback_output,
664
676
  }
665
677
  )
@@ -972,10 +984,18 @@ def _rank_omitted_relevant_files(files: list[OmittedRelevantFile]) -> list[Omitt
972
984
 
973
985
 
974
986
  def _repo_map_budget_for_mode(mode: str, effective_budget: int) -> int:
975
- caps = {"minimal": 300, "balanced": 600, "deep": 900}
987
+ caps = {"lite": 150, "minimal": 300, "balanced": 600, "deep": 900}
976
988
  return min(caps.get(mode, 500), max(0, effective_budget // 20))
977
989
 
978
990
 
991
+ def _resolve_effective_budget(request: PackRequest, cfg: Any) -> int:
992
+ if request.budget > 0:
993
+ return request.budget
994
+ if request.mode == "lite":
995
+ return cfg.context_lite.budget
996
+ return cfg.context.default_budget
997
+
998
+
979
999
  _FRONTEND_TASK_TERMS = {
980
1000
  "component", "components", "frontend", "landing", "layout", "page", "pages",
981
1001
  "preview", "previews", "public", "seo", "signup", "tool", "tools", "ui", "web",
@@ -1269,7 +1289,10 @@ def _summary_score_floor(cfg: Any, generic_ratio: float) -> float:
1269
1289
 
1270
1290
 
1271
1291
  def _summary_cap_for_mode(cfg: Any, mode: str, generic_ratio: float = 0.0) -> int:
1272
- if mode == "minimal":
1292
+ if mode == "lite":
1293
+ minimal_cap = cfg.context.max_summary_files_minimal
1294
+ cap = min(minimal_cap, cfg.context_lite.max_selected_files) if minimal_cap > 0 else cfg.context_lite.max_selected_files
1295
+ elif mode == "minimal":
1273
1296
  cap = cfg.context.max_summary_files_minimal
1274
1297
  elif mode == "balanced":
1275
1298
  cap = cfg.context.max_summary_files_balanced
@@ -1321,17 +1344,17 @@ def _guarded_summary_cap(
1321
1344
  if rows < 3:
1322
1345
  if no_live_changes and cap > 0:
1323
1346
  if effective_budget and effective_budget <= 2500:
1324
- return min(cap, 4 if mode == "minimal" else 6)
1347
+ return min(cap, 4 if mode in ("lite", "minimal") else 6)
1325
1348
  if effective_budget and effective_budget <= 6000:
1326
- return min(cap, 12 if mode == "minimal" else 16)
1349
+ return min(cap, 12 if mode in ("lite", "minimal") else 16)
1327
1350
  return min(cap, 16)
1328
1351
  return cap
1329
1352
  if avg_summary_precision <= 0.05:
1330
1353
  if no_live_changes:
1331
1354
  return -1
1332
- strict_cap = 3 if mode == "minimal" else 5 if mode == "balanced" else 10
1355
+ strict_cap = 2 if mode == "lite" else 3 if mode == "minimal" else 5 if mode == "balanced" else 10
1333
1356
  elif avg_summary_precision <= 0.15:
1334
- strict_cap = 3 if no_live_changes else 6 if mode == "minimal" else 12 if mode == "balanced" else 20
1357
+ strict_cap = 2 if mode == "lite" else 3 if no_live_changes else 6 if mode == "minimal" else 12 if mode == "balanced" else 20
1335
1358
  else:
1336
1359
  if no_live_changes and cap > 0:
1337
1360
  return min(cap, 8)
@@ -1389,15 +1412,15 @@ def _guarded_weak_signal_cap(
1389
1412
  if not no_live_changes:
1390
1413
  return 0
1391
1414
  if generic_ratio >= 0.5:
1392
- base = {"minimal": 0, "balanced": 1, "deep": 2}.get(mode, 1)
1415
+ base = {"lite": 0, "minimal": 0, "balanced": 1, "deep": 2}.get(mode, 1)
1393
1416
  elif generic_ratio >= 0.35:
1394
- base = {"minimal": 1, "balanced": 2, "deep": 3}.get(mode, 2)
1417
+ base = {"lite": 0, "minimal": 1, "balanced": 2, "deep": 3}.get(mode, 2)
1395
1418
  else:
1396
- base = {"minimal": 2, "balanced": 4, "deep": 6}.get(mode, 3)
1419
+ base = {"lite": 1, "minimal": 2, "balanced": 4, "deep": 6}.get(mode, 3)
1397
1420
  avg_precision, rows = _recent_token_precision(root)
1398
1421
  if rows >= 3:
1399
1422
  if avg_precision <= 0.1:
1400
- base = min(base, 0 if mode == "minimal" else 1)
1423
+ base = min(base, 0 if mode in ("lite", "minimal") else 1)
1401
1424
  elif avg_precision <= 0.2:
1402
1425
  base = min(base, 1 if mode != "deep" else 2)
1403
1426
  if effective_budget and effective_budget <= 2500: