bathys 0.7.1__tar.gz → 0.7.2__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 (100) hide show
  1. {bathys-0.7.1 → bathys-0.7.2}/.github/workflows/ci.yml +10 -0
  2. {bathys-0.7.1 → bathys-0.7.2}/.remember/logs/memory-2026-09-08.log +22 -0
  3. bathys-0.7.2/.remember/tmp/no-transcript-notice +1 -0
  4. {bathys-0.7.1 → bathys-0.7.2}/.remember/tmp/session-slug +1 -0
  5. {bathys-0.7.1 → bathys-0.7.2}/CHANGELOG.md +13 -0
  6. {bathys-0.7.1 → bathys-0.7.2}/PKG-INFO +5 -3
  7. {bathys-0.7.1 → bathys-0.7.2}/README.md +4 -2
  8. {bathys-0.7.1 → bathys-0.7.2}/install.sh +8 -4
  9. {bathys-0.7.1 → bathys-0.7.2}/pyproject.toml +1 -1
  10. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/__init__.py +1 -1
  11. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/doctor.py +19 -5
  12. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/installer.py +110 -0
  13. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/server.py +5 -1
  14. bathys-0.7.1/.remember/tmp/capture-gap-skipped +0 -1
  15. bathys-0.7.1/.remember/tmp/no-transcript-notice +0 -1
  16. {bathys-0.7.1 → bathys-0.7.2}/.gitignore +0 -0
  17. {bathys-0.7.1 → bathys-0.7.2}/.remember/.gitignore +0 -0
  18. {bathys-0.7.1 → bathys-0.7.2}/.remember/logs/hook-errors.log +0 -0
  19. {bathys-0.7.1 → bathys-0.7.2}/.remember/logs/memory-2026-09-06.log +0 -0
  20. {bathys-0.7.1 → bathys-0.7.2}/.remember/logs/memory-2026-09-07.log +0 -0
  21. {bathys-0.7.1 → bathys-0.7.2}/.remember/tmp/case-divergence +0 -0
  22. {bathys-0.7.1 → bathys-0.7.2}/.remember/tmp/post-tool-ran +0 -0
  23. {bathys-0.7.1 → bathys-0.7.2}/Dockerfile +0 -0
  24. {bathys-0.7.1 → bathys-0.7.2}/LICENSE +0 -0
  25. {bathys-0.7.1 → bathys-0.7.2}/agents/HARNESS-DROPIN.md +0 -0
  26. {bathys-0.7.1 → bathys-0.7.2}/agents/bathys-researcher.md +0 -0
  27. {bathys-0.7.1 → bathys-0.7.2}/agents/skills/bathys-deep-dive/SKILL.md +0 -0
  28. {bathys-0.7.1 → bathys-0.7.2}/agents/skills/bathys-source-audit/SKILL.md +0 -0
  29. {bathys-0.7.1 → bathys-0.7.2}/docs/adr/0001-python-crawl4ai.md +0 -0
  30. {bathys-0.7.1 → bathys-0.7.2}/docs/adr/0002-pin-mcp-sdk-v1.md +0 -0
  31. {bathys-0.7.1 → bathys-0.7.2}/docs/adr/0003-self-managed-searxng.md +0 -0
  32. {bathys-0.7.1 → bathys-0.7.2}/docs/adr/0004-bm25-distillation.md +0 -0
  33. {bathys-0.7.1 → bathys-0.7.2}/docs/adr/0005-cache-raw-before-distill.md +0 -0
  34. {bathys-0.7.1 → bathys-0.7.2}/docs/adr/0006-three-tool-string-surface.md +0 -0
  35. {bathys-0.7.1 → bathys-0.7.2}/docs/architecture/data-flow.md +0 -0
  36. {bathys-0.7.1 → bathys-0.7.2}/docs/architecture/overview.md +0 -0
  37. {bathys-0.7.1 → bathys-0.7.2}/docs/architecture/pipeline.md +0 -0
  38. {bathys-0.7.1 → bathys-0.7.2}/docs/assets/banner.svg +0 -0
  39. {bathys-0.7.1 → bathys-0.7.2}/docs/contracts/config.md +0 -0
  40. {bathys-0.7.1 → bathys-0.7.2}/docs/contracts/mcp-tools.md +0 -0
  41. {bathys-0.7.1 → bathys-0.7.2}/docs/contracts/module-contracts.md +0 -0
  42. {bathys-0.7.1 → bathys-0.7.2}/docs/contracts/output-format.md +0 -0
  43. {bathys-0.7.1 → bathys-0.7.2}/docs/getting-started/cases.md +0 -0
  44. {bathys-0.7.1 → bathys-0.7.2}/docs/getting-started/configure.md +0 -0
  45. {bathys-0.7.1 → bathys-0.7.2}/docs/getting-started/install.md +0 -0
  46. {bathys-0.7.1 → bathys-0.7.2}/docs/getting-started/integrate.md +0 -0
  47. {bathys-0.7.1 → bathys-0.7.2}/docs/index.md +0 -0
  48. {bathys-0.7.1 → bathys-0.7.2}/docs/integrations/claude-code.md +0 -0
  49. {bathys-0.7.1 → bathys-0.7.2}/docs/integrations/cursor.md +0 -0
  50. {bathys-0.7.1 → bathys-0.7.2}/docs/integrations/generic-mcp.md +0 -0
  51. {bathys-0.7.1 → bathys-0.7.2}/docs/integrations/overview.md +0 -0
  52. {bathys-0.7.1 → bathys-0.7.2}/docs/integrations/zcode.md +0 -0
  53. {bathys-0.7.1 → bathys-0.7.2}/docs/meta/glossary.md +0 -0
  54. {bathys-0.7.1 → bathys-0.7.2}/docs/meta/style-guide.md +0 -0
  55. {bathys-0.7.1 → bathys-0.7.2}/docs/operations/metrics.md +0 -0
  56. {bathys-0.7.1 → bathys-0.7.2}/docs/operations/runbook.md +0 -0
  57. {bathys-0.7.1 → bathys-0.7.2}/docs/product/charter.md +0 -0
  58. {bathys-0.7.1 → bathys-0.7.2}/docs/product/competitive.md +0 -0
  59. {bathys-0.7.1 → bathys-0.7.2}/docs/product/features.md +0 -0
  60. {bathys-0.7.1 → bathys-0.7.2}/docs/product/mind-initiative.md +0 -0
  61. {bathys-0.7.1 → bathys-0.7.2}/docs/product/ocr-initiative.md +0 -0
  62. {bathys-0.7.1 → bathys-0.7.2}/docs/product/roadmap.md +0 -0
  63. {bathys-0.7.1 → bathys-0.7.2}/integrations/README.md +0 -0
  64. {bathys-0.7.1 → bathys-0.7.2}/integrations/hermes/README.md +0 -0
  65. {bathys-0.7.1 → bathys-0.7.2}/integrations/hermes/install.py +0 -0
  66. {bathys-0.7.1 → bathys-0.7.2}/integrations/pi/README.md +0 -0
  67. {bathys-0.7.1 → bathys-0.7.2}/integrations/pi/assets/bathys-rules.md +0 -0
  68. {bathys-0.7.1 → bathys-0.7.2}/integrations/zcode/README.md +0 -0
  69. {bathys-0.7.1 → bathys-0.7.2}/npm/bathys-mcp/.remember/.gitignore +0 -0
  70. {bathys-0.7.1 → bathys-0.7.2}/npm/bathys-mcp/.remember/logs/hook-errors.log +0 -0
  71. {bathys-0.7.1 → bathys-0.7.2}/npm/bathys-mcp/.remember/logs/memory-2026-09-08.log +0 -0
  72. {bathys-0.7.1 → bathys-0.7.2}/npm/bathys-mcp/.remember/tmp/no-transcript-notice +0 -0
  73. {bathys-0.7.1 → bathys-0.7.2}/npm/bathys-mcp/.remember/tmp/post-tool-ran +0 -0
  74. {bathys-0.7.1 → bathys-0.7.2}/npm/bathys-mcp/README.md +0 -0
  75. {bathys-0.7.1 → bathys-0.7.2}/npm/bathys-mcp/bin/cli.js +0 -0
  76. {bathys-0.7.1 → bathys-0.7.2}/npm/bathys-mcp/bin/postinstall.js +0 -0
  77. {bathys-0.7.1 → bathys-0.7.2}/npm/bathys-mcp/package.json +0 -0
  78. {bathys-0.7.1 → bathys-0.7.2}/scripts/acceptance_v02.py +0 -0
  79. {bathys-0.7.1 → bathys-0.7.2}/scripts/batch_check.py +0 -0
  80. {bathys-0.7.1 → bathys-0.7.2}/scripts/metrics_report.py +0 -0
  81. {bathys-0.7.1 → bathys-0.7.2}/scripts/smoke.py +0 -0
  82. {bathys-0.7.1 → bathys-0.7.2}/scripts/stdio_check.py +0 -0
  83. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/batch.py +0 -0
  84. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/cache.py +0 -0
  85. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/compose.yaml +0 -0
  86. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/config.py +0 -0
  87. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/core.py +0 -0
  88. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/crawler.py +0 -0
  89. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/distill.py +0 -0
  90. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/searx.py +0 -0
  91. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/searxng-settings.yml +0 -0
  92. {bathys-0.7.1 → bathys-0.7.2}/src/bathys/services.py +0 -0
  93. {bathys-0.7.1 → bathys-0.7.2}/tests/test_batch.py +0 -0
  94. {bathys-0.7.1 → bathys-0.7.2}/tests/test_cache.py +0 -0
  95. {bathys-0.7.1 → bathys-0.7.2}/tests/test_config.py +0 -0
  96. {bathys-0.7.1 → bathys-0.7.2}/tests/test_core.py +0 -0
  97. {bathys-0.7.1 → bathys-0.7.2}/tests/test_distill.py +0 -0
  98. {bathys-0.7.1 → bathys-0.7.2}/tests/test_installer.py +0 -0
  99. {bathys-0.7.1 → bathys-0.7.2}/tests/test_searx.py +0 -0
  100. {bathys-0.7.1 → bathys-0.7.2}/tests/test_v04.py +0 -0
