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