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.
Files changed (201) hide show
  1. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.claude-plugin/marketplace.json +1 -1
  2. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.claude-plugin/plugin.json +1 -1
  3. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.codex-plugin/plugin.json +1 -1
  4. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/PKG-INFO +1 -1
  5. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/CLI.md +5 -0
  6. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/MCP.md +3 -0
  7. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/transcript.py +4 -0
  8. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/cli.py +12 -2
  9. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/indexer.py +3 -1
  10. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/mcp_server.py +2 -0
  11. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/.codex-plugin/plugin.json +1 -1
  12. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/transcript.py +4 -0
  13. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/pyproject.toml +1 -1
  14. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp.py +8 -0
  15. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_search_json.py +35 -0
  16. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_transcript.py +14 -0
  17. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/uv.lock +1 -1
  18. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.agents/plugins/marketplace.json +0 -0
  19. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.claude/agents.red-green-tdd.md +0 -0
  20. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.github/workflows/ci.yml +0 -0
  21. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.github/workflows/docs.yml +0 -0
  22. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.github/workflows/publish.yml +0 -0
  23. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.gitignore +0 -0
  24. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/.secrets.baseline +0 -0
  25. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/AGENTS.md +0 -0
  26. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/CONVENTIONS.md +0 -0
  27. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/LICENSE +0 -0
  28. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/README.md +0 -0
  29. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/.pages +0 -0
  30. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/ARCHITECTURE.md +0 -0
  31. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/QUALITY.md +0 -0
  32. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/TODO.md +0 -0
  33. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/configuration.md +0 -0
  34. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/contributing-docs.md +0 -0
  35. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/hooks.md +0 -0
  36. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/index.md +0 -0
  37. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/superpowers/plans/2026-04-25-improve-harness-implementation.md +0 -0
  38. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/superpowers/plans/2026-05-12-changelog-reform.md +0 -0
  39. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/superpowers/specs/2026-04-25-improve-harness-design.md +0 -0
  40. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/docs/superpowers/specs/2026-05-12-changelog-reform-design.md +0 -0
  41. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/__init__.py +0 -0
  42. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/audit.py +0 -0
  43. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/cli.py +0 -0
  44. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/conventions.py +0 -0
  45. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/frontmatter.py +0 -0
  46. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/index.py +0 -0
  47. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/io.py +0 -0
  48. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/links.py +0 -0
  49. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/models.py +0 -0
  50. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/gardener/questions.py +0 -0
  51. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/capture-session.py +0 -0
  52. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/codex-hooks.json +0 -0
  53. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/doctor.py +0 -0
  54. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/__init__.py +0 -0
  55. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/capture.py +0 -0
  56. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/patterns.py +0 -0
  57. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/recall_init_lib.py +0 -0
  58. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/reflect_counter.py +0 -0
  59. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/repo_memory.py +0 -0
  60. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/secret_alerts.py +0 -0
  61. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/secret_filters.py +0 -0
  62. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/shell_guard.py +0 -0
  63. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/stop_hook.py +0 -0
  64. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/vault_config.py +0 -0
  65. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/hookslib/vault_policy.py +0 -0
  66. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/i-insist.toml +0 -0
  67. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/i_insist.py +0 -0
  68. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/nudge-index-sync.py +0 -0
  69. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/recall-init.py +0 -0
  70. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/reflect-nudge.py +0 -0
  71. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/scan-vault-secrets.py +0 -0
  72. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/hooks/vault_registry.py +0 -0
  73. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/__init__.py +0 -0
  74. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/__init__.py +0 -0
  75. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/config.py +0 -0
  76. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/embeddings.py +0 -0
  77. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/filters.py +0 -0
  78. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/guard_install.py +0 -0
  79. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/mcp_index.py +0 -0
  80. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/mcp_native.py +0 -0
  81. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/models.py +0 -0
  82. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/obsidian_cli.py +0 -0
  83. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/papercuts.py +0 -0
  84. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/primer.py +0 -0
  85. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/registration.py +0 -0
  86. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/vault_files.py +0 -0
  87. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/vault_listing.py +0 -0
  88. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/lib/vault_index/vector_search.py +0 -0
  89. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/mkdocs.yml +0 -0
  90. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/capture-session.py +0 -0
  91. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/doctor.py +0 -0
  92. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hooks.json +0 -0
  93. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/__init__.py +0 -0
  94. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/capture.py +0 -0
  95. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/patterns.py +0 -0
  96. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/recall_init_lib.py +0 -0
  97. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/reflect_counter.py +0 -0
  98. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/repo_memory.py +0 -0
  99. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/secret_alerts.py +0 -0
  100. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/secret_filters.py +0 -0
  101. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/shell_guard.py +0 -0
  102. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/stop_hook.py +0 -0
  103. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/vault_config.py +0 -0
  104. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/hookslib/vault_policy.py +0 -0
  105. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/i-insist.toml +0 -0
  106. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/i_insist.py +0 -0
  107. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/nudge-index-sync.py +0 -0
  108. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/recall-init.py +0 -0
  109. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/reflect-nudge.py +0 -0
  110. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/scan-vault-secrets.py +0 -0
  111. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/hooks/vault_registry.py +0 -0
  112. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/obsidian-knowledge/SKILL.md +0 -0
  113. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/obsidian-knowledge/references/access-errors.md +0 -0
  114. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/SKILL.md +0 -0
  115. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/broken-links.md +0 -0
  116. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/index-format.md +0 -0
  117. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/multi-vault.md +0 -0
  118. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/note-types.md +0 -0
  119. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/rename-files.md +0 -0
  120. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/stacked-frontmatter.md +0 -0
  121. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/plugins/obsidian-knowledge/skills/vault-organizer/lib/state-files.md +0 -0
  122. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/prek.toml +0 -0
  123. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/cli_smoke_test.py +0 -0
  124. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prek_hooks/check_architecture.py +0 -0
  125. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prek_hooks/check_exception_handling.py +0 -0
  126. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prek_hooks/check_file_length.py +0 -0
  127. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prek_hooks/check_private_test_imports.py +0 -0
  128. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/prepare_release.py +0 -0
  129. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/smoke_tool_install.py +0 -0
  130. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/scripts/sync_codex_plugin.py +0 -0
  131. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/obsidian-knowledge/SKILL.md +0 -0
  132. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/obsidian-knowledge/references/access-errors.md +0 -0
  133. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/SKILL.md +0 -0
  134. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/broken-links.md +0 -0
  135. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/index-format.md +0 -0
  136. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/multi-vault.md +0 -0
  137. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/note-types.md +0 -0
  138. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/rename-files.md +0 -0
  139. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/stacked-frontmatter.md +0 -0
  140. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/skills/vault-organizer/lib/state-files.md +0 -0
  141. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/__init__.py +0 -0
  142. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/conftest.py +0 -0
  143. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/.claude/obsidian-knowledge.yaml +0 -0
  144. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/Inbox/random.md +0 -0
  145. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/Journal/diary.md +0 -0
  146. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/wiki/python.md +0 -0
  147. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/sample_vault/wiki/rust.md +0 -0
  148. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/transcript_new_file_no_index.jsonl +0 -0
  149. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/fixtures/transcript_new_file_with_index.jsonl +0 -0
  150. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_access_errors.py +0 -0
  151. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_architecture_check.py +0 -0
  152. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_capture_instructions.py +0 -0
  153. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_capture_session_hook.py +0 -0
  154. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_cli.py +0 -0
  155. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_cli_dispatch.py +0 -0
  156. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_cli_reliability.py +0 -0
  157. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_cli_smoke.py +0 -0
  158. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_config.py +0 -0
  159. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_doctor.py +0 -0
  160. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_embeddings.py +0 -0
  161. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_filters.py +0 -0
  162. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_first_install.py +0 -0
  163. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_garden_conventions.py +0 -0
  164. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_garden_index.py +0 -0
  165. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_garden_links.py +0 -0
  166. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_garden_reports.py +0 -0
  167. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_garden_safety.py +0 -0
  168. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_gardener_helpers.py +0 -0
  169. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_i_insist_rules.py +0 -0
  170. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_indexer.py +0 -0
  171. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_indexer_reliability.py +0 -0
  172. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_download.py +0 -0
  173. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_index.py +0 -0
  174. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_mutation_concurrency.py +0 -0
  175. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_native.py +0 -0
  176. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_mcp_workflows.py +0 -0
  177. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_nudge_index_sync.py +0 -0
  178. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_obsidian_cli.py +0 -0
  179. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_papercut_cli.py +0 -0
  180. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_papercuts.py +0 -0
  181. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_patterns.py +0 -0
  182. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_primer.py +0 -0
  183. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_protect_vault_destructive_ops.py +0 -0
  184. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_public_api.py +0 -0
  185. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_recall_init.py +0 -0
  186. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_recall_init_lib.py +0 -0
  187. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_recover_unresolved_links.py +0 -0
  188. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_reflect_counter.py +0 -0
  189. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_reflect_nudge.py +0 -0
  190. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_release.py +0 -0
  191. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_repo_memory.py +0 -0
  192. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_scan_vault_secrets.py +0 -0
  193. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_secret_scan_filters.py +0 -0
  194. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_session_debounce.py +0 -0
  195. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_boundaries.py +0 -0
  196. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_files.py +0 -0
  197. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_listing.py +0 -0
  198. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_patch.py +0 -0
  199. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_policy.py +0 -0
  200. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vault_registry.py +0 -0
  201. {obsidian_knowledge-3.30.2 → obsidian_knowledge-3.30.4}/tests/test_vector_latency.py +0 -0
