agent-notes 2.15.1__tar.gz → 2.17.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. {agent_notes-2.15.1 → agent_notes-2.17.0}/PKG-INFO +28 -25
  2. {agent_notes-2.15.1 → agent_notes-2.17.0}/README.md +27 -24
  3. agent_notes-2.17.0/agent_notes/VERSION +1 -0
  4. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/cli.py +0 -18
  5. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/__init__.py +1 -2
  6. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/doctor.py +40 -5
  7. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/wizard.py +23 -17
  8. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/config.py +43 -53
  9. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/hooks/session-context.md.tpl +1 -1
  10. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/doctor_checks.py +8 -0
  11. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/domain/state.py +1 -0
  12. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/scripts/cost_report.py +2 -2
  13. agent_notes-2.17.0/agent_notes/services/counts.py +67 -0
  14. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/diagnostics/_checks.py +33 -49
  15. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/diagnostics/_display.py +11 -42
  16. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/install_state_builder.py +2 -0
  17. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/installer.py +5 -2
  18. agent_notes-2.17.0/agent_notes/services/session_context.py +36 -0
  19. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/state_store.py +2 -0
  20. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes.egg-info/PKG-INFO +28 -25
  21. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes.egg-info/SOURCES.txt +3 -2
  22. agent_notes-2.17.0/tests/functional/commands/test_doctor_command.py +404 -0
  23. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/commands/test_uninstall_command.py +131 -0
  24. agent_notes-2.17.0/tests/unit/services/test_session_context.py +132 -0
  25. agent_notes-2.17.0/tests/unit/test_import_health.py +260 -0
  26. agent_notes-2.15.1/agent_notes/VERSION +0 -1
  27. agent_notes-2.15.1/agent_notes/commands/update.py +0 -169
  28. agent_notes-2.15.1/agent_notes/services/session_context.py +0 -23
  29. agent_notes-2.15.1/tests/functional/commands/test_doctor_command.py +0 -150
  30. agent_notes-2.15.1/tests/functional/commands/test_update_command.py +0 -110
  31. {agent_notes-2.15.1 → agent_notes-2.17.0}/LICENSE +0 -0
  32. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/__init__.py +0 -0
  33. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/__main__.py +0 -0
  34. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/_install_helpers.py +0 -0
  35. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/build.py +0 -0
  36. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/config.py +0 -0
  37. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/info.py +0 -0
  38. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/install.py +0 -0
  39. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/list.py +0 -0
  40. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/memory.py +0 -0
  41. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/regenerate.py +0 -0
  42. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/set_role.py +0 -0
  43. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/uninstall.py +0 -0
  44. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/commands/validate.py +0 -0
  45. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/agents.yaml +0 -0
  46. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/analyst.md +0 -0
  47. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/api-reviewer.md +0 -0
  48. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/architect.md +0 -0
  49. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/coder.md +0 -0
  50. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/database-specialist.md +0 -0
  51. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/debugger.md +0 -0
  52. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/devil.md +0 -0
  53. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/devops.md +0 -0
  54. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/explorer.md +0 -0
  55. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/integrations.md +0 -0
  56. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/lead.md +0 -0
  57. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/performance-profiler.md +0 -0
  58. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/refactorer.md +0 -0
  59. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/reviewer.md +0 -0
  60. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/security-auditor.md +0 -0
  61. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/shared/cost_reporting.md +0 -0
  62. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/shared/phase0.md +0 -0
  63. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/system-auditor.md +0 -0
  64. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/tech-writer.md +0 -0
  65. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/test-runner.md +0 -0
  66. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/agents/test-writer.md +0 -0
  67. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/cli/claude.yaml +0 -0
  68. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/cli/copilot.yaml +0 -0
  69. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/cli/opencode.yaml +0 -0
  70. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/commands/brainstorm.md +0 -0
  71. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/commands/debug.md +0 -0
  72. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/commands/review.md +0 -0
  73. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/global-claude.md +0 -0
  74. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/global-copilot.md +0 -0
  75. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/global-opencode.md +0 -0
  76. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/models/claude-haiku-4-5.yaml +0 -0
  77. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/models/claude-opus-4-1.yaml +0 -0
  78. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/models/claude-opus-4-5.yaml +0 -0
  79. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/models/claude-opus-4-6.yaml +0 -0
  80. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/models/claude-opus-4-7.yaml +0 -0
  81. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/models/claude-sonnet-4-5.yaml +0 -0
  82. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/models/claude-sonnet-4-6.yaml +0 -0
  83. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/models/claude-sonnet-4.yaml +0 -0
  84. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/plugin/claude.yaml +0 -0
  85. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/plugin/opencode-index.js.template +0 -0
  86. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/plugin/opencode.yaml +0 -0
  87. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/pricing.yaml +0 -0
  88. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/roles/orchestrator.yaml +0 -0
  89. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/roles/reasoner.yaml +0 -0
  90. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/roles/scout.yaml +0 -0
  91. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/roles/worker.yaml +0 -0
  92. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/rules/code-quality.md +0 -0
  93. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/rules/safety.md +0 -0
  94. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/brainstorming/SKILL.md +0 -0
  95. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/caveman/SKILL.md +0 -0
  96. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/code-review/SKILL.md +0 -0
  97. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/debugging-protocol/SKILL.md +0 -0
  98. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/docker-compose/SKILL.md +0 -0
  99. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/docker-compose-advanced/SKILL.md +0 -0
  100. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/docker-dockerfile/SKILL.md +0 -0
  101. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/docker-dockerfile-languages/SKILL.md +0 -0
  102. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/git/SKILL.md +0 -0
  103. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/grill-me/SKILL.md +0 -0
  104. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/grill-with-docs/SKILL.md +0 -0
  105. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/improve-codebase-architecture/SKILL.md +0 -0
  106. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/obsidian-memory/SKILL.md +0 -0
  107. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-active-storage/SKILL.md +0 -0
  108. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-broadcasting/SKILL.md +0 -0
  109. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-concerns/SKILL.md +0 -0
  110. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-controllers/SKILL.md +0 -0
  111. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-controllers-advanced/SKILL.md +0 -0
  112. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-helpers/SKILL.md +0 -0
  113. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-initializers/SKILL.md +0 -0
  114. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-javascript/SKILL.md +0 -0
  115. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-jobs/SKILL.md +0 -0
  116. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-kamal/SKILL.md +0 -0
  117. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-lib/SKILL.md +0 -0
  118. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-mailers/SKILL.md +0 -0
  119. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-migrations/SKILL.md +0 -0
  120. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-models/SKILL.md +0 -0
  121. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-models-advanced/SKILL.md +0 -0
  122. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-routes/SKILL.md +0 -0
  123. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-style/SKILL.md +0 -0
  124. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-testing-controllers/SKILL.md +0 -0
  125. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-testing-models/SKILL.md +0 -0
  126. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-testing-system/SKILL.md +0 -0
  127. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-validations/SKILL.md +0 -0
  128. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-view-components/SKILL.md +0 -0
  129. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-view-components-advanced/SKILL.md +0 -0
  130. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-views/SKILL.md +0 -0
  131. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/rails-views-advanced/SKILL.md +0 -0
  132. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/refactoring-protocol/SKILL.md +0 -0
  133. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/setup-project-context/SKILL.md +0 -0
  134. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/tdd/SKILL.md +0 -0
  135. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/skills/zoom-out/SKILL.md +0 -0
  136. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/templates/__init__.py +0 -0
  137. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/templates/__pycache__/__init__.cpython-314.pyc +0 -0
  138. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/templates/frontmatter/__init__.py +0 -0
  139. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/templates/frontmatter/__pycache__/__init__.cpython-314.pyc +0 -0
  140. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/templates/frontmatter/__pycache__/claude.cpython-314.pyc +0 -0
  141. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/templates/frontmatter/__pycache__/opencode.cpython-314.pyc +0 -0
  142. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/templates/frontmatter/claude.py +0 -0
  143. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/data/templates/frontmatter/opencode.py +0 -0
  144. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/domain/__init__.py +0 -0
  145. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/domain/agent.py +0 -0
  146. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/domain/cli_backend.py +0 -0
  147. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/domain/diagnostics.py +0 -0
  148. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/domain/diff.py +0 -0
  149. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/domain/model.py +0 -0
  150. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/domain/role.py +0 -0
  151. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/domain/rule.py +0 -0
  152. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/domain/skill.py +0 -0
  153. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/install_state.py +0 -0
  154. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/registries/__init__.py +0 -0
  155. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/registries/_base.py +0 -0
  156. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/registries/agent_registry.py +0 -0
  157. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/registries/cli_registry.py +0 -0
  158. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/registries/model_registry.py +0 -0
  159. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/registries/role_registry.py +0 -0
  160. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/registries/rule_registry.py +0 -0
  161. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/registries/skill_registry.py +0 -0
  162. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/scripts/__init__.py +0 -0
  163. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/scripts/_claude_backend.py +0 -0
  164. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/scripts/_formatting.py +0 -0
  165. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/scripts/_opencode_backend.py +0 -0
  166. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/scripts/_pricing.py +0 -0
  167. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/__init__.py +0 -0
  168. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/credentials.py +0 -0
  169. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/diagnostics/__init__.py +0 -0
  170. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/diagnostics/_fix.py +0 -0
  171. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/diff.py +0 -0
  172. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/fs.py +0 -0
  173. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/memory_backend.py +0 -0
  174. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/rendering.py +0 -0
  175. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/settings_writer.py +0 -0
  176. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/ui.py +0 -0
  177. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/user_config.py +0 -0
  178. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/validation.py +0 -0
  179. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/services/wiki_backend.py +0 -0
  180. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes/state.py +0 -0
  181. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes.egg-info/dependency_links.txt +0 -0
  182. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes.egg-info/entry_points.txt +0 -0
  183. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes.egg-info/requires.txt +0 -0
  184. {agent_notes-2.15.1 → agent_notes-2.17.0}/agent_notes.egg-info/top_level.txt +0 -0
  185. {agent_notes-2.15.1 → agent_notes-2.17.0}/pyproject.toml +0 -0
  186. {agent_notes-2.15.1 → agent_notes-2.17.0}/setup.cfg +0 -0
  187. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/conftest.py +0 -0
  188. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/__init__.py +0 -0
  189. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/commands/__init__.py +0 -0
  190. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/commands/test_config_command.py +0 -0
  191. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/commands/test_info_command.py +0 -0
  192. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/commands/test_install_command.py +0 -0
  193. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/commands/test_list_command.py +0 -0
  194. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/commands/test_regenerate_command.py +0 -0
  195. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/commands/test_validate_command.py +0 -0
  196. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/memory/__init__.py +0 -0
  197. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/memory/test_memory_command.py +0 -0
  198. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/scripts/__init__.py +0 -0
  199. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/functional/scripts/test_release_script.py +0 -0
  200. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/integration/__init__.py +0 -0
  201. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/integration/build_output/__init__.py +0 -0
  202. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/integration/build_output/test_build_output.py +0 -0
  203. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/integration/install/__init__.py +0 -0
  204. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/integration/install/test_install_methods.py +0 -0
  205. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/integration/plugin_builders/__init__.py +0 -0
  206. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/integration/plugin_builders/test_plugin_builders.py +0 -0
  207. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/plugins/__init__.py +0 -0
  208. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/plugins/claude/__init__.py +0 -0
  209. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/plugins/claude/test_agents.py +0 -0
  210. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/plugins/test_skills.py +0 -0
  211. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/__init__.py +0 -0
  212. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/commands/__init__.py +0 -0
  213. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/commands/test_cost_report_subcommand.py +0 -0
  214. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/commands/test_count_agents.py +0 -0
  215. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/commands/test_memory_migrate.py +0 -0
  216. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/commands/test_wizard_orchestrator_skip.py +0 -0
  217. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/commands/test_wizard_preflight.py +0 -0
  218. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/registries/__init__.py +0 -0
  219. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/registries/test_registries.py +0 -0
  220. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/scripts/__init__.py +0 -0
  221. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/scripts/test_cost_report.py +0 -0
  222. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/scripts/test_cost_report_scoping.py +0 -0
  223. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/scripts/test_formatting_tty.py +0 -0
  224. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/scripts/test_time_aggregation.py +0 -0
  225. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/services/__init__.py +0 -0
  226. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/services/test_build_functions.py +0 -0
  227. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/services/test_credentials.py +0 -0
  228. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/services/test_fs.py +0 -0
  229. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/services/test_installer_plan.py +0 -0
  230. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/services/test_memory_backend.py +0 -0
  231. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/services/test_memory_backend_io.py +0 -0
  232. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/services/test_rendering_includes.py +0 -0
  233. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/services/test_settings_writer.py +0 -0
  234. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/services/test_wiki_backend.py +0 -0
  235. {agent_notes-2.15.1 → agent_notes-2.17.0}/tests/unit/test_memory_dir_for_backend.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-notes