@@ -24,6 +24,16 @@ jobs:
24
24
  - name: Unit tests
25
25
  run: python -m unittest discover -s tests -v
26
26
 
27
+ shellcheck:
28
+ # install.sh is the product's front door — it gets its own lint gate.
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+ - name: ShellCheck install.sh
33
+ run: |
34
+ sudo apt-get update -qq && sudo apt-get install -y -qq shellcheck
35
+ shellcheck -S warning install.sh
36
+
27
37
  package:
28
38
  # Packaging smoke: build the wheel, install it into a fresh venv together
29
39
  # with real deps is heavy (playwright et al.) — here we only verify the
@@ -213,3 +213,25 @@
213
213
  14:33:05 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
214
214
  14:33:20 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
215
215
  14:33:32 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
216
+ 14:33:44 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
217
+ 14:34:06 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
218
+ 16:21:12 [hook] session-start: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
219
+ 16:21:12 [hook] session-start: capture-gap check skipped — no session_id on stdin
220
+ 17:32:27 [hook] session-start: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
221
+ 17:34:24 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
222
+ 17:34:24 [hook] WARNING: no session dir for this project: /var/home/abyss/.distrobox/ubuntu/home/.claude/projects/-var-home-abyss-LABs-MCP-deepreserch (slug of /var/home/abyss/LABs/MCP/deepreserch). Memory cannot save until it matches a directory under /var/home/abyss/.distrobox/ubuntu/home/.claude/projects/
223
+ 17:34:41 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
224
+ 17:34:47 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
225
+ 17:35:00 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
226
+ 17:35:06 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
227
+ 17:35:16 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
228
+ 17:35:24 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
229
+ 17:35:30 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
230
+ 17:35:39 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
231
+ 17:35:48 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
232
+ 17:35:54 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
233
+ 17:36:01 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
234
+ 17:36:10 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
235
+ 17:36:10 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
236
+ 17:36:26 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
237
+ 17:36:41 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
@@ -0,0 +1 @@
1
+ 1788878064
@@ -4,3 +4,4 @@ project_dir=/var/home/abyss/LABs/MCP/deepreserch
4
4
  slug=-var-home-abyss-LABs-MCP-deepreserch