@@ -11,7 +11,7 @@
11
11
  "name": "obsidian-knowledge",
12
12
  "source": "./",
13
13
  "description": "Skills, hooks, and conventions for maintaining Obsidian knowledge base vaults",
14
- "version": "3.30.2"
14
+ "version": "3.30.4"
15
15
  }
16
16
  ]
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-knowledge",
3
- "version": "3.30.2",
3
+ "version": "3.30.4",
4
4
  "description": "Claude Code plugin that manages an Obsidian knowledge vault: capture, organize, index, and garden",
5
5
  "author": {
6
6
  "name": "Ricardo Decal"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-knowledge",
3
- "version": "3.30.2",
3
+ "version": "3.30.4",
4
4
  "description": "Plugin that manages an Obsidian knowledge vault: capture, organize, index, and garden.",
5
5
  "author": {
6
6
  "name": "Ricardo Decal"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: obsidian-knowledge
3
- Version: 3.30.2
3
+ Version: 3.30.4
4
4
  Summary: Obsidian vault knowledge integration for Claude Code and Codex
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -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(query, top_k=args.top_k, override_digest_filter=args.all)
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(query, top_k=args.top_k, override_digest_filter=args.all)
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:
@@ -114,6 +114,8 @@ def create_server(
114
114
  "--vault",
115
115
  str(vault),
116
116
  "--json",
117
+ # NOTE: docs/MCP.md's search contract keeps rebuilds outside query deadlines.
118
+ "--no-rebuild",
117
119
  ]
118
120
  if top_k is not None:
119
121
  command.extend(["--top-k", str(top_k)])
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-knowledge",
3
- "version": "3.30.2+codex.20261003154117",
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
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "obsidian-knowledge"
3
- version = "3.30.2"
3
+ version = "3.30.4"
4
4
  description = "Obsidian vault knowledge integration for Claude Code and Codex"
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
@@ -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
@@ -1744,7 +1744,7 @@ wheels = [
1744
1744
 
1745
1745
  [[package]]
1746
1746
  name = "obsidian-knowledge"
1747
- version = "3.30.2"
1747
+ version = "3.30.4"
1748
1748
  source = { editable = "." }
1749
1749
  dependencies = [
1750
1750
  { name = "aiosqlite" },