agent-notes 2.23.0__tar.gz → 2.25.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 (269) hide show
  1. {agent_notes-2.23.0 → agent_notes-2.25.0}/PKG-INFO +9 -4
  2. {agent_notes-2.23.0 → agent_notes-2.25.0}/README.md +8 -3
  3. agent_notes-2.25.0/agent_notes/VERSION +1 -0
  4. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/cli.py +37 -6
  5. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/config.py +23 -2
  6. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/doctor.py +59 -14
  7. agent_notes-2.25.0/agent_notes/commands/hook.py +69 -0
  8. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/info.py +25 -2
  9. agent_notes-2.25.0/agent_notes/commands/install.py +225 -0
  10. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/memory/__init__.py +2 -5
  11. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/memory/notes.py +2 -1
  12. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/regenerate.py +46 -19
  13. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/wizard/__init__.py +42 -3
  14. agent_notes-2.25.0/agent_notes/commands/wizard/cost_report.py +41 -0
  15. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/wizard/execute.py +44 -15
  16. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/wizard/orchestrator.py +20 -7
  17. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/constants.py +10 -2
  18. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/agents.yaml +1 -1
  19. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/shared/execution.md +6 -2
  20. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/shared/hard_limits.md +8 -0
  21. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/cli/claude.yaml +1 -0
  22. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/global-claude.md +1 -15
  23. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/models/claude-opus-4-7.yaml +2 -1
  24. agent_notes-2.25.0/agent_notes/data/models/claude-opus-4-8.yaml +15 -0
  25. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/roles/reasoner.yaml +1 -1
  26. agent_notes-2.25.0/agent_notes/data/skills/handoff/SKILL.md +26 -0
  27. agent_notes-2.25.0/agent_notes/data/skills/migrate-memory/SKILL.md +172 -0
  28. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/obsidian-memory/SKILL.md +1 -1
  29. agent_notes-2.25.0/agent_notes/data/skills/prototype/LOGIC.md +47 -0
  30. agent_notes-2.25.0/agent_notes/data/skills/prototype/SKILL.md +29 -0
  31. agent_notes-2.25.0/agent_notes/data/skills/prototype/UI.md +45 -0
  32. agent_notes-2.25.0/agent_notes/data/skills/to-issues/SKILL.md +61 -0
  33. agent_notes-2.25.0/agent_notes/data/skills/to-prd/SKILL.md +49 -0
  34. agent_notes-2.25.0/agent_notes/data/skills/write-a-skill/SKILL.md +72 -0
  35. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/domain/__init__.py +1 -1
  36. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/domain/cli_backend.py +9 -2
  37. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/domain/state.py +5 -1
  38. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/registries/cli_registry.py +2 -1
  39. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/scripts/_claude_backend.py +46 -10
  40. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/scripts/cost_report.py +16 -5
  41. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/_memory_utils.py +12 -0
  42. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/diagnostics/_checks.py +17 -12
  43. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/install_state_builder.py +36 -15
  44. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/installer.py +67 -16
  45. agent_notes-2.25.0/agent_notes/services/migrations/__init__.py +1 -0
  46. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/obsidian_backend.py +66 -20
  47. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/rendering.py +26 -18
  48. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/settings_writer.py +6 -9
  49. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/state_store.py +87 -24
  50. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/user_config.py +7 -0
  51. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/wiki/_wiki_utils.py +11 -0
  52. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/wiki/wiki_ingest.py +7 -0
  53. agent_notes-2.25.0/agent_notes/services/wiki/wiki_lint.py +176 -0
  54. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/wiki/wiki_storage.py +3 -0
  55. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes.egg-info/PKG-INFO +9 -4
  56. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes.egg-info/SOURCES.txt +16 -0
  57. agent_notes-2.25.0/tests/unit/commands/test_memory_add_description.py +42 -0
  58. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/commands/test_memory_imports.py +1 -2
  59. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/commands/test_memory_migrate.py +31 -30
  60. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/commands/test_wizard_steps.py +4 -4
  61. agent_notes-2.25.0/tests/unit/commands/wizard/test_cost_report_step.py +120 -0
  62. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/scripts/test_cost_report_scoping.py +10 -2
  63. agent_notes-2.25.0/tests/unit/services/test_installer_hooks.py +132 -0
  64. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_memory_backend_io.py +164 -30
  65. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_rendering_includes.py +5 -1
  66. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_settings_writer.py +94 -0
  67. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_state_store.py +298 -0
  68. agent_notes-2.25.0/tests/unit/services/test_user_config_cost_report.py +330 -0
  69. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_wiki_backend.py +162 -0
  70. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/test_memory_dir_for_backend.py +2 -2
  71. agent_notes-2.23.0/agent_notes/VERSION +0 -1
  72. agent_notes-2.23.0/agent_notes/commands/install.py +0 -125
  73. agent_notes-2.23.0/agent_notes/services/wiki/wiki_lint.py +0 -101
  74. {agent_notes-2.23.0 → agent_notes-2.25.0}/LICENSE +0 -0
  75. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/__init__.py +0 -0
  76. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/__main__.py +0 -0
  77. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/__init__.py +0 -0
  78. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/_install_helpers.py +0 -0
  79. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/build.py +0 -0
  80. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/list.py +0 -0
  81. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/memory/_common.py +0 -0
  82. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/memory/migrate.py +0 -0
  83. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/memory/reset.py +0 -0
  84. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/memory/transfer.py +0 -0
  85. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/memory/vault.py +0 -0
  86. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/memory/wiki.py +0 -0
  87. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/set_role.py +0 -0
  88. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/uninstall.py +0 -0
  89. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/validate.py +0 -0
  90. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/commands/wizard/_common.py +0 -0
  91. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/config.py +0 -0
  92. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/analyst.md +0 -0
  93. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/api-reviewer.md +0 -0
  94. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/architect.md +0 -0
  95. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/coder.md +0 -0
  96. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/database-specialist.md +0 -0
  97. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/debugger.md +0 -0
  98. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/devil.md +0 -0
  99. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/devops.md +0 -0
  100. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/explorer.md +0 -0
  101. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/integrations.md +0 -0
  102. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/lead.md +0 -0
  103. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/performance-profiler.md +0 -0
  104. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/refactorer.md +0 -0
  105. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/reviewer.md +0 -0
  106. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/security-auditor.md +0 -0
  107. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/shared/cost_reporting.md +0 -0
  108. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/shared/guardrails.md +0 -0
  109. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/shared/phase0.md +0 -0
  110. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/shared/pipelines.md +0 -0
  111. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/shared/review.md +0 -0
  112. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/shared/verification.md +0 -0
  113. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/shared/wiki_compile.md +0 -0
  114. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/system-auditor.md +0 -0
  115. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/tech-writer.md +0 -0
  116. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/test-runner.md +0 -0
  117. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/test-writer.md +0 -0
  118. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/agents/wiki-compiler.md +0 -0
  119. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/cli/copilot.yaml +0 -0
  120. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/cli/opencode.yaml +0 -0
  121. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/commands/brainstorm.md +0 -0
  122. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/commands/debug.md +0 -0
  123. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/commands/review.md +0 -0
  124. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/global-copilot.md +0 -0
  125. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/global-opencode.md +0 -0
  126. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/hooks/session-context.md.tpl +0 -0
  127. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/models/claude-haiku-4-5.yaml +0 -0
  128. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/models/claude-opus-4-1.yaml +0 -0
  129. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/models/claude-opus-4-5.yaml +0 -0
  130. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/models/claude-opus-4-6.yaml +0 -0
  131. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/models/claude-sonnet-4-5.yaml +0 -0
  132. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/models/claude-sonnet-4-6.yaml +0 -0
  133. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/models/claude-sonnet-4.yaml +0 -0
  134. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/plugin/claude.yaml +0 -0
  135. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/plugin/opencode-index.js.template +0 -0
  136. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/plugin/opencode.yaml +0 -0
  137. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/pricing.yaml +0 -0
  138. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/roles/orchestrator.yaml +0 -0
  139. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/roles/scout.yaml +0 -0
  140. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/roles/worker.yaml +0 -0
  141. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/rules/code-quality.md +0 -0
  142. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/rules/safety.md +0 -0
  143. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/brainstorming/SKILL.md +0 -0
  144. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/caveman/SKILL.md +0 -0
  145. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/code-review/SKILL.md +0 -0
  146. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/debugging-protocol/SKILL.md +0 -0
  147. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/docker/SKILL.md +0 -0
  148. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/docker/compose.md +0 -0
  149. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/docker/dockerfile.md +0 -0
  150. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/git/SKILL.md +0 -0
  151. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/grill-me/SKILL.md +0 -0
  152. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/grill-with-docs/SKILL.md +0 -0
  153. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/improve-codebase-architecture/SKILL.md +0 -0
  154. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/ingest/SKILL.md +0 -0
  155. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/rails/SKILL.md +0 -0
  156. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/rails/controllers.md +0 -0
  157. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/rails/frontend.md +0 -0
  158. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/rails/infra.md +0 -0
  159. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/rails/models.md +0 -0
  160. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/rails/testing.md +0 -0
  161. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/rails/views.md +0 -0
  162. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/refactoring-protocol/SKILL.md +0 -0
  163. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/setup-project-context/SKILL.md +0 -0
  164. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/tdd/SKILL.md +0 -0
  165. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/skills/zoom-out/SKILL.md +0 -0
  166. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/templates/__init__.py +0 -0
  167. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/templates/__pycache__/__init__.cpython-314.pyc +0 -0
  168. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/templates/frontmatter/__init__.py +0 -0
  169. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/templates/frontmatter/__pycache__/__init__.cpython-314.pyc +0 -0
  170. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/templates/frontmatter/__pycache__/claude.cpython-314.pyc +0 -0
  171. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/templates/frontmatter/__pycache__/opencode.cpython-314.pyc +0 -0
  172. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/templates/frontmatter/claude.py +0 -0
  173. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/data/templates/frontmatter/opencode.py +0 -0
  174. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/doctor_checks.py +0 -0
  175. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/domain/agent.py +0 -0
  176. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/domain/diagnostics.py +0 -0
  177. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/domain/diff.py +0 -0
  178. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/domain/model.py +0 -0
  179. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/domain/role.py +0 -0
  180. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/domain/rule.py +0 -0
  181. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/domain/skill.py +0 -0
  182. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/registries/__init__.py +0 -0
  183. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/registries/_base.py +0 -0
  184. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/registries/agent_registry.py +0 -0
  185. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/registries/model_registry.py +0 -0
  186. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/registries/role_registry.py +0 -0
  187. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/registries/rule_registry.py +0 -0
  188. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/registries/skill_registry.py +0 -0
  189. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/scripts/__init__.py +0 -0
  190. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/scripts/_formatting.py +0 -0
  191. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/scripts/_opencode_backend.py +0 -0
  192. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/scripts/_pricing.py +0 -0
  193. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/__init__.py +0 -0
  194. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/counts.py +0 -0
  195. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/credentials.py +0 -0
  196. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/diagnostics/__init__.py +0 -0
  197. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/diagnostics/_display.py +0 -0
  198. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/diagnostics/_fix.py +0 -0
  199. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/diff.py +0 -0
  200. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/fs.py +0 -0
  201. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/local_backend.py +0 -0
  202. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/memory_router.py +0 -0
  203. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/session_context.py +0 -0
  204. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/ui.py +0 -0
  205. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/validation.py +0 -0
  206. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/wiki/__init__.py +0 -0
  207. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/wiki/wiki_index.py +0 -0
  208. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/wiki/wiki_query.py +0 -0
  209. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes/services/wiki_backend.py +0 -0
  210. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes.egg-info/dependency_links.txt +0 -0
  211. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes.egg-info/entry_points.txt +0 -0
  212. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes.egg-info/requires.txt +0 -0
  213. {agent_notes-2.23.0 → agent_notes-2.25.0}/agent_notes.egg-info/top_level.txt +0 -0
  214. {agent_notes-2.23.0 → agent_notes-2.25.0}/pyproject.toml +0 -0
  215. {agent_notes-2.23.0 → agent_notes-2.25.0}/setup.cfg +0 -0
  216. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/conftest.py +0 -0
  217. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/__init__.py +0 -0
  218. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/commands/__init__.py +0 -0
  219. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/commands/test_config_command.py +0 -0
  220. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/commands/test_doctor_command.py +0 -0
  221. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/commands/test_info_command.py +0 -0
  222. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/commands/test_install_command.py +0 -0
  223. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/commands/test_list_command.py +0 -0
  224. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/commands/test_regenerate_command.py +0 -0
  225. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/commands/test_uninstall_command.py +0 -0
  226. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/commands/test_validate_command.py +0 -0
  227. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/memory/__init__.py +0 -0
  228. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/memory/test_memory_command.py +0 -0
  229. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/scripts/__init__.py +0 -0
  230. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/functional/scripts/test_release_script.py +0 -0
  231. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/integration/__init__.py +0 -0
  232. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/integration/build_output/__init__.py +0 -0
  233. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/integration/build_output/test_build_output.py +0 -0
  234. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/integration/install/__init__.py +0 -0
  235. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/integration/install/test_install_methods.py +0 -0
  236. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/integration/plugin_builders/__init__.py +0 -0
  237. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/integration/plugin_builders/test_plugin_builders.py +0 -0
  238. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/plugins/__init__.py +0 -0
  239. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/plugins/claude/__init__.py +0 -0
  240. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/plugins/claude/test_agents.py +0 -0
  241. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/plugins/test_skills.py +0 -0
  242. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/__init__.py +0 -0
  243. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/commands/__init__.py +0 -0
  244. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/commands/test_cost_report_subcommand.py +0 -0
  245. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/commands/test_count_agents.py +0 -0
  246. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/commands/test_info.py +0 -0
  247. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/commands/test_wizard_imports.py +0 -0
  248. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/commands/test_wizard_orchestrator_skip.py +0 -0
  249. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/commands/test_wizard_preflight.py +0 -0
  250. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/registries/__init__.py +0 -0
  251. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/registries/test_registries.py +0 -0
  252. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/scripts/__init__.py +0 -0
  253. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/scripts/test_cost_report.py +0 -0
  254. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/scripts/test_formatting_tty.py +0 -0
  255. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/scripts/test_time_aggregation.py +0 -0
  256. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/__init__.py +0 -0
  257. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_build_functions.py +0 -0
  258. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_credential_filter.py +0 -0
  259. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_credentials.py +0 -0
  260. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_fs.py +0 -0
  261. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_installer_plan.py +0 -0
  262. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_local_backend.py +0 -0
  263. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_memory_backend.py +0 -0
  264. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_memory_router.py +0 -0
  265. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_session_context.py +0 -0
  266. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_skill_filtering.py +0 -0
  267. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_validation.py +0 -0
  268. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/services/test_wiki_imports.py +0 -0
  269. {agent_notes-2.23.0 → agent_notes-2.25.0}/tests/unit/test_import_health.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-notes