3
- Version: 2.15.1
3
+ Version: 2.17.0
4
4
  Summary: AI agent configuration manager for Claude Code, OpenCode, and Copilot
5
5
  Author-email: Eugene Naumov <min.verkligheten@gmail.com>
6
6
  License-Expression: MIT
@@ -32,7 +32,7 @@ Dynamic: license-file
32
32
 
33
33
  AI agent configuration manager for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) and [OpenCode](https://github.com/opencode-ai/opencode).
34
34
 
35
- Configures a Lead agent (Opus) that orchestrates a team of 18 specialized subagents across three model tiers — so Opus plans and reasons, Sonnet executes, and Haiku explores.
35
+ Configures a Lead agent (Opus) that orchestrates a team of 18 specialized subagents across three model tiers — so Opus 4.6 plans and reasons, Sonnet 4.6 executes, and Haiku 4.5 explores.
36
36
 
37
37
  ## Quick Start
38
38
 
@@ -86,8 +86,8 @@ Iteration loop: edit source → `python -m build` → `pipx reinstall dist/*.whl
86
86
 
87
87
  ### 3. Plugin — limited functionality
88
88
 
89
- - **Claude Code**: install via the Claude Code plugin marketplace.
90
- - **OpenCode**: copy or symlink `.opencode-plugin/` into `~/.config/opencode/plugins/agent-notes/` and add `"plugin": ["agent-notes"]` to `opencode.json`.
89
+ - **Claude Code**: install via the Claude Code plugin marketplace or copy/symlink `.claude-plugin/` into `~/.claude/plugins/agent-notes/`.
90
+ - **OpenCode**: copy or symlink `.claude-plugin/` into `~/.config/opencode/plugins/agent-notes/` and add `"plugin": ["agent-notes"]` to `opencode.json`.
91
91
 
92
92
  The plugin runs a `session.start` hook that surfaces agent-notes context to the CLI session. It does **not** include the full `agent-notes` CLI (wizard, doctor, config, memory, etc.). For those, use install method 1 or 2.
93
93
 
@@ -113,9 +113,8 @@ agent-notes <command> [options]
113
113
 
114
114
  | Command | Description |
115
115
  |---------|-------------|
116
- | `install [--local] [--copy]` | Interactive wizard or direct install |
117
- | `uninstall [--local]` | Remove installed components |
118
- | `update` | Pull latest, rebuild, reinstall |
116
+ | `install [--local] [--copy] [--reconfigure]` | Interactive wizard or direct install |
117
+ | `uninstall [--local \| --global]` | Remove installed components (both scopes by default) |
119
118
  | `doctor [--local] [--fix]` | Check installation health |
120
119
  | `info` | Show status and component counts |
121
120
  | `list [clis\|models\|roles\|agents\|skills\|rules\|all]` | List engine components or installed |
@@ -123,6 +122,7 @@ agent-notes <command> [options]
123
122
  | `regenerate [--cli <cli>]` | Rebuild files from state.json (Phase 10+) |
124
123
  | `validate` | Lint source configuration files |
125
124
  | `memory [list\|size\|show\|reset\|export\|import] [name]` | Manage agent memory |
125
+ | `cost-report` | Show session cost breakdown by agent and model |
126
126
 
127
127
  ### Supported platforms
128
128
 
@@ -153,25 +153,25 @@ agent-notes memory add "Rails enum prefix" \
153
153
 
154
154
  ## Agent Team
155
155
 
156
- Specialized subagents with hierarchical model strategy: **Opus 4.7 decides, Sonnet 4 executes, Haiku 4.5 explores.**
156
+ Specialized subagents with hierarchical model strategy: **Opus 4.6 decides, Sonnet 4.6 executes, Haiku 4.5 explores.**
157
157
 
158
158
  | Agent | Model | Role |
159
159
  |-------|-------|------|
160
- | **lead** | Opus 4.7 | Plans, delegates, reviews. Orchestrator. |
161
- | **architect** | Opus 4.7 | System architecture, module boundaries, domain models. Read-only. |
162
- | **debugger** | Opus 4.7 | Bug investigation: reproduces, isolates, identifies root cause. Read-only. |
163
- | **coder** | Sonnet 4 | Implements features, fixes bugs, edits files. |
164
- | **reviewer** | Sonnet 4 | Code quality review. Read-only. |
165
- | **security-auditor** | Sonnet 4 | Security vulnerability analysis. Read-only. |
166
- | **test-writer** | Sonnet 4 | Writes tests for any framework. |
167
- | **test-runner** | Sonnet 4 | Diagnoses and fixes failing tests. |
168
- | **system-auditor** | Sonnet 4 | Codebase health: duplication, N+1, coupling. Read-only. |
169
- | **database-specialist** | Sonnet 4 | Schema design, indexes, query performance, migrations. Read-only. |
170
- | **performance-profiler** | Sonnet 4 | Response times, memory, caching, bundle size. Read-only. |
171
- | **devops** | Sonnet 4 | Docker, CI/CD, deployment configs. |
172
- | **devil** | Sonnet 4 | Challenges plans to surface hidden risks. Read-only. |
173
- | **integrations** | Sonnet 4 | Third-party integrations: OAuth, webhooks, payments. |
174
- | **refactorer** | Sonnet 4 | Improves code structure without changing behavior. |
160
+ | **lead** | Opus 4.6 | Plans, delegates, reviews. Orchestrator. |
161
+ | **architect** | Opus 4.6 | System architecture, module boundaries, domain models. Read-only. |
162
+ | **debugger** | Opus 4.6 | Bug investigation: reproduces, isolates, identifies root cause. Read-only. |
163
+ | **coder** | Sonnet 4.6 | Implements features, fixes bugs, edits files. |
164
+ | **reviewer** | Sonnet 4.6 | Code quality review. Read-only. |
165
+ | **security-auditor** | Sonnet 4.6 | Security vulnerability analysis. Read-only. |
166
+ | **test-writer** | Sonnet 4.6 | Writes tests for any framework. |
167
+ | **test-runner** | Sonnet 4.6 | Diagnoses and fixes failing tests. |
168
+ | **system-auditor** | Sonnet 4.6 | Codebase health: duplication, N+1, coupling. Read-only. |
169
+ | **database-specialist** | Sonnet 4.6 | Schema design, indexes, query performance, migrations. Read-only. |
170
+ | **performance-profiler** | Sonnet 4.6 | Response times, memory, caching, bundle size. Read-only. |
171
+ | **devops** | Sonnet 4.6 | Docker, CI/CD, deployment configs. |
172
+ | **devil** | Sonnet 4.6 | Challenges plans to surface hidden risks. Read-only. |
173
+ | **integrations** | Sonnet 4.6 | Third-party integrations: OAuth, webhooks, payments. |
174
+ | **refactorer** | Sonnet 4.6 | Improves code structure without changing behavior. |
175
175
  | **analyst** | Haiku 4.5 | Requirements analysis: surfaces missing or contradictory requirements. Read-only. |
176
176
  | **api-reviewer** | Haiku 4.5 | API design, versioning, error handling, backward compatibility. Read-only. |
177
177
  | **tech-writer** | Haiku 4.5 | Documentation: READMEs, API docs, changelogs. |
@@ -179,7 +179,7 @@ Specialized subagents with hierarchical model strategy: **Opus 4.7 decides, Sonn
179
179
 
180
180
  ## Architecture
181
181
 
182
- agent-notes is a 4-layer engine (domain / registries / services / commands). All extensible content (CLIs, models, roles, agents, skills, rules) lives in `agent_notes/data/` as YAML — adding a new CLI/model/role is a YAML drop, no Python changes. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md), [docs/ADD_CLI.md](docs/ADD_CLI.md), [docs/ADD_MODEL.md](docs/ADD_MODEL.md), [docs/ADD_ROLE.md](docs/ADD_ROLE.md).
182
+ agent-notes is a 4-layer engine (domain / registries / services / commands). All extensible content (CLIs, models, roles, agents, skills, rules) lives in `agent_notes/data/` as YAML — adding a new CLI/model/role is a YAML drop, no Python changes. Context is loaded in tiers: always-loaded (CLAUDE.md, rules, skill catalog), lazy-loaded (full skill content, agent prompts), and pull-based (memory notes). See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md), [docs/ADD_CLI.md](docs/ADD_CLI.md), [docs/ADD_MODEL.md](docs/ADD_MODEL.md), [docs/ADD_ROLE.md](docs/ADD_ROLE.md).
183
183
 
184
184
  ## Improved Claude Code workflows
185
185
 
@@ -205,6 +205,8 @@ Four failure modes that derail AI-assisted development, and the skills that addr
205
205
 
206
206
  42 on-demand knowledge modules across Rails, Docker, Kamal, Git, and Process. Run `agent-notes list skills` for the current list, or browse `agent_notes/data/skills/`.
207
207
 
208
+ The session context hook auto-generates a skill index from SKILL.md frontmatter at install time, so agents always know what skills are available without loading full skill content. This keeps context overhead low while maintaining skill discoverability.
209
+
208
210
  ### Using skills in Claude Code / OpenCode
209
211
 
210
212
  ```
@@ -222,6 +224,7 @@ Agents accumulate knowledge across sessions using one of three backends, chosen
222
224
  |---------|---------|----------|
223
225
  | **Local** | `~/.claude/agent-memory/<agent>/` — plain markdown per agent | Simple setup, no extra tools |
224
226
  | **Obsidian** | Category vault with YAML frontmatter and `[[wikilinks]]` | Visual browsing, backlinks, Dataview queries |
227
+ | **Wiki** | `~/Documents/Obsidian Vault/agent-wiki/` — structured wiki with categories | Team knowledge bases, shared context |
225
228
  | **None** | Disabled — no files written | Stateless or shared machines |
226
229
 
227
230
  ### Obsidian setup
@@ -269,7 +272,7 @@ Always use `_prefix: true` with Rails enums to avoid method name collisions.
269
272
 
270
273
  ## Development
271
274
 
272
- Python 3.9+ required. Build from source and run tests:
275
+ Python 3.10+ required. Build from source and run tests:
273
276
 
274
277
  ```bash
275
278
  python -m build && pipx install dist/*.whl
@@ -2,7 +2,7 @@
2
2
 
3
3
  AI agent configuration manager for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) and [OpenCode](https://github.com/opencode-ai/opencode).
4
4
 
5
- Configures a Lead agent (Opus) that orchestrates a team of 18 specialized subagents across three model tiers — so Opus plans and reasons, Sonnet executes, and Haiku explores.
5
+ Configures a Lead agent (Opus) that orchestrates a team of 18 specialized subagents across three model tiers — so Opus 4.6 plans and reasons, Sonnet 4.6 executes, and Haiku 4.5 explores.
6
6
 
7
7
  ## Quick Start
8
8
 
@@ -56,8 +56,8 @@ Iteration loop: edit source → `python -m build` → `pipx reinstall dist/*.whl
56
56
 
57
57
  ### 3. Plugin — limited functionality
58
58
 
59
- - **Claude Code**: install via the Claude Code plugin marketplace.
60
- - **OpenCode**: copy or symlink `.opencode-plugin/` into `~/.config/opencode/plugins/agent-notes/` and add `"plugin": ["agent-notes"]` to `opencode.json`.
59
+ - **Claude Code**: install via the Claude Code plugin marketplace or copy/symlink `.claude-plugin/` into `~/.claude/plugins/agent-notes/`.
60
+ - **OpenCode**: copy or symlink `.claude-plugin/` into `~/.config/opencode/plugins/agent-notes/` and add `"plugin": ["agent-notes"]` to `opencode.json`.
61
61
 
62
62
  The plugin runs a `session.start` hook that surfaces agent-notes context to the CLI session. It does **not** include the full `agent-notes` CLI (wizard, doctor, config, memory, etc.). For those, use install method 1 or 2.
63
63
 
@@ -83,9 +83,8 @@ agent-notes <command> [options]
83
83
 
84
84
  | Command | Description |
85
85
  |---------|-------------|
86
- | `install [--local] [--copy]` | Interactive wizard or direct install |
87
- | `uninstall [--local]` | Remove installed components |
88
- | `update` | Pull latest, rebuild, reinstall |
86
+ | `install [--local] [--copy] [--reconfigure]` | Interactive wizard or direct install |
87
+ | `uninstall [--local \| --global]` | Remove installed components (both scopes by default) |
89
88
  | `doctor [--local] [--fix]` | Check installation health |
90
89
  | `info` | Show status and component counts |
91
90
  | `list [clis\|models\|roles\|agents\|skills\|rules\|all]` | List engine components or installed |
@@ -93,6 +92,7 @@ agent-notes <command> [options]
93
92
  | `regenerate [--cli <cli>]` | Rebuild files from state.json (Phase 10+) |
94
93
  | `validate` | Lint source configuration files |
95
94
  | `memory [list\|size\|show\|reset\|export\|import] [name]` | Manage agent memory |
95
+ | `cost-report` | Show session cost breakdown by agent and model |
96
96
 
97
97
  ### Supported platforms
98
98
 
@@ -123,25 +123,25 @@ agent-notes memory add "Rails enum prefix" \
123
123
 
124
124
  ## Agent Team
125
125
 
126
- Specialized subagents with hierarchical model strategy: **Opus 4.7 decides, Sonnet 4 executes, Haiku 4.5 explores.**
126
+ Specialized subagents with hierarchical model strategy: **Opus 4.6 decides, Sonnet 4.6 executes, Haiku 4.5 explores.**
127
127
 
128
128
  | Agent | Model | Role |
129
129
  |-------|-------|------|
130
- | **lead** | Opus 4.7 | Plans, delegates, reviews. Orchestrator. |
131
- | **architect** | Opus 4.7 | System architecture, module boundaries, domain models. Read-only. |
132
- | **debugger** | Opus 4.7 | Bug investigation: reproduces, isolates, identifies root cause. Read-only. |
133
- | **coder** | Sonnet 4 | Implements features, fixes bugs, edits files. |
134
- | **reviewer** | Sonnet 4 | Code quality review. Read-only. |
135
- | **security-auditor** | Sonnet 4 | Security vulnerability analysis. Read-only. |
136
- | **test-writer** | Sonnet 4 | Writes tests for any framework. |
137
- | **test-runner** | Sonnet 4 | Diagnoses and fixes failing tests. |
138
- | **system-auditor** | Sonnet 4 | Codebase health: duplication, N+1, coupling. Read-only. |
139
- | **database-specialist** | Sonnet 4 | Schema design, indexes, query performance, migrations. Read-only. |
140
- | **performance-profiler** | Sonnet 4 | Response times, memory, caching, bundle size. Read-only. |
141
- | **devops** | Sonnet 4 | Docker, CI/CD, deployment configs. |
142
- | **devil** | Sonnet 4 | Challenges plans to surface hidden risks. Read-only. |
143
- | **integrations** | Sonnet 4 | Third-party integrations: OAuth, webhooks, payments. |
144
- | **refactorer** | Sonnet 4 | Improves code structure without changing behavior. |
130
+ | **lead** | Opus 4.6 | Plans, delegates, reviews. Orchestrator. |
131
+ | **architect** | Opus 4.6 | System architecture, module boundaries, domain models. Read-only. |
132
+ | **debugger** | Opus 4.6 | Bug investigation: reproduces, isolates, identifies root cause. Read-only. |
133
+ | **coder** | Sonnet 4.6 | Implements features, fixes bugs, edits files. |
134
+ | **reviewer** | Sonnet 4.6 | Code quality review. Read-only. |
135
+ | **security-auditor** | Sonnet 4.6 | Security vulnerability analysis. Read-only. |
136
+ | **test-writer** | Sonnet 4.6 | Writes tests for any framework. |
137
+ | **test-runner** | Sonnet 4.6 | Diagnoses and fixes failing tests. |
138
+ | **system-auditor** | Sonnet 4.6 | Codebase health: duplication, N+1, coupling. Read-only. |
139
+ | **database-specialist** | Sonnet 4.6 | Schema design, indexes, query performance, migrations. Read-only. |
140
+ | **performance-profiler** | Sonnet 4.6 | Response times, memory, caching, bundle size. Read-only. |
141
+ | **devops** | Sonnet 4.6 | Docker, CI/CD, deployment configs. |
142
+ | **devil** | Sonnet 4.6 | Challenges plans to surface hidden risks. Read-only. |
143
+ | **integrations** | Sonnet 4.6 | Third-party integrations: OAuth, webhooks, payments. |
144
+ | **refactorer** | Sonnet 4.6 | Improves code structure without changing behavior. |
145
145
  | **analyst** | Haiku 4.5 | Requirements analysis: surfaces missing or contradictory requirements. Read-only. |
146
146
  | **api-reviewer** | Haiku 4.5 | API design, versioning, error handling, backward compatibility. Read-only. |
147
147
  | **tech-writer** | Haiku 4.5 | Documentation: READMEs, API docs, changelogs. |
@@ -149,7 +149,7 @@ Specialized subagents with hierarchical model strategy: **Opus 4.7 decides, Sonn
149
149
 
150
150
  ## Architecture
151
151
 
152
- agent-notes is a 4-layer engine (domain / registries / services / commands). All extensible content (CLIs, models, roles, agents, skills, rules) lives in `agent_notes/data/` as YAML — adding a new CLI/model/role is a YAML drop, no Python changes. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md), [docs/ADD_CLI.md](docs/ADD_CLI.md), [docs/ADD_MODEL.md](docs/ADD_MODEL.md), [docs/ADD_ROLE.md](docs/ADD_ROLE.md).
152
+ agent-notes is a 4-layer engine (domain / registries / services / commands). All extensible content (CLIs, models, roles, agents, skills, rules) lives in `agent_notes/data/` as YAML — adding a new CLI/model/role is a YAML drop, no Python changes. Context is loaded in tiers: always-loaded (CLAUDE.md, rules, skill catalog), lazy-loaded (full skill content, agent prompts), and pull-based (memory notes). See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md), [docs/ADD_CLI.md](docs/ADD_CLI.md), [docs/ADD_MODEL.md](docs/ADD_MODEL.md), [docs/ADD_ROLE.md](docs/ADD_ROLE.md).
153
153
 
154
154
  ## Improved Claude Code workflows
155
155
 
@@ -175,6 +175,8 @@ Four failure modes that derail AI-assisted development, and the skills that addr
175
175
 
176
176
  42 on-demand knowledge modules across Rails, Docker, Kamal, Git, and Process. Run `agent-notes list skills` for the current list, or browse `agent_notes/data/skills/`.
177
177
 
178
+ The session context hook auto-generates a skill index from SKILL.md frontmatter at install time, so agents always know what skills are available without loading full skill content. This keeps context overhead low while maintaining skill discoverability.
179
+
178
180
  ### Using skills in Claude Code / OpenCode
179
181
 
180
182
  ```
@@ -192,6 +194,7 @@ Agents accumulate knowledge across sessions using one of three backends, chosen
192
194
  |---------|---------|----------|
193
195
  | **Local** | `~/.claude/agent-memory/<agent>/` — plain markdown per agent | Simple setup, no extra tools |
194
196
  | **Obsidian** | Category vault with YAML frontmatter and `[[wikilinks]]` | Visual browsing, backlinks, Dataview queries |
197
+ | **Wiki** | `~/Documents/Obsidian Vault/agent-wiki/` — structured wiki with categories | Team knowledge bases, shared context |
195
198
  | **None** | Disabled — no files written | Stateless or shared machines |
196
199
 
197
200
  ### Obsidian setup
@@ -239,7 +242,7 @@ Always use `_prefix: true` with Rails enums to avoid method name collisions.
239
242
 
240
243
  ## Development
241
244
 
242
- Python 3.9+ required. Build from source and run tests:
245
+ Python 3.10+ required. Build from source and run tests:
243
246
 
244
247
  ```bash
245
248
  python -m build && pipx install dist/*.whl
@@ -0,0 +1 @@
1
+ 2.17.0
@@ -237,15 +237,6 @@ def main():
237
237
  p_uninstall = subparsers.add_parser("uninstall", help="Remove installed components")
238
238
  p_uninstall.add_argument("--local", action="store_true", help="Remove from current project")
239
239
 
240
- # update
241
- p_update = subparsers.add_parser("update", help="Pull latest, show diff, reinstall")
242
- p_update.add_argument("--dry-run", action="store_true", help="Show diff only, do not reinstall")
243
- p_update.add_argument("-y", "--yes", action="store_true", help="Skip confirmation prompt")
244
- p_update.add_argument("--only", action="append", choices=["agents","skills","rules","commands","config","settings"],
245
- help="Filter diff to these component types (repeatable)")
246
- p_update.add_argument("--since", help="Override 'before' commit label (cosmetic only for now)")
247
- p_update.add_argument("--skip-pull", action="store_true", help="Skip git pull")
248
-
249
240
  # doctor
250
241
  p_doctor = subparsers.add_parser("doctor", help="Check installation health")
251
242
  p_doctor.add_argument("--local", action="store_true", help="Check local installation")
@@ -325,15 +316,6 @@ def main():
325
316
  elif args.command == "uninstall":
326
317
  from .commands.install import uninstall
327
318
  uninstall(local=args.local)
328
- elif args.command == "update":
329
- from .commands.update import update
330
- update(
331
- dry_run=args.dry_run,
332
- yes=args.yes,
333
- only=args.only,
334
- since=args.since,
335
- skip_pull=args.skip_pull,
336
- )
337
319
  elif args.command == "doctor":
338
320
  from .commands.doctor import doctor
339
321
  doctor(local=args.local, fix=args.fix)
@@ -14,14 +14,13 @@ from . import uninstall
14
14
  from . import build
15
15
  from . import doctor
16
16
  from . import validate
17
- from . import update
18
17
  from . import regenerate
19
18
  from . import list as list_cmd
20
19
  from . import memory as memory_cmd
21
20
 
22
21
  __all__ = [
23
22
  "install", "uninstall", "show_info",
24
- "build", "doctor", "validate", "update",
23
+ "build", "doctor", "validate",
25
24
  "regenerate", "set_role", "interactive_install",
26
25
  "list_cmd", "memory_cmd",
27
26
  ]
@@ -62,25 +62,60 @@ def _check_session_hook(scope: str, issues: list) -> None:
62
62
  ))
63
63
 
64
64
 
65
+ def check_version_drift(scope: str, issues: list, fix_actions: list) -> None:
66
+ """Check if the installed package version matches the current running version."""
67
+ from .. import install_state
68
+ from ..config import get_version
69
+ from ..domain.diagnostics import Issue, FixAction
70
+ from ..services.state_store import get_scope
71
+ from pathlib import Path
72
+
73
+ state = install_state.load_current_state()
74
+ if state is None:
75
+ return
76
+
77
+ project_path = Path.cwd() if scope == "local" else None
78
+ scope_state = get_scope(state, scope, project_path)
79
+ if scope_state is None:
80
+ return
81
+
82
+ installed_version = scope_state.installed_version
83
+ if not installed_version:
84
+ return
85
+
86
+ current_version = get_version()
87
+ if installed_version != current_version:
88
+ issues.append(Issue(
89
+ "version_drift",
90
+ "state.json",
91
+ f"Installed with v{installed_version} but running v{current_version}. "
92
+ "Run `agent-notes doctor --fix` or `agent-notes install` to update.",
93
+ ))
94
+ fix_actions.append(FixAction("_TRIGGER_INSTALL", "state.json", "reinstall to update"))
95
+
96
+
65
97
  def diagnose(scope: str, fix: bool = False) -> bool:
66
98
  """Run all diagnostic checks and optionally apply fixes."""
67
99
  from .. import install_state
68
-
100
+
69
101
  print_summary(scope)
70
-
102
+
71
103
  issues = []
72
104
  fix_actions = []
73
-
105
+
74
106
  # Run checks
75
107
  check_stale_files(scope, issues, fix_actions)
76
- check_broken_symlinks(scope, issues, fix_actions)
108
+ check_broken_symlinks(scope, issues, fix_actions)
77
109
  check_shadowed_files(scope, issues, fix_actions)
78
110
  check_missing_files(scope, issues, fix_actions)
79
111
  check_content_drift(scope, issues, fix_actions)
80
-
112
+
81
113
  # Build freshness check (scope-independent)
82
114
  check_build_freshness(issues, fix_actions)
83
115
 
116
+ # Version drift check
117
+ check_version_drift(scope, issues, fix_actions)
118
+
84
119
  # SessionStart hook check (Claude Code only)
85
120
  _check_session_hook(scope, issues)
86
121
 
@@ -8,6 +8,7 @@ from .build import build
8
8
  from ._install_helpers import (
9
9
  count_agents, count_global, count_skills
10
10
  )
11
+ from ..services.counts import count_rules_total as _count_rules_total
11
12
  from ..services.fs import place_file, place_dir_contents
12
13
  from ..services.ui import (
13
14
  _can_interactive, _safe_input, _checkbox_select, _radio_select,
@@ -79,22 +80,7 @@ def _get_skill_groups() -> Dict[str, List[str]]:
79
80
 
80
81
  def _count_rules() -> int:
81
82
  """Count rule files."""
82
- # For testing, allow bypassing the registry
83
- import os
84
- if os.environ.get('_WIZARD_TEST_MODE'):
85
- if not DIST_RULES_DIR.exists():
86
- return 0
87
- return len(list(DIST_RULES_DIR.glob("*.md")))
88
- else:
89
- try:
90
- from ..registries import default_rule_registry
91
- registry = default_rule_registry()
92
- return len(registry.all())
93
- except Exception:
94
- # Fallback to old behavior if registry fails
95
- if not DIST_RULES_DIR.exists():
96
- return 0
97
- return len(list(DIST_RULES_DIR.glob("*.md")))
83
+ return _count_rules_total()
98
84
 
99
85
 
100
86
  def _select_cli(step: int = 0, total: int = 0, version: str = '') -> Set[str]:
@@ -629,7 +615,27 @@ def _interactive_install() -> None:
629
615
  print(f"{Color.RED}Build failed: {e}{Color.NC}")
630
616
  return
631
617
 
632
- # Execute installation
618
+ _execute_install(
619
+ clis=clis,
620
+ scope=scope,
621
+ copy_mode=copy_mode,
622
+ selected_skills=selected_skills,
623
+ role_models=role_models,
624
+ memory_backend=memory_backend,
625
+ memory_path=memory_path,
626
+ )
627
+
628
+
629
+ def _execute_install(
630
+ clis: Set[str],
631
+ scope: str,
632
+ copy_mode: bool,
633
+ selected_skills: List[str],
634
+ role_models: Dict[str, Dict[str, str]],
635
+ memory_backend: str,
636
+ memory_path: str,
637
+ ) -> None:
638
+ """Run all installation steps after parameters have been collected and the build is done."""
633
639
  print(f"\nInstalling ({scope}, {'copy' if copy_mode else 'symlink'}) ...\n")
634
640
 
635
641
  from ..services import fs as _fs
@@ -91,56 +91,46 @@ def global_output_path(backend) -> Optional[Path]:
91
91
  return dist_dir_for(backend) / backend.layout["config"]
92
92
 
93
93
 
94
- # === Backward compatibility - lazy evaluation of old constants ===
95
- def _lazy_backend_attr(backend_name: str, attr_func):
96
- """Helper for creating lazy attributes that depend on registry.
97
-
98
- Note: at initial config-module import time, ``agent_notes.cli_backend`` is
99
- NOT safe to import (circular). In that case we fall back to hardcoded
100
- values that match the shipped YAMLs. Later callers who import these
101
- constants after initial module load get the correct values via this same
102
- function (the registry is then importable).
103
- """
104
- def get_attr():
105
- try:
106
- from .registries.cli_registry import default_registry
107
- backend = default_registry().get(backend_name)
108
- return attr_func(backend)
109
- except (ImportError, KeyError):
110
- # Fallback to hardcoded values if registry not available (e.g. circular
111
- # import at initial module-load time). These match the shipped YAMLs.
112
- fallbacks = {
113
- 'claude': {'home': Path.home() / ".claude", 'template': "global-claude.md", 'dist': "claude"},
114
- 'opencode': {'home': Path.home() / ".config" / "opencode", 'template': "global-opencode.md", 'dist': "opencode"},
115
- 'copilot': {'home': Path.home() / ".github", 'template': "global-copilot.md", 'dist': "github"},
116
- }
117
- fb = fallbacks.get(backend_name, {})
118
- # Match by the attr_func's role — we encode intent via __name__ for named
119
- # functions, or by returning the generic dist/home/template via the lambdas
120
- # below (see DIST_*/GLOBAL_*/*_HOME assignments).
121
- name = attr_func.__name__
122
- if name == 'global_home' or name == '_fb_home':
123
- return fb.get('home')
124
- elif name == 'template_path' or name == '_fb_template':
125
- return DATA_DIR / fb.get('template', '')
126
- elif name == 'dist_dir' or name == '_fb_dist':
127
- return DIST_DIR / fb.get('dist', backend_name)
128
- return get_attr
129
-
130
-
131
- # Create backward-compatibility constants. We give the lambdas named stand-ins
132
- # so the fallback branch in _lazy_backend_attr can classify them correctly even
133
- # when the registry isn't importable yet (circular import during config init).
134
- def _fb_home(b): return b.global_home
135
- def _fb_dist(b): return dist_dir_for(b)
136
- def _fb_template(b): return global_template_path(b)
137
-
138
- CLAUDE_HOME = _lazy_backend_attr('claude', _fb_home)()
139
- OPENCODE_HOME = _lazy_backend_attr('opencode', _fb_home)()
140
- GITHUB_HOME = _lazy_backend_attr('copilot', _fb_home)()
141
- DIST_CLAUDE_DIR = _lazy_backend_attr('claude', _fb_dist)()
142
- DIST_OPENCODE_DIR = _lazy_backend_attr('opencode', _fb_dist)()
143
- DIST_GITHUB_DIR = _lazy_backend_attr('copilot', _fb_dist)()
144
- GLOBAL_CLAUDE_MD = _lazy_backend_attr('claude', _fb_template)()
145
- GLOBAL_OPENCODE_MD = _lazy_backend_attr('opencode', _fb_template)()
146
- GLOBAL_COPILOT_MD = _lazy_backend_attr('copilot', _fb_template)()
94
+ # === Backward compatibility constants ===
95
+ # Hardcoded fallbacks match the shipped YAMLs and protect against circular
96
+ # imports if this module is ever imported very early in the load sequence.
97
+ _FALLBACKS = {
98
+ 'claude': {'home': Path.home() / ".claude", 'template': "global-claude.md", 'dist': "claude"},
99
+ 'opencode': {'home': Path.home() / ".config" / "opencode", 'template': "global-opencode.md", 'dist': "opencode"},
100
+ 'copilot': {'home': Path.home() / ".github", 'template': "global-copilot.md", 'dist': "github"},
101
+ }
102
+
103
+
104
+ def _backend_home(name: str) -> Path:
105
+ try:
106
+ from .registries.cli_registry import default_registry
107
+ return default_registry().get(name).global_home
108
+ except (ImportError, KeyError):
109
+ return _FALLBACKS[name]['home']
110
+
111
+
112
+ def _backend_dist(name: str) -> Path:
113
+ try:
114
+ from .registries.cli_registry import default_registry
115
+ return dist_dir_for(default_registry().get(name))
116
+ except (ImportError, KeyError):
117
+ return DIST_DIR / _FALLBACKS[name]['dist']
118
+
119
+
120
+ def _backend_template(name: str) -> Path:
121
+ try:
122
+ from .registries.cli_registry import default_registry
123
+ return global_template_path(default_registry().get(name))
124
+ except (ImportError, KeyError):
125
+ return DATA_DIR / _FALLBACKS[name]['template']
126
+
127
+
128
+ CLAUDE_HOME = _backend_home('claude')
129
+ OPENCODE_HOME = _backend_home('opencode')
130
+ GITHUB_HOME = _backend_home('copilot')
131
+ DIST_CLAUDE_DIR = _backend_dist('claude')
132
+ DIST_OPENCODE_DIR = _backend_dist('opencode')
133
+ DIST_GITHUB_DIR = _backend_dist('copilot')
134
+ GLOBAL_CLAUDE_MD = _backend_template('claude')
135
+ GLOBAL_OPENCODE_MD = _backend_template('opencode')
136
+ GLOBAL_COPILOT_MD = _backend_template('copilot')
@@ -16,4 +16,4 @@ You have a specialized agent team installed. Delegate work to them — do not tr
16
16
  - Docs → tech-writer
17
17
  - Infrastructure → devops
18
18
 
19
- **Slash commands:** /plan /review /debug /brainstorm
19
+ {{skills_catalog}}
@@ -1,6 +1,14 @@
1
1
  """Scoped health checks for agent-notes — only touches files we own."""
2
2
 
3
3
  from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "expected_paths_for_install",
7
+ "check_missing",
8
+ "check_broken",
9
+ "check_drift",
10
+ "check_stale",
11
+ ]
4
12
  from pathlib import Path
5
13
  from typing import Optional
6
14
 
@@ -33,6 +33,7 @@ class ScopeState:
33
33
  installed_at: str = ""
34
34
  updated_at: str = ""
35
35
  mode: str = "symlink"
36
+ installed_version: str = ""
36
37
  clis: dict[str, BackendState] = field(default_factory=dict)
37
38
 
38
39
 
@@ -5,6 +5,7 @@ from datetime import datetime, timezone
5
5
  from pathlib import Path
6
6
 
7
7
  from . import _claude_backend, _opencode_backend
8
+ from ._opencode_backend import DB as _OPENCODE_DB
8
9
 
9
10
 
10
11
  def _opencode_active() -> bool:
@@ -21,8 +22,7 @@ def _by_recency(since: float | None = None, session_id: str | None = None) -> in
21
22
  if jsonls:
22
23
  claude_mtime = max(f.stat().st_mtime for f in jsonls)
23
24
 
24
- opencode_db = Path.home() / ".local" / "share" / "opencode" / "opencode.db"
25
- opencode_mtime = opencode_db.stat().st_mtime if opencode_db.exists() else 0.0
25
+ opencode_mtime = _OPENCODE_DB.stat().st_mtime if _OPENCODE_DB.exists() else 0.0
26
26
 
27
27
  if claude_mtime == 0.0 and opencode_mtime == 0.0:
28
28
  print("No session data found (no Claude Code transcripts or OpenCode database).")
@@ -0,0 +1,67 @@
1
+ """Shared counting helpers for installed components."""
2
+
3
+ import os
4
+
5
+
6
+ def count_rules_total() -> int:
7
+ """Count total available rule files (for wizard display).
8
+
9
+ Uses the rule registry when available; falls back to counting .md files
10
+ directly from the dist rules directory.
11
+ """
12
+ from ..config import DIST_RULES_DIR
13
+
14
+ if os.environ.get('_WIZARD_TEST_MODE'):
15
+ if not DIST_RULES_DIR.exists():
16
+ return 0
17
+ return len(list(DIST_RULES_DIR.glob("*.md")))
18
+
19
+ try:
20
+ from ..registries import default_rule_registry
21
+ registry = default_rule_registry()
22
+ return len(registry.all())
23
+ except Exception:
24
+ if not DIST_RULES_DIR.exists():
25
+ return 0
26
+ return len(list(DIST_RULES_DIR.glob("*.md")))
27
+
28
+
29
+ def count_skills(backend, scope: str) -> tuple:
30
+ """Count (installed, expected) skills for a CLI backend. Excludes broken symlinks."""
31
+ from . import installer
32
+ from ..config import DIST_SKILLS_DIR
33
+
34
+ if not backend.supports("skills"):
35
+ return 0, 0
36
+
37
+ skills_dir = installer.target_dir_for(backend, "skills", scope)
38
+ if skills_dir and skills_dir.exists():
39
+ installed = len([d for d in skills_dir.iterdir() if d.is_dir() and d.exists()])
40
+ else:
41
+ installed = 0
42
+
43
+ expected = (
44
+ len([d for d in DIST_SKILLS_DIR.iterdir() if d.is_dir()])
45
+ if DIST_SKILLS_DIR and DIST_SKILLS_DIR.exists()
46
+ else 0
47
+ )
48
+ return installed, expected
49
+
50
+
51
+ def count_rules(backend, scope: str) -> tuple:
52
+ """Count (installed, expected) rules for a CLI backend."""
53
+ from . import installer
54
+ from ..config import DIST_RULES_DIR
55
+
56
+ if not backend.supports("rules"):
57
+ return 0, 0
58
+
59
+ rules_dir = installer.target_dir_for(backend, "rules", scope)
60
+ installed = len(list(rules_dir.glob("*.md"))) if rules_dir and rules_dir.exists() else 0
61
+
62
+ expected = (
63
+ len(list(DIST_RULES_DIR.glob("*.md")))
64
+ if DIST_RULES_DIR and DIST_RULES_DIR.exists()
65
+ else 0
66
+ )
67
+ return installed, expected