5
5
  sessions_dir=/var/home/abyss/.distrobox/ubuntu/home/.claude/projects/-var-home-abyss-LABs-MCP-deepreserch
6
6
  memory_dir=/var/home/abyss/LABs/MCP/deepreserch/.remember
7
+ session_id=sess_f9b00fe5-9050-4bf4-ba3e-4e68b02802b3
@@ -2,6 +2,19 @@
2
2
 
3
3
  Формат: Keep a Changelog; версии — semver. Дата — дата выпуска версии.
4
4
 
5
+ ## [0.7.2] — 2026-09-08
6
+
7
+ ### Добавлено
8
+
9
+ - **`bathys uninstall [HARNESS…] [--purge]`** — симметрия установки: снимает только записи `bathys` из конфигов (чужие серверы, бэкапы и субагенты не трогаются), перед записью создаёт бэкап; `--purge` дополнительно удаляет venv/кэш/данные. Живой цикл проверен: uninstall hermes → бэкап → reinstall.
10
+ - **`bathys-doctor --start-backend`** — бэкенд SearXNG поднимается перед проверкой (live: native-режим, 6/6 checks passed); прежнее поведение (честный FAIL на незапущенном бэкенде + подсказка) сохранено как дефолт.
11
+ - **`BATHYS_INSTALL_VERSION`** в install.sh — пин/откат на конкретную версию пакета одной env-переменной.
12
+ - CI: job `shellcheck` — install.sh линтится на каждом push (локально shellcheck отсутствует — CI будет первым прогоном).
13
+
14
+ ### Изменено
15
+
16
+ - Справка `bathys --help` дополнена uninstall; README Quick start — откат версии и снятие.
17
+
5
18
  ## [0.7.1] — 2026-09-08