3
- Version: 2.23.0
3
+ Version: 2.25.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
@@ -42,7 +42,7 @@ agent-notes doctor
42
42
 
43
43
  **What's Included**
44
44
  - 19 specialized AI subagents (Opus reasons, Sonnet executes, Haiku explores)
45
- - 42+ on-demand skills (Rails, Docker, Git, Kamal, Process)
45
+ - 47+ on-demand skills (Rails, Docker, Git, Kamal, Process)
46
46
  - Global rules and guardrails
47
47
  - Agent memory with 3 storage options (Local, Obsidian, Wiki)
48
48
  - Configuration for Claude Code, OpenCode, and GitHub Copilot
@@ -267,7 +267,7 @@ Implements Karpathy's LLM Wiki pattern (v1). Auto-creates a folder per project (
267
267
 
268
268
  - **Query** — Search wiki pages, synthesize answers with citations, optionally file answers back as new pages
269
269
 
270
- - **Lint** — Health-check for contradictions, stale claims, orphan pages, missing cross-references
270
+ - **Lint** — Health-check for contradictions, stale pages, data gaps, orphan pages, missing cross-references
271
271
 
272
272
  **Commands:**
273
273
  ```bash
@@ -312,7 +312,7 @@ The installed `CLAUDE.md` already points agents to your vault. At the start of a
312
312
  <details>
313
313
  <summary>Skills</summary>
314
314
 
315
- 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/`.
315
+ 47+ 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/`.
316
316
 
317
317
  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.
318
318
 
@@ -342,6 +342,11 @@ Load the docker-compose skill for multi-service setup
342
342
  - `/debugging-protocol` — Phase 1 rewritten as "build a feedback loop first" with 9 strategies
343
343
  - `/improve-codebase-architecture` — Deletion test to find shallow modules; surfaces deepening opportunities
344
344
  - `/zoom-out` — Quick orientation map of an unfamiliar code area
345
+ - `/handoff` — Compact conversation into a handoff document for a fresh agent session
346
+ - `/to-prd` — Synthesize conversation into a Product Requirements Document
347
+ - `/to-issues` — Break a plan/PRD into vertical-slice issues (HITL/AFK classification)
348
+ - `/prototype` — Throwaway prototypes: terminal app for logic or UI variations for visual
349
+ - `/write-a-skill` — Meta-skill for creating new skills with proper structure
345
350
 
346
351
  </details>
347
352
 
@@ -12,7 +12,7 @@ agent-notes doctor
12
12
 
13
13
  **What's Included**
14
14
  - 19 specialized AI subagents (Opus reasons, Sonnet executes, Haiku explores)
15
- - 42+ on-demand skills (Rails, Docker, Git, Kamal, Process)
15
+ - 47+ on-demand skills (Rails, Docker, Git, Kamal, Process)
16
16
  - Global rules and guardrails
17
17
  - Agent memory with 3 storage options (Local, Obsidian, Wiki)
18
18
  - Configuration for Claude Code, OpenCode, and GitHub Copilot
@@ -237,7 +237,7 @@ Implements Karpathy's LLM Wiki pattern (v1). Auto-creates a folder per project (
237
237
 
238
238
  - **Query** — Search wiki pages, synthesize answers with citations, optionally file answers back as new pages
239
239
 
240
- - **Lint** — Health-check for contradictions, stale claims, orphan pages, missing cross-references
240
+ - **Lint** — Health-check for contradictions, stale pages, data gaps, orphan pages, missing cross-references
241
241
 
242
242
  **Commands:**
243
243
  ```bash
