bathys 0.7.0__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.0 → bathys-0.7.2}/.github/workflows/ci.yml +10 -0
  2. {bathys-0.7.0 → bathys-0.7.2}/.remember/logs/memory-2026-09-08.log +40 -0
  3. bathys-0.7.2/.remember/tmp/no-transcript-notice +1 -0
  4. {bathys-0.7.0 → bathys-0.7.2}/.remember/tmp/session-slug +1 -0
  5. {bathys-0.7.0 → bathys-0.7.2}/CHANGELOG.md +20 -0
  6. {bathys-0.7.0 → bathys-0.7.2}/PKG-INFO +16 -6
  7. {bathys-0.7.0 → bathys-0.7.2}/README.md +15 -5
  8. bathys-0.7.2/install.sh +109 -0
  9. {bathys-0.7.0 → bathys-0.7.2}/pyproject.toml +1 -1
  10. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/__init__.py +1 -1
  11. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/doctor.py +19 -5
  12. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/installer.py +110 -0
  13. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/server.py +5 -1
  14. bathys-0.7.0/.remember/tmp/capture-gap-skipped +0 -1
  15. bathys-0.7.0/.remember/tmp/no-transcript-notice +0 -1
  16. {bathys-0.7.0 → bathys-0.7.2}/.gitignore +0 -0
  17. {bathys-0.7.0 → bathys-0.7.2}/.remember/.gitignore +0 -0
  18. {bathys-0.7.0 → bathys-0.7.2}/.remember/logs/hook-errors.log +0 -0
  19. {bathys-0.7.0 → bathys-0.7.2}/.remember/logs/memory-2026-09-06.log +0 -0
  20. {bathys-0.7.0 → bathys-0.7.2}/.remember/logs/memory-2026-09-07.log +0 -0
  21. {bathys-0.7.0 → bathys-0.7.2}/.remember/tmp/case-divergence +0 -0
  22. {bathys-0.7.0 → bathys-0.7.2}/.remember/tmp/post-tool-ran +0 -0
  23. {bathys-0.7.0 → bathys-0.7.2}/Dockerfile +0 -0
  24. {bathys-0.7.0 → bathys-0.7.2}/LICENSE +0 -0
  25. {bathys-0.7.0 → bathys-0.7.2}/agents/HARNESS-DROPIN.md +0 -0
  26. {bathys-0.7.0 → bathys-0.7.2}/agents/bathys-researcher.md +0 -0
  27. {bathys-0.7.0 → bathys-0.7.2}/agents/skills/bathys-deep-dive/SKILL.md +0 -0
  28. {bathys-0.7.0 → bathys-0.7.2}/agents/skills/bathys-source-audit/SKILL.md +0 -0
  29. {bathys-0.7.0 → bathys-0.7.2}/docs/adr/0001-python-crawl4ai.md +0 -0
  30. {bathys-0.7.0 → bathys-0.7.2}/docs/adr/0002-pin-mcp-sdk-v1.md +0 -0
  31. {bathys-0.7.0 → bathys-0.7.2}/docs/adr/0003-self-managed-searxng.md +0 -0
  32. {bathys-0.7.0 → bathys-0.7.2}/docs/adr/0004-bm25-distillation.md +0 -0
  33. {bathys-0.7.0 → bathys-0.7.2}/docs/adr/0005-cache-raw-before-distill.md +0 -0
  34. {bathys-0.7.0 → bathys-0.7.2}/docs/adr/0006-three-tool-string-surface.md +0 -0
  35. {bathys-0.7.0 → bathys-0.7.2}/docs/architecture/data-flow.md +0 -0
  36. {bathys-0.7.0 → bathys-0.7.2}/docs/architecture/overview.md +0 -0
  37. {bathys-0.7.0 → bathys-0.7.2}/docs/architecture/pipeline.md +0 -0
  38. {bathys-0.7.0 → bathys-0.7.2}/docs/assets/banner.svg +0 -0
  39. {bathys-0.7.0 → bathys-0.7.2}/docs/contracts/config.md +0 -0
  40. {bathys-0.7.0 → bathys-0.7.2}/docs/contracts/mcp-tools.md +0 -0
  41. {bathys-0.7.0 → bathys-0.7.2}/docs/contracts/module-contracts.md +0 -0
  42. {bathys-0.7.0 → bathys-0.7.2}/docs/contracts/output-format.md +0 -0
  43. {bathys-0.7.0 → bathys-0.7.2}/docs/getting-started/cases.md +0 -0
  44. {bathys-0.7.0 → bathys-0.7.2}/docs/getting-started/configure.md +0 -0
  45. {bathys-0.7.0 → bathys-0.7.2}/docs/getting-started/install.md +0 -0
  46. {bathys-0.7.0 → bathys-0.7.2}/docs/getting-started/integrate.md +0 -0
  47. {bathys-0.7.0 → bathys-0.7.2}/docs/index.md +0 -0
  48. {bathys-0.7.0 → bathys-0.7.2}/docs/integrations/claude-code.md +0 -0
  49. {bathys-0.7.0 → bathys-0.7.2}/docs/integrations/cursor.md +0 -0
  50. {bathys-0.7.0 → bathys-0.7.2}/docs/integrations/generic-mcp.md +0 -0
  51. {bathys-0.7.0 → bathys-0.7.2}/docs/integrations/overview.md +0 -0
  52. {bathys-0.7.0 → bathys-0.7.2}/docs/integrations/zcode.md +0 -0
  53. {bathys-0.7.0 → bathys-0.7.2}/docs/meta/glossary.md +0 -0
  54. {bathys-0.7.0 → bathys-0.7.2}/docs/meta/style-guide.md +0 -0
  55. {bathys-0.7.0 → bathys-0.7.2}/docs/operations/metrics.md +0 -0
  56. {bathys-0.7.0 → bathys-0.7.2}/docs/operations/runbook.md +0 -0
  57. {bathys-0.7.0 → bathys-0.7.2}/docs/product/charter.md +0 -0
  58. {bathys-0.7.0 → bathys-0.7.2}/docs/product/competitive.md +0 -0
  59. {bathys-0.7.0 → bathys-0.7.2}/docs/product/features.md +0 -0
  60. {bathys-0.7.0 → bathys-0.7.2}/docs/product/mind-initiative.md +0 -0
  61. {bathys-0.7.0 → bathys-0.7.2}/docs/product/ocr-initiative.md +0 -0
  62. {bathys-0.7.0 → bathys-0.7.2}/docs/product/roadmap.md +0 -0
  63. {bathys-0.7.0 → bathys-0.7.2}/integrations/README.md +0 -0
  64. {bathys-0.7.0 → bathys-0.7.2}/integrations/hermes/README.md +0 -0
  65. {bathys-0.7.0 → bathys-0.7.2}/integrations/hermes/install.py +0 -0
  66. {bathys-0.7.0 → bathys-0.7.2}/integrations/pi/README.md +0 -0
  67. {bathys-0.7.0 → bathys-0.7.2}/integrations/pi/assets/bathys-rules.md +0 -0
  68. {bathys-0.7.0 → bathys-0.7.2}/integrations/zcode/README.md +0 -0
  69. {bathys-0.7.0 → bathys-0.7.2}/npm/bathys-mcp/.remember/.gitignore +0 -0
  70. {bathys-0.7.0 → bathys-0.7.2}/npm/bathys-mcp/.remember/logs/hook-errors.log +0 -0
  71. {bathys-0.7.0 → bathys-0.7.2}/npm/bathys-mcp/.remember/logs/memory-2026-09-08.log +0 -0
  72. {bathys-0.7.0 → bathys-0.7.2}/npm/bathys-mcp/.remember/tmp/no-transcript-notice +0 -0
  73. {bathys-0.7.0 → bathys-0.7.2}/npm/bathys-mcp/.remember/tmp/post-tool-ran +0 -0
  74. {bathys-0.7.0 → bathys-0.7.2}/npm/bathys-mcp/README.md +0 -0
  75. {bathys-0.7.0 → bathys-0.7.2}/npm/bathys-mcp/bin/cli.js +0 -0
  76. {bathys-0.7.0 → bathys-0.7.2}/npm/bathys-mcp/bin/postinstall.js +0 -0
  77. {bathys-0.7.0 → bathys-0.7.2}/npm/bathys-mcp/package.json +0 -0
  78. {bathys-0.7.0 → bathys-0.7.2}/scripts/acceptance_v02.py +0 -0
  79. {bathys-0.7.0 → bathys-0.7.2}/scripts/batch_check.py +0 -0
  80. {bathys-0.7.0 → bathys-0.7.2}/scripts/metrics_report.py +0 -0
  81. {bathys-0.7.0 → bathys-0.7.2}/scripts/smoke.py +0 -0
  82. {bathys-0.7.0 → bathys-0.7.2}/scripts/stdio_check.py +0 -0
  83. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/batch.py +0 -0
  84. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/cache.py +0 -0
  85. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/compose.yaml +0 -0
  86. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/config.py +0 -0
  87. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/core.py +0 -0
  88. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/crawler.py +0 -0
  89. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/distill.py +0 -0
  90. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/searx.py +0 -0
  91. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/searxng-settings.yml +0 -0
  92. {bathys-0.7.0 → bathys-0.7.2}/src/bathys/services.py +0 -0
  93. {bathys-0.7.0 → bathys-0.7.2}/tests/test_batch.py +0 -0
  94. {bathys-0.7.0 → bathys-0.7.2}/tests/test_cache.py +0 -0
  95. {bathys-0.7.0 → bathys-0.7.2}/tests/test_config.py +0 -0
  96. {bathys-0.7.0 → bathys-0.7.2}/tests/test_core.py +0 -0
  97. {bathys-0.7.0 → bathys-0.7.2}/tests/test_distill.py +0 -0
  98. {bathys-0.7.0 → bathys-0.7.2}/tests/test_installer.py +0 -0
  99. {bathys-0.7.0 → bathys-0.7.2}/tests/test_searx.py +0 -0
  100. {bathys-0.7.0 → 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
@@ -195,3 +195,43 @@
195
195
  13:57:42 [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
196
196
  13:57:52 [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
197
197
  13:58:04 [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
198
+ 13:58: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
199
+ 13:58:27 [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
200
+ 13:58: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
201
+ 13:58: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
202
+ 14:16: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
203
+ 14:16:53 [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
204
+ 14:17:02 [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
205
+ 14:31:07 [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
206
+ 14:31:19 [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
207
+ 14:31: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
208
+ 14:32: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
209
+ 14:32:27 [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
210
+ 14:32: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
211
+ 14:32:45 [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
212
+ 14:33:04 [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
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
+ 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
+ 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,26 @@
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
+
18
+ ## [0.7.1] — 2026-09-08
19
+
20
+ ### Добавлено
21
+
22
+ - **Однострочный установщик `install.sh`** — основной путь установки: `curl -fsSL https://raw.githubusercontent.com/Korrnals/bathys/main/install.sh | bash`. Приватный venv в `~/.local/share/bathys/venv` (решение против хрупкости `pip --user` между контейнерами и PEP 668), бутстрап pip через `get-pip.py` для минимальных образов, PATH прописывается в `.profile`/`.bashrc`, затем `bathys setup` и финальный `bathys-doctor`. Идемпотентен (повтор = обновление), без sudo, ничего вне `$HOME`. Живые прогоны: двойной (создание + идемпотентное обновление), setup прописал zcode+hermes с бэкапами, doctor 5/6 (бэкенд поднимается при первом вызове — норма).
23
+ - README: однострочник — основной путь Quick start; `pip install` + `bathys setup` — равноправная альтернатива «без скрипта»; npm/исходники — под катом.
24
+
5
25
  ## [0.7.0] — 2026-09-08
6
26
 
7
27
  Тема: «Ship & Setup» — двухъярусное извлечение без обязательного браузера и модульная установка.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: bathys
3
- Version: 0.7.0
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,21 +33,31 @@ 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.0-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
 
40
40
  ## ⚡ Quick start
41
41
 
42
- Три команды от чистой системы до работающего поиска (Python ≥ 3.10):
42
+ **Одной командой** (Python ≥ 3.10; приватный venv, без sudo, идемпотентно):
43
+
44
+ ```bash
45
+ curl -fsSL https://raw.githubusercontent.com/Korrnals/bathys/main/install.sh | bash
46
+ ```
47
+
48
+ Скрипт ставит пакет с PyPI в `~/.local/share/bathys/venv`, прописывает PATH, запускает `bathys setup` (браузер для JS-страниц → все найденные харнессы → субагент) и финальный `bathys-doctor`. Повторный запуск — безопасное обновление.
49
+
50
+ **Без скрипта** (то же самое вручную, для тех кто предпочитает pip):
43
51
 
44
52
  ```bash
45
53
  pip install bathys # пакет: сервер + bathys setup/install/doctor
46
- bathys setup # браузер для JS-страниц → все найденные харнессы → субагент
54
+ bathys setup # браузер → харнессы → субагент
47
55
  bathys doctor # самодиагностика стека
48
56
  ```
49
57
 
50
- `setup` идемпотентен — повторный запуск ничего не ломает. SearXNG ставить руками не нужно: бэкенд поднимется сам при первом поиске (внешний инстанс → docker → нативный режим). Браузер нужен только для JS-страниц: обычные страницы Bathys читает собственным HTTP-движком, `BATHYS_BROWSER=off` отключает браузерный ярус полностью.
58
+ Откат на конкретную версию: `BATHYS_INSTALL_VERSION=0.7.0 bash install.sh`. Снятие Bathys с харнессов — `bathys uninstall` (точечно: `bathys uninstall hermes`; полный снос — `--purge`).
59
+
60
+ SearXNG ставить руками не нужно: бэкенд поднимется сам при первом поиске (внешний инстанс → docker → нативный режим). Браузер нужен только для JS-страниц: обычные страницы Bathys читает собственным HTTP-движком, `BATHYS_BROWSER=off` отключает браузерный ярус полностью.
51
61
 
52
62
  <details>
53
63
  <summary><b>Альтернативные пути установки</b> (npm, исходники, минимальные образы)</summary>
@@ -180,7 +190,7 @@ docs/
180
190
 
181
191
  ## 📍 Статус
182
192
 
183
- **0.7.0.** Выпускная история: 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).
184
194
 
185
195
  Репозиторий: `github.com/Korrnals/bathys`. До 1.0 остаются публикация пакета `bathys` на PyPI (имя свободно, публикация планируется к 1.0) и первый прогон Docker-образа; CI с matrix 3.10–3.12 уже в репозитории.
186
196
 
@@ -7,21 +7,31 @@
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.0-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
 
14
14
  ## ⚡ Quick start
15
15
 
16
- Три команды от чистой системы до работающего поиска (Python ≥ 3.10):
16
+ **Одной командой** (Python ≥ 3.10; приватный venv, без sudo, идемпотентно):
17
+
18
+ ```bash
19
+ curl -fsSL https://raw.githubusercontent.com/Korrnals/bathys/main/install.sh | bash
20
+ ```
21
+
22
+ Скрипт ставит пакет с PyPI в `~/.local/share/bathys/venv`, прописывает PATH, запускает `bathys setup` (браузер для JS-страниц → все найденные харнессы → субагент) и финальный `bathys-doctor`. Повторный запуск — безопасное обновление.
23
+
24
+ **Без скрипта** (то же самое вручную, для тех кто предпочитает pip):
17
25
 
18
26
  ```bash
19
27
  pip install bathys # пакет: сервер + bathys setup/install/doctor
20
- bathys setup # браузер для JS-страниц → все найденные харнессы → субагент
28
+ bathys setup # браузер → харнессы → субагент
21
29
  bathys doctor # самодиагностика стека
22
30
  ```
23
31
 
24
- `setup` идемпотентен — повторный запуск ничего не ломает. SearXNG ставить руками не нужно: бэкенд поднимется сам при первом поиске (внешний инстанс → docker → нативный режим). Браузер нужен только для JS-страниц: обычные страницы Bathys читает собственным HTTP-движком, `BATHYS_BROWSER=off` отключает браузерный ярус полностью.
32
+ Откат на конкретную версию: `BATHYS_INSTALL_VERSION=0.7.0 bash install.sh`. Снятие Bathys с харнессов — `bathys uninstall` (точечно: `bathys uninstall hermes`; полный снос — `--purge`).
33
+
34
+ SearXNG ставить руками не нужно: бэкенд поднимется сам при первом поиске (внешний инстанс → docker → нативный режим). Браузер нужен только для JS-страниц: обычные страницы Bathys читает собственным HTTP-движком, `BATHYS_BROWSER=off` отключает браузерный ярус полностью.
25
35
 
26
36
  <details>
27
37
  <summary><b>Альтернативные пути установки</b> (npm, исходники, минимальные образы)</summary>
@@ -154,7 +164,7 @@ docs/
154
164
 
155
165
  ## 📍 Статус
156
166
 
157
- **0.7.0.** Выпускная история: 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).
158
168
 
159
169
  Репозиторий: `github.com/Korrnals/bathys`. До 1.0 остаются публикация пакета `bathys` на PyPI (имя свободно, публикация планируется к 1.0) и первый прогон Docker-образа; CI с matrix 3.10–3.12 уже в репозитории.
160
170
 
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env bash
2
+ # Bathys — one-line installer.
3
+ #
4
+ # curl -fsSL https://raw.githubusercontent.com/Korrnals/bathys/main/install.sh | bash
5
+ #
6
+ # What it does (idempotent, safe to re-run):
7
+ # 1. finds Python >= 3.10 (python3/python/3.12/3.11/3.10);
8
+ # 2. installs the `bathys` package from PyPI into a PRIVATE venv at
9
+ # ~/.local/share/bathys/venv (deterministic, no PEP-668 surprises,
10
+ # no sudo, nothing outside $HOME; --user is deliberately not used —
11
+ # it is fragile across containers/managed environments);
12
+ # 3. wires the venv bin into PATH permanently (.profile/.bashrc);
13
+ # 4. runs `bathys setup`: browser engine for JS pages -> harness
14
+ # auto-integration (zcode, Claude, Cursor, VS Code family, Gemini CLI,
15
+ # Windsurf, Zed, opencode, goose, Hermes) -> researcher subagent;
16
+ # 5. runs `bathys-doctor` for a final health check.
17
+ #
18
+ # Exit code is the doctor's. Manual alternative (the same result, no script):
19
+ # pip install bathys && bathys setup
20
+
21
+ set -euo pipefail
22
+
23
+ BOLD="$(tput bold 2>/dev/null || echo '')"
24
+ DIM="$(tput dim 2>/dev/null || echo '')"
25
+ RESET="$(tput sgr0 2>/dev/null || echo '')"
26
+ say() { printf "%s\n" "${BOLD}[bathys]${RESET} $*"; }
27
+ note() { printf "%s\n" "${DIM}[bathys]${RESET} $*"; }
28
+ die() { printf "%s\n" "${BOLD}[bathys]${RESET} ERROR: $*" >&2; exit 1; }
29
+
30
+ VENV_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/bathys/venv"
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
+
36
+ # ------------------------------------------------------------------ python --
37
+ find_python() {
38
+ for cand in python3.12 python3.11 python3.10 python3 python; do
39
+ if command -v "$cand" >/dev/null 2>&1; then
40
+ if "$cand" - <<'PY' >/dev/null 2>&1
41
+ import sys
42
+ raise SystemExit(0 if (3, 10) <= sys.version_info[:2] <= (3, 14) else 1)
43
+ PY
44
+ then
45
+ echo "$cand"
46
+ return 0
47
+ fi
48
+ fi
49
+ done
50
+ return 1
51
+ }
52
+
53
+ PY="$(find_python)" || die "Python 3.10–3.14 не найден. Установите его и повторите — либо вручную: pip install bathys && bathys setup"
54
+ note "python: $($PY --version 2>&1)"
55
+
56
+ # ------------------------------------------------------------------- venv --
57
+ if [ -x "$VENV_DIR/bin/bathys" ] && "$VENV_DIR/bin/bathys" --help >/dev/null 2>&1; then
58
+ note "venv уже живой: $VENV_DIR (обновляю пакет)"
59
+ UPGRADE=yes
60
+ else
61
+ note "создаю приватный venv: $VENV_DIR"
62
+ rm -rf "$VENV_DIR"
63
+ "$PY" -m venv "$VENV_DIR" 2>/dev/null \
64
+ || "$PY" -m venv --without-pip "$VENV_DIR" \
65
+ || die "не удалось создать venv в $VENV_DIR"
66
+ UPGRADE=no
67
+ fi
68
+
69
+ # bootstrap pip when the venv lacks it (minimal images without ensurepip)
70
+ if [ ! -x "$VENV_DIR/bin/pip" ]; then
71
+ note "pip отсутствует в venv — бутстрап через get-pip.py…"
72
+ TMP_GP="$(mktemp)"; trap 'rm -f "$TMP_GP"' EXIT
73
+ curl -fsSL https://bootstrap.pypa.io/get-pip.py -o "$TMP_GP" \
74
+ || die "не удалось скачать get-pip.py (сеть?)"
75
+ "$VENV_DIR/bin/python" "$TMP_GP" -q >/dev/null 2>&1 \
76
+ || die "get-pip.py не смог подняться в venv"
77
+ fi
78
+
79
+ # ---------------------------------------------------------------- install --
80
+ if [ "$UPGRADE" = yes ]; then
81
+ "$VENV_DIR/bin/pip" install --quiet --upgrade "$BATHYS_VERSION_SPEC" >/dev/null 2>&1 \
82
+ || die "pip install --upgrade \"$BATHYS_VERSION_SPEC\" не удался (сеть/PyPI?)"
83
+ else
84
+ "$VENV_DIR/bin/pip" install --quiet "$BATHYS_VERSION_SPEC" >/dev/null 2>&1 \
85
+ || die "pip install \"$BATHYS_VERSION_SPEC\" не удался (сеть/PyPI?)"
86
+ fi
87
+ [ -x "$VENV_DIR/bin/bathys" ] || die "bathys не появился в venv — проверьте вывод pip вручную"
88
+
89
+ # ------------------------------------------------------------------- PATH --
90
+ PATH_LINE='export PATH="$HOME/.local/share/bathys/venv/bin:$PATH"'
91
+ if ! case ":$PATH:" in *":$VENV_DIR/bin:"*) false;; esac; then
92
+ export PATH="$VENV_DIR/bin:$PATH"
93
+ fi
94
+ for rc in "$HOME/.profile" "$HOME/.bashrc"; do
95
+ if [ -f "$rc" ] && ! grep -qF 'bathys/venv/bin' "$rc"; then
96
+ printf '\n# bathys (one-line installer)\n%s\n' "$PATH_LINE" >> "$rc"
97
+ note "PATH дополнен в $rc — перезапустите шелл или: source $rc"
98
+ fi
99
+ done
100
+
101
+ say "установлен: $VENV_DIR/bin/bathys"
102
+
103
+ # ------------------------------------------------------------------ setup --
104
+ say "полная настройка (браузер → харнессы → субагент)…"
105
+ "$VENV_DIR/bin/bathys" setup
106
+
107
+ # ----------------------------------------------------------------- doctor --
108
+ say "финальная диагностика:"
109
+ exec "$VENV_DIR/bin/bathys" doctor
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bathys"
7
- version = "0.7.0"
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.0"
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