agent-notes 2.26.0__tar.gz → 2.28.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 (293) hide show
  1. {agent_notes-2.26.0 → agent_notes-2.28.0}/PKG-INFO +2 -1
  2. agent_notes-2.28.0/agent_notes/VERSION +1 -0
  3. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/doctor.py +41 -0
  4. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/memory/reset.py +2 -1
  5. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/validate.py +1 -1
  6. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/wizard/execute.py +13 -11
  7. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/agents.yaml +1 -0
  8. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/coder.md +1 -0
  9. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/refactorer.md +1 -0
  10. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/reviewer.md +1 -0
  11. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/shared/cost_reporting.md +4 -0
  12. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/shared/execution.md +1 -1
  13. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/shared/guardrails.md +2 -4
  14. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/shared/hard_limits.md +0 -1
  15. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/test-writer.md +1 -0
  16. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/cli/claude.yaml +5 -0
  17. agent_notes-2.28.0/agent_notes/data/cli/codex.yaml +29 -0
  18. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/cli/opencode.yaml +5 -0
  19. agent_notes-2.28.0/agent_notes/data/global-codex.md +40 -0
  20. agent_notes-2.28.0/agent_notes/data/models/gpt-5-4-mini.yaml +14 -0
  21. agent_notes-2.28.0/agent_notes/data/models/gpt-5-4.yaml +14 -0
  22. agent_notes-2.28.0/agent_notes/data/models/gpt-5-5.yaml +14 -0
  23. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/code-review/SKILL.md +10 -2
  24. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/debugging-protocol/SKILL.md +2 -1
  25. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/improve-codebase-architecture/SKILL.md +1 -1
  26. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/migrate-memory/SKILL.md +1 -1
  27. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/refactoring-protocol/SKILL.md +2 -1
  28. agent_notes-2.28.0/agent_notes/data/skills/rsi/SKILL.md +61 -0
  29. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/tdd/SKILL.md +2 -1
  30. agent_notes-2.28.0/agent_notes/data/templates/__pycache__/__init__.cpython-312.pyc +0 -0
  31. agent_notes-2.28.0/agent_notes/data/templates/frontmatter/__pycache__/__init__.cpython-312.pyc +0 -0
  32. agent_notes-2.28.0/agent_notes/data/templates/frontmatter/__pycache__/claude.cpython-312.pyc +0 -0
  33. agent_notes-2.28.0/agent_notes/data/templates/frontmatter/__pycache__/codex.cpython-312.pyc +0 -0
  34. agent_notes-2.28.0/agent_notes/data/templates/frontmatter/__pycache__/codex.cpython-314.pyc +0 -0
  35. agent_notes-2.28.0/agent_notes/data/templates/frontmatter/__pycache__/opencode.cpython-312.pyc +0 -0
  36. agent_notes-2.28.0/agent_notes/data/templates/frontmatter/codex.py +106 -0
  37. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/domain/cli_backend.py +1 -0
  38. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/registries/agent_registry.py +3 -3
  39. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/registries/cli_registry.py +2 -1
  40. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/registries/skill_registry.py +2 -1
  41. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/scripts/_opencode_backend.py +3 -1
  42. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/credentials.py +14 -16
  43. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/diagnostics/_fix.py +23 -21
  44. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/fs.py +17 -4
  45. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/installer.py +131 -104
  46. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/rendering.py +196 -114
  47. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/state_store.py +2 -3
  48. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/validation.py +1 -5
  49. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/wiki/_wiki_utils.py +4 -1
  50. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes.egg-info/PKG-INFO +2 -1
  51. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes.egg-info/SOURCES.txt +24 -1
  52. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes.egg-info/requires.txt +1 -0
  53. {agent_notes-2.26.0 → agent_notes-2.28.0}/pyproject.toml +1 -1
  54. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/commands/test_doctor_command.py +162 -0
  55. agent_notes-2.28.0/tests/functional/commands/test_validate_path_filter.py +100 -0
  56. agent_notes-2.28.0/tests/plugins/codex/test_agents.py +138 -0
  57. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/plugins/test_skills.py +15 -0
  58. agent_notes-2.28.0/tests/unit/registries/test_cli_registry.py +184 -0
  59. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/registries/test_registries.py +30 -0
  60. agent_notes-2.28.0/tests/unit/scripts/test_opencode_backend_connection.py +118 -0
  61. agent_notes-2.28.0/tests/unit/services/__init__.py +0 -0
  62. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_credentials.py +74 -0
  63. agent_notes-2.28.0/tests/unit/services/test_installer_codex.py +460 -0
  64. agent_notes-2.28.0/tests/unit/services/test_installer_hook_quoting.py +85 -0
  65. agent_notes-2.28.0/tests/unit/services/test_rendering_includes.py +212 -0
  66. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_validation.py +9 -3
  67. agent_notes-2.28.0/tests/unit/services/test_wiki_atomic_write.py +73 -0
  68. agent_notes-2.28.0/tests/unit/templates/__init__.py +0 -0
  69. agent_notes-2.28.0/tests/unit/templates/test_codex_frontmatter.py +383 -0
  70. agent_notes-2.26.0/agent_notes/VERSION +0 -1
  71. agent_notes-2.26.0/tests/unit/services/test_rendering_includes.py +0 -88
  72. {agent_notes-2.26.0 → agent_notes-2.28.0}/LICENSE +0 -0
  73. {agent_notes-2.26.0 → agent_notes-2.28.0}/README.md +0 -0
  74. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/__init__.py +0 -0
  75. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/__main__.py +0 -0
  76. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/cli.py +0 -0
  77. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/__init__.py +0 -0
  78. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/_install_helpers.py +0 -0
  79. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/build.py +0 -0
  80. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/config.py +0 -0
  81. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/hook.py +0 -0
  82. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/info.py +0 -0
  83. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/install.py +0 -0
  84. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/list.py +0 -0
  85. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/memory/__init__.py +0 -0
  86. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/memory/_common.py +0 -0
  87. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/memory/migrate.py +0 -0
  88. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/memory/notes.py +0 -0
  89. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/memory/transfer.py +0 -0
  90. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/memory/vault.py +0 -0
  91. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/memory/wiki.py +0 -0
  92. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/regenerate.py +0 -0
  93. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/set_role.py +0 -0
  94. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/uninstall.py +0 -0
  95. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/wizard/__init__.py +0 -0
  96. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/wizard/_common.py +0 -0
  97. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/wizard/cost_report.py +0 -0
  98. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/commands/wizard/orchestrator.py +0 -0
  99. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/config.py +0 -0
  100. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/constants.py +0 -0
  101. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/analyst.md +0 -0
  102. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/api-reviewer.md +0 -0
  103. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/architect.md +0 -0
  104. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/database-specialist.md +0 -0
  105. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/debugger.md +0 -0
  106. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/devil.md +0 -0
  107. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/devops.md +0 -0
  108. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/explorer.md +0 -0
  109. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/integrations.md +0 -0
  110. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/lead.md +0 -0
  111. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/performance-profiler.md +0 -0
  112. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/security-auditor.md +0 -0
  113. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/shared/phase0.md +0 -0
  114. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/shared/pipelines.md +0 -0
  115. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/shared/review.md +0 -0
  116. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/shared/verification.md +0 -0
  117. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/shared/wiki_compile.md +0 -0
  118. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/system-auditor.md +0 -0
  119. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/tech-writer.md +0 -0
  120. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/test-runner.md +0 -0
  121. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/agents/wiki-compiler.md +0 -0
  122. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/cli/copilot.yaml +0 -0
  123. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/commands/brainstorm.md +0 -0
  124. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/commands/debug.md +0 -0
  125. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/commands/review.md +0 -0
  126. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/global-claude.md +0 -0
  127. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/global-copilot.md +0 -0
  128. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/global-opencode.md +0 -0
  129. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/hooks/session-context.md.tpl +0 -0
  130. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/models/claude-haiku-4-5.yaml +0 -0
  131. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/models/claude-opus-4-1.yaml +0 -0
  132. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/models/claude-opus-4-5.yaml +0 -0
  133. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/models/claude-opus-4-6.yaml +0 -0
  134. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/models/claude-opus-4-7.yaml +0 -0
  135. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/models/claude-opus-4-8.yaml +0 -0
  136. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/models/claude-sonnet-4-5.yaml +0 -0
  137. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/models/claude-sonnet-4-6.yaml +0 -0
  138. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/models/claude-sonnet-4.yaml +0 -0
  139. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/plugin/claude.yaml +0 -0
  140. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/plugin/opencode-index.js.template +0 -0
  141. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/plugin/opencode.yaml +0 -0
  142. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/pricing.yaml +0 -0
  143. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/roles/orchestrator.yaml +0 -0
  144. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/roles/reasoner.yaml +0 -0
  145. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/roles/scout.yaml +0 -0
  146. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/roles/worker.yaml +0 -0
  147. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/rules/code-quality.md +0 -0
  148. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/rules/safety.md +0 -0
  149. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/brainstorming/SKILL.md +0 -0
  150. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/caveman/SKILL.md +0 -0
  151. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/docker/SKILL.md +0 -0
  152. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/docker/compose.md +0 -0
  153. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/docker/dockerfile.md +0 -0
  154. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/git/SKILL.md +0 -0
  155. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/grill-me/SKILL.md +0 -0
  156. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/grill-with-docs/SKILL.md +0 -0
  157. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/handoff/SKILL.md +0 -0
  158. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/ingest/SKILL.md +0 -0
  159. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/obsidian-memory/SKILL.md +0 -0
  160. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/prototype/LOGIC.md +0 -0
  161. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/prototype/SKILL.md +0 -0
  162. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/prototype/UI.md +0 -0
  163. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/rails/SKILL.md +0 -0
  164. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/rails/controllers.md +0 -0
  165. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/rails/frontend.md +0 -0
  166. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/rails/infra.md +0 -0
  167. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/rails/models.md +0 -0
  168. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/rails/testing.md +0 -0
  169. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/rails/views.md +0 -0
  170. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/setup-project-context/SKILL.md +0 -0
  171. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/to-issues/SKILL.md +0 -0
  172. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/to-prd/SKILL.md +0 -0
  173. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/write-a-skill/SKILL.md +0 -0
  174. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/skills/zoom-out/SKILL.md +0 -0
  175. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/templates/__init__.py +0 -0
  176. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/templates/__pycache__/__init__.cpython-314.pyc +0 -0
  177. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/templates/frontmatter/__init__.py +0 -0
  178. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/templates/frontmatter/__pycache__/__init__.cpython-314.pyc +0 -0
  179. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/templates/frontmatter/__pycache__/claude.cpython-314.pyc +0 -0
  180. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/templates/frontmatter/__pycache__/opencode.cpython-314.pyc +0 -0
  181. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/templates/frontmatter/claude.py +0 -0
  182. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/data/templates/frontmatter/opencode.py +0 -0
  183. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/doctor_checks.py +0 -0
  184. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/domain/__init__.py +0 -0
  185. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/domain/agent.py +0 -0
  186. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/domain/diagnostics.py +0 -0
  187. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/domain/diff.py +0 -0
  188. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/domain/model.py +0 -0
  189. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/domain/role.py +0 -0
  190. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/domain/rule.py +0 -0
  191. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/domain/skill.py +0 -0
  192. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/domain/state.py +0 -0
  193. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/registries/__init__.py +0 -0
  194. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/registries/_base.py +0 -0
  195. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/registries/model_registry.py +0 -0
  196. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/registries/role_registry.py +0 -0
  197. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/registries/rule_registry.py +0 -0
  198. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/scripts/__init__.py +0 -0
  199. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/scripts/_claude_backend.py +0 -0
  200. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/scripts/_formatting.py +0 -0
  201. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/scripts/_pricing.py +0 -0
  202. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/scripts/cost_report.py +0 -0
  203. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/__init__.py +0 -0
  204. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/_memory_utils.py +0 -0
  205. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/counts.py +0 -0
  206. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/diagnostics/__init__.py +0 -0
  207. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/diagnostics/_checks.py +0 -0
  208. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/diagnostics/_display.py +0 -0
  209. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/diff.py +0 -0
  210. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/install_state_builder.py +0 -0
  211. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/local_backend.py +0 -0
  212. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/memory_router.py +0 -0
  213. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/migrations/__init__.py +0 -0
  214. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/obsidian_backend.py +0 -0
  215. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/session_context.py +0 -0
  216. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/settings_writer.py +0 -0
  217. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/ui.py +0 -0
  218. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/user_config.py +0 -0
  219. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/wiki/__init__.py +0 -0
  220. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/wiki/wiki_index.py +0 -0
  221. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/wiki/wiki_ingest.py +0 -0
  222. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/wiki/wiki_lint.py +0 -0
  223. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/wiki/wiki_query.py +0 -0
  224. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/wiki/wiki_storage.py +0 -0
  225. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes/services/wiki_backend.py +0 -0
  226. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes.egg-info/dependency_links.txt +0 -0
  227. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes.egg-info/entry_points.txt +0 -0
  228. {agent_notes-2.26.0 → agent_notes-2.28.0}/agent_notes.egg-info/top_level.txt +0 -0
  229. {agent_notes-2.26.0 → agent_notes-2.28.0}/setup.cfg +0 -0
  230. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/conftest.py +0 -0
  231. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/__init__.py +0 -0
  232. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/commands/__init__.py +0 -0
  233. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/commands/test_config_command.py +0 -0
  234. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/commands/test_info_command.py +0 -0
  235. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/commands/test_install_command.py +0 -0
  236. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/commands/test_list_command.py +0 -0
  237. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/commands/test_regenerate_command.py +0 -0
  238. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/commands/test_uninstall_command.py +0 -0
  239. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/commands/test_validate_command.py +0 -0
  240. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/memory/__init__.py +0 -0
  241. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/memory/test_memory_add_local_backend.py +0 -0
  242. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/memory/test_memory_command.py +0 -0
  243. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/scripts/__init__.py +0 -0
  244. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/functional/scripts/test_release_script.py +0 -0
  245. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/integration/__init__.py +0 -0
  246. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/integration/build_output/__init__.py +0 -0
  247. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/integration/build_output/test_build_output.py +0 -0
  248. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/integration/install/__init__.py +0 -0
  249. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/integration/install/test_install_methods.py +0 -0
  250. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/integration/plugin_builders/__init__.py +0 -0
  251. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/integration/plugin_builders/test_plugin_builders.py +0 -0
  252. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/plugins/__init__.py +0 -0
  253. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/plugins/claude/__init__.py +0 -0
  254. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/plugins/claude/test_agents.py +0 -0
  255. {agent_notes-2.26.0/tests/unit → agent_notes-2.28.0/tests/plugins/codex}/__init__.py +0 -0
  256. {agent_notes-2.26.0/tests/unit/commands → agent_notes-2.28.0/tests/unit}/__init__.py +0 -0
  257. {agent_notes-2.26.0/tests/unit/registries → agent_notes-2.28.0/tests/unit/commands}/__init__.py +0 -0
  258. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/test_cost_report_subcommand.py +0 -0
  259. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/test_count_agents.py +0 -0
  260. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/test_info.py +0 -0
  261. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/test_memory_add_description.py +0 -0
  262. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/test_memory_imports.py +0 -0
  263. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/test_memory_migrate.py +0 -0
  264. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/test_wizard_imports.py +0 -0
  265. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/test_wizard_orchestrator_skip.py +0 -0
  266. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/test_wizard_preflight.py +0 -0
  267. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/test_wizard_steps.py +0 -0
  268. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/commands/wizard/test_cost_report_step.py +0 -0
  269. {agent_notes-2.26.0/tests/unit/scripts → agent_notes-2.28.0/tests/unit/registries}/__init__.py +0 -0
  270. {agent_notes-2.26.0/tests/unit/services → agent_notes-2.28.0/tests/unit/scripts}/__init__.py +0 -0
  271. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/scripts/test_cost_report.py +0 -0
  272. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/scripts/test_cost_report_scoping.py +0 -0
  273. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/scripts/test_formatting_tty.py +0 -0
  274. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/scripts/test_opencode_backend_pricing.py +0 -0
  275. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/scripts/test_time_aggregation.py +0 -0
  276. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_build_functions.py +0 -0
  277. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_credential_filter.py +0 -0
  278. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_fs.py +0 -0
  279. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_installer_hooks.py +0 -0
  280. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_installer_plan.py +0 -0
  281. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_local_backend.py +0 -0
  282. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_memory_backend.py +0 -0
  283. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_memory_backend_io.py +0 -0
  284. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_memory_router.py +0 -0
  285. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_session_context.py +0 -0
  286. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_settings_writer.py +0 -0
  287. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_skill_filtering.py +0 -0
  288. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_state_store.py +0 -0
  289. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_user_config_cost_report.py +0 -0
  290. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_wiki_backend.py +0 -0
  291. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/services/test_wiki_imports.py +0 -0
  292. {agent_notes-2.26.0 → agent_notes-2.28.0}/tests/unit/test_import_health.py +0 -0
  293. {agent_notes-2.26.0 → agent_notes-2.28.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.26.0
3
+ Version: 2.28.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
@@ -24,6 +24,7 @@ Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
25
  Requires-Dist: pyyaml>=6.0
26
26
  Requires-Dist: tomli>=1.1.0; python_version < "3.11"
27
+ Requires-Dist: tomli-w>=1.0.0
27
28
  Provides-Extra: dev
28
29
  Requires-Dist: pytest>=7.0; extra == "dev"
29
30
  Dynamic: license-file
@@ -0,0 +1 @@
1
+ 2.28.0
@@ -2,6 +2,8 @@
2
2
 
3
3
  from pathlib import Path
4
4
 
5
+ from ..registries.skill_registry import load_skill_registry
6
+
5
7
  # Re-export for backward compatibility. New code should import from agent_notes.domain.
6
8
  from ..domain.diagnostics import Issue, FixAction # noqa: F401
7
9
 
@@ -42,6 +44,42 @@ from ..services.fs import (
42
44
  files_differ
43
45
  )
44
46
 
47
+ # Canonical group vocabulary for skill frontmatter.
48
+ # "process" and "domain" come from the base skills in data/skills/.
49
+ # "rails", "docker", and "kamal" come from the sub-skills that are generated
50
+ # during the release/packaging step and land in data/skills/ of the built
51
+ # package (e.g. rails-models → group: rails, rails-kamal → group: kamal,
52
+ # docker-compose → group: docker). There is no single source-of-truth
53
+ # constant elsewhere in the codebase, so the full vocabulary is listed here.
54
+ _VALID_GROUPS = {"process", "domain", "rails", "docker", "kamal"}
55
+ _VALID_MEMORY_BACKENDS = {"obsidian", "wiki", "local", "none"}
56
+
57
+
58
+ def check_skill_frontmatter(scope: str, issues: list, fix_actions: list, profile_label: str = "") -> None:
59
+ """Warn (non-fatal) about skill frontmatter violations.
60
+
61
+ Checks every skill for:
62
+ - non-empty name and description
63
+ - group, if present, is in {"process", "domain"}
64
+ - requires_memory tokens, if present, are each in {"obsidian", "wiki", "local", "none"}
65
+
66
+ Violations are printed as advisories and do NOT affect issues/fix_actions or exit code.
67
+ """
68
+ registry = load_skill_registry()
69
+ for skill in registry.all():
70
+ if not skill.name:
71
+ print(f" [skill-frontmatter] {skill.path.name}: 'name' is empty")
72
+ if not skill.description:
73
+ print(f" [skill-frontmatter] {skill.path.name}: 'description' is empty")
74
+ if skill.group and skill.group not in _VALID_GROUPS:
75
+ print(f" [skill-frontmatter] {skill.name}: 'group' value '{skill.group}' is not in {sorted(_VALID_GROUPS)}")
76
+ if skill.requires_memory:
77
+ for token in skill.requires_memory.split(","):
78
+ token = token.strip()
79
+ if token and token not in _VALID_MEMORY_BACKENDS:
80
+ print(f" [skill-frontmatter] {skill.name}: 'requires_memory' token '{token}' is not in {sorted(_VALID_MEMORY_BACKENDS)}")
81
+
82
+
45
83
  def _check_session_hook(scope: str, issues: list) -> None:
46
84
  """Check that the Claude Code SessionStart hook is registered in settings.json."""
47
85
  from ..services.settings_writer import has_hook
@@ -162,6 +200,9 @@ def diagnose(scope: str, fix: bool = False) -> bool:
162
200
  # SessionStart hook check (Claude Code only)
163
201
  _check_session_hook(scope, issues)
164
202
 
203
+ # Skill frontmatter advisory check (warn-only, non-fatal)
204
+ check_skill_frontmatter(scope, issues, fix_actions)
205
+
165
206
  # Print role→model assignments
166
207
  state = load_current_state()
167
208
  if state is not None:
@@ -1,5 +1,6 @@
1
1
  """Destructive subcommand: reset."""
2
2
 
3
+ import sys
3
4
  import shutil
4
5
  from typing import Optional
5
6
 
@@ -54,7 +55,7 @@ def do_reset(name: Optional[str] = None) -> None:
54
55
  agent_dir = path / name
55
56
  if not agent_dir.exists():
56
57
  print(f"No memory found for agent '{name}'")
57
- exit(1)
58
+ sys.exit(1)
58
59
 
59
60
  print(f"{Color.YELLOW}This will delete all memory for agent '{name}'.{Color.NC}")
60
61
  confirm = input("Continue? [y/N] ")
@@ -163,7 +163,7 @@ def validate() -> None:
163
163
  codeblock_ok = True
164
164
  for md_file in ROOT.rglob("*.md"):
165
165
  # Skip .git and node_modules
166
- if ".git" in str(md_file) or "node_modules" in str(md_file):
166
+ if any(part in {".git", "node_modules"} for part in md_file.parts):
167
167
  continue
168
168
 
169
169
  if not check_unclosed_code_blocks(md_file):
@@ -28,7 +28,7 @@ def install_agents_filtered(clis: Set[str], scope: str, copy_mode: bool = False,
28
28
  folder_overrides: dict = None, global_home_override: str = "") -> None:
29
29
  """Install agents for selected CLIs (filtered by the wizard)."""
30
30
  from ...services import installer
31
- from ...services.installer import _apply_overrides
31
+ from ...services.installer import _apply_overrides, _agent_glob
32
32
  from ...registries.cli_registry import load_registry
33
33
 
34
34
  registry = load_registry()
@@ -43,11 +43,12 @@ def install_agents_filtered(clis: Set[str], scope: str, copy_mode: bool = False,
43
43
  if dst is None:
44
44
  continue
45
45
 
46
- files = list(src.glob("*.md"))
46
+ glob = _agent_glob(effective)
47
+ files = list(src.glob(glob))
47
48
  if not files:
48
49
  continue
49
50
 
50
- place_dir_contents(src, dst, "*.md", copy_mode)
51
+ place_dir_contents(src, dst, glob, copy_mode)
51
52
 
52
53
 
53
54
  def install_config_filtered(clis: Set[str], scope: str, copy_mode: bool = False,
@@ -161,15 +162,16 @@ def _execute_install(
161
162
  if _cmd_names:
162
163
  print(f" {Color.GREEN}✓{Color.NC} Commands {', '.join(sorted(_cmd_names))}")
163
164
 
164
- # SessionStart hook (Claude Code only)
165
+ # SessionStart hooks for every backend with features.session_hook == true
165
166
  from ...services.installer import _install_session_hook
166
- try:
167
- _claude = _registry.get("claude")
168
- if _claude.name in clis:
169
- _claude_eff = _apply_overrides(_claude, folder_overrides, global_home_override or None)
170
- _install_session_hook(_claude_eff, scope, memory_backend=memory_backend, memory_path=memory_path or "")
171
- except (KeyError, Exception):
172
- pass
167
+ for _hook_backend in _registry.with_feature("session_hook"):
168
+ if _hook_backend.name not in clis:
169
+ continue
170
+ try:
171
+ _hook_eff = _apply_overrides(_hook_backend, folder_overrides, global_home_override or None)
172
+ _install_session_hook(_hook_eff, scope, memory_backend=memory_backend, memory_path=memory_path or "")
173
+ except Exception:
174
+ pass
173
175
 
174
176
  _fs.silent_file_ops = False
175
177
 
@@ -9,6 +9,7 @@ agents:
9
9
  color: purple
10
10
  effort: high
11
11
  claude_exclude: true
12
+ codex_exclude: true
12
13
  claude:
13
14
  tools: "Agent(coder, reviewer, security-auditor, test-writer, test-runner, system-auditor, database-specialist, performance-profiler, api-reviewer, tech-writer, devops, explorer), Read, Grep, Glob, Bash"
14
15
  memory: user
@@ -15,6 +15,7 @@ You are an implementation specialist. You write, edit, and fix code.
15
15
  - No new abstractions, helpers, or utilities for one-time operations.
16
16
  - No comments or docs on code you didn't change.
17
17
  - Validate at system boundaries (user input, external APIs). Trust internal code.
18
+ - Make tests pass by fixing the root cause, NEVER by gaming them — do not hardcode expected values, weaken or delete assertions, special-case the test's inputs, or overload equality to fake a pass. If a test appears wrong or the spec seems contradictory, surface it rather than bypassing it.
18
19
 
19
20
  ## Reporting
20
21
 
@@ -28,6 +28,7 @@ Golden rule: behavior must not change. If tests pass before, they must pass afte
28
28
  - Do NOT introduce new dependencies
29
29
  - Keep commits atomic — one refactoring per commit
30
30
  - If tests don't exist, create them before refactoring
31
+ - Never make the suite green by weakening, skipping, or deleting tests — if a test breaks under a refactor, the refactor changed behavior; fix the refactor, not the test.
31
32
 
32
33
  ## Red-Green-Refactor
33
34
 
@@ -34,6 +34,7 @@ You are a code reviewer. You analyze code and provide actionable feedback.
34
34
  - Do not flag pre-existing issues outside the changed code.
35
35
  - Include specific file:line references for every finding.
36
36
  - Commit to a severity before writing the bullet. If you find yourself retracting a finding within the same entry ("actually this is not an issue…"), either downgrade it to a lower severity before posting, or drop it entirely. A bullet that flags-and-retracts is worse than no bullet — it wastes downstream attention. If uncertain whether something is a real issue, use Suggestion and state the uncertainty in plain terms, rather than marking Critical and walking it back.
37
+ - **Bugfix-plus-test check.** When reviewing a bugfix accompanied by a test: verify the test would FAIL without the fix (it must genuinely falsify the bug). Flag tests that pass trivially or whose assertions cannot fail. Flag "fixes" that game tests — hardcoded expected values, weakened or deleted assertions, special-cased test inputs, or overloading equality to fake a pass — instead of fixing root cause. Flag silent behavior changes disguised as refactors.
37
38
 
38
39
  ## Reporting
39
40
 
@@ -11,3 +11,7 @@ Render every column the `agent-notes cost-report` CLI emits — `agent(model)`,
11
11
  `Cost report skipped: <one-line reason>`
12
12
 
13
13
  If the command ran but produced an error message, print the error verbatim under the heading instead of a table. Fabricating a table when the CLI did not run is a violation.
14
+
15
+ Cost table: once at end of response, never mid-response.
16
+
17
+ Always include the cost report at the end of every response.
@@ -86,7 +86,7 @@ Never spawn one agent per bullet point from the user's prompt. Combine related s
86
86
 
87
87
  Skip agents for: simple questions (answer directly), single-file edits (coder alone), or two-grep lookups (do it yourself).
88
88
 
89
- Give each agent a specific task with all context (paths, criteria). Always include the cost report at the end of every response.
89
+ Give each agent a specific task with all context (paths, criteria).
90
90
 
91
91
  ### Permission pre-check (HARD RULE)
92
92
 
@@ -9,10 +9,8 @@
9
9
  7. "Let me just verify this one thing" followed by 10 reads → if verification needs 10 reads, dispatch.
10
10
  8. Breaking tasks into steps so small they have no independent value → group into meaningful chunks.
11
11
  9. Writing a plan that only restates the user's words → a plan must include discovery findings, dependency order, and flagged risks.
12
- 10. Skipping the cost report at the end of a response always include it.
13
- 11. Fabricating a cost-report table or placeholder rows when `agent-notes cost-report` did not run successfully forbidden. Print "Cost report skipped: <reason>" on a single line instead.
14
- 12. Reporting "done" before tests pass and plan items match → forbidden by Done Gate.
15
- 13. Reporting "done" / "complete" / "shipped" without an `agent-notes memory add ... session lead` call covering this work → forbidden by the Done Gate.
12
+ 10. Reporting "done" before tests pass and plan items matchforbidden by Done Gate.
13
+ 11. Reporting "done" / "complete" / "shipped" without an `agent-notes memory add ... session lead` call covering this work forbidden by the Done Gate.
16
14
 
17
15
  ## Done Gate (HARD RULE)
18
16
 
@@ -25,4 +25,3 @@ Exception: trivial requests (factual questions, conversational replies, single-l
25
25
  - Plans: structured bullet lists with file paths. No prose paragraphs.
26
26
  - Agent briefings: context + task + acceptance criteria. No commentary or justification.
27
27
  - Never narrate internal deliberation — report outcomes only.
28
- - Cost table: once at end of response, never mid-response.
@@ -26,6 +26,7 @@ You are a test writer. You create comprehensive, meaningful tests.
26
26
  - Never use Float for monetary values.
27
27
  - When asserting on error messages or structured output, match SEMANTIC CONTENT, not exact wording. Use substring checks, regex, or category matchers — never full-string equality. Example: to verify a validation error about a missing `description` field, assert that the error text contains `"description"` and indicates absence (e.g. "missing", "required", "empty"), NOT that it equals `"description: missing"`.
28
28
  - If the task gives you example error strings from a spec, treat them as ILLUSTRATIVE — the implementer is free to phrase equivalent messages differently. Your tests must pass against any reasonable phrasing that conveys the same meaning.
29
+ - **Fail-first discipline.** A regression or characterization test MUST be demonstrated to FAIL against the current (unfixed) code, for the right reason, before it is considered to cover a bug. Never write tautological/always-green tests or assertions that cannot fail (e.g. asserting on a mock you fully control, or on a value you just hardcoded). The test's job is to falsify the bug — if it passes on the broken code, it is worthless.
29
30
 
30
31
  ## Reporting
31
32
 
@@ -10,6 +10,7 @@ layout:
10
10
  config: CLAUDE.md
11
11
  memory: agent-memory/
12
12
  settings: settings.json
13
+ agent_extension: md
13
14
  features:
14
15
  agents: true
15
16
  skills: true
@@ -20,7 +21,11 @@ features:
20
21
  config_style: inline
21
22
  settings_template: false
22
23
  supports_symlink: true
24
+ session_hook: true
25
+ stop_hook: true
26
+ allow_entries: true
23
27
  global_template: global-claude.md
24
28
  exclude_flag: claude_exclude
25
29
  accepted_providers: [anthropic, bedrock, vertex]
26
30
  use_model_class: true
31
+ preferred_family: claude
@@ -0,0 +1,29 @@
1
+ name: codex
2
+ label: Codex CLI
3
+ global_home: ~/.codex
4
+ local_dir: .codex
5
+ layout:
6
+ agents: agents/
7
+ skills: skills/
8
+ config: AGENTS.md
9
+ hooks: hooks.json
10
+ agent_extension: toml
11
+ features:
12
+ agents: true
13
+ skills: true
14
+ rules: false
15
+ commands: false
16
+ memory: false
17
+ frontmatter: codex
18
+ config_style: inline
19
+ settings_template: false
20
+ supports_symlink: true
21
+ session_hook: true
22
+ stop_hook: false
23
+ allow_entries: false
24
+ global_template: global-codex.md
25
+ exclude_flag: codex_exclude
26
+ strip_memory_section: true
27
+ accepted_providers: [openai]
28
+ use_model_class: false
29
+ preferred_family: gpt
@@ -6,6 +6,7 @@ layout:
6
6
  agents: agents/
7
7
  skills: skills/
8
8
  config: AGENTS.md
9
+ agent_extension: md
9
10
  features:
10
11
  agents: true
11
12
  skills: true
@@ -16,7 +17,11 @@ features:
16
17
  config_style: inline
17
18
  settings_template: false
18
19
  supports_symlink: true
20
+ session_hook: false
21
+ stop_hook: false
22
+ allow_entries: false
19
23
  global_template: global-opencode.md
20
24
  exclude_flag: opencode_exclude
21
25
  strip_memory_section: true
22
26
  accepted_providers: [github-copilot, anthropic, openrouter, openai, google, moonshot]
27
+ preferred_family: claude
@@ -0,0 +1,40 @@
1
+ # Global Instructions
2
+
3
+ ## Coding philosophy
4
+
5
+ - Read existing code before writing new code. Match project patterns.
6
+ - Minimal changes: only what was requested. Do not refactor beyond scope.
7
+ - Fix root causes, not symptoms.
8
+ - One approach, commit to it. Course-correct only on new evidence.
9
+
10
+ ## Behavior
11
+
12
+ - Investigate before answering. Never speculate about code you haven't read.
13
+ - No over-engineering: no extra features, abstractions, or configs beyond scope.
14
+ - No comments or docs on code you didn't change.
15
+ - When the task is unclear, ask one clarifying question instead of guessing.
16
+
17
+ ## Safety
18
+
19
+ - Confirm before: `git push --force`, `rm -rf`, `DROP TABLE`, branch deletion.
20
+ - Never commit: `.env`, `*.pem`, credentials, API keys, secrets.
21
+ - Never bypass: `--no-verify`, `--force` without explicit user request.
22
+ - Never force-push to main/master.
23
+
24
+ ## Commits
25
+
26
+ - Load the `git` skill when asked to commit and follow its workflow.
27
+ - Analyze all changes, group into logical chunks, make small focused commits.
28
+ - Format: `#<ticket> type(scope): short description` — title only, no body.
29
+ - Extract ticket number from branch name when available.
30
+ - Types: feat, fix, refactor, test, docs, chore, style, perf
31
+
32
+ ## Agent delegation
33
+
34
+ - Use subagents when tasks can run in parallel or require isolated context.
35
+ - For simple tasks, sequential operations, or single-file edits, work directly.
36
+ - Use `explorer` for quick lookups to save context tokens.
37
+ - Use `database-specialist` for schema, indexes, and query analysis.
38
+ - Use `performance-profiler` for bottleneck identification.
39
+ - Use `api-reviewer` for API design and consistency checks.
40
+ - Use `lead` for complex multi-step tasks requiring coordination.
@@ -0,0 +1,14 @@
1
+ id: gpt-5-4-mini
2
+ label: GPT-5.4 Mini
3
+ family: gpt
4
+ class: haiku
5
+ aliases:
6
+ openai: gpt-5.4-mini
7
+ pricing:
8
+ input: 0.15
9
+ output: 0.60
10
+ cache: 0.02
11
+ capabilities:
12
+ vision: true
13
+ long_context: false
14
+ tool_use: true
@@ -0,0 +1,14 @@
1
+ id: gpt-5-4
2
+ label: GPT-5.4
3
+ family: gpt
4
+ class: sonnet
5
+ aliases:
6
+ openai: gpt-5.4
7
+ pricing:
8
+ input: 3.00
9
+ output: 15.00
10
+ cache: 0.30
11
+ capabilities:
12
+ vision: true
13
+ long_context: true
14
+ tool_use: true
@@ -0,0 +1,14 @@
1
+ id: gpt-5-5
2
+ label: GPT-5.5
3
+ family: gpt
4
+ class: opus
5
+ aliases:
6
+ openai: gpt-5.5
7
+ pricing:
8
+ input: 10.00
9
+ output: 40.00
10
+ cache: 1.00
11
+ capabilities:
12
+ vision: true
13
+ long_context: true
14
+ tool_use: true
@@ -47,18 +47,26 @@ Work through these five lenses in order. Report findings grouped by lens, ranked
47
47
 
48
48
  ## Output format
49
49
 
50
+ Emit each finding as a record: `severity` (blocking | suggestion) · `file` · `line` · `finding` · `why` · `fix` (if applicable). When the output is consumed by another agent, emit JSON objects with exactly those keys. For a human summary, group by severity:
51
+
50
52
  ```
51
53
  BLOCKING
52
- - [file:line] [finding] — [why it matters]
54
+ - [file:line] [finding] — [why it matters] → [fix]
53
55
 
54
56
  SUGGESTIONS
55
57
  - [file:line] [finding] — [alternative if applicable]
56
58
 
57
- APPROVED (if no blocking issues)
59
+ APPROVED (state explicitly when there are no blocking findings)
58
60
  ```
59
61
 
60
62
  A BLOCKING finding must be resolved before merge. A SUGGESTION is optional.
61
63
 
64
+ ## Lens 6 — Test integrity / anti-gaming
65
+
66
+ - Does each test actually falsify what it claims to cover — would it fail without the change?
67
+ - Watch for gamed fixes: hardcoded expected values, weakened or deleted assertions, special-cased inputs that only work for the exact test data.
68
+ - Watch for behavior changes disguised as refactors (suite stays green because the test was weakened, not because behavior was preserved).
69
+
62
70
  ## Scope discipline
63
71
 
64
72
  Do not flag cosmetic changes unless they create real ambiguity. A review that lists 20 nits trains authors to ignore reviews entirely.
@@ -59,7 +59,8 @@ Test with the smallest possible change — one that confirms or disproves the hy
59
59
  ## Phase 4 — Fix
60
60
 
61
61
  Apply the minimal fix for the root cause:
62
- - Fix the root cause, not the symptom.
62
+ - Fix the root cause, not the symptom. Do not make the symptom disappear by swallowing or catching the error, loosening an assertion, adding a retry that hides a race, or special-casing the failing input. Those game the symptom check without fixing the bug.
63
+ - Before touching the fix, confirm the reproduction actually fails on the current code. A repro that never truly failed proves nothing. After fixing, confirm it now passes AND would have failed without the change.
63
64
  - Remove all instrumentation from Phase 1.
64
65
  - Run the full test suite.
65
66
  - Confirm the original failure is gone and nothing else regressed.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: improve-codebase-architecture
3
- description: "Find deepening opportunities — modules where the interface is nearly as complex as the implementation. Use when user wants to improve architecture, reduce coupling, make code more testable, or says 'clean up the design'."
3
+ description: "Find deepening opportunities — modules where the interface is nearly as complex as the implementation. Use when user wants to improve architecture, reduce coupling, make code more testable, or says 'clean up the design'. For broad code-quality hardening use rsi; for a single safe refactor use refactoring-protocol."
4
4
  group: process
5
5
  ---
6
6
 
@@ -2,7 +2,7 @@
2
2
  name: migrate-memory
3
3
  description: "Reconcile the Obsidian vault or Wiki knowledge base to the latest canonical format. Use after upgrading agent-notes or when vault structure looks outdated or inconsistent."
4
4
  group: process
5
- requires_memory: obsidian, wiki
5
+ requires_memory: obsidian,wiki
6
6
  ---
7
7
 
8
8
  # Migrate Memory
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: refactoring-protocol
3
- description: "Safe refactoring: green tests first, one extraction at a time, structure OR behavior never both. Use when user wants to refactor code, reduce duplication, or says 'clean this up'."
3
+ description: "Safe refactoring: green tests first, one extraction at a time, structure OR behavior never both. Use when user wants to refactor code, reduce duplication, or says 'clean this up'. For an iterative multi-dimensional cleanup loop use rsi; for module or interface redesign use improve-codebase-architecture."
4
4
  group: process
5
5
  ---
6
6
 
@@ -51,6 +51,7 @@ Return to Step 2 for the next extraction.
51
51
  ## Hard rules
52
52
 
53
53
  - **Structure OR behavior in one commit, never both.** If you find a bug while refactoring: stash the refactor, fix the bug in a separate commit, then resume. Mixing them makes the change impossible to review and risky to revert.
54
+ - **Never achieve green by weakening the tests.** Do not weaken, skip, delete, or rewrite a test to make it pass after a refactor. If a test breaks, the refactor changed behavior by definition — fix or revert the refactor, not the test. The test suite is the invariant the refactor must preserve.
54
55
  - **Do not optimize during refactor.** Performance tuning is a separate session with its own measurement baseline.
55
56
  - **Do not add features during refactor.** If you notice a missing edge case: note it, address it in a separate commit after the refactor is complete.
56
57
  - **Stop when the smell is gone.** Over-refactoring is as harmful as under-refactoring.
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: rsi
3
+ description: "Recursive code-improvement loop: iteratively harden an existing codebase across bugs, performance, quality, consistency/homogeneity, pattern adherence, tests, atomicity, independence, and DRY — strictly without adding functionality. Use when the user wants to improve, clean up, or harden existing code, says 'rsi', or asks to raise code quality without new features. For a single one-shot refactor use refactoring-protocol; for module or interface redesign use improve-codebase-architecture."
4
+ group: process
5
+ argument-hint: "[path or scope, optional]"
6
+ ---
7
+
8
+ # RSI — Recursive Self-Improvement (Code)
9
+
10
+ Iteratively improve EXISTING code until it stops yielding improvements. The lead orchestrates; specialized agents do the work. This is a quality loop, not a feature loop.
11
+
12
+ ## Prime invariant
13
+
14
+ - **Behavior-preserving.** NEVER add functionality, new features, new public API, or new config. Only improve what already exists.
15
+ - **Tests green before a pass and after every change.** If the target has no test coverage, write a characterization test FIRST, then improve.
16
+ - **One change = one concern.** Structure OR behavior, never both in the same change.
17
+
18
+ ## The loop (lead-orchestrated, loop-until-dry)
19
+
20
+ 1. **Scope.** Resolve the target (arg path, or whole project). Identify the test command and confirm the suite is green. If it is red, stop and report — fix the suite before improving. Do NOT run the loop on code that lacks meaningful test coverage — write characterization tests first: studies report that looping over weakly-tested code produces roughly 10x more false-positive "fixes" than with a strong suite (~16% vs ~1.4%).
21
+ 2. **Scan — one dimension at a time.** Dispatch read-only agents to produce a ranked list of concrete opportunities:
22
+ - `debugger` / `security-auditor` → bugs, correctness, vulnerabilities
23
+ - `performance-profiler` → hot paths, N+1, redundant work
24
+ - `system-auditor` → duplication, dead code, coupling, inconsistent implementations of one concept
25
+ - `reviewer` → readability, naming, pattern & consistency adherence
26
+ - `test-writer` (read-only pass) → coverage gaps
27
+
28
+ Each opportunity is a **finding record**: `file` · `line` · `dimension` · `severity` (blocker | major | minor) · `why` · `fix` (one-line proposed change). When a downstream agent consumes the scan, emit findings as JSON objects with exactly those keys; otherwise the dashed form `file:line — dimension/severity — why — fix` is fine.
29
+
30
+ 3. **Prioritize.** Order: correctness/safety > missing tests on touched code > DRY/duplication > consistency/homogeneity > pattern & convention fit > performance > clarity/naming. Drop anything that changes behavior or adds capability.
31
+ 4. **Apply ONE atomic, independent change.** Dispatch `coder` (bugfix) or `refactorer` (behavior-preserving cleanup). Smallest viable diff.
32
+ 5. **Verify.** Run affected tests — must stay green. `reviewer` confirms: no behavior change, fits conventions, genuinely improves the dimension. On regression → revert and re-plan. Note: research suggests genuine logic bugs repair poorly in an iterative loop (~45% vs ~77% for surface/name errors) — escalate real logic bugs to `debugger` rather than re-looping.
33
+ 6. **Commit (auto, atomic).** One concern per commit, independent and revertable. Use the `git` skill's message format. Then take the next opportunity.
34
+ 7. **Repeat passes.** Converge when TWO consecutive full passes surface no new actionable improvement. Then report.
35
+
36
+ ## Dimensions rubric
37
+
38
+ Each dimension: what to **hunt**, what to **fix**, what to **leave alone**.
39
+
40
+ - **Bugs & correctness** — off-by-one, nil/None, races, missing error handling, unhandled edge cases. Fix minimally + add a regression test. Don't redesign.
41
+ - **Performance** — measured hot paths, N+1 queries, redundant work, bad complexity, unbounded growth. Don't micro-optimize cold paths or trade clarity for guesswork.
42
+ - **Code quality** — long methods, deep nesting, unclear names, magic values. Extract, apply guard clauses, rename. Don't gold-plate.
43
+ - **Consistency / homogeneity** — the same kind of thing implemented multiple different ways: mixed styles for one object type, divergent shapes for one concept, inconsistent signatures or return types. Converge on one canonical form and reduce needless variation. Distinct from DRY — this targets divergent *expression* of one concept, not duplicated *logic*. Don't force genuinely different things into a false-common shape.
44
+ - **Pattern adherence** — match the project's dominant idioms, structure, and conventions. Align outliers. Don't invent new patterns.
45
+ - **Tests** — cover changed or risky code, fix flaky/slow tests, add missing edge cases. Don't test trivial getters.
46
+ - **Atomicity** — split god-functions and god-classes into single-responsibility units. Don't over-fragment.
47
+ - **Independence** — reduce coupling, remove hidden global state, narrow interfaces. Don't add abstraction layers nobody needs.
48
+ - **DRY** — collapse genuine duplication into one source of truth. Don't DRY accidental similarity (premature abstraction is worse than duplication).
49
+ - **Dead code** — unused functions, variables, imports, branches. Delete after confirming no external use.
50
+
51
+ ## Gates (hard)
52
+
53
+ - **Green-before / green-after.** A red suite halts the loop.
54
+ - **No-feature gate.** If a change adds capability, it is out of scope — reject it.
55
+ - **Atomic & independent commits.** Revert on regression with `git revert` — never `reset --hard` or force-push.
56
+ - **Max 2 review rounds per change,** then accept or drop it. (empirically, ~2 rounds captures most attainable improvement — on the order of 76–95% — so further rounds are mostly wasted polish.)
57
+ - **Fail-first, anti-gaming.** Every regression/characterization test must be shown to FAIL on the unfixed code (it must actually reproduce the bug) BEFORE the fix lands. Reject any "fix" that games the test rather than addressing root cause — hardcoded expected values, weakened/removed assertions, special-casing the asserted inputs, or operator/equality overloading. A test that passes regardless of the fix proves nothing. The reviewer confirms the test genuinely falsifies the bug.
58
+
59
+ ## Done
60
+
61
+ Report: improvements grouped by dimension, commits made, tests added, deferrals (with reasons), and anything skipped as out-of-scope (new functionality).
@@ -36,7 +36,8 @@ Because you just wrote the code, you know exactly what behavior matters and how
36
36
 
37
37
  ## GREEN — make it pass
38
38
 
39
- - Write the minimum code to pass the test. Hardcode values if that's all it takes — you'll triangulate with the next test.
39
+ - Write the minimum code to pass the test. Hardcode values if that's all it takes — you'll triangulate with the next test. A hardcoded return is only valid as a transient step toward a general implementation; if it stays in permanently to satisfy the test, that is reward-hacking, not TDD.
40
+ - Do not reach GREEN by gaming the test: no special-casing the test's specific inputs, no weakening the assertion, no deleting the assertion. The test must pass because the behavior is implemented, not because the check was neutered.
40
41
  - Run the test. Confirm green.
41
42
  - If still failing: read the failure output carefully before changing anything else.
42
43