@@ -282,7 +282,7 @@ The installed `CLAUDE.md` already points agents to your vault. At the start of a
282
282
  <details>
283
283
  <summary>Skills</summary>
284
284
 
285
- 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/`.
285
+ 47+ 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/`.
286
286
 
287
287
  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.
288
288
 
@@ -312,6 +312,11 @@ Load the docker-compose skill for multi-service setup
312
312
  - `/debugging-protocol` — Phase 1 rewritten as "build a feedback loop first" with 9 strategies
313
313
  - `/improve-codebase-architecture` — Deletion test to find shallow modules; surfaces deepening opportunities
314
314
  - `/zoom-out` — Quick orientation map of an unfamiliar code area
315
+ - `/handoff` — Compact conversation into a handoff document for a fresh agent session
316
+ - `/to-prd` — Synthesize conversation into a Product Requirements Document
317
+ - `/to-issues` — Break a plan/PRD into vertical-slice issues (HITL/AFK classification)
318
+ - `/prototype` — Throwaway prototypes: terminal app for logic or UI variations for visual
319
+ - `/write-a-skill` — Meta-skill for creating new skills with proper structure
315
320
 
316
321
  </details>
317
322
 
@@ -0,0 +1 @@
1
+ 2.25.0
@@ -226,6 +226,12 @@ def main():
226
226
  p_install.add_argument("--copy", action="store_true", help="Copy instead of symlink (with --local)")