6
19
 
7
20
  ### Добавлено
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: bathys
3
- Version: 0.7.1
3
+ Version: 0.7.2
4
4
  Summary: Unified local deep-research search service for AI agents — one pipeline (search → extraction → query distillation → cache), zero cloud quotas. MCP stdio server with native harness integration (bathys install).
5
5
  Project-URL: Homepage, https://github.com/Korrnals/bathys
6
6
  Project-URL: Repository, https://github.com/Korrnals/bathys
@@ -33,7 +33,7 @@ Description-Content-Type: text/markdown
33
33
  Сонар находит координаты, батискаф ныряет за полными текстами, дистиллятор поднимает на палубу только то, что отвечает на вопрос.
34
34
 
35
35
  ![python](https://img.shields.io/badge/python-3.10%2B-blue)
36
- ![version](https://img.shields.io/badge/version-0.7.1-9cf)
36
+ ![version](https://img.shields.io/badge/version-0.7.2-9cf)
37
37
  ![mcp](https://img.shields.io/badge/MCP-stdio%20server-6f42c1)
38
38
  ![license](https://img.shields.io/badge/license-MIT-green)
39
39
 
@@ -55,6 +55,8 @@ bathys setup # браузер → харнессы → субагент
55
55
  bathys doctor # самодиагностика стека
56
56
  ```
57
57
 
58
+ Откат на конкретную версию: `BATHYS_INSTALL_VERSION=0.7.0 bash install.sh`. Снятие Bathys с харнессов — `bathys uninstall` (точечно: `bathys uninstall hermes`; полный снос — `--purge`).
59
+
58
60
  SearXNG ставить руками не нужно: бэкенд поднимется сам при первом поиске (внешний инстанс → docker → нативный режим). Браузер нужен только для JS-страниц: обычные страницы Bathys читает собственным HTTP-движком, `BATHYS_BROWSER=off` отключает браузерный ярус полностью.
59
61
 
60
62
  <details>
@@ -188,7 +190,7 @@ docs/
188
190
 
189
191
  ## 📍 Статус
190
192
 
191
- **0.7.1.** Выпускная история: v0.2 «Качество выдачи» (ретраи, здоровье движков), v0.3 «Паритет с Tavily» (`read_urls`, JSON-режим), v0.4 «Эксплуатация» (robots-этика, метрики, `bathys-doctor`), v0.5 «Identity & Harness» (репозиционирование, промпты, субагент), v0.6 «Native Install» (`bathys install`) — итоги в [CHANGELOG.md](CHANGELOG.md).
193
+ **0.7.2.** Выпускная история: v0.2 «Качество выдачи» (ретраи, здоровье движков), v0.3 «Паритет с Tavily» (`read_urls`, JSON-режим), v0.4 «Эксплуатация» (robots-этика, метрики, `bathys-doctor`), v0.5 «Identity & Harness» (репозиционирование, промпты, субагент), v0.6 «Native Install» (`bathys install`) — итоги в [CHANGELOG.md](CHANGELOG.md).
192
194
 
193
195
  Репозиторий: `github.com/Korrnals/bathys`. До 1.0 остаются публикация пакета `bathys` на PyPI (имя свободно, публикация планируется к 1.0) и первый прогон Docker-образа; CI с matrix 3.10–3.12 уже в репозитории.
194
196
 
@@ -7,7 +7,7 @@
7
7
  Сонар находит координаты, батискаф ныряет за полными текстами, дистиллятор поднимает на палубу только то, что отвечает на вопрос.
8
8
 
9
9
  ![python](https://img.shields.io/badge/python-3.10%2B-blue)
10
- ![version](https://img.shields.io/badge/version-0.7.1-9cf)
10
+ ![version](https://img.shields.io/badge/version-0.7.2-9cf)
11
11
  ![mcp](https://img.shields.io/badge/MCP-stdio%20server-6f42c1)
12
12
  ![license](https://img.shields.io/badge/license-MIT-green)
13
13
 
@@ -29,6 +29,8 @@ bathys setup # браузер → харнессы → субагент
29
29
  bathys doctor # самодиагностика стека
30
30
  ```
31
31
 
32
+ Откат на конкретную версию: `BATHYS_INSTALL_VERSION=0.7.0 bash install.sh`. Снятие Bathys с харнессов — `bathys uninstall` (точечно: `bathys uninstall hermes`; полный снос — `--purge`).
33
+
32
34
  SearXNG ставить руками не нужно: бэкенд поднимется сам при первом поиске (внешний инстанс → docker → нативный режим). Браузер нужен только для JS-страниц: обычные страницы Bathys читает собственным HTTP-движком, `BATHYS_BROWSER=off` отключает браузерный ярус полностью.
33
35
 
34
36
  <details>
@@ -162,7 +164,7 @@ docs/
162
164
 
163
165
  ## 📍 Статус
164
166
 
165
- **0.7.1.** Выпускная история: v0.2 «Качество выдачи» (ретраи, здоровье движков), v0.3 «Паритет с Tavily» (`read_urls`, JSON-режим), v0.4 «Эксплуатация» (robots-этика, метрики, `bathys-doctor`), v0.5 «Identity & Harness» (репозиционирование, промпты, субагент), v0.6 «Native Install» (`bathys install`) — итоги в [CHANGELOG.md](CHANGELOG.md).
167
+ **0.7.2.** Выпускная история: v0.2 «Качество выдачи» (ретраи, здоровье движков), v0.3 «Паритет с Tavily» (`read_urls`, JSON-режим), v0.4 «Эксплуатация» (robots-этика, метрики, `bathys-doctor`), v0.5 «Identity & Harness» (репозиционирование, промпты, субагент), v0.6 «Native Install» (`bathys install`) — итоги в [CHANGELOG.md](CHANGELOG.md).
166
168
 
167
169
  Репозиторий: `github.com/Korrnals/bathys`. До 1.0 остаются публикация пакета `bathys` на PyPI (имя свободно, публикация планируется к 1.0) и первый прогон Docker-образа; CI с matrix 3.10–3.12 уже в репозитории.
168
170
 
@@ -29,6 +29,10 @@ die() { printf "%s\n" "${BOLD}[bathys]${RESET} ERROR: $*" >&2; exit 1; }
29
29
 
30
30
  VENV_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/bathys/venv"
31
31
 
32
+ # Pin a specific version when needed (rollback channel):
33
+ # BATHYS_INSTALL_VERSION=0.7.0 bash install.sh
34
+ BATHYS_VERSION_SPEC="${BATHYS_INSTALL_VERSION:-bathys}"
35
+
32
36
  # ------------------------------------------------------------------ python --
33
37
  find_python() {
34
38
  for cand in python3.12 python3.11 python3.10 python3 python; do
@@ -74,11 +78,11 @@ fi
74
78
 
75
79
  # ---------------------------------------------------------------- install --
76
80
  if [ "$UPGRADE" = yes ]; then
77
- "$VENV_DIR/bin/pip" install --quiet --upgrade bathys >/dev/null 2>&1 \
78
- || die "pip install --upgrade bathys не удался (сеть/PyPI?)"
81
+ "$VENV_DIR/bin/pip" install --quiet --upgrade "$BATHYS_VERSION_SPEC" >/dev/null 2>&1 \
82
+ || die "pip install --upgrade \"$BATHYS_VERSION_SPEC\" не удался (сеть/PyPI?)"
79
83
  else
80
- "$VENV_DIR/bin/pip" install --quiet bathys >/dev/null 2>&1 \
81
- || die "pip install bathys не удался (сеть/PyPI?)"
84
+ "$VENV_DIR/bin/pip" install --quiet "$BATHYS_VERSION_SPEC" >/dev/null 2>&1 \
85
+ || die "pip install \"$BATHYS_VERSION_SPEC\" не удался (сеть/PyPI?)"
82
86
  fi
83
87
  [ -x "$VENV_DIR/bin/bathys" ] || die "bathys не появился в venv — проверьте вывод pip вручную"
84
88
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bathys"
7
- version = "0.7.1"
7
+ version = "0.7.2"
8
8
  description = "Unified local deep-research search service for AI agents — one pipeline (search → extraction → query distillation → cache), zero cloud quotas. MCP stdio server with native harness integration (bathys install)."
9
9
  keywords = ["mcp", "deep-research", "search", "web-search", "ai-agents", "llm", "local-first", "distillation", "searxng", "crawl4ai"]
10
10
  classifiers = [
@@ -5,4 +5,4 @@ a query-focused distiller keeps only what answers the question. Built to spend
5
5
  the model's tokens on answers, not on boilerplate.
6
6
  """
7
7
 
8
- __version__ = "0.7.1"
8
+ __version__ = "0.7.2"
@@ -59,7 +59,7 @@ async def _backend_ping(cfg: Config) -> tuple[bool, str]:
59
59
  return False, f"{e.__class__.__name__}: {str(e)[:120]}"
60
60
 
61
61
 
62
- async def run_checks(full: bool) -> int:
62
+ async def run_checks(full: bool, start_backend: bool = False) -> int:
63
63
  cfg = Config.load()
64
64
  results: list[bool] = []
65
65
 
@@ -71,11 +71,23 @@ async def run_checks(full: bool) -> int:
71
71
 
72
72
  results.append(_ok("config loads", True, f"backend={cfg.searxng_url}"))
73
73
 
74
+ if start_backend and cfg.auto_start:
75
+ import httpx
76
+
77
+ from .services import ensure_running
78
+
79
+ print(" стартую бэкенд (—start-backend)…")
80
+ async with httpx.AsyncClient() as _http:
81
+ try:
82
+ mode = await ensure_running(cfg, _http)
83
+ print(f" бэкенд поднят (режим: {mode})")
84
+ except Exception as e: # noqa: BLE001 — diagnostics must not die
85
+ print(f" не удалось поднять бэкенд: {e.__class__.__name__}: {e}")
74
86
  ping_ok, detail = await _backend_ping(cfg)
75
87
  results.append(_ok("searxng backend", ping_ok, detail))
76
88
  if not ping_ok and cfg.auto_start:
77
- print(" hint: doctor does not auto-start the backend; run any tool "
78
- "call once, or start SearXNG yourself")
89
+ print(" hint: запустите с --start-backend, чтобы поднять бэкенд "
90
+ "перед проверкой, или сделайте любой вызов инструмента")
79
91
 
80
92
  marker = cfg.searxng_home / "repo" / ".bathys-ref"
81
93
  if cfg.searxng_home.joinpath("repo").is_dir():
@@ -130,9 +142,11 @@ def main() -> None:
130
142
  ap = argparse.ArgumentParser(prog="bathys-doctor",
131
143
  description="Bathys local stack diagnostics")
132
144
  ap.add_argument("--full", action="store_true",
133
- help="also launch headless chromium (slower)")
145
+ help="также запустить headless chromium (медленнее)")
146
+ ap.add_argument("--start-backend", action="store_true",
147
+ help="поднять бэкенд SearXNG перед проверкой (иначе пинг честно скажет, что сервер не запущен)")
134
148
  args = ap.parse_args()
135
- raise SystemExit(asyncio.run(run_checks(args.full)))
149
+ raise SystemExit(asyncio.run(run_checks(args.full, args.start_backend)))
136
150
 
137
151
 
138
152
  if __name__ == "__main__":
@@ -480,6 +480,116 @@ def setup(searxng_home: str | None = None, skip_browser: bool = False) -> int:
480
480
  return rc
481
481
 
482
482
 
483
+ def uninstall(purge: bool, targets: list[str] | None) -> int:
484
+ """`bathys uninstall` — симметрия установки: снять сервер Bathys с харнессов.
485
+
486
+ Удаляет ТОЛЬКО записи `bathys` из конфигов (чужие серверы не трогаются);
487
+ конфиг-файлы и бэкапы остаются. --purge дополнительно удаляет приватный
488
+ venv однострочника, кэш и данные (спрашивать подтверждение нечего: вызов
489
+ уже явно --purge). Точечно: bathys uninstall hermes zcode.
490
+ """
491
+ all_targets = _all_targets()
492
+ names = targets or list(all_targets)
493
+ removed, absent = [], []
494
+ for name in names:
495
+ if name not in all_targets:
496
+ print(f"[SKIP] {name}: неизвестный таргет (--list для карты)")
497
+ continue
498
+ path, dotpath, fmt = all_targets[name]
499
+ if fmt in ("goose", "hermes"):
500
+ if not path.is_file():
501
+ absent.append(name); continue
502
+ text = path.read_text(encoding="utf-8")
503
+ if not _yaml_current_ok(text, dotpath, "bathys", fmt, None) \
504
+ and f" bathys:" not in text:
505
+ absent.append(name); continue
506
+ new_text = _yaml_remove(text, dotpath, "bathys")
507
+ if new_text != text:
508
+ bkp = _backup(path)
509
+ path.write_text(new_text, encoding="utf-8")
510
+ print(f"[OK] {name}: bathys удалён из {path} (бэкап: {bkp.name})")
511
+ removed.append(name)
512
+ else:
513
+ absent.append(name)
514
+ continue
515
+ if not path.is_file():
516
+ absent.append(name); continue
517
+ try:
518
+ data = json.loads(path.read_text(encoding="utf-8"))
519
+ except (json.JSONDecodeError, OSError) as e:
520
+ print(f"[SKIP] {name}: {path} не читается ({e.__class__.__name__})")
521
+ continue
522
+ servers = _get_by_path(data, dotpath)
523
+ if not servers or "bathys" not in servers:
524
+ absent.append(name); continue
525
+ bkp = _backup(path)
526
+ servers.pop("bathys", None)
527
+ path.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n",
528
+ encoding="utf-8")
529
+ print(f"[OK] {name}: bathys удалён из {path} (бэкап: {bkp.name})")
530
+ removed.append(name)
531
+
532
+ for name in absent:
533
+ print(f"[=] {name}: записи bathys не найдено")
534
+ print(f"Снято с {len(removed)} харнессов; субагенты (если ставились) — "
535
+ "скопируйте сами: rm ~/.zcode/agents/bathys-researcher.md и т.п.")
536
+
537
+ if purge:
538
+ venv = Path.home() / ".local" / "share" / "bathys" / "venv"
539
+ cache = Path.home() / ".cache" / "bathys"
540
+ data = Path.home() / ".local" / "share" / "bathys"
541
+ import shutil as _sh
542
+ for label, d in (("venv", venv), ("кэш", cache), ("данные", data)):
543
+ if d.is_dir() and d != Path.home():
544
+ _sh.rmtree(d, ignore_errors=True)
545
+ print(f"[OK] purge: {label} удалён ({d})")
546
+ print("[i] purge: PATH-строку в ~/.profile или ~/.bashrc удалите вручную "
547
+ "(одна строка с bathys/venv/bin)")
548
+ else:
549
+ print("Кэш и данные НЕ тронуты; полный снос — `bathys uninstall --purge`.")
550
+ return 0
551
+
552
+
553
+ def _yaml_remove(text: str, root: str, name: str) -> str:
554
+ """Remove root.<name> entry from a flat-roots YAML document."""
555
+ lines = text.splitlines()
556
+ out: list[str] = []
557
+ in_root = False
558
+ skipping = False
559
+ for ln in lines:
560
+ m = _YAML_BLOCK_HDR.match(ln)
561
+ if m and m.group(1) == root:
562
+ in_root = True; skipping = False
563
+ out.append(ln); continue
564
+ if m and in_root:
565
+ in_root = False; skipping = False
566
+ out.append(ln); continue
567
+ if in_root and re.match(rf"^ {re.escape(name)}:\s*(#.*)?$", ln):
568
+ skipping = True
569
+ continue
570
+ if skipping:
571
+ if not ln.strip() or ln.startswith(" "):
572
+ continue
573
+ skipping = False
574
+ out.append(ln)
575
+ return "\n".join(out) + "\n"
576
+
577
+
578
+ def uninstall_main() -> None:
579
+ """`bathys uninstall …` — argparse wrapper for the uninstall subcommand."""
580
+ ap = argparse.ArgumentParser(
581
+ prog="bathys uninstall",
582
+ description="Снять Bathys с харнессов: удаляются только записи `bathys`; "
583
+ "чужие серверы и бэкапы не трогаются. --purge — дополнительно "
584
+ "venv/кэш/данные.")
585
+ ap.add_argument("targets", nargs="*", metavar="HARNESS",
586
+ help="точечно: имена харнессов (bathys uninstall hermes zcode)")
587
+ ap.add_argument("--purge", action="store_true",
588
+ help="также удалить venv/кэш/данные bathys")
589
+ args = ap.parse_args()
590
+ raise SystemExit(uninstall(args.purge, args.targets or None))
591
+
592
+
483
593
  def main() -> None:
484
594
  ap = argparse.ArgumentParser(
485
595
  prog="bathys install",
@@ -372,7 +372,7 @@ def _hush_stdout_logs() -> None:
372
372
 
373
373
  def main() -> None:
374
374
  argv = sys.argv[1:]
375
- if argv and argv[0] in ("install", "doctor", "setup"):
375
+ if argv and argv[0] in ("install", "uninstall", "doctor", "setup"):
376
376
  # Console-style subcommands: one entry point covers the MCP server
377
377
  # and the setup tooling, so `pip install bathys` is all a user needs.
378
378
  from . import doctor, installer
@@ -380,6 +380,9 @@ def main() -> None:
380
380
  if argv[0] == "install":
381
381
  sys.argv = ["bathys install", *argv[1:]]
382
382
  raise SystemExit(installer.main())
383
+ if argv[0] == "uninstall":
384
+ sys.argv = ["bathys uninstall", *argv[1:]]
385
+ raise SystemExit(installer.uninstall_main())
383
386
  if argv[0] == "setup":
384
387
  sys.argv = ["bathys setup", *argv[1:]]
385
388
  raise SystemExit(installer.setup())
@@ -394,6 +397,7 @@ def main() -> None:
394
397
  " харнессы → субагент → самодиагностика\n"
395
398
  " bathys install [HARNESS…] автоподключение всех харнессов или точечное\n"
396
399
  " (bathys install hermes; --list, --print-config)\n"
400
+ " bathys uninstall [HARNESS…] снять Bathys с харнессов (--purge: снос)\n"
397
401
  " bathys doctor [--full] диагностика стека\n")
398
402
  return
399
403
  _hush_stdout_logs()
@@ -1 +0,0 @@
1
- the SessionStart payload carried no usable session_id
@@ -1 +0,0 @@
1
- 1788864877
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