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