227
227
  p_install.add_argument("--reconfigure", action="store_true",
228
228
  help="Clear existing state for this scope and re-run the wizard")
229
+ p_install.add_argument("--profile", metavar="LABEL",
230
+ help="Profile label for multi-subscription setups (e.g. work, personal)")
231
+ p_install.add_argument("--folder", metavar="DIR",
232
+ help="Local folder name override (e.g. .claude-work)")
233
+ p_install.add_argument("--global-home", metavar="DIR", dest="global_home",
234
+ help="Global home directory override (e.g. ~/.claude-work)")
229
235
 
230
236
  # build
231
237
  subparsers.add_parser("build", help="Build agent configuration files from source")
@@ -234,6 +240,11 @@ def main():
234
240
  p_uninstall = subparsers.add_parser("uninstall", help="Remove installed components")
235
241
  p_uninstall.add_argument("--local", action="store_true", help="Remove from current project only")
236
242
  p_uninstall.add_argument("--global", action="store_true", dest="global_", help="Remove from global scope only")
243
+ profile_group = p_uninstall.add_mutually_exclusive_group()
244
+ profile_group.add_argument("--profile", metavar="LABEL",
245
+ help="Profile label to uninstall (e.g. work)")
246
+ profile_group.add_argument("--all-profiles", action="store_true",
247
+ help="Uninstall all profiles for the target scope")
237
248
 
