obsidian-knowledge 3.30.2__tar.gz → 3.30.4__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.
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.claude-plugin/marketplace.json +1 -1
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.claude-plugin/plugin.json +1 -1
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.codex-plugin/plugin.json +1 -1
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/PKG-INFO +1 -1
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/CLI.md +5 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/MCP.md +3 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/transcript.py +4 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/cli.py +12 -2
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/indexer.py +3 -1
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/mcp_server.py +2 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/.codex-plugin/plugin.json +1 -1
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/transcript.py +4 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/pyproject.toml +1 -1
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp.py +8 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_search_json.py +35 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_transcript.py +14 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/uv.lock +1 -1
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.agents/plugins/marketplace.json +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.claude/agents.red-green-tdd.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.github/workflows/ci.yml +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.github/workflows/docs.yml +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.github/workflows/publish.yml +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.gitignore +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.secrets.baseline +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/AGENTS.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/CONVENTIONS.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/LICENSE +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/README.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/.pages +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/ARCHITECTURE.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/QUALITY.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/TODO.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/configuration.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/contributing-docs.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/hooks.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/index.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/superpowers/plans/2026-04-25-improve-harness-implementation.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/superpowers/plans/2026-05-12-changelog-reform.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/superpowers/specs/2026-04-25-improve-harness-design.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/superpowers/specs/2026-05-12-changelog-reform-design.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/__init__.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/audit.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/cli.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/conventions.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/frontmatter.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/index.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/io.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/links.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/models.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/questions.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/capture-session.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/codex-hooks.json +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/doctor.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/__init__.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/capture.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/patterns.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/recall_init_lib.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/reflect_counter.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/repo_memory.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/secret_alerts.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/secret_filters.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/shell_guard.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/stop_hook.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/vault_config.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/vault_policy.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/i-insist.toml +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/i_insist.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/nudge-index-sync.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/recall-init.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/reflect-nudge.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/scan-vault-secrets.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/vault_registry.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/__init__.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/__init__.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/config.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/embeddings.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/filters.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/guard_install.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/mcp_index.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/mcp_native.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/models.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/obsidian_cli.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/papercuts.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/primer.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/registration.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/vault_files.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/vault_listing.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/vector_search.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/mkdocs.yml +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/capture-session.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/doctor.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hooks.json +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/__init__.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/capture.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/patterns.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/recall_init_lib.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/reflect_counter.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/repo_memory.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/secret_alerts.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/secret_filters.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/shell_guard.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/stop_hook.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/vault_config.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/vault_policy.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/i-insist.toml +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/i_insist.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/nudge-index-sync.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/recall-init.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/reflect-nudge.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/scan-vault-secrets.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/vault_registry.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/obsidian-knowledge/SKILL.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/obsidian-knowledge/references/access-errors.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/SKILL.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/broken-links.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/index-format.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/multi-vault.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/note-types.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/rename-files.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/stacked-frontmatter.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/state-files.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/prek.toml +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/cli_smoke_test.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prek_hooks/check_architecture.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prek_hooks/check_exception_handling.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prek_hooks/check_file_length.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prek_hooks/check_private_test_imports.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prepare_release.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/smoke_tool_install.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/sync_codex_plugin.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/obsidian-knowledge/SKILL.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/obsidian-knowledge/references/access-errors.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/SKILL.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/broken-links.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/index-format.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/multi-vault.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/note-types.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/rename-files.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/stacked-frontmatter.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/state-files.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/__init__.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/conftest.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/.claude/obsidian-knowledge.yaml +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/Inbox/random.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/Journal/diary.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/wiki/python.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/wiki/rust.md +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/transcript_new_file_no_index.jsonl +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/transcript_new_file_with_index.jsonl +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_access_errors.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_architecture_check.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_capture_instructions.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_capture_session_hook.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_cli.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_cli_dispatch.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_cli_reliability.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_cli_smoke.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_config.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_doctor.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_embeddings.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_filters.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_first_install.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_garden_conventions.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_garden_index.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_garden_links.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_garden_reports.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_garden_safety.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_gardener_helpers.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_i_insist_rules.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_indexer.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_indexer_reliability.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_download.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_index.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_mutation_concurrency.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_native.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_workflows.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_nudge_index_sync.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_obsidian_cli.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_papercut_cli.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_papercuts.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_patterns.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_primer.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_protect_vault_destructive_ops.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_public_api.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_recall_init.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_recall_init_lib.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_recover_unresolved_links.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_reflect_counter.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_reflect_nudge.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_release.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_repo_memory.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_scan_vault_secrets.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_secret_scan_filters.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_session_debounce.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_boundaries.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_files.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_listing.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_patch.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_policy.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_registry.py +0 -0
- {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vector_latency.py +0 -0
|
@@ -164,6 +164,11 @@ SQLite data while indexing continues. If lock waiting exhausts the deadline,
|
|
|
164
164
|
the command reports a timeout and exits with code 124. Database contention that
|
|
165
165
|
persists after SQLite's own wait reports a busy error with code 2; it does not
|
|
166
166
|
appear as an empty result set.
|
|
167
|
+
Use `search --no-rebuild` to serve existing keyword results when vectors need
|
|
168
|
+
reindexing. MCP searches always use this option so an embedder change cannot
|
|
169
|
+
start a full rebuild inside the query deadline. Run `reindex` separately to
|
|
170
|
+
restore vector retrieval. JSON output reports `vector index requires reindex`
|
|
171
|
+
or `vector index unavailable` as the degraded reason.
|
|
167
172
|
`reindex` has no deadline unless you pass `--timeout-seconds`. Always pass it
|
|
168
173
|
for scheduled jobs. Zero or negative deadline values disable the deadline.
|
|
169
174
|
A hard watchdog allows five extra seconds to terminate stuck native calls.
|
|
@@ -34,6 +34,9 @@ sending a token across a network. Tunnel provisioning is separate from this serv
|
|
|
34
34
|
- `vault_search(query, top_k=None, all_paths=False)` returns a structured search
|
|
35
35
|
report with `mode`, `degraded_reason`, and scored `hits`. `top_k` must be
|
|
36
36
|
positive. `all_paths` bypasses the digest filter, retaining index exclusions.
|
|
37
|
+
Queries never rebuild vectors. If the embedder has changed or vector tables
|
|
38
|
+
are unavailable, search returns keyword hits with a degraded reason. Use
|
|
39
|
+
`vault_search_update` to refresh the index separately.
|
|
37
40
|
- `vault_read(path)` returns UTF-8 file content.
|
|
38
41
|
- `download_file(path)` delivers original bytes as an embedded MCP binary
|
|
39
42
|
resource, with filename, MIME type, byte count, and SHA-256 in structured
|
|
@@ -81,6 +81,10 @@ _INJECTED_PREFIXES = (
|
|
|
81
81
|
"<codex_internal_context",
|
|
82
82
|
"# AGENTS.md instructions for ",
|
|
83
83
|
"<environment_context>",
|
|
84
|
+
# Claude Code delivers teammate and background-task results as user turns.
|
|
85
|
+
"Another Claude session sent a message:",
|
|
86
|
+
"<teammate-message",
|
|
87
|
+
"<task-notification>",
|
|
84
88
|
)
|
|
85
89
|
|
|
86
90
|
|
|
@@ -508,10 +508,17 @@ def run_retrieval_command(args: argparse.Namespace) -> int:
|
|
|
508
508
|
print(f"# search ranking degraded ({idx.vector_status})", file=sys.stderr)
|
|
509
509
|
query = args.query if args.cmd == "search" else args.memory
|
|
510
510
|
if args.cmd == "search" and getattr(args, "json", False):
|
|
511
|
-
search_report = idx.search_report(
|
|
511
|
+
search_report = idx.search_report(
|
|
512
|
+
query, top_k=args.top_k, override_digest_filter=args.all, allow_rebuild=not args.no_rebuild
|
|
513
|
+
)
|
|
512
514
|
print(search_report.model_dump_json())
|
|
513
515
|
return 0
|
|
514
|
-
hits = idx.search(
|
|
516
|
+
hits = idx.search(
|
|
517
|
+
query,
|
|
518
|
+
top_k=args.top_k,
|
|
519
|
+
override_digest_filter=args.all,
|
|
520
|
+
allow_rebuild=not getattr(args, "no_rebuild", False),
|
|
521
|
+
)
|
|
515
522
|
if args.cmd == "remember":
|
|
516
523
|
print(format_remember_candidates(hits))
|
|
517
524
|
else:
|
|
@@ -586,6 +593,9 @@ def main() -> int:
|
|
|
586
593
|
p_search.add_argument("query", help="Free-text query")
|
|
587
594
|
p_search.add_argument("--vault", type=Path, default=None)
|
|
588
595
|
p_search.add_argument("--top-k", type=positive_int, default=None)
|
|
596
|
+
p_search.add_argument(
|
|
597
|
+
"--no-rebuild", action="store_true", help="Use keyword results when vector reindexing is required."
|
|
598
|
+
)
|
|
589
599
|
p_search.add_argument(
|
|
590
600
|
"--json", action="store_true", help="Print hits and retrieval mode as one JSON object"
|
|
591
601
|
)
|
|
@@ -601,7 +601,9 @@ class Indexer:
|
|
|
601
601
|
# Auto-rebuild when the embedder fingerprint changed since the last
|
|
602
602
|
# successful index. Chat prefetch calls can opt out so stale caches do
|
|
603
603
|
# not spend the turn-start budget rebuilding before the model responds.
|
|
604
|
-
if self._needs_rebuild and allow_rebuild:
|
|
604
|
+
if self._needs_rebuild and not allow_rebuild:
|
|
605
|
+
return keyword_report("vector index requires reindex")
|
|
606
|
+
if self._needs_rebuild:
|
|
605
607
|
self._auto_rebuild(reason="embedder changed")
|
|
606
608
|
|
|
607
609
|
if not self._vector_enabled:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "obsidian-knowledge",
|
|
3
|
-
"version": "3.30.
|
|
3
|
+
"version": "3.30.4+codex.20261003154117",
|
|
4
4
|
"description": "Plugin that manages an Obsidian knowledge vault: capture, organize, index, and garden.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Ricardo Decal"
|
|
@@ -81,6 +81,10 @@ _INJECTED_PREFIXES = (
|
|
|
81
81
|
"<codex_internal_context",
|
|
82
82
|
"# AGENTS.md instructions for ",
|
|
83
83
|
"<environment_context>",
|
|
84
|
+
# Claude Code delivers teammate and background-task results as user turns.
|
|
85
|
+
"Another Claude session sent a message:",
|
|
86
|
+
"<teammate-message",
|
|
87
|
+
"<task-notification>",
|
|
84
88
|
)
|
|
85
89
|
|
|
86
90
|
|
|
@@ -83,6 +83,14 @@ def test_search_real_cli(tmp_path, monkeypatch):
|
|
|
83
83
|
timeout=20,
|
|
84
84
|
)
|
|
85
85
|
|
|
86
|
+
spawn = asyncio.create_subprocess_exec
|
|
87
|
+
|
|
88
|
+
async def bounded_search(*command, **kwargs):
|
|
89
|
+
assert "--no-rebuild" in command
|
|
90
|
+
return await spawn(*command, **kwargs)
|
|
91
|
+
|
|
92
|
+
monkeypatch.setattr(asyncio, "create_subprocess_exec", bounded_search)
|
|
93
|
+
|
|
86
94
|
async def exercise():
|
|
87
95
|
server = create_server(tmp_path)
|
|
88
96
|
for arguments in [{"query": "greenhouse"}, {"query": "greenhouse", "top_k": 1, "all_paths": True}]:
|
|
@@ -42,6 +42,41 @@ def test_keyword_report_contains_hits_and_empty_results(keyword_index):
|
|
|
42
42
|
assert empty.hits == []
|
|
43
43
|
|
|
44
44
|
|
|
45
|
+
@pytest.mark.parametrize("json_output", [False, True])
|
|
46
|
+
def test_no_rebuild_search_serves_keywords_from_stale_vector_index(
|
|
47
|
+
keyword_index, monkeypatch, capsys, json_output
|
|
48
|
+
):
|
|
49
|
+
keyword_index._vector_enabled = True
|
|
50
|
+
keyword_index._needs_rebuild = True
|
|
51
|
+
|
|
52
|
+
def unexpected_rebuild(*args, **kwargs):
|
|
53
|
+
pytest.fail("bounded search must not rebuild the index")
|
|
54
|
+
|
|
55
|
+
monkeypatch.setattr(keyword_index, "_auto_rebuild", unexpected_rebuild)
|
|
56
|
+
monkeypatch.setattr(indexer, "Indexer", lambda **kwargs: keyword_index)
|
|
57
|
+
arguments = [
|
|
58
|
+
"obsidian-knowledge",
|
|
59
|
+
"search",
|
|
60
|
+
"greenhouse",
|
|
61
|
+
"--no-rebuild",
|
|
62
|
+
"--vault",
|
|
63
|
+
str(keyword_index.vault_root),
|
|
64
|
+
]
|
|
65
|
+
if json_output:
|
|
66
|
+
arguments.append("--json")
|
|
67
|
+
monkeypatch.setattr(sys, "argv", arguments)
|
|
68
|
+
assert cli.main() == 0
|
|
69
|
+
output = capsys.readouterr()
|
|
70
|
+
if json_output:
|
|
71
|
+
report = json.loads(output.out)
|
|
72
|
+
assert report["mode"] == "keyword"
|
|
73
|
+
assert report["degraded_reason"] == "vector index requires reindex"
|
|
74
|
+
assert report["hits"][0]["path"] == "wiki/orchid.md"
|
|
75
|
+
else:
|
|
76
|
+
assert "wiki/orchid.md" in output.out
|
|
77
|
+
assert keyword_index._needs_rebuild is True
|
|
78
|
+
|
|
79
|
+
|
|
45
80
|
@pytest.mark.parametrize(
|
|
46
81
|
("message", "reason"),
|
|
47
82
|
[
|
|
@@ -159,3 +159,17 @@ def test_codex_user_records_exclude_injected_context_and_duplicate_events(tmp_pa
|
|
|
159
159
|
records.extend([None, [], {"type": "response_item", "payload": None}])
|
|
160
160
|
path.write_text("\n".join(json.dumps(record) for record in records))
|
|
161
161
|
assert count_user_messages(str(path)) == 2
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def test_count_user_messages_excludes_agent_delivered_claude_messages(tmp_path):
|
|
165
|
+
path = tmp_path / "claude.jsonl"
|
|
166
|
+
messages = [
|
|
167
|
+
"Please help",
|
|
168
|
+
'Another Claude session sent a message:\n<teammate-message teammate_id="w">idle</teammate-message>',
|
|
169
|
+
"<task-notification>\n<task-id>b1</task-id>\n</task-notification>",
|
|
170
|
+
"Thanks, keep this decision",
|
|
171
|
+
]
|
|
172
|
+
path.write_text(
|
|
173
|
+
"\n".join(json.dumps({"type": "user", "message": {"content": text}}) for text in messages)
|
|
174
|
+
)
|
|
175
|
+
assert count_user_messages(str(path)) == 2
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/doctor.py
RENAMED
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hooks.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/i_insist.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prek_hooks/check_architecture.py
RENAMED
|
File without changes
|
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prek_hooks/check_file_length.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/broken-links.md
RENAMED
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/index-format.md
RENAMED
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/multi-vault.md
RENAMED
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/note-types.md
RENAMED
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/rename-files.md
RENAMED
|
File without changes
|
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/state-files.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/Inbox/random.md
RENAMED
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/Journal/diary.md
RENAMED
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/wiki/python.md
RENAMED
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/wiki/rust.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_mutation_concurrency.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_protect_vault_destructive_ops.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_recover_unresolved_links.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|