agent-notes 2.14.0__tar.gz → 2.15.1__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.14.0 → agent_notes-2.15.1}/PKG-INFO +1 -1
- agent_notes-2.15.1/agent_notes/VERSION +1 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/cli.py +1 -1
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/memory.py +171 -4
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/wizard.py +18 -4
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/config.py +2 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/domain/state.py +1 -1
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/memory_backend.py +1 -1
- agent_notes-2.15.1/agent_notes/services/wiki_backend.py +669 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes.egg-info/PKG-INFO +1 -1
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes.egg-info/SOURCES.txt +3 -1
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/services/test_memory_backend_io.py +10 -6
- agent_notes-2.15.1/tests/unit/services/test_wiki_backend.py +828 -0
- agent_notes-2.14.0/agent_notes/VERSION +0 -1
- {agent_notes-2.14.0 → agent_notes-2.15.1}/LICENSE +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/README.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/__main__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/_install_helpers.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/build.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/config.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/doctor.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/info.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/install.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/list.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/regenerate.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/set_role.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/uninstall.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/update.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/commands/validate.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/agents.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/analyst.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/api-reviewer.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/architect.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/coder.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/database-specialist.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/debugger.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/devil.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/devops.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/explorer.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/integrations.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/lead.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/performance-profiler.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/refactorer.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/reviewer.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/security-auditor.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/shared/cost_reporting.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/shared/phase0.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/system-auditor.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/tech-writer.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/test-runner.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/agents/test-writer.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/cli/claude.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/cli/copilot.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/cli/opencode.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/commands/brainstorm.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/commands/debug.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/commands/review.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/global-claude.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/global-copilot.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/global-opencode.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/hooks/session-context.md.tpl +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/models/claude-haiku-4-5.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/models/claude-opus-4-1.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/models/claude-opus-4-5.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/models/claude-opus-4-6.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/models/claude-opus-4-7.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/models/claude-sonnet-4-5.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/models/claude-sonnet-4-6.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/models/claude-sonnet-4.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/plugin/claude.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/plugin/opencode-index.js.template +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/plugin/opencode.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/pricing.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/roles/orchestrator.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/roles/reasoner.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/roles/scout.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/roles/worker.yaml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/rules/code-quality.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/rules/safety.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/brainstorming/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/caveman/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/code-review/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/debugging-protocol/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/docker-compose/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/docker-compose-advanced/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/docker-dockerfile/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/docker-dockerfile-languages/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/git/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/grill-me/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/grill-with-docs/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/improve-codebase-architecture/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/obsidian-memory/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-active-storage/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-broadcasting/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-concerns/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-controllers/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-controllers-advanced/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-helpers/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-initializers/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-javascript/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-jobs/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-kamal/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-lib/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-mailers/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-migrations/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-models/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-models-advanced/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-routes/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-style/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-testing-controllers/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-testing-models/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-testing-system/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-validations/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-view-components/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-view-components-advanced/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-views/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/rails-views-advanced/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/refactoring-protocol/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/setup-project-context/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/tdd/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/skills/zoom-out/SKILL.md +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/templates/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/templates/__pycache__/__init__.cpython-314.pyc +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/templates/frontmatter/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/templates/frontmatter/__pycache__/__init__.cpython-314.pyc +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/templates/frontmatter/__pycache__/claude.cpython-314.pyc +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/templates/frontmatter/__pycache__/opencode.cpython-314.pyc +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/templates/frontmatter/claude.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/data/templates/frontmatter/opencode.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/doctor_checks.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/domain/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/domain/agent.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/domain/cli_backend.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/domain/diagnostics.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/domain/diff.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/domain/model.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/domain/role.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/domain/rule.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/domain/skill.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/install_state.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/registries/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/registries/_base.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/registries/agent_registry.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/registries/cli_registry.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/registries/model_registry.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/registries/role_registry.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/registries/rule_registry.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/registries/skill_registry.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/scripts/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/scripts/_claude_backend.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/scripts/_formatting.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/scripts/_opencode_backend.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/scripts/_pricing.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/scripts/cost_report.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/credentials.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/diagnostics/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/diagnostics/_checks.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/diagnostics/_display.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/diagnostics/_fix.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/diff.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/fs.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/install_state_builder.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/installer.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/rendering.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/session_context.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/settings_writer.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/state_store.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/ui.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/user_config.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/services/validation.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes/state.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes.egg-info/dependency_links.txt +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes.egg-info/entry_points.txt +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes.egg-info/requires.txt +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/agent_notes.egg-info/top_level.txt +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/pyproject.toml +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/setup.cfg +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/conftest.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/commands/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/commands/test_config_command.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/commands/test_doctor_command.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/commands/test_info_command.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/commands/test_install_command.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/commands/test_list_command.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/commands/test_regenerate_command.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/commands/test_uninstall_command.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/commands/test_update_command.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/commands/test_validate_command.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/memory/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/memory/test_memory_command.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/scripts/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/functional/scripts/test_release_script.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/integration/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/integration/build_output/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/integration/build_output/test_build_output.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/integration/install/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/integration/install/test_install_methods.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/integration/plugin_builders/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/integration/plugin_builders/test_plugin_builders.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/plugins/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/plugins/claude/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/plugins/claude/test_agents.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/plugins/test_skills.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/commands/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/commands/test_cost_report_subcommand.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/commands/test_count_agents.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/commands/test_memory_migrate.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/commands/test_wizard_orchestrator_skip.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/commands/test_wizard_preflight.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/registries/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/registries/test_registries.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/scripts/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/scripts/test_cost_report.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/scripts/test_cost_report_scoping.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/scripts/test_formatting_tty.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/scripts/test_time_aggregation.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/services/__init__.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/services/test_build_functions.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/services/test_credentials.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/services/test_fs.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/services/test_installer_plan.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/services/test_memory_backend.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/services/test_rendering_includes.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/services/test_settings_writer.py +0 -0
- {agent_notes-2.14.0 → agent_notes-2.15.1}/tests/unit/test_memory_dir_for_backend.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.15.1
|
|
@@ -282,7 +282,7 @@ def main():
|
|
|
282
282
|
# memory
|
|
283
283
|
p_memory = subparsers.add_parser("memory", help="Manage agent memory")
|
|
284
284
|
p_memory.add_argument("action", nargs="?", default="list",
|
|
285
|
-
choices=["init", "list", "vault", "index", "add", "size", "show", "reset", "export", "import"],
|
|
285
|
+
choices=["init", "list", "vault", "index", "add", "size", "show", "reset", "export", "import", "ingest", "query", "lint"],
|
|
286
286
|
help="Memory action")
|
|
287
287
|
p_memory.add_argument("name", nargs="?", help="Agent name / note title (for show/reset/add)")
|
|
288
288
|
p_memory.add_argument("extra", nargs="*", help="Additional args (for add: body [type] [agent] [project])")
|
|
@@ -43,6 +43,13 @@ def do_init() -> None:
|
|
|
43
43
|
if path is None:
|
|
44
44
|
print("Memory path not configured.")
|
|
45
45
|
return
|
|
46
|
+
if backend == "wiki":
|
|
47
|
+
from ..services.wiki_backend import wiki_init, WIKI_PAGE_TYPES
|
|
48
|
+
wiki_init(path)
|
|
49
|
+
print(f"{Color.GREEN}Wiki initialised at {path}{Color.NC}")
|
|
50
|
+
print(f" Folders: raw/, wiki/{{{', '.join(WIKI_PAGE_TYPES)}}}")
|
|
51
|
+
print(f" Index: {path / 'wiki' / 'index.md'}")
|
|
52
|
+
return
|
|
46
53
|
if backend == "obsidian":
|
|
47
54
|
from ..services.memory_backend import obsidian_init, OBSIDIAN_CATEGORIES
|
|
48
55
|
obsidian_init(path)
|
|
@@ -65,7 +72,11 @@ def do_index() -> None:
|
|
|
65
72
|
if path is None:
|
|
66
73
|
print("Memory path not configured.")
|
|
67
74
|
return
|
|
68
|
-
if backend == "
|
|
75
|
+
if backend == "wiki":
|
|
76
|
+
from ..services.wiki_backend import wiki_regenerate_index
|
|
77
|
+
wiki_regenerate_index(path)
|
|
78
|
+
print(f"{Color.GREEN}index.md regenerated at {path / 'wiki' / 'index.md'}{Color.NC}")
|
|
79
|
+
elif backend == "obsidian":
|
|
69
80
|
from ..services.memory_backend import obsidian_regenerate_index
|
|
70
81
|
obsidian_regenerate_index(path)
|
|
71
82
|
print(f"{Color.GREEN}Index.md regenerated at {path / 'Index.md'}{Color.NC}")
|
|
@@ -75,8 +86,21 @@ def do_index() -> None:
|
|
|
75
86
|
print(f"{Color.GREEN}Index.md regenerated at {path / 'Index.md'}{Color.NC}")
|
|
76
87
|
|
|
77
88
|
|
|
89
|
+
_WIKI_TYPE_MAP = {
|
|
90
|
+
"pattern": "concepts",
|
|
91
|
+
"decision": "concepts",
|
|
92
|
+
"mistake": "concepts",
|
|
93
|
+
"context": "concepts",
|
|
94
|
+
"concept": "concepts",
|
|
95
|
+
"entity": "entities",
|
|
96
|
+
"synthesis": "synthesis",
|
|
97
|
+
"session": "sessions",
|
|
98
|
+
"source": "sources",
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
|
|
78
102
|
def do_add(title: str, body: str, note_type: str = "context", agent: str = "", project: str = "", tags: Optional[list] = None) -> None:
|
|
79
|
-
"""Add a note to memory (obsidian
|
|
103
|
+
"""Add a note to memory (obsidian or wiki backend)."""
|
|
80
104
|
backend, path = _load_memory_config()
|
|
81
105
|
if backend == "none":
|
|
82
106
|
print("Memory is disabled. Run `agent-notes memory vault` to check configuration.")
|
|
@@ -84,7 +108,21 @@ def do_add(title: str, body: str, note_type: str = "context", agent: str = "", p
|
|
|
84
108
|
if path is None:
|
|
85
109
|
print("Memory path not configured.")
|
|
86
110
|
return
|
|
87
|
-
if backend == "
|
|
111
|
+
if backend == "wiki":
|
|
112
|
+
from ..services.wiki_backend import wiki_write_page
|
|
113
|
+
page_type = _WIKI_TYPE_MAP.get(note_type, "concepts")
|
|
114
|
+
extra_tags = [note_type] if note_type not in ("concept", "entity", "synthesis", "session", "source") else []
|
|
115
|
+
page_path = wiki_write_page(
|
|
116
|
+
path,
|
|
117
|
+
title=title,
|
|
118
|
+
body=body,
|
|
119
|
+
page_type=page_type,
|
|
120
|
+
agent=agent,
|
|
121
|
+
project=project,
|
|
122
|
+
tags=(tags or []) + extra_tags,
|
|
123
|
+
)
|
|
124
|
+
print(f"{Color.GREEN}Wiki page saved: {page_path}{Color.NC}")
|
|
125
|
+
elif backend == "obsidian":
|
|
88
126
|
from ..services.memory_backend import obsidian_init, obsidian_write_note
|
|
89
127
|
obsidian_init(path)
|
|
90
128
|
note_path = obsidian_write_note(
|
|
@@ -98,7 +136,7 @@ def do_add(title: str, body: str, note_type: str = "context", agent: str = "", p
|
|
|
98
136
|
)
|
|
99
137
|
print(f"{Color.GREEN}Note saved: {note_path}{Color.NC}")
|
|
100
138
|
else:
|
|
101
|
-
print("The `add` subcommand is for the obsidian backend.")
|
|
139
|
+
print("The `add` subcommand is for the obsidian or wiki backend.")
|
|
102
140
|
print("For local backend, write files directly to the agent subdirectory.")
|
|
103
141
|
|
|
104
142
|
|
|
@@ -110,6 +148,26 @@ def do_list() -> None:
|
|
|
110
148
|
print("Memory is disabled. Run `agent-notes memory backend` to enable it.")
|
|
111
149
|
return
|
|
112
150
|
|
|
151
|
+
if backend == "wiki":
|
|
152
|
+
if path is None or not path.exists():
|
|
153
|
+
print(f"Wiki not found at {path}")
|
|
154
|
+
return
|
|
155
|
+
from ..services.wiki_backend import wiki_list_pages
|
|
156
|
+
pages = wiki_list_pages(path)
|
|
157
|
+
if not pages:
|
|
158
|
+
print(f"No pages found in wiki {path}")
|
|
159
|
+
return
|
|
160
|
+
print(f"Wiki ({path}):")
|
|
161
|
+
print("")
|
|
162
|
+
current_type = None
|
|
163
|
+
for page in pages:
|
|
164
|
+
if page["type"] != current_type:
|
|
165
|
+
current_type = page["type"]
|
|
166
|
+
print(f" {Color.CYAN}{current_type}{Color.NC}")
|
|
167
|
+
tags_str = f" [{', '.join(page['tags'])}]" if page["tags"] else ""
|
|
168
|
+
print(f" {page['file']}{tags_str}")
|
|
169
|
+
return
|
|
170
|
+
|
|
113
171
|
if backend == "obsidian":
|
|
114
172
|
if path is None or not path.exists():
|
|
115
173
|
print(f"Obsidian vault not found at {path}")
|
|
@@ -361,6 +419,96 @@ def format_size(size_bytes: int) -> str:
|
|
|
361
419
|
return f"{original_size:.1f}P"
|
|
362
420
|
|
|
363
421
|
|
|
422
|
+
def do_ingest(title: str, body: str, concepts: Optional[list] = None, entities: Optional[list] = None, tags: Optional[list] = None) -> None:
|
|
423
|
+
"""Ingest a source into the wiki backend."""
|
|
424
|
+
backend, path = _load_memory_config()
|
|
425
|
+
if backend != "wiki":
|
|
426
|
+
print("The `ingest` subcommand is only available for the wiki backend.")
|
|
427
|
+
return
|
|
428
|
+
if path is None:
|
|
429
|
+
print("Memory path not configured.")
|
|
430
|
+
return
|
|
431
|
+
from ..services.wiki_backend import wiki_ingest
|
|
432
|
+
result = wiki_ingest(
|
|
433
|
+
path,
|
|
434
|
+
title=title,
|
|
435
|
+
body=body,
|
|
436
|
+
concepts=concepts or [],
|
|
437
|
+
entities=entities or [],
|
|
438
|
+
tags=tags or [],
|
|
439
|
+
)
|
|
440
|
+
source_paths = result.get("source", [])
|
|
441
|
+
concept_paths = result.get("concepts", [])
|
|
442
|
+
entity_paths = result.get("entities", [])
|
|
443
|
+
print(f"{Color.GREEN}Ingested: {title}{Color.NC}")
|
|
444
|
+
for p in source_paths:
|
|
445
|
+
print(f" source: {p}")
|
|
446
|
+
for p in concept_paths:
|
|
447
|
+
print(f" concept: {p}")
|
|
448
|
+
for p in entity_paths:
|
|
449
|
+
print(f" entity: {p}")
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def do_query(keyword: str) -> None:
|
|
453
|
+
"""Search wiki pages by keyword."""
|
|
454
|
+
backend, path = _load_memory_config()
|
|
455
|
+
if backend != "wiki":
|
|
456
|
+
print("The `query` subcommand is only available for the wiki backend.")
|
|
457
|
+
return
|
|
458
|
+
if path is None:
|
|
459
|
+
print("Memory path not configured.")
|
|
460
|
+
return
|
|
461
|
+
from ..services.wiki_backend import wiki_query
|
|
462
|
+
results = wiki_query(path, keyword)
|
|
463
|
+
if not results:
|
|
464
|
+
print(f"No results found for: {keyword}")
|
|
465
|
+
return
|
|
466
|
+
print(f"Results for '{keyword}' ({len(results)} found):")
|
|
467
|
+
print("")
|
|
468
|
+
for r in results:
|
|
469
|
+
print(f" {Color.CYAN}[{r['type']}]{Color.NC} {r['title']}")
|
|
470
|
+
print(f" {r['path']}")
|
|
471
|
+
if r["snippet"]:
|
|
472
|
+
print(f" ...{r['snippet']}...")
|
|
473
|
+
print("")
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
def do_lint() -> None:
|
|
477
|
+
"""Check wiki health."""
|
|
478
|
+
backend, path = _load_memory_config()
|
|
479
|
+
if backend != "wiki":
|
|
480
|
+
print("The `lint` subcommand is only available for the wiki backend.")
|
|
481
|
+
return
|
|
482
|
+
if path is None:
|
|
483
|
+
print("Memory path not configured.")
|
|
484
|
+
return
|
|
485
|
+
from ..services.wiki_backend import wiki_lint
|
|
486
|
+
issues = wiki_lint(path)
|
|
487
|
+
orphans = issues.get("orphans", [])
|
|
488
|
+
broken = issues.get("broken_links", [])
|
|
489
|
+
stale = issues.get("stale_index", [])
|
|
490
|
+
|
|
491
|
+
if not orphans and not broken and not stale:
|
|
492
|
+
print(f"{Color.GREEN}Wiki is healthy — no issues found.{Color.NC}")
|
|
493
|
+
return
|
|
494
|
+
|
|
495
|
+
if orphans:
|
|
496
|
+
print(f"{Color.YELLOW}Orphans ({len(orphans)} pages not linked from anywhere):{Color.NC}")
|
|
497
|
+
for p in orphans:
|
|
498
|
+
print(f" {p}")
|
|
499
|
+
print("")
|
|
500
|
+
if broken:
|
|
501
|
+
print(f"{Color.YELLOW}Broken links ({len(broken)}):{Color.NC}")
|
|
502
|
+
for b in broken:
|
|
503
|
+
print(f" {b}")
|
|
504
|
+
print("")
|
|
505
|
+
if stale:
|
|
506
|
+
print(f"{Color.YELLOW}Stale index ({len(stale)} pages newer than index.md):{Color.NC}")
|
|
507
|
+
for s in stale:
|
|
508
|
+
print(f" {s}")
|
|
509
|
+
print(f" Run: agent-notes memory index")
|
|
510
|
+
|
|
511
|
+
|
|
364
512
|
def do_migrate() -> None:
|
|
365
513
|
"""Migrate vault from per-project layout to flat shared layout with new filenames."""
|
|
366
514
|
import re
|
|
@@ -574,6 +722,25 @@ def memory(action: str = "list", name: Optional[str] = None, extra: Optional[lis
|
|
|
574
722
|
do_import()
|
|
575
723
|
elif action == "migrate":
|
|
576
724
|
do_migrate()
|
|
725
|
+
elif action == "ingest":
|
|
726
|
+
if not name:
|
|
727
|
+
print("Error: ingest requires a title.")
|
|
728
|
+
exit(1)
|
|
729
|
+
body = extra[0] if extra else ""
|
|
730
|
+
concepts_csv = extra[1] if extra and len(extra) > 1 else ""
|
|
731
|
+
entities_csv = extra[2] if extra and len(extra) > 2 else ""
|
|
732
|
+
tags_csv = extra[3] if extra and len(extra) > 3 else ""
|
|
733
|
+
concepts = [c.strip() for c in concepts_csv.split(",") if c.strip()] if concepts_csv else None
|
|
734
|
+
entities = [e.strip() for e in entities_csv.split(",") if e.strip()] if entities_csv else None
|
|
735
|
+
tags = [t.strip() for t in tags_csv.split(",") if t.strip()] if tags_csv else None
|
|
736
|
+
do_ingest(name, body, concepts=concepts, entities=entities, tags=tags)
|
|
737
|
+
elif action == "query":
|
|
738
|
+
if not name:
|
|
739
|
+
print("Error: query requires a keyword.")
|
|
740
|
+
exit(1)
|
|
741
|
+
do_query(name)
|
|
742
|
+
elif action == "lint":
|
|
743
|
+
do_lint()
|
|
577
744
|
else:
|
|
578
745
|
print(f"Unknown command: {action}")
|
|
579
746
|
show_help()
|
|
@@ -339,7 +339,12 @@ def _render_install_summary(clis: Set[str], scope: str, copy_mode: bool, selecte
|
|
|
339
339
|
print(f" {_DIM}Skills{_NC} {', '.join(parts) if parts else 'none'}")
|
|
340
340
|
|
|
341
341
|
if memory_backend and memory_backend != "none":
|
|
342
|
-
|
|
342
|
+
if memory_backend == "obsidian":
|
|
343
|
+
mem_label = f"Obsidian (session) → {memory_path}" if memory_path else "Obsidian (session)"
|
|
344
|
+
elif memory_backend == "wiki":
|
|
345
|
+
mem_label = f"Obsidian (wiki) → {memory_path}" if memory_path else "Obsidian (wiki)"
|
|
346
|
+
else:
|
|
347
|
+
mem_label = "Local markdown"
|
|
343
348
|
print(f" {_DIM}Memory{_NC} {mem_label}")
|
|
344
349
|
|
|
345
350
|
# ── Per-CLI sections ──────────────────────────────────────────────────────
|
|
@@ -407,7 +412,8 @@ def _select_memory(step: int, total: int, version: str = '') -> tuple:
|
|
|
407
412
|
|
|
408
413
|
options = [
|
|
409
414
|
("Local markdown files (~/.claude/agent-memory/)", "local"),
|
|
410
|
-
("Obsidian vault", "obsidian"),
|
|
415
|
+
("Obsidian vault (session-oriented)", "obsidian"),
|
|
416
|
+
("Obsidian vault (wiki)", "wiki"),
|
|
411
417
|
("None (disable memory)", "none"),
|
|
412
418
|
]
|
|
413
419
|
|
|
@@ -430,8 +436,12 @@ def _select_memory(step: int, total: int, version: str = '') -> tuple:
|
|
|
430
436
|
default_path = str(_mem_base / "agent-notes")
|
|
431
437
|
raw = _safe_input(f" Memory folder path [{default_path}]: ", default_path)
|
|
432
438
|
path = raw.strip() or default_path
|
|
439
|
+
elif backend == "wiki":
|
|
440
|
+
default_path = str(Path.home() / "Documents" / "Obsidian Vault" / "agent-wiki")
|
|
441
|
+
raw = _safe_input(f" Wiki folder path [{default_path}]: ", default_path)
|
|
442
|
+
path = raw.strip() or default_path
|
|
433
443
|
|
|
434
|
-
label = {"local": "Local markdown", "obsidian": f"Obsidian ({path})", "none": "Disabled"}[backend]
|
|
444
|
+
label = {"local": "Local markdown", "obsidian": f"Obsidian (session) ({path})", "wiki": f"Obsidian (wiki) ({path})", "none": "Disabled"}[backend]
|
|
435
445
|
print(f" {Color.GREEN}✓{Color.NC} Memory: {label}")
|
|
436
446
|
return backend, path
|
|
437
447
|
|
|
@@ -718,7 +728,11 @@ def _interactive_install() -> None:
|
|
|
718
728
|
try:
|
|
719
729
|
if memory_backend == "obsidian":
|
|
720
730
|
obsidian_init(_mem_path)
|
|
721
|
-
memory_label = f"Obsidian → {_mem_path}"
|
|
731
|
+
memory_label = f"Obsidian (session) → {_mem_path}"
|
|
732
|
+
elif memory_backend == "wiki":
|
|
733
|
+
from ..services.wiki_backend import wiki_init
|
|
734
|
+
wiki_init(_mem_path)
|
|
735
|
+
memory_label = f"Obsidian (wiki) → {_mem_path}"
|
|
722
736
|
else:
|
|
723
737
|
local_init(_mem_path)
|
|
724
738
|
memory_label = f"Local markdown → {_mem_path}"
|
|
@@ -46,6 +46,8 @@ def memory_dir_for_backend(backend: str, custom_path: str = "") -> Optional[Path
|
|
|
46
46
|
return Path(custom_path).expanduser()
|
|
47
47
|
if backend == "obsidian":
|
|
48
48
|
return Path.home() / "Documents" / "Obsidian Vault" / "agent-notes"
|
|
49
|
+
if backend == "wiki":
|
|
50
|
+
return Path.home() / "Documents" / "Obsidian Vault" / "agent-wiki"
|
|
49
51
|
return MEMORY_DIR # local default: ~/.claude/agent-memory
|
|
50
52
|
|
|
51
53
|
def get_version() -> str:
|
|
@@ -7,7 +7,7 @@ from typing import Optional
|
|
|
7
7
|
|
|
8
8
|
@dataclass
|
|
9
9
|
class MemoryConfig:
|
|
10
|
-
backend: str = "local" # "obsidian" | "local" | "none"
|
|
10
|
+
backend: str = "local" # "obsidian" | "local" | "wiki" | "none"
|
|
11
11
|
path: str = "" # vault root (obsidian) or memory dir (local). empty = use default
|
|
12
12
|
|
|
13
13
|
|
|
@@ -315,7 +315,7 @@ def obsidian_regenerate_index(vault: Path) -> None:
|
|
|
315
315
|
display_dt = f"{dt_str[:10]} {dt_str[11:16]}"
|
|
316
316
|
else:
|
|
317
317
|
display_dt = dt_str[:16] if len(dt_str) >= 16 else dt_str
|
|
318
|
-
project = meta.get("project", "")
|
|
318
|
+
project = meta.get("project", "") or _current_project_name()
|
|
319
319
|
lines.append(f"- [[{stem}|{display_dt}]] - {project}({meta['type']})")
|
|
320
320
|
|
|
321
321
|
(vault / "Index.md").write_text("\n".join(lines) + "\n")
|