238
249
  # doctor
239
250
  p_doctor = subparsers.add_parser("doctor", help="Check installation health")
@@ -267,6 +278,7 @@ def main():
267
278
  p_regen.add_argument("--scope", choices=["global", "local"], help="Install scope")
268
279
  p_regen.add_argument("--cli", help="Regenerate specific CLI only")
269
280
  p_regen.add_argument("--local", action="store_true", help="Use local scope")
281
+ p_regen.add_argument("--profile", metavar="LABEL", help="Profile label")
270
282
 
271
283
  # memory
272
284
  p_memory = subparsers.add_parser("memory", help="Manage agent memory")
@@ -275,6 +287,12 @@ def main():
275
287
  help="Memory action")
276
288
  p_memory.add_argument("name", nargs="?", help="Agent name / note title (for show/reset/add)")
277
289
  p_memory.add_argument("extra", nargs="*", help="Additional args (for add: body [type] [agent] [project])")
290
+ p_memory.add_argument("--description", default="", help="One-liner description for index display")
291
+
292
+ # hook
293
+ p_hook = subparsers.add_parser("hook", help="Claude Code hook integrations")
294
+ p_hook.add_argument("subaction", choices=["memory-bridge", "session-discover"],
295
+ help="Hook to run")
278
296
 
279
297
  # cost-report
280
298
  p_cost_report = subparsers.add_parser("cost-report", help="Report token usage and cost for the current AI session")
@@ -284,7 +302,7 @@ def main():
284
302
  # config
285
303
  p_config = subparsers.add_parser("config", help="Reconfigure role/agent/model/memory/skill assignments after install")
286
304
  p_config.add_argument("action", nargs="?", default="wizard",
287
- choices=["wizard", "show", "role-model", "role-agent", "provider", "providers", "memory"],
305
+ choices=["wizard", "show", "role-model", "role-agent", "provider", "providers", "memory", "cost-report"],
288
306
  help="Config action (default: wizard)")
289
307
  p_config.add_argument("extra", nargs="*", help="Additional positional args (role, model, agent)")
290
308
  p_config.add_argument("--cli", help="Target CLI (claude / opencode / both)")
@@ -305,15 +323,24 @@ def main():
305
323
  from .commands.build import build
306
324
  build()
307
325
  elif args.command == "install":
308
- if args.local or args.copy:
326
+ if args.local or args.copy or args.profile or args.folder or args.global_home:
309
327
  from .commands.install import install
310
- install(local=args.local, copy=args.copy, reconfigure=args.reconfigure)
328
+ install(
329
+ local=args.local, copy=args.copy, reconfigure=args.reconfigure,
330
+ profile_label=args.profile or "",
331
+ folder=args.folder or "",
332
+ global_home=args.global_home or "",
333
+ )
311
334
  else:
312
335
  from .commands.wizard import interactive_install
313
336
  interactive_install()
314
337
  elif args.command == "uninstall":
338
+ all_profiles = getattr(args, 'all_profiles', False)
339
+ profile_label = getattr(args, 'profile', '') or ""
315
340
  from .commands.install import uninstall
316
- uninstall(local=args.local, global_=args.global_)
341
+ uninstall(local=args.local, global_=args.global_,
342
+ profile_label=profile_label,
343
+ all_profiles=all_profiles)
317
344
  elif args.command == "doctor":
318
345
  from .commands.doctor import doctor
319
346
  doctor(local=args.local, fix=args.fix)
@@ -332,13 +359,17 @@ def main():
332
359
  set_role(args.role_name, args.model_id, cli=args.cli, scope=args.scope, local=args.local)
333
360
  elif args.command == "regenerate":
334
361
  from .commands.regenerate import regenerate
335
- regenerate(scope=args.scope, cli=args.cli, local=args.local)
362
+ regenerate(scope=args.scope, cli=args.cli, local=args.local,
363
+ profile_label=getattr(args, 'profile', '') or "")
336
364
  elif args.command == "memory":
337
365
  from .commands.memory import memory
338
- memory(args.action, args.name, getattr(args, "extra", None))
366
+ memory(args.action, args.name, getattr(args, "extra", None), description=getattr(args, "description", ""))
339
367
  elif args.command == "config":
340
368
  from .commands.config import config
341
369
  config(action=args.action, args=getattr(args, "extra", None) or [], cli_filter=args.cli)
370
+ elif args.command == "hook":
371
+ from .commands.hook import hook
372
+ hook(args.subaction)
342
373
  elif args.command == "cost-report":
343
374
  # Rebuild sys.argv slice so cost_report.main() can parse it normally
344
375
  argv = []
@@ -194,8 +194,13 @@ def show(state=None) -> None:
194
194
  else:
195
195
  mem_label = "Disabled"
196
196
 
197
+ from ..services.user_config import load_user_config
198
+ cost_report_enabled = load_user_config().get("cost_report_enabled", False)
199
+ cost_report_label = "enabled" if cost_report_enabled else "disabled"
200
+
197
201
  print("Current configuration:")
198
- print(f" Memory: {mem_label}")
202
+ print(f" Memory: {mem_label}")
203
+ print(f" Cost report: {cost_report_label}")
199
204
 
200
205
  # Scopes
201
206
  scopes = []
@@ -465,6 +470,17 @@ def interactive_config_memory() -> None:
465
470
  _wizard_memory(state, before)
466
471
 
467
472
 
473
+ def cost_report_toggle(value: str) -> None:
474
+ """Enable or disable cost reporting in user config."""
475
+ from ..services.user_config import load_user_config, save_user_config
476
+ cfg = load_user_config()
477
+ cfg["cost_report_enabled"] = (value == "on")
478
+ save_user_config(cfg)
479
+ state_label = "enabled" if value == "on" else "disabled"
480
+ print(f"Cost reporting {state_label}.")
481
+ print("Run 'agent-notes regenerate' to update generated rules.")
482
+
483
+
468
484
  # ── Entry point ──────────────────────────────────────────────────────────────
469
485
 
470
486
  def config(action: str = "wizard", args: Optional[list] = None, cli_filter: Optional[str] = None) -> None:
@@ -497,7 +513,12 @@ def config(action: str = "wizard", args: Optional[list] = None, cli_filter: Opti
497
513
  _wizard_provider_status(args[0])
498
514
  elif action == "memory":
499
515
  interactive_config_memory()
516
+ elif action == "cost-report":
517
+ if len(args) != 1 or args[0] not in ("on", "off"):
518
+ print("Usage: agent-notes config cost-report <on|off>")
519
+ sys.exit(1)
520
+ cost_report_toggle(args[0])
500
521
  else:
501
522
  print(f"Unknown config action: {action}")
502
- print("Actions: wizard, show, role-model, role-agent, providers, provider, memory")
523
+ print("Actions: wizard, show, role-model, role-agent, providers, provider, memory, cost-report")
503
524
  sys.exit(1)
@@ -1,5 +1,7 @@
1
1
  """Health check for agent-notes installation."""
2
2
 
3
+ from pathlib import Path
4
+
3
5
  # Re-export for backward compatibility. New code should import from agent_notes.domain.
4
6
  from ..domain.diagnostics import Issue, FixAction # noqa: F401
5
7
 
@@ -53,13 +55,38 @@ def _check_session_hook(scope: str, issues: list) -> None:
53
55
  except KeyError:
54
56
  return
55
57
 
56
- settings_path, _context_file, hook_command = _session_hook_paths(claude_backend, scope)
57
- if not has_hook(settings_path, "SessionStart", hook_command):
58
- issues.append(Issue(
59
- "missing_hook",
60
- str(settings_path),
61
- "SessionStart hook not found run: agent-notes install to re-add the hook",
62
- ))
58
+ from ..services.state_store import load_state, get_profiles_for_project
59
+ state = load_state()
60
+
61
+ # Check all profiles for the current project (local scope) or default (global)
62
+ backends_to_check = [claude_backend]
63
+ if state and scope == "local":
64
+ for _key, ss in get_profiles_for_project(state, Path.cwd()):
65
+ bs = ss.clis.get("claude")
66
+ if bs and bs.local_dir_override:
67
+ backends_to_check.append(claude_backend.with_local_dir(bs.local_dir_override))
68
+
69
+ for backend in backends_to_check:
70
+ settings_path, _context_file, hook_command = _session_hook_paths(backend, scope)
71
+ if not settings_path.exists():
72
+ continue
73
+ if not has_hook(settings_path, "SessionStart", hook_command):
74
+ issues.append(Issue(
75
+ "missing_hook",
76
+ str(settings_path),
77
+ "SessionStart hook not found — run: agent-notes install to re-add the hook",
78
+ ))
79
+
80
+ # Memory bridge check on the default backend only
81
+ settings_path, _, _ = _session_hook_paths(claude_backend, scope)
82
+ from ..constants import Hooks
83
+ if state and state.memory.backend in ("obsidian", "wiki"):
84
+ if settings_path.exists() and not has_hook(settings_path, "SessionStart", Hooks.MEMORY_BRIDGE):
85
+ issues.append(Issue(
86
+ "missing_hook",
87
+ str(settings_path),
88
+ "memory-bridge SessionStart hook not found — run: agent-notes install to re-add",
89
+ ))
63
90
 
64
91
 
65
92
  def check_version_drift(scope: str, issues: list, fix_actions: list) -> None:
@@ -100,12 +127,31 @@ def diagnose(scope: str, fix: bool = False) -> bool:
100
127
  issues = []
101
128
  fix_actions = []
102
129
 
103
- # Run checks
104
- check_stale_files(scope, issues, fix_actions)
105
- check_broken_symlinks(scope, issues, fix_actions)
106
- check_shadowed_files(scope, issues, fix_actions)
107
- check_missing_files(scope, issues, fix_actions)
108
- check_content_drift(scope, issues, fix_actions)
130
+ from ..services.state_store import load_current_state, get_profiles_for_project
131
+ from ..services.state_store import label_from_key
132
+
133
+ # For local scope, run checks against each installed profile
134
+ if scope == "local":
135
+ state = load_current_state()
136
+ profiles = []
137
+ if state:
138
+ profiles = get_profiles_for_project(state, Path.cwd().resolve())
139
+ # Fall back to default profile if none recorded
140
+ if not profiles:
141
+ profiles = [("", None)]
142
+ for key, _ss in profiles:
143
+ label = label_from_key(key, Path.cwd())
144
+ check_stale_files(scope, issues, fix_actions, profile_label=label)
145
+ check_broken_symlinks(scope, issues, fix_actions, profile_label=label)
146
+ check_shadowed_files(scope, issues, fix_actions, profile_label=label)
147
+ check_missing_files(scope, issues, fix_actions, profile_label=label)
148
+ check_content_drift(scope, issues, fix_actions, profile_label=label)
149
+ else:
150
+ check_stale_files(scope, issues, fix_actions)
151
+ check_broken_symlinks(scope, issues, fix_actions)
152
+ check_shadowed_files(scope, issues, fix_actions)
153
+ check_missing_files(scope, issues, fix_actions)
154
+ check_content_drift(scope, issues, fix_actions)
109
155
 
110
156
  # Build freshness check (scope-independent)
111
157
  check_build_freshness(issues, fix_actions)
@@ -117,7 +163,6 @@ def diagnose(scope: str, fix: bool = False) -> bool:
117
163
  _check_session_hook(scope, issues)
118
164
 
119
165
  # Print role→model assignments
120
- from ..services.state_store import load_current_state
121
166
  state = load_current_state()
122
167
  if state is not None:
123
168
  _check_role_models(state)
@@ -0,0 +1,69 @@
1
+ """Hook command - Claude Code hook integrations."""
2
+
3
+ from pathlib import Path
4
+
5
+
6
+ def hook(subaction: str) -> None:
7
+ """Handle hook subactions."""
8
+ if subaction == "memory-bridge":
9
+ _memory_bridge()
10
+ elif subaction == "session-discover":
11
+ _session_discover()
12
+
13
+
14
+ def _session_discover() -> None:
15
+ """Discover all agent-notes profiles for the current project and emit combined context."""
16
+ try:
17
+ from ..services.state_store import load_state, get_profiles_for_project
18
+ from ..registries.cli_registry import load_registry
19
+
20
+ state = load_state()
21
+ if state is None:
22
+ return
23
+
24
+ registry = load_registry()
25
+ default_local_dirs = {b.name: b.local_dir for b in registry.all()}
26
+
27
+ for key, scope_state in get_profiles_for_project(state, Path.cwd()):
28
+ for cli_name, backend_state in scope_state.clis.items():
29
+ local_dir = backend_state.local_dir_override or default_local_dirs.get(cli_name, ".claude")
30
+ context_file = Path(local_dir) / "agent-notes-context.md"
31
+ if context_file.exists():
32
+ label = scope_state.profile_label or "default"
33
+ print(f"<!-- agent-notes profile: {label} -->")
34
+ print(context_file.read_text(encoding="utf-8"))
35
+ except Exception:
36
+ return
37
+
38
+
39
+ def _memory_bridge() -> None:
40
+ """SessionStart hook that prints the agent-notes memory index.
41
+
42
+ Unconditionally loads and prints the memory index so it is visible in
43
+ context at the start of every Claude Code session.
44
+ """
45
+ try:
46
+ from .memory._common import _load_memory_config
47
+ from ..constants import Obsidian, Wiki
48
+
49
+ backend, path = _load_memory_config()
50
+
51
+ if backend == "none" or backend is None:
52
+ return
53
+
54
+ if backend == "obsidian":
55
+ index_file = Path(path) / Obsidian.INDEX
56
+ elif backend == "wiki":
57
+ index_file = Path(path) / Wiki.DIR / Wiki.INDEX
58
+ else:
59
+ # local and any unknown backends: use Index.md at root
60
+ index_file = Path(path) / "Index.md"
61
+
62
+ if not index_file.exists():
63
+ return
64
+
65
+ content = index_file.read_text(encoding="utf-8")
66
+ print("<!-- agent-notes memory index (auto-loaded) -->")
67
+ print(content)
68
+ except Exception:
69
+ return
@@ -73,10 +73,30 @@ def show_info() -> None:
73
73
  else:
74
74
  print(" Global: none")
75
75
 
76
+ # Named global profiles
77
+ if st.global_installs:
78
+ for label, gs in sorted(st.global_installs.items()):
79
+ print(f" Global [{label}]: installed {gs.installed_at}, {gs.mode}")
80
+ if gs.clis:
81
+ backend_summaries = []
82
+ for backend_name, bs in sorted(gs.clis.items()):
83
+ parts = []
84
+ for component_type, items in bs.installed.items():
85
+ if items:
86
+ parts.append(f"{len(items)} {component_type}")
87
+ if parts:
88
+ extra = ""
89
+ if bs.global_home_override:
90
+ extra = f", home={bs.global_home_override}"
91
+ backend_summaries.append(f"{backend_name} ({', '.join(parts)}{extra})")
92
+ if backend_summaries:
93
+ print(f" Storage: {', '.join(backend_summaries)}")
94
+
76
95
  # Local installs
77
96
  if st.local_installs:
78
97
  for project_path, ls in sorted(st.local_installs.items()):
79
- print(f" Local: {project_path} (installed {ls.installed_at}, {ls.mode})")
98
+ profile_hint = f" [{ls.profile_label}]" if ls.profile_label else ""
99
+ print(f" Local{profile_hint}: {project_path} (installed {ls.installed_at}, {ls.mode})")
80
100
  if ls.clis:
81
101
  backend_summaries = []
82
102
  for backend_name, bs in sorted(ls.clis.items()):
@@ -85,7 +105,10 @@ def show_info() -> None:
85
105
  if items:
86
106
  counts.append(f"{len(items)} {component_type}")
87
107
  if counts:
88
- backend_summaries.append(f"{backend_name} ({', '.join(counts)})")
108
+ extra = ""
109
+ if bs.local_dir_override:
110
+ extra = f", folder={bs.local_dir_override}"
111
+ backend_summaries.append(f"{backend_name} ({', '.join(counts)}{extra})")
89
112
  if backend_summaries:
90
113
  print(f" Storage: {', '.join(backend_summaries)}")
91
114